]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA7/Macro/macr_cara_poutre_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA7 / Macro / macr_cara_poutre_ops.py
1 #@ MODIF macr_cara_poutre_ops Macro  DATE 05/07/2005   AUTEUR DURAND C.DURAND 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2003  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
9 # (AT YOUR OPTION) ANY LATER VERSION.                                                  
10 #                                                                       
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
15 #                                                                       
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
19 # ======================================================================
20 # RESPONSABLE JMBHH01 J.M.PROIX
21
22 def macr_cara_poutre_ops(self,UNITE_MAILLAGE,SYME_X,SYME_Y,GROUP_MA_BORD,
23                               GROUP_MA,ORIG_INER,**args):
24   """
25      Ecriture de la macro MACR_CARA_POUTRE
26   """
27   import types
28   from Accas import _F
29   ier=0
30   # On importe les definitions des commandes a utiliser dans la macro
31   # Le nom de la variable doit etre obligatoirement le nom de la commande
32   LIRE_MAILLAGE   =self.get_cmd('LIRE_MAILLAGE')
33   DEFI_GROUP      =self.get_cmd('DEFI_GROUP')
34   CREA_MAILLAGE   =self.get_cmd('CREA_MAILLAGE')
35   AFFE_MODELE     =self.get_cmd('AFFE_MODELE')
36   DEFI_MATERIAU   =self.get_cmd('DEFI_MATERIAU')
37   AFFE_MATERIAU   =self.get_cmd('AFFE_MATERIAU')
38   DEFI_FONCTION   =self.get_cmd('DEFI_FONCTION')
39   DEFI_CONSTANTE  =self.get_cmd('DEFI_CONSTANTE')
40   AFFE_CHAR_THER  =self.get_cmd('AFFE_CHAR_THER')
41   AFFE_CHAR_THER_F=self.get_cmd('AFFE_CHAR_THER_F')
42   THER_LINEAIRE   =self.get_cmd('THER_LINEAIRE')
43   CALC_VECT_ELEM  =self.get_cmd('CALC_VECT_ELEM')
44   CALC_MATR_ELEM  =self.get_cmd('CALC_MATR_ELEM')
45   NUME_DDL        =self.get_cmd('NUME_DDL')
46   ASSE_VECTEUR    =self.get_cmd('ASSE_VECTEUR')
47   POST_ELEM       =self.get_cmd('POST_ELEM')
48   CALC_ELEM       =self.get_cmd('CALC_ELEM')
49   INTE_MAIL_2D    =self.get_cmd('INTE_MAIL_2D')
50   POST_RELEVE_T   =self.get_cmd('POST_RELEVE_T')
51   IMPR_TABLE      =self.get_cmd('IMPR_TABLE')
52   IMPR_CO         =self.get_cmd('IMPR_CO')
53   # La macro compte pour 1 dans la numerotation des commandes
54   self.set_icmd(1)
55
56   # Le concept sortant (de type tabl_cara_geom) est nommé 'nomres' dans 
57   # le contexte de la macro
58   
59   self.DeclareOut('nomres',self.sd)
60
61 #  if GROUP_MA_BORD and GROUP_MA:
62 #     if not LIAISON:
63 #        ier=ier+1
64 #        self.cr.fatal("<F> <MACR_CARA_POUTRE> Avec GROUP_MA, il faut obligatoirement preciser LIAISON, LONGUEUR ET MATERIAU")
65 #        return ier
66 #
67   __nomlma=LIRE_MAILLAGE(UNITE=UNITE_MAILLAGE,)
68
69   __nomamo=AFFE_MODELE(MAILLAGE=__nomlma,
70                        AFFE=_F(TOUT='OUI',
71                                PHENOMENE='MECANIQUE',
72                                MODELISATION='D_PLAN',),   )
73
74   __nomdma=DEFI_MATERIAU(ELAS=_F(E=1.0,NU=0.,RHO=1.0),)
75
76
77   __nomama=AFFE_MATERIAU(MAILLAGE=__nomlma,
78                          AFFE=_F(TOUT='OUI',
79                                  MATER=__nomdma,),  )
80
81 # --- CALCUL DES CARACTERISTIQUES GEOMETRIQUES DE LA SECTION :
82 #     ------------------------------------------------------
83
84   motsimps={}
85   if GROUP_MA  : motsimps['GROUP_MA']  = GROUP_MA
86   if SYME_X    : motsimps['SYME_X']    = SYME_X
87   if SYME_Y    : motsimps['SYME_Y']    = SYME_Y
88   motsimps['ORIG_INER'] = ORIG_INER
89   mfact=_F(TOUT='OUI',**motsimps)
90   nomres=POST_ELEM(MODELE=__nomamo,
91                    CHAM_MATER=__nomama,
92                    CARA_GEOM=mfact    )
93
94 # nb  :  si GROUP_MA n existe pas : le mot clé est ignoré
95
96 #
97 #     ==================================================================
98 # --- = CALCUL DE LA CONSTANTE DE TORSION SUR TOUT LE MAILLAGE         =
99 # --- =     OU DU  CENTRE DE TORSION/CISAILLEMENT                      =
100 # --- =        DES COEFFICIENTS DE CISAILLEMENT                        =
101 # --- =     ET DE L INERTIE DE GAUCHISSEMENT                           =
102 # --- =        DU RAYON DE TORSION SUR TOUT LE MAILLAGE 
103 # --- = ON CREE UN MODELE PLAN 2D THERMIQUE REPRESENTANT LA SECTION    =
104 # --- = DE LA POUTRE CAR ON A A RESOUDRE DES E.D.P. AVEC DES LAPLACIENS=
105 #     ==================================================================
106
107   if GROUP_MA_BORD and not GROUP_MA:
108 # --- TRANSFORMATION DES GROUP_MA EN GROUP_NO SUR-LESQUELS
109 # --- ON POURRA APPLIQUER DES CONDITIONS DE TEMPERATURE IMPOSEE :
110 #     ---------------------------------------------------------
111      motscles={}
112      if type(GROUP_MA_BORD)==types.StringType:
113         motscles['CREA_GROUP_NO']=_F(GROUP_MA=GROUP_MA_BORD,)
114      else:
115         motscles['CREA_GROUP_NO']=[]
116         for grma in GROUP_MA_BORD:
117            motscles['CREA_GROUP_NO'].append(_F(GROUP_MA=grma,))
118      __nomlma=DEFI_GROUP(reuse=__nomlma,
119                          MAILLAGE=__nomlma,
120                          **motscles)
121   
122
123
124 # --- CREATION D UN MAILLAGE IDENTIQUE AU PREMIER A CECI PRES
125 # --- QUE LES COORDONNEES SONT EXPRIMEES DANS LE REPERE PRINCIPAL
126 # --- D INERTIE DONT L ORIGINE EST LE CENTRE DE GRAVITE DE LA SECTION :
127 #     ---------------------------------------------------------------
128
129      __nomapi=CREA_MAILLAGE(MAILLAGE=__nomlma,
130                             REPERE=_F(TABLE=nomres,
131                                       NOM_ORIG='CDG',  ),  )
132
133 # --- AFFECTATION DU PHENOMENE 'THERMIQUE' AU MODELE EN VUE DE
134 # --- LA CONSTRUCTION D UN OPERATEUR LAPLACIEN SUR CE MODELE :
135 #     ------------------------------------------------------
136
137      __nomoth=AFFE_MODELE(MAILLAGE=__nomapi,
138                           AFFE=_F(TOUT='OUI',
139                                   PHENOMENE='THERMIQUE',
140                                   MODELISATION='PLAN',), )
141
142 # --- POUR LA CONSTRUCTION DU LAPLACIEN, ON  DEFINIT UN
143 # --- PSEUDO-MATERIAU DONT LES CARACTERISTIQUES THERMIQUES SONT :
144 # --- LAMBDA = 1, RHO*CP = 0 :
145 #     ----------------------
146
147      __nomath=DEFI_MATERIAU(THER=_F(LAMBDA=1.0,RHO_CP=0.,),)
148
149 # --- DEFINITION D UN CHAM_MATER A PARTIR DU MATERIAU PRECEDENT :
150 #     ---------------------------------------------------------
151
152      __chmath=AFFE_MATERIAU(MAILLAGE=__nomapi,
153                             AFFE=_F(TOUT='OUI',
154                                     MATER=__nomath,),   )
155
156 #
157 #     ------------------------------------------------------------
158 # --- - CALCUL DE LA CONSTANTE DE TORSION PAR RESOLUTION         -
159 # --- - D UN LAPLACIEN AVEC UN TERME SOURCE EGAL A -2            -
160 # --- - L INCONNUE ETANT NULLE SUR LE CONTOUR DE LA SECTION :    -
161 # --- -    LAPLACIEN(PHI) = -2 DANS LA SECTION                   -
162 # --- -    PHI = 0 SUR LE CONTOUR :                              -
163 #     ------------------------------------------------------------
164 #
165 # --- ON IMPOSE LA VALEUR 0 A L INCONNUE SCALAIRE SUR LE CONTOUR
166 # --- DE LA SECTION
167 # --- ET ON A UN TERME SOURCE EGAL A -2 DANS TOUTE LA SECTION :
168 #     -------------------------------------------------------
169
170      motscles={}
171      if args.has_key('GROUP_MA_INTE'):
172         if args['GROUP_MA_INTE'] != None :
173            motscles['LIAISON_UNIF']=_F(GROUP_MA=args['GROUP_MA_INTE'],DDL='TEMP'),
174      __chart1=AFFE_CHAR_THER(MODELE=__nomoth,
175                              TEMP_IMPO   =_F(GROUP_NO=GROUP_MA_BORD,
176                                              TEMP=0. ),
177                              SOURCE      =_F(TOUT='OUI',
178                                              SOUR=2.0),
179                              **motscles  )
180
181 # ---  POUR CHAQUE TROU DE LA SECTION :
182 # ---  .ON A IMPOSE QUE PHI EST CONSTANT SUR LE CONTOUR INTERIEUR
183 # ---   EN FAISANT LE LIAISON_UNIF DANS LE AFFE_CHAR_THER PRECEDENT
184 # ---  .ON IMPOSE EN PLUS D(PHI)/DN = 2*AIRE(TROU)/L(TROU)
185 # ---        OU D/DN DESIGNE LA DERIVEE PAR RAPPORT A LA
186 # ---        NORMALE ET L DESIGNE LA LONGUEUR DU BORD DU TROU :
187 #     -------------------------------------------------------
188
189      if args.has_key('GROUP_MA_INTE'):
190         lgmaint=args['GROUP_MA_INTE']
191         if lgmaint != None :
192            __tbaire=POST_ELEM(MODELE=__nomoth,
193                            AIRE_INTERNE=_F(GROUP_MA_BORD=args['GROUP_MA_INTE'],),  )
194
195            motscles={}
196            motscles['FLUX_REP']=[]
197         
198            if type(lgmaint)==types.StringType:
199               motscles['FLUX_REP']=_F(GROUP_MA=args['GROUP_MA_INTE'],CARA_TORSION=__tbaire)
200            else:
201               motscles['FLUX_REP']=[]
202               for grma in lgmaint:
203                  motscles['FLUX_REP'].append(_F(GROUP_MA=grma,CARA_TORSION=__tbaire),)
204            __chart2=AFFE_CHAR_THER(MODELE=__nomoth,**motscles)
205
206 # --- RESOLUTION DE LAPLACIEN(PHI) = -2
207 # --- AVEC PHI = 0 SUR LE CONTOUR :
208 #     ----------------------------------------
209
210      motscles={}
211      motscles['EXCIT']=[_F(CHARGE=__chart1,),]
212      if args.has_key('GROUP_MA_INTE'):
213         if lgmaint != None :
214            motscles['EXCIT'].append(_F(CHARGE=__chart2,))
215      __tempe1=THER_LINEAIRE(MODELE=__nomoth,
216                             CHAM_MATER=__chmath,
217                             SOLVEUR=_F(STOP_SINGULIER='NON',),
218                             **motscles   )
219
220 #
221 #     ----------------------------------------------
222 # --- - CALCUL DU  CENTRE DE TORSION/CISAILLEMENT  -
223 # --- - ET DES COEFFICIENTS DE CISAILLEMENT :      -
224 #     ----------------------------------------------
225 #
226 # --- POUR LE CALCUL DES CONSTANTES DE CISAILLEMENT, ON VA DEFINIR
227 # --- UN PREMIER TERME SOURCE, SECOND MEMBRE DE L EQUATION DE LAPLACE
228 # --- PAR UNE FONCTION EGALE A Y :
229 #     --------------------------
230
231      __fnsec1=DEFI_FONCTION(NOM_PARA='X',
232                             VALE=(0.,0.,10.,10.),
233                             PROL_DROITE='LINEAIRE',
234                             PROL_GAUCHE='LINEAIRE',
235                            )
236
237      __fnsec0=DEFI_CONSTANTE(VALE=0.,)
238
239 # --- LE TERME SOURCE CONSTITUANT LE SECOND MEMBRE DE L EQUATION
240 # --- DE LAPLACE EST PRIS EGAL A Y DANS TOUTE LA SECTION :
241 #     --------------------------------------------------
242
243
244      motscles={}
245      if args.has_key('NOEUD'):
246         motscles['TEMP_IMPO']=(_F(NOEUD=args['NOEUD'],TEMP=__fnsec0))
247      __chart2=AFFE_CHAR_THER_F(MODELE=__nomoth,
248                                SOURCE=_F(TOUT='OUI',
249                                          SOUR=__fnsec1,),
250                                **motscles   )
251
252 # --- RESOLUTION DE     LAPLACIEN(PHI) = -Y
253 # ---              AVEC D(PHI)/D(N) = 0 SUR LE CONTOUR :
254 #     ------------------------------------------------
255
256      __tempe2=THER_LINEAIRE(MODELE=__nomoth,
257                             CHAM_MATER=__chmath,
258                             EXCIT=_F(CHARGE=__chart2,), 
259                             SOLVEUR=_F(STOP_SINGULIER='NON',),
260                            )
261
262 # --- POUR LE CALCUL DES CONSTANTES DE CISAILLEMENT, ON VA DEFINIR
263 # --- UN PREMIER TERME SOURCE, SECOND MEMBRE DE L EQUATION DE LAPLACE
264 # --- PAR UNE FONCTION EGALE A Z :
265 #     --------------------------
266
267      __fnsec2=DEFI_FONCTION(NOM_PARA='Y',
268                             VALE=(0.,0.,10.,10.),
269                             PROL_DROITE='LINEAIRE',
270                             PROL_GAUCHE='LINEAIRE',
271                            )
272
273 # --- LE TERME SOURCE CONSTITUANT LE SECOND MEMBRE DE L EQUATION
274 # --- DE LAPLACE EST PRIS EGAL A Z DANS TOUTE LA SECTION :
275 #     --------------------------------------------------
276
277      motscles={}
278      if args.has_key('NOEUD'):
279         motscles['TEMP_IMPO']=_F(NOEUD=args['NOEUD'],TEMP=__fnsec0)
280      __chart3=AFFE_CHAR_THER_F(MODELE=__nomoth,
281                                SOURCE=_F(TOUT='OUI',
282                                          SOUR=__fnsec2,),
283                                **motscles)
284
285 # --- RESOLUTION DE     LAPLACIEN(PHI) = -Z
286 # ---              AVEC D(PHI)/D(N) = 0 SUR LE CONTOUR :
287 #     ------------------------------------------------
288
289      __tempe3=THER_LINEAIRE(MODELE=__nomoth,
290                             CHAM_MATER=__chmath,
291                             EXCIT=_F(CHARGE=__chart3,), 
292                             SOLVEUR=_F(STOP_SINGULIER='NON',),
293                            )
294
295 # --- CALCUL DU RAYON DE TORSION :
296 #     --------------------------
297
298 #    CALCUL DU RAYON DE TORSION EXTERNE : rtext
299
300      __tempe1=CALC_ELEM(reuse=__tempe1,
301                        RESULTAT=__tempe1,
302                        MODELE=__nomoth,
303                        CHAM_MATER=__chmath,
304                        TOUT_ORDRE='OUI',
305                        OPTION='FLUX_ELNO_TEMP',
306                       )
307
308      __chem=INTE_MAIL_2D(MAILLAGE=__nomapi,
309                          DEFI_CHEMIN=_F(GROUP_MA=GROUP_MA_BORD),
310                          INFO=2,)
311
312      __flun=POST_RELEVE_T(ACTION=_F(INTITULE='FLUX_NORM',
313                              CHEMIN=__chem,
314                              RESULTAT=__tempe1,
315                              NOM_CHAM='FLUX_ELNO_TEMP',
316                              TRAC_NOR='OUI',
317                              NOM_CMP=('FLUX','FLUY'),
318                              OPERATION='MOYENNE'))
319
320      __m1=abs(__flun['TRAC_NOR',3])
321      __m2=abs(__flun['TRAC_NOR',4])
322      __rtext=max(__m1,__m2)
323      
324  #    CALCUL DU RAYON DE TORSION : rt
325  #    rt = max ( rtext , 2*AIRE(TROU)/L(TROU) )
326  
327      if args.has_key('GROUP_MA_INTE'):
328        if args['GROUP_MA_INTE'] != None :
329          if type(args['GROUP_MA_INTE'])==types.StringType :
330            l_group_ma_inte=[args['GROUP_MA_INTE'],]
331          else:
332            l_group_ma_inte=args['GROUP_MA_INTE']
333          for i in range(0,len(l_group_ma_inte)):
334            __chem=INTE_MAIL_2D(MAILLAGE=__nomapi,
335                                DEFI_CHEMIN=_F(GROUP_MA=l_group_ma_inte[i]),
336                                INFO=2,)
337            __flun=POST_RELEVE_T(ACTION=_F(INTITULE='FLUX_NORM',
338                                           CHEMIN=__chem,
339                                           RESULTAT=__tempe1,
340                                           NOM_CHAM='FLUX_ELNO_TEMP',
341                                           TRAC_NOR='OUI',
342                                           NOM_CMP=('FLUX','FLUY'),
343                                           OPERATION='MOYENNE'))
344            __m1=(abs(__flun['TRAC_NOR',3])+abs(__flun['TRAC_NOR',4]))/2.
345            if __m1 > __rtext :
346              __rtext=__m1
347
348      __rt=__rtext
349          
350 # --- CALCUL DE LA CONSTANTE DE TORSION :
351 #     ---------------------------------
352
353      motscles={}
354      if args.has_key('GROUP_MA_INTE'):
355         lgmaint=args['GROUP_MA_INTE']
356         if lgmaint != None :
357            motscles['CARA_POUTRE']=_F(CARA_GEOM=nomres,
358                                    LAPL_PHI=__tempe1,
359                                    RT=__rt,
360                                    TOUT='OUI',
361                                    OPTION='CARA_TORSION',
362                                    GROUP_MA_INTE=args['GROUP_MA_INTE'],)
363         else:
364            motscles['CARA_POUTRE']=_F(CARA_GEOM=nomres,
365                                     LAPL_PHI=__tempe1,
366                                     RT=__rt,  
367                                     TOUT='OUI',
368                                     OPTION='CARA_TORSION',      )
369      nomres=POST_ELEM(reuse=nomres,
370                       MODELE=__nomoth,
371                       CHAM_MATER=__chmath,
372                       **motscles  )
373  
374
375 # --- CALCUL DES COEFFICIENTS DE CISAILLEMENT ET DES COORDONNEES DU
376 # --- CENTRE DE CISAILLEMENT/TORSION :
377 #     ------------------------------
378
379      nomres=POST_ELEM(reuse=nomres,
380                       MODELE=__nomoth,
381                       CHAM_MATER=__chmath,
382                       CARA_POUTRE=_F(CARA_GEOM=nomres,
383                                      LAPL_PHI_Y=__tempe2,
384                                      LAPL_PHI_Z=__tempe3,
385                                      TOUT='OUI',
386                                      OPTION='CARA_CISAILLEMENT',),  )
387      
388
389 #
390 #     ------------------------------------------------------------
391 # --- - CALCUL DE L INERTIE DE GAUCHISSEMENT PAR RESOLUTION  DE  -
392 # --- -    LAPLACIEN(OMEGA) = 0     DANS LA SECTION              -
393 # --- -    AVEC D(OMEGA)/D(N) = Z*NY-Y*NZ   SUR LE               -
394 # --- -    CONTOUR DE LA SECTION                                 -
395 # --- -    NY ET NZ SONT LES COMPOSANTES DU VECTEUR N NORMAL     -
396 # --- -    A CE CONTOUR                                          -
397 # --- -    ET SOMME_S(OMEGA.DS) = 0                              -
398 # --- -    OMEGA EST LA FONCTION DE GAUCHISSEMENT                -
399 # --- -    L INERTIE DE GAUCHISSEMENT EST SOMME_S(OMEGA**2.DS)   -
400 #     ------------------------------------------------------------
401 #
402 # --- CREATION D UN MAILLAGE DONT LES COORDONNEES SONT EXPRIMEES
403 # --- DANS LE REPERE PRINCIPAL D INERTIE MAIS AVEC COMME ORIGINE
404 # --- LE CENTRE DE TORSION DE LA SECTION, ON VA DONC UTILISER
405 # --- LE MAILLAGE DE NOM NOMAPI DONT LES COORDONNEES SONT
406 # --- EXPRIMEES DANS LE REPERE PRINCIPAL D'INERTIE, L'ORIGINE
407 # --- ETANT LE CENTRE DE GRAVITE DE LA SECTION (QUI EST DONC
408 # --- A CHANGER)  :
409 #     ----------
410
411      __nomapt=CREA_MAILLAGE(MAILLAGE=__nomapi,
412                             REPERE=_F(TABLE=nomres,
413                                       NOM_ORIG='TORSION',)  )
414
415 # --- AFFECTATION DU PHENOMENE 'THERMIQUE' AU MODELE EN VUE DE
416 # --- LA CONSTRUCTION D UN OPERATEUR LAPLACIEN SUR CE MODELE :
417 #     ------------------------------------------------------
418
419      __nomot2=AFFE_MODELE(MAILLAGE=__nomapt,
420                           AFFE=_F(TOUT='OUI',
421                                   PHENOMENE='THERMIQUE',
422                                   MODELISATION='PLAN', )  )
423
424 # --- DEFINITION D UN CHAM_MATER A PARTIR DU MATERIAU PRECEDENT :
425 #     ---------------------------------------------------------
426
427      __chmat2=AFFE_MATERIAU(MAILLAGE=__nomapt,
428                             AFFE=_F(TOUT='OUI',
429                                     MATER=__nomath, ), )
430
431 # --- POUR LE CALCUL DE L INERTIE DE GAUCHISSEMENT, ON VA DEFINIR
432 # --- LA COMPOSANTE SELON Y DU FLUX A IMPOSER SUR LE CONTOUR
433 # --- PAR UNE FONCTION EGALE A -X :
434 #     ---------------------------
435
436      __fnsec3=DEFI_FONCTION(NOM_PARA='X',
437                             VALE=(0.,0.,10.,-10.),
438                             PROL_DROITE='LINEAIRE',
439                             PROL_GAUCHE='LINEAIRE',
440                            )
441
442 # --- POUR LE CALCUL DE L INERTIE DE GAUCHISSEMENT, ON VA DEFINIR
443 # --- LA COMPOSANTE SELON X DU FLUX A IMPOSER SUR LE CONTOUR
444 # --- PAR UNE FONCTION EGALE A Y :
445 #     --------------------------
446
447      __fnsec4=DEFI_FONCTION(NOM_PARA='Y',
448                             VALE=(0.,0.,10.,10.),
449                             PROL_DROITE='LINEAIRE',
450                             PROL_GAUCHE='LINEAIRE',
451                            )
452
453 # --- DANS LE BUT D IMPOSER LA RELATION LINEAIRE ENTRE DDLS
454 # ---  SOMME_SECTION(OMEGA.DS) = 0 ( CETTE CONDITION
455 # --- VENANT DE L EQUATION D EQUILIBRE SELON L AXE DE LA POUTRE
456 # --- N = 0, N ETANT L EFFORT NORMAL)
457 # --- ON CALCULE LE VECTEUR DE CHARGEMENT DU A UN TERME SOURCE EGAL
458 # --- A 1., LES TERMES DE CE VECTEUR SONT EGAUX A
459 # --- SOMME_SECTION(NI.DS) ET SONT DONC LES COEFFICIENTS DE
460 # --- LA RELATION LINEAIRE A IMPOSER.
461 # --- ON DEFINIT DONC UN CHARGEMENT DU A UN TERME SOURCE EGAL A 1 :
462 #     -----------------------------------------------------------
463
464      __chart4=AFFE_CHAR_THER(MODELE=__nomot2,
465                              SOURCE=_F(TOUT='OUI',
466                                        SOUR=1.0),  )
467
468 # --- ON CALCULE LE VECT_ELEM DU AU CHARGEMENT PRECEDENT
469 # --- IL S AGIT DES VECTEURS ELEMENTAIRES DONT LE TERME
470 # --- AU NOEUD COURANT I EST EGAL A SOMME_SECTION(NI.DS) :
471 #     --------------------------------------------------
472
473      __vecel=CALC_VECT_ELEM(CHARGE=__chart4,
474                             OPTION='CHAR_THER'
475                             )
476
477 # --- ON CALCULE LE MATR_ELEM DES MATRICES ELEMENTAIRES
478 # --- DE CONDUCTIVITE UNIQUEMENT POUR GENERER LE NUME_DDL
479 # --- SUR-LEQUEL S APPUIERA LE CHAMNO UTILISE POUR ECRIRE LA
480 # --- RELATION LINEAIRE ENTRE DDLS :
481 #     ----------------------------
482
483      __matel=CALC_MATR_ELEM(MODELE=__nomot2,
484                             CHAM_MATER=__chmat2,
485                             CHARGE=__chart4,
486                             OPTION='RIGI_THER',)
487
488 # --- ON DEFINIT LE NUME_DDL ASSOCIE AU MATR_ELEM DEFINI
489 # --- PRECEDEMMENT POUR CONSTRUIRE LE CHAMNO UTILISE POUR ECRIRE LA
490 # --- RELATION LINEAIRE ENTRE DDLS :
491 #     ----------------------------
492
493      __numddl=NUME_DDL(MATR_RIGI=__matel,
494                        METHODE='LDLT',    )
495
496 # --- ON CONSTRUIT LE CHAMNO QUI VA ETRE UTILISE POUR ECRIRE LA
497 # --- RELATION LINEAIRE ENTRE DDLS :
498 #     ----------------------------
499
500      __chamno=ASSE_VECTEUR(VECT_ELEM=__vecel,
501                            NUME_DDL=__numddl,    )
502
503 # --- ON IMPOSE LA RELATION LINEAIRE ENTRE DDLS
504 # ---  SOMME_SECTION(OMEGA.DS) = 0 ( CETTE CONDITION
505 # --- VENANT DE L EQUATION D EQUILIBRE SELON L AXE DE LA POUTRE
506 # --- N = 0, N ETANT L EFFORT NORMAL)
507 # --- POUR IMPOSER CETTE RELATION ON PASSE PAR LIAISON_CHAMNO,
508 # --- LES TERMES DU CHAMNO (I.E. SOMME_SECTION(NI.DS))
509 # --- SONT LES COEFFICIENTS DE LA RELATION LINEAIRE :
510 #     ---------------------------------------------
511
512      __chart5=AFFE_CHAR_THER(MODELE=__nomot2,
513                              LIAISON_CHAMNO=_F(CHAM_NO=__chamno,
514                                                COEF_IMPO=0.),    )
515
516 # --- LE CHARGEMENT EST UN FLUX REPARTI NORMAL AU CONTOUR
517 # --- DONT LES COMPOSANTES SONT +Z (I.E. +Y) ET -Y (I.E. -X)
518 # --- SELON LA DIRECTION NORMALE AU CONTOUR :
519 #     -------------------------------------
520
521      __chart6=AFFE_CHAR_THER_F(MODELE=__nomot2,
522                                FLUX_REP=_F(GROUP_MA=GROUP_MA_BORD,
523                                            FLUX_X  =__fnsec4,
524                                            FLUX_Y  =__fnsec3,),    )
525
526 # --- RESOLUTION DE     LAPLACIEN(OMEGA) = 0
527 # --- AVEC D(OMEGA)/D(N) = Z*NY-Y*NZ   SUR LE CONTOUR DE LA SECTION
528 # --- ET SOMME_SECTION(OMEGA.DS) = 0 ( CETTE CONDITION
529 # --- VENANT DE L EQUATION D EQUILIBRE SELON L AXE DE LA POUTRE
530 # --- N = 0, N ETANT L EFFORT NORMAL)  :
531 #     -------------------------------
532
533      __tempe4=THER_LINEAIRE(MODELE=__nomot2,
534                             CHAM_MATER=__chmat2,
535                             EXCIT=(_F(CHARGE=__chart5,),
536                                    _F(CHARGE=__chart6,),),
537                             SOLVEUR=_F(METHODE='LDLT',
538                                        RENUM='SANS',
539                                        STOP_SINGULIER='NON',),   )
540     
541 # --- CALCUL DE L INERTIE DE GAUCHISSEMENT :
542 #     -------------------------------------
543
544      nomres=POST_ELEM(reuse=nomres,
545                       MODELE=__nomot2,
546                       CHAM_MATER=__chmat2,
547                       CARA_POUTRE=_F(CARA_GEOM=nomres,
548                                      LAPL_PHI=__tempe4,
549                                      TOUT='OUI',
550                                      OPTION='CARA_GAUCHI'),  )
551
552      
553 #
554 #     ==================================================================
555 # --- = CALCUL DE LA CONSTANTE DE TORSION SUR CHAQUE GROUPE            =
556 # --- =     ET DU RAYON DE TORSION SUR CHAQUE GROUPE                   =
557 # --- =        DU  CENTRE DE TORSION/CISAILLEMENT                      =
558 # --- =        DES COEFFICIENTS DE CISAILLEMENT                        =
559 #     ==================================================================
560
561
562 #
563
564
565   if GROUP_MA_BORD and GROUP_MA:
566
567      if type(GROUP_MA_BORD)==types.StringType :
568         l_group_ma_bord=[GROUP_MA_BORD,]
569      else:
570         l_group_ma_bord= GROUP_MA_BORD
571      if type(GROUP_MA)==types.StringType :
572         l_group_ma=[GROUP_MA,]
573      else:
574         l_group_ma= GROUP_MA
575
576      if args.has_key('NOEUD'):
577        if type(args['NOEUD'])==types.StringType :
578           l_noeud=[args['NOEUD'],]
579        else:
580           l_noeud= args['NOEUD']
581
582      if len(l_group_ma)!=len(l_group_ma_bord):
583         ier=ier+1
584         self.cr.fatal("<F> <MACR_CARA_POUTRE> GROUP_MA et GROUP_MA_BORD incoherents")
585         return ier
586      if args.has_key('NOEUD') and (len(l_group_ma)!=len(l_noeud)):
587         ier=ier+1
588         self.cr.fatal("<F> <MACR_CARA_POUTRE> GROUP_MA et NOEUD incoherents")
589         return ier
590
591      for i in range(0,len(l_group_ma_bord)):
592
593 # --- TRANSFORMATION DES GROUP_MA EN GROUP_NO SUR-LESQUELS
594 # --- ON POURRA APPLIQUER DES CONDITIONS DE TEMPERATURE IMPOSEE :
595 #     ---------------------------------------------------------
596
597         __nomlma=DEFI_GROUP(reuse=__nomlma,
598                             MAILLAGE=__nomlma,
599                             CREA_GROUP_NO=_F(GROUP_MA=l_group_ma_bord[i],)  )
600
601
602 # --- CREATION D UN MAILLAGE IDENTIQUE AU PREMIER A CECI PRES
603 # --- QUE LES COORDONNEES SONT EXPRIMEES DANS LE REPERE PRINCIPAL
604 # --- D INERTIE DONT L ORIGINE EST LE CENTRE DE GRAVITE DE LA SECTION :
605 #     ---------------------------------------------------------------
606
607         __nomapi=CREA_MAILLAGE(MAILLAGE=__nomlma,
608                                REPERE=_F(TABLE=nomres,
609                                          NOM_ORIG='CDG',
610                                          GROUP_MA=l_group_ma[i],  ),  )
611
612 # --- AFFECTATION DU PHENOMENE 'THERMIQUE' AU MODELE EN VUE DE
613 # --- LA CONSTRUCTION D UN OPERATEUR LAPLACIEN SUR CE MODELE :
614 #     ------------------------------------------------------
615
616         __nomoth=AFFE_MODELE(MAILLAGE=__nomapi,
617                              AFFE=_F(GROUP_MA=l_group_ma[i],
618                                      PHENOMENE='THERMIQUE',
619                                      MODELISATION='PLAN',  )  )
620
621 # --- POUR LA CONSTRUCTION DU LAPLACIEN, ON  DEFINIT UN
622 # --- PSEUDO-MATERIAU DONT LES CARACTERISTIQUES THERMIQUES SONT :
623 # --- LAMBDA = 1, RHO*CP = 0 :
624 #     ----------------------
625
626         __nomath=DEFI_MATERIAU(THER=_F(LAMBDA=1.0,
627                                        RHO_CP=0.0,  ),  )
628
629 # --- DEFINITION D UN CHAM_MATER A PARTIR DU MATERIAU PRECEDENT :
630 #     ---------------------------------------------------------
631
632         __chmath=AFFE_MATERIAU(MAILLAGE=__nomapi,
633                                AFFE=_F(TOUT='OUI',
634                                        MATER=__nomath ),  )
635
636 #
637 #     ------------------------------------------------------------
638 # --- - CALCUL DE LA CONSTANTE DE TORSION PAR RESOLUTION         -
639 # --- - D UN LAPLACIEN AVEC UN TERME SOURCE EGAL A -2            -
640 # --- - L INCONNUE ETANT NULLE SUR LE CONTOUR DE LA SECTION :    -
641 # --- -    LAPLACIEN(PHI) = -2 DANS LA SECTION                   -
642 # --- -    PHI = 0 SUR LE CONTOUR :                              -
643 #     ------------------------------------------------------------
644 #
645 # --- ON IMPOSE LA VALEUR 0 A L INCONNUE SCALAIRE SUR LE CONTOUR
646 # --- DE LA SECTION
647 # --- ET ON A UN TERME SOURCE EGAL A -2 DANS TOUTE LA SECTION :
648 #     -------------------------------------------------------
649
650         __chart1=AFFE_CHAR_THER(MODELE=__nomoth,
651                                 TEMP_IMPO=_F(GROUP_NO=l_group_ma_bord[i],
652                                              TEMP=0.0       ),
653                                 SOURCE=_F(TOUT='OUI',
654                                           SOUR=2.0       )          )
655
656 # --- RESOLUTION DE     LAPLACIEN(PHI) = -2
657 # ---              AVEC PHI = 0 SUR LE CONTOUR :
658 #     ----------------------------------------
659
660         __tempe1=THER_LINEAIRE(MODELE=__nomoth,
661                                CHAM_MATER=__chmath,
662                                EXCIT=_F(CHARGE=__chart1, ),
663                                SOLVEUR=_F(STOP_SINGULIER='NON',)    )
664
665 #
666 #     ----------------------------------------------
667 # --- - CALCUL DU  CENTRE DE TORSION/CISAILLEMENT  -
668 # --- - ET DES COEFFICIENTS DE CISAILLEMENT :      -
669 #     ----------------------------------------------
670 #
671 # --- POUR LE CALCUL DES CONSTANTES DE CISAILLEMENT, ON VA DEFINIR
672 # --- UN PREMIER TERME SOURCE, SECOND MEMBRE DE L EQUATION DE LAPLACE
673 # --- PAR UNE FONCTION EGALE A Y :
674 #     --------------------------
675
676         __fnsec1=DEFI_FONCTION(NOM_PARA='X',
677                                VALE=(0.,0.,10.,10.),
678                                PROL_DROITE='LINEAIRE',
679                                PROL_GAUCHE='LINEAIRE',        )
680
681         __fnsec0=DEFI_CONSTANTE(VALE=0.,)
682
683 # --- LE TERME SOURCE CONSTITUANT LE SECOND MEMBRE DE L EQUATION
684 # --- DE LAPLACE EST PRIS EGAL A Y DANS TOUTE LA SECTION :
685 #     --------------------------------------------------
686
687         __chart2=AFFE_CHAR_THER_F(MODELE=__nomoth,
688                                   TEMP_IMPO=_F(NOEUD=l_noeud[i],
689                                                TEMP=__fnsec0),
690                                   SOURCE=_F(TOUT='OUI',
691                                             SOUR=__fnsec1)       )
692
693 # --- RESOLUTION DE     LAPLACIEN(PHI) = -Y
694 # ---              AVEC D(PHI)/D(N) = 0 SUR LE CONTOUR :
695 #     ------------------------------------------------
696
697         __tempe2=THER_LINEAIRE(MODELE=__nomoth,
698                                CHAM_MATER=__chmath,
699                                EXCIT=_F(CHARGE=__chart2, ),
700                                SOLVEUR=_F(STOP_SINGULIER='NON',)         )
701
702 # --- POUR LE CALCUL DES CONSTANTES DE CISAILLEMENT, ON VA DEFINIR
703 # --- UN PREMIER TERME SOURCE, SECOND MEMBRE DE L EQUATION DE LAPLACE
704 # --- PAR UNE FONCTION EGALE A Z :
705 #     --------------------------
706
707         __fnsec2=DEFI_FONCTION(NOM_PARA='Y',
708                                VALE=(0.,0.,10.,10.),
709                                PROL_DROITE='LINEAIRE',
710                                PROL_GAUCHE='LINEAIRE',        )
711
712 # --- LE TERME SOURCE CONSTITUANT LE SECOND MEMBRE DE L EQUATION
713 # --- DE LAPLACE EST PRIS EGAL A Z DANS TOUTE LA SECTION :
714 #     --------------------------------------------------
715
716         __chart3=AFFE_CHAR_THER_F(MODELE=__nomoth,
717                                   TEMP_IMPO=_F(NOEUD=l_noeud[i],
718                                                TEMP=__fnsec0),
719                                   SOURCE=_F(TOUT='OUI',
720                                             SOUR=__fnsec2)       )
721
722 # --- RESOLUTION DE     LAPLACIEN(PHI) = -Z
723 # ---              AVEC D(PHI)/D(N) = 0 SUR LE CONTOUR :
724 #     ------------------------------------------------
725
726         __tempe3=THER_LINEAIRE(MODELE=__nomoth,
727                                CHAM_MATER=__chmath,
728                                EXCIT=_F(CHARGE=__chart3, ),
729                                SOLVEUR=_F(STOP_SINGULIER='NON',)         )
730         
731 # --- CALCUL DU RAYON DE TORSION :
732 #     --------------------------
733
734 #    CALCUL DU RAYON DE TORSION EXTERNE : rtext
735
736         __tempe1=CALC_ELEM(reuse=__tempe1,
737                             RESULTAT=__tempe1,
738                             MODELE=__nomoth,
739                             CHAM_MATER=__chmath,
740                             TOUT_ORDRE='OUI',
741                             OPTION='FLUX_ELNO_TEMP',
742                            )
743
744         __chem=INTE_MAIL_2D(MAILLAGE=__nomapi,
745                             DEFI_CHEMIN=_F(GROUP_MA=l_group_ma_bord[i]),
746                             INFO=2,)
747
748         __flun=POST_RELEVE_T(ACTION=_F(INTITULE='FLUX_NORM',
749                                        CHEMIN=__chem,
750                                        RESULTAT=__tempe1,
751                                        NOM_CHAM='FLUX_ELNO_TEMP',
752                                        TRAC_NOR='OUI',
753                                        NOM_CMP=('FLUX','FLUY'),
754                                        OPERATION='MOYENNE'))
755
756         __m1=abs(__flun['TRAC_NOR',3])
757         __m2=abs(__flun['TRAC_NOR',4])
758         __rtext=max(__m1,__m2)
759
760 #    CALCUL DU RAYON DE TORSION : rt
761 #    rt = max ( rtext , 2*AIRE(TROU)/L(TROU) )
762
763         if args.has_key('GROUP_MA_INTE'):
764           if args['GROUP_MA_INTE'] != None :
765             if type(args['GROUP_MA_INTE'])==types.StringType :
766               l_group_ma_inte=[args['GROUP_MA_INTE'],]
767             else:
768               l_group_ma_inte=args['GROUP_MA_INTE']
769             for j in range(0,len(l_group_ma_inte)):
770               __chem=INTE_MAIL_2D(MAILLAGE=__nomapi,
771                                   DEFI_CHEMIN=_F(GROUP_MA=l_group_ma_inte[j]),
772                                   INFO=2,)
773               __flun=POST_RELEVE_T(ACTION=_F(INTITULE='FLUX_NORM',
774                                              CHEMIN=__chem,
775                                              RESULTAT=__tempe1,
776                                              NOM_CHAM='FLUX_ELNO_TEMP',
777                                              TRAC_NOR='OUI',
778                                              NOM_CMP=('FLUX','FLUY'),
779                                              OPERATION='MOYENNE'))        
780               __m1=(abs(__flun['TRAC_NOR',3])+abs(__flun['TRAC_NOR',4]))/2.
781               if __m1 > __rtext :
782                 __rtext=__m1
783
784         __rt=__rtext
785                 
786 # --- CALCUL DE LA CONSTANTE DE TORSION :
787 #     ---------------------------------
788              
789         nomres=POST_ELEM(reuse=nomres,
790                          MODELE=__nomoth,
791                          CHAM_MATER=__chmath,
792                          CARA_POUTRE=_F(CARA_GEOM=nomres,
793                                         LAPL_PHI=__tempe1,
794                                         RT=__rt,
795                                         GROUP_MA=l_group_ma[i],
796                                         OPTION='CARA_TORSION' ),     )
797
798 # --- CALCUL DES COEFFICIENTS DE CISAILLEMENT ET DES COORDONNEES DU
799 # --- CENTRE DE CISAILLEMENT/TORSION :
800 #     ------------------------------
801
802         nomres=POST_ELEM(reuse=nomres,
803                          MODELE=__nomoth,
804                          CHAM_MATER=__chmath,
805                          CARA_POUTRE=_F(CARA_GEOM=nomres,
806                                         LAPL_PHI_Y=__tempe2,
807                                         LAPL_PHI_Z=__tempe3,
808                                         GROUP_MA=l_group_ma[i],
809                                         LONGUEUR=args['LONGUEUR'],
810                                         MATERIAU=args['MATERIAU'],
811                                         LIAISON =args['LIAISON'],
812                                         OPTION='CARA_CISAILLEMENT' ),   )
813   IMPR_TABLE(TABLE=nomres)
814
815   return ier