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