]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA73/Macro/macr_ascouf_mail_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA73 / Macro / macr_ascouf_mail_ops.py
1 #@ MODIF macr_ascouf_mail_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 - 2004  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
21
22
23 from math import sqrt,cos,sin,pi,tan,log,fabs,ceil,fmod,floor
24
25 ################################################################################
26 ################################################################################
27 ################################################################################
28 def ASCFON(RC,RM,EP,ORIEN,AZIM,AXEC,POS,Y):
29 #     FONCTION F(CP)=CC
30 #     OU CC EST LA TAILLE DE LA FISSURE SUR LE COUDE 
31 #     ET CP LA TAILLE DE FISSURE SUR LA PLAQUE
32   AZIMR = AZIM*2.*pi/360.
33   if POS=='DEB_INT': X = RM-EP/2.
34   else             : X = RM+EP/2.
35   if abs(ORIEN-45.0)<0.01: SIG =  1.
36   else                   : SIG = -1.
37   f_ASCFON = - SIG*X*RC/(2.*RM*sin(AZIMR)) * (                       \
38                   log ( RM/X+RM/RC*(cos(AZIMR)-                      \
39                          sin(AZIMR)*SIG*Y/(sqrt(2.)*RM)) +           \
40                         sqrt( 1.+( RM/X+RM/RC*(cos(AZIMR)-           \
41                          sin(AZIMR)*SIG*Y/(sqrt(2.)*RM)) )**2 )      \
42                        )                                             \
43                   - log ( RM/X+RM/RC*cos(AZIMR)                      \
44                        + sqrt( 1. +(RM/X+RM/RC*cos(AZIMR))**2)       \
45                                             )      )                 \
46                - SIG*X*RC/(2.*RM*SIN(AZIMR)) *                       \
47       (    ( RM/X+RM/RC* ( cos(AZIMR)-                               \
48                            sin(AZIMR)*SIG*Y/(sqrt(2.0)*RM) )         \
49                     )  * sqrt( 1. + ( RM/X+RM/RC*(cos(AZIMR)-        \
50                          sin(AZIMR)*SIG*Y/(SQRT(2.)*RM)) )**2 )      \
51                     - ( RM/X+RM/RC*COS(AZIMR) )                      \
52                        * sqrt( 1. +(RM/X+RM/RC*cos(AZIMR))**2)       \
53                                                   )                  \
54                     - 2.0*AXEC 
55   return f_ASCFON
56 #
57 ################################################################################
58 ################################################################################
59 ################################################################################
60 #     MACR_ASCOUF_MAIL ASCFIS
61 #     taille initiale du defaut fissure sur la plaque en
62 #     fonction des donnees sur le coude ou le tube suivant la
63 #     transformation choisie
64 #
65 #-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
66 #
67 #     ALPHA = ANGLE DU COUDE
68 #     RM    = RAYON MOYEN DU COUDE
69 #     RC    = RAYON DE CINTRAGE DU COUDE
70 #     EP    = EPAISSEUR DU COUDE
71 #     SUREP = VALEUR DE LA SUREPAISSEUR
72 #     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)   
73 #     AXEA  = PROFONDEUR FISSURE (DEMI PETIT AXE)
74 #     AXEC  = DEMI GRAND AXE FISSURE
75 #     AZIM  = POSITION AZIMUTALE DU CENTRE DE LA FISSURE 
76 #     POS   = POSITION EN PEAU (EXTERNE OU INTERNE)
77 #     SF    = ABCISSE CURVILIGNE LONGITUDINALE DU CENTRE DE LA FISSURE
78 #     DSF   = BOOLEEN EXPRESSION POSITION CENTRE FISSURE 
79 #     BETA  = POSITION ANGULAIRE DU CENTRE DE LA FISSURE
80 #     ORIEN = ORIENTATION DE LA FISSURE
81 #
82 #----------------------DONNEES RENVOYEES-----------------------
83 #
84 #     AXEAP = PROFONDEUR DE LA FISSURE (PETIT AXE) SUR LA PLAQUE
85 #     AXECP = LONGUEUR DE LA FISSURE (GRAND AXE) SUR LA PLAQUE
86 #     SFP   = ABCISSE CURVILIGNE LONGITUDINALE CENTRE FISSURE
87 #             SUR LA PLAQUE
88 #
89 def ASCFIS(ALPHA, RM, RC, EP, SUREP, GEOM, AXEA,
90            AXEC, AZIM, POS, SF, DSF, BETA, ORIEN):
91
92   from Utilitai import funct_root
93   if POS=='DEB_INT':
94      if (AZIM>=120.) and (AZIM<=240.0): X = RM-EP/2.0 - SUREP
95      else:                              X = RM-EP/2.0
96   else:                                 X = RM+EP/2.0
97   AZIMR = AZIM*2.0*pi/360.0 
98 #
99 # -- CALCUL COTE AXIALE DU CENTRE FISSURE SUR LA PLAQUE EN FONCTION
100 #    DE L ABSCISSE CURVILIGNE DONNEE SUR LE COUDE OU DE LA POSITION
101 #    ANGULAIRE 
102 #
103   if DSF:
104     if GEOM=='COUDE': SFP = SF/(1.0+X/RC*cos(AZIMR))
105     else :            SFP = SF
106   else :
107     BETAR = BETA*2.0*pi/360.0
108     if (GEOM=='COUDE'):
109        SF  = BETAR*(RC+X*cos(AZIMR))
110        SFP = SF/(1.0+X/RC*cos(AZIMR))
111     else:
112        SF  = BETAR*RC
113        SFP = SF
114   if (GEOM=='COUDE'): print 'COTE AXIALE CENTRE FISSURE SUR COUDE : %.2f'%SF
115   if (GEOM=='TUBE') : print 'COTE AXIALE CENTRE FISSURE SUR TUBE  : %.2f'%SF 
116   print 'COTE AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP
117 #
118 #   ON ENVISAGE LE CAS OU UNE PARTIE DE L AXE EST DANS LES
119 #   DROITES DES EMBOUTS. LA TRANSFORMATION N EST FAITE QUE SUR LA 
120 #   PARTIE RESTANT DANS LE COUDE.
121 #
122   if (GEOM=='COUDE'): DIST = ALPHA*2.0*pi/360.0*(RC+X*cos(AZIMR))
123   else              : DIST = ALPHA*2.0*pi/360.0*RC
124   BCOUD = 0.0
125   BEMB  = 0.0
126   if abs(ORIEN)<0.01:
127 # -- FISSURE LONGITUDINALE (0 DEGRE)
128      BSUP = SF + AXEC
129      BINF = SF - AXEC
130      if BSUP>DIST:
131        BCOUD = DIST - BINF
132        BEMB  = BSUP - DIST
133      elif BINF<0. :
134        BCOUD = BSUP 
135        BEMB  = abs(BINF)
136      elif (BINF>=0. and BSUP<=DIST):
137        BCOUD = 2.0*AXEC
138   elif abs(ORIEN-90.)<0.01:
139 # -- FISSURE CIRCONFERENTIELLE (90 DEGRES)
140      BSUP = SF
141      BINF = SF
142      if BSUP>DIST:
143        BCOUD = DIST - BINF
144        BEMB  = BSUP - DIST
145      elif BINF<0. :
146        BCOUD = BSUP 
147        BEMB  = abs(BINF)
148      elif (BINF>=0. and BSUP<=DIST):
149        BCOUD = 2.0*AXEC
150   else:
151 # -- FISSURE A +/- 45 DEGRES SUR INTRADOS OU EXTRADOS
152      BSUP = SF + sqrt(2.0)/2.0*AXEC
153      BINF = SF - sqrt(2.0)/2.0*AXEC
154      if BSUP>DIST:
155        BCOUD = (DIST - BINF)*sqrt(2.0)
156        BEMB  = (BSUP - DIST)*sqrt(2.0)
157      elif BINF<0. :
158        BCOUD = BSUP *sqrt(2.0)
159        BEMB  = abs(BINF)*sqrt(2.0)
160      elif (BINF>=0. and BSUP<=DIST):
161        BCOUD = 2.0*AXEC
162   print 'PARTIE DU GRAND AXE DANS LE COUDE  : %.2f'%BCOUD
163   print 'PARTIE DU GRAND AXE DANS L EMBOUT  : %.2f'%BEMB
164 #
165 # -- CALCUL DE LA TAILLE DU GRAND AXE FISSURE SUR LA PLAQUE
166 #
167   NEWT=0
168   if abs(ORIEN)<0.01:
169 # -- FISSURE LONGITUDINALE (0 DEGRE)
170     if GEOM=='COUDE': AXECP = BCOUD/(1.0+X/RC*cos(AZIMR)) + BEMB
171     else            : AXECP = BCOUD + BEMB
172   elif abs(ORIEN-90.)<0.01:
173 # -- FISSURE CIRCONFERENTIELLE (90 DEGRES)
174     AXECP = (BCOUD+BEMB)*RM/X
175   else :
176     if GEOM=='COUDE':
177 #   ------- TRANSFORMATION COUDE
178        if AZIM in (0.,180.):
179 # -- FISSURE A +/- 45 DEGRES SUR INTRADOS OU EXTRADOS
180           AXECP = BCOUD*RM*sqrt(2.)/( X*sqrt(1.+(RM/X+RM/RC*cos(AZIMR))**2) )+\
181                   BEMB*sqrt( (1.0+(X/RM)**2)*0.5 )
182        else :
183 # -- FISSURE A +/- 45 DEGRES AILLEURS
184           AXECP = funct_root.root(ASCFON,(BCOUD-1.,BCOUD+1.))
185           AXECP = AXECP + BEMB*sqrt( (1.+(X/RM)**2)*0.5 )
186           AXECC = ASCFON(AXECP)+BCOUD
187           NEWT=1
188     elif GEOM=='TUBE':
189        AXECP = (BCOUD+BEMB)*sqrt( (1.+(X/RM)**2)*0.5 ) 
190     else :
191        AXECP = BCOUD + BEMB
192 #
193   if GEOM=='COUDE':
194     print 'TAILLE GRAND AXE COUDE DONNE : %.2f'%(2.*AXEC)
195   elif GEOM=='TUBE':
196     print 'TAILLE GRAND AXE TUBE  DONNE : %.2f'%(2.*AXEC)
197   print 'TAILLE GRAND AXE PLAQUE DEDUIT : %.2f'%AXECP
198   if NEWT:
199     print 'METHODE DE NEWTON FISSURE A 45 DEGRES -->'
200     print 'TAILLE GRAND AXE COUDE RECALCULE : %.2f'%AXECC
201   if GEOM=='COUDE' and BEMB>0. and BSUP>DIST :
202     SFP =  ALPHA*2.*pi*RC/360. - AXECP/2. + BEMB
203     print 'CORRECTION CENTRE : FISSURE A CHEVAL SUR EMBOUT'
204     print 'ABSC. CURV. AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP
205   if GEOM=='COUDE' and BEMB>0. and BINF<0. :
206     SFP = + AXECP/2. - BEMB
207     print 'CORRECTION CENTRE : FISSURE A CHEVAL SUR EMBOUT'
208     print 'ABSC. CURV. AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP
209 #
210 # -- CORRECTION DU PETIT AXE DE LA FISSURE QUAND CELLE-CI SE TROUVE SUR
211 #    LA ZONE DE SUREPAISSEUR
212 #
213   ALPHAR = ALPHA*2.*pi/360.
214   ZSUR1  = ALPHAR*RC/10.
215   ZSUR2  = ALPHAR*RC*9./10.
216   YFISS  = (AZIMR-pi/2.)*RM
217   MU = 0.
218   if (AZIM>=120.) and (AZIM<=240.):
219      if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = 1.
220      elif (SFP<=ZSUR1):                MU = SFP/ZSUR1
221      elif (SFP>ZSUR2):                 MU = (ALPHAR*RC-SFP)/ZSUR1
222   elif (AZIM>=90.) and (AZIM<=120.):
223      if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = YFISS/(pi/6.*RM) 
224      elif (SFP<=ZSUR1):                MU = YFISS*SFP/(pi/6.*RM*ZSUR1)
225      elif (SFP>ZSUR2):                 MU = YFISS*(ALPHAR*RC-SFP)/(pi/6.*RM*ZSUR1)
226   elif (AZIM>=240.) and (AZIM<=270.):
227      if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = (YFISS-5.*pi/6.*RM)/(pi/6.*RM) 
228      elif (SFP<=ZSUR1):                MU = (YFISS-5.*pi/6.*RM)*SFP/(pi/6.*RM*ZSUR1)
229      elif (SFP>ZSUR2):                 MU = (YFISS-5.*pi/6.*RM)*(ALPHAR*RC-SFP)/(pi/6.*RM*ZSUR1)
230 #
231   if SUREP!=0.:
232      AXEAP = AXEA * EP / ( EP + MU*SUREP )
233      print '--> CORRECTION DUE A LA SUREPAISSEUR'     
234      print '--> TAILLE PETIT AXE PLAQUE : %.2f'%AXEAP
235   else: AXEAP = AXEA
236 #
237   return AXEAP,AXECP,SFP 
238 ################################################################################
239 ################################################################################
240 ################################################################################
241 #     MACR_ASCOUF_MAIL ASCSEP
242 #     taille initiale sur la plaque des sous-epaisseurs
243 #
244 #-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
245 #
246 #     ALPHA = ANGLE DU COUDE
247 #     RM    = RAYON MOYEN DU COUDE
248 #     RC    = RAYON DE CINTRAGE DU COUDE
249 #     EP    = EPAISSEUR DU COUDE
250 #     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)  
251 #     SYME  = QUART DE STRUCTURE SI 'OUI'
252 #    
253
254 def ASCSEP(MCL_SOUS_EPAIS,ALPHA,RM,RC,EP,GEOM,SYME):
255   ier=0
256   CG=pi/180.
257 #
258 # --- BOUCLE SUR L ENSEMBLE DES SOUS-EPAISSEURS
259 #
260   i=0
261   for ssep in MCL_SOUS_EPAIS :
262       i=i+1
263       print '-------------------------------------'
264       print 'SOUS-EPAISSEUR NUMERO %d'%i
265       print '-------------------------------------'
266 #
267 # --- CAS DES SOUS-EPAISSEURS AXISYMETRIQUES 
268 #
269       if ssep['TYPE']=='AXIS':
270          print 'SOUS-EPAISSEUR AXISYMETRIQUE : '
271          print 'CALCUL DE LA TAILLE LONGI ENVELOPPE EN INTRADOS (AZIMUT PI)'
272          ssep.ICIRP = 2.*pi*RM
273          ssep.ISCP  =    pi*RM
274          ssep.IPHIC = 180.
275          AZIMC      = pi
276       else:
277 #
278 # -- CALCUL DE L ABSCISSE CURVILIGNE CIRCONF.SUR LA PLAQUE  
279 #    EN FONCTION DE L AZIMUT OU DE L ABSCISSE CURVIL.CIRCONF
280 #    SUR LE COUDE DU CENTRE DE LA SOUS-EPAISSEUR
281 #    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
282 #
283          if ssep['POSI_CURV_CIRC']!=None:
284            ssep.ISCP  = ssep['POSI_CURV_CIRC']*RM/(RM+EP/2.)
285            AZIMC      = ssep.ISCP/RM
286            ssep.IPHIC = ssep['POSI_CURV_CIRC']/(RM+EP/2.)*180./pi
287            print 'AZIMUT CENTRE SOUS-EPAISSEUR (DEGRES) : %.2f'%ssep.IPHIC
288          else:
289            ssep.ISCP  = ssep['AZIMUT']*pi*RM/180. 
290            AZIMC      = ssep['AZIMUT']*pi/180.
291            print 'ABSC. CURV. CIRCONF. CENTRE SOUS-EPAISSEUR SUR COUDE : %.2f'%(AZIMC*(RM+EP/2.))
292 #
293 #    PASSAGE DANS LE REPERE PLAQUE (0,2PI) AVEC ORIGINE FLANC DROIT
294 #    CAR L ORIGINE DES DONNEES CIRCONF. EST EN EXTRADOS 
295 #
296          if ssep.ISCP>(3.*pi*RM/2.): ssep.ISCP = ssep.ISCP - 3.*pi*RM/2.
297          else:                       ssep.ISCP = ssep.ISCP + pi*RM/2.
298          print 'ABSC. CURV. CIRCONF. CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISCP
299 #
300 # -- CALCUL DE LA TAILLE CIRCONFERENTIELLE 
301 #    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
302 #
303          ssep.ICIRP = ssep['AXE_CIRC']*(RM/(RM+EP/2.))
304          if ssep.ICIRP>(2.*pi*RM) :
305             print ' <MACR_ASCOUF_MAIL> ASCSEP valeur hors domaine'
306             print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero : %d'%i
307             print ' <MACR_ASCOUF_MAIL> taille axe circonferentiel : %.2f'%ssep.ICIRP
308             print ' <MACR_ASCOUF_MAIL> bord plaque : %.2f'%2*pi*RM
309             self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
310             ier = ier+1
311             return ier
312          print 'TAILLE CIRCONFERENTIELLE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ICIRP
313          print '<=> TAILLE EQUIVALENTE SUR LA CIRCONFERENCE (DEGRES) : %.2f'%(ssep.ICIRP*360./(2.*pi*RM))  
314 #
315 # -- CALCUL COTE AXIALE DU CENTRE SOUS-EPAISSEUR SUR LA PLAQUE 
316 #    EN FONCTION DE L ABSCISSE CURVILIGNE DONNEE SUR LE COUDE 
317 #    OU DE LA POSITION ANGULAIRE
318 #    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
319 #
320       if ssep['POSI_CURV_LONGI']!=None:
321          if GEOM=='COUDE':
322             ssep.ISLP = ssep['POSI_CURV_LONGI']/(1.+(RM+EP/2.)/RC*cos(AZIMC))
323             AZIML     = ssep.ISLP/RC
324             print 'ANGLE COUDE CENTRE SOUS-EPAISSEUR (DEGRES) : %.2f'%(AZIML*180./pi)
325          else :
326             ssep.ISLP = ssep['POSI_CURV_LONGI']
327          if (SYME in ('QUART','DEMI')) and (ssep.ISLP!=ALPHA*CG*RC/2.) :
328             print ' <MACR_ASCOUF_MAIL> ASCSEP cas de symetrie :'
329             print ' <MACR_ASCOUF_MAIL> la sous-epaisseur doit etre dans la section mediane du coude !'
330             self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
331             ier = ier+1
332             return ier
333       else :
334          if GEOM=='COUDE':
335             print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR COUDE : %.2f'%((ssep.BETA)*CG*(RC+(RM+EP/2.)*cos(AZIMC)))
336             AZIML = (ssep.BETA)*CG
337          else :
338             print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR TUBE  : %.2f'%((ssep.BETA)*CG*RC)
339          ssep.ISLP =  (ssep.BETA)*CG*RC
340          if (SYME in ('QUART','DEMI')) and (ssep.BETA!=ALPHA/2.) :
341             print ' <MACR_ASCOUF_MAIL> ASCSEP cas de symetrie :'
342             print ' <MACR_ASCOUF_MAIL> la sous-epaisseur doit etre dans la section mediane du coude !'
343             self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
344             ier = ier+1
345             return ier
346       print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP
347 #
348 # -- CALCUL DE LA TAILLE LONGITUDINALE 
349 #    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
350 #
351 #   ON ENVISAGE LE CAS OU UNE PARTIE DE L AXE EST DANS LES
352 #   DROITES DES EMBOUTS. LA TRANSFORMATION N EST FAITE QUE SUR LA 
353 #   PARTIE RESTANT DANS LE COUDE.
354 #
355       if GEOM=='COUDE' : DIST = ALPHA*CG*(RC+(RM+EP/2.)*cos(AZIMC))
356       else             : DIST = ALPHA*CG*RC
357       if ssep['POSI_CURV_LONGI']!=None:
358          BSUP = ssep['POSI_CURV_LONGI']+ssep['AXE_LONGI']/2.
359          BINF = ssep['POSI_CURV_LONGI']-ssep['AXE_LONGI']/2.
360       else:
361          if GEOM=='COUDE' :
362             BSUP = ssep.BETA*CG*(RC+(RM+EP/2.)*cos(AZIMC))+ssep['AXE_LONGI']/2.
363             BINF = ssep.BETA*CG*(RC+(RM+EP/2.)*cos(AZIMC))-ssep['AXE_LONGI']/2.
364          else:
365             BSUP = ssep.BETA*CG*RC + ssep['AXE_LONGI']/2.
366             BINF = ssep.BETA*CG*RC - ssep['AXE_LONGI']/2.
367       BCOUD1 = 0.
368       BCOUD2 = 0.
369       BEMB1  = 0.
370       BEMB2  = 0.
371       if BINF<0. and BSUP>DIST :
372          BCOUD1 = DIST
373          BEMB1  =  abs(BINF) + BSUP-DIST
374       elif BSUP>DIST :
375          BCOUD1 = DIST - BINF
376          BEMB1  = BSUP - DIST
377       elif BINF<0 :
378          BCOUD2 = BSUP
379          BEMB2  = abs(BINF)
380       elif (BINF>=0. and BSUP<=DIST) :
381          BCOUD1 = ssep['AXE_LONGI']
382       BCOUD = BCOUD1+ BCOUD2
383       BEMB  = BEMB1 + BEMB2
384       if GEOM=='COUDE' : BPLAQ = BCOUD/(1.+(RM+EP/2.)/RC*cos(AZIMC))
385       else             : BPLAQ = BCOUD
386       ssep.ILONP = BPLAQ+BEMB
387       if BEMB1>0.:
388          ssep.ISLP =  ALPHA*CG*RC - ssep.ILONP/2. + BEMB1
389          print 'CORRECTION CENTRE : SOUS-EP. A CHEVAL SUR EMBOUT'
390          print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP
391       if BEMB2>0.:
392          ssep.ISLP =  ssep.ILONP/2. - BEMB2
393          print 'CORRECTION CENTRE : SOUS-EP. A CHEVAL SUR EMBOUT'
394          print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP
395       if ssep.ISLP<0.            : ssep.ISLP = 0.
396       if (ssep.ISLP>ALPHA*CG*RC) : ssep.ISLP = ALPHA*CG*RC 
397 #
398 #     SI LE CENTRE DE LA SOUS-EP CALCULE SUR LA PLAQUE EST DANS L EMBOUT
399 #     ON CORRIGE SA POSITION EN LE METTANT A L INTERFACE SINON CA PLANTE
400 #     DANS LA PROC DE MAILLAGE (A AMELIORER)
401 #
402       print 'TAILLE LONGITUDINALE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ILONP
403       print '<=> TAILLE EQUIVALENTE PAR RAPPORT A L ANGLE DU COUDE (DEGRES): %.2f'%(ssep.ILONP*360/(2*pi*RC))  
404 #
405   return ier
406 ################################################################################
407 ################################################################################
408 ################################################################################
409 #     MACR_ASCOUF_MAIL ASCTCI
410 #     APPELEE DANS : ASCSYM et ASCPRE
411 #     CALCUL TABLEAU TRIE DES ABSCISSES DES CENTRES DE SOUS-EPAISSEURS
412 #
413 #-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
414 #
415 #     RM    = RAYON MOYEN DU COUDE
416 #
417 #----------------------DONNEES RENVOYEES-----------------------
418 #
419 #     IABSC1 = CORRESPONDANCE ABSC. CURVI. CIRCONF. SOUS-EP. I
420 #     IABSC2 = CORRESPONDANCE ABSC. GAUCHE ET DROITE CIRCONF. SOUS-EP. I
421 #     COORXD = ABSC. DU BORD DROIT DE LA SOUS-EP I
422 #     COORXG = ABSC. DU BORD GAUCHE DE LA SOUS-EP I
423 #
424 def ASCTCI(MCL_SOUS_EPAIS,RM):
425 #
426 # --- tri du tableau des abscisses curvilignes circonf. plaque
427 #
428   TAMPON = []
429   COORXG = []
430   COORYG = []
431   i=0
432   for ssep in MCL_SOUS_EPAIS :
433       i=i+1
434       if (ssep.ISCP>2.*pi*RM) or (ssep.ISCP<0.) : 
435          print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
436          print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :%d'%MCL_SOUS_EPAIS.index(ssep)
437          print ' <MACR_ASCOUF_MAIL> ABSC. CURV. CIRCONF.  :%.2f'%ssep.ISCP
438          print ' <MACR_ASCOUF_MAIL> BORD PLAQUE :%.2f'%(2.*pi*RM)
439          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
440          ier = ier+1
441          return ier
442       TAMPON.append((ssep.ISCP,i))
443   TAMPON.sort()
444   IABSC1=[]
445   for j in range(i):
446     IABSC1.append(TAMPON[j][1])
447   print
448   print 'TRI DES CENTRES ABSC. CURV. CIRCONF. :'
449   print '------------------------------------'
450   i=0
451   for ssep in TAMPON :
452     i=i+1
453     print '%d) SOUS-EP NO %d <> XC = %.2f'%(i,ssep[1],ssep[0])
454 #
455 # --- calcul des abcisses droites et gauches des sous-epaisseurs
456 #
457   COORXD=[]
458   COORXG=[]
459   for bid in TAMPON :
460       XG=bid[0]-MCL_SOUS_EPAIS[bid[1]-1].ICIRP/2.
461       if XG<0.       : XG=XG+2.*pi*RM
462       COORXG.append(XG)
463       XD=bid[0]+MCL_SOUS_EPAIS[bid[1]-1].ICIRP/2.
464       if XD>2.*pi*RM : XD=XD-2.*pi*RM
465       COORXD.append(XD)
466 #
467 # --- tri des bornes d'intervalles en abscisse
468 #
469   TAMPON = []
470   for j in range(len(MCL_SOUS_EPAIS)):
471     TAMPON.append((COORXG[j],2*j+1))
472     TAMPON.append((COORXD[j],2*j+2))
473   TAMPON.sort() 
474   IABSC2=[]
475   for j in range(2*len(MCL_SOUS_EPAIS)):
476     IABSC2.append(TAMPON[j][1])
477   print
478   print 'TRI DES INTERVALLES G ET D ABSC. CURV. CIRCONF. :'
479   print '-----------------------------------------------'  
480   for j in range(2*len(MCL_SOUS_EPAIS)):
481     if fmod(IABSC2[j],2):
482        print '%d) SOUS-EP NO %d <> XG = %.2f'%(j+1,IABSC1[IABSC2[j]/2],TAMPON[j][0])
483     else:
484        print '%d) SOUS-EP NO %d <> XD = %.2f'%(j+1,IABSC1[IABSC2[j]/2-1],TAMPON[j][0])
485 #    
486   return TAMPON,IABSC1,IABSC2,COORXD,COORXG
487 #
488 ################################################################################
489 ################################################################################
490 ################################################################################
491 #     MACR_ASCOUF_MAIL ASCTLO
492 #     APPELEE DANS : ASCSYM et ASCPRE
493 #     CALCUL TABLEAU TRIE DES ORDONNEES DES CENTRES DE SOUS-EPAISSEURS
494 #
495 #-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
496 #
497 #     RC     = RAYON MOYEN DU COUDE
498 #     ALPHA  = ANGLE DU COUDE
499 #     LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT
500 #     LTCLIM  = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES
501 #
502 #----------------------DONNEES RENVOYEES-----------------------
503 #
504 #     IORDO1 = CORRESPONDANCE ORDO. CURVI. LONGIT. SOUS-EP. I
505 #     IORDO2 = CORRESPONDANCE ORDO. GAUCHE ET DROITE LONGIT. SOUS-EP. I
506 #     COORYI = ORDONNEE. DU BORD INTERIEUR DE LA SOUS-EP I
507 #     COORYS = ORDONNEE. DU BORD SUPERIEUR DE LA SOUS-EP I
508 #
509 def ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM):
510 #
511 # tri du tableau des abscisses curvilignes axiales plaque
512 #
513   ALPHAR = 2.*ALPHA*pi/360.
514   TAMPON = []
515   i=0
516   for ssep in MCL_SOUS_EPAIS :
517       i=i+1
518       if (ssep.ISLP>ALPHAR*RC) or (ssep.ISLP<0.) : 
519          print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
520          print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :%d'%MCL_SOUS_EPAIS.index(ssep)
521          print ' <MACR_ASCOUF_MAIL> ABSC. CURV. LONGIT.  :%.2f'%ssep.ISLP
522          print ' <MACR_ASCOUF_MAIL> BORDS PLAQUE :%.2f'%(ALPHAR*RC)
523          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
524          ier = ier+1
525          return ier
526       TAMPON.append((ssep.ISLP,i))
527   TAMPON.sort()
528   IORDO1=[]
529   for j in range(i):
530     IORDO1.append(TAMPON[j][1])
531   print
532   print 'TRI DES CENTRES ABSC. CURV. LONGIT. :'
533   print '------------------------------------'
534   i=0
535   for ssep in TAMPON :
536     i=i+1
537     print '%d) SOUS-EP NO %d <> YC = %.2f'%(i,ssep[1],ssep[0])
538 #
539 # calcul des abscisses sup. et inf. des sous-ep.
540 #
541   COORYI=[]
542   COORYS=[]
543   EPS=0.000000000001
544   for bid in TAMPON :
545       i=i+1
546       YI=bid[0]-MCL_SOUS_EPAIS[bid[1]-1].ILONP/2.
547       YS=bid[0]+MCL_SOUS_EPAIS[bid[1]-1].ILONP/2.
548       if fabs(bid[0])<EPS : 
549          YI=-(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.
550          YS=MCL_SOUS_EPAIS[bid[1]-1].ILONP-(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.
551       if fabs(bid[0]-ALPHAR*RC)<EPS :
552          YI=ALPHAR*RC-(MCL_SOUS_EPAIS[bid[1]-1].ILONP-(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.)
553          YS=ALPHAR*RC+(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.
554       if YI<(-LTCHAR):
555          print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
556          print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :',bid[1]
557          print ' <MACR_ASCOUF_MAIL> BORD INFERIEUR  :',YI
558          print ' <MACR_ASCOUF_MAIL> BORD PLAQUE :',-LTCHAR
559          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
560          ier = ier+1
561          return ier
562       if YS>(ALPHAR*RC+LTCLIM):
563          print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
564          print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :',bid[1]
565          print ' <MACR_ASCOUF_MAIL> BORD INFERIEUR  :',YS
566          print ' <MACR_ASCOUF_MAIL> BORD PLAQUE :',ALPHAR*RC+LTCLIM
567          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
568          ier = ier+1
569          return ier
570       COORYI.append(YI) 
571       COORYS.append(YS)
572 #
573 # tri des bornes d'intervalles en abscisse
574 #
575   TAMPON = []
576   for j in range(len(MCL_SOUS_EPAIS)):
577     TAMPON.append((COORYI[j],2*j+1))
578     TAMPON.append((COORYS[j],2*j+2))
579   TAMPON.sort() 
580   IORDO2=[]
581   for j in range(2*len(MCL_SOUS_EPAIS)):
582     IORDO2.append(TAMPON[j][1])      
583   print
584   print 'TRI DES INTERVALLES I ET S ABSC. CURV. LONGIT. :'
585   print '-----------------------------------------------'
586   for j in range(2*len(MCL_SOUS_EPAIS)):
587     if fmod(IORDO2[j],2):
588        print '%d) SOUS-EP NO %d <> YI = %.2f'%(j+1,IORDO1[IORDO2[j]/2],TAMPON[j][0])
589     else:
590        print '%d) SOUS-EP NO %d <> YS = %.2f'%(j+1,IORDO1[IORDO2[j]/2-1],TAMPON[j][0])
591 #
592   return TAMPON,IORDO1,IORDO2,COORYI,COORYS
593 #
594 #
595 ################################################################################
596 ################################################################################
597 ################################################################################
598 #     MACR_ASCOUF_MAIL ASCNBE
599 #     APPELEE DANS : ASCSYM et ASCPRE
600 #     CALCUL DU NOMBRE D'ELEMENTS LONGI ET CIRCONF. DANS LES SOUS-EPAISSEURS
601 #
602 #-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
603 #
604 #     COORXG = ABSCISSE DU BORD GAUCHE DE LA SOUS-EPAISSEUR I
605 #     COORXD = ABSCISSE DU BORD DROIT DE LA SOUS-EPAISSEUR I
606 #     COORYI = ORDONNEE DU BORD INFERIEUR DE LA SOUS-EPAISSEUR I
607 #     COORYS = ORDONNEE DU BORD SUPERIEUR DE LA SOUS-EPAISSEUR I
608 #     BD     = ABSCISSE DU BORD DROIT DE LA ZONE CIRCONF J
609 #     BG     = ABSCISSE DU BORD GAUCHE DE LA ZONE CIRCONF J
610 #     BS     = ORDONNEE DU BORD SUPERIEUR DE LA ZONE LONGI J
611 #     BI     = ORDONNEE DU BORD INFERIEUR DE LA ZONE LONGI J
612 #     DNX    = DENSITE ET NOMBRE D'ELEMENTS CIRCONF. DE LA ZONE J
613 #     DNY    = DENSITE ET NOMBRE D'ELEMENTS LONGIT. DE LA ZONE J
614 #     INDSEX = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE CIRCONF J
615 #     INDSEY = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE LONGI J
616 #     RM     = RAYON MOYEN DU COUDE
617 #     RC     = RAYON DE CINTRAGE DU COUDE
618 #     IABSC1 = CORRESPONDANCE ABSCISSE CURVILIGNE CIRCONF. SOUS-EP. I
619 #     IORDO1 = CORRESPONDANCE ABSCISSE CURVILIGNE LONGIT. SOUS-EP. I
620 #
621 #----------------------DONNEES RENVOYEES-----------------------
622 #
623 #     NLX = NOMBRE TOTAL D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR K
624 #     NLY = NOMBRE TOTAL D'ELEMENTS LONGIT. DE LA SOUS-EPAISSEUR K
625 #
626 def ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI,DNX,DNY,RM,RC,
627            INDSEX,INDSEY,IABSC1,IORDO1):
628 #
629 #  calcul du nombre d'elements longi. et circonf. dans les sous-epaisseurs:
630 #
631   print
632   print 'DETERMINATION DU NOMBRE D''ELEMENTS DANS LES SOUS-EPAISSEURS :'
633   print '------------------------------------------------------------'
634   NLX=[0]*len(MCL_SOUS_EPAIS)
635   NLY=[0]*len(MCL_SOUS_EPAIS)
636   for j in range(len(BD)):
637     if INDSEX[j]!=0:
638 #      calcul au passage du nombre d'elements sur chaque zone circonf.   
639        RNBEL = (BD[j]-BG[j])*360./(DNX[2*j]*2.*pi*RM)
640        RNBEL2 = RNBEL - floor(RNBEL)
641        if RNBEL2 <= 0.5 : NBEL=int(floor(RNBEL))
642        else             : NBEL=int(floor(RNBEL))+1
643        if NBEL <= 1 :     NBEL=2
644 #      calcul au passage du nombre d'elements sur chaque sous-epaisseur circonf.       
645        for i in range(len(MCL_SOUS_EPAIS)):
646          l=IABSC1[i]-1
647          if ((COORXG[l]<COORXD[l] and BG[j]>=COORXG[l] and BD[j]<=COORXD[l])\
648          or (COORXG[l]>=COORXD[l] and (BG[j]<=COORXG[l] or BD[j]>=COORXD[l]))):
649             NLX[i]=NLX[i]+NBEL
650             print 'SOUS-EP NO %d ZONE CIRC. NO %d NB ELEM. = %d'%(i+1,j+1,NBEL)
651
652   for j in range(len(BS)):
653     if INDSEY[j]!=0:
654 #      calcul au passage du nombre d'elements sur chaque zone longi.      
655        RNBEL = ((BS[j]-BI[j])*360.)/(DNY[2*j]*2.*pi*RC)
656        RNBEL2 = RNBEL - floor(RNBEL)
657        if RNBEL2 <= 0.5 : NBEL=int(floor(RNBEL))
658        else             : NBEL=int(floor(RNBEL))+1
659        if NBEL <= 1 :     NBEL=2
660 #      calcul au passage du nombre d'elements sur chaque sous-epaisseur circonf.       
661        i=0
662        for i in range(len(MCL_SOUS_EPAIS)):
663          l=IORDO1[i]-1
664          if (BI[j]>=COORYI[l] and BS[j]<=COORYS[l]):
665             NLY[i]=NLY[i]+NBEL
666             print 'SOUS-EP NO %d ZONE LONGI. NO %d NB ELEM. = %d'%(i+1,j+1,NBEL)
667
668   for j in range(len(NLX)):
669     print 'SOUS-EP NO %d NBE TOTAL ELEMENTS CIRCONF. : %d'%(j+1,NLX[j])
670     print 'SOUS-EP NO %d NBE TOTAL ELEMENTS LONGI.   : %d'%(j+1,NLY[j])
671
672 #
673   return NLX,NLY
674 #
675 ################################################################################
676 ################################################################################
677 ################################################################################
678 #     MACR_ASCOUF_MAIL ASCSYM
679 #     PREPARATION DES DONNEES POUR LE MAILLAGE DE PLAQUE AVEC
680 #     SOUS-EPAISSEURS :
681 #     CAS D UNE SOUS-EPAISSEUR DANS LE PLAN DE SYMETRIE 
682 #     CONSTRUCTION D UN QUART DU MAILLAGE
683 #     - CALCUL TABLEAU TRIE DES ABSCISSES ET ORDONNEES DES CENTRES 
684 #     - CALCUL TABLEAU DES ZONES COUVERTES PAR LES SOUS-EPAISSEURS
685 #
686 #-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
687 #
688 #     RM    = RAYON MOYEN DU COUDE
689 #     RC    = RAYON DE CINTRAGE DU COUDE
690 #     ALPHA = ANGLE DU COUDE
691 #     LT    = LONGUEUR DE L EMBOUT DU COTE CHARGEMENT
692 #     LGV   = LONGUEUR DE L EMBOUT DU COTE CONDITIONS AUX LIMITES
693 #     NBSEP = NOMBRE DE SOUS-EPAISSEURS
694 #
695 #----------------------DONNEES RENVOYEES-----------------------
696 #
697 #     NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES
698 #     NZONEY = NOMBRE DE ZONES LONGITUDINALES       
699 #
700 def ASCSYM(MCL_SOUS_EPAIS,RM,RC,ALPHA,LTCHAR,LTCLIM):
701   ier=0
702   DERAFC = 18.
703   DERAFL =  5.       
704   INDSEX = []
705   INDSEY = []
706   BG     = []
707   BD     = []
708   INDBG  = []
709   INDBD  = []
710   DNX    = []
711
712 #
713 # --- tri des donnees sous-ep. en circonferentiel
714   TAMPON,IABSC1,IABSC2,COORXD,COORXG=ASCTCI(MCL_SOUS_EPAIS,RM)
715 #
716 # --- calcul des zones en circonferentiel
717 #
718   ssep=MCL_SOUS_EPAIS[0]
719   if (ssep.ISCP<pi*RM) :
720 #
721 #     le centre sous-ep est dans la zone flanc droit/extrados/flanc
722 #     gauche, on preleve pi*RM a droite de la sous-epaisseur
723 #
724 #          zone (centre sous-ep , bord droit)
725 #
726      BG.append(ssep.ISCP)
727      BG.append(ssep.ISCP+ssep.ICIRP/2.)
728      BD.append(ssep.ISCP+ssep.ICIRP/2.)
729      BD.append(ssep.ISCP+pi*RM)
730      INDBG.append(0)
731      INDBG.append(1)
732      INDBD.append(0)
733      INDBD.append(0)
734      DNX.append(ssep.IDENC)
735      DNX.append(0)
736      DNX.append(DERAFC)
737      DNX.append(0)
738      INDSEX.append(1)
739      INDSEX.append(0)
740   elif (ssep.ISCP+pi*RM==2.*pi*RM) :
741 #
742 #     sous-ep axisymetrique : on preleve pi*RM a droite
743 #
744 #       zone (centre sous-ep , bord droit)
745 #
746      BG.append(ssep.ISCP)
747      BD.append(ssep.ISCP+ssep.ICIRP/2.)
748      INDBG.append(0)
749      INDBD.append(0)
750      DNX.append(ssep.IDENC)
751      DNX.append(0)
752      INDSEX.append(1)
753      INDSEX.append(0)
754   else :
755 #
756 #     le centre sous-ep est dans la zone flanc gauche/intrados/flanc 
757 #     droit : on preleve pi*RM a gauche de la sous-epaisseur
758 #
759 #            zone (centre -pi*RM, bord gauche)
760 #
761      BG.append(ssep.ISCP-pi*RM)
762      BG.append(ssep.ISCP-ssep.ICIRP/2.)
763      BD.append(ssep.ISCP-ssep.ICIRP/2.)
764      BD.append(ssep.ISCP)
765      INDBG.append(0)
766      INDBG.append(0)
767      INDBD.append(1)
768      INDBD.append(0)
769      DNX.append(DERAFC)
770      DNX.append(0)
771      DNX.append(ssep.IDENC)
772      DNX.append(0)     
773      INDSEX.append(0)
774      INDSEX.append(1)
775
776
777   print
778   print 'ZONES APRES RECOUVREMENT ABSC. CURV. CIRCONF. :'
779   print '---------------------------------------------'
780   EPS=0.000000000001
781   NZONEX=len(BG)
782   for j in range(NZONEX) :
783     if ( fabs(BG[j]) < EPS ) and ( fabs(BD[j]) < EPS ) :
784       print 'ZONE NO %d BORNE GAUCHE = %.2f'\
785       ' / BORNE DROITE = %.2f * SOUS-EPAISSEUR'%(j+1,BG[j],BD[j])
786     else:
787       print 'ZONE NO %d BORNE GAUCHE = %.2f'\
788       ' / BORNE DROITE = %.2f'%(j+1,BG[j],BD[j])
789
790     
791 # tri des donnees sous-epaisseurs en axial
792   TAMPON,IORDO1,IORDO2,COORYI,COORYS=ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM)
793
794 # calcul des zones en axial:
795   BI     = []
796   BS     = []
797   INDBI  = []
798   INDBS  = []
799   DNY    = []
800   INDSEY = []
801   ssep   = MCL_SOUS_EPAIS[0]
802   BI.append(0.)
803   BI.append(ssep.ISLP-ssep.ILONP/2.)
804   BS.append(ssep.ISLP-ssep.ILONP/2.)
805   BS.append(ssep.ISLP)
806   INDBI.append(0)  
807   INDBI.append(0)
808   INDBS.append(1)
809   INDBS.append(0)
810   DNY.append(DERAFL)
811   DNY.append(0)
812   DNY.append(ssep.IDENL)
813   DNY.append(0)
814   INDSEY.append(0)
815   INDSEY.append(1)
816   print
817   print 'ZONES APRES RECOUVREMENT ABSC. CURV. LONGIT. :'
818   print '-----------------------------------------------'
819   NZONEY=len(BI)
820   for j in range(NZONEY) :
821     if ( fabs(BI[j]) < EPS ) and ( fabs(BS[j]) < EPS ) :
822       print 'ZONE NO %d <> BORNE INF. = %.2f'\
823       ' / BORNE SUP. = %.2f * SOUS-EPAISSEUR'%(j+1,BI[j],BS[j])
824     else:
825       print 'ZONE NO %d <> BORNE INF. = %.2f'\
826       ' / BORNE SUP. = %.2f'%(j+1,BI[j],BS[j])
827  
828 # calcul du nombre d'elements longi. et circonf. dans les soue-ep
829   NLX,NLY=ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI,
830                  DNX,DNY,RM,RC,INDSEX,INDSEY,IABSC1,IORDO1)
831
832   return ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY
833 ################################################################################
834 ################################################################################
835 ################################################################################
836 ################################################################################
837 #     MACR_ASCOUF_MAIL ASCPRE
838 #     PREPARATION DES DONNEES POUR LE MAILLAGE DE PLAQUE 
839 #     SOUS-EPAISSEURS :
840 #     - CALCUL TABLEAU TRIE DES ABSCISSES ET ORDONNEES DES CENTRES 
841 #     - CALCUL TABLEAU DES ZONES COUVERTES PAR LES SOUS-EPAISSEURS
842 #
843 #-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
844 #
845 #     RM    = RAYON MOYEN DU COUDE
846 #     RC    = RAYON DE CINTRAGE DU COUDE
847 #     ALPHA = ANGLE DU COUDE
848 #     LT    = LONGUEUR DE L EMBOUT DU COTE CHARGEMENT
849 #     LGV   = LONGUEUR DE L EMBOUT DU COTE CONDITIONS AUX LIMITES
850 #     NBSEP = NOMBRE DE SOUS-EPAISSEURS
851 #     SYME  = "QUART" DE STRUCTURE, "DEMI" STRUCTURE OU BIEN "ENTIER"
852 #
853 #----------------------DONNEES RENVOYEES-----------------------
854 #
855 #     NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES
856 #     NZONEY = NOMBRE DE ZONES LONGITUDINALES       
857 #
858 def ASCPRE(MCL_SOUS_EPAIS,RM,RC,ALPHA,SYME,LTCHAR,LTCLIM):
859   ier=0
860   ALPHAR = 2.*ALPHA*pi/360.
861   DERAFC = 18.
862   DERAFL =  5.
863   EPSI   =  0.001      
864   NBSEP  = len(MCL_SOUS_EPAIS)
865   print 'RECHERCHE DES ZONES DE SOUS-EPAISSEURS DANS LE COUDE\n'
866   
867 # tri des donnees sous-epaisseurs en circonferentiel
868   TAMPON,IABSC1,IABSC2,COORXD,COORXG=ASCTCI(MCL_SOUS_EPAIS,RM)
869 # --- calcul des recouvrements de zones en circonferentiel
870 #
871   NZONEX=0
872   j=0
873   ICE=1
874   NBGAU=0
875   NBDRO=0
876   TYPG=0
877   TYPD=0
878   go10=1
879   go20=1
880 #
881   BG    =[]
882   BD    =[]
883   INDBG =[]
884   INDBD =[]
885   DNX   =[]
886   INDSEX=[]
887 #
888   
889   while go10:
890    
891     j=j+1      
892 #
893 #   definition de la zone courante (borne gauche, borne droite)
894 #    
895 #   TYPG = type de la borne:
896 #          0 : borne gauche sous-epaisseur
897 #          1 : borne droite sous-epaisseur
898 #          2 : centre sous-epaisseur
899 #
900     if j>2*NBSEP and ICE<NBSEP :
901 #     cas ou il ne reste plus que des centres a caser
902       MING = MIND
903       TYPG = TYPD
904       NUMG = NUMD
905       MIND = 2.*pi*RM+1
906     elif TYPD==2 :
907 #     cas ou la borne droite de la zone precedente etait un centre
908       MING = MIND
909       TYPG = TYPD
910       NUMG = NUMD
911       MIND = TAMPON[j-1][0]
912       if fmod(IABSC2[j-1],2):
913         TYPD = 0
914         NUMD = IABSC1[IABSC2[j-1]/2]
915       else:
916         TYPD = 1
917         NUMD = IABSC1[IABSC2[j-1]/2-1]
918       j=j-1
919     else:
920       if j>= 2*NBSEP :
921         MIND = TAMPON[2*NBSEP-1][0]
922         MING = MIND
923         if fmod(IABSC2[2*NBSEP-1],2):
924           TYPG = 0
925           NUMG = IABSC1[IABSC2[2*NBSEP-1]/2]
926         else:
927           TYPG = 1
928           NUMG = IABSC1[IABSC2[2*NBSEP-1]/2-1]
929         TYPD=TYPG
930         NUMD=NUMG
931       else:
932         MING=TAMPON[j-1][0]
933         MIND=TAMPON[j][0]
934         if fmod(IABSC2[j-1],2):
935           TYPG = 0
936           NUMG = IABSC1[IABSC2[j-1]/2]
937         else:
938           TYPG = 1
939           NUMG = IABSC1[IABSC2[j-1]/2-1]
940         if fmod(IABSC2[j],2):
941           TYPD = 0
942           NUMD = IABSC1[IABSC2[j]/2]
943         else:
944           TYPD = 1
945           NUMD = IABSC1[IABSC2[j]/2-1]
946     if fabs(MING-MIND)<EPSI : 
947       if j==2*NBSEP:break
948       else:continue
949     if j>2*NBSEP and ICE>=NBSEP: 
950         break #on sort de la boucle
951
952     while go20:
953       i=ICE
954       if i<=NBSEP:
955 #       recherche des centres a intercaler
956         INDC=IABSC1[i-1]
957         if i>1:
958 #         le centre est deja le meme que precedent
959           if fabs(MCL_SOUS_EPAIS[INDC-1].ISCP-MCL_SOUS_EPAIS[IABSC1[i-2]-1].ISCP) < EPSI :
960             ICE=ICE+1
961             continue
962         if MCL_SOUS_EPAIS[INDC-1].ISCP < MING :
963 #          le centre est la nouvelle borne gauche
964            j=j-1
965            MIND = MING
966            TYPD = TYPG
967            NUMD = NUMG
968            MING = MCL_SOUS_EPAIS[INDC-1].ISCP
969            TYPG = 2
970            NUMG = INDC
971            ICE = ICE+1
972         elif MCL_SOUS_EPAIS[INDC-1].ISCP < MIND : 
973 #          le centre est la nouvelle borne droite  
974            MIND = MCL_SOUS_EPAIS[INDC-1].ISCP
975            TYPD = 2
976            NUMD = INDC
977            ICE = ICE+1
978            continue
979         else:pass
980       NZONEX=NZONEX+1
981 #    
982 #     codes d'intervalles de zones
983 #        0 0 = zone sous-ep.
984 #        0 1 = sous-ep. a droite de la zone
985 #        1 0 = sous-ep. a gauche de la zone
986 #        1 1 = sous-ep. a droite et a gauche de la zone  
987 #
988 #     cas ou la premiere zone ne commence pas au bord de la plaque
989       if MING>0. and NZONEX==1 :
990         BG.append(0.)
991         BD.append(MING)
992         if TYPG==0:
993            INDBG.append(0)
994            INDBD.append(1)
995            DNX.append(DERAFC)
996            DNX.append(0)
997            INDSEX.append(0)
998         elif TYPG==1 or TYPG==2:
999            INDBG.append(0)
1000            INDBD.append(0)
1001            DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
1002            DNX.append(0)
1003            INDSEX.append(NUMG)
1004         else: pass
1005         NZONEX=NZONEX+1
1006 #
1007       BG.append(MING)
1008       BD.append(MIND)  
1009 #
1010       if TYPG == 0:
1011 #       borne gauche zone = borne gauche ssep       
1012         NBGAU=NBGAU+1
1013         INDBG.append(0)
1014         INDBD.append(0)
1015         if TYPD == 0:
1016 #         borne droite zone = borne gauche ssep
1017           DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
1018           DNX.append(0)
1019           INDSEX.append(NUMG)
1020         elif TYPD == 1 or TYPD == 2:
1021 #         borne droite zone = borne droite ssep : TYPD=1
1022 #         borne droite zone = centre ssep : TYPD=2
1023           LTMP=[]
1024           LTMP.append((MCL_SOUS_EPAIS[NUMG-1].IDENC,NUMG))
1025           LTMP.append((MCL_SOUS_EPAIS[NUMD-1].IDENC,NUMD))
1026           LTMP.sort()
1027           DNX.append(LTMP[0][0])
1028           DNX.append(0)
1029           INDSEX.append(LTMP[0][1])
1030         else: pass
1031 #
1032       elif TYPG == 1:
1033 #       borne gauche zone = borne droite ssep  
1034         NBDRO = NBDRO+1  
1035         if TYPD == 0:
1036 #         borne droite zone = borne gauche ssep
1037           if NBDRO==NBGAU:
1038             INDBG.append(1)
1039             INDBD.append(1)
1040             DNX.append(DERAFC)
1041             DNX.append(0)
1042             INDSEX.append(0)
1043           else:
1044 #           cas tordu: une sous-ep enveloppe le tout
1045             INDBG.append(0)
1046             INDBD.append(0)
1047             DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
1048             DNX.append(0)    
1049             INDSEX.append(NUMG)
1050         elif TYPD == 1 or TYPD == 2:
1051 #         borne droite zone = borne droite ssep : TYPD=1
1052 #         borne droite zone = centre ssep : TYPD=2
1053           INDBG.append(0)
1054           INDBD.append(0)
1055           DNX.append(MCL_SOUS_EPAIS[NUMD-1].IDENC)
1056           DNX.append(0)
1057           INDSEX.append(NUMD)  
1058         else: pass
1059 #                
1060       elif TYPG == 2:
1061 #       borne gauche zone = centre ssep  
1062         INDBG.append(0)
1063         INDBD.append(0)
1064         if TYPD == 0:
1065 #         borne droite zone = borne gauche ssep
1066           DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
1067           DNX.append(0)
1068           INDSEX.append(NUMG)  
1069         elif TYPD == 1 or TYPD == 2:
1070 #         borne droite zone = borne droite ssep : TYPD=1
1071 #         borne droite zone = centre ssep : TYPD=2
1072           LTMP=[]
1073           LTMP.append((MCL_SOUS_EPAIS[NUMG-1].IDENC,NUMG))
1074           LTMP.append((MCL_SOUS_EPAIS[NUMD-1].IDENC,NUMD))
1075           LTMP.sort()
1076           DNX.append(LTMP[0][0])
1077           DNX.append(0)
1078           INDSEX.append(LTMP[0][1])
1079         else:pass
1080       else:pass
1081       if j<=(2*NBSEP-2) or ICE<=NBSEP or (TYPD==2 and j<2*NBSEP):
1082          iout=0       
1083          break #on retourne dans la boucle go10
1084       else :
1085          iout=1
1086          break #on sort definitivement 
1087     if iout:break
1088       
1089   if MIND<2.*pi*RM:
1090     NZONEX=NZONEX+1
1091     BG.append(MIND)
1092     BD.append(2.*pi*RM)
1093     if TYPD==0 or TYPD==2:
1094       INDBG.append(0)
1095       INDBD.append(0)
1096       DNX.append(MCL_SOUS_EPAIS[NUMD-1].IDENC)
1097       DNX.append(0)
1098       INDSEX.append(NUMD)
1099     elif TYPD==1:
1100       INDBG.append(1)
1101       INDBD.append(0)
1102       DNX.append(DERAFC)
1103       DNX.append(0)
1104       INDSEX.append(0)
1105     else:pass
1106
1107 # au cas ou 2.*pi*RM correspond a une borne d'intevalle de sous-ep ou a
1108 #  un centre de sous-ep.
1109   if fabs(BG[NZONEX-1]-BD[NZONEX-1])<EPSI: NZONEX = NZONEX-1
1110
1111   print
1112   print 'ZONES APRES RECOUVREMENT ABSC. CURV. CIRCONF. :'
1113   print '-----------------------------------------------'
1114   for j in range(NZONEX) :
1115     if INDBG[j]==0 and INDBD[j]==0 :
1116       print 'ZONE NO',j+1,'<> BORNE GAUCHE = %.2f'\
1117       ' / BORNE DROITE = %.2f * SOUS-EPAISSEUR'%(BG[j],BD[j])
1118     else:
1119       print 'ZONE NO',j+1,'<> BORNE GAUCHE = %.2f'\
1120       ' / BORNE DROITE = %.2f'%(BG[j],BD[j])
1121
1122       
1123 # --- tri des donnees sous-ep. en axial
1124   TAMPON,IORDO1,IORDO2,COORYI,COORYS=ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM)
1125
1126   BI     = []
1127   BS     = []
1128   INDBI  = []
1129   INDBS  = []
1130   DNY    = []
1131   INDSEY = []
1132
1133   if SYME == 'DEMI':
1134 #   calcul des zones en axial :
1135 #   zones  (0,bord inferieur) et (bord inferieur,centre sous-ep.) 
1136     ssep   = MCL_SOUS_EPAIS[0]
1137     BI.append(0.)
1138     BI.append(ssep.ISLP-ssep.ILONP/2.)
1139     BS.append(ssep.ISLP-ssep.ILONP/2.)
1140     BS.append(ssep.ISLP)
1141     INDBI.append(0)  
1142     INDBI.append(0)
1143     INDBS.append(1)
1144     INDBS.append(0)
1145     DNY.append(DERAFL)
1146     DNY.append(0)
1147     DNY.append(ssep.IDENL)
1148     DNY.append(0)
1149     INDSEY.append(0)
1150     INDSEY.append(1)
1151     NZONEY=1
1152 #     
1153   else:
1154 #
1155 #   calcul des recouvrements de zones en axial  
1156     j = 0
1157     ICE = 1
1158     NBINF = 0
1159     NBSUP = 0
1160     TYPI=0
1161     TYPS=0
1162     go40=1
1163     go50=1
1164     NZONEY=0
1165 #
1166     while go40:
1167       j=j+1      
1168 #
1169 #     definition de la zone courante (borne inf, borne sup)
1170 #
1171 #     typi = type de la borne
1172 #            0 : borne inf. sous-ep.
1173 #            1 : borne sup. sous-ep.
1174 #            2 : centre sous-ep.   
1175 #
1176       if TYPS==2:
1177 #       cas ou la borne sup. de la zone prec. etait un centre
1178         MINI=MINS
1179         TYPI=TYPS
1180         NUMI=NUMS
1181         MINS=TAMPON[j-1][0]
1182         if fmod(IORDO2[j-1],2):
1183           TYPS = 0
1184           NUMS = IORDO1[IORDO2[j-1]/2]
1185         else:
1186           TYPS = 1
1187           NUMS = IORDO1[IORDO2[j-1]/2-1]
1188         j=j-1
1189       else:
1190         if j>= 2*NBSEP :
1191           MINI = TAMPON[2*NBSEP-1][0]
1192           MINS = MINI
1193           if fmod(IORDO2[2*NBSEP-1],2):
1194             TYPI = 0
1195             NUMI = IORDO1[IORDO2[2*NBSEP-1]/2]
1196           else:
1197             TYPI = 1
1198             NUMI = IORDO1[IORDO2[2*NBSEP-1]/2-1]
1199           TYPS=TYPI
1200           NUMS=NUMI
1201         else:
1202           MINI=TAMPON[j-1][0]
1203           MINS=TAMPON[j][0]
1204           if fmod(IORDO2[j-1],2):
1205             TYPI = 0
1206             NUMI = IORDO1[IORDO2[j-1]/2]
1207           else:
1208             TYPI = 1
1209             NUMI = IORDO1[IORDO2[j-1]/2-1]
1210           if fmod(IORDO2[j],2):
1211             TYPS = 0
1212             NUMS = IORDO1[IORDO2[j]/2]
1213           else:
1214             TYPS = 1
1215             NUMS = IORDO1[IORDO2[j]/2-1]
1216       if fabs(MINI-MINS)<EPSI:
1217         if j==2*NBSEP:break
1218         else:continue
1219
1220       while go50:
1221         i=ICE
1222         if i<=NBSEP:
1223 #         recherche des centres a intercaler
1224           INDC=IORDO1[i-1]
1225           if i>1:
1226 #           le centre est deja le meme que le precedent
1227             if fabs(MCL_SOUS_EPAIS[INDC-1].ISLP-MCL_SOUS_EPAIS[IORDO1[i-2]-1].ISLP)<EPSI:
1228              ICE=ICE+1  
1229              continue
1230           if MCL_SOUS_EPAIS[INDC-1].ISLP<MINI:
1231 #            le centre est la nouvelle borne inf.
1232              j=j-1
1233              MINS = MINI
1234              TYPS = TYPI
1235              NUMS = NUMI
1236              MINI = MCL_SOUS_EPAIS[INDC-1].ISLP
1237              TYPI = 2
1238              NUMI = INDC
1239              ICE = ICE+1
1240           elif MCL_SOUS_EPAIS[INDC-1].ISLP<MINS:
1241 #            le centre est la nouvelle borne sup.
1242             MINS = MCL_SOUS_EPAIS[INDC-1].ISLP
1243             TYPS = 2
1244             NUMS = INDC
1245             ICE = ICE+1
1246             continue
1247           else:pass
1248         NZONEY=NZONEY+1
1249 #       
1250 #       code d'intervalles de zone
1251 #       0 0  = ZONE SOUS-EPAISSEUR
1252 #       0 1  = SOUS-EPAISSEUR A SUPERIEURE DE LA ZONE
1253 #       1 0  = SOUS-EPAISSEUR A INFERIEURE DE LA ZONE
1254 #       1 1  = SOUS EPAISSEUR A SUPERIEURE ET A INFERIEURE DE LA ZONE
1255 #
1256 #       cas ou la premiere zone ne commence pas au bord de la plaque
1257         if MINI>0. and NZONEY==1:
1258           first=0
1259           BI.append(0.)
1260           BS.append(MINI)
1261           if TYPI==0:
1262             INDBI.append(0)
1263             INDBS.append(1)
1264             DNY.append(DERAFL)
1265             DNY.append(0)
1266             INDSEY.append(0)
1267           elif TYPI==1 or TYPI==2:
1268             INDBI.append(0)
1269             INDBS.append(0)
1270             DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
1271             DNY.append(0)
1272             INDSEY.append(NUMI)
1273           else:pass
1274           NZONEY = NZONEY+1
1275 #
1276         BI.append(MINI)
1277         BS.append(MINS)
1278
1279         if TYPI==0:
1280 #         borne inferieure zone = borne inferieure ssep
1281           NBINF = NBINF+1
1282           INDBI.append(0)
1283           INDBS.append(0)
1284           if TYPS==0:
1285 #           borne superieure zone = borne inferieur ssep
1286             DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
1287             DNY.append(0)
1288             INDSEY.append(NUMI)
1289           elif TYPS==1 or TYPS==2:
1290 #           borne superieure zone = borne superieure ssep:TYPS==1
1291 #           borne superieure zone = centre ssep:TYPS==2
1292             LTMP=[]
1293             LTMP.append((MCL_SOUS_EPAIS[NUMI-1].IDENL,NUMI))
1294             LTMP.append((MCL_SOUS_EPAIS[NUMS-1].IDENL,NUMS))
1295             LTMP.sort()
1296             DNY.append(LTMP[0][0])
1297             DNY.append(0)
1298             INDSEY.append(LTMP[0][1])
1299           else:pass
1300         elif TYPI==1:  
1301 #         borne inferieure zone=borne superieure ssep
1302           NBSUP = NBSUP+1
1303           if TYPS==0:
1304 #           borne superieure zone = borne inferieur ssep
1305             if NBSUP==NBINF:
1306               INDBI.append(1)
1307               INDBS.append(1)        
1308               DNY.append(DERAFL)
1309               DNY.append(0)
1310               INDSEY.append(0)
1311             else:
1312 #             cas tordu: une sous-ep. enveloppe le tout
1313               INDBI.append(0)
1314               INDBS.append(0)        
1315               DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
1316               DNY.append(0)
1317               INDSEY.append(NUMI)
1318           elif TYPS==1 or TYPS==2:
1319 #           borne superieure zone = borne superieure ssep:TYPS==1
1320 #           borne superieure zone = centre ssep:TYPS==2
1321             INDBI.append(0)
1322             INDBS.append(0)        
1323             DNY.append(MCL_SOUS_EPAIS[NUMS-1].IDENL)
1324             DNY.append(0)
1325             INDSEY.append(NUMS)
1326           else:pass
1327         elif TYPI==2:
1328 #         borne inferieure zone = centre ssep  
1329           INDBI.append(0)
1330           INDBS.append(0)        
1331           if TYPS==0:
1332 #           borne superieure zone = borne inferieure ssep
1333             DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
1334             DNY.append(0)
1335             INDSEY.append(NUMI)
1336           elif TYPS==1 or TYPS==2:
1337 #           borne superieure zone = borne superieure ssep
1338             LTMP=[]
1339             LTMP.append((MCL_SOUS_EPAIS[NUMI-1].IDENL,NUMI))
1340             LTMP.append((MCL_SOUS_EPAIS[NUMS-1].IDENL,NUMS))
1341             LTMP.sort()
1342             DNY.append(LTMP[0][0])
1343             DNY.append(0)
1344             INDSEY.append(LTMP[0][1])
1345           else:pass
1346         else:pass
1347         if j<=(2*NBSEP-2) or TYPS==2:
1348           iout=0  
1349           break #on retourne dans la boucle go40
1350         else:
1351           iout=1
1352           break #on sort definitivement 
1353       if iout:break
1354
1355 #   cas ou la derniere zone ne finit pas au bout de la plaque    
1356     if MINS<ALPHAR*RC:
1357        NZONEY=NZONEY+1
1358        BI.append(MINS)
1359        BS.append(ALPHAR*RC) 
1360        if TYPS==0 or TYPS==2:
1361           INDBI.append(0)
1362           INDBS.append(0)        
1363           DNY.append(MCL_SOUS_EPAIS[NUMS-1].IDENL)
1364           DNY.append(0)
1365           INDSEY.append(NUMS)
1366        elif TYPS==1:
1367           INDBI.append(1)
1368           INDBS.append(0)        
1369           DNY.append(DERAFL)
1370           DNY.append(0)
1371           INDSEY.append(0)
1372        else:pass
1373
1374     print
1375     print 'ZONES APRES RECOUVREMENT ABSC. CURV. LONGIT. :'
1376     print '-----------------------------------------------'
1377
1378     for j in range(NZONEY) :
1379       if INDBI[j]==0 and INDBS[j]==0 :
1380         print 'ZONE NO',j+1,'<> BORNE INF. = %.2f'\
1381         ' / BORNE SUP. = %.2f * SOUS-EPAISSEUR'%(BI[j],BS[j])
1382       else:
1383         print 'ZONE NO',j+1,'<> BORNE INF. = %.2f'\
1384         ' / BORNE SUP. = %.2f '%(BI[j],BS[j])
1385
1386 #   calcul du nombre d'elements longi. et circonf. dans les sous-ep
1387     NLX,NLY=ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI,
1388                    DNX,DNY,RM,RC,INDSEX,INDSEY,IABSC1,IORDO1)
1389   
1390
1391   return ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY
1392 ################################################################################
1393 ################################################################################
1394 ################################################################################
1395 #     MACR_ASCOUF_MAIL   write_file_dgib_ASCFDO
1396 #
1397 #     ECRIT DANS UN FICHIER LES DONNES GIBI DE LA PROCEDURE 
1398 #     "PLAQUE FISSUREE"
1399 #
1400
1401 def write_file_dgib_ASCFDO(nomFichierDATG,RM,RC,ALPHA,NBTRAN,EP1,EP2,EPI,TETA1,
1402                            TETA2,LTRAN,SUREP,LTCHAR,LTCLIM,TYPBOL,AXEAP,AXECP,NT,NS,NC,
1403                            SFP,ORIEN,AZIM,RC0,RC2,RC3,POSIT,EPSI,NIVMAG,SYME, loc_datg) :
1404
1405   if TYPBOL!= None:
1406      if TYPBOL=='CUVE'     : TYPEMB = 'typcuv' 
1407      if TYPBOL=='GV'       : TYPEMB = 'typegv' 
1408      if TYPBOL=='ASP_MPP'  : TYPEMB = 'typapp' 
1409   else: 
1410      TYPEMB ='      '
1411    
1412   if POSIT =='DEB_INT'  :
1413          POSIT2 = 'interne'
1414   else:
1415          POSIT2 = 'externe'
1416   if   SYME[:6]=='ENTIER' : ZSYME = 'entier'
1417   elif SYME[:5]=='QUART'  : ZSYME = 'quart'
1418   else :                    ZSYME = 'demi'
1419   C=AXECP/2.
1420   TETAF=AZIM*pi/180.
1421
1422   POIVIR = ' ;\n'
1423   texte='* DEBUT PARAMETRES UTILISATEUR\n'
1424   texte=texte+'*\n'
1425   texte=texte+'c        = '+str(C)            +POIVIR
1426   texte=texte+'a        = '+str(AXEAP)        +POIVIR
1427   texte=texte+'nt       = '+str(NT)           +POIVIR
1428   texte=texte+'ns       = '+str(NS)           +POIVIR
1429   texte=texte+'nc       = '+str(NC)           +POIVIR
1430   texte=texte+'rm       = '+str(RM)           +POIVIR
1431   texte=texte+'rc       = '+str(RC)           +POIVIR
1432   texte=texte+'alphac   = '+str(ALPHA)        +POIVIR
1433   texte=texte+'nbtranep = '+str(NBTRAN)       +POIVIR
1434   texte=texte+'ep1      = '+str(EP1)          +POIVIR
1435   texte=texte+'ep2      = '+str(EP2)          +POIVIR
1436   texte=texte+'epi      = '+str(EPI)          +POIVIR
1437   texte=texte+'teta1    = '+str(TETA1)        +POIVIR
1438   texte=texte+'teta2    = '+str(TETA2)        +POIVIR
1439   texte=texte+'ltran    = '+str(LTRAN)        +POIVIR
1440   texte=texte+'posfis   = '+str(SFP)          +POIVIR
1441   texte=texte+'ksiref   = '+str(ORIEN)        +POIVIR
1442   texte=texte+'surep    = '+str(SUREP)        +POIVIR       
1443   texte=texte+'teta_f   = '+str(TETAF)        +POIVIR
1444   texte=texte+'rc0      = '+str(RC0)          +POIVIR
1445   texte=texte+'rc2      = '+str(RC2)          +POIVIR
1446   texte=texte+'rc3      = '+str(RC3)          +POIVIR
1447   texte=texte+"pos      = '"+POSIT2+"'"       +POIVIR
1448   texte=texte+'lt       = '+str(LTCHAR)       +POIVIR
1449   texte=texte+'lgv      = '+str(LTCLIM)       +POIVIR
1450   texte=texte+"typembou = '"+TYPEMB+"'"       +POIVIR
1451   texte=texte+"zsyme    = '"+ZSYME+"'"        +POIVIR
1452   texte=texte+'epsif    = '+str(EPSI)         +POIVIR
1453   texte=texte+'nivmag   = '+str(NIVMAG)       +POIVIR
1454   texte=texte+'*\n'
1455   texte=texte+'* FIN PARAMETRES UTILISATEUR\n'
1456   texte=texte+'opti donn '
1457   texte=texte+"'"+loc_datg+'ascouf_fiss_v4.datg'+"';\n"
1458   fdgib=open(nomFichierDATG,'w')
1459   fdgib.write(texte)
1460   fdgib.close()
1461
1462 ################################################################################
1463 ################################################################################
1464 ################################################################################
1465 #     MACR_ASCOUF_MAIL   write_file_dgib_ASCSQO
1466 #
1467 #     ECRIT DANS UN FICHIER LES DONNEES GIBI DE LA PROCEDURE 
1468 #     "PLAQUE SOUS-EPAISSEUR"
1469 #
1470 #-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
1471 #
1472 #     RM    = RAYON MOYEN DU COUDE
1473 #     RC    = RAYON DE CINTRAGE DU COUDE
1474 #     ALPHA = ANGLE DU COUDE
1475 #     NBTRAN = NOMBRE DE TRANSITION D'EPAISSEUR (0, 1 OU 2)
1476 #     EP1   = EPAISSEUR DU COUDE (COTE EMBOUT 1 SI TRANSITION)
1477 #     EP2   = EPAISSEUR DU COUDE (COTE EMBOUT 2 SI TRANSITION)
1478 #     EPI   = EPAISSEUR DU COUDE INTERMEDIAIRE SI TRANSITION A 2 PENTES
1479 #     TETA1  = ANGLE DE LA PREMIERE TRANSITION D'EPAISSEUR EVENTUELLE
1480 #     TETA2  = ANGLE DE LA DEUXIEME TRANSITION D'EPAISSEUR EVENTUELLE
1481 #     LTRAN  = LONGUEUR ENTRE FIN DE L'EMBOUT 1 ET DEBUT DE TRANSITION
1482 #     LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT
1483 #     LCLIM  = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES
1484 #     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)  
1485 #     SYME = "QUART" DE STRUCTURE, "DEMI" STRUCTURE OU BIEN "ENTIER"
1486 #     NBEP = NOMBRE D'ELEMENTS DANS LE COUDE
1487 #     NLX = NOMBRE D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR
1488 #     NLY = NOMBRE D'ELEMENTS LONGI DE LA SOUS-EPAISSEUR
1489
1490 def write_file_dgib_ASCSQO(nomFichierDATG,TYPELE,RM,RC,ALPHA,NBTRAN,EP1,EP2,
1491                            EPI,TETA1,MCL_SOUS_EPAIS,TETA2,LTRAN,LTCHAR,LTCLIM,GEOM,
1492                            SYME,NBEP,NLX,NLY,NIVMAG,loc_datg) :
1493
1494   ssep= MCL_SOUS_EPAIS[0]   
1495   POIVIR = ' ;\n'
1496   texte=' nivmag   = '+str(NIVMAG)       +POIVIR
1497   texte=texte+' option dime 3 elem '+TYPELE+' nive nivmag echo 0'+POIVIR
1498   texte=texte+'*\n'
1499   texte=texte+'coory   = table '+POIVIR
1500   texte=texte+'coorz   = table '+POIVIR
1501   texte=texte+'prof    = table '+POIVIR
1502   texte=texte+'posit   = table '+POIVIR
1503   texte=texte+'axisym  = table '+POIVIR
1504   texte=texte+'axecir  = table '+POIVIR
1505   texte=texte+'axelon  = table '+POIVIR
1506   texte=texte+'sousep  = table '+POIVIR
1507   texte=texte+'coorzc  = table '+POIVIR
1508   texte=texte+'axelonc = table '+POIVIR
1509   texte=texte+'*\n'
1510   texte=texte+'* DEBUT PARAMETRES UTILISATEUR\n'
1511   texte=texte+'*\n'
1512   texte=texte+'* parametres generaux\n'
1513   texte=texte+'*\n'
1514   texte=texte+' pirad    = '+str(pi)            +POIVIR
1515   texte=texte+' rm       = '+str(RM)           +POIVIR
1516   texte=texte+' rc       = '+str(RC)           +POIVIR
1517   texte=texte+' alpha    = '+str(ALPHA)        +POIVIR
1518   texte=texte+' lt1      = '+str(LTCHAR)       +POIVIR
1519   texte=texte+' lt2      = '+str(LTCLIM)       +POIVIR
1520   texte=texte+' nbtranep = '+str(NBTRAN)       +POIVIR
1521   texte=texte+' ep1      = '+str(EP1)          +POIVIR
1522   texte=texte+' ep2      = '+str(EP2)          +POIVIR
1523   texte=texte+' epI      = '+str(EPI)          +POIVIR
1524   texte=texte+' teta1    = '+str(TETA1)        +POIVIR
1525   texte=texte+' teta2    = '+str(TETA2)        +POIVIR
1526   texte=texte+' ltran    = '+repr(LTRAN)        +POIVIR 
1527   if GEOM == 'COUDE':
1528     texte=texte+" zcoude = 'oui' "+POIVIR
1529   else:
1530     texte=texte+" zcoude = 'non' "+POIVIR
1531   if SYME == 'ENTIER':
1532     texte=texte+" zsyme = 'entier' "+POIVIR
1533   elif SYME == 'QUART':
1534     texte=texte+" zsyme = 'quart' "+POIVIR
1535   else:
1536     texte=texte+" zsyme = 'demi' "+POIVIR
1537   if TYPELE == 'CU20':
1538     texte=texte+" zquad = 'oui' "+POIVIR
1539   else:
1540     texte=texte+" zquad = 'non' "+POIVIR
1541   SCP=pi*RM
1542   texte=texte+' nxep   = '+str(NBEP)        +POIVIR
1543   texte=texte+'*\n'
1544   texte=texte+'* Caracteristiques de la sous-epaisseur\n'
1545   texte=texte+'*\n'
1546   texte=texte+' tysep = '+str(ssep.ICIRP)                                   +POIVIR
1547   texte=texte+' tzsep = '+str(ssep.ILONP)                                   +POIVIR
1548   texte=texte+' prof .                      1  = '+str(ssep['PROFONDEUR'])  +POIVIR
1549   texte=texte+' ycsep = '+str(SCP-pi*RM)                                    +POIVIR
1550   texte=texte+' theta = '+str(ssep.IPHIC)                                   +POIVIR
1551   texte=texte+' zcsep = '+repr(ssep.ISLP)                                    +POIVIR
1552
1553   texte=texte+" posit .                      1  = '"+str(ssep['SOUS_EPAIS'].lower())+"'"+POIVIR
1554   texte=texte+' nby   = '+str(int(NLX[0]))                                  +POIVIR
1555   texte=texte+' nbz   = '+str(int(NLY[0]))                                  +POIVIR
1556   texte=texte+' nbxse = '+str(ssep['NB_ELEM_RADI'])                         +POIVIR
1557   texte=texte+' axelonc .                      1  = '+str(ssep['AXE_LONGI'])+POIVIR
1558   if ssep['POSI_CURV_LONGI']!=None:
1559     texte=texte+' coorzc .                      1  = '+repr(ssep['POSI_CURV_LONGI'])+POIVIR
1560   else:
1561     DZC=ssep.BETA*pi*(RC+(RM+EP1/2.)*cos(pi/2.))/180.
1562     texte=texte+' coorzc .                      1  = '+repr(DZC)+POIVIR
1563   if ssep['TYPE']=='AXIS':
1564      texte=texte+" zaxis = 'oui' "+POIVIR
1565   else:
1566      texte=texte+" zaxis = 'non' "+POIVIR
1567   if ssep['EMPREINTE'] == 'OUI':
1568      texte=texte+" sousep .                      1  = 'oui'"+POIVIR
1569   else:
1570      texte=texte+" sousep .                      1  = 'non'"+POIVIR
1571   texte=texte+'*\n'
1572   texte=texte+'* FIN PARAMETRES UTILISATEUR \n'
1573   texte=texte+'opti donn '
1574   texte=texte+"'"+loc_datg+'ascouf_ssep_mono_v1.datg'+"'"+POIVIR
1575   fdgib=open(nomFichierDATG,'w')
1576   fdgib.write(texte)
1577   fdgib.close()
1578 ################################################################################
1579 ################################################################################
1580 ################################################################################
1581 #     MACR_ASCOUF_MAIL   write_subpart_file_pgib_POST
1582 #
1583 #     APPELEE DANS : write_file_pgib_ASCSQ2 , write_file_pgib_ASCSD2
1584 #     DEFINIE UNE CHAINE DE CARACTERES UTILISEE LORS DE L'ECRITURE DU
1585 #     FICHIER GIBI DE POST-TRAITEMENTS
1586 #
1587 #-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
1588 #
1589 #     NLX = NOMBRE D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR
1590 #     NLY = NOMBRE D'ELEMENTS LONGI DE LA SOUS-EPAISSEUR
1591 #
1592 #-----------------DONNEE RENVOYEE PAR ASTER-------------------- 
1593
1594 #     texte = chaine de caracteres contenant des instructions gibi
1595 #             de post-traitements
1596 #
1597 def write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY):
1598   CAR3 = ('fdro','exdr','extr','exga','fgau','inga','intr','indr')
1599   
1600   POIVIR = ' ;\n'
1601   texte='* DEBUT POINTS DE POST-TRAITEMENT\n'
1602   texte=texte+'*\n'
1603   issep=0
1604   for ssep in MCL_SOUS_EPAIS:
1605     issep=issep+1
1606     texte=texte+'*\n'
1607     texte=texte+'* sous-epaisseur No '+str( issep)+'\n'
1608     texte=texte+'*\n'
1609     if ssep['TYPE'] == 'ELLI':
1610       texte=texte+'*\n'
1611       texte=texte+'* plans circonf longi et colonne centrale \n'
1612       texte=texte+'*\n'
1613       texte=texte+'pcirc'+str( issep)+' = circo .'+str(issep).rjust(4)+POIVIR
1614       texte=texte+'plong'+str( issep)+' = longi .'+str(issep).rjust(4)+POIVIR
1615       texte=texte+'pcent'+str( issep)+' = centr .'+str(issep).rjust(4)+POIVIR
1616     texte=texte+'*\n'
1617     texte=texte+'* ligaments tous les 45 degres a epaisseur minimale \n'
1618     texte=texte+'*\n'
1619     texte=texte+'isep = '+str( issep)+POIVIR
1620     for k in range(8):
1621       texte=texte+'ilig = '+str(k+1)+POIVIR
1622       texte=texte+'rlig = ilig/10. + isep'+POIVIR
1623       texte=texte+str(CAR3[k])+str( issep)+' = lig45 . rlig'+POIVIR
1624     if ssep['TYPE'] == 'ELLI':
1625       texte=texte+'*\n'
1626       texte=texte+"* ligaments circonferentiels a l'epaisseur minimale\n"
1627       texte=texte+'*\n'
1628       texte=texte+'isep = '+str(issep)+POIVIR
1629       for k in range(2*NLX[issep-1]+1):
1630         texte=texte+'ilig = '+str(k+1)+POIVIR
1631         texte=texte+'rlig = ilig/100. + isep'+POIVIR
1632         texte=texte+'cir'+str(issep)+'_'+str(k+1)+' = ligcir . rlig'+POIVIR
1633       texte=texte+'*\n'
1634       texte=texte+"* ligaments longitudinaux a l'epaisseur minimale\n"                        
1635       texte=texte+'* \n'
1636       for k in range(2*NLY[issep-1]+1):
1637         texte=texte+'ilig = '+str(k+1)+POIVIR
1638         texte=texte+'rlig = ilig/100. + isep'+POIVIR
1639         texte=texte+'lon'+str(issep)+'_'+str(k+1)+' = liglon . rlig'+POIVIR
1640   texte=texte+'* FIN POINTS DE POST-TRAITEMENT\n'
1641   return texte
1642
1643 ################################################################################
1644 ################################################################################
1645 ################################################################################
1646 #     MACR_ASCOUF_MAIL   write_file_pgib_ASCSQ2
1647 #
1648 #     ECRIT DANS UN FICHIER  LES DONNEES GIBI DE LA PROCEDURE
1649 #     "PLAQUE SOUS-EPAISSEURS"
1650 #     IL S'AGIT DE LA DEUXIEME PARTIE ( APRES LES DONNEES UTILISATEUR )
1651 #
1652 #
1653 #-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
1654 #
1655 #     NLX = NOMBRE TOTAL D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR K
1656 #     NLY = NOMBRE TOTAL D'ELEMENTS LONGIT. DE LA SOUS-EPAISSEUR K
1657
1658 def write_file_pgib_ASCSQ2(MCL_SOUS_EPAIS,NLX,NLY):
1659   POIVIR = ' ;\n'
1660   texte=write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY)
1661   texte=texte+'*\n'
1662   texte=texte+'p1 = 0. 0. (-1.*lt1)'+POIVIR
1663   texte=texte+'p2 = 0. 0. (coor 3 bou3)'+POIVIR
1664   texte=texte+'ma = coude et p1 et p2'+POIVIR
1665   texte=texte+"opti sauv form 'fort.8'"+POIVIR
1666   texte=texte+'sort ma'+POIVIR
1667   texte=texte+'sauv form ma'+POIVIR
1668   texte=texte+'fin'+POIVIR
1669   fpgib=open('fort.71','w')
1670   fpgib.write(texte)
1671   fpgib.close()
1672
1673 ################################################################################
1674 ################################################################################
1675 ################################################################################
1676 #     MACR_ASCOUF_MAIL   write_file_pgib_ASCSP1
1677 #
1678 #     ECRIT DANS UN FICHIER  LES DONNEES GIBI DE LA PROCEDURE
1679 #     "PLAQUE SOUS-EPAISSEURS"
1680 #     IL S'AGIT DE LA PREMIERE PARTIE ( AVANT LES DONNEES UTILISATEUR )
1681 #
1682 #
1683 def write_file_dgib_ASCSP1(nomFichierDATG,TYPELE,MCL_SOUS_EPAIS,NIVMAG,loc_datg):
1684
1685   POIVIR = ' ;\n'
1686   texte=' nivmag = '+str(NIVMAG)+POIVIR
1687   texte=texte+' option dime 3 elem '+TYPELE+' nive nivmag echo 0 '+POIVIR
1688   texte=texte+'*\n'
1689   texte=texte+'bg      = table '+POIVIR
1690   texte=texte+'bd      = table '+POIVIR
1691   texte=texte+'bi      = table '+POIVIR
1692   texte=texte+'bs      = table '+POIVIR
1693   texte=texte+'indbg   = table '+POIVIR
1694   texte=texte+'indbd   = table '+POIVIR
1695   texte=texte+'indbi   = table '+POIVIR
1696   texte=texte+'indbs   = table '+POIVIR
1697   texte=texte+'axecir  = table '+POIVIR
1698   texte=texte+'axelon  = table '+POIVIR
1699   texte=texte+'axelonc = table '+POIVIR
1700   texte=texte+'coorzc  = table '+POIVIR
1701   texte=texte+'prof    = table '+POIVIR
1702   texte=texte+'posit   = table '+POIVIR
1703   texte=texte+'coory   = table '+POIVIR
1704   texte=texte+'coorz   = table '+POIVIR   
1705   texte=texte+'deny    = table '+POIVIR
1706   texte=texte+'nbely   = table '+POIVIR
1707   texte=texte+'denz    = table '+POIVIR
1708   texte=texte+'nbelz   = table '+POIVIR
1709   texte=texte+'axisym  = table '+POIVIR
1710   texte=texte+'sousep  = table '+POIVIR
1711   texte=texte+'* \n'     
1712   texte=texte+'opti donn '
1713   texte=texte+"'"+loc_datg+'ascouf_ssep_mult_v1.datg'+"';\n"
1714   fdgib=open(nomFichierDATG,'w')
1715   fdgib.write(texte)
1716   fdgib.close()
1717   
1718 ################################################################################
1719 ################################################################################
1720 ################################################################################
1721 #     MACR_ASCOUF_MAIL   write_file_pgib_ASCSDO
1722 #
1723 #     ECRIT DANS UN FICHIER  LES DONNEES GIBI DE LA PROCEDURE
1724 #     "PLAQUE SOUS-EPAISSEURS"
1725 #
1726 #-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
1727 #
1728 #     RM    = RAYON MOYEN DU COUDE
1729 #     RC    = RAYON DE CINTRAGE DU COUDE
1730 #     ALPHA = ANGLE DU COUDE
1731 #     EP    = EPAISSEUR DU COUDE
1732 #     LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT
1733 #     LCLIM  = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES
1734 #     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)  
1735 #     SYME = QUART DE STRUCTURE SI 'OUI'
1736 #     INDBG = INDICATEUR BORD GAUCHE DE LA ZONE CIRCONF J
1737 #     INDBD = INDICATEUR BORD DROIT DE LA ZONE CIRCONF J
1738 #     BG = ABSCISSE DU BORD GAUCHE DE LA ZONE CIRCONF J
1739 #     BD = ABSCISSE DU BORD DROIT DE LA ZONE CIRCONF J
1740 #     BI = ORDONNEE DU BORD INFERIEUR DE LA ZONE LONGI J
1741 #     BS = ORDONNEE DU BORD SUPERIEUR DE LA ZONE LONGI J
1742 #     INDBI = INDICATEUR BORD INFERIEUR DE LA ZONE LONGI J
1743 #     INDBS = INDICATEUR BORD SUPERIEUR DE LA ZONE LONGI J
1744 #     INDSEX = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE CIRCONF J
1745 #     INDSEY = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE LONGI J
1746 #     DNX = DENSITE ET NOMBRE D'ELEMENTS CIRCONF. DE LA ZONE J
1747 #     DNY = DENSITE ET NOMBRE D'ELEMENTS LONGIT. DE LA ZONE J
1748 #     NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES
1749 #     NZONEY = NOMBRE DE ZONES LONGITUDINALES  
1750 #
1751 def write_file_pgib_ASCSDO(RM,RC,ALPHA,EP,LTCLIM,LTCHAR,NBEP,
1752                            NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,
1753                            DNX,DNY,MCL_SOUS_EPAIS,GEOM,SYME):
1754
1755   POIVIR = ' ;\n'
1756   NY=20
1757   DELTAY=2.*pi*RM/NY
1758
1759   def nint(x):
1760     if 0<ceil(x)-x<=0.5:
1761       return int(ceil(x))
1762     else:
1763       return int(floor(x))
1764
1765 # conversion des densites de raffinement des embout en degres par rapport
1766 # a l'angle du coude
1767   RTMP=nint(LTCHAR/DELTAY)*DELTAY/4.
1768   DENSTU = RTMP*360./(2.*pi*RC)
1769   DENSGV = DENSTU
1770   NZT=0
1771   NZGV=0
1772
1773   texte='* DEBUT PARAMETRES UTILISATEUR \n'
1774   texte=texte+'*\n'
1775   texte=texte+'* parametres generaux\n'
1776   texte=texte+'*\n'
1777   texte=texte+'rm       = '+str(RM)               +POIVIR
1778   texte=texte+'rc       = '+str(RC)               +POIVIR
1779   texte=texte+'alphac   = '+str(ALPHA)            +POIVIR
1780   texte=texte+'epc      = '+str(EP)               +POIVIR
1781   texte=texte+'pirad    = '+str(pi)               +POIVIR
1782   texte=texte+'lgv      = '+str(LTCLIM)           +POIVIR
1783   texte=texte+'lt       = '+str(LTCHAR)           +POIVIR
1784   texte=texte+'lcoude   = '+str(ALPHA*pi/180.*RC) +POIVIR
1785   if GEOM == 'COUDE':
1786     texte=texte+"zcoude = 'oui' "     +POIVIR
1787   else:
1788     texte=texte+"zcoude = 'non' "     +POIVIR
1789   if SYME == 'ENTIER':
1790     texte=texte+"zsyme = 'entier' "   +POIVIR
1791   elif SYME == 'QUART':
1792     texte=texte+"zsyme = 'quart' "    +POIVIR
1793   else:
1794     texte=texte+"zsyme = 'demi' "     +POIVIR
1795   texte=texte+'nxep   = '+str(NBEP)   +POIVIR
1796   texte=texte+'nzt    = '+str(NZT)    +POIVIR
1797   texte=texte+'nzgv   = '+str(NZGV)   +POIVIR
1798   texte=texte+'daxhtu = '+str(DENSTU) +POIVIR
1799   texte=texte+'daxhgv = '+str(DENSGV) +POIVIR
1800   texte=texte+'*\n'
1801   
1802   texte=texte+'* Zones couvertes en circonference\n'
1803   texte=texte+'*\n'
1804   for j in range(NZONEX):
1805     texte=texte+'bg .'   +str(j+1).rjust(23)+' = '+str(BG[j]-pi*RM)     +POIVIR
1806     texte=texte+'bd .'   +str(j+1).rjust(23)+' = '+str(BD[j]-pi*RM)     +POIVIR
1807     texte=texte+'indbg .'+str(j+1).rjust(23)+' = '+str(INDBG[j])        +POIVIR
1808     texte=texte+'indbd .'+str(j+1).rjust(23)+' = '+str(INDBD[j])        +POIVIR
1809     texte=texte+'deny .' +str(j+1).rjust(23)+' = '+str(DNX[2*j])        +POIVIR
1810     texte=texte+'nbely .'+str(j+1).rjust(23)+' = '+str(int(DNX[2*j+1])) +POIVIR
1811     texte=texte+'*\n'
1812     
1813   texte=texte+'* Zones couvertes longitudinalement\n'
1814   texte=texte+'*\n'
1815   for j in range(NZONEY):
1816     texte=texte+'bi .'   +str(j+1).rjust(23)+' = '+str(BI[j])           +POIVIR
1817     texte=texte+'bs .'   +str(j+1).rjust(23)+' = '+str(BS[j])           +POIVIR
1818     texte=texte+'indbi .'+str(j+1).rjust(23)+' = '+str(INDBI[j])        +POIVIR
1819     texte=texte+'indbs .'+str(j+1).rjust(23)+' = '+str(INDBS[j])        +POIVIR
1820     texte=texte+'denz .' +str(j+1).rjust(23)+' = '+str(DNY[2*j])        +POIVIR
1821     texte=texte+'nbelz .'+str(j+1).rjust(23)+' = '+str(int(DNY[2*j+1])) +POIVIR
1822     texte=texte+'*\n'
1823  
1824   texte=texte+'* Caracteristiques des sous-epaisseurs\n'
1825   texte=texte+'*\n'
1826   issep=0
1827   for ssep in MCL_SOUS_EPAIS:
1828      issep=issep+1
1829      texte=texte+'axecir .' +str(issep).rjust(23)+' = '+str(ssep.ICIRP)        +POIVIR
1830      texte=texte+'axelon .' +str(issep).rjust(23)+' = '+str(ssep.ILONP)        +POIVIR
1831      texte=texte+'prof .'   +str(issep).rjust(23)+' = '+str(ssep['PROFONDEUR'])+POIVIR
1832      texte=texte+'coory .'  +str(issep).rjust(23)+' = '+str(ssep.ISCP-pi*RM)   +POIVIR
1833      texte=texte+'coorz .'  +str(issep).rjust(23)+' = '+str(ssep.ISLP)         +POIVIR
1834      texte=texte+'posit .'  +str(issep).rjust(23)+" = '"+str(ssep['SOUS_EPAIS'].lower())+"'"+POIVIR
1835      texte=texte+'axelonc .'+str(issep).rjust(23)+' = '+str(ssep['AXE_LONGI']) +POIVIR
1836      if ssep['POSI_CURV_LONGI']!=None:
1837        texte=texte+'coorzc .'+str(issep).rjust(23)+' = '+str(ssep['POSI_CURV_LONGI'])+POIVIR
1838      else:
1839        DZC=ssep.BETA*pi*(RC+(RM+EP/2.)*cos(pi/2.))/180.
1840        texte=texte+'coorzc .'+str(issep).rjust(23)+' = '+str(DZC)+POIVIR
1841      if ssep['TYPE']=='AXIS':
1842        texte=texte+'axisym .'+str(issep).rjust(23)+" = 'oui'"+POIVIR
1843      else:
1844        texte=texte+'axisym .'+str(issep).rjust(23)+" = 'non'"+POIVIR
1845      if ssep['EMPREINTE'] == 'OUI':
1846        texte=texte+'sousep .'+str(issep).rjust(23)+" = 'oui'"+POIVIR
1847      else:
1848        texte=texte+'sousep .'+str(issep).rjust(23)+" = 'non'"+POIVIR
1849   texte=texte+'* \n'
1850   texte=texte+'* FIN PARAMETRES UTILISATEUR\n'
1851   fpgib=open('fort.71','w') 
1852   fpgib.write(texte)
1853   fpgib.close()
1854   
1855  
1856  
1857 ################################################################################
1858 ################################################################################
1859 ################################################################################
1860
1861 def write_file_pgib_ASCSP2(MCL_SOUS_EPAIS,NLX,NLY):
1862
1863   POIVIR = ' ;\n'
1864   texte='*\n'
1865   texte=texte+'coude extube bord1 clgv  bord2 peauext peauint placoude platube\n'
1866   texte=texte+'plagv  longi  circo centr bou1  bou3  ligmed  ligtub liggv lig45\n'
1867   texte=texte+'ligcir liglon bordtu\n'
1868   texte=texte+'= PLAQSEP bg bd bi bs indbg indbd indbi indbs rm rc\n'
1869   texte=texte+'alphac pirad epc lt lgv coory coorz axecir axelon prof zsyme posit\n'
1870   texte=texte+'lcoude nxep sousep deny nbely denz nbelz axelonc coorzc axisym\n'
1871   texte=texte+'daxhtu daxhgv nzt nzgv zcoude'+POIVIR
1872   texte=texte+'fdromi   = ligmed .   1'+POIVIR
1873   texte=texte+'exdrmi   = ligmed .   2'+POIVIR
1874   texte=texte+'extrmi   = ligmed .   3'+POIVIR
1875   texte=texte+'exgami   = ligmed .   4'+POIVIR
1876   texte=texte+'fgaumi   = ligmed .   5'+POIVIR
1877   texte=texte+'ingami   = ligmed .   6'+POIVIR
1878   texte=texte+'intrmi   = ligmed .   7'+POIVIR
1879   texte=texte+'indrmi   = ligmed .   8'+POIVIR
1880   texte=texte+'fdrotu   = ligtub .   1'+POIVIR
1881   texte=texte+'exdrtu   = ligtub .   2'+POIVIR
1882   texte=texte+'extrtu   = ligtub .   3'+POIVIR
1883   texte=texte+'exgatu   = ligtub .   4'+POIVIR
1884   texte=texte+'fgautu   = ligtub .   5'+POIVIR
1885   texte=texte+'ingatu   = ligtub .   6'+POIVIR
1886   texte=texte+'intrtu   = ligtub .   7'+POIVIR
1887   texte=texte+'indrtu   = ligtub .   8'+POIVIR
1888   texte=texte+"si (ega zsyme 'entier')"+POIVIR
1889   texte=texte+'   fdrogv   = liggv  .  1'+POIVIR
1890   texte=texte+'   exdrgv   = liggv .   2'+POIVIR
1891   texte=texte+'   extrgv   = liggv .   3'+POIVIR
1892   texte=texte+'   exgagv   = liggv .   4'+POIVIR
1893   texte=texte+'   fgaugv   = liggv .   5'+POIVIR
1894   texte=texte+'   ingagv   = liggv .   6'+POIVIR
1895   texte=texte+'   intrgv   = liggv .   7'+POIVIR
1896   texte=texte+'   indrgv   = liggv .   8'+POIVIR
1897   texte=texte+'finsi'+POIVIR
1898   texte=texte+'*\n'
1899   
1900   text2=write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY)
1901   texte=texte+text2
1902   
1903   texte=texte+'*\n'
1904   texte=texte+'*oeil = 10000. 0. 0.' +POIVIR
1905   texte=texte+'*trac oeil cach coude'+POIVIR
1906   texte=texte+'*opti donn 5'         +POIVIR
1907   texte=texte+'p1 = 0. 0. (-1.*lt)'+POIVIR
1908   texte=texte+'p2 = 0. 0. (coor 3 bou3)'+POIVIR
1909   texte=texte+'ma = coude et p1 et p2'+POIVIR
1910   texte=texte+'sort ma'+POIVIR
1911   texte=texte+'neu = nbno ma'+POIVIR
1912   texte=texte+"mess 'nombre de noeuds : 'neu"+POIVIR
1913   texte=texte+"opti sauv form 'fort.8'"+POIVIR
1914   texte=texte+'sauv form ma'+POIVIR
1915   texte=texte+'fin'+POIVIR
1916   fpgib=open('fort.71','a') 
1917   fpgib.write(texte)
1918   fpgib.close()  
1919
1920 ################################################################################
1921 ################################################################################
1922 ################################################################################
1923
1924 def write_file_dgib_ASCRDO(nomFichierDATG,TYPELE,NIVMAG,TYPBOL,ALPHA,RC,RM,EP,SUREP,
1925                            LTCLIM,LTCHAR,NBEP,loc_datg):
1926
1927   NY=20
1928   CZ=ALPHA*RC*pi/180.
1929   NZC=int((ALPHA+0.00001)/5.)
1930   DELTAY=2.*pi*RM/20
1931   DELTAZ=CZ/NZC
1932   DENEXT=int(LTCHAR/DELTAY)*DELTAY/4.
1933   NZT=0
1934   NZGV=0
1935   
1936   if TYPBOL!=None:
1937      if TYPBOL=='CUVE'     : TYPEMB = 'typcuv' 
1938      if TYPBOL=='GV'       : TYPEMB = 'typegv' 
1939      if TYPBOL=='ASP_MPP'  : TYPEMB = 'typapp' 
1940   else: 
1941      TYPEMB ='      '
1942    
1943   POIVIR = ' ;\n'
1944   texte='* DEBUT PARAMETRES UTILISATEUR\n'
1945   texte=texte+'*\n'
1946   texte=texte+'* Parametres generaux\n'
1947   texte=texte+'*\n'
1948   texte=texte+'nivmag   = '+str(NIVMAG)       +POIVIR
1949   texte=texte+'option dime 3 elem '+TYPELE+' nive nivmag echo 0'+POIVIR
1950   texte=texte+'rm       = '+str(RM)           +POIVIR
1951   texte=texte+'rc       = '+str(RC)           +POIVIR
1952   texte=texte+'alphac   = '+str(ALPHA)        +POIVIR
1953   texte=texte+'epc      = '+str(EP)           +POIVIR
1954   texte=texte+'surep    = '+str(SUREP)        +POIVIR       
1955   texte=texte+'lgv      = '+str(LTCLIM)       +POIVIR
1956   texte=texte+'lt       = '+str(LTCHAR)       +POIVIR
1957   texte=texte+"typembou = '"+TYPEMB+"'"       +POIVIR
1958   texte=texte+'nx       = '+str(NBEP)         +POIVIR
1959   texte=texte+'ny       = '+str(NY)           +POIVIR
1960   texte=texte+"pos      = 'bidon'"            +POIVIR
1961   texte=texte+'l1       = 0.'                 +POIVIR
1962   texte=texte+'lbloc    = 0.'                 +POIVIR
1963   texte=texte+'crit     = 0.0001'             +POIVIR
1964   texte=texte+'crit2    = 0.01'               +POIVIR
1965   texte=texte+'epsit    = 1.e-3'              +POIVIR
1966   texte=texte+'pirad    = '+str(pi)           +POIVIR
1967   texte=texte+'nzc      = '+str(NZC)          +POIVIR
1968   texte=texte+'teta_f   = '+str(pi/2.)        +POIVIR
1969   texte=texte+'zpp31    = '+str(CZ)           +POIVIR
1970   texte=texte+'daxbtu   = '+str(DENEXT)       +POIVIR
1971   texte=texte+'daxhtu   = '+str(DELTAZ)       +POIVIR
1972   texte=texte+'daxbgv   = '+str(DELTAZ)       +POIVIR
1973   texte=texte+'daxhgv   = '+str(DENEXT)       +POIVIR
1974   texte=texte+'nzt      = '+str(NZT)          +POIVIR
1975   texte=texte+'nzgv     = '+str(NZGV)         +POIVIR
1976   texte=texte+'*\n'
1977   texte=texte+'* FIN PARAMETRES UTILISATEUR\n'
1978   texte=texte+'opti donn '
1979   texte=texte+"'"+loc_datg+'ascouf_regl_v1.datg'+"';\n"
1980   fdgib=open(nomFichierDATG,'w')
1981   fdgib.write(texte)
1982   fdgib.close()
1983   
1984 ################################################################################
1985 ################################################################################
1986 ################################################################################
1987 def macr_ascouf_mail_ops(self,EXEC_MAILLAGE,TYPE_ELEM,COUDE,
1988                               SOUS_EPAIS_COUDE,SOUS_EPAIS_MULTI,
1989                               FISS_COUDE,IMPRESSION,INFO,**args):
1990   """
1991      Ecriture de la macro MACR_ASCOUF_MAIL
1992   """
1993   from Accas import _F
1994   import types
1995   import aster 
1996
1997   ier=0
1998   
1999 # On importe les definitions des commandes a utiliser dans la macro
2000   EXEC_LOGICIEL =self.get_cmd('EXEC_LOGICIEL')
2001   PRE_GIBI      =self.get_cmd('PRE_GIBI')
2002   LIRE_MAILLAGE =self.get_cmd('LIRE_MAILLAGE')
2003   DEFI_GROUP    =self.get_cmd('DEFI_GROUP')
2004   MODI_MAILLAGE =self.get_cmd('MODI_MAILLAGE')
2005   AFFE_MODELE   =self.get_cmd('AFFE_MODELE')
2006   CREA_MAILLAGE =self.get_cmd('CREA_MAILLAGE')
2007   DEFI_FICHIER  =self.get_cmd('DEFI_FICHIER')
2008   IMPR_RESU     =self.get_cmd('IMPR_RESU')
2009
2010 # La macro compte pour 1 dans la numerotation des commandes
2011   self.set_icmd(1)
2012
2013   
2014   TYPELE = TYPE_ELEM
2015   NIVMAG = EXEC_MAILLAGE['NIVE_GIBI']
2016   PRECIS = 0.01
2017   CRITER = 'RELATIF'
2018   CAR3   = ('IFDRO','IEXDR','IEXTR','IEXGA','IFGAU','IINGA','IINTR','IINDR')
2019   CAR4   = ('NOFDRO','NOEXDR','NOEXTR','NOEXGA','NOFGAU','NOINGA','NOINTR','NOINDR')
2020   CAR5   = ('NEFDRO','NEEXDR','NEEXTR','NEEXGA','NEFGAU','NEINGA','NEINTR','NEINDR')
2021   CAR6   = ('FDRO','EXDR','EXTR','EXGA','FGAU','INGA','INTR','INDR')
2022   SECT   = ('MI','TU','GV')  
2023   
2024 #
2025 ################################################################################
2026 #     --- caracteristiques du coude ---
2027 ################################################################################
2028 #
2029   GEOM    =COUDE['TRANSFORMEE']
2030   ALPHA   =COUDE['ANGLE']
2031   RC      =COUDE['R_CINTR']
2032   LTCHAR  =COUDE['L_TUBE_P1']
2033   LTCLIM  =COUDE['L_TUBE_P2']
2034   NBEP    =COUDE['NB_ELEM_EPAIS']
2035   SYME    =COUDE['SYME']
2036   SUREP   =0.0
2037   TYPBOL  = None
2038 #
2039   if COUDE['TRANSFORMEE']=='COUDE' or COUDE['TRAN_EPAIS']=='NON' :
2040      SUREP=COUDE['SUR_EPAIS']
2041      TYPBOL  =COUDE['BOL_P2']
2042      DEXT   = COUDE['DEXT']
2043      EP1    = COUDE['EPAIS']
2044      EP2    = EP1
2045      EPI    = 0.0
2046      TETA1  = 0.0
2047      TETA2  = 0.0
2048      LTRAN  = 0.0
2049      NBTRAN = 0
2050   else:
2051      NBTRAN = 1
2052      if COUDE['SYME']!='ENTIER':
2053         print ' <MACR_ASCOUF_MAIL> les quart et demi structure'
2054         print ' <MACR_ASCOUF_MAIL> ne peuvent etre realisees '
2055         print ' <MACR_ASCOUF_MAIL> sur un modele comportant une transition '
2056         print ' <MACR_ASCOUF_MAIL> d epaisseur '
2057         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2058         ier = ier+1
2059         return ier
2060 #
2061      DEXT  = COUDE['DEXT_T1']
2062      EP1   = COUDE['EPAIS_T1']
2063      EP2   = COUDE['EPAIS_T2']
2064      TETA1 = COUDE['ANGL_TETA1']
2065      TETA2 = 0.0
2066      EPI   = 0.0
2067      if COUDE['ANGL_TETA2']!=None :
2068        NBTRAN = 2
2069        TETA2 = COUDE['ANGL_TETA2']
2070        EPI   = COUDE['EPAIS_TI']
2071 #
2072      if COUDE['ABSC_CURV_TRAN']!=None :
2073        LTRAN   = COUDE['ABSC_CURV_TRAN']
2074      else :
2075        LTRAN   = COUDE['POSI_ANGU_TRAN']* RC * pi / 180.0
2076 #
2077   RM  = (DEXT-EP1)/2.0
2078   RM2 = RM + (EP2-EP1)/2.0
2079   R1  = RC
2080   R2  = RM
2081   E   = EP1
2082 #
2083   if COUDE['SYME']!='ENTIER' and (LTCHAR!=LTCLIM) :
2084      print ' <MACR_ASCOUF_MAIL> les deux embouts doivent etre'
2085      print ' <MACR_ASCOUF_MAIL> de meme longueur pour les cas de symetrie '
2086      self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2087      ier = ier+1
2088      return ier
2089 #
2090   LAMOR = 3.0/2.0 * sqrt( RM*RM*RM / EP1)
2091   if LTCHAR<LAMOR :
2092      print ' <MACR_ASCOUF_MAIL> longueur d embout P1 inferieure'
2093      print ' <MACR_ASCOUF_MAIL> a la longueur d amortissement = ',LAMOR
2094      print ' <A> <MACR_ASCOUF_MAIL> alarme'
2095 #
2096   LAMOR = 3.0/2.0 * sqrt( RM2*RM2*RM2 / EP2)
2097   if LTCLIM<LAMOR :
2098      print ' <MACR_ASCOUF_MAIL> longueur d embout P2 inferieure'
2099      print ' <MACR_ASCOUF_MAIL> a la longueur d amortissement = ',LAMOR
2100      print ' <A> <MACR_ASCOUF_MAIL> alarme'
2101 #
2102   if TYPBOL!=None:
2103    if TYPBOL[:1]=='GV' :
2104      print ' <MACR_ASCOUF_MAIL> la condition aux limites raccord'
2105      print ' <MACR_ASCOUF_MAIL> 3d-poutre appliquee avec la macro de calcul'
2106      print ' <MACR_ASCOUF_MAIL> ascouf n est pas licite avec un embout'
2107      print ' <MACR_ASCOUF_MAIL> de type conique'
2108      print ' <A> <MACR_ASCOUF_MAIL> alarme'
2109 #
2110 ################################################################################
2111 #     --- caracteristiques de la fissure ---
2112 ################################################################################
2113 #
2114   if FISS_COUDE!=None:
2115      if NBEP!=3:
2116         print ' <MACR_ASCOUF_MAIL> le nombre d elements dans l epaisseur'
2117         print ' <MACR_ASCOUF_MAIL> du coude n est pas parametrable pour'
2118         print ' <MACR_ASCOUF_MAIL> un coude avec fissure'
2119         print ' <MACR_ASCOUF_MAIL> mot-cle NB_ELEM_EPAIS ignore'
2120         print ' <A> <MACR_ASCOUF_MAIL> alarme'
2121      FPROF = FISS_COUDE['PROFONDEUR']
2122      FAXI  = FISS_COUDE['AXIS']
2123      if FAXI=='NON' and FISS_COUDE['LONGUEUR']==None :
2124         print ' <MACR_ASCOUF_MAIL> pour les fissures non axisymetriques'
2125         print ' <MACR_ASCOUF_MAIL> la longueur doit etre specifiee '
2126         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2127         ier = ier+1
2128         return ier
2129      if FAXI=='OUI' and FISS_COUDE['LONGUEUR']!=None :
2130         print ' <MACR_ASCOUF_MAIL> la fissure est axisymetrique : on ne'
2131         print ' <MACR_ASCOUF_MAIL> tient pas compte de la longueur specifiee'
2132         print ' <A> <MACR_ASCOUF_MAIL> alarme'
2133      if FISS_COUDE['LONGUEUR']!=None : FLONG = FISS_COUDE['LONGUEUR']
2134      if FAXI=='OUI' :
2135 ####    on prend une marge de securite a cause des modifs dans ascfis
2136         FLONG = 2.0 * pi * (RM + EP1)
2137      if FISS_COUDE['ABSC_CURV']!=None :
2138          SF     = FISS_COUDE['ABSC_CURV']
2139          LDEFAU = SF
2140          BETA   = 0.0
2141      else:
2142          SF     = 0.0
2143          BETA   = FISS_COUDE['POSI_ANGUL']
2144          LDEFAU = BETA * RC * pi / 180.0
2145      AZIM   = FISS_COUDE['AZIMUT']
2146      ORIEN  = FISS_COUDE['ORIEN']
2147      POSIT  = FISS_COUDE['FISSURE']
2148      NT     = FISS_COUDE['NB_TRANCHE']
2149      NS     = FISS_COUDE['NB_SECTEUR']
2150      NC     = FISS_COUDE['NB_COURONNE']
2151      if FISS_COUDE['RAYON_TORE']!=None    : RC0 = FISS_COUDE['RAYON_TORE']
2152      else :                                 RC0 = 0.
2153      if FISS_COUDE['COEF_MULT_RC2']!=None : RC2 = FISS_COUDE['COEF_MULT_RC2']
2154      else :                                 RC2 = 0.
2155      if FISS_COUDE['COEF_MULT_RC3']!=None : RC3 = FISS_COUDE['COEF_MULT_RC3']
2156      else :                                 RC3 = 0.
2157      EPSI   = FISS_COUDE['ANGL_OUVERTURE']
2158      OR     = ORIEN
2159      AZ     = AZIM
2160      POS    = POSIT
2161      DGAXEC = FLONG/2.0
2162      DC     = DGAXEC
2163      if ORIEN!=90.0 and NBTRAN!=0 :
2164         print ' <MACR_ASCOUF_MAIL> avec une transition d epaisseur'
2165         print ' <MACR_ASCOUF_MAIL> la fissure doit obligatoirement etre transverse '
2166         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2167         ier = ier+1
2168         return ier
2169      if ORIEN!=90.0 and NBTRAN!=0 :
2170         print ' <MACR_ASCOUF_MAIL> avec une transition d epaisseur'
2171         print ' <MACR_ASCOUF_MAIL> la fissure doit obligatoirement etre transverse '
2172         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2173         ier = ier+1
2174         return ier
2175      if ORIEN!=90.0 and COUDE['SYME']!='ENTIER' :
2176         print ' <MACR_ASCOUF_MAIL> l orientation de la fissure doit'
2177         print ' <MACR_ASCOUF_MAIL> etre transverse (orien : 90.) pour modeliser '
2178         print ' <MACR_ASCOUF_MAIL> un quart ou une demi structure '
2179         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2180         ier = ier+1
2181         return ier
2182      if ORIEN!=90.0 and FAXI=='OUI' :
2183         print ' <MACR_ASCOUF_MAIL> la fissure est axisymetrique : son'
2184         print ' <MACR_ASCOUF_MAIL> orientation doit etre transverse (ORIEN : 90.)'
2185         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2186         ier = ier+1
2187         return ier
2188 #
2189 ################################################################################
2190 #     --- caracteristiques des sous epaisseurs ---
2191 ################################################################################
2192 #
2193   isep = 0
2194   MCL_SOUS_EPAIS = None
2195   if SOUS_EPAIS_MULTI!=None : MCL_SOUS_EPAIS = SOUS_EPAIS_MULTI
2196   if SOUS_EPAIS_COUDE!=None : MCL_SOUS_EPAIS = SOUS_EPAIS_COUDE
2197   if SOUS_EPAIS_MULTI!=None and NBTRAN!=0 :
2198      print ' <MACR_ASCOUF_MAIL> il ne peut pas y avoir plusieurs'
2199      print ' <MACR_ASCOUF_MAIL> sous-epaisseurs en meme temps qu une'
2200      print ' <MACR_ASCOUF_MAIL> transition d epaisseur : si une seule'
2201      print ' <MACR_ASCOUF_MAIL> sous-epaisseur utiliser sous_epais_coude'
2202      self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2203      ier = ier+1
2204      return ier
2205   if SOUS_EPAIS_COUDE!=None and FISS_COUDE!=None and NBTRAN!=0 :
2206      print ' <MACR_ASCOUF_MAIL> avec une transition d epaisseur'
2207      print ' <MACR_ASCOUF_MAIL> il doit obligatoirement y avoir un defaut'
2208      print ' <MACR_ASCOUF_MAIL> soit une fissure  soit une sous-epaisseur'
2209      self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2210      ier = ier+1
2211      return ier
2212   if MCL_SOUS_EPAIS!=None :
2213      AZIM = 90.0
2214      if MCL_SOUS_EPAIS.__class__.__name__  !='MCList' : MCL_SOUS_EPAIS=[MCL_SOUS_EPAIS,]
2215      if len(MCL_SOUS_EPAIS)!=1 and COUDE['SYME']!='ENTIER' :
2216         print ' <MACR_ASCOUF_MAIL> ne modeliser qu une seule'
2217         print ' <MACR_ASCOUF_MAIL> sous-epaisseur pour un quart ou demi-coude'
2218         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2219         ier = ier+1
2220         return ier
2221      for ssep in MCL_SOUS_EPAIS :
2222         isep=isep+1
2223         if ssep['AXE_CIRC']!=None and ssep['TYPE']=='AXIS' :
2224            print ' <MACR_ASCOUF_MAIL> vous ne pouvez declarer la sous-'
2225            print ' <MACR_ASCOUF_MAIL> epaisseur comme axisymetrique et donner'
2226            print ' <MACR_ASCOUF_MAIL> une taille d axe circonferentiel'
2227            self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2228            ier = ier+1
2229            return ier
2230         if ssep['AXE_CIRC']==None and ssep['TYPE']=='ELLI' :
2231            print ' <MACR_ASCOUF_MAIL> vous devez donner une taille d axe'
2232            print ' <MACR_ASCOUF_MAIL> circonferentiel pour une sous-epaisseur de'
2233            print ' <MACR_ASCOUF_MAIL> type elliptique'
2234            self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2235            ier = ier+1
2236            return ier
2237         if ssep['POSI_CURV_LONGI']!=None:
2238            if ssep['POSI_CURV_LONGI']>(ALPHA*RC*pi/180.0) :
2239               print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2240               print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero :',isep
2241               print ' <MACR_ASCOUF_MAIL> abscisse curv. longit. :',ssep['POSI_CURV_LONGI']
2242               print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',(ALPHA*RC*pi/180.0)
2243               self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2244               ier = ier+1
2245               return ier
2246            LDEFAU = ssep['POSI_CURV_LONGI'] + ssep['AXE_LONGI']/2.0
2247            BETA = 0.0
2248         else:
2249            BETA=ssep['POSI_ANGUL']
2250            if (BETA<0.) or (BETA>ALPHA) :
2251               print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2252               print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero :',isep
2253               print ' <MACR_ASCOUF_MAIL> position angulaire centre sous-ep :',BETA
2254               print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',ALPHA
2255               self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2256               ier = ier+1
2257               return ier
2258            LDEFAU = (BETA*RC*pi/180.0) + ssep['AXE_LONGI']/2.0
2259 #
2260         if ssep['POSI_CURV_CIRC']!=None:
2261            if ssep['POSI_CURV_CIRC']>(2*pi*RM) :
2262               print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2263               print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero :',isep
2264               print ' <MACR_ASCOUF_MAIL> abscisse curv. circonf. :',ssep['POSI_CURV_CIRC']
2265               print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',(2*pi*RM)
2266               self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2267               ier = ier+1
2268               return ier
2269            if ssep['POSI_CURV_CIRC']!=(pi*RM) and ssep['TYPE']=='AXIS':
2270               print ' <MACR_ASCOUF_MAIL> le centre d une sous-epaisseur'
2271               print ' <MACR_ASCOUF_MAIL> axisymetrique est impose en intrados (pi*RM)'
2272               self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2273               ier = ier+1
2274               return ier
2275         else:
2276            ssep.IPHIC=ssep['AZIMUT']
2277            if ssep['AZIMUT']!=180. and ssep['TYPE']=='AXIS':
2278               print ' <MACR_ASCOUF_MAIL> le centre d une sous-epaisseur'
2279               print ' <MACR_ASCOUF_MAIL> axisymetrique est impose en intrados'
2280               print ' <MACR_ASCOUF_MAIL> l azimut est fixe a 180 degres'
2281               self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2282               ier = ier+1
2283               return ier
2284 #        l_ITYPE.append(ssep['TYPE'           ])
2285 #        l_ICIRC.append(ssep['AXE_CIRC'       ])
2286 #        l_ILONC.append(ssep['AXE_LONGI'      ])
2287 #        l_IPROC.append(ssep['PROFONDEUR'     ])
2288 #        l_ISLC.append( ssep['POSI_CURV_LONGI'])
2289 #        l_IBETC.append(BETA)
2290         ssep.BETA=BETA
2291 #        l_ISCC.append( ssep['POSI_CURV_CIRC' ])
2292 #        l_IPHIC.append(ssep['AZIMUT'         ])
2293 #        l_IPOS.append( ssep['SOUS_EPAIS'     ])
2294 #        l_INBEL.append(ssep['NB_ELEM_LONGI'  ])
2295 #        l_INBEC.append(ssep['NB_ELEM_CIRC'   ])
2296 #        l_IEVID.append(ssep['EMPREINTE'      ])
2297
2298      if SOUS_EPAIS_COUDE!=None and COUDE['NB_ELEM_EPAIS']!=3 :
2299         print ' <MACR_ASCOUF_MAIL> le nombre d elements dans l'
2300         print ' <MACR_ASCOUF_MAIL> epaisseur du coude n est pas parametrable pour'
2301         print ' <MACR_ASCOUF_MAIL> la version 2 de la procedure de plaque avec sous'
2302         print ' <MACR_ASCOUF_MAIL> -epaisseur : mot-cle NB_ELEM_EPAIS ignore'
2303         print ' <A> <MACR_ASCOUF_MAIL> alarme'
2304 #
2305 ################################################################################
2306 #     --- verifications de coherences ---
2307 ################################################################################
2308 #
2309 # donnees globales
2310   if COUDE['TRANSFORMEE']=='COUDE' or COUDE['TRAN_EPAIS']=='NON' :
2311     if SUREP<0. or SUREP>(RM-EP1/2.0):
2312        print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2313        print ' <MACR_ASCOUF_MAIL> surepaisseur :',SUREP
2314        print ' <MACR_ASCOUF_MAIL> valeur limite autorisee (RM-EP1/2) :',(RM-EP1/2.0)
2315        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2316        ier = ier+1
2317        return ier
2318   if RC<=(RM+EP1/2.0):
2319      print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2320      print ' <MACR_ASCOUF_MAIL> le rayon de cintrage :',RC
2321      print ' <MACR_ASCOUF_MAIL> doit etre superieur a (RM+EP1/2) :',(RM+EP1/2.0)
2322      self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2323      ier = ier+1
2324      return ier
2325 #
2326 # coude fissure
2327 #
2328   if FISS_COUDE!=None:
2329     if (RM/EP1)<5. or (RM/EP1)>12.:
2330        print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite (5,12)'
2331        print ' <MACR_ASCOUF_MAIL> rapport RM/EP1 :',(RM/EP1)
2332        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2333        ier = ier+1
2334        return ier
2335     if FISS_COUDE['ABSC_CURV']!=None:
2336      if SF<0. or SF>(ALPHA*RC*pi/180.0) :
2337        print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2338        print ' <MACR_ASCOUF_MAIL> abscisse curviligne centre fissure :',SF
2339        print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',(ALPHA*RC*pi/180.0)
2340        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2341        ier = ier+1
2342        return ier
2343     if (NT-2*(NT/2))!=0:
2344        print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2345        print ' <MACR_ASCOUF_MAIL> nombre de tranches :',NT
2346        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2347        ier = ier+1
2348        return ier
2349     if FISS_COUDE['ABSC_CURV'] and ((BETA<0.) or (BETA>ALPHA)):
2350        print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2351        print ' <MACR_ASCOUF_MAIL> position angulaire  centre fissure :',BETA
2352        print ' <MACR_ASCOUF_MAIL> posi_angul doit etre >= 0 et <= ',ALPHA
2353        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2354        ier = ier+1
2355        return ier
2356 #
2357 # transition d epaisseur
2358 #
2359   if NBTRAN!=0:
2360     LCOUDE = ALPHA * RC * pi / 180.0
2361     DEXT = 2.0*RM + EP1
2362     if (LTRAN<LDEFAU) and (LTRAN>LCOUDE) :
2363        print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2364        print ' <MACR_ASCOUF_MAIL> debut transition d epaisseur :',LTRAN
2365        print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',LDEFAU
2366        print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',LCOUDE
2367        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2368        ier = ier+1
2369        return ier
2370     if (TETA1<0.) or (TETA1>30.) :
2371        print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2372        print ' <MACR_ASCOUF_MAIL> angle de transition TETA1 :',TETA1
2373        print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',0.
2374        print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',30.
2375        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2376        ier = ier+1
2377        return ier
2378 #
2379 # transition d epaisseur a une pente
2380 #
2381     if NBTRAN==1:
2382        if (EP1<12.) or (EP1>80.) :
2383           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2384           print ' <MACR_ASCOUF_MAIL> epaisseur avant la transition :',EP1
2385           print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',12.
2386           print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',80.
2387           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2388           ier = ier+1
2389           return ier
2390        if (EP2<20.) or (EP2>110.) :
2391           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2392           print ' <MACR_ASCOUF_MAIL> epaisseur apres la transition :',EP2
2393           print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',20.
2394           print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',110.
2395           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2396           ier = ier+1
2397           return ier
2398        if (EP1>EP2) :
2399           print ' <MACR_ASCOUF_MAIL> l epaisseur avant la transition'
2400           print ' <MACR_ASCOUF_MAIL> doit etre inferieure '
2401           print ' <MACR_ASCOUF_MAIL> a celle apres la transition'
2402           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2403           ier = ier+1
2404           return ier
2405        LTRANF = LTRAN + ((EP2-EP1)/(tan(TETA1)))
2406        if (LTRANF>LCOUDE) :
2407           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2408           print ' <MACR_ASCOUF_MAIL> fin transition d epaisseur :',LTRANF
2409           print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',LCOUDE
2410           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2411           ier = ier+1
2412           return ier
2413        if DEXT<112. or DEXT>880. :
2414           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2415           print ' <MACR_ASCOUF_MAIL> diam ext du tube avant transition:',DEXT
2416           print ' <MACR_ASCOUF_MAIL> valeur minimum autorisee :',112.
2417           print ' <MACR_ASCOUF_MAIL> valeur maximum autorisee :',880.
2418           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2419           ier = ier+1
2420           return ier
2421 #
2422 # transition d epaisseur a une pente
2423 #
2424     else:
2425        if (TETA2<0.) or (TETA2>45.) :
2426           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2427           print ' <MACR_ASCOUF_MAIL> angle de transition TETA2 :',TETA2
2428           print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',0.
2429           print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',45.
2430           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2431           ier = ier+1
2432           return ier
2433        if (EP1<7.) or (EP1>35.) :
2434           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2435           print ' <MACR_ASCOUF_MAIL> epaisseur avant 1ere transition :',EP1
2436           print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',7.
2437           print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',35.
2438           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2439           ier = ier+1
2440           return ier
2441        if (EP2<15.) or (EP2>40.) :
2442           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2443           print ' <MACR_ASCOUF_MAIL> epaisseur avant 2eme transition :',EP2
2444           print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',15.
2445           print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',40.
2446           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2447           ier = ier+1
2448           return ier
2449        if (EPI<15.) or (EPI>40.) :
2450           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2451           print ' <MACR_ASCOUF_MAIL> epaisseur intermediaire :',EPI
2452           print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',15.
2453           print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',40.
2454           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2455           ier = ier+1
2456           return ier
2457        if (EP1>EPI) :
2458           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2459           print ' <MACR_ASCOUF_MAIL> l epaisseur avant la transition'
2460           print ' <MACR_ASCOUF_MAIL> doit etre inferieure a l epaisseur intermediaire'
2461           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2462           ier = ier+1
2463           return ier
2464        if (EP2<EPI) :
2465           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2466           print ' <MACR_ASCOUF_MAIL> l epaisseur apres la transition'
2467           print ' <MACR_ASCOUF_MAIL> doit etre inferieure a l epaisseur intermediaire'
2468           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2469           ier = ier+1
2470           return ier
2471        LTRANF = LTRAN  + (EPI-EP1)/(tan(TETA1))
2472        LTRANF = LTRANF + (EP2-EPI)/(tan(TETA2))
2473        if (LTRANF>LCOUDE) :
2474           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2475           print ' <MACR_ASCOUF_MAIL> fin transition d epaisseur :',LTRANF
2476           print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',LCOUDE
2477           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2478           ier = ier+1
2479           return ier
2480        if (DEXT<77.) or (DEXT>355.) :
2481           print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
2482           print ' <MACR_ASCOUF_MAIL> diam ext du tube avant transition:',LTRANF
2483           print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',77.
2484           print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',355.
2485           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
2486           ier = ier+1
2487           return ier
2488 #
2489 ################################################################################
2490 #     --- calcul taille initiale des defauts sur la plaque ---
2491 ################################################################################
2492 #
2493 #
2494   if FISS_COUDE!=None:
2495      DSF=(FISS_COUDE['ABSC_CURV']!=None)
2496      AXEAP,AXECP,SFP = ASCFIS(ALPHA, RM, RC, EP1, SUREP, GEOM, FPROF,
2497                               DGAXEC, AZIM, POSIT, SF, DSF, BETA, ORIEN)
2498   elif MCL_SOUS_EPAIS!=None :
2499      ier= ASCSEP(MCL_SOUS_EPAIS,ALPHA,RM,RC,EP1,GEOM,SYME)
2500      for ssep in MCL_SOUS_EPAIS:
2501          ssep.IDENL = ssep.ILONP/ssep['NB_ELEM_LONGI']*180./(pi*RC)
2502          ssep.IDENC = ssep.ICIRP/ssep['NB_ELEM_CIRC']*180./(pi*RM)
2503      if SYME=='QUART' :
2504 #       quart de structure     
2505         ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY\
2506         = ASCSYM(MCL_SOUS_EPAIS,RM,RC,ALPHA,LTCHAR,LTCLIM)
2507      else :
2508 #       demi-structure ou entiere
2509         ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY\
2510         = ASCPRE(MCL_SOUS_EPAIS,RM,RC,ALPHA,SYME,LTCHAR,LTCLIM)
2511 #
2512 #
2513   loc_gibi=aster.repout()
2514   logiel = EXEC_MAILLAGE['LOGICIEL'  ]
2515   UNITD  = EXEC_MAILLAGE['UNITE_DATG']
2516   UNITP  = EXEC_MAILLAGE['UNITE_MGIB']
2517   if   logiel=='GIBI98'  : logiel = loc_gibi+'gibi98'
2518   elif logiel=='GIBI2000': logiel = loc_gibi+'gibi2000'
2519   else                   :
2520        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> seuls gibi98 et gibi2000 sont appelableS")
2521        ier = ier+1
2522        return ier
2523 #
2524 #     --- ecriture sur le fichier .datg  de la procedure ---
2525 #
2526 # Nom du fichier de commandes pour GIBI
2527   nomFichierDATG = 'fort.'+str(UNITD)
2528 # Nom du fichier de maillage GIBI
2529   nomFichierGIBI = 'fort.'+str(UNITP)
2530   loc_datg = aster.repdex()
2531 #
2532   if FISS_COUDE!=None:
2533 #   procedure coude fissure (MOT-CLE FISS_COUDE)
2534     write_file_dgib_ASCFDO(nomFichierDATG,RM,RC,ALPHA,NBTRAN,EP1,EP2,EPI,TETA1,
2535                            TETA2,LTRAN,SUREP,LTCHAR,LTCLIM,TYPBOL,AXEAP,AXECP,NT,NS,NC,SFP,
2536                            ORIEN,AZIM,RC0,RC2,RC3,POSIT,EPSI,NIVMAG,SYME,loc_datg)
2537   elif MCL_SOUS_EPAIS!=None :
2538      if SOUS_EPAIS_MULTI==None :
2539 #      procedure coude sous-ep.: (MOT-CLE SOUS_EPAIS_COUDE)  
2540        write_file_dgib_ASCSQO(nomFichierDATG,TYPELE,RM,RC,ALPHA,NBTRAN,EP1,EP2,
2541                               EPI,TETA1,MCL_SOUS_EPAIS,TETA2,LTRAN,LTCHAR,LTCLIM,GEOM,
2542                               SYME,NBEP,NLX,NLY,NIVMAG,loc_datg)
2543        write_file_pgib_ASCSQ2(MCL_SOUS_EPAIS,NLX,NLY)
2544      else:
2545 #      procedure coude sous-ep.:(MOT-CLE SOUS_EPAIS_MULTI)
2546        write_file_dgib_ASCSP1(nomFichierDATG,TYPELE,MCL_SOUS_EPAIS,NIVMAG,loc_datg)
2547        write_file_pgib_ASCSDO(RM,RC,ALPHA,EP1,LTCLIM,LTCHAR,NBEP,
2548                               NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,
2549                               DNX,DNY,MCL_SOUS_EPAIS,GEOM,SYME)
2550        write_file_pgib_ASCSP2(MCL_SOUS_EPAIS,NLX,NLY)
2551   else:
2552 #   procedure coude regle
2553     write_file_dgib_ASCRDO(nomFichierDATG,TYPELE,NIVMAG,TYPBOL,ALPHA,RC,RM,EP1,SUREP,
2554                            LTCLIM,LTCHAR,NBEP,loc_datg)
2555
2556   
2557 # GIBI  
2558   EXEC_LOGICIEL( LOGICIEL = logiel ,
2559                  ARGUMENT = ( _F(NOM_PARA=nomFichierDATG),
2560                               _F(NOM_PARA=nomFichierGIBI), ), )
2561 # PRE_GIBI
2562   PRE_GIBI()
2563
2564   if SYME == 'QUART' : self.DeclareOut('nomres',self.sd)
2565 # LIRE_MAILLAGE
2566   nomres=LIRE_MAILLAGE(INFO=INFO)
2567
2568 # DEFI_GROUP  1
2569
2570   motscles={}
2571   l_CREA_GROUP_NO=[]
2572   l_CREA_GROUP_NO.append('BORD1')
2573   l_CREA_GROUP_NO.append('CLGV')
2574   l_CREA_GROUP_NO.append('BORD2')
2575   l_CREA_GROUP_NO.append('PEAUINT')
2576   l_CREA_GROUP_NO.append('PEAUEXT') 
2577
2578 # cas des fissures axisymetriques
2579   if FISS_COUDE!=None:
2580     if FISS_COUDE['AXIS']=='OUI':
2581       motscles['CREA_GROUP_MA']=[]
2582       motscles['CREA_GROUP_MA'].append(_F(GROUP_MA = 'FONDFISS',
2583                                           NOM      = 'MAIL_ORI',
2584                                           POSITION = 'INIT'    , ),) 
2585
2586 # conversion des groupes de mailles en groupes du bloc fissure  
2587   if FISS_COUDE!=None:
2588     if SYME == 'ENTIER':
2589       l_CREA_GROUP_NO.append('NOLIG1')
2590       l_CREA_GROUP_NO.append('FACE1')
2591     l_CREA_GROUP_NO.append('NOLIG2')
2592     l_CREA_GROUP_NO.append('FACE2')
2593     l_CREA_GROUP_NO.append('FONDFISS')
2594
2595   motscles['CREA_GROUP_NO']=[]
2596   motscles['CREA_GROUP_NO'].append(_F(GROUP_MA=tuple(l_CREA_GROUP_NO)))
2597
2598 # conversion des groupes de mailles en groupes de noeuds pour les
2599 # ligaments des sous-ep.
2600   if MCL_SOUS_EPAIS!=None:
2601     issep=0
2602     for ssep in MCL_SOUS_EPAIS:
2603       issep=issep+1
2604       if ssep['TYPE']=='ELLI':
2605         for k in range(2*NLX[issep-1]+1):
2606           chtmp=str(issep)+'_'+str(k+1)
2607           ch1='CIR'+chtmp
2608           ch2='ICI'+chtmp
2609           motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
2610                                               GROUP_MA = ch1,),)
2611         motscles['CREA_GROUP_NO'].append(_F(NOM      = 'IPCEN'+str(issep),
2612                                             GROUP_MA = 'PCENT'+str(issep),),)
2613         for k in range(2*NLY[issep-1]+1):
2614           chtmp=str(issep)+'_'+str(k+1)
2615           ch1='LON'+chtmp
2616           ch2='ILO'+chtmp
2617           motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
2618                                               GROUP_MA = ch1,),)
2619         for k in range(2*NLX[issep-1]+1):
2620           chtmp=str(issep)+'_'+str(k+1)
2621           ch1='ICI'+chtmp
2622           ch2='OCI'+chtmp
2623           ch3='ECI'+chtmp
2624           motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
2625                                               INTERSEC = ('PEAUEXT',ch1),),)
2626           motscles['CREA_GROUP_NO'].append(_F(NOM      = ch3,
2627                                               INTERSEC = ('PEAUINT',ch1),),)
2628         motscles['CREA_GROUP_NO'].append(_F(NOM      = 'OPCEN'+str(issep),
2629                                             INTERSEC = ('PEAUEXT','IPCEN'+str(issep),),),)
2630         motscles['CREA_GROUP_NO'].append(_F(NOM      = 'EPCEN'+str(issep),
2631                                             INTERSEC = ('PEAUINT','IPCEN'+str(issep),),),)
2632         for k in range(2*NLY[issep-1]+1):
2633           chtmp=str(issep)+'_'+str(k+1)
2634           ch1='ILO'+chtmp
2635           ch2='OLO'+chtmp
2636           ch3='ELO'+chtmp
2637           motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
2638                                               INTERSEC =  ('PEAUEXT',ch1),),)
2639           motscles['CREA_GROUP_NO'].append(_F(NOM      = ch3,
2640                                               INTERSEC =  ('PEAUINT',ch1),),)
2641         for k in range(2*NLX[issep-1]+1):
2642           chtmp=str(issep)+'_'+str(k+1)
2643           ch1='CIR'+chtmp
2644           ch2='ICI'+chtmp
2645           ch3='OCI'+chtmp
2646           ch4='ECI'+chtmp  
2647           motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
2648                                               NOM           = ch1,
2649                                               GROUP_NO      = ch2,
2650                                               GROUP_NO_ORIG = ch3,
2651                                               GROUP_NO_EXTR = ch4,
2652                                               PRECISION     = PRECIS,
2653                                               CRITERE       = CRITER,),)
2654         motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
2655                                             NOM           = 'PCENT'+str(issep),
2656                                             GROUP_NO      = 'IPCEN'+str(issep),
2657                                             GROUP_NO_ORIG = 'OPCEN'+str(issep),
2658                                             GROUP_NO_EXTR = 'EPCEN'+str(issep),
2659                                             PRECISION     =  PRECIS,
2660                                             CRITERE       =  CRITER,),)
2661         for k in range(2*NLY[issep-1]+1):
2662            chtmp=str(issep)+'_'+str(k+1)
2663            ch1='LON'+chtmp
2664            ch2='ILO'+chtmp
2665            ch3='OLO'+chtmp
2666            ch4='ELO'+chtmp  
2667            motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
2668                                                NOM           = ch1,
2669                                                GROUP_NO      = ch2,
2670                                                GROUP_NO_ORIG = ch3,
2671                                                GROUP_NO_EXTR = ch4,
2672                                                PRECISION     = PRECIS,
2673                                                CRITERE       = CRITER,),)
2674 #     1/ noms intermediaires des groupes de noeuds representant les ligaments
2675 #        des sections: TU,MI,GV et sous-ep.     
2676       for k in range(8):
2677         motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR3[k]+str(issep),
2678                                              GROUP_MA = CAR6[k]+str(issep),),)
2679
2680     for k in range(3):
2681       if SYME == 'ENTIER' or k!=2:
2682         for j in range(8):
2683           motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR3[j]+SECT[k],
2684                                                GROUP_MA = CAR6[j]+SECT[k],),)
2685
2686 #   2/ determination et nommage des noeuds origine et extremite des groupes de noeuds
2687 #      representant les ligaments de la ou des sections: sous-ep.
2688     issep=0
2689     for ssep in MCL_SOUS_EPAIS:
2690       issep=issep+1
2691       for k in range(8):
2692         motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR4[k]+str(issep),
2693                                              INTERSEC = ('PEAUEXT',CAR3[k]+str(issep),),),)
2694         motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR5[k]+str(issep),
2695                                              INTERSEC = ('PEAUINT',CAR3[k]+str(issep),),),)        
2696 #     3/ nommage final des groupes de noeuds representant les ligaments 
2697 #        de la ou des sections: sous-ep.
2698       for k in range(8):
2699         motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
2700                                             NOM           = CAR6[k]+str(issep),
2701                                             GROUP_NO      = CAR3[k]+str(issep),
2702                                             GROUP_NO_ORIG = CAR4[k]+str(issep),
2703                                             GROUP_NO_EXTR = CAR5[k]+str(issep),
2704                                             PRECISION     = PRECIS,
2705                                             CRITERE       = CRITER,),)
2706
2707 #   4/ determination et nommage des noeuds origine et extremite des groupes de noeuds
2708 #      representant les ligaments des sections: TU,MI,GV
2709     for k in range(3):
2710       if SYME == 'ENTIER' or k!=2:
2711         for j in range(8):
2712            motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR4[j]+SECT[k],
2713                                                 INTERSEC = ('PEAUEXT',CAR3[j]+SECT[k],),),) 
2714            motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR5[j]+SECT[k],
2715                                                 INTERSEC = ('PEAUINT',CAR3[j]+SECT[k],),),) 
2716 #       5/ nommage final des groupes de noeuds representant les ligaments des sections: TU,MI,GV   
2717         for j in range(8):    
2718            motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
2719                                                NOM           = CAR6[j]+SECT[k],
2720                                                GROUP_NO      = CAR3[j]+SECT[k],
2721                                                GROUP_NO_ORIG = CAR4[j]+SECT[k],
2722                                                GROUP_NO_EXTR = CAR5[j]+SECT[k],
2723                                                PRECISION     = PRECIS,
2724                                                CRITERE       = CRITER,),)
2725     
2726
2727   nomres=DEFI_GROUP(reuse   =nomres,
2728                       MAILLAGE=nomres,
2729                       **motscles )
2730 #
2731 # DEFI_GROUP  2
2732   if FISS_COUDE!=None:
2733 # creation des groupes petit axe et grand axe fissure par
2734 # intersection de groupes existants
2735     motscles={}
2736     motscles['CREA_GROUP_NO']=[]
2737     l_peau=[]
2738     l_intersec=[]
2739     if POSIT == 'DEB_INT':
2740         l_peau.append('PEAUINT')
2741     else:
2742         l_peau.append('PEAUEXT')
2743     
2744     if SYME == 'ENTIER' :
2745       l_intersec.append('FACE1')
2746       motscles['CREA_GROUP_NO'].append(_F(NOM      = 'P_AXE_1',
2747                                           INTERSEC = ('NOLIG1','FACE1'),),)
2748       motscles['CREA_GROUP_NO'].append(_F(NOM      = 'G_AXE_1',
2749                                           INTERSEC =  tuple(l_peau+l_intersec),),)  
2750     l_intersec=[]
2751     l_intersec.append('FACE2')  
2752     motscles['CREA_GROUP_NO'].append(_F(NOM      = 'P_AXE_2',
2753                                         INTERSEC = ('NOLIG2','FACE2'),),)
2754     motscles['CREA_GROUP_NO'].append(_F(NOM      = 'G_AXE_2',
2755                                         INTERSEC =  tuple(l_peau+l_intersec),),)
2756    
2757     nomres=DEFI_GROUP(reuse   =nomres,
2758                         MAILLAGE=nomres,
2759                         **motscles )    
2760  
2761 # AFFE_MODELE
2762   __MODELE=AFFE_MODELE( MAILLAGE=nomres,
2763                         AFFE=_F( GROUP_MA     = 'COUDE'      ,
2764                                  PHENOMENE    = 'MECANIQUE'  ,
2765                                  MODELISATION = '3D'         , )
2766                          )
2767
2768 # MODI_MAILLAGE  1
2769   motscles={}
2770   if GEOM == 'COUDE':
2771     motscles['TUBE_COUDE']=[]
2772     motscles['TUBE_COUDE'].append(_F(ANGLE=ALPHA,
2773                                     R_CINTR=RC,
2774                                     L_TUBE_P1=LTCHAR),)
2775   motscles['PLAQ_TUBE']=[]
2776   D_PLAQ_TUBE={}
2777   D_PLAQ_TUBE['DEXT']=DEXT
2778   D_PLAQ_TUBE['EPAIS']=EP1
2779   D_PLAQ_TUBE['L_TUBE_P1']=LTCHAR
2780   if SYME == 'QUART' : D_PLAQ_TUBE['COUTURE']='NON'
2781   if FISS_COUDE!=None:
2782       D_PLAQ_TUBE['AZIMUT']=AZIM
2783   elif SOUS_EPAIS_COUDE!=None :
2784       D_PLAQ_TUBE['AZIMUT']=MCL_SOUS_EPAIS[0].IPHIC
2785   else:pass
2786   motscles['PLAQ_TUBE'].append(_F(**D_PLAQ_TUBE),) 
2787   nomres=MODI_MAILLAGE( reuse   =nomres,
2788                           MAILLAGE=nomres,
2789                           **motscles )
2790  
2791 # MODI_MAILLAGE  2
2792   motscles={}
2793   motscles['ORIE_PEAU_3D']=_F(GROUP_MA=('PEAUINT','EXTUBE'),)
2794   if FISS_COUDE!=None:
2795     if FISS_COUDE['FISSURE'] == 'DEB_INIT':
2796       motscles['ORIE_PEAU_3D']=_F(GROUP_MA=('PEAUINT','EXTUBE','FACE1','FACE2'),)  
2797   nomres=MODI_MAILLAGE(reuse   =nomres,
2798                        MAILLAGE=nomres,
2799                        MODELE  =__MODELE,
2800                        **motscles)
2801
2802 # CREA_MAILLAGE
2803   if SYME != 'QUART':
2804     self.DeclareOut('nomre2',self.sd)
2805     motscles={}
2806     motscles['CREA_POI1']=[]
2807     motscles['CREA_POI1'].append(_F(NOM_GROUP_MA='P1',
2808                                     GROUP_NO='P1'),)
2809     if TYPBOL == None :
2810       motscles['CREA_POI1'].append(_F(NOM_GROUP_MA='P2',
2811                                     GROUP_NO='P2'),)    
2812     nomre2=CREA_MAILLAGE( MAILLAGE=nomres,
2813                           **motscles)
2814   else:  
2815     nomre2=nomres
2816
2817  
2818 # IMPRESSSION
2819   if IMPRESSION!=None:
2820      if IMPRESSION.__class__.__name__  !='MCList' : IMPRESSION  =[IMPRESSION,]
2821      for impr in IMPRESSION :
2822 #
2823          motscles={}
2824          if impr['FORMAT']=='IDEAS'  : motscles['VERSION']   =impr['VERSION']
2825          if impr['FORMAT']=='CASTEM' : motscles['NIVE_GIBI'] =impr['NIVE_GIBI']
2826          if impr['UNITE']!=None      : motscles['UNITE']     =impr['UNITE']
2827          impr_resu = _F( MAILLAGE = nomre2,)
2828 #
2829          IMPR_RESU( RESU = impr_resu,
2830                     FORMAT= impr['FORMAT'],**motscles)
2831
2832
2833
2834   return ier
2835
2836