]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
CCAR: ajout des fichiers macros
authoreficas <>
Mon, 20 Sep 2004 09:33:25 +0000 (09:33 +0000)
committereficas <>
Mon, 20 Sep 2004 09:33:25 +0000 (09:33 +0000)
Aster/Cata/Macro/impr_fonction_ops.py [new file with mode: 0644]
Aster/Cata/Macro/lire_fonction_ops.py [new file with mode: 0644]
Aster/Cata/Macro/lire_table_ops.py [new file with mode: 0644]
Aster/Cata/Macro/macr_ascouf_calc_ops.py [new file with mode: 0644]
Aster/Cata/Macro/macr_ascouf_mail_ops.py [new file with mode: 0644]
Aster/Cata/Macro/stanley_ops.py [new file with mode: 0644]
Aster/Cata/Macro/test_fichier_ops.py [new file with mode: 0644]

diff --git a/Aster/Cata/Macro/impr_fonction_ops.py b/Aster/Cata/Macro/impr_fonction_ops.py
new file mode 100644 (file)
index 0000000..2283e75
--- /dev/null
@@ -0,0 +1,351 @@
+#@ MODIF impr_fonction_ops Macro  DATE 17/08/2004   AUTEUR DURAND C.DURAND 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
+# (AT YOUR OPTION) ANY LATER VERSION.                                                  
+#                                                                       
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
+#                                                                       
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
+# ======================================================================
+# RESPONSABLE MCOURTOI M.COURTOIS
+
+import os.path
+
+def impr_fonction_ops(self, FORMAT, COURBE, INFO, **args):
+   """
+   Macro IMPR_FONCTION permettant d'imprimer dans un fichier des fonctions,
+   colonnes de table...
+   Erreurs<S> dans IMPR_FONCTION pour ne pas perdre la base.
+   """
+   import aster
+   from Utilitai import Graph
+   from Accas import _F
+   ier=0
+   # La macro compte pour 1 dans la numerotation des commandes
+   self.set_icmd(1)
+
+   # On importe les definitions des commandes a utiliser dans la macro
+   # Le nom de la variable doit etre obligatoirement le nom de la commande
+   CALC_FONC_INTERP = self.get_cmd('CALC_FONC_INTERP')
+   DEFI_LIST_REEL   = self.get_cmd('DEFI_LIST_REEL')
+   # DETRUIRE          =self.get_cmd('DETRUIRE')
+
+   #----------------------------------------------
+   # 0. Traitement des arguments, initialisations
+
+   # 0.1. Fichier
+   if args.has_key('UNITE'):
+      nomfich='fort.'+str(args['UNITE'])
+   else:
+      nomfich='impr_fonction.out'
+   if INFO==2:
+      print ' Nom du fichier :',nomfich
+   if os.path.exists(nomfich):
+      print ' <A> Le fichier '+nomfich+' existe déjà. Il va etre écrasé.'
+   fich=open(nomfich,'w')
+
+   # 0.2. Récupération des valeurs sous COURBE
+   unparmi=('FONCTION','LIST_RESU','FONC_X')
+
+   Courbe=[]
+   for Ci in COURBE:
+      dC = Ci.cree_dict_valeurs(Ci.mc_liste)
+      for mc in dC.keys():
+         if dC[mc]==None: del dC[mc]
+      Courbe.append(dC)
+   if INFO==2:
+      print ' Nombre de fonctions à analyser : ',len(Courbe)
+
+   # 0.3. Devra-t-on interpoler globalement ?
+   #      Dans ce cas, __linter est le LIST_PARA
+   #      ou, à défaut, les abscisses de la première courbe
+   interp=0
+   if FORMAT=='TABLEAU':
+      interp=1
+      dCi=Courbe[0]
+      if dCi.has_key('LIST_PARA'):
+         __linter=dCi['LIST_PARA']
+      else:
+         obj=None
+         for typi in unparmi:
+            if dCi.has_key(typi):
+               obj=dCi[typi]
+               typ=obj.__class__.__name__
+               break
+         if obj==None:
+            raise aster.error, '<S> <IMPR_FONCTION> incohérence entre le catalogue et la macro.'
+         if typi=='FONCTION':
+            if typ=='nappe_sdaster':
+               lpar,lval=obj.Valeurs()
+               linterp=lval[0][0]
+            else:
+               linterp=obj.Valeurs()[0]
+         elif typi=='FONC_X':
+            lbid,linterp=obj.Valeurs()
+         __linter=DEFI_LIST_REEL(VALE=linterp)
+      if INFO==2:
+         print ' Interpolation globale sur la liste :\n',__linter.Valeurs()
+
+
+   #----------------------------------------------
+   # 1. Récupération des valeurs des N courbes sous forme
+   #    d'une liste de N listes
+   #----------------------------------------------
+   graph=Graph.Graph()
+   iocc=-1
+   for dCi in Courbe:
+      iocc=iocc+1
+
+      # 1.1. Type d'objet à traiter
+      obj=None
+      for typi in unparmi:
+         if dCi.has_key(typi):
+            obj=dCi[typi]
+            typ=obj.__class__.__name__
+            break
+      if obj==None:
+         raise aster.error, '<S> <IMPR_FONCTION> incohérence entre le catalogue et la macro.'
+
+      # 1.2. Extraction des valeurs
+
+      # 1.2.1. Mot-clé FONCTION
+      if   typi=='FONCTION':
+         if typ=='nappe_sdaster':
+            lpar,lval=obj.Valeurs()
+            dico,ldicf=obj.Parametres()
+            for i in range(len(lpar)):
+               p=lpar[i]
+               lx=lval[i][0]
+               ly=lval[i][1]
+               # sur quelle liste interpoler chaque fonction
+               if i==0:
+                  if interp:
+                     __li=__linter
+                  elif dCi.has_key('LIST_PARA'):
+                     __li=dCi['LIST_PARA']
+                  else:
+                     __li=DEFI_LIST_REEL(VALE=lx)
+               # compléter les paramètres d'interpolation
+               dic=dico.copy()
+               for k,v in ldicf[i].items(): dic[k]=v
+               
+               if interp or dCi.has_key('LIST_PARA') or i>0:
+                  __ftmp=CALC_FONC_INTERP(
+                     FONCTION=obj,
+                     VALE_PARA=p,
+                     LIST_PARA_FONC=__li,
+                     **dic
+                  )
+                  pv,lv2=__ftmp.Valeurs()
+                  lx=lv2[0][0]
+                  ly=lv2[0][1]
+               # on stocke les données dans le Graph
+               dicC={
+                  'Val' : [lx,ly],
+                  'Lab' : [dic['NOM_PARA_FONC'],dic['NOM_RESU']]
+               }
+               if dCi.has_key('LEGENDE'):       dicC['Leg']=dCi['LEGENDE']
+               if dCi.has_key('STYLE'):         dicC['Sty']=dCi['STYLE']
+               if dCi.has_key('COULEUR'):       dicC['Coul']=dCi['COULEUR']
+               if dCi.has_key('MARQUEUR'):      dicC['Marq']=dCi['MARQUEUR']
+               if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR']
+               graph.AjoutCourbe(**dicC)
+         else:
+            __ftmp=obj
+            dpar=__ftmp.Parametres()
+            if interp:
+               __ftmp=CALC_FONC_INTERP(
+                  FONCTION=obj,
+                  LIST_PARA=__linter,
+                  **dpar
+               )
+            elif dCi.has_key('LIST_PARA'):
+               __ftmp=CALC_FONC_INTERP(
+                  FONCTION=obj,
+                  LIST_PARA=dCi['LIST_PARA'],
+                  **dpar
+               )
+            lval=list(__ftmp.Valeurs())
+            lx=lval[0]
+            lr=lval[1]
+            if typ=='fonction_c' and dCi.has_key('PARTIE'):
+               if dCi['PARTIE']=='COMPLEXE' : lr=lval[2]
+            # on stocke les données dans le Graph
+            if typ=='fonction_c' and not dCi.has_key('PARTIE'):
+               dicC={
+                  'Val' : lval,
+                  'Lab' : [dpar['NOM_PARA'],dpar['NOM_RESU']+'_R',dpar['NOM_RESU']+'_I']
+               }
+            else:
+               dicC={
+                  'Val' : [lx,lr],
+                  'Lab' : [dpar['NOM_PARA'],dpar['NOM_RESU']]
+               }
+            if dCi.has_key('LEGENDE'):       dicC['Leg']=dCi['LEGENDE']
+            if dCi.has_key('STYLE'):         dicC['Sty']=dCi['STYLE']
+            if dCi.has_key('COULEUR'):       dicC['Coul']=dCi['COULEUR']
+            if dCi.has_key('MARQUEUR'):      dicC['Marq']=dCi['MARQUEUR']
+            if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR']
+            graph.AjoutCourbe(**dicC)
+
+      # 1.2.2. Mot-clé LIST_RESU
+      elif typi=='LIST_RESU':
+         if interp and iocc>0:
+            raise aster.error, """<S> Il n'y a pas de règles d'interpolation pour LIST_PARA/LIST_RESU,
+     LIST_PARA/LIST_RESU ne peut donc apparaitre qu'une seule fois
+     et à la première occurence de COURBE"""
+         lx=dCi['LIST_PARA'].Valeurs()
+         lr=obj.Valeurs()
+         if len(lx)!=len(lr):
+            raise aster.error, "<S> LIST_PARA et LIST_RESU n'ont pas la meme taille"
+         # on stocke les données dans le Graph
+         dicC={
+            'Val' : [lx,lr],
+            'Lab' : [dCi['LIST_PARA'].get_name(),obj.get_name()]
+         }
+         if dCi.has_key('LEGENDE'):       dicC['Leg']=dCi['LEGENDE']
+         if dCi.has_key('STYLE'):         dicC['Sty']=dCi['STYLE']
+         if dCi.has_key('COULEUR'):       dicC['Coul']=dCi['COULEUR']
+         if dCi.has_key('MARQUEUR'):      dicC['Marq']=dCi['MARQUEUR']
+         if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR']
+         graph.AjoutCourbe(**dicC)
+
+      # 1.2.3. Mot-clé FONC_X
+      # exemple : obj(t)=sin(t), on imprime x=sin(t), y=cos(t)
+      #           ob2(t)=cos(t)
+      elif typi=='FONC_X':
+         ob2=dCi['FONC_Y']
+         # peut-on blinder au niveau du catalogue
+         if typ=="nappe_sdaster" or ob2.__class__.__name__=="nappe_sdaster":
+            raise aster.error, "<S> FONC_X/FONC_Y ne peuvent pas etre des nappes !"
+         __ftmp=obj
+         dpar=__ftmp.Parametres()
+         __ftm2=ob2
+         dpa2=__ftm2.Parametres()
+         intloc=0
+         if interp:
+            intloc=1
+            __li=__linter
+         elif dCi.has_key('LIST_PARA'):
+            intloc=1
+            __li=dCi['LIST_PARA']
+         if intloc:
+            __ftmp=CALC_FONC_INTERP(
+               FONCTION=obj,
+               LIST_PARA=__li,
+               **dpar
+            )
+            lt,lx=__ftmp.Valeurs()
+            __ftm2=CALC_FONC_INTERP(
+               FONCTION=ob2,
+               LIST_PARA=__li,
+               **dpa2
+            )
+         else:
+            lt,lx=__ftmp.Valeurs()
+            __li=DEFI_LIST_REEL(VALE=lt)
+            __ftm2=CALC_FONC_INTERP(
+               FONCTION=ob2,
+               LIST_PARA=__li,
+               **dpa2
+            )
+         
+         lbid,ly=__ftm2.Valeurs()
+         #DETRUIRE(CONCEPT=_F(NOM='__ftmp'),)
+         #DETRUIRE(CONCEPT=_F(NOM='__ftm2'),)
+         # on stocke les données dans le Graph
+         if interp:
+            dicC={
+               'Val' : [lt,lx,ly],
+               'Lab' : [dpar['NOM_PARA'],dpar['NOM_RESU'],dpa2['NOM_RESU']]
+            }
+         else:
+            dicC={
+               'Val' : [lx,ly],
+               'Lab' : [dpar['NOM_PARA'],dpa2['NOM_RESU']]
+            }
+         if dCi.has_key('LEGENDE'):       dicC['Leg']=dCi['LEGENDE']
+         if dCi.has_key('STYLE'):         dicC['Sty']=dCi['STYLE']
+         if dCi.has_key('COULEUR'):       dicC['Coul']=dCi['COULEUR']
+         if dCi.has_key('MARQUEUR'):      dicC['Marq']=dCi['MARQUEUR']
+         if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR']
+         graph.AjoutCourbe(**dicC)
+
+   # 1.3. dbg
+   if INFO==2:
+      print '\n'+'-'*70+'\n Contenu du Graph : \n'+'-'*70
+      print graph
+      print '-'*70+'\n'
+
+   #----------------------------------------------
+   # 2. Impression du 'tableau' de valeurs
+   #----------------------------------------------
+
+   # 2.0. Surcharge des propriétés du graphique et des axes
+   if args['TITRE']!=None:          graph.Titre=args['TITRE']
+   if args['SOUS_TITRE']!=None:     graph.SousTitre=args['SOUS_TITRE']
+   if FORMAT in ('XMGRACE','AGRAF'):
+      if args['BORNE_X']!=None:
+                                       graph.Min_X=args['BORNE_X'][0]
+                                       graph.Max_X=args['BORNE_X'][1]
+      if args['BORNE_Y']!=None:
+                                       graph.Min_Y=args['BORNE_Y'][0]
+                                       graph.Max_Y=args['BORNE_Y'][1]
+      if args['LEGENDE_X']!=None:      graph.Legende_X=args['LEGENDE_X']
+      if args['LEGENDE_Y']!=None:      graph.Legende_Y=args['LEGENDE_Y']
+      if args['ECHELLE_X']!=None:      graph.Echelle_X=args['ECHELLE_X']
+      if args['ECHELLE_Y']!=None:      graph.Echelle_Y=args['ECHELLE_Y']
+      if args['GRILLE_X']!=None:       graph.Grille_X=args['GRILLE_X']
+      if args['GRILLE_Y']!=None:       graph.Grille_Y=args['GRILLE_Y']
+      if args['TRI']!=None:            graph.Tri=args['TRI']
+
+   # si Min/Max incohérents
+   if graph.Min_X > graph.Max_X or graph.Min_Y > graph.Max_Y:
+      graph.SetExtrema()
+
+   # 2.1. au format TABLEAU
+   if FORMAT=='TABLEAU':
+      # surcharge par les formats de l'utilisateur
+      dico_formats={
+         'csep'  : args['SEPARATEUR'],
+         'ccom'  : args['COMMENTAIRE'],
+         'cdeb'  : args['DEBUT_LIGNE'],
+         'cfin'  : args['FIN_LIGNE']
+      }
+      tab=Graph.ImprTableau(graph,nomfich,dico_formats)
+      tab.Trace()
+
+   # 2.2. au format AGRAF
+   elif FORMAT=='AGRAF':
+      nomdigr='fort.'+str(args['UNITE_DIGR'])
+      dico_formats={ 'formR' : '%12.5E' }
+      agraf=Graph.ImprAgraf(graph,[nomfich,nomdigr],dico_formats)
+      agraf.Trace()
+
+   # 2.3. au format XMGRACE et dérivés
+   elif FORMAT=='XMGRACE':
+      dico_formats={ 'formR' : '%.8g' }
+      # parametres, valeurs par défaut :
+      if graph.Tri != '' and graph.Tri != 'N':
+         print ' <A> TRI non traité au format XMGRACE'
+
+      grace=Graph.ImprXmgrace(graph,nomfich,dico_formats)
+      grace.Pilote=args['PILOTE']
+      grace.Trace()
+
+   # 2.39. Format inconnu
+   else:
+      raise aster.error,'<S> <IMPR_FONCTION> Format inconnu : '+FORMAT
+
+   #----------------------------------------------
+   # 9. Fin
+   return ier
diff --git a/Aster/Cata/Macro/lire_fonction_ops.py b/Aster/Cata/Macro/lire_fonction_ops.py
new file mode 100644 (file)
index 0000000..f4d92ce
--- /dev/null
@@ -0,0 +1,219 @@
+#@ MODIF lire_fonction_ops Macro  DATE 16/06/2004   AUTEUR DURAND C.DURAND 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
+# (AT YOUR OPTION) ANY LATER VERSION.                                                  
+#                                                                       
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
+#                                                                       
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
+# ======================================================================
+
+import string,os,Numeric
+
+
+######################################################################
+####  méthode de construction du VALE pour le format libre
+######################################################################
+def m_format_libre(texte,INDIC_PARA,INDIC_RESU,SEPAR):
+
+  # format LIBRE
+  # Les lignes contenant autre chose que des séquences de nombres
+  # réels et de séparateurs sont considérées comme délimitant deux
+  # fonctions différentes. Cette situation correspond à l exception
+  # ValueError levée par le map de float. Le deuxieme indice de
+  # INDIC_PARA et INDIC_RESU est l indice permettant de pointer sur la
+  # fonction voulue, au sens de ce découpage.
+
+  from Utilitai.transpose import transpose
+  l_fonc=[]
+  fonc  =[]
+  ier   =0
+  if SEPAR=='None' : SEPAR=None
+  for line in texte :
+     try :
+            if string.strip(line)=='' : raise ValueError
+            fonc.append(map(float,string.split(line,SEPAR)))
+     except ValueError:
+            if fonc==[] : pass  # dans ce cas, on a plusieurs lignes délimitant 2 fonctions
+            else        :
+                          l_fonc.append(Numeric.array(fonc))
+                          fonc=[]
+  if fonc!=[] :
+     l_fonc.append(Numeric.array(fonc))
+
+  # vérifications de cohérences lignes et colonnes
+  ind_para=[INDIC_PARA[0]-1,INDIC_PARA[1]-1]
+  ind_resu=[INDIC_RESU[0]-1,INDIC_RESU[1]-1]
+  if INDIC_PARA[0]>len(l_fonc) :
+     ier=ier+1
+     message=        "<F> <LIRE_FONCTION> INDIC_PARA :le nombre de blocs de fonctions dans "
+     message=message+"le fichier est inférieur à "+str(INDIC_PARA[0])
+     return ier,message,[]
+  if INDIC_RESU[0]>len(l_fonc) :
+     ier=ier+1
+     message=        "<F> <LIRE_FONCTION> INDIC_RESU :le nombre de blocs de fonctions dans "
+     message=message+"le fichier est inférieur à "+str(INDIC_RESU[0])
+     return ier,message,[]
+  if INDIC_PARA[1]>len(l_fonc[ind_para[0]]) :
+     ier=ier+1
+     message=        "<F> <LIRE_FONCTION> INDIC_PARA :la fonction numéro "
+     message=message+str(INDIC_PARA[0])
+     message=message+" ne comporte que "+str(l_fonc[INDIC_PARA[0]])+" colonnes"
+     return ier,message,[]
+  if INDIC_RESU[1]>len(l_fonc[ind_resu[0]]) :
+     ier=ier+1
+     message=        "<F> <LIRE_FONCTION> INDIC_RESU :la fonction numéro "
+     message=message+str(INDIC_RESU[0])
+     message=message+" ne comporte que "+str(l_fonc[INDIC_RESU[0]])+" colonnes"
+     return ier,message,[]
+
+  # construction du VALE de la fonction par recherche des indices
+  # de colonnes et de fonctions dans le tableau l_fonc
+  vale_1=l_fonc[ind_para[0]][:,ind_para[1]]
+  vale_2=l_fonc[ind_resu[0]][:,ind_resu[1]]
+  if len(vale_1)!=len(vale_2) :
+     ier=ier+1
+     message=        "<F> <LIRE_FONCTION> INDIC_RESU :les deux colonnes demandées "
+     message=message+" pour INDIC_PARA et INDIC_RESU n ont pas la meme longueur :"
+     message=message+str(len(vale_1))+" et "+str(len(vale_2))
+     return ier,message,[]
+  liste_vale=transpose([vale_1,vale_2])
+  def add(x,y):return x+y
+  liste_vale=reduce(add,liste_vale)
+  return ier,'',liste_vale
+
+######################################################################
+####  recherche d une liste simple
+######################################################################
+def liste_simple(texte,INDIC_PARA,SEPAR):
+
+  # format LIBRE
+  # liste simple
+
+  l_fonc=[]
+  fonc  =[]
+  ier   =0
+  if SEPAR=='None' : SEPAR=None
+  for line in texte :
+     try :
+            if string.strip(line)=='' : raise ValueError
+            fonc.append(map(float,string.split(line,SEPAR)))
+     except ValueError:
+            if fonc==[] : pass  # dans ce cas, on a plusieurs lignes délimitant 2 fonctions
+            else        :
+                          l_fonc.append(Numeric.array(fonc))
+                          fonc=[]
+  if fonc!=[] :
+     l_fonc.append(Numeric.array(fonc))
+
+  # vérifications de cohérences lignes et colonnes
+  ind_para=[INDIC_PARA[0]-1,INDIC_PARA[1]-1]
+  if INDIC_PARA[0]>len(l_fonc) :
+     ier=ier+1
+     message=        "<F> <LIRE_FONCTION> INDIC_PARA :le nombre de blocs de fonctions dans "
+     message=message+"le fichier est inférieur à "+str(INDIC_PARA[0])
+     return ier,message,[]
+  if INDIC_PARA[1]>len(l_fonc[ind_para[0]]) :
+     ier=ier+1
+     message=        "<F> <LIRE_FONCTION> INDIC_PARA :la fonction numéro "
+     message=message+str(INDIC_PARA[0])
+     message=message+" ne comporte que "+str(l_fonc[INDIC_PARA[0]])+" colonnes"
+     self.cr.fatal(message)
+     return ier,message,[]
+
+  # construction du VALE de la fonction par recherche des indices
+  # de colonnes et de fonctions dans le tableau l_fonc
+  vale_1=l_fonc[ind_para[0]][:,ind_para[1]]
+  return ier,'',vale_1.tolist()
+
+######################################################################
+####  méthode corps de la macro
+######################################################################
+def lire_fonction_ops(self,FORMAT,TYPE,SEPAR,INDIC_PARA,UNITE,
+                      NOM_PARA,NOM_RESU,INTERPOL,PROL_DROITE,
+                      PROL_GAUCHE,VERIF,INFO,TITRE,**args):
+  ier=0
+
+  from Accas import _F
+# On recopie le mot cle defi_fonction pour le proteger
+  if TYPE=='NAPPE' :
+     mc_DEFI_FONCTION=args['DEFI_FONCTION']
+
+  # On importe les definitions des commandes a utiliser dans la macro
+  DEFI_FONCTION  =self.get_cmd('DEFI_FONCTION')
+  DEFI_NAPPE     =self.get_cmd('DEFI_NAPPE')
+
+  # La macro compte pour 1 dans la numerotation des commandes
+  self.set_icmd(1)
+
+  # Lecture de la fonction dans un fichier d unité logique UNITE
+  
+  file="./fort."+str(UNITE)
+  if not os.path.isfile(file) :
+     ier=ier+1
+     self.cr.fatal("<F> <LIRE_FONCTION> le fichier d unité logique "+str(UNITE)+" est introuvable")
+     return ier
+  file=open(file,'r')
+  texte=file.readlines()
+  file.close()
+
+  self.DeclareOut('ut_fonc',self.sd)
+
+  if   TYPE=='FONCTION':
+    # mise en forme de la liste de valeurs suivant le format choisi :
+    ier,message,liste_vale=m_format_libre(texte,INDIC_PARA,args['INDIC_RESU'],SEPAR)
+    if ier!=0 :
+       self.cr.fatal(message)
+       return ier
+
+    # création de la fonction ASTER :
+    ut_fonc=DEFI_FONCTION( NOM_PARA   =NOM_PARA,
+                           NOM_RESU   =NOM_RESU,
+                           PROL_DROITE=PROL_DROITE,
+                           PROL_GAUCHE=PROL_GAUCHE,
+                           INTERPOL   =INTERPOL,
+                           INFO       =INFO,
+                           TITRE      =TITRE,
+                           VERIF      =VERIF,
+                           VALE       =liste_vale,)
+
+  elif TYPE=='NAPPE':
+
+    # création de la nappe ASTER :
+    motscles={}
+    motscles['DEFI_FONCTION']=[]
+    for elem in mc_DEFI_FONCTION:
+       ier,message,liste_vale=m_format_libre(texte,args['INDIC_ABSCISSE'],elem['INDIC_RESU'],SEPAR)
+       if ier!=0 :
+          self.cr.fatal(message)
+          return ier
+       motscles['DEFI_FONCTION'].append( _F( VALE       =liste_vale,
+                                             INTERPOL   =args['INTERPOL_FONC'],
+                                             PROL_DROITE=args['PROL_DROITE_FONC'],
+                                             PROL_GAUCHE=args['PROL_GAUCHE_FONC']  ) ) 
+    ier,message,liste_para=liste_simple(texte,INDIC_PARA,SEPAR)
+    if ier!=0 :
+       self.cr.fatal(message)
+       return ier
+    ut_fonc=DEFI_NAPPE( PARA            =liste_para,
+                        NOM_PARA        =NOM_PARA,
+                        NOM_PARA_FONC   =args['NOM_PARA_FONC'],
+                        NOM_RESU        =NOM_RESU,
+                        PROL_DROITE     =PROL_DROITE,
+                        PROL_GAUCHE     =PROL_GAUCHE,
+                        INTERPOL        =INTERPOL,
+                        INFO            =INFO,
+                        TITRE           =TITRE,
+                        VERIF           =VERIF,
+                        **motscles)
+
+  return ier
diff --git a/Aster/Cata/Macro/lire_table_ops.py b/Aster/Cata/Macro/lire_table_ops.py
new file mode 100644 (file)
index 0000000..af584db
--- /dev/null
@@ -0,0 +1,174 @@
+#@ MODIF lire_table_ops Macro  DATE 06/07/2004   AUTEUR CIBHHPD S.VANDENBERGHE 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
+# (AT YOUR OPTION) ANY LATER VERSION.                                                  
+#                                                                       
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
+#                                                                       
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
+# ======================================================================
+
+import string
+
+
+######################################################################
+####  méthode de construction du dictionnaire
+####  PARAMETRE / LISTE DE VALEURS
+######################################################################
+def lecture_table(texte,nume,separ):
+
+  # format ASTER
+  # Les lignes contenant autre chose que des séquences de nombres
+  # réels et de séparateurs sont considérées comme délimitant deux
+  # fonctions différentes. Cette situation correspond à l exception
+  # ValueError levée par le map de float. Le deuxieme indice de
+  # VALE_PARA et VALE_RESU est l indice permettant de pointer sur la
+  # fonction voulue, au sens de ce découpage.
+
+  from Utilitai.transpose import transpose
+  if string.strip(separ)=='' : separ=None
+  tab_lue={}
+  nume_lign=[]
+  idt_deb='#DEBUT_TABLE\n'
+  idt_fin='#FIN_TABLE\n'
+  idt_tit='#TITRE'
+  if nume>texte.count(idt_deb) :
+     message=        "<F> <CREA_TABLE> NUME_TABLE :le nombre de blocs de tables dans "
+     message=message+"le fichier est "+str(texte.count(idt_deb))
+     return 1,message,None,None,None
+  for i in range(nume):
+     texte=texte[texte.index(idt_deb)+1:]
+  texte=texte[:texte.index(idt_fin)]
+
+  titre_tab=[string.rstrip(elem[7:-1]) for elem in texte if elem.find(idt_tit)!=-1]
+  texte_tab=[elem.split(separ) for elem in texte if elem.find(idt_tit)==-1]
+
+  if ( separ!=None) :
+     tab_trav=[]
+     for line in texte_tab :
+        ligne=[]
+        for elem in line :
+           if ( elem != '' and elem !='\n') :
+              ligne.append(string.strip(elem))
+        tab_trav.append(ligne)
+     texte_tab=tab_trav
+
+  list_para=texte_tab[0]
+  list_type=texte_tab[1]
+  texte_tab.pop(0)
+  texte_tab.pop(0)
+  nb_para=len(texte_tab[0])
+
+  for line in texte_tab :
+    if len(line)!=nb_para :
+       message=        "<F> <CREA_TABLE> incoherence dans le nombre de colonnes "
+       message=message+"de la table a lire"
+       return 1,message,None,None,None
+  texte_tab=transpose(texte_tab)
+  for i in range(nb_para):
+    tab_trav=[]
+    list_val=[]
+    col_type=list_type[i]
+    if col_type=='R':
+       try              : 
+              texte_tab[i]=map(float,texte_tab[i])
+              nume_lign.append([0])
+       except ValueError:
+# Presence de - dans la ligne
+              for indice in range(len(texte_tab[i])):
+                        if texte_tab[i][indice]!='-':
+                             tab_trav.append(indice+1)
+                             list_val.append(float(texte_tab[i][indice]))
+                             
+              nume_lign.append(tab_trav)
+              texte_tab[i]=list_val
+    elif col_type=='I' :
+       try              :
+              texte_tab[i]=map(int,texte_tab[i])
+              nume_lign.append([0])
+# Presence de - dans la ligne
+       except ValueError:
+              for indice in range(len(texte_tab[i])):
+                        if texte_tab[i][indice]!='-':
+                             tab_trav.append(indice+1)
+                             list_val.append(float(texte_tab[i][indice]))
+              nume_lign.append(tab_trav)
+              texte_tab[i]=list_val
+
+    else :
+       try              : nume_lign.append([0])
+       except ValueError: pass
+    
+    tab_lue[list_para[i]]=(list_type[i],texte_tab[i],nume_lign[i])
+
+  return 0,None,titre_tab,list_para,tab_lue
+
+######################################################################
+####  méthode corps de la macro LIRE_TABLE
+######################################################################
+def lire_table_ops(self,UNITE,FORMAT,NUME_TABLE,SEPARATEUR,
+                        TYPE_TABLE,PARA,TITRE,**args):   
+  from Accas import _F
+  import os
+
+  ier=0
+  ### On importe les definitions des commandes a utiliser dans la macro
+  CREA_TABLE  =self.get_cmd('CREA_TABLE')
+
+  ### La macro compte pour 1 dans la numerotation des commandes
+  self.set_icmd(1)
+
+  ### Lecture de la table dans un fichier d unité logique UNITE
+  file="./fort."+str(UNITE)
+  if not os.path.isfile(file) :
+     ier=ier+1
+     self.cr.fatal("<F> <LIRE_TABLE> le fichier d unité logique "+str(UNITE)+" est introuvable")
+     return ier
+  file=open(file,'r')
+  texte=file.readlines()
+  file.close()
+
+  ### mise en forme de la liste de valeurs suivant le format choisi :
+  if FORMAT=='ASTER':
+    ier,message,titr_tab,list_para,tab_lue=lecture_table(texte,NUME_TABLE,SEPARATEUR)
+    if ier!=0 :
+       self.cr.fatal(message)
+       return ier
+  else                : pass
+
+  ### création de la table ASTER :
+  self.DeclareOut('ut_tab',self.sd)
+  mcfact=[]
+  num_col=0
+  for tab_para in list_para:
+    mcsimp={}
+    mcsimp['PARA']=tab_para
+
+    if tab_lue[tab_para][2] != [0] :
+       mcsimp['NUME_LIGN']=tab_lue[tab_para][2]
+       
+    if tab_lue[tab_para][0] not in ('I','R') :
+       mcsimp['TYPE_K'] =tab_lue[tab_para][0]
+       mcsimp['LISTE_K']=tab_lue[tab_para][1]
+    elif tab_lue[tab_para][0]=='I' :
+       mcsimp['LISTE_I']=tab_lue[tab_para][1]
+    elif tab_lue[tab_para][0]=='R' :
+       mcsimp['LISTE_R']=tab_lue[tab_para][1]
+
+    mcfact.append( _F(**mcsimp) )
+    num_col = num_col + 1
+  motscles={}
+  motscles['LISTE']=mcfact
+
+  ut_tab=CREA_TABLE(TITRE=titr_tab,TYPE_TABLE=TYPE_TABLE, **motscles)
+
+  return ier
diff --git a/Aster/Cata/Macro/macr_ascouf_calc_ops.py b/Aster/Cata/Macro/macr_ascouf_calc_ops.py
new file mode 100644 (file)
index 0000000..4a590f1
--- /dev/null
@@ -0,0 +1,680 @@
+#@ MODIF macr_ascouf_calc_ops Macro  DATE 17/08/2004   AUTEUR DURAND C.DURAND 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
+# (AT YOUR OPTION) ANY LATER VERSION.                                                  
+#                                                                       
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
+#                                                                       
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
+# ======================================================================
+def macr_ascouf_calc_ops(self,TYPE_MAILLAGE,CL_BOL_P2_GV,MAILLAGE,MODELE,CHAM_MATER,CARA_ELEM,
+                              FOND_FISS,CHARGE,RESU_THER,AFFE_MATERIAU,
+                              PRES_REP,ECHANGE,TORS_P1,COMP_INCR,COMP_ELAS,
+                              SOLVEUR,CONVERGENCE,NEWTON,RECH_LINEAIRE,
+                              INCREMENT,THETA_3D,IMPR_TABLE,IMPRESSION,INFO,TITRE ,**args):          
+  """
+     Ecriture de la macro MACR_ASCOUF_CALC
+  """
+  from Accas import _F
+  import types
+  import math
+  import aster
+  from math import pi,sin,cos,sqrt,atan2
+  ier=0
+# On recopie les mots cles affe_materiau et impr_table pour les proteger
+  mc_AFFE_MATERIAU=AFFE_MATERIAU
+  mc_IMPR_TABLE   =IMPR_TABLE
+  # On importe les definitions des commandes a utiliser dans la macro
+  AFFE_MODELE      =self.get_cmd('AFFE_MODELE'     )
+  AFFE_MATERIAU    =self.get_cmd('AFFE_MATERIAU'   )
+  AFFE_CARA_ELEM   =self.get_cmd('AFFE_CARA_ELEM'  )
+  AFFE_CHAR_THER_F =self.get_cmd('AFFE_CHAR_THER_F')
+  THER_LINEAIRE    =self.get_cmd('THER_LINEAIRE'   )
+  AFFE_CHAR_MECA   =self.get_cmd('AFFE_CHAR_MECA'  )
+  STAT_NON_LINE    =self.get_cmd('STAT_NON_LINE'   )
+  CALC_ELEM        =self.get_cmd('CALC_ELEM'       )
+  IMPR_RESU        =self.get_cmd('IMPR_RESU'       )
+  IMPR_TABLE       =self.get_cmd('IMPR_TABLE'      )
+  DEFI_FOND_FISS   =self.get_cmd('DEFI_FOND_FISS'  )
+  CALC_THETA       =self.get_cmd('CALC_THETA'      )
+  CALC_G_THETA_T   =self.get_cmd('CALC_G_THETA_T'  )
+  CALC_G_LOCAL_T   =self.get_cmd('CALC_G_LOCAL_T'  )
+  POST_RCCM        =self.get_cmd('POST_RCCM'  )
+  POST_RELEVE_T    =self.get_cmd('POST_RELEVE_T'  )
+
+  # La macro compte pour 1 dans la numerotation des commandes
+  self.set_icmd(1)
+#------------------------------------------------------------------
+# DATA
+  GRMAIL = ('COUDE','PEAUINT','PEAUEXT','EXTUBE','CLGV','FACE1','FACE2')
+#------------------------------------------------------------------
+#  
+  if CL_BOL_P2_GV!=None :
+    if TYPE_MAILLAGE=='SOUS_EPAIS_COUDE' :
+       print '<A> <MACR_ASCOUF_CALC> la condition aux limites sur bol a section conique'
+       print '                       est ignoree pour un coude avec sous-epaisseurs'
+    elif (TYPE_MAILLAGE[:4]!='FISS') and (CL_BOL_P2_GV['AZIMUT']!=None) :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASCOUF_CALC> mot-cle AZIMUT non autorise dans le cas d''un coude sain""")
+       return ier
+#
+  if mc_IMPR_TABLE!=None :
+    FLAG = 0
+    if (mc_IMPR_TABLE['NOM_PARA']==None) and (mc_IMPR_TABLE['POSI_ANGUL']==None) and (mc_IMPR_TABLE['POSI_CURV_LONGI']==None) :
+       ier=ier+1
+       self.cr.fatal("""<E> <MACR_ASCOUF_CALC> POSI_ANGUL POSI_CURV_LONGI est obligatoire""")
+       return ier
+    if (mc_IMPR_TABLE['NOM_PARA']!=None) :
+       impr_table_nom_para= mc_IMPR_TABLE['NOM_PARA']
+       for impt in impr_table_nom_para : 
+         if impt in ('SI_LONG','SI_CIRC','SI_RADI') :
+           FLAG = 1
+           if (((impt['ANGLE']==None) and (impt['POSI_ANGUL']==None) and (impt['R_CINTR'        ]==None)) or
+               ((impt['ANGLE']==None) and (impt['R_CINTR'   ]==None) and (impt['POSI_CURV_LONGI']==None))   )  :
+             ier=ier+1
+             self.cr.fatal("""<E> <MACR_ASCOUF_CALC> il faut renseigner : ANGLE, R_CINTR et POSI_ANGUL ou ANGLE, R_CINTR et POSI_CURV_LONGI""")
+             return ier
+    if (mc_IMPR_TABLE['NOM_PARA']==None) : FLAG = 1
+    if not FLAG : print '<A> <MACR_ASCOUF_CALC> ANGL_COUDE et ANGL_SOUS_EPAI sont inutiles dans ce cas'
+#
+#------------------------------------------------------------------
+#
+#     --- commande AFFE_MODELE ---
+#
+  self.DeclareOut('modele',MODELE)
+  mcfact=[]
+  if (PRES_REP!=None) and (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[:4]=='FISS') :
+     mcfact.append(_F(GROUP_MA=GRMAIL     ,PHENOMENE='MECANIQUE',MODELISATION='3D'    ))
+  else:
+     mcfact.append(_F(GROUP_MA=GRMAIL[:5] ,PHENOMENE='MECANIQUE',MODELISATION='3D'    ))
+  if TORS_P1!=None :
+     mcfact.append(_F(GROUP_MA='P1' ,PHENOMENE='MECANIQUE',MODELISATION='DIS_TR'))
+  if CL_BOL_P2_GV==None :
+     mcfact.append(_F(GROUP_MA='P2' ,PHENOMENE='MECANIQUE',MODELISATION='DIS_TR'))
+  modele = AFFE_MODELE( MAILLAGE = MAILLAGE ,
+                        AFFE     = mcfact    )
+  if ECHANGE!=None :                                # modele thermique
+     __modthe = AFFE_MODELE( MAILLAGE = MAILLAGE ,
+                             AFFE     = _F(TOUT        ='OUI',
+                                           PHENOMENE   ='THERMIQUE',
+                                           MODELISATION='3D' )       )
+#------------------------------------------------------------------
+#
+#     --- commande AFFE_MATERIAU ---
+#
+  if CHAM_MATER!=None : self.DeclareOut('affmat',CHAM_MATER)
+  mcfact=[]
+  for mater in mc_AFFE_MATERIAU :
+     if mater['TOUT']!=None :
+       mcfact.append(_F(TOUT    =mater['TOUT'    ],MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+       rccmat = mater['MATER']
+     else                   :
+       mcfact.append(_F(GROUP_MA=mater['GROUP_MA'],MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+       if    mater['GROUP_MA'][:5]=='COUDE' :
+         if TORS_P1!=None :
+           mcfact.append(_F(GROUP_MA='P1',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+           mcfact.append(_F(GROUP_MA='P2',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+         elif (len(mc_AFFE_MATERIAU)==1) and (CL_BOL_P2_GV==None) :
+           mcfact.append(_F(GROUP_MA='P2',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+       elif (mater['BOL'     ][:3]=='BOL'  ) and (CL_BOL_P2_GV==None) :
+         mcfact.append(_F(GROUP_MA='P2',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF']))
+  affmat = AFFE_MATERIAU( MAILLAGE = MAILLAGE ,
+                          MODELE   = modele ,
+                          AFFE     = mcfact    )
+#------------------------------------------------------------------
+#
+#     --- commande AFFE_CARA_ELEM ---
+#
+  if (TORS_P1!=None) or (CL_BOL_P2_GV==None) :
+    if CARA_ELEM!=None : self.DeclareOut('carael',CARA_ELEM)
+    motscles={}
+    motscles['DISCRET']=[]
+    if (TORS_P1!=None)      : motscles['DISCRET'].append(_F( GROUP_MA='P1' ,
+                                                             CARA    ='K_TR_D_N',
+                                                             VALE    = ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ) ),)
+    if (CL_BOL_P2_GV==None) : motscles['DISCRET'].append(_F( GROUP_MA='P2' ,
+                                                             CARA    ='K_TR_D_N',
+                                                             VALE    = ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ) ),)
+
+    carael = AFFE_CARA_ELEM( MODELE   = modele ,**motscles)
+#
+  if ECHANGE!=None :
+#------------------------------------------------------------------
+#
+#     --- commande AFFE_CHAR_THER_F ---
+#         condition aux limites
+#
+     __chther = AFFE_CHAR_THER_F( MODELE = __modthe ,
+                                  ECHANGE= _F(GROUP_MA='PEAUINT',
+                                              COEF_H  =ECHANGE['COEF_H'],
+                                              TEMP_EXT=ECHANGE['TEMP_EXT'],), )
+#------------------------------------------------------------------
+#
+#     --- calcul thermique ---
+#
+     if RESU_THER!=None : self.DeclareOut('resuth',RESU_THER)
+     mcsimp={}
+     if INCREMENT['NUME_INST_INIT']!=None : mcsimp['NUME_INIT']=INCREMENT['NUME_INST_INIT']
+     if INCREMENT['NUME_INST_FIN' ]!=None : mcsimp['NUME_FIN' ]=INCREMENT['NUME_INST_FIN' ]
+     mcfact=_F(LIST_INST=INCREMENT['LIST_INST'],**mcsimp)
+     resuth = THER_LINEAIRE( MODELE     = __modthe ,
+                             CHAM_MATER = affmat ,
+                             TEMP_INIT  = _F(STATIONNAIRE='OUI',),
+                             EXCIT      = _F(CHARGE=__chther,),
+                             INCREMENT  = mcfact, )
+#
+     if CHARGE!=None : self.DeclareOut('chmeth',CHARGE)
+     chmeth = AFFE_CHAR_MECA( MODELE        = modele ,
+                              TEMP_CALCULEE = resuth )
+#------------------------------------------------------------------
+#
+#     --- commande AFFE_CHAR_MECA ---
+#         condition aux limites de type raccord 3d-poutre
+#         ou bien blocage de mouvements rigides en cas d embout
+#         a section conique, bol de type gv
+#
+  motscles={}
+  motscles['LIAISON_ELEM']=[]
+  if TORS_P1!=None :
+    motscles['LIAISON_ELEM'].append(_F( OPTION    ='3D_POU'  ,
+                                         GROUP_MA_1='EXTUBE',
+                                         GROUP_NO_2='P1') )
+  if CL_BOL_P2_GV==None :
+    motscles['LIAISON_ELEM'].append(_F( OPTION    ='3D_POU'  ,
+                                         GROUP_MA_1='CLGV',
+                                         GROUP_NO_2='P2') )
+    motscles['DDL_IMPO'    ]=_F( GROUP_NO  ='P2' ,
+                                 DX        = 0.0 ,
+                                 DY        = 0.0 ,
+                                 DZ        = 0.0 ,
+                                 DRX       = 0.0 ,
+                                 DRY       = 0.0 ,
+                                 DRZ       = 0.0 , )
+  else :
+    motscles['FACE_IMPO'   ]=_F( GROUP_MA  ='CLGV' ,
+                                 DNOR      = 0.0 , )
+    ALPHA  = CL_BOL_P2_GV['ANGLE' ]
+    AZIM   = CL_BOL_P2_GV['AZIMUT']
+    ALPHAR = ALPHA*pi/180.0
+    AZIMR  = AZIM *pi/180.0
+    DDLB1  = []
+    COEFB1 = []
+    if (AZIM!=0.0) and (AZIM!=180.0) and (ALPHA!=90.0) :
+      DDLB1.append('DX')
+      COEFB1.append(SIN(AZIMR)*COS(ALPHAR))
+    if (AZIM!=90.0) :
+      DDLB1.append('DY')
+      COEFB1.append(COS(AZIMR))
+    if (AZIM!=0.) and (AZIM!=180.) and (ALPHA!=0.):
+      DDLB1.append('DZ')
+      COEFB1.append(-SIN(AZIMR)*SIN(ALPHAR))
+    POINT=['BOUT1',]*len(DDLB1)
+    motscles['LIAISON_DDL']=_F( GROUP_NO  = POINT  ,
+                                DDL       = DDLB1  ,
+                                COEF_MULT = COEFB1 ,
+                                COEF_IMPO = 0.0    , )
+
+  __conlim = AFFE_CHAR_MECA( MODELE   = modele ,**motscles)
+#
+#     --- commande AFFE_CHAR_MECA ---
+#         chargement mecanique :  pres_rep, effet de fond 
+#
+  if PRES_REP!=None :
+    motscles={}
+    if (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[:4]=='FISS') :
+      motscles['PRES_REP']=_F( GROUP_MA  = ('PEAUINT','FACE1','FACE2') ,
+                               PRES      = PRES_REP['PRES'] ,)
+    else :
+      motscles['PRES_REP']=_F( GROUP_MA  = 'PEAUINT',
+                               PRES      = PRES_REP['PRES'] ,)
+    if PRES_REP['EFFE_FOND_P1']!=None :
+      motscles['EFFE_FOND']=_F( GROUP_MA_INT  = 'BORDTU'  ,
+                                GROUP_MA      = 'EXTUBE'  ,
+                                PRES          = PRES_REP['PRES'] ,)
+#
+    __chpres = AFFE_CHAR_MECA( MODELE   = modele ,**motscles)
+#
+#     --- commande AFFE_CHAR_MECA ---
+#         chargement mecanique : torseur d efforts 
+#
+  if TORS_P1!=None :
+    __chtor = [None]*6
+    i=0
+    for tors in TORS_P1:
+      mcsimp={}
+      if tors['FX']!=None : mcsimp['FX']=tors['FX']
+      if tors['FY']!=None : mcsimp['FY']=tors['FY']
+      if tors['FZ']!=None : mcsimp['FZ']=tors['FZ']
+      if tors['MX']!=None : mcsimp['MX']=tors['MX']
+      if tors['MY']!=None : mcsimp['MY']=tors['MY']
+      if tors['MZ']!=None : mcsimp['MZ']=tors['MZ']
+      mcfact=_F(GROUP_NO='P1',**mcsimp)
+      __chtor[i] = AFFE_CHAR_MECA( MODELE       = modele ,
+                                   FORCE_NODALE = mcfact , )
+      i=i+1
+#
+#     --- commande STAT_NON_LINE ---
+#
+  motscles={}
+#
+  mcfex=[]  # mot clé facteur EXCIT
+  mcfex.append(_F(CHARGE=__conlim,))
+  if ECHANGE!=None :
+     mcfex.append(_F(CHARGE=chmeth,))
+  if PRES_REP!=None:
+    if PRES_REP['FONC_MULT']!=None :
+      mcfex.append(_F(CHARGE=__chpres,FONC_MULT=PRES_REP['FONC_MULT']))
+    else :
+      mcfex.append(_F(CHARGE=__chpres,))
+  if TORS_P1!=None:
+     i=0
+     for tors in TORS_P1 :
+       if tors['FONC_MULT']!=None :
+          mcfex.append(_F(CHARGE=__chtor[i],FONC_MULT=tors['FONC_MULT']))
+       else :
+          mcfex.append(_F(CHARGE=__chtor[i],))
+       i=i+1
+  motscles['EXCIT'] =mcfex
+#
+  mcfci=[]  # mot clé facteur COMP_INCR :obligatoire pour les noeuds discrets
+  if COMP_INCR!=None :
+    mcfci.append(_F(TOUT='OUI' ,RELATION=COMP_INCR['RELATION']))
+  elif COMP_ELAS!=None :
+    motscles['COMP_ELAS'] =_F(GROUP_MA='COUDE',RELATION=COMP_ELAS['RELATION'])
+    if TORS_P1!=None     : mcfci.append(  _F(GROUP_MA='P1',RELATION='ELAS'))
+    if CL_BOL_P2_GV==None: mcfci.append(  _F(GROUP_MA='P2',RELATION='ELAS'))
+  motscles['COMP_INCR'] =mcfci
+#
+  dSolveur=SOLVEUR[0].cree_dict_valeurs(SOLVEUR[0].mc_liste)
+  for i in dSolveur.keys():
+      if dSolveur[i]==None : del dSolveur[i]
+#
+  dConverg=CONVERGENCE[0].cree_dict_valeurs(CONVERGENCE[0].mc_liste)
+  for i in dConverg.keys():
+      if dConverg[i]==None : del dConverg[i]
+#
+  dNewton=NEWTON[0].cree_dict_valeurs(NEWTON[0].mc_liste)
+  for i in dNewton.keys():
+      if dNewton[i]==None : del dNewton[i]
+#
+  dRechlin=RECH_LINEAIRE[0].cree_dict_valeurs(RECH_LINEAIRE[0].mc_liste)
+  for i in dRechlin.keys():
+      if dRechlin[i]==None : del dRechlin[i]
+#
+  dIncrem=INCREMENT[0].cree_dict_valeurs(INCREMENT[0].mc_liste)
+  for i in dIncrem.keys():
+      if dIncrem[i]==None : del dIncrem[i]
+#
+  if TITRE!=None :
+    motscles['TITRE'        ] =TITRE
+  motscles  ['SOLVEUR'      ] =dSolveur
+  motscles  ['CONVERGENCE'  ] =dConverg
+  motscles  ['NEWTON'       ] =dNewton
+  motscles  ['RECH_LINEAIRE'] =dRechlin
+  motscles  ['INCREMENT'    ] =dIncrem
+  self.DeclareOut('nomres',self.sd)
+  nomres = STAT_NON_LINE( MODELE     = modele ,
+                          CHAM_MATER = affmat ,
+                          CARA_ELEM  = carael ,
+                          INFO       = INFO   , **motscles)
+#
+#     --- commande CALC_ELEM ---
+#
+  motscles = {}
+  if ECHANGE!=None :
+     motscles['EXCIT']=_F(CHARGE = chmeth)
+  nomres = CALC_ELEM( reuse      = nomres,
+                      RESULTAT   = nomres ,
+                      MODELE     = modele ,
+                      CHAM_MATER = affmat ,
+                      CARA_ELEM  = carael ,
+                      TOUT_ORDRE = 'OUI'  ,
+                      OPTION     = ('SIEF_ELNO_ELGA','EQUI_ELNO_SIGM') ,
+                      INFO       = INFO   , **motscles)
+#
+#     --- post-traitements ---
+#
+  if TYPE_MAILLAGE=='SOUS_EPAIS_COUDE':
+#
+#     --- post traitement sous-epaisseurs:  ligaments  ---
+#
+     if mc_IMPR_TABLE!=None:       
+#
+      SECT=('MI','TU','GV')
+      LIG=('FDRO','EXDR','EXTR','EXGA','FGAU','INGA','INTR','INDR')
+      if   mc_IMPR_TABLE['POSI_ANGUL']==None:
+         ASEP=(mc_IMPR_TABLE['POSI_CURV_LONGI']/mc_IMPR_TABLE['R_CINTR'])*(180./pi)
+      else :
+         ASEP=mc_IMPR_TABLE['POSI_ANGUL']
+#
+#     moyenne_rccm, invariant et moyenne sur les ligaments dans
+#     l epaisseur
+#
+      l_grno=MAILLAGE.LIST_GROUP_NO()
+      tablig=[None]*4
+#
+#     prelevements des ligaments circonferentiels et longitudinaux
+#     de la sous-epaisseur
+#
+      lgrno=[]
+      for tgrno in l_grno : 
+        if tgrno[0][:3] in ('CIR','LON')    : lgrno.append(tgrno[0])
+        elif tgrno[0][:5]=='PCENT'          : lgrno.append(tgrno[0])
+        elif (tgrno[0][:4] in LIG) and (tgrno[0][4:6] not in ('GV','TU','MI')): lgrno.append(tgrno[0])
+#
+      motscles={}
+      motscles['SEGMENT']=[]
+      for grno in lgrno : motscles['SEGMENT'].append(_F(INTITULE=grno,GROUP_NO=grno))
+      motscles['TITRE']='TABLE DE POST-TRAITEMENT SECTION SOUS-EPAISSEUR'
+      tablig[1]=POST_RCCM(MATER          = rccmat,
+                          MAILLAGE       = MAILLAGE,
+                          TYPE_RESU_MECA = 'EVOLUTION',
+                          OPTION         = 'PM_PB',
+                          TRANSITOIRE=_F(RESULTAT=nomres,
+                                         NOM_CHAM='SIEF_ELNO_ELGA',),**motscles)
+#
+      motscles={}
+      motscles['ACTION']=[]
+      for tgrno in lgrno : 
+         motscles['ACTION'].append(_F(RESULTAT=nomres,
+                                      NOM_CHAM='SIEF_ELNO_ELGA',
+                                      INTITULE=tgrno,
+                                      GROUP_NO=tgrno,
+                                      INVARIANT='OUI',
+                                      OPERATION='EXTRACTION',))
+      motscles['TITRE']='TABLE DE POST-TRAITEMENT SECTION SOUS-EPAISSEUR'
+      
+      tablig[2]=POST_RELEVE_T(**motscles)
+#
+      motscles={}
+      nommail=MAILLAGE.nom
+      coord   =aster.getvectjev(nommail.ljust(8)+'.COORDO    .VALE')
+      linomno =aster.getvectjev(nommail.ljust(8)+'.NOMNOE')
+      collgrno=aster.getcolljev(nommail.ljust(8)+'.GROUPENO')
+
+      motscles['ACTION']=[]
+      for tgrno in lgrno : 
+         if tgrno[:3]!='LON' :
+          if mc_IMPR_TABLE['TRANSFORMEE']=='TUBE': vecty=(0.,0.,1.)
+          else                                   : vecty=(sin(ASEP*pi/180.),0.,cos(ASEP*pi/180.))
+         else :
+          if mc_IMPR_TABLE['TRANSFORMEE']=='TUBE': vecty=(0.,0.,1.)
+          else :
+                 grpn=collgrno['FGAUTU  ']
+                 LT1=coord[3*(grpn[0]-1)+2]
+                 for node in grpn:
+                  X = coord[3*(node-1)]
+                  Y = coord[3*(node-1)+1]
+                  Z = coord[3*(node-1)+2]
+                  RCIN = mc_IMPR_TABLE['R_CINTR']
+                  if   Z<LT1                           : ANGSEC=0.
+                  elif X<(-1*RCIN) : ANGSEC=mc_IMPR_TABLE['ANGLE']*pi/180.
+                  else :
+                      VCOS = cos((-LT1-Z)/(sqrt((X+RCIN)**2+Y**2 )))
+                      VSIN = sin((-LT1-Z)/(sqrt((X+RCIN)**2+Y**2 )))
+                      ANGSEC = atan2(VSIN,VCOS)
+                 vecty=(sin(ANGSEC),0.,cos(ANGSEC))
+         motscles['ACTION'].append(_F(RESULTAT=nomres,
+                                      NOM_CHAM='SIEF_ELNO_ELGA',
+                                      INTITULE=tgrno,
+                                      GROUP_NO=tgrno,
+                                      NOM_CMP=('SIXX','SIYY','SIZZ','SIXY','SIXZ','SIYZ',),
+                                      REPERE='LOCAL',
+                                      VECT_Y=vecty,
+                                      OPERATION='MOYENNE',))
+      motscles['TITRE']='TABLE DE POST-TRAITEMENT SECTION SOUS-EPAISSEUR'
+      tablig[3]=POST_RELEVE_T(**motscles)
+#
+#     prelevements des ligaments sur les sections MI,TU et GV
+#     les 8 ligaments sont tous les 45 degres
+#
+      ACOUR = mc_IMPR_TABLE['ANGLE']*pi/180.0
+      secrcm=[None]*3
+      secinv=[None]*3
+      secmoy=[None]*3
+      for i in range(3):
+         if mc_IMPR_TABLE['TRANSFORMEE']=='TUBE': vecty=(0.,0.,1.)
+         else :
+             if i==0  : vecty=(sin(ACOUR/2.),0.,cos(ACOUR/2.))
+             if i==1  : vecty=(0.,0.,1.)
+             if i==2  : vecty=(sin(ACOUR),0.,cos(ACOUR))
+         motscles = {}
+         motscles['TITRE']='TABLE DE POST-TRAITEMENT MOYENNE RCCM SECTION '+SECT[i]
+#
+#        moyenne RCCM sur les sections MI,TU et GV
+#
+         motscles['SEGMENT']=[]
+         for j in range(8) : motscles['SEGMENT'].append(_F(INTITULE=LIG[j]+SECT[i],
+                                                           GROUP_NO=LIG[j]+SECT[i]))
+         secrcm[i] = POST_RCCM( MAILLAGE        = MAILLAGE ,
+                                MATER           = rccmat ,
+                                TYPE_RESU_MECA  = 'EVOLUTION' ,
+                                OPTION          = 'PM_PB' ,
+                                TRANSITOIRE     = _F(RESULTAT = nomres,NOM_CHAM='SIEF_ELNO_ELGA'),
+                                **motscles)
+#
+#        invariants sur les sections MI,TU et GV
+#
+         motscles = {}
+         motscles['TITRE']='TABLE DE POST-TRAITEMENT INVARIANTS SECTION '+SECT[i]
+         motscles['ACTION']=[]
+         for j in range(8) : motscles['ACTION'].append(_F(INTITULE =LIG[j]+SECT[i],
+                                                          GROUP_NO =LIG[j]+SECT[i],
+                                                          RESULTAT =nomres,
+                                                          NOM_CHAM ='SIEF_ELNO_ELGA',
+                                                          INVARIANT='OUI',
+                                                          OPERATION='EXTRACTION'))
+         secinv[i] = POST_RELEVE_T(**motscles)
+#
+#        moyennes contraintes sur les sections MI,TU et GV
+#
+         motscles = {}
+         motscles['TITRE']='TABLE DE POST-TRAITEMENT MOYENNE SECTION '+SECT[i]
+         motscles['ACTION']=[]
+         for j in range(8) : motscles['ACTION'].append(_F(INTITULE =LIG[j]+SECT[i],
+                                                          REPERE   ='LOCAL',
+                                                          VECT_Y   =vecty,
+                                                          GROUP_NO =LIG[j]+SECT[i],
+                                                          RESULTAT =nomres,
+                                                          NOM_CHAM ='SIEF_ELNO_ELGA',
+                                                          NOM_CMP  =('SIXX','SIYY','SIZZ','SIXY','SIXZ','SIYZ'),
+                                                          OPERATION='MOYENNE'))
+         secmoy[i] = POST_RELEVE_T(**motscles)
+
+#
+#     impression des valeurs maximales pour chaque sous-epaisseur
+#
+      if mc_IMPR_TABLE['TOUT_PARA']=='OUI' :
+             list_para=['TRESCA_MEMBRANE','TRESCA_MFLE','TRESCA','SI_LONG','SI_RADI','SI_CIRC']
+      else : list_para=mc_IMPR_TABLE['NOM_PARA']
+      if 'TRESCA_MEMBRANE' in list_para:
+        IMPR_TABLE(TABLE    = tablig[1],
+                   FILTRE   = _F( NOM_PARA  ='PM', CRIT_COMP ='MAXI'),
+                   NOM_PARA = ('INTITULE','PM'));
+      if 'TRESCA_MFLE'     in list_para:
+        IMPR_TABLE(TABLE    = tablig[1],
+                   FILTRE   =(_F( NOM_PARA ='LIEU',VALE_K   ='ORIG'),
+                              _F( NOM_PARA ='PMB', CRIT_COMP='MAXI'),),
+                   NOM_PARA = ('INTITULE','PMB'));
+        IMPR_TABLE(TABLE    = tablig[1],
+                   FILTRE   =(_F( NOM_PARA='LIEU', VALE_K  ='EXTR'),
+                              _F( NOM_PARA ='PMB', CRIT_COMP='MAXI'),),
+                   NOM_PARA = ('INTITULE','PMB'));
+      if 'SI_RADI'         in list_para:
+        IMPR_TABLE(TABLE    = tablig[3],
+                   FILTRE   =(_F( NOM_PARA='QUANTITE',VALE_K  ='MOMENT_0'),
+                              _F( NOM_PARA ='SIXX',   CRIT_COMP='MAXI'),),
+                   NOM_PARA = ('INTITULE','SIXX'));
+      if 'SI_LONG'         in list_para:
+        IMPR_TABLE(TABLE    = tablig[3],
+                   FILTRE   =(_F( NOM_PARA='QUANTITE',VALE_K  ='MOMENT_0'),
+                              _F( NOM_PARA ='SIYY',   CRIT_COMP='MAXI'),),
+                   NOM_PARA = ('INTITULE','SIYY'));
+      if 'SI_CIRC'         in list_para:
+        IMPR_TABLE(TABLE    = tablig[3],
+                   FILTRE   =(_F( NOM_PARA='QUANTITE',VALE_K  ='MOMENT_0'),
+                              _F( NOM_PARA ='SIZZ',   CRIT_COMP='MAXI'),),
+                   NOM_PARA = ('INTITULE','SIZZ'));
+      if 'TRESCA'          in list_para:
+        IMPR_TABLE(TABLE      = tablig[2],
+                   NOM_PARA   = ('INTITULE','NOEUD','TRESCA',),
+                   PAGINATION = 'INTITULE',
+                   FILTRE     = _F( NOM_PARA   = 'TRESCA',
+                                    CRIT_COMP  = 'MAXI'     ) )  ;
+#
+#     impression des resultats pour chaque sous-epaisseur
+#
+      if 'TRESCA_MEMBRANE' in list_para:
+        IMPR_TABLE(TABLE    = tablig[1],
+                   FILTRE   = _F( NOM_PARA='LIEU', VALE_K  ='ORIG'),
+                   NOM_PARA = ('INTITULE','PM'));
+      if 'TRESCA_MFLE'     in list_para:
+        IMPR_TABLE(TABLE    = tablig[1],
+                   FILTRE   = _F( NOM_PARA='LIEU', VALE_K  ='ORIG'),
+                   NOM_PARA = ('INTITULE','PMB'));
+        IMPR_TABLE(TABLE    = tablig[1],
+                   FILTRE   = _F( NOM_PARA='LIEU', VALE_K  ='EXTR'),
+                   NOM_PARA = ('INTITULE','PMB'));
+      if 'SI_RADI'         in list_para:
+        IMPR_TABLE(TABLE    = tablig[3],
+                   FILTRE   = _F( NOM_PARA='QUANTITE', VALE_K  ='MOMENT_0'),
+                   NOM_PARA = ('INTITULE','SIXX'));
+      if 'SI_LONG'         in list_para:
+        IMPR_TABLE(TABLE    = tablig[3],
+                   FILTRE   = _F( NOM_PARA='QUANTITE', VALE_K  ='MOMENT_0'),
+                   NOM_PARA = ('INTITULE','SIYY'));
+      if 'SI_CIRC'         in list_para:
+        IMPR_TABLE(TABLE    = tablig[3],
+                   FILTRE   = _F( NOM_PARA='QUANTITE', VALE_K  ='MOMENT_0'),
+                   NOM_PARA = ('INTITULE','SIZZ'));
+      if 'TRESCA'          in list_para:
+        IMPR_TABLE(TABLE      = tablig[2],
+                   NOM_PARA   = ('INTITULE','NOEUD','TRESCA',),
+                   PAGINATION = 'INTITULE');
+#
+#     impression des resultats pour les sections MI, TU et GV
+#
+      for k in range(3):
+       if 'TRESCA_MEMBRANE' in list_para:
+         IMPR_TABLE(TABLE    = secrcm[k],
+                    FILTRE   = _F( NOM_PARA='LIEU', VALE_K  ='ORIG'),
+                    NOM_PARA = ('INTITULE','PM'));
+       if 'TRESCA_MFLE'     in list_para:
+         IMPR_TABLE(TABLE    = secrcm[k],
+                    FILTRE   = _F( NOM_PARA='LIEU', VALE_K  ='ORIG'),
+                    NOM_PARA = ('INTITULE','PMB'));
+         IMPR_TABLE(TABLE    = secrcm[k],
+                    FILTRE   = _F( NOM_PARA='LIEU', VALE_K  ='EXTR'),
+                    NOM_PARA = ('INTITULE','PMB'));
+       if 'SI_RADI'         in list_para:
+         IMPR_TABLE(TABLE    = secmoy[k],
+                    FILTRE   = _F( NOM_PARA='QUANTITE', VALE_K  ='MOMENT_0'),
+                    NOM_PARA = ('INTITULE','SIXX'));
+       if 'SI_LONG'         in list_para:
+         IMPR_TABLE(TABLE    = secmoy[k],
+                    FILTRE   = _F( NOM_PARA='QUANTITE', VALE_K  ='MOMENT_0'),
+                    NOM_PARA = ('INTITULE','SIYY'));
+       if 'SI_CIRC'         in list_para:
+         IMPR_TABLE(TABLE    = secmoy[k],
+                    FILTRE   = _F( NOM_PARA='QUANTITE', VALE_K  ='MOMENT_0'),
+                    NOM_PARA = ('INTITULE','SIZZ'));
+       if 'TRESCA'          in list_para:
+         IMPR_TABLE(TABLE      = secinv[k],
+                    NOM_PARA   = ('INTITULE','NOEUD','TRESCA',),
+                    PAGINATION = 'INTITULE');
+#
+  if TYPE_MAILLAGE in ('FISS_COUDE','FISS_AXIS_DEB'):
+#
+#   --- post traitement fissure :  calcul de g ----
+#
+    motscles = {}
+    if FOND_FISS != None : self.DeclareOut('fonfis',FOND_FISS)
+    if TYPE_MAILLAGE =='FISS_COUDE' :
+       motscles['FOND_FISS']=_F(GROUP_NO='FONDFISS')
+       motscles['VECT_GRNO_ORIG']= ('PFOR','THOR')
+       motscles['VECT_GRNO_EXTR']= ('PFEX','THEX')
+    else :
+       motscles['FOND_FERME']=_F(GROUP_MA='FONDFISS',
+                                 GROUP_NO_ORIG='PFOR',
+                                 GROUP_MA_ORIG='MAIL_ORI')
+    fonfis=DEFI_FOND_FISS(MAILLAGE=MAILLAGE,
+                          LEVRE_SUP=_F(GROUP_MA='FACE1'),
+                          LEVRE_INF=_F(GROUP_MA='FACE2'),
+                          INFO=2,**motscles
+                          );
+    if THETA_3D!=None :
+      for thet in THETA_3D:
+        _nothet=CALC_THETA(MODELE=modele,
+                           FOND_FISS=fonfis,
+                           THETA_3D=_F(TOUT   = 'OUI',
+                                       MODULE = 1.,
+                                       R_INF  = thet['R_INF'],
+                                       R_SUP  = thet['R_SUP'],),
+                           );
+        motscles = {}
+        if mcfex!=[]:       motscles['EXCIT'] =mcfex
+        if COMP_INCR!=None : motscles['COMP_INCR']=_F(RELATION=COMP_INCR['RELATION'])
+        if COMP_ELAS!=None : motscles['COMP_ELAS']=_F(RELATION=COMP_ELAS['RELATION'])
+        _nogthe=CALC_G_THETA_T(MODELE     =modele,
+                               RESULTAT   =nomres,
+                               TOUT_ORDRE ='OUI',
+                               CHAM_MATER =affmat,
+                               THETA      =_nothet,
+                               **motscles);
+#
+        IMPR_TABLE(TABLE=_nogthe,);
+#
+      for thet in THETA_3D:
+        motscles = {}
+        if mcfex!=[]:       motscles['EXCIT'] =mcfex
+        if COMP_INCR!=None : motscles['COMP_INCR']=_F(RELATION=COMP_INCR['RELATION'])
+        if COMP_ELAS!=None : motscles['COMP_ELAS']=_F(RELATION=COMP_ELAS['RELATION'])
+        if   TYPE_MAILLAGE =='FISS_COUDE' :
+                             motscles['LISSAGE_THETA']='LEGENDRE'
+                             motscles['LISSAGE_G']    ='LEGENDRE'
+        elif TYPE_MAILLAGE =='FISS_AXIS_DEB' :
+                             motscles['LISSAGE_THETA']='LAGRANGE'
+                             motscles['LISSAGE_G']    ='LAGRANGE'
+        _nogloc=CALC_G_LOCAL_T(MODELE     =modele,
+                               RESULTAT   =nomres,
+                               TOUT_ORDRE ='OUI',
+                               CHAM_MATER =affmat,
+                               FOND_FISS  =fonfis,
+                               DEGRE      = 4,
+                               R_INF      = thet['R_INF'],
+                               R_SUP      = thet['R_SUP'],
+                               **motscles);
+
+        IMPR_TABLE(TABLE=_nogloc,);
+#
+#     --- commande IMPR_RESU  ---
+#
+  if IMPRESSION!=None:
+    mcfresu =[]
+    motscles={}
+    if IMPRESSION['FORMAT']=='IDEAS' :
+                                  motscles['VERSION'   ]= IMPRESSION['VERSION']
+    if IMPRESSION['FORMAT']=='CASTEM' :
+                                  motscles['NIVE_GIBI' ]= IMPRESSION['NIVE_GIBI']
+    mcfresu.append(_F(MAILLAGE=MAILLAGE,RESULTAT=nomres,))
+    if ECHANGE!=None:
+      motscles={}
+      if IMPRESSION['FORMAT']=='IDEAS' :
+                                    motscles['VERSION'   ]= IMPRESSION['VERSION']
+      if IMPRESSION['FORMAT']=='CASTEM' :
+                                    motscles['NIVE_GIBI' ]= IMPRESSION['NIVE_GIBI']
+      mcfresu.append(_F(RESULTAT=resuth,))
+    IMPR_RESU( MODELE = modele,
+               RESU   = mcfresu,
+               FORMAT=IMPRESSION['FORMAT'],**motscles)
+#
+  return ier
diff --git a/Aster/Cata/Macro/macr_ascouf_mail_ops.py b/Aster/Cata/Macro/macr_ascouf_mail_ops.py
new file mode 100644 (file)
index 0000000..e90913f
--- /dev/null
@@ -0,0 +1,2927 @@
+#@ MODIF macr_ascouf_mail_ops Macro  DATE 17/08/2004   AUTEUR DURAND C.DURAND 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
+# (AT YOUR OPTION) ANY LATER VERSION.                                                  
+#                                                                       
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
+#                                                                       
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
+# ======================================================================
+
+from math import sqrt,cos,sin,pi,tan,log,fabs,ceil,fmod,floor
+
+################################################################################
+################################################################################
+################################################################################
+#       Mathematical utility routines
+#       Copyright (C) 1999, Wesley Phoa
+#
+#       Reference: Numerical Recipes in C
+#       [[[[extraits]]]]
+
+class BracketingException(Exception):
+        pass
+
+class RootFindingException(Exception):
+        pass
+
+class MinimizationException(Exception):
+        pass
+
+GOLDEN = (1+5**.5)/2
+
+# 
+# MISCELLANEOUS
+#
+
+def sgn(x):
+        if x==0:
+                return 0
+        else:
+                return x/abs(x)
+
+#
+# UNIVARIATE ROOT FINDING
+#
+
+def bracket_root(f, interval, max_iterations=50):
+        """\
+Given a univariate function f and a tuple interval=(x1,x2),
+return a new tuple (bracket, fnvals) where bracket=(x1,x2)
+brackets a root of f and fnvals=(f(x1),f(x2)).
+        """
+        x1, x2 = interval
+        if x1==x2:
+                 raise BracketingException("initial interval has zero width")
+        elif x2<x1:
+                x1, x2 = x2, x1
+        f1, f2 = f(x1), f(x2)
+        for j in range(max_iterations):
+                while f1*f2 >= 0:  # not currently bracketed
+                        if abs(f1)<abs(f2):
+                                x1 = x1 + GOLDEN*(x1-x2)
+                        else:
+                                x2 = x2 + GOLDEN*(x2-x1)
+                        f1, f2 = f(x1), f(x2)
+                return (x1, x2), (f1, f2)
+        raise BracketingException("too many iterations")
+
+def ridder_root(f, bracket, fnvals=None, accuracy=1e-6, max_iterations=50):
+        """\
+Given a univariate function f and a tuple bracket=(x1,x2) bracketing a root,
+find a root x of f using Ridder s method. Parameter fnvals=(f(x1),f(x2)) is optional.
+        """
+        x1, x2 = bracket
+        if fnvals==None:
+                f1, f2 = f(x1), f(x2)
+        else:
+                f1, f2 = fnvals
+        if f1==0:
+                return x1
+        elif f2==0:
+                return x2
+        elif f1*f2>=0:
+                raise BracketingException("initial interval does not bracket a root")
+        x4 = 123456789.
+        for j in range(max_iterations):
+                x3 = (x1+x2)/2
+                f3 = f(x3)
+                temp = f3*f3 - f1*f2
+                x4, x4old = x3 + (x3-x1)*sgn(f1-f2)*f3/temp**.5, x4
+                f4 = f(x4)
+                if f1*f4<0:  # x1 and x4 bracket root
+                        x2, f2 = x4, f4
+                else:  # x4 and x2 bracket root
+                        x1, f1 = x4, f4
+                if min(abs(x1-x2),abs(x4-x4old))<accuracy or temp==0:
+                        return x4
+        raise RootFindingException("too many iterations")
+
+def root(f, interval=(0.,1.), accuracy=1e-4, max_iterations=50):
+        """\
+Given a univariate function f and an optional interval (x1,x2),
+find a root of f using bracket_root and ridder_root.
+        """
+        bracket, fnvals = bracket_root(f, interval, max_iterations)
+        return ridder_root(f, bracket, fnvals, accuracy, max_iterations)
+
+################################################################################
+################################################################################
+################################################################################
+def ASCFON(RC,RM,EP,ORIEN,AZIM,AXEC,POS,Y):
+#     FONCTION F(CP)=CC
+#     OU CC EST LA TAILLE DE LA FISSURE SUR LE COUDE 
+#     ET CP LA TAILLE DE FISSURE SUR LA PLAQUE
+  AZIMR = AZIM*2.*pi/360.
+  if POS=='DEB_INT': X = RM-EP/2.
+  else             : X = RM+EP/2.
+  if abs(ORIEN-45.0)<0.01: SIG =  1.
+  else                   : SIG = -1.
+  f_ASCFON = - SIG*X*RC/(2.*RM*sin(AZIMR)) * (                       \
+                  log ( RM/X+RM/RC*(cos(AZIMR)-                      \
+                         sin(AZIMR)*SIG*Y/(sqrt(2.)*RM)) +           \
+                        sqrt( 1.+( RM/X+RM/RC*(cos(AZIMR)-           \
+                         sin(AZIMR)*SIG*Y/(sqrt(2.)*RM)) )**2 )      \
+                       )                                             \
+                  - log ( RM/X+RM/RC*cos(AZIMR)                      \
+                       + sqrt( 1. +(RM/X+RM/RC*cos(AZIMR))**2)       \
+                                            )      )                 \
+               - SIG*X*RC/(2.*RM*SIN(AZIMR)) *                       \
+      (    ( RM/X+RM/RC* ( cos(AZIMR)-                               \
+                           sin(AZIMR)*SIG*Y/(sqrt(2.0)*RM) )         \
+                    )  * sqrt( 1. + ( RM/X+RM/RC*(cos(AZIMR)-        \
+                         sin(AZIMR)*SIG*Y/(SQRT(2.)*RM)) )**2 )      \
+                    - ( RM/X+RM/RC*COS(AZIMR) )                      \
+                       * sqrt( 1. +(RM/X+RM/RC*cos(AZIMR))**2)       \
+                                                  )                  \
+                    - 2.0*AXEC 
+  return f_ASCFON
+#
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL ASCFIS
+#     taille initiale du defaut fissure sur la plaque en
+#     fonction des donnees sur le coude ou le tube suivant la
+#     transformation choisie
+#
+#-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
+#
+#     ALPHA = ANGLE DU COUDE
+#     RM    = RAYON MOYEN DU COUDE
+#     RC    = RAYON DE CINTRAGE DU COUDE
+#     EP    = EPAISSEUR DU COUDE
+#     SUREP = VALEUR DE LA SUREPAISSEUR
+#     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)   
+#     AXEA  = PROFONDEUR FISSURE (DEMI PETIT AXE)
+#     AXEC  = DEMI GRAND AXE FISSURE
+#     AZIM  = POSITION AZIMUTALE DU CENTRE DE LA FISSURE 
+#     POS   = POSITION EN PEAU (EXTERNE OU INTERNE)
+#     SF    = ABCISSE CURVILIGNE LONGITUDINALE DU CENTRE DE LA FISSURE
+#     DSF   = BOOLEEN EXPRESSION POSITION CENTRE FISSURE 
+#     BETA  = POSITION ANGULAIRE DU CENTRE DE LA FISSURE
+#     ORIEN = ORIENTATION DE LA FISSURE
+#
+#----------------------DONNEES RENVOYEES-----------------------
+#
+#     AXEAP = PROFONDEUR DE LA FISSURE (PETIT AXE) SUR LA PLAQUE
+#     AXECP = LONGUEUR DE LA FISSURE (GRAND AXE) SUR LA PLAQUE
+#     SFP   = ABCISSE CURVILIGNE LONGITUDINALE CENTRE FISSURE
+#             SUR LA PLAQUE
+#
+def ASCFIS(ALPHA, RM, RC, EP, SUREP, GEOM, AXEA,
+           AXEC, AZIM, POS, SF, DSF, BETA, ORIEN):
+
+  if POS=='DEB_INT':
+     if (AZIM>=120.) and (AZIM<=240.0): X = RM-EP/2.0 - SUREP
+     else:                              X = RM-EP/2.0
+  else:                                 X = RM+EP/2.0
+  AZIMR = AZIM*2.0*pi/360.0 
+#
+# -- CALCUL COTE AXIALE DU CENTRE FISSURE SUR LA PLAQUE EN FONCTION
+#    DE L ABSCISSE CURVILIGNE DONNEE SUR LE COUDE OU DE LA POSITION
+#    ANGULAIRE 
+#
+  if DSF:
+    if GEOM=='COUDE': SFP = SF/(1.0+X/RC*cos(AZIMR))
+    else :            SFP = SF
+  else :
+    BETAR = BETA*2.0*pi/360.0
+    if (GEOM=='COUDE'):
+       SF  = BETAR*(RC+X*cos(AZIMR))
+       SFP = SF/(1.0+X/RC*cos(AZIMR))
+    else:
+       SF  = BETAR*RC
+       SFP = SF
+  if (GEOM=='COUDE'): print 'COTE AXIALE CENTRE FISSURE SUR COUDE : %.2f'%SF
+  if (GEOM=='TUBE') : print 'COTE AXIALE CENTRE FISSURE SUR TUBE  : %.2f'%SF 
+  print 'COTE AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP
+#
+#   ON ENVISAGE LE CAS OU UNE PARTIE DE L AXE EST DANS LES
+#   DROITES DES EMBOUTS. LA TRANSFORMATION N EST FAITE QUE SUR LA 
+#   PARTIE RESTANT DANS LE COUDE.
+#
+  if (GEOM=='COUDE'): DIST = ALPHA*2.0*pi/360.0*(RC+X*cos(AZIMR))
+  else              : DIST = ALPHA*2.0*pi/360.0*RC
+  BCOUD = 0.0
+  BEMB  = 0.0
+  if abs(ORIEN)<0.01:
+# -- FISSURE LONGITUDINALE (0 DEGRE)
+     BSUP = SF + AXEC
+     BINF = SF - AXEC
+     if BSUP>DIST:
+       BCOUD = DIST - BINF
+       BEMB  = BSUP - DIST
+     elif BINF<0. :
+       BCOUD = BSUP 
+       BEMB  = abs(BINF)
+     elif (BINF>=0. and BSUP<=DIST):
+       BCOUD = 2.0*AXEC
+  elif abs(ORIEN-90.)<0.01:
+# -- FISSURE CIRCONFERENTIELLE (90 DEGRES)
+     BSUP = SF
+     BINF = SF
+     if BSUP>DIST:
+       BCOUD = DIST - BINF
+       BEMB  = BSUP - DIST
+     elif BINF<0. :
+       BCOUD = BSUP 
+       BEMB  = abs(BINF)
+     elif (BINF>=0. and BSUP<=DIST):
+       BCOUD = 2.0*AXEC
+  else:
+# -- FISSURE A +/- 45 DEGRES SUR INTRADOS OU EXTRADOS
+     BSUP = SF + sqrt(2.0)/2.0*AXEC
+     BINF = SF - sqrt(2.0)/2.0*AXEC
+     if BSUP>DIST:
+       BCOUD = (DIST - BINF)*sqrt(2.0)
+       BEMB  = (BSUP - DIST)*sqrt(2.0)
+     elif BINF<0. :
+       BCOUD = BSUP *sqrt(2.0)
+       BEMB  = abs(BINF)*sqrt(2.0)
+     elif (BINF>=0. and BSUP<=DIST):
+       BCOUD = 2.0*AXEC
+  print 'PARTIE DU GRAND AXE DANS LE COUDE  : %.2f'%BCOUD
+  print 'PARTIE DU GRAND AXE DANS L EMBOUT  : %.2f'%BEMB
+#
+# -- CALCUL DE LA TAILLE DU GRAND AXE FISSURE SUR LA PLAQUE
+#
+  NEWT=0
+  if abs(ORIEN)<0.01:
+# -- FISSURE LONGITUDINALE (0 DEGRE)
+    if GEOM=='COUDE': AXECP = BCOUD/(1.0+X/RC*cos(AZIMR)) + BEMB
+    else            : AXECP = BCOUD + BEMB
+  elif abs(ORIEN-90.)<0.01:
+# -- FISSURE CIRCONFERENTIELLE (90 DEGRES)
+    AXECP = (BCOUD+BEMB)*RM/X
+  else :
+    if GEOM=='COUDE':
+#   ------- TRANSFORMATION COUDE
+       if AZIM in (0.,180.):
+# -- FISSURE A +/- 45 DEGRES SUR INTRADOS OU EXTRADOS
+          AXECP = BCOUD*RM*sqrt(2.)/( X*sqrt(1.+(RM/X+RM/RC*cos(AZIMR))**2) )+\
+                  BEMB*sqrt( (1.0+(X/RM)**2)*0.5 )
+       else :
+# -- FISSURE A +/- 45 DEGRES AILLEURS
+          AXECP = root(ASCFON,(BCOUD-1.,BCOUD+1.))
+          AXECP = AXECP + BEMB*sqrt( (1.+(X/RM)**2)*0.5 )
+          AXECC = ASCFON(AXECP)+BCOUD
+          NEWT=1
+    elif GEOM=='TUBE':
+       AXECP = (BCOUD+BEMB)*sqrt( (1.+(X/RM)**2)*0.5 ) 
+    else :
+       AXECP = BCOUD + BEMB
+#
+  if GEOM=='COUDE':
+    print 'TAILLE GRAND AXE COUDE DONNE : %.2f'%(2.*AXEC)
+  elif GEOM=='TUBE':
+    print 'TAILLE GRAND AXE TUBE  DONNE : %.2f'%(2.*AXEC)
+  print 'TAILLE GRAND AXE PLAQUE DEDUIT : %.2f'%AXECP
+  if NEWT:
+    print 'METHODE DE NEWTON FISSURE A 45 DEGRES -->'
+    print 'TAILLE GRAND AXE COUDE RECALCULE : %.2f'%AXECC
+  if GEOM=='COUDE' and BEMB>0. and BSUP>DIST :
+    SFP =  ALPHA*2.*pi*RC/360. - AXECP/2. + BEMB
+    print 'CORRECTION CENTRE : FISSURE A CHEVAL SUR EMBOUT'
+    print 'ABSC. CURV. AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP
+  if GEOM=='COUDE' and BEMB>0. and BINF<0. :
+    SFP = + AXECP/2. - BEMB
+    print 'CORRECTION CENTRE : FISSURE A CHEVAL SUR EMBOUT'
+    print 'ABSC. CURV. AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP
+#
+# -- CORRECTION DU PETIT AXE DE LA FISSURE QUAND CELLE-CI SE TROUVE SUR
+#    LA ZONE DE SUREPAISSEUR
+#
+  ALPHAR = ALPHA*2.*pi/360.
+  ZSUR1  = ALPHAR*RC/10.
+  ZSUR2  = ALPHAR*RC*9./10.
+  YFISS  = (AZIMR-pi/2.)*RM
+  MU = 0.
+  if (AZIM>=120.) and (AZIM<=240.):
+     if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = 1.
+     elif (SFP<=ZSUR1):                MU = SFP/ZSUR1
+     elif (SFP>ZSUR2):                 MU = (ALPHAR*RC-SFP)/ZSUR1
+  elif (AZIM>=90.) and (AZIM<=120.):
+     if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = YFISS/(pi/6.*RM) 
+     elif (SFP<=ZSUR1):                MU = YFISS*SFP/(pi/6.*RM*ZSUR1)
+     elif (SFP>ZSUR2):                 MU = YFISS*(ALPHAR*RC-SFP)/(pi/6.*RM*ZSUR1)
+  elif (AZIM>=240.) and (AZIM<=270.):
+     if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = (YFISS-5.*pi/6.*RM)/(pi/6.*RM) 
+     elif (SFP<=ZSUR1):                MU = (YFISS-5.*pi/6.*RM)*SFP/(pi/6.*RM*ZSUR1)
+     elif (SFP>ZSUR2):                 MU = (YFISS-5.*pi/6.*RM)*(ALPHAR*RC-SFP)/(pi/6.*RM*ZSUR1)
+#
+  if SUREP!=0.:
+     AXEAP = AXEA * EP / ( EP + MU*SUREP )
+     print '--> CORRECTION DUE A LA SUREPAISSEUR'     
+     print '--> TAILLE PETIT AXE PLAQUE : %.2f'%AXEAP
+  else: AXEAP = AXEA
+#
+  return AXEAP,AXECP,SFP 
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL ASCSEP
+#     taille initiale sur la plaque des sous-epaisseurs
+#
+#-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
+#
+#     ALPHA = ANGLE DU COUDE
+#     RM    = RAYON MOYEN DU COUDE
+#     RC    = RAYON DE CINTRAGE DU COUDE
+#     EP    = EPAISSEUR DU COUDE
+#     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)  
+#     SYME  = QUART DE STRUCTURE SI 'OUI'
+#    
+
+def ASCSEP(MCL_SOUS_EPAIS,ALPHA,RM,RC,EP,GEOM,SYME):
+  ier=0
+  CG=pi/180.
+#
+# --- BOUCLE SUR L ENSEMBLE DES SOUS-EPAISSEURS
+#
+  i=0
+  for ssep in MCL_SOUS_EPAIS :
+      i=i+1
+      print '-------------------------------------'
+      print 'SOUS-EPAISSEUR NUMERO %d'%i
+      print '-------------------------------------'
+#
+# --- CAS DES SOUS-EPAISSEURS AXISYMETRIQUES 
+#
+      if ssep['TYPE']=='AXIS':
+         print 'SOUS-EPAISSEUR AXISYMETRIQUE : '
+         print 'CALCUL DE LA TAILLE LONGI ENVELOPPE EN INTRADOS (AZIMUT PI)'
+         ssep.ICIRP = 2.*pi*RM
+         ssep.ISCP  =    pi*RM
+         ssep.IPHIC = 180.
+         AZIMC      = pi
+      else:
+#
+# -- CALCUL DE L ABSCISSE CURVILIGNE CIRCONF.SUR LA PLAQUE  
+#    EN FONCTION DE L AZIMUT OU DE L ABSCISSE CURVIL.CIRCONF
+#    SUR LE COUDE DU CENTRE DE LA SOUS-EPAISSEUR
+#    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
+#
+         if ssep['POSI_CURV_CIRC']!=None:
+           ssep.ISCP  = ssep['POSI_CURV_CIRC']*RM/(RM+EP/2.)
+           AZIMC      = ssep.ISCP/RM
+           ssep.IPHIC = ssep['POSI_CURV_CIRC']/(RM+EP/2.)*180./pi
+           print 'AZIMUT CENTRE SOUS-EPAISSEUR (DEGRES) : %.2f'%ssep.IPHIC
+         else:
+           ssep.ISCP  = ssep['AZIMUT']*pi*RM/180. 
+           AZIMC      = ssep['AZIMUT']*pi/180.
+           print 'ABSC. CURV. CIRCONF. CENTRE SOUS-EPAISSEUR SUR COUDE : %.2f'%(AZIMC*(RM+EP/2.))
+#
+#    PASSAGE DANS LE REPERE PLAQUE (0,2PI) AVEC ORIGINE FLANC DROIT
+#    CAR L ORIGINE DES DONNEES CIRCONF. EST EN EXTRADOS 
+#
+         if ssep.ISCP>(3.*pi*RM/2.): ssep.ISCP = ssep.ISCP - 3.*pi*RM/2.
+         else:                       ssep.ISCP = ssep.ISCP + pi*RM/2.
+         print 'ABSC. CURV. CIRCONF. CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISCP
+#
+# -- CALCUL DE LA TAILLE CIRCONFERENTIELLE 
+#    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
+#
+         ssep.ICIRP = ssep['AXE_CIRC']*(RM/(RM+EP/2.))
+         if ssep.ICIRP>(2.*pi*RM) :
+            print ' <MACR_ASCOUF_MAIL> ASCSEP valeur hors domaine'
+            print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero : %d'%i
+            print ' <MACR_ASCOUF_MAIL> taille axe circonferentiel : %.2f'%ssep.ICIRP
+            print ' <MACR_ASCOUF_MAIL> bord plaque : %.2f'%2*pi*RM
+            self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+            ier = ier+1
+            return ier
+         print 'TAILLE CIRCONFERENTIELLE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ICIRP
+         print '<=> TAILLE EQUIVALENTE SUR LA CIRCONFERENCE (DEGRES) : %.2f'%(ssep.ICIRP*360./(2.*pi*RM))  
+#
+# -- CALCUL COTE AXIALE DU CENTRE SOUS-EPAISSEUR SUR LA PLAQUE 
+#    EN FONCTION DE L ABSCISSE CURVILIGNE DONNEE SUR LE COUDE 
+#    OU DE LA POSITION ANGULAIRE
+#    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
+#
+      if ssep['POSI_CURV_LONGI']!=None:
+         if GEOM=='COUDE':
+            ssep.ISLP = ssep['POSI_CURV_LONGI']/(1.+(RM+EP/2.)/RC*cos(AZIMC))
+            AZIML     = ssep.ISLP/RC
+            print 'ANGLE COUDE CENTRE SOUS-EPAISSEUR (DEGRES) : %.2f'%(AZIML*180./pi)
+         else :
+            ssep.ISLP = ssep['POSI_CURV_LONGI']
+         if (SYME in ('QUART','DEMI')) and (ssep.ISLP!=ALPHA*CG*RC/2.) :
+            print ' <MACR_ASCOUF_MAIL> ASCSEP cas de symetrie :'
+            print ' <MACR_ASCOUF_MAIL> la sous-epaisseur doit etre dans la section mediane du coude !'
+            self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+            ier = ier+1
+            return ier
+      else :
+         if GEOM=='COUDE':
+            print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR COUDE : %.2f'%((ssep.BETA)*CG*(RC+(RM+EP/2.)*cos(AZIMC)))
+            AZIML = (ssep.BETA)*CG
+         else :
+            print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR TUBE  : %.2f'%((ssep.BETA)*CG*RC)
+         ssep.ISLP =  (ssep.BETA)*CG*RC
+         if (SYME in ('QUART','DEMI')) and (ssep.BETA!=ALPHA/2.) :
+            print ' <MACR_ASCOUF_MAIL> ASCSEP cas de symetrie :'
+            print ' <MACR_ASCOUF_MAIL> la sous-epaisseur doit etre dans la section mediane du coude !'
+            self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+            ier = ier+1
+            return ier
+      print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP
+#
+# -- CALCUL DE LA TAILLE LONGITUDINALE 
+#    NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE
+#
+#   ON ENVISAGE LE CAS OU UNE PARTIE DE L AXE EST DANS LES
+#   DROITES DES EMBOUTS. LA TRANSFORMATION N EST FAITE QUE SUR LA 
+#   PARTIE RESTANT DANS LE COUDE.
+#
+      if GEOM=='COUDE' : DIST = ALPHA*CG*(RC+(RM+EP/2.)*cos(AZIMC))
+      else             : DIST = ALPHA*CG*RC
+      if ssep['POSI_CURV_LONGI']!=None:
+         BSUP = ssep['POSI_CURV_LONGI']+ssep['AXE_LONGI']/2.
+         BINF = ssep['POSI_CURV_LONGI']-ssep['AXE_LONGI']/2.
+      else:
+         if GEOM=='COUDE' :
+            BSUP = ssep.BETA*CG*(RC+(RM+EP/2.)*cos(AZIMC))+ssep['AXE_LONGI']/2.
+            BINF = ssep.BETA*CG*(RC+(RM+EP/2.)*cos(AZIMC))-ssep['AXE_LONGI']/2.
+         else:
+            BSUP = ssep.BETA*CG*RC + ssep['AXE_LONGI']/2.
+            BINF = ssep.BETA*CG*RC - ssep['AXE_LONGI']/2.
+      BCOUD1 = 0.
+      BCOUD2 = 0.
+      BEMB1  = 0.
+      BEMB2  = 0.
+      if BINF<0. and BSUP>DIST :
+         BCOUD1 = DIST
+         BEMB1  =  abs(BINF) + BSUP-DIST
+      elif BSUP>DIST :
+         BCOUD1 = DIST - BINF
+         BEMB1  = BSUP - DIST
+      elif BINF<0 :
+         BCOUD2 = BSUP
+         BEMB2  = abs(BINF)
+      elif (BINF>=0. and BSUP<=DIST) :
+         BCOUD1 = ssep['AXE_LONGI']
+      BCOUD = BCOUD1+ BCOUD2
+      BEMB  = BEMB1 + BEMB2
+      if GEOM=='COUDE' : BPLAQ = BCOUD/(1.+(RM+EP/2.)/RC*cos(AZIMC))
+      else             : BPLAQ = BCOUD
+      ssep.ILONP = BPLAQ+BEMB
+      if BEMB1>0.:
+         ssep.ISLP =  ALPHA*CG*RC - ssep.ILONP/2. + BEMB1
+         print 'CORRECTION CENTRE : SOUS-EP. A CHEVAL SUR EMBOUT'
+         print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP
+      if BEMB2>0.:
+         ssep.ISLP =  ssep.ILONP/2. - BEMB2
+         print 'CORRECTION CENTRE : SOUS-EP. A CHEVAL SUR EMBOUT'
+         print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP
+      if ssep.ISLP<0.            : ssep.ISLP = 0.
+      if (ssep.ISLP>ALPHA*CG*RC) : ssep.ISLP = ALPHA*CG*RC 
+#
+#     SI LE CENTRE DE LA SOUS-EP CALCULE SUR LA PLAQUE EST DANS L EMBOUT
+#     ON CORRIGE SA POSITION EN LE METTANT A L INTERFACE SINON CA PLANTE
+#     DANS LA PROC DE MAILLAGE (A AMELIORER)
+#
+      print 'TAILLE LONGITUDINALE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ILONP
+      print '<=> TAILLE EQUIVALENTE PAR RAPPORT A L ANGLE DU COUDE (DEGRES): %.2f'%(ssep.ILONP*360/(2*pi*RC))  
+#
+  return ier
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL ASCTCI
+#     APPELEE DANS : ASCSYM et ASCPRE
+#     CALCUL TABLEAU TRIE DES ABSCISSES DES CENTRES DE SOUS-EPAISSEURS
+#
+#-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
+#
+#     RM    = RAYON MOYEN DU COUDE
+#
+#----------------------DONNEES RENVOYEES-----------------------
+#
+#     IABSC1 = CORRESPONDANCE ABSC. CURVI. CIRCONF. SOUS-EP. I
+#     IABSC2 = CORRESPONDANCE ABSC. GAUCHE ET DROITE CIRCONF. SOUS-EP. I
+#     COORXD = ABSC. DU BORD DROIT DE LA SOUS-EP I
+#     COORXG = ABSC. DU BORD GAUCHE DE LA SOUS-EP I
+#
+def ASCTCI(MCL_SOUS_EPAIS,RM):
+#
+# --- tri du tableau des abscisses curvilignes circonf. plaque
+#
+  TAMPON = []
+  COORXG = []
+  COORYG = []
+  i=0
+  for ssep in MCL_SOUS_EPAIS :
+      i=i+1
+      if (ssep.ISCP>2.*pi*RM) or (ssep.ISCP<0.) : 
+         print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
+         print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :%d'%MCL_SOUS_EPAIS.index(ssep)
+         print ' <MACR_ASCOUF_MAIL> ABSC. CURV. CIRCONF.  :%.2f'%ssep.ISCP
+         print ' <MACR_ASCOUF_MAIL> BORD PLAQUE :%.2f'%(2.*pi*RM)
+         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+         ier = ier+1
+         return ier
+      TAMPON.append((ssep.ISCP,i))
+  TAMPON.sort()
+  IABSC1=[]
+  for j in range(i):
+    IABSC1.append(TAMPON[j][1])
+  print
+  print 'TRI DES CENTRES ABSC. CURV. CIRCONF. :'
+  print '------------------------------------'
+  i=0
+  for ssep in TAMPON :
+    i=i+1
+    print '%d) SOUS-EP NO %d <> XC = %.2f'%(i,ssep[1],ssep[0])
+#
+# --- calcul des abcisses droites et gauches des sous-epaisseurs
+#
+  COORXD=[]
+  COORXG=[]
+  for bid in TAMPON :
+      XG=bid[0]-MCL_SOUS_EPAIS[bid[1]-1].ICIRP/2.
+      if XG<0.       : XG=XG+2.*pi*RM
+      COORXG.append(XG)
+      XD=bid[0]+MCL_SOUS_EPAIS[bid[1]-1].ICIRP/2.
+      if XD>2.*pi*RM : XD=XD-2.*pi*RM
+      COORXD.append(XD)
+#
+# --- tri des bornes d'intervalles en abscisse
+#
+  TAMPON = []
+  for j in range(len(MCL_SOUS_EPAIS)):
+    TAMPON.append((COORXG[j],2*j+1))
+    TAMPON.append((COORXD[j],2*j+2))
+  TAMPON.sort() 
+  IABSC2=[]
+  for j in range(2*len(MCL_SOUS_EPAIS)):
+    IABSC2.append(TAMPON[j][1])
+  print
+  print 'TRI DES INTERVALLES G ET D ABSC. CURV. CIRCONF. :'
+  print '-----------------------------------------------'  
+  for j in range(2*len(MCL_SOUS_EPAIS)):
+    if fmod(IABSC2[j],2):
+       print '%d) SOUS-EP NO %d <> XG = %.2f'%(j+1,IABSC1[IABSC2[j]/2],TAMPON[j][0])
+    else:
+       print '%d) SOUS-EP NO %d <> XD = %.2f'%(j+1,IABSC1[IABSC2[j]/2-1],TAMPON[j][0])
+#    
+  return TAMPON,IABSC1,IABSC2,COORXD,COORXG
+#
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL ASCTLO
+#     APPELEE DANS : ASCSYM et ASCPRE
+#     CALCUL TABLEAU TRIE DES ORDONNEES DES CENTRES DE SOUS-EPAISSEURS
+#
+#-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
+#
+#     RC     = RAYON MOYEN DU COUDE
+#     ALPHA  = ANGLE DU COUDE
+#     LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT
+#     LTCLIM  = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES
+#
+#----------------------DONNEES RENVOYEES-----------------------
+#
+#     IORDO1 = CORRESPONDANCE ORDO. CURVI. LONGIT. SOUS-EP. I
+#     IORDO2 = CORRESPONDANCE ORDO. GAUCHE ET DROITE LONGIT. SOUS-EP. I
+#     COORYI = ORDONNEE. DU BORD INTERIEUR DE LA SOUS-EP I
+#     COORYS = ORDONNEE. DU BORD SUPERIEUR DE LA SOUS-EP I
+#
+def ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM):
+#
+# tri du tableau des abscisses curvilignes axiales plaque
+#
+  ALPHAR = 2.*ALPHA*pi/360.
+  TAMPON = []
+  i=0
+  for ssep in MCL_SOUS_EPAIS :
+      i=i+1
+      if (ssep.ISLP>ALPHAR*RC) or (ssep.ISLP<0.) : 
+         print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
+         print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :%d'%MCL_SOUS_EPAIS.index(ssep)
+         print ' <MACR_ASCOUF_MAIL> ABSC. CURV. LONGIT.  :%.2f'%ssep.ISLP
+         print ' <MACR_ASCOUF_MAIL> BORDS PLAQUE :%.2f'%(ALPHAR*RC)
+         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+         ier = ier+1
+         return ier
+      TAMPON.append((ssep.ISLP,i))
+  TAMPON.sort()
+  IORDO1=[]
+  for j in range(i):
+    IORDO1.append(TAMPON[j][1])
+  print
+  print 'TRI DES CENTRES ABSC. CURV. LONGIT. :'
+  print '------------------------------------'
+  i=0
+  for ssep in TAMPON :
+    i=i+1
+    print '%d) SOUS-EP NO %d <> YC = %.2f'%(i,ssep[1],ssep[0])
+#
+# calcul des abscisses sup. et inf. des sous-ep.
+#
+  COORYI=[]
+  COORYS=[]
+  EPS=0.000000000001
+  for bid in TAMPON :
+      i=i+1
+      YI=bid[0]-MCL_SOUS_EPAIS[bid[1]-1].ILONP/2.
+      YS=bid[0]+MCL_SOUS_EPAIS[bid[1]-1].ILONP/2.
+      if fabs(bid[0])<EPS : 
+         YI=-(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.
+         YS=MCL_SOUS_EPAIS[bid[1]-1].ILONP-(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.
+      if fabs(bid[0]-ALPHAR*RC)<EPS :
+         YI=ALPHAR*RC-(MCL_SOUS_EPAIS[bid[1]-1].ILONP-(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.)
+         YS=ALPHAR*RC+(MCL_SOUS_EPAIS[bid[1]-1]['AXE_LONGI'])/2.
+      if YI<(-LTCHAR):
+         print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
+         print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :',bid[1]
+         print ' <MACR_ASCOUF_MAIL> BORD INFERIEUR  :',YI
+         print ' <MACR_ASCOUF_MAIL> BORD PLAQUE :',-LTCHAR
+         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+         ier = ier+1
+         return ier
+      if YS>(ALPHAR*RC+LTCLIM):
+         print ' <MACR_ASCOUF_MAIL> valeur hors domaine'
+         print ' <MACR_ASCOUF_MAIL> SOUS-EPAISSEUR NUMERO :',bid[1]
+         print ' <MACR_ASCOUF_MAIL> BORD INFERIEUR  :',YS
+         print ' <MACR_ASCOUF_MAIL> BORD PLAQUE :',ALPHAR*RC+LTCLIM
+         self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+         ier = ier+1
+         return ier
+      COORYI.append(YI) 
+      COORYS.append(YS)
+#
+# tri des bornes d'intervalles en abscisse
+#
+  TAMPON = []
+  for j in range(len(MCL_SOUS_EPAIS)):
+    TAMPON.append((COORYI[j],2*j+1))
+    TAMPON.append((COORYS[j],2*j+2))
+  TAMPON.sort() 
+  IORDO2=[]
+  for j in range(2*len(MCL_SOUS_EPAIS)):
+    IORDO2.append(TAMPON[j][1])      
+  print
+  print 'TRI DES INTERVALLES I ET S ABSC. CURV. LONGIT. :'
+  print '-----------------------------------------------'
+  for j in range(2*len(MCL_SOUS_EPAIS)):
+    if fmod(IORDO2[j],2):
+       print '%d) SOUS-EP NO %d <> YI = %.2f'%(j+1,IORDO1[IORDO2[j]/2],TAMPON[j][0])
+    else:
+       print '%d) SOUS-EP NO %d <> YS = %.2f'%(j+1,IORDO1[IORDO2[j]/2-1],TAMPON[j][0])
+#
+  return TAMPON,IORDO1,IORDO2,COORYI,COORYS
+#
+#
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL ASCNBE
+#     APPELEE DANS : ASCSYM et ASCPRE
+#     CALCUL DU NOMBRE D'ELEMENTS LONGI ET CIRCONF. DANS LES SOUS-EPAISSEURS
+#
+#-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
+#
+#     COORXG = ABSCISSE DU BORD GAUCHE DE LA SOUS-EPAISSEUR I
+#     COORXD = ABSCISSE DU BORD DROIT DE LA SOUS-EPAISSEUR I
+#     COORYI = ORDONNEE DU BORD INFERIEUR DE LA SOUS-EPAISSEUR I
+#     COORYS = ORDONNEE DU BORD SUPERIEUR DE LA SOUS-EPAISSEUR I
+#     BD     = ABSCISSE DU BORD DROIT DE LA ZONE CIRCONF J
+#     BG     = ABSCISSE DU BORD GAUCHE DE LA ZONE CIRCONF J
+#     BS     = ORDONNEE DU BORD SUPERIEUR DE LA ZONE LONGI J
+#     BI     = ORDONNEE DU BORD INFERIEUR DE LA ZONE LONGI J
+#     DNX    = DENSITE ET NOMBRE D'ELEMENTS CIRCONF. DE LA ZONE J
+#     DNY    = DENSITE ET NOMBRE D'ELEMENTS LONGIT. DE LA ZONE J
+#     INDSEX = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE CIRCONF J
+#     INDSEY = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE LONGI J
+#     RM     = RAYON MOYEN DU COUDE
+#     RC     = RAYON DE CINTRAGE DU COUDE
+#     IABSC1 = CORRESPONDANCE ABSCISSE CURVILIGNE CIRCONF. SOUS-EP. I
+#     IORDO1 = CORRESPONDANCE ABSCISSE CURVILIGNE LONGIT. SOUS-EP. I
+#
+#----------------------DONNEES RENVOYEES-----------------------
+#
+#     NLX = NOMBRE TOTAL D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR K
+#     NLY = NOMBRE TOTAL D'ELEMENTS LONGIT. DE LA SOUS-EPAISSEUR K
+#
+def ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI,DNX,DNY,RM,RC,
+           INDSEX,INDSEY,IABSC1,IORDO1):
+#
+#  calcul du nombre d'elements longi. et circonf. dans les sous-epaisseurs:
+#
+  print
+  print 'DETERMINATION DU NOMBRE D''ELEMENTS DANS LES SOUS-EPAISSEURS :'
+  print '------------------------------------------------------------'
+  NLX=[0]*len(MCL_SOUS_EPAIS)
+  NLY=[0]*len(MCL_SOUS_EPAIS)
+  for j in range(len(BD)):
+    if INDSEX[j]!=0:
+#      calcul au passage du nombre d'elements sur chaque zone circonf.   
+       RNBEL = (BD[j]-BG[j])*360./(DNX[2*j]*2.*pi*RM)
+       RNBEL2 = RNBEL - floor(RNBEL)
+       if RNBEL2 <= 0.5 : NBEL=int(floor(RNBEL))
+       else             : NBEL=int(floor(RNBEL))+1
+       if NBEL <= 1 :     NBEL=2
+#      calcul au passage du nombre d'elements sur chaque sous-epaisseur circonf.       
+       for i in range(len(MCL_SOUS_EPAIS)):
+         l=IABSC1[i]-1
+         if ((COORXG[l]<COORXD[l] and BG[j]>=COORXG[l] and BD[j]<=COORXD[l])\
+         or (COORXG[l]>=COORXD[l] and (BG[j]<=COORXG[l] or BD[j]>=COORXD[l]))):
+            NLX[i]=NLX[i]+NBEL
+            print 'SOUS-EP NO %d ZONE CIRC. NO %d NB ELEM. = %d'%(i+1,j+1,NBEL)
+
+  for j in range(len(BS)):
+    if INDSEY[j]!=0:
+#      calcul au passage du nombre d'elements sur chaque zone longi.      
+       RNBEL = ((BS[j]-BI[j])*360.)/(DNY[2*j]*2.*pi*RC)
+       RNBEL2 = RNBEL - floor(RNBEL)
+       if RNBEL2 <= 0.5 : NBEL=int(floor(RNBEL))
+       else             : NBEL=int(floor(RNBEL))+1
+       if NBEL <= 1 :     NBEL=2
+#      calcul au passage du nombre d'elements sur chaque sous-epaisseur circonf.       
+       i=0
+       for i in range(len(MCL_SOUS_EPAIS)):
+         l=IORDO1[i]-1
+         if (BI[j]>=COORYI[l] and BS[j]<=COORYS[l]):
+            NLY[i]=NLY[i]+NBEL
+            print 'SOUS-EP NO %d ZONE LONGI. NO %d NB ELEM. = %d'%(i+1,j+1,NBEL)
+
+  for j in range(len(NLX)):
+    print 'SOUS-EP NO %d NBE TOTAL ELEMENTS CIRCONF. : %d'%(j+1,NLX[j])
+    print 'SOUS-EP NO %d NBE TOTAL ELEMENTS LONGI.   : %d'%(j+1,NLY[j])
+
+#
+  return NLX,NLY
+#
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL ASCSYM
+#     PREPARATION DES DONNEES POUR LE MAILLAGE DE PLAQUE AVEC
+#     SOUS-EPAISSEURS :
+#     CAS D UNE SOUS-EPAISSEUR DANS LE PLAN DE SYMETRIE 
+#     CONSTRUCTION D UN QUART DU MAILLAGE
+#     - CALCUL TABLEAU TRIE DES ABSCISSES ET ORDONNEES DES CENTRES 
+#     - CALCUL TABLEAU DES ZONES COUVERTES PAR LES SOUS-EPAISSEURS
+#
+#-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
+#
+#     RM    = RAYON MOYEN DU COUDE
+#     RC    = RAYON DE CINTRAGE DU COUDE
+#     ALPHA = ANGLE DU COUDE
+#     LT    = LONGUEUR DE L EMBOUT DU COTE CHARGEMENT
+#     LGV   = LONGUEUR DE L EMBOUT DU COTE CONDITIONS AUX LIMITES
+#     NBSEP = NOMBRE DE SOUS-EPAISSEURS
+#
+#----------------------DONNEES RENVOYEES-----------------------
+#
+#     NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES
+#     NZONEY = NOMBRE DE ZONES LONGITUDINALES       
+#
+def ASCSYM(MCL_SOUS_EPAIS,RM,RC,ALPHA,LTCHAR,LTCLIM):
+  ier=0
+  DERAFC = 18.
+  DERAFL =  5.       
+  INDSEX = []
+  INDSEY = []
+  BG     = []
+  BD     = []
+  INDBG  = []
+  INDBD  = []
+  DNX    = []
+
+#
+# --- tri des donnees sous-ep. en circonferentiel
+  TAMPON,IABSC1,IABSC2,COORXD,COORXG=ASCTCI(MCL_SOUS_EPAIS,RM)
+#
+# --- calcul des zones en circonferentiel
+#
+  ssep=MCL_SOUS_EPAIS[0]
+  if (ssep.ISCP<pi*RM) :
+#
+#     le centre sous-ep est dans la zone flanc droit/extrados/flanc
+#     gauche, on preleve pi*RM a droite de la sous-epaisseur
+#
+#          zone (centre sous-ep , bord droit)
+#
+     BG.append(ssep.ISCP)
+     BG.append(ssep.ISCP+ssep.ICIRP/2.)
+     BD.append(ssep.ISCP+ssep.ICIRP/2.)
+     BD.append(ssep.ISCP+pi*RM)
+     INDBG.append(0)
+     INDBG.append(1)
+     INDBD.append(0)
+     INDBD.append(0)
+     DNX.append(ssep.IDENC)
+     DNX.append(0)
+     DNX.append(DERAFC)
+     DNX.append(0)
+     INDSEX.append(1)
+     INDSEX.append(0)
+  elif (ssep.ISCP+pi*RM==2.*pi*RM) :
+#
+#     sous-ep axisymetrique : on preleve pi*RM a droite
+#
+#       zone (centre sous-ep , bord droit)
+#
+     BG.append(ssep.ISCP)
+     BD.append(ssep.ISCP+ssep.ICIRP/2.)
+     INDBG.append(0)
+     INDBD.append(0)
+     DNX.append(ssep.IDENC)
+     DNX.append(0)
+     INDSEX.append(1)
+     INDSEX.append(0)
+  else :
+#
+#     le centre sous-ep est dans la zone flanc gauche/intrados/flanc 
+#     droit : on preleve pi*RM a gauche de la sous-epaisseur
+#
+#            zone (centre -pi*RM, bord gauche)
+#
+     BG.append(ssep.ISCP-pi*RM)
+     BG.append(ssep.ISCP-ssep.ICIRP/2.)
+     BD.append(ssep.ISCP-ssep.ICIRP/2.)
+     BD.append(ssep.ISCP)
+     INDBG.append(0)
+     INDBG.append(0)
+     INDBD.append(1)
+     INDBD.append(0)
+     DNX.append(DERAFC)
+     DNX.append(0)
+     DNX.append(ssep.IDENC)
+     DNX.append(0)     
+     INDSEX.append(0)
+     INDSEX.append(1)
+
+
+  print
+  print 'ZONES APRES RECOUVREMENT ABSC. CURV. CIRCONF. :'
+  print '---------------------------------------------'
+  EPS=0.000000000001
+  NZONEX=len(BG)
+  for j in range(NZONEX) :
+    if ( fabs(BG[j]) < EPS ) and ( fabs(BD[j]) < EPS ) :
+      print 'ZONE NO %d BORNE GAUCHE = %.2f'\
+      ' / BORNE DROITE = %.2f * SOUS-EPAISSEUR'%(j+1,BG[j],BD[j])
+    else:
+      print 'ZONE NO %d BORNE GAUCHE = %.2f'\
+      ' / BORNE DROITE = %.2f'%(j+1,BG[j],BD[j])
+
+    
+# tri des donnees sous-epaisseurs en axial
+  TAMPON,IORDO1,IORDO2,COORYI,COORYS=ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM)
+
+# calcul des zones en axial:
+  BI     = []
+  BS     = []
+  INDBI  = []
+  INDBS  = []
+  DNY    = []
+  INDSEY = []
+  ssep   = MCL_SOUS_EPAIS[0]
+  BI.append(0.)
+  BI.append(ssep.ISLP-ssep.ILONP/2.)
+  BS.append(ssep.ISLP-ssep.ILONP/2.)
+  BS.append(ssep.ISLP)
+  INDBI.append(0)  
+  INDBI.append(0)
+  INDBS.append(1)
+  INDBS.append(0)
+  DNY.append(DERAFL)
+  DNY.append(0)
+  DNY.append(ssep.IDENL)
+  DNY.append(0)
+  INDSEY.append(0)
+  INDSEY.append(1)
+  print
+  print 'ZONES APRES RECOUVREMENT ABSC. CURV. LONGIT. :'
+  print '-----------------------------------------------'
+  NZONEY=len(BI)
+  for j in range(NZONEY) :
+    if ( fabs(BI[j]) < EPS ) and ( fabs(BS[j]) < EPS ) :
+      print 'ZONE NO %d <> BORNE INF. = %.2f'\
+      ' / BORNE SUP. = %.2f * SOUS-EPAISSEUR'%(j+1,BI[j],BS[j])
+    else:
+      print 'ZONE NO %d <> BORNE INF. = %.2f'\
+      ' / BORNE SUP. = %.2f'%(j+1,BI[j],BS[j])
+# calcul du nombre d'elements longi. et circonf. dans les soue-ep
+  NLX,NLY=ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI,
+                 DNX,DNY,RM,RC,INDSEX,INDSEY,IABSC1,IORDO1)
+
+  return ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY
+################################################################################
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL ASCPRE
+#     PREPARATION DES DONNEES POUR LE MAILLAGE DE PLAQUE 
+#     SOUS-EPAISSEURS :
+#     - CALCUL TABLEAU TRIE DES ABSCISSES ET ORDONNEES DES CENTRES 
+#     - CALCUL TABLEAU DES ZONES COUVERTES PAR LES SOUS-EPAISSEURS
+#
+#-----------------DONNEES FOURNIES PAR L UTILISATEUR--------------------
+#
+#     RM    = RAYON MOYEN DU COUDE
+#     RC    = RAYON DE CINTRAGE DU COUDE
+#     ALPHA = ANGLE DU COUDE
+#     LT    = LONGUEUR DE L EMBOUT DU COTE CHARGEMENT
+#     LGV   = LONGUEUR DE L EMBOUT DU COTE CONDITIONS AUX LIMITES
+#     NBSEP = NOMBRE DE SOUS-EPAISSEURS
+#     SYME  = "QUART" DE STRUCTURE, "DEMI" STRUCTURE OU BIEN "ENTIER"
+#
+#----------------------DONNEES RENVOYEES-----------------------
+#
+#     NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES
+#     NZONEY = NOMBRE DE ZONES LONGITUDINALES       
+#
+def ASCPRE(MCL_SOUS_EPAIS,RM,RC,ALPHA,SYME,LTCHAR,LTCLIM):
+  ier=0
+  ALPHAR = 2.*ALPHA*pi/360.
+  DERAFC = 18.
+  DERAFL =  5.
+  EPSI   =  0.001      
+  NBSEP  = len(MCL_SOUS_EPAIS)
+  print 'RECHERCHE DES ZONES DE SOUS-EPAISSEURS DANS LE COUDE\n'
+  
+# tri des donnees sous-epaisseurs en circonferentiel
+  TAMPON,IABSC1,IABSC2,COORXD,COORXG=ASCTCI(MCL_SOUS_EPAIS,RM)
+# --- calcul des recouvrements de zones en circonferentiel
+#
+  NZONEX=0
+  j=0
+  ICE=1
+  NBGAU=0
+  NBDRO=0
+  TYPG=0
+  TYPD=0
+  go10=1
+  go20=1
+#
+  BG    =[]
+  BD    =[]
+  INDBG =[]
+  INDBD =[]
+  DNX   =[]
+  INDSEX=[]
+#
+  
+  while go10:
+   
+    j=j+1      
+#
+#   definition de la zone courante (borne gauche, borne droite)
+#    
+#   TYPG = type de la borne:
+#          0 : borne gauche sous-epaisseur
+#          1 : borne droite sous-epaisseur
+#          2 : centre sous-epaisseur
+#
+    if j>2*NBSEP and ICE<NBSEP :
+#     cas ou il ne reste plus que des centres a caser
+      MING = MIND
+      TYPG = TYPD
+      NUMG = NUMD
+      MIND = 2.*pi*RM+1
+    elif TYPD==2 :
+#     cas ou la borne droite de la zone precedente etait un centre
+      MING = MIND
+      TYPG = TYPD
+      NUMG = NUMD
+      MIND = TAMPON[j-1][0]
+      if fmod(IABSC2[j-1],2):
+        TYPD = 0
+        NUMD = IABSC1[IABSC2[j-1]/2]
+      else:
+        TYPD = 1
+        NUMD = IABSC1[IABSC2[j-1]/2-1]
+      j=j-1
+    else:
+      if j>= 2*NBSEP :
+        MIND = TAMPON[2*NBSEP-1][0]
+        MING = MIND
+        if fmod(IABSC2[2*NBSEP-1],2):
+          TYPG = 0
+          NUMG = IABSC1[IABSC2[2*NBSEP-1]/2]
+        else:
+          TYPG = 1
+          NUMG = IABSC1[IABSC2[2*NBSEP-1]/2-1]
+        TYPD=TYPG
+        NUMD=NUMG
+      else:
+        MING=TAMPON[j-1][0]
+        MIND=TAMPON[j][0]
+        if fmod(IABSC2[j-1],2):
+          TYPG = 0
+          NUMG = IABSC1[IABSC2[j-1]/2]
+        else:
+          TYPG = 1
+          NUMG = IABSC1[IABSC2[j-1]/2-1]
+        if fmod(IABSC2[j],2):
+          TYPD = 0
+          NUMD = IABSC1[IABSC2[j]/2]
+        else:
+          TYPD = 1
+          NUMD = IABSC1[IABSC2[j]/2-1]
+    if fabs(MING-MIND)<EPSI : 
+      if j==2*NBSEP:break
+      else:continue
+    if j>2*NBSEP and ICE>=NBSEP: 
+        break #on sort de la boucle
+
+    while go20:
+      i=ICE
+      if i<=NBSEP:
+#       recherche des centres a intercaler
+        INDC=IABSC1[i-1]
+        if i>1:
+#         le centre est deja le meme que precedent
+          if fabs(MCL_SOUS_EPAIS[INDC-1].ISCP-MCL_SOUS_EPAIS[IABSC1[i-2]-1].ISCP) < EPSI :
+            ICE=ICE+1
+            continue
+        if MCL_SOUS_EPAIS[INDC-1].ISCP < MING :
+#          le centre est la nouvelle borne gauche
+           j=j-1
+           MIND = MING
+           TYPD = TYPG
+           NUMD = NUMG
+           MING = MCL_SOUS_EPAIS[INDC-1].ISCP
+           TYPG = 2
+           NUMG = INDC
+           ICE = ICE+1
+        elif MCL_SOUS_EPAIS[INDC-1].ISCP < MIND : 
+#          le centre est la nouvelle borne droite  
+           MIND = MCL_SOUS_EPAIS[INDC-1].ISCP
+           TYPD = 2
+           NUMD = INDC
+           ICE = ICE+1
+           continue
+        else:pass
+      NZONEX=NZONEX+1
+#    
+#     codes d'intervalles de zones
+#        0 0 = zone sous-ep.
+#        0 1 = sous-ep. a droite de la zone
+#        1 0 = sous-ep. a gauche de la zone
+#        1 1 = sous-ep. a droite et a gauche de la zone  
+#
+#     cas ou la premiere zone ne commence pas au bord de la plaque
+      if MING>0. and NZONEX==1 :
+        BG.append(0.)
+        BD.append(MING)
+        if TYPG==0:
+           INDBG.append(0)
+           INDBD.append(1)
+           DNX.append(DERAFC)
+           DNX.append(0)
+           INDSEX.append(0)
+        elif TYPG==1 or TYPG==2:
+           INDBG.append(0)
+           INDBD.append(0)
+           DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
+           DNX.append(0)
+           INDSEX.append(NUMG)
+        else: pass
+        NZONEX=NZONEX+1
+#
+      BG.append(MING)
+      BD.append(MIND)  
+#
+      if TYPG == 0:
+#       borne gauche zone = borne gauche ssep       
+        NBGAU=NBGAU+1
+        INDBG.append(0)
+        INDBD.append(0)
+        if TYPD == 0:
+#         borne droite zone = borne gauche ssep
+          DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
+          DNX.append(0)
+          INDSEX.append(NUMG)
+        elif TYPD == 1 or TYPD == 2:
+#         borne droite zone = borne droite ssep : TYPD=1
+#         borne droite zone = centre ssep : TYPD=2
+          LTMP=[]
+          LTMP.append((MCL_SOUS_EPAIS[NUMG-1].IDENC,NUMG))
+          LTMP.append((MCL_SOUS_EPAIS[NUMD-1].IDENC,NUMD))
+          LTMP.sort()
+          DNX.append(LTMP[0][0])
+          DNX.append(0)
+          INDSEX.append(LTMP[0][1])
+        else: pass
+#
+      elif TYPG == 1:
+#       borne gauche zone = borne droite ssep  
+        NBDRO = NBDRO+1  
+        if TYPD == 0:
+#         borne droite zone = borne gauche ssep
+          if NBDRO==NBGAU:
+            INDBG.append(1)
+            INDBD.append(1)
+            DNX.append(DERAFC)
+            DNX.append(0)
+            INDSEX.append(0)
+          else:
+#           cas tordu: une sous-ep enveloppe le tout
+            INDBG.append(0)
+            INDBD.append(0)
+            DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
+            DNX.append(0)    
+            INDSEX.append(NUMG)
+        elif TYPD == 1 or TYPD == 2:
+#         borne droite zone = borne droite ssep : TYPD=1
+#         borne droite zone = centre ssep : TYPD=2
+          INDBG.append(0)
+          INDBD.append(0)
+          DNX.append(MCL_SOUS_EPAIS[NUMD-1].IDENC)
+          DNX.append(0)
+          INDSEX.append(NUMD)  
+        else: pass
+#                
+      elif TYPG == 2:
+#       borne gauche zone = centre ssep  
+        INDBG.append(0)
+        INDBD.append(0)
+        if TYPD == 0:
+#         borne droite zone = borne gauche ssep
+          DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC)
+          DNX.append(0)
+          INDSEX.append(NUMG)  
+        elif TYPD == 1 or TYPD == 2:
+#         borne droite zone = borne droite ssep : TYPD=1
+#         borne droite zone = centre ssep : TYPD=2
+          LTMP=[]
+          LTMP.append((MCL_SOUS_EPAIS[NUMG-1].IDENC,NUMG))
+          LTMP.append((MCL_SOUS_EPAIS[NUMD-1].IDENC,NUMD))
+          LTMP.sort()
+          DNX.append(LTMP[0][0])
+          DNX.append(0)
+          INDSEX.append(LTMP[0][1])
+        else:pass
+      else:pass
+      if j<=(2*NBSEP-2) or ICE<=NBSEP or (TYPD==2 and j<2*NBSEP):
+         iout=0       
+         break #on retourne dans la boucle go10
+      else :
+         iout=1
+         break #on sort definitivement 
+    if iout:break
+      
+  if MIND<2.*pi*RM:
+    NZONEX=NZONEX+1
+    BG.append(MIND)
+    BD.append(2.*pi*RM)
+    if TYPD==0 or TYPD==2:
+      INDBG.append(0)
+      INDBD.append(0)
+      DNX.append(MCL_SOUS_EPAIS[NUMD-1].IDENC)
+      DNX.append(0)
+      INDSEX.append(NUMD)
+    elif TYPD==1:
+      INDBG.append(1)
+      INDBD.append(0)
+      DNX.append(DERAFC)
+      DNX.append(0)
+      INDSEX.append(0)
+    else:pass
+
+# au cas ou 2.*pi*RM correspond a une borne d'intevalle de sous-ep ou a
+#  un centre de sous-ep.
+  if fabs(BG[NZONEX-1]-BD[NZONEX-1])<EPSI: NZONEX = NZONEX-1
+
+  print
+  print 'ZONES APRES RECOUVREMENT ABSC. CURV. CIRCONF. :'
+  print '-----------------------------------------------'
+  for j in range(NZONEX) :
+    if INDBG[j]==0 and INDBD[j]==0 :
+      print 'ZONE NO',j+1,'<> BORNE GAUCHE = %.2f'\
+      ' / BORNE DROITE = %.2f * SOUS-EPAISSEUR'%(BG[j],BD[j])
+    else:
+      print 'ZONE NO',j+1,'<> BORNE GAUCHE = %.2f'\
+      ' / BORNE DROITE = %.2f'%(BG[j],BD[j])
+
+      
+# --- tri des donnees sous-ep. en axial
+  TAMPON,IORDO1,IORDO2,COORYI,COORYS=ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM)
+
+  BI     = []
+  BS     = []
+  INDBI  = []
+  INDBS  = []
+  DNY    = []
+  INDSEY = []
+
+  if SYME == 'DEMI':
+#   calcul des zones en axial :
+#   zones  (0,bord inferieur) et (bord inferieur,centre sous-ep.) 
+    ssep   = MCL_SOUS_EPAIS[0]
+    BI.append(0.)
+    BI.append(ssep.ISLP-ssep.ILONP/2.)
+    BS.append(ssep.ISLP-ssep.ILONP/2.)
+    BS.append(ssep.ISLP)
+    INDBI.append(0)  
+    INDBI.append(0)
+    INDBS.append(1)
+    INDBS.append(0)
+    DNY.append(DERAFL)
+    DNY.append(0)
+    DNY.append(ssep.IDENL)
+    DNY.append(0)
+    INDSEY.append(0)
+    INDSEY.append(1)
+    NZONEY=1
+#     
+  else:
+#
+#   calcul des recouvrements de zones en axial  
+    j = 0
+    ICE = 1
+    NBINF = 0
+    NBSUP = 0
+    TYPI=0
+    TYPS=0
+    go40=1
+    go50=1
+    NZONEY=0
+#
+    while go40:
+      j=j+1      
+#
+#     definition de la zone courante (borne inf, borne sup)
+#
+#     typi = type de la borne
+#            0 : borne inf. sous-ep.
+#            1 : borne sup. sous-ep.
+#            2 : centre sous-ep.   
+#
+      if TYPS==2:
+#       cas ou la borne sup. de la zone prec. etait un centre
+        MINI=MINS
+        TYPI=TYPS
+        NUMI=NUMS
+        MINS=TAMPON[j-1][0]
+        if fmod(IORDO2[j-1],2):
+          TYPS = 0
+          NUMS = IORDO1[IORDO2[j-1]/2]
+        else:
+          TYPS = 1
+          NUMS = IORDO1[IORDO2[j-1]/2-1]
+        j=j-1
+      else:
+        if j>= 2*NBSEP :
+          MINI = TAMPON[2*NBSEP-1][0]
+          MINS = MINI
+          if fmod(IORDO2[2*NBSEP-1],2):
+            TYPI = 0
+            NUMI = IORDO1[IORDO2[2*NBSEP-1]/2]
+          else:
+            TYPI = 1
+            NUMI = IORDO1[IORDO2[2*NBSEP-1]/2-1]
+          TYPS=TYPI
+          NUMS=NUMI
+        else:
+          MINI=TAMPON[j-1][0]
+          MINS=TAMPON[j][0]
+          if fmod(IORDO2[j-1],2):
+            TYPI = 0
+            NUMI = IORDO1[IORDO2[j-1]/2]
+          else:
+            TYPI = 1
+            NUMI = IORDO1[IORDO2[j-1]/2-1]
+          if fmod(IORDO2[j],2):
+            TYPS = 0
+            NUMS = IORDO1[IORDO2[j]/2]
+          else:
+            TYPS = 1
+            NUMS = IORDO1[IORDO2[j]/2-1]
+      if fabs(MINI-MINS)<EPSI:
+        if j==2*NBSEP:break
+        else:continue
+
+      while go50:
+        i=ICE
+        if i<=NBSEP:
+#         recherche des centres a intercaler
+          INDC=IORDO1[i-1]
+          if i>1:
+#           le centre est deja le meme que le precedent
+            if fabs(MCL_SOUS_EPAIS[INDC-1].ISLP-MCL_SOUS_EPAIS[IORDO1[i-2]-1].ISLP)<EPSI:
+             ICE=ICE+1  
+             continue
+          if MCL_SOUS_EPAIS[INDC-1].ISLP<MINI:
+#            le centre est la nouvelle borne inf.
+             j=j-1
+             MINS = MINI
+             TYPS = TYPI
+             NUMS = NUMI
+             MINI = MCL_SOUS_EPAIS[INDC-1].ISLP
+             TYPI = 2
+             NUMI = INDC
+             ICE = ICE+1
+          elif MCL_SOUS_EPAIS[INDC-1].ISLP<MINS:
+#            le centre est la nouvelle borne sup.
+            MINS = MCL_SOUS_EPAIS[INDC-1].ISLP
+            TYPS = 2
+            NUMS = INDC
+            ICE = ICE+1
+            continue
+          else:pass
+        NZONEY=NZONEY+1
+#       
+#       code d'intervalles de zone
+#       0 0  = ZONE SOUS-EPAISSEUR
+#       0 1  = SOUS-EPAISSEUR A SUPERIEURE DE LA ZONE
+#       1 0  = SOUS-EPAISSEUR A INFERIEURE DE LA ZONE
+#       1 1  = SOUS EPAISSEUR A SUPERIEURE ET A INFERIEURE DE LA ZONE
+#
+#       cas ou la premiere zone ne commence pas au bord de la plaque
+        if MINI>0. and NZONEY==1:
+          first=0
+          BI.append(0.)
+          BS.append(MINI)
+          if TYPI==0:
+            INDBI.append(0)
+            INDBS.append(1)
+            DNY.append(DERAFL)
+            DNY.append(0)
+            INDSEY.append(0)
+          elif TYPI==1 or TYPI==2:
+            INDBI.append(0)
+            INDBS.append(0)
+            DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
+            DNY.append(0)
+            INDSEY.append(NUMI)
+          else:pass
+          NZONEY = NZONEY+1
+#
+        BI.append(MINI)
+        BS.append(MINS)
+
+        if TYPI==0:
+#         borne inferieure zone = borne inferieure ssep
+          NBINF = NBINF+1
+          INDBI.append(0)
+          INDBS.append(0)
+          if TYPS==0:
+#           borne superieure zone = borne inferieur ssep
+            DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
+            DNY.append(0)
+            INDSEY.append(NUMI)
+          elif TYPS==1 or TYPS==2:
+#           borne superieure zone = borne superieure ssep:TYPS==1
+#           borne superieure zone = centre ssep:TYPS==2
+            LTMP=[]
+            LTMP.append((MCL_SOUS_EPAIS[NUMI-1].IDENL,NUMI))
+            LTMP.append((MCL_SOUS_EPAIS[NUMS-1].IDENL,NUMS))
+            LTMP.sort()
+            DNY.append(LTMP[0][0])
+            DNY.append(0)
+            INDSEY.append(LTMP[0][1])
+          else:pass
+        elif TYPI==1:  
+#         borne inferieure zone=borne superieure ssep
+          NBSUP = NBSUP+1
+          if TYPS==0:
+#           borne superieure zone = borne inferieur ssep
+            if NBSUP==NBINF:
+              INDBI.append(1)
+              INDBS.append(1)        
+              DNY.append(DERAFL)
+              DNY.append(0)
+              INDSEY.append(0)
+            else:
+#             cas tordu: une sous-ep. enveloppe le tout
+              INDBI.append(0)
+              INDBS.append(0)        
+              DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
+              DNY.append(0)
+              INDSEY.append(NUMI)
+          elif TYPS==1 or TYPS==2:
+#           borne superieure zone = borne superieure ssep:TYPS==1
+#           borne superieure zone = centre ssep:TYPS==2
+            INDBI.append(0)
+            INDBS.append(0)        
+            DNY.append(MCL_SOUS_EPAIS[NUMS-1].IDENL)
+            DNY.append(0)
+            INDSEY.append(NUMS)
+          else:pass
+        elif TYPI==2:
+#         borne inferieure zone = centre ssep  
+          INDBI.append(0)
+          INDBS.append(0)        
+          if TYPS==0:
+#           borne superieure zone = borne inferieure ssep
+            DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL)
+            DNY.append(0)
+            INDSEY.append(NUMI)
+          elif TYPS==1 or TYPS==2:
+#           borne superieure zone = borne superieure ssep
+            LTMP=[]
+            LTMP.append((MCL_SOUS_EPAIS[NUMI-1].IDENL,NUMI))
+            LTMP.append((MCL_SOUS_EPAIS[NUMS-1].IDENL,NUMS))
+            LTMP.sort()
+            DNY.append(LTMP[0][0])
+            DNY.append(0)
+            INDSEY.append(LTMP[0][1])
+          else:pass
+        else:pass
+        if j<=(2*NBSEP-2) or TYPS==2:
+          iout=0  
+          break #on retourne dans la boucle go40
+        else:
+          iout=1
+          break #on sort definitivement 
+      if iout:break
+
+#   cas ou la derniere zone ne finit pas au bout de la plaque    
+    if MINS<ALPHAR*RC:
+       NZONEY=NZONEY+1
+       BI.append(MINS)
+       BS.append(ALPHAR*RC) 
+       if TYPS==0 or TYPS==2:
+          INDBI.append(0)
+          INDBS.append(0)        
+          DNY.append(MCL_SOUS_EPAIS[NUMS-1].IDENL)
+          DNY.append(0)
+          INDSEY.append(NUMS)
+       elif TYPS==1:
+          INDBI.append(1)
+          INDBS.append(0)        
+          DNY.append(DERAFL)
+          DNY.append(0)
+          INDSEY.append(0)
+       else:pass
+
+    print
+    print 'ZONES APRES RECOUVREMENT ABSC. CURV. LONGIT. :'
+    print '-----------------------------------------------'
+
+    for j in range(NZONEY) :
+      if INDBI[j]==0 and INDBS[j]==0 :
+        print 'ZONE NO',j+1,'<> BORNE INF. = %.2f'\
+        ' / BORNE SUP. = %.2f * SOUS-EPAISSEUR'%(BI[j],BS[j])
+      else:
+        print 'ZONE NO',j+1,'<> BORNE INF. = %.2f'\
+        ' / BORNE SUP. = %.2f '%(BI[j],BS[j])
+
+#   calcul du nombre d'elements longi. et circonf. dans les sous-ep
+    NLX,NLY=ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI,
+                   DNX,DNY,RM,RC,INDSEX,INDSEY,IABSC1,IORDO1)
+  
+
+  return ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL   write_file_dgib_ASCFDO
+#
+#     ECRIT DANS UN FICHIER LES DONNES GIBI DE LA PROCEDURE 
+#     "PLAQUE FISSUREE"
+#
+
+def write_file_dgib_ASCFDO(nomFichierDATG,RM,RC,ALPHA,NBTRAN,EP1,EP2,EPI,TETA1,
+                           TETA2,LTRAN,SUREP,LTCHAR,LTCLIM,TYPBOL,AXEAP,AXECP,NT,NS,NC,
+                           SFP,ORIEN,AZIM,RC0,RC2,RC3,POSIT,EPSI,NIVMAG,SYME, loc_datg) :
+
+  if TYPBOL!= None:
+     if TYPBOL=='CUVE'     : TYPEMB = 'typcuv' 
+     if TYPBOL=='GV'       : TYPEMB = 'typegv' 
+     if TYPBOL=='ASP_MPP'  : TYPEMB = 'typapp' 
+  else: 
+     TYPEMB ='      '
+   
+  if POSIT =='DEB_INT'  :
+         POSIT2 = 'interne'
+  else:
+         POSIT2 = 'externe'
+  if   SYME[:6]=='ENTIER' : ZSYME = 'entier'
+  elif SYME[:5]=='QUART'  : ZSYME = 'quart'
+  else :                    ZSYME = 'demi'
+  C=AXECP/2.
+  TETAF=AZIM*pi/180.
+
+  POIVIR = ' ;\n'
+  texte='* DEBUT PARAMETRES UTILISATEUR\n'
+  texte=texte+'*\n'
+  texte=texte+'c        = '+str(C)            +POIVIR
+  texte=texte+'a        = '+str(AXEAP)        +POIVIR
+  texte=texte+'nt       = '+str(NT)           +POIVIR
+  texte=texte+'ns       = '+str(NS)           +POIVIR
+  texte=texte+'nc       = '+str(NC)           +POIVIR
+  texte=texte+'rm       = '+str(RM)           +POIVIR
+  texte=texte+'rc       = '+str(RC)           +POIVIR
+  texte=texte+'alphac   = '+str(ALPHA)        +POIVIR
+  texte=texte+'nbtranep = '+str(NBTRAN)       +POIVIR
+  texte=texte+'ep1      = '+str(EP1)          +POIVIR
+  texte=texte+'ep2      = '+str(EP2)          +POIVIR
+  texte=texte+'epi      = '+str(EPI)          +POIVIR
+  texte=texte+'teta1    = '+str(TETA1)        +POIVIR
+  texte=texte+'teta2    = '+str(TETA2)        +POIVIR
+  texte=texte+'ltran    = '+str(LTRAN)        +POIVIR
+  texte=texte+'posfis   = '+str(SFP)          +POIVIR
+  texte=texte+'ksiref   = '+str(ORIEN)        +POIVIR
+  texte=texte+'surep    = '+str(SUREP)        +POIVIR       
+  texte=texte+'teta_f   = '+str(TETAF)        +POIVIR
+  texte=texte+'rc0      = '+str(RC0)          +POIVIR
+  texte=texte+'rc2      = '+str(RC2)          +POIVIR
+  texte=texte+'rc3      = '+str(RC3)          +POIVIR
+  texte=texte+"pos      = '"+POSIT2+"'"       +POIVIR
+  texte=texte+'lt       = '+str(LTCHAR)       +POIVIR
+  texte=texte+'lgv      = '+str(LTCLIM)       +POIVIR
+  texte=texte+"typembou = '"+TYPEMB+"'"       +POIVIR
+  texte=texte+"zsyme    = '"+ZSYME+"'"        +POIVIR
+  texte=texte+'epsif    = '+str(EPSI)         +POIVIR
+  texte=texte+'nivmag   = '+str(NIVMAG)       +POIVIR
+  texte=texte+'*\n'
+  texte=texte+'* FIN PARAMETRES UTILISATEUR\n'
+  texte=texte+'opti donn '
+  texte=texte+"'"+loc_datg+'ascouf_fiss_v4.datg'+"';\n"
+  fdgib=open(nomFichierDATG,'w')
+  fdgib.write(texte)
+  fdgib.close()
+
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL   write_file_dgib_ASCSQO
+#
+#     ECRIT DANS UN FICHIER LES DONNEES GIBI DE LA PROCEDURE 
+#     "PLAQUE SOUS-EPAISSEUR"
+#
+#-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
+#
+#     RM    = RAYON MOYEN DU COUDE
+#     RC    = RAYON DE CINTRAGE DU COUDE
+#     ALPHA = ANGLE DU COUDE
+#     NBTRAN = NOMBRE DE TRANSITION D'EPAISSEUR (0, 1 OU 2)
+#     EP1   = EPAISSEUR DU COUDE (COTE EMBOUT 1 SI TRANSITION)
+#     EP2   = EPAISSEUR DU COUDE (COTE EMBOUT 2 SI TRANSITION)
+#     EPI   = EPAISSEUR DU COUDE INTERMEDIAIRE SI TRANSITION A 2 PENTES
+#     TETA1  = ANGLE DE LA PREMIERE TRANSITION D'EPAISSEUR EVENTUELLE
+#     TETA2  = ANGLE DE LA DEUXIEME TRANSITION D'EPAISSEUR EVENTUELLE
+#     LTRAN  = LONGUEUR ENTRE FIN DE L'EMBOUT 1 ET DEBUT DE TRANSITION
+#     LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT
+#     LCLIM  = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES
+#     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)  
+#     SYME = "QUART" DE STRUCTURE, "DEMI" STRUCTURE OU BIEN "ENTIER"
+#     NBEP = NOMBRE D'ELEMENTS DANS LE COUDE
+#     NLX = NOMBRE D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR
+#     NLY = NOMBRE D'ELEMENTS LONGI DE LA SOUS-EPAISSEUR
+
+def write_file_dgib_ASCSQO(nomFichierDATG,TYPELE,RM,RC,ALPHA,NBTRAN,EP1,EP2,
+                           EPI,TETA1,MCL_SOUS_EPAIS,TETA2,LTRAN,LTCHAR,LTCLIM,GEOM,
+                           SYME,NBEP,NLX,NLY,NIVMAG,loc_datg) :
+
+  ssep= MCL_SOUS_EPAIS[0]   
+  POIVIR = ' ;\n'
+  texte=' nivmag   = '+str(NIVMAG)       +POIVIR
+  texte=texte+' option dime 3 elem '+TYPELE+' nive nivmag echo 0'+POIVIR
+  texte=texte+'*\n'
+  texte=texte+'coory   = table '+POIVIR
+  texte=texte+'coorz   = table '+POIVIR
+  texte=texte+'prof    = table '+POIVIR
+  texte=texte+'posit   = table '+POIVIR
+  texte=texte+'axisym  = table '+POIVIR
+  texte=texte+'axecir  = table '+POIVIR
+  texte=texte+'axelon  = table '+POIVIR
+  texte=texte+'sousep  = table '+POIVIR
+  texte=texte+'coorzc  = table '+POIVIR
+  texte=texte+'axelonc = table '+POIVIR
+  texte=texte+'*\n'
+  texte=texte+'* DEBUT PARAMETRES UTILISATEUR\n'
+  texte=texte+'*\n'
+  texte=texte+'* parametres generaux\n'
+  texte=texte+'*\n'
+  texte=texte+' pirad    = '+str(pi)            +POIVIR
+  texte=texte+' rm       = '+str(RM)           +POIVIR
+  texte=texte+' rc       = '+str(RC)           +POIVIR
+  texte=texte+' alpha    = '+str(ALPHA)        +POIVIR
+  texte=texte+' lt1      = '+str(LTCHAR)       +POIVIR
+  texte=texte+' lt2      = '+str(LTCLIM)       +POIVIR
+  texte=texte+' nbtranep = '+str(NBTRAN)       +POIVIR
+  texte=texte+' ep1      = '+str(EP1)          +POIVIR
+  texte=texte+' ep2      = '+str(EP2)          +POIVIR
+  texte=texte+' epI      = '+str(EPI)          +POIVIR
+  texte=texte+' teta1    = '+str(TETA1)        +POIVIR
+  texte=texte+' teta2    = '+str(TETA2)        +POIVIR
+  texte=texte+' ltran    = '+repr(LTRAN)        +POIVIR 
+  if GEOM == 'COUDE':
+    texte=texte+" zcoude = 'oui' "+POIVIR
+  else:
+    texte=texte+" zcoude = 'non' "+POIVIR
+  if SYME == 'ENTIER':
+    texte=texte+" zsyme = 'entier' "+POIVIR
+  elif SYME == 'QUART':
+    texte=texte+" zsyme = 'quart' "+POIVIR
+  else:
+    texte=texte+" zsyme = 'demi' "+POIVIR
+  if TYPELE == 'CU20':
+    texte=texte+" zquad = 'oui' "+POIVIR
+  else:
+    texte=texte+" zquad = 'non' "+POIVIR
+  SCP=pi*RM
+  texte=texte+' nxep   = '+str(NBEP)        +POIVIR
+  texte=texte+'*\n'
+  texte=texte+'* Caracteristiques de la sous-epaisseur\n'
+  texte=texte+'*\n'
+  texte=texte+' tysep = '+str(ssep.ICIRP)                                   +POIVIR
+  texte=texte+' tzsep = '+str(ssep.ILONP)                                   +POIVIR
+  texte=texte+' prof .                      1  = '+str(ssep['PROFONDEUR'])  +POIVIR
+  texte=texte+' ycsep = '+str(SCP-pi*RM)                                    +POIVIR
+  texte=texte+' theta = '+str(ssep.IPHIC)                                   +POIVIR
+  texte=texte+' zcsep = '+repr(ssep.ISLP)                                    +POIVIR
+
+  texte=texte+" posit .                      1  = '"+str(ssep['SOUS_EPAIS'].lower())+"'"+POIVIR
+  texte=texte+' nby   = '+str(int(NLX[0]))                                  +POIVIR
+  texte=texte+' nbz   = '+str(int(NLY[0]))                                  +POIVIR
+  texte=texte+' nbxse = '+str(ssep['NB_ELEM_RADI'])                         +POIVIR
+  texte=texte+' axelonc .                      1  = '+str(ssep['AXE_LONGI'])+POIVIR
+  if ssep['POSI_CURV_LONGI']!=None:
+    texte=texte+' coorzc .                      1  = '+repr(ssep['POSI_CURV_LONGI'])+POIVIR
+  else:
+    DZC=ssep.BETA*pi*(RC+(RM+EP1/2.)*cos(pi/2.))/180.
+    texte=texte+' coorzc .                      1  = '+repr(DZC)+POIVIR
+  if ssep['TYPE']=='AXIS':
+     texte=texte+" zaxis = 'oui' "+POIVIR
+  else:
+     texte=texte+" zaxis = 'non' "+POIVIR
+  if ssep['EMPREINTE'] == 'OUI':
+     texte=texte+" sousep .                      1  = 'oui'"+POIVIR
+  else:
+     texte=texte+" sousep .                      1  = 'non'"+POIVIR
+  texte=texte+'*\n'
+  texte=texte+'* FIN PARAMETRES UTILISATEUR \n'
+  texte=texte+'opti donn '
+  texte=texte+"'"+loc_datg+'ascouf_ssep_mono_v1.datg'+"'"+POIVIR
+  fdgib=open(nomFichierDATG,'w')
+  fdgib.write(texte)
+  fdgib.close()
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL   write_subpart_file_pgib_POST
+#
+#     APPELEE DANS : write_file_pgib_ASCSQ2 , write_file_pgib_ASCSD2
+#     DEFINIE UNE CHAINE DE CARACTERES UTILISEE LORS DE L'ECRITURE DU
+#     FICHIER GIBI DE POST-TRAITEMENTS
+#
+#-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
+#
+#     NLX = NOMBRE D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR
+#     NLY = NOMBRE D'ELEMENTS LONGI DE LA SOUS-EPAISSEUR
+#
+#-----------------DONNEE RENVOYEE PAR ASTER-------------------- 
+# 
+#     texte = chaine de caracteres contenant des instructions gibi
+#             de post-traitements
+#
+def write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY):
+  CAR3 = ('fdro','exdr','extr','exga','fgau','inga','intr','indr')
+  
+  POIVIR = ' ;\n'
+  texte='* DEBUT POINTS DE POST-TRAITEMENT\n'
+  texte=texte+'*\n'
+  issep=0
+  for ssep in MCL_SOUS_EPAIS:
+    issep=issep+1
+    texte=texte+'*\n'
+    texte=texte+'* sous-epaisseur No '+str( issep)+'\n'
+    texte=texte+'*\n'
+    if ssep['TYPE'] == 'ELLI':
+      texte=texte+'*\n'
+      texte=texte+'* plans circonf longi et colonne centrale \n'
+      texte=texte+'*\n'
+      texte=texte+'pcirc'+str( issep)+' = circo .'+str(issep).rjust(4)+POIVIR
+      texte=texte+'plong'+str( issep)+' = longi .'+str(issep).rjust(4)+POIVIR
+      texte=texte+'pcent'+str( issep)+' = centr .'+str(issep).rjust(4)+POIVIR
+    texte=texte+'*\n'
+    texte=texte+'* ligaments tous les 45 degres a epaisseur minimale \n'
+    texte=texte+'*\n'
+    texte=texte+'isep = '+str( issep)+POIVIR
+    for k in range(8):
+      texte=texte+'ilig = '+str(k+1)+POIVIR
+      texte=texte+'rlig = ilig/10. + isep'+POIVIR
+      texte=texte+str(CAR3[k])+str( issep)+' = lig45 . rlig'+POIVIR
+    if ssep['TYPE'] == 'ELLI':
+      texte=texte+'*\n'
+      texte=texte+"* ligaments circonferentiels a l'epaisseur minimale\n"
+      texte=texte+'*\n'
+      texte=texte+'isep = '+str(issep)+POIVIR
+      for k in range(2*NLX[issep-1]+1):
+        texte=texte+'ilig = '+str(k+1)+POIVIR
+        texte=texte+'rlig = ilig/100. + isep'+POIVIR
+        texte=texte+'cir'+str(issep)+'_'+str(k+1)+' = ligcir . rlig'+POIVIR
+      texte=texte+'*\n'
+      texte=texte+"* ligaments longitudinaux a l'epaisseur minimale\n"                        
+      texte=texte+'* \n'
+      for k in range(2*NLY[issep-1]+1):
+        texte=texte+'ilig = '+str(k+1)+POIVIR
+        texte=texte+'rlig = ilig/100. + isep'+POIVIR
+        texte=texte+'lon'+str(issep)+'_'+str(k+1)+' = liglon . rlig'+POIVIR
+  texte=texte+'* FIN POINTS DE POST-TRAITEMENT\n'
+  return texte
+
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL   write_file_pgib_ASCSQ2
+#
+#     ECRIT DANS UN FICHIER  LES DONNEES GIBI DE LA PROCEDURE
+#     "PLAQUE SOUS-EPAISSEURS"
+#     IL S'AGIT DE LA DEUXIEME PARTIE ( APRES LES DONNEES UTILISATEUR )
+#
+#
+#-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
+#
+#     NLX = NOMBRE TOTAL D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR K
+#     NLY = NOMBRE TOTAL D'ELEMENTS LONGIT. DE LA SOUS-EPAISSEUR K
+
+def write_file_pgib_ASCSQ2(MCL_SOUS_EPAIS,NLX,NLY):
+  POIVIR = ' ;\n'
+  texte=write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY)
+  texte=texte+'*\n'
+  texte=texte+'p1 = 0. 0. (-1.*lt1)'+POIVIR
+  texte=texte+'p2 = 0. 0. (coor 3 bou3)'+POIVIR
+  texte=texte+'ma = coude et p1 et p2'+POIVIR
+  texte=texte+"opti sauv form 'fort.8'"+POIVIR
+  texte=texte+'sort ma'+POIVIR
+  texte=texte+'sauv form ma'+POIVIR
+  texte=texte+'fin'+POIVIR
+  fpgib=open('fort.71','w')
+  fpgib.write(texte)
+  fpgib.close()
+
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL   write_file_pgib_ASCSP1
+#
+#     ECRIT DANS UN FICHIER  LES DONNEES GIBI DE LA PROCEDURE
+#     "PLAQUE SOUS-EPAISSEURS"
+#     IL S'AGIT DE LA PREMIERE PARTIE ( AVANT LES DONNEES UTILISATEUR )
+#
+#
+def write_file_dgib_ASCSP1(nomFichierDATG,TYPELE,MCL_SOUS_EPAIS,NIVMAG,loc_datg):
+
+  POIVIR = ' ;\n'
+  texte=' nivmag = '+str(NIVMAG)+POIVIR
+  texte=texte+' option dime 3 elem '+TYPELE+' nive nivmag echo 0 '+POIVIR
+  texte=texte+'*\n'
+  texte=texte+'bg      = table '+POIVIR
+  texte=texte+'bd      = table '+POIVIR
+  texte=texte+'bi      = table '+POIVIR
+  texte=texte+'bs      = table '+POIVIR
+  texte=texte+'indbg   = table '+POIVIR
+  texte=texte+'indbd   = table '+POIVIR
+  texte=texte+'indbi   = table '+POIVIR
+  texte=texte+'indbs   = table '+POIVIR
+  texte=texte+'axecir  = table '+POIVIR
+  texte=texte+'axelon  = table '+POIVIR
+  texte=texte+'axelonc = table '+POIVIR
+  texte=texte+'coorzc  = table '+POIVIR
+  texte=texte+'prof    = table '+POIVIR
+  texte=texte+'posit   = table '+POIVIR
+  texte=texte+'coory   = table '+POIVIR
+  texte=texte+'coorz   = table '+POIVIR   
+  texte=texte+'deny    = table '+POIVIR
+  texte=texte+'nbely   = table '+POIVIR
+  texte=texte+'denz    = table '+POIVIR
+  texte=texte+'nbelz   = table '+POIVIR
+  texte=texte+'axisym  = table '+POIVIR
+  texte=texte+'sousep  = table '+POIVIR
+  texte=texte+'* \n'     
+  texte=texte+'opti donn '
+  texte=texte+"'"+loc_datg+'ascouf_ssep_mult_v1.datg'+"';\n"
+  fdgib=open(nomFichierDATG,'w')
+  fdgib.write(texte)
+  fdgib.close()
+  
+################################################################################
+################################################################################
+################################################################################
+#     MACR_ASCOUF_MAIL   write_file_pgib_ASCSDO
+#
+#     ECRIT DANS UN FICHIER  LES DONNEES GIBI DE LA PROCEDURE
+#     "PLAQUE SOUS-EPAISSEURS"
+#
+#-----------------DONNEES FOURNIES PAR L'UTILISATEUR--------------------
+#
+#     RM    = RAYON MOYEN DU COUDE
+#     RC    = RAYON DE CINTRAGE DU COUDE
+#     ALPHA = ANGLE DU COUDE
+#     EP    = EPAISSEUR DU COUDE
+#     LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT
+#     LCLIM  = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES
+#     GEOM  = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE)  
+#     SYME = QUART DE STRUCTURE SI 'OUI'
+#     INDBG = INDICATEUR BORD GAUCHE DE LA ZONE CIRCONF J
+#     INDBD = INDICATEUR BORD DROIT DE LA ZONE CIRCONF J
+#     BG = ABSCISSE DU BORD GAUCHE DE LA ZONE CIRCONF J
+#     BD = ABSCISSE DU BORD DROIT DE LA ZONE CIRCONF J
+#     BI = ORDONNEE DU BORD INFERIEUR DE LA ZONE LONGI J
+#     BS = ORDONNEE DU BORD SUPERIEUR DE LA ZONE LONGI J
+#     INDBI = INDICATEUR BORD INFERIEUR DE LA ZONE LONGI J
+#     INDBS = INDICATEUR BORD SUPERIEUR DE LA ZONE LONGI J
+#     INDSEX = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE CIRCONF J
+#     INDSEY = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE LONGI J
+#     DNX = DENSITE ET NOMBRE D'ELEMENTS CIRCONF. DE LA ZONE J
+#     DNY = DENSITE ET NOMBRE D'ELEMENTS LONGIT. DE LA ZONE J
+#     NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES
+#     NZONEY = NOMBRE DE ZONES LONGITUDINALES  
+#
+def write_file_pgib_ASCSDO(RM,RC,ALPHA,EP,LTCLIM,LTCHAR,NBEP,
+                           NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,
+                           DNX,DNY,MCL_SOUS_EPAIS,GEOM,SYME):
+
+  POIVIR = ' ;\n'
+  NY=20
+  DELTAY=2.*pi*RM/NY
+
+  def nint(x):
+    if 0<ceil(x)-x<=0.5:
+      return int(ceil(x))
+    else:
+      return int(floor(x))
+
+# conversion des densites de raffinement des embout en degres par rapport
+# a l'angle du coude
+  RTMP=nint(LTCHAR/DELTAY)*DELTAY/4.
+  DENSTU = RTMP*360./(2.*pi*RC)
+  DENSGV = DENSTU
+  NZT=0
+  NZGV=0
+
+  texte='* DEBUT PARAMETRES UTILISATEUR \n'
+  texte=texte+'*\n'
+  texte=texte+'* parametres generaux\n'
+  texte=texte+'*\n'
+  texte=texte+'rm       = '+str(RM)               +POIVIR
+  texte=texte+'rc       = '+str(RC)               +POIVIR
+  texte=texte+'alphac   = '+str(ALPHA)            +POIVIR
+  texte=texte+'epc      = '+str(EP)               +POIVIR
+  texte=texte+'pirad    = '+str(pi)               +POIVIR
+  texte=texte+'lgv      = '+str(LTCLIM)           +POIVIR
+  texte=texte+'lt       = '+str(LTCHAR)           +POIVIR
+  texte=texte+'lcoude   = '+str(ALPHA*pi/180.*RC) +POIVIR
+  if GEOM == 'COUDE':
+    texte=texte+"zcoude = 'oui' "     +POIVIR
+  else:
+    texte=texte+"zcoude = 'non' "     +POIVIR
+  if SYME == 'ENTIER':
+    texte=texte+"zsyme = 'entier' "   +POIVIR
+  elif SYME == 'QUART':
+    texte=texte+"zsyme = 'quart' "    +POIVIR
+  else:
+    texte=texte+"zsyme = 'demi' "     +POIVIR
+  texte=texte+'nxep   = '+str(NBEP)   +POIVIR
+  texte=texte+'nzt    = '+str(NZT)    +POIVIR
+  texte=texte+'nzgv   = '+str(NZGV)   +POIVIR
+  texte=texte+'daxhtu = '+str(DENSTU) +POIVIR
+  texte=texte+'daxhgv = '+str(DENSGV) +POIVIR
+  texte=texte+'*\n'
+  
+  texte=texte+'* Zones couvertes en circonference\n'
+  texte=texte+'*\n'
+  for j in range(NZONEX):
+    texte=texte+'bg .'   +str(j+1).rjust(23)+' = '+str(BG[j]-pi*RM)     +POIVIR
+    texte=texte+'bd .'   +str(j+1).rjust(23)+' = '+str(BD[j]-pi*RM)     +POIVIR
+    texte=texte+'indbg .'+str(j+1).rjust(23)+' = '+str(INDBG[j])        +POIVIR
+    texte=texte+'indbd .'+str(j+1).rjust(23)+' = '+str(INDBD[j])        +POIVIR
+    texte=texte+'deny .' +str(j+1).rjust(23)+' = '+str(DNX[2*j])        +POIVIR
+    texte=texte+'nbely .'+str(j+1).rjust(23)+' = '+str(int(DNX[2*j+1])) +POIVIR
+    texte=texte+'*\n'
+    
+  texte=texte+'* Zones couvertes longitudinalement\n'
+  texte=texte+'*\n'
+  for j in range(NZONEY):
+    texte=texte+'bi .'   +str(j+1).rjust(23)+' = '+str(BI[j])           +POIVIR
+    texte=texte+'bs .'   +str(j+1).rjust(23)+' = '+str(BS[j])           +POIVIR
+    texte=texte+'indbi .'+str(j+1).rjust(23)+' = '+str(INDBI[j])        +POIVIR
+    texte=texte+'indbs .'+str(j+1).rjust(23)+' = '+str(INDBS[j])        +POIVIR
+    texte=texte+'denz .' +str(j+1).rjust(23)+' = '+str(DNY[2*j])        +POIVIR
+    texte=texte+'nbelz .'+str(j+1).rjust(23)+' = '+str(int(DNY[2*j+1])) +POIVIR
+    texte=texte+'*\n'
+  texte=texte+'* Caracteristiques des sous-epaisseurs\n'
+  texte=texte+'*\n'
+  issep=0
+  for ssep in MCL_SOUS_EPAIS:
+     issep=issep+1
+     texte=texte+'axecir .' +str(issep).rjust(23)+' = '+str(ssep.ICIRP)        +POIVIR
+     texte=texte+'axelon .' +str(issep).rjust(23)+' = '+str(ssep.ILONP)        +POIVIR
+     texte=texte+'prof .'   +str(issep).rjust(23)+' = '+str(ssep['PROFONDEUR'])+POIVIR
+     texte=texte+'coory .'  +str(issep).rjust(23)+' = '+str(ssep.ISCP-pi*RM)   +POIVIR
+     texte=texte+'coorz .'  +str(issep).rjust(23)+' = '+str(ssep.ISLP)         +POIVIR
+     texte=texte+'posit .'  +str(issep).rjust(23)+" = '"+str(ssep['SOUS_EPAIS'].lower())+"'"+POIVIR
+     texte=texte+'axelonc .'+str(issep).rjust(23)+' = '+str(ssep['AXE_LONGI']) +POIVIR
+     if ssep['POSI_CURV_LONGI']!=None:
+       texte=texte+'coorzc .'+str(issep).rjust(23)+' = '+str(ssep['POSI_CURV_LONGI'])+POIVIR
+     else:
+       DZC=ssep.BETA*pi*(RC+(RM+EP/2.)*cos(pi/2.))/180.
+       texte=texte+'coorzc .'+str(issep).rjust(23)+' = '+str(DZC)+POIVIR
+     if ssep['TYPE']=='AXIS':
+       texte=texte+'axisym .'+str(issep).rjust(23)+" = 'oui'"+POIVIR
+     else:
+       texte=texte+'axisym .'+str(issep).rjust(23)+" = 'non'"+POIVIR
+     if ssep['EMPREINTE'] == 'OUI':
+       texte=texte+'sousep .'+str(issep).rjust(23)+" = 'oui'"+POIVIR
+     else:
+       texte=texte+'sousep .'+str(issep).rjust(23)+" = 'non'"+POIVIR
+  texte=texte+'* \n'
+  texte=texte+'* FIN PARAMETRES UTILISATEUR\n'
+  fpgib=open('fort.71','w') 
+  fpgib.write(texte)
+  fpgib.close()
+  
+################################################################################
+################################################################################
+################################################################################
+
+def write_file_pgib_ASCSP2(MCL_SOUS_EPAIS,NLX,NLY):
+
+  POIVIR = ' ;\n'
+  texte='*\n'
+  texte=texte+'coude extube bord1 clgv  bord2 peauext peauint placoude platube\n'
+  texte=texte+'plagv  longi  circo centr bou1  bou3  ligmed  ligtub liggv lig45\n'
+  texte=texte+'ligcir liglon bordtu\n'
+  texte=texte+'= PLAQSEP bg bd bi bs indbg indbd indbi indbs rm rc\n'
+  texte=texte+'alphac pirad epc lt lgv coory coorz axecir axelon prof zsyme posit\n'
+  texte=texte+'lcoude nxep sousep deny nbely denz nbelz axelonc coorzc axisym\n'
+  texte=texte+'daxhtu daxhgv nzt nzgv zcoude'+POIVIR
+  texte=texte+'fdromi   = ligmed .   1'+POIVIR
+  texte=texte+'exdrmi   = ligmed .   2'+POIVIR
+  texte=texte+'extrmi   = ligmed .   3'+POIVIR
+  texte=texte+'exgami   = ligmed .   4'+POIVIR
+  texte=texte+'fgaumi   = ligmed .   5'+POIVIR
+  texte=texte+'ingami   = ligmed .   6'+POIVIR
+  texte=texte+'intrmi   = ligmed .   7'+POIVIR
+  texte=texte+'indrmi   = ligmed .   8'+POIVIR
+  texte=texte+'fdrotu   = ligtub .   1'+POIVIR
+  texte=texte+'exdrtu   = ligtub .   2'+POIVIR
+  texte=texte+'extrtu   = ligtub .   3'+POIVIR
+  texte=texte+'exgatu   = ligtub .   4'+POIVIR
+  texte=texte+'fgautu   = ligtub .   5'+POIVIR
+  texte=texte+'ingatu   = ligtub .   6'+POIVIR
+  texte=texte+'intrtu   = ligtub .   7'+POIVIR
+  texte=texte+'indrtu   = ligtub .   8'+POIVIR
+  texte=texte+"si (ega zsyme 'entier')"+POIVIR
+  texte=texte+'   fdrogv   = liggv  .  1'+POIVIR
+  texte=texte+'   exdrgv   = liggv .   2'+POIVIR
+  texte=texte+'   extrgv   = liggv .   3'+POIVIR
+  texte=texte+'   exgagv   = liggv .   4'+POIVIR
+  texte=texte+'   fgaugv   = liggv .   5'+POIVIR
+  texte=texte+'   ingagv   = liggv .   6'+POIVIR
+  texte=texte+'   intrgv   = liggv .   7'+POIVIR
+  texte=texte+'   indrgv   = liggv .   8'+POIVIR
+  texte=texte+'finsi'+POIVIR
+  texte=texte+'*\n'
+  
+  text2=write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY)
+  texte=texte+text2
+  
+  texte=texte+'*\n'
+  texte=texte+'*oeil = 10000. 0. 0.' +POIVIR
+  texte=texte+'*trac oeil cach coude'+POIVIR
+  texte=texte+'*opti donn 5'         +POIVIR
+  texte=texte+'p1 = 0. 0. (-1.*lt)'+POIVIR
+  texte=texte+'p2 = 0. 0. (coor 3 bou3)'+POIVIR
+  texte=texte+'ma = coude et p1 et p2'+POIVIR
+  texte=texte+'sort ma'+POIVIR
+  texte=texte+'neu = nbno ma'+POIVIR
+  texte=texte+"mess 'nombre de noeuds : 'neu"+POIVIR
+  texte=texte+"opti sauv form 'fort.8'"+POIVIR
+  texte=texte+'sauv form ma'+POIVIR
+  texte=texte+'fin'+POIVIR
+  fpgib=open('fort.71','a') 
+  fpgib.write(texte)
+  fpgib.close()  
+
+################################################################################
+################################################################################
+################################################################################
+
+def write_file_dgib_ASCRDO(nomFichierDATG,TYPELE,NIVMAG,TYPBOL,ALPHA,RC,RM,EP,SUREP,
+                           LTCLIM,LTCHAR,NBEP,loc_datg):
+
+  NY=20
+  CZ=ALPHA*RC*pi/180.
+  NZC=int((ALPHA+0.00001)/5.)
+  DELTAY=2.*pi*RM/20
+  DELTAZ=CZ/NZC
+  DENEXT=int(LTCHAR/DELTAY)*DELTAY/4.
+  NZT=0
+  NZGV=0
+  
+  if TYPBOL!=None:
+     if TYPBOL=='CUVE'     : TYPEMB = 'typcuv' 
+     if TYPBOL=='GV'       : TYPEMB = 'typegv' 
+     if TYPBOL=='ASP_MPP'  : TYPEMB = 'typapp' 
+  else: 
+     TYPEMB ='      '
+   
+  POIVIR = ' ;\n'
+  texte='* DEBUT PARAMETRES UTILISATEUR\n'
+  texte=texte+'*\n'
+  texte=texte+'* Parametres generaux\n'
+  texte=texte+'*\n'
+  texte=texte+'nivmag   = '+str(NIVMAG)       +POIVIR
+  texte=texte+'option dime 3 elem '+TYPELE+' nive nivmag echo 0'+POIVIR
+  texte=texte+'rm       = '+str(RM)           +POIVIR
+  texte=texte+'rc       = '+str(RC)           +POIVIR
+  texte=texte+'alphac   = '+str(ALPHA)        +POIVIR
+  texte=texte+'epc      = '+str(EP)           +POIVIR
+  texte=texte+'surep    = '+str(SUREP)        +POIVIR       
+  texte=texte+'lgv      = '+str(LTCLIM)       +POIVIR
+  texte=texte+'lt       = '+str(LTCHAR)       +POIVIR
+  texte=texte+"typembou = '"+TYPEMB+"'"       +POIVIR
+  texte=texte+'nx       = '+str(NBEP)         +POIVIR
+  texte=texte+'ny       = '+str(NY)           +POIVIR
+  texte=texte+"pos      = 'bidon'"            +POIVIR
+  texte=texte+'l1       = 0.'                 +POIVIR
+  texte=texte+'lbloc    = 0.'                 +POIVIR
+  texte=texte+'crit     = 0.0001'             +POIVIR
+  texte=texte+'crit2    = 0.01'               +POIVIR
+  texte=texte+'epsit    = 1.e-3'              +POIVIR
+  texte=texte+'pirad    = '+str(pi)           +POIVIR
+  texte=texte+'nzc      = '+str(NZC)          +POIVIR
+  texte=texte+'teta_f   = '+str(pi/2.)        +POIVIR
+  texte=texte+'zpp31    = '+str(CZ)           +POIVIR
+  texte=texte+'daxbtu   = '+str(DENEXT)       +POIVIR
+  texte=texte+'daxhtu   = '+str(DELTAZ)       +POIVIR
+  texte=texte+'daxbgv   = '+str(DELTAZ)       +POIVIR
+  texte=texte+'daxhgv   = '+str(DENEXT)       +POIVIR
+  texte=texte+'nzt      = '+str(NZT)          +POIVIR
+  texte=texte+'nzgv     = '+str(NZGV)         +POIVIR
+  texte=texte+'*\n'
+  texte=texte+'* FIN PARAMETRES UTILISATEUR\n'
+  texte=texte+'opti donn '
+  texte=texte+"'"+loc_datg+'ascouf_regl_v1.datg'+"';\n"
+  fdgib=open(nomFichierDATG,'w')
+  fdgib.write(texte)
+  fdgib.close()
+  
+################################################################################
+################################################################################
+################################################################################
+def macr_ascouf_mail_ops(self,EXEC_MAILLAGE,TYPE_ELEM,COUDE,
+                              SOUS_EPAIS_COUDE,SOUS_EPAIS_MULTI,
+                              FISS_COUDE,IMPRESSION,INFO,**args):
+  """
+     Ecriture de la macro MACR_ASCOUF_MAIL
+  """
+  from Accas import _F
+  import types
+  import aster 
+
+  ier=0
+  
+# On importe les definitions des commandes a utiliser dans la macro
+  EXEC_LOGICIEL =self.get_cmd('EXEC_LOGICIEL')
+  PRE_GIBI      =self.get_cmd('PRE_GIBI')
+  LIRE_MAILLAGE =self.get_cmd('LIRE_MAILLAGE')
+  DEFI_GROUP    =self.get_cmd('DEFI_GROUP')
+  MODI_MAILLAGE =self.get_cmd('MODI_MAILLAGE')
+  AFFE_MODELE   =self.get_cmd('AFFE_MODELE')
+  CREA_MAILLAGE =self.get_cmd('CREA_MAILLAGE')
+  DEFI_FICHIER  =self.get_cmd('DEFI_FICHIER')
+  IMPR_RESU     =self.get_cmd('IMPR_RESU')
+
+# La macro compte pour 1 dans la numerotation des commandes
+  self.set_icmd(1)
+
+  
+  TYPELE = TYPE_ELEM
+  NIVMAG = EXEC_MAILLAGE['NIVE_GIBI']
+  PRECIS = 0.01
+  CRITER = 'RELATIF'
+  CAR3   = ('IFDRO','IEXDR','IEXTR','IEXGA','IFGAU','IINGA','IINTR','IINDR')
+  CAR4   = ('NOFDRO','NOEXDR','NOEXTR','NOEXGA','NOFGAU','NOINGA','NOINTR','NOINDR')
+  CAR5   = ('NEFDRO','NEEXDR','NEEXTR','NEEXGA','NEFGAU','NEINGA','NEINTR','NEINDR')
+  CAR6   = ('FDRO','EXDR','EXTR','EXGA','FGAU','INGA','INTR','INDR')
+  SECT   = ('MI','TU','GV')  
+  
+#
+################################################################################
+#     --- caracteristiques du coude ---
+################################################################################
+#
+  GEOM    =COUDE['TRANSFORMEE']
+  ALPHA   =COUDE['ANGLE']
+  RC      =COUDE['R_CINTR']
+  LTCHAR  =COUDE['L_TUBE_P1']
+  LTCLIM  =COUDE['L_TUBE_P2']
+  NBEP    =COUDE['NB_ELEM_EPAIS']
+  SYME    =COUDE['SYME']
+  SUREP   =0.0
+  TYPBOL  = None
+#
+  if COUDE['TRANSFORMEE']=='COUDE' or COUDE['TRAN_EPAIS']=='NON' :
+     SUREP=COUDE['SUR_EPAIS']
+     TYPBOL  =COUDE['BOL_P2']
+     DEXT   = COUDE['DEXT']
+     EP1    = COUDE['EPAIS']
+     EP2    = EP1
+     EPI    = 0.0
+     TETA1  = 0.0
+     TETA2  = 0.0
+     LTRAN  = 0.0
+     NBTRAN = 0
+  else:
+     NBTRAN = 1
+     if COUDE['SYME']!='ENTIER':
+        print ' <MACR_ASCOUF_MAIL> les quart et demi structure'
+        print ' <MACR_ASCOUF_MAIL> ne peuvent etre realisees '
+        print ' <MACR_ASCOUF_MAIL> sur un modele comportant une transition '
+        print ' <MACR_ASCOUF_MAIL> d epaisseur '
+        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+        ier = ier+1
+        return ier
+#
+     DEXT  = COUDE['DEXT_T1']
+     EP1   = COUDE['EPAIS_T1']
+     EP2   = COUDE['EPAIS_T2']
+     TETA1 = COUDE['ANGL_TETA1']
+     TETA2 = 0.0
+     EPI   = 0.0
+     if COUDE['ANGL_TETA2']!=None :
+       NBTRAN = 2
+       TETA2 = COUDE['ANGL_TETA2']
+       EPI   = COUDE['EPAIS_TI']
+#
+     if COUDE['ABSC_CURV_TRAN']!=None :
+       LTRAN   = COUDE['ABSC_CURV_TRAN']
+     else :
+       LTRAN   = COUDE['POSI_ANGU_TRAN']* RC * pi / 180.0
+#
+  RM  = (DEXT-EP1)/2.0
+  RM2 = RM + (EP2-EP1)/2.0
+  R1  = RC
+  R2  = RM
+  E   = EP1
+#
+  if COUDE['SYME']!='ENTIER' and (LTCHAR!=LTCLIM) :
+     print ' <MACR_ASCOUF_MAIL> les deux embouts doivent etre'
+     print ' <MACR_ASCOUF_MAIL> de meme longueur pour les cas de symetrie '
+     self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+     ier = ier+1
+     return ier
+#
+  LAMOR = 3.0/2.0 * sqrt( RM*RM*RM / EP1)
+  if LTCHAR<LAMOR :
+     print ' <MACR_ASCOUF_MAIL> longueur d embout P1 inferieure'
+     print ' <MACR_ASCOUF_MAIL> a la longueur d amortissement = ',LAMOR
+     print ' <A> <MACR_ASCOUF_MAIL> alarme'
+#
+  LAMOR = 3.0/2.0 * sqrt( RM2*RM2*RM2 / EP2)
+  if LTCLIM<LAMOR :
+     print ' <MACR_ASCOUF_MAIL> longueur d embout P2 inferieure'
+     print ' <MACR_ASCOUF_MAIL> a la longueur d amortissement = ',LAMOR
+     print ' <A> <MACR_ASCOUF_MAIL> alarme'
+#
+  if TYPBOL!=None:
+   if TYPBOL[:1]=='GV' :
+     print ' <MACR_ASCOUF_MAIL> la condition aux limites raccord'
+     print ' <MACR_ASCOUF_MAIL> 3d-poutre appliquee avec la macro de calcul'
+     print ' <MACR_ASCOUF_MAIL> ascouf n est pas licite avec un embout'
+     print ' <MACR_ASCOUF_MAIL> de type conique'
+     print ' <A> <MACR_ASCOUF_MAIL> alarme'
+#
+################################################################################
+#     --- caracteristiques de la fissure ---
+################################################################################
+#
+  if FISS_COUDE!=None:
+     if NBEP!=3:
+        print ' <MACR_ASCOUF_MAIL> le nombre d elements dans l epaisseur'
+        print ' <MACR_ASCOUF_MAIL> du coude n est pas parametrable pour'
+        print ' <MACR_ASCOUF_MAIL> un coude avec fissure'
+        print ' <MACR_ASCOUF_MAIL> mot-cle NB_ELEM_EPAIS ignore'
+        print ' <A> <MACR_ASCOUF_MAIL> alarme'
+     FPROF = FISS_COUDE['PROFONDEUR']
+     FAXI  = FISS_COUDE['AXIS']
+     if FAXI=='NON' and FISS_COUDE['LONGUEUR']==None :
+        print ' <MACR_ASCOUF_MAIL> pour les fissures non axisymetriques'
+        print ' <MACR_ASCOUF_MAIL> la longueur doit etre specifiee '
+        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+        ier = ier+1
+        return ier
+     if FAXI=='OUI' and FISS_COUDE['LONGUEUR']!=None :
+        print ' <MACR_ASCOUF_MAIL> la fissure est axisymetrique : on ne'
+        print ' <MACR_ASCOUF_MAIL> tient pas compte de la longueur specifiee'
+        print ' <A> <MACR_ASCOUF_MAIL> alarme'
+     if FISS_COUDE['LONGUEUR']!=None : FLONG = FISS_COUDE['LONGUEUR']
+     if FAXI=='OUI' :
+####    on prend une marge de securite a cause des modifs dans ascfis
+        FLONG = 2.0 * pi * (RM + EP1)
+     if FISS_COUDE['ABSC_CURV']!=None :
+         SF     = FISS_COUDE['ABSC_CURV']
+         LDEFAU = SF
+         BETA   = 0.0
+     else:
+         SF     = 0.0
+         BETA   = FISS_COUDE['POSI_ANGUL']
+         LDEFAU = BETA * RC * pi / 180.0
+     AZIM   = FISS_COUDE['AZIMUT']
+     ORIEN  = FISS_COUDE['ORIEN']
+     POSIT  = FISS_COUDE['FISSURE']
+     NT     = FISS_COUDE['NB_TRANCHE']
+     NS     = FISS_COUDE['NB_SECTEUR']
+     NC     = FISS_COUDE['NB_COURONNE']
+     if FISS_COUDE['RAYON_TORE']!=None    : RC0 = FISS_COUDE['RAYON_TORE']
+     else :                                 RC0 = 0.
+     if FISS_COUDE['COEF_MULT_RC2']!=None : RC2 = FISS_COUDE['COEF_MULT_RC2']
+     else :                                 RC2 = 0.
+     if FISS_COUDE['COEF_MULT_RC3']!=None : RC3 = FISS_COUDE['COEF_MULT_RC3']
+     else :                                 RC3 = 0.
+     EPSI   = FISS_COUDE['ANGL_OUVERTURE']
+     OR     = ORIEN
+     AZ     = AZIM
+     POS    = POSIT
+     DGAXEC = FLONG/2.0
+     DC     = DGAXEC
+     if ORIEN!=90.0 and NBTRAN!=0 :
+        print ' <MACR_ASCOUF_MAIL> avec une transition d epaisseur'
+        print ' <MACR_ASCOUF_MAIL> la fissure doit obligatoirement etre transverse '
+        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+        ier = ier+1
+        return ier
+     if ORIEN!=90.0 and NBTRAN!=0 :
+        print ' <MACR_ASCOUF_MAIL> avec une transition d epaisseur'
+        print ' <MACR_ASCOUF_MAIL> la fissure doit obligatoirement etre transverse '
+        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+        ier = ier+1
+        return ier
+     if ORIEN!=90.0 and COUDE['SYME']!='ENTIER' :
+        print ' <MACR_ASCOUF_MAIL> l orientation de la fissure doit'
+        print ' <MACR_ASCOUF_MAIL> etre transverse (orien : 90.) pour modeliser '
+        print ' <MACR_ASCOUF_MAIL> un quart ou une demi structure '
+        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+        ier = ier+1
+        return ier
+     if ORIEN!=90.0 and FAXI=='OUI' :
+        print ' <MACR_ASCOUF_MAIL> la fissure est axisymetrique : son'
+        print ' <MACR_ASCOUF_MAIL> orientation doit etre transverse (ORIEN : 90.)'
+        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+        ier = ier+1
+        return ier
+#
+################################################################################
+#     --- caracteristiques des sous epaisseurs ---
+################################################################################
+#
+  isep = 0
+  MCL_SOUS_EPAIS = None
+  if SOUS_EPAIS_MULTI!=None : MCL_SOUS_EPAIS = SOUS_EPAIS_MULTI
+  if SOUS_EPAIS_COUDE!=None : MCL_SOUS_EPAIS = SOUS_EPAIS_COUDE
+  if SOUS_EPAIS_MULTI!=None and NBTRAN!=0 :
+     print ' <MACR_ASCOUF_MAIL> il ne peut pas y avoir plusieurs'
+     print ' <MACR_ASCOUF_MAIL> sous-epaisseurs en meme temps qu une'
+     print ' <MACR_ASCOUF_MAIL> transition d epaisseur : si une seule'
+     print ' <MACR_ASCOUF_MAIL> sous-epaisseur utiliser sous_epais_coude'
+     self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+     ier = ier+1
+     return ier
+  if SOUS_EPAIS_COUDE!=None and FISS_COUDE!=None and NBTRAN!=0 :
+     print ' <MACR_ASCOUF_MAIL> avec une transition d epaisseur'
+     print ' <MACR_ASCOUF_MAIL> il doit obligatoirement y avoir un defaut'
+     print ' <MACR_ASCOUF_MAIL> soit une fissure  soit une sous-epaisseur'
+     self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+     ier = ier+1
+     return ier
+  if MCL_SOUS_EPAIS!=None :
+     AZIM = 90.0
+     if MCL_SOUS_EPAIS.__class__.__name__  !='MCList' : MCL_SOUS_EPAIS=[MCL_SOUS_EPAIS,]
+     if len(MCL_SOUS_EPAIS)!=1 and COUDE['SYME']!='ENTIER' :
+        print ' <MACR_ASCOUF_MAIL> ne modeliser qu une seule'
+        print ' <MACR_ASCOUF_MAIL> sous-epaisseur pour un quart ou demi-coude'
+        self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+        ier = ier+1
+        return ier
+     for ssep in MCL_SOUS_EPAIS :
+        isep=isep+1
+        if ssep['AXE_CIRC']!=None and ssep['TYPE']=='AXIS' :
+           print ' <MACR_ASCOUF_MAIL> vous ne pouvez declarer la sous-'
+           print ' <MACR_ASCOUF_MAIL> epaisseur comme axisymetrique et donner'
+           print ' <MACR_ASCOUF_MAIL> une taille d axe circonferentiel'
+           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+           ier = ier+1
+           return ier
+        if ssep['AXE_CIRC']==None and ssep['TYPE']=='ELLI' :
+           print ' <MACR_ASCOUF_MAIL> vous devez donner une taille d axe'
+           print ' <MACR_ASCOUF_MAIL> circonferentiel pour une sous-epaisseur de'
+           print ' <MACR_ASCOUF_MAIL> type elliptique'
+           self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+           ier = ier+1
+           return ier
+        if ssep['POSI_CURV_LONGI']!=None:
+           if ssep['POSI_CURV_LONGI']>(ALPHA*RC*pi/180.0) :
+              print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+              print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero :',isep
+              print ' <MACR_ASCOUF_MAIL> abscisse curv. longit. :',ssep['POSI_CURV_LONGI']
+              print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',(ALPHA*RC*pi/180.0)
+              self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+              ier = ier+1
+              return ier
+           LDEFAU = ssep['POSI_CURV_LONGI'] + ssep['AXE_LONGI']/2.0
+           BETA = 0.0
+        else:
+           BETA=ssep['POSI_ANGUL']
+           if (BETA<0.) or (BETA>ALPHA) :
+              print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+              print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero :',isep
+              print ' <MACR_ASCOUF_MAIL> position angulaire centre sous-ep :',BETA
+              print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',ALPHA
+              self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+              ier = ier+1
+              return ier
+           LDEFAU = (BETA*RC*pi/180.0) + ssep['AXE_LONGI']/2.0
+#
+        if ssep['POSI_CURV_CIRC']!=None:
+           if ssep['POSI_CURV_CIRC']>(2*pi*RM) :
+              print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+              print ' <MACR_ASCOUF_MAIL> sous-epaisseur numero :',isep
+              print ' <MACR_ASCOUF_MAIL> abscisse curv. circonf. :',ssep['POSI_CURV_CIRC']
+              print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',(2*pi*RM)
+              self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+              ier = ier+1
+              return ier
+           if ssep['POSI_CURV_CIRC']!=(pi*RM) and ssep['TYPE']=='AXIS':
+              print ' <MACR_ASCOUF_MAIL> le centre d une sous-epaisseur'
+              print ' <MACR_ASCOUF_MAIL> axisymetrique est impose en intrados (pi*RM)'
+              self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+              ier = ier+1
+              return ier
+        else:
+           ssep.IPHIC=ssep['AZIMUT']
+           if ssep['AZIMUT']!=180. and ssep['TYPE']=='AXIS':
+              print ' <MACR_ASCOUF_MAIL> le centre d une sous-epaisseur'
+              print ' <MACR_ASCOUF_MAIL> axisymetrique est impose en intrados'
+              print ' <MACR_ASCOUF_MAIL> l azimut est fixe a 180 degres'
+              self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+              ier = ier+1
+              return ier
+#        l_ITYPE.append(ssep['TYPE'           ])
+#        l_ICIRC.append(ssep['AXE_CIRC'       ])
+#        l_ILONC.append(ssep['AXE_LONGI'      ])
+#        l_IPROC.append(ssep['PROFONDEUR'     ])
+#        l_ISLC.append( ssep['POSI_CURV_LONGI'])
+#        l_IBETC.append(BETA)
+        ssep.BETA=BETA
+#        l_ISCC.append( ssep['POSI_CURV_CIRC' ])
+#        l_IPHIC.append(ssep['AZIMUT'         ])
+#        l_IPOS.append( ssep['SOUS_EPAIS'     ])
+#        l_INBEL.append(ssep['NB_ELEM_LONGI'  ])
+#        l_INBEC.append(ssep['NB_ELEM_CIRC'   ])
+#        l_IEVID.append(ssep['EMPREINTE'      ])
+
+     if SOUS_EPAIS_COUDE!=None and COUDE['NB_ELEM_EPAIS']!=3 :
+        print ' <MACR_ASCOUF_MAIL> le nombre d elements dans l'
+        print ' <MACR_ASCOUF_MAIL> epaisseur du coude n est pas parametrable pour'
+        print ' <MACR_ASCOUF_MAIL> la version 2 de la procedure de plaque avec sous'
+        print ' <MACR_ASCOUF_MAIL> -epaisseur : mot-cle NB_ELEM_EPAIS ignore'
+        print ' <A> <MACR_ASCOUF_MAIL> alarme'
+#
+################################################################################
+#     --- verifications de coherences ---
+################################################################################
+#
+# donnees globales
+  if COUDE['TRANSFORMEE']=='COUDE' or COUDE['TRAN_EPAIS']=='NON' :
+    if SUREP<0. or SUREP>(RM-EP1/2.0):
+       print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+       print ' <MACR_ASCOUF_MAIL> surepaisseur :',SUREP
+       print ' <MACR_ASCOUF_MAIL> valeur limite autorisee (RM-EP1/2) :',(RM-EP1/2.0)
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+       ier = ier+1
+       return ier
+  if RC<=(RM+EP1/2.0):
+     print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+     print ' <MACR_ASCOUF_MAIL> le rayon de cintrage :',RC
+     print ' <MACR_ASCOUF_MAIL> doit etre superieur a (RM+EP1/2) :',(RM+EP1/2.0)
+     self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+     ier = ier+1
+     return ier
+#
+# coude fissure
+#
+  if FISS_COUDE!=None:
+    if (RM/EP1)<5. or (RM/EP1)>12.:
+       print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite (5,12)'
+       print ' <MACR_ASCOUF_MAIL> rapport RM/EP1 :',(RM/EP1)
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+       ier = ier+1
+       return ier
+    if FISS_COUDE['ABSC_CURV']!=None:
+     if SF<0. or SF>(ALPHA*RC*pi/180.0) :
+       print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+       print ' <MACR_ASCOUF_MAIL> abscisse curviligne centre fissure :',SF
+       print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',(ALPHA*RC*pi/180.0)
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+       ier = ier+1
+       return ier
+    if (NT-2*(NT/2))!=0:
+       print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+       print ' <MACR_ASCOUF_MAIL> nombre de tranches :',NT
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+       ier = ier+1
+       return ier
+    if FISS_COUDE['ABSC_CURV'] and ((BETA<0.) or (BETA>ALPHA)):
+       print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+       print ' <MACR_ASCOUF_MAIL> position angulaire  centre fissure :',BETA
+       print ' <MACR_ASCOUF_MAIL> posi_angul doit etre >= 0 et <= ',ALPHA
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+       ier = ier+1
+       return ier
+#
+# transition d epaisseur
+#
+  if NBTRAN!=0:
+    LCOUDE = ALPHA * RC * pi / 180.0
+    DEXT = 2.0*RM + EP1
+    if (LTRAN<LDEFAU) and (LTRAN>LCOUDE) :
+       print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+       print ' <MACR_ASCOUF_MAIL> debut transition d epaisseur :',LTRAN
+       print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',LDEFAU
+       print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',LCOUDE
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+       ier = ier+1
+       return ier
+    if (TETA1<0.) or (TETA1>30.) :
+       print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+       print ' <MACR_ASCOUF_MAIL> angle de transition TETA1 :',TETA1
+       print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',0.
+       print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',30.
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+       ier = ier+1
+       return ier
+#
+# transition d epaisseur a une pente
+#
+    if NBTRAN==1:
+       if (EP1<12.) or (EP1>80.) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> epaisseur avant la transition :',EP1
+          print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',12.
+          print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',80.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (EP2<20.) or (EP2>110.) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> epaisseur apres la transition :',EP2
+          print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',20.
+          print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',110.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (EP1>EP2) :
+          print ' <MACR_ASCOUF_MAIL> l epaisseur avant la transition'
+          print ' <MACR_ASCOUF_MAIL> doit etre inferieure '
+          print ' <MACR_ASCOUF_MAIL> a celle apres la transition'
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       LTRANF = LTRAN + ((EP2-EP1)/(tan(TETA1)))
+       if (LTRANF>LCOUDE) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> fin transition d epaisseur :',LTRANF
+          print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',LCOUDE
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if DEXT<112. or DEXT>880. :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> diam ext du tube avant transition:',DEXT
+          print ' <MACR_ASCOUF_MAIL> valeur minimum autorisee :',112.
+          print ' <MACR_ASCOUF_MAIL> valeur maximum autorisee :',880.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+#
+# transition d epaisseur a une pente
+#
+    else:
+       if (TETA2<0.) or (TETA2>45.) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> angle de transition TETA2 :',TETA2
+          print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',0.
+          print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',45.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (EP1<7.) or (EP1>35.) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> epaisseur avant 1ere transition :',EP1
+          print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',7.
+          print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',35.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (EP2<15.) or (EP2>40.) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> epaisseur avant 2eme transition :',EP2
+          print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',15.
+          print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',40.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (EPI<15.) or (EPI>40.) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> epaisseur intermediaire :',EPI
+          print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',15.
+          print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',40.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (EP1>EPI) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> l epaisseur avant la transition'
+          print ' <MACR_ASCOUF_MAIL> doit etre inferieure a l epaisseur intermediaire'
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (EP2<EPI) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> l epaisseur apres la transition'
+          print ' <MACR_ASCOUF_MAIL> doit etre inferieure a l epaisseur intermediaire'
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       LTRANF = LTRAN  + (EPI-EP1)/(tan(TETA1))
+       LTRANF = LTRANF + (EP2-EPI)/(tan(TETA2))
+       if (LTRANF>LCOUDE) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> fin transition d epaisseur :',LTRANF
+          print ' <MACR_ASCOUF_MAIL> valeur limite autorisee :',LCOUDE
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+       if (DEXT<77.) or (DEXT>355.) :
+          print ' <MACR_ASCOUF_MAIL> valeur hors domaine de validite'
+          print ' <MACR_ASCOUF_MAIL> diam ext du tube avant transition:',LTRANF
+          print ' <MACR_ASCOUF_MAIL> valeur minimale autorisee :',77.
+          print ' <MACR_ASCOUF_MAIL> valeur maximale autorisee :',355.
+          self.cr.fatal("<F> <MACR_ASCOUF_MAIL> erreur donnees ")
+          ier = ier+1
+          return ier
+#
+################################################################################
+#     --- calcul taille initiale des defauts sur la plaque ---
+################################################################################
+#
+#
+  if FISS_COUDE!=None:
+     DSF=(FISS_COUDE['ABSC_CURV']!=None)
+     AXEAP,AXECP,SFP = ASCFIS(ALPHA, RM, RC, EP1, SUREP, GEOM, FPROF,
+                              DGAXEC, AZIM, POSIT, SF, DSF, BETA, ORIEN)
+  elif MCL_SOUS_EPAIS!=None :
+     ier= ASCSEP(MCL_SOUS_EPAIS,ALPHA,RM,RC,EP1,GEOM,SYME)
+     for ssep in MCL_SOUS_EPAIS:
+         ssep.IDENL = ssep.ILONP/ssep['NB_ELEM_LONGI']*180./(pi*RC)
+         ssep.IDENC = ssep.ICIRP/ssep['NB_ELEM_CIRC']*180./(pi*RM)
+     if SYME=='QUART' :
+#       quart de structure     
+        ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY\
+        = ASCSYM(MCL_SOUS_EPAIS,RM,RC,ALPHA,LTCHAR,LTCLIM)
+     else :
+#       demi-structure ou entiere
+        ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY\
+        = ASCPRE(MCL_SOUS_EPAIS,RM,RC,ALPHA,SYME,LTCHAR,LTCLIM)
+#
+#
+  loc_gibi=aster.repout()
+  logiel = EXEC_MAILLAGE['LOGICIEL'  ]
+  UNITD  = EXEC_MAILLAGE['UNITE_DATG']
+  UNITP  = EXEC_MAILLAGE['UNITE_MGIB']
+  if   logiel=='GIBI98'  : logiel = loc_gibi+'gibi98'
+  elif logiel=='GIBI2000': logiel = loc_gibi+'gibi2000'
+  else                   :
+       self.cr.fatal("<F> <MACR_ASCOUF_MAIL> seuls gibi98 et gibi2000 sont appelableS")
+       ier = ier+1
+       return ier
+#
+#     --- ecriture sur le fichier .datg  de la procedure ---
+#
+# Nom du fichier de commandes pour GIBI
+  nomFichierDATG = 'fort.'+str(UNITD)
+# Nom du fichier de maillage GIBI
+  nomFichierGIBI = 'fort.'+str(UNITP)
+  loc_datg = aster.repdex()
+#
+  if FISS_COUDE!=None:
+#   procedure coude fissure (MOT-CLE FISS_COUDE)
+    write_file_dgib_ASCFDO(nomFichierDATG,RM,RC,ALPHA,NBTRAN,EP1,EP2,EPI,TETA1,
+                           TETA2,LTRAN,SUREP,LTCHAR,LTCLIM,TYPBOL,AXEAP,AXECP,NT,NS,NC,SFP,
+                           ORIEN,AZIM,RC0,RC2,RC3,POSIT,EPSI,NIVMAG,SYME,loc_datg)
+  elif MCL_SOUS_EPAIS!=None :
+     if SOUS_EPAIS_MULTI==None :
+#      procedure coude sous-ep.: (MOT-CLE SOUS_EPAIS_COUDE)  
+       write_file_dgib_ASCSQO(nomFichierDATG,TYPELE,RM,RC,ALPHA,NBTRAN,EP1,EP2,
+                              EPI,TETA1,MCL_SOUS_EPAIS,TETA2,LTRAN,LTCHAR,LTCLIM,GEOM,
+                              SYME,NBEP,NLX,NLY,NIVMAG,loc_datg)
+       write_file_pgib_ASCSQ2(MCL_SOUS_EPAIS,NLX,NLY)
+     else:
+#      procedure coude sous-ep.:(MOT-CLE SOUS_EPAIS_MULTI)
+       write_file_dgib_ASCSP1(nomFichierDATG,TYPELE,MCL_SOUS_EPAIS,NIVMAG,loc_datg)
+       write_file_pgib_ASCSDO(RM,RC,ALPHA,EP1,LTCLIM,LTCHAR,NBEP,
+                              NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,
+                              DNX,DNY,MCL_SOUS_EPAIS,GEOM,SYME)
+       write_file_pgib_ASCSP2(MCL_SOUS_EPAIS,NLX,NLY)
+  else:
+#   procedure coude regle
+    write_file_dgib_ASCRDO(nomFichierDATG,TYPELE,NIVMAG,TYPBOL,ALPHA,RC,RM,EP1,SUREP,
+                           LTCLIM,LTCHAR,NBEP,loc_datg)
+
+  
+# GIBI  
+  EXEC_LOGICIEL( LOGICIEL = logiel ,
+                 ARGUMENT = ( _F(NOM_PARA=nomFichierDATG),
+                              _F(NOM_PARA=nomFichierGIBI), ), )
+# PRE_GIBI
+  PRE_GIBI()
+
+  if SYME == 'QUART' : self.DeclareOut('nomres',self.sd)
+# LIRE_MAILLAGE
+  nomres=LIRE_MAILLAGE(INFO=INFO)
+
+# DEFI_GROUP  1
+
+  motscles={}
+  l_CREA_GROUP_NO=[]
+  l_CREA_GROUP_NO.append('BORD1')
+  l_CREA_GROUP_NO.append('CLGV')
+  l_CREA_GROUP_NO.append('BORD2')
+  l_CREA_GROUP_NO.append('PEAUINT')
+  l_CREA_GROUP_NO.append('PEAUEXT') 
+
+# cas des fissures axisymetriques
+  if FISS_COUDE!=None:
+    if FISS_COUDE['AXIS']=='OUI':
+      motscles['CREA_GROUP_MA']=[]
+      motscles['CREA_GROUP_MA'].append(_F(GROUP_MA = 'FONDFISS',
+                                          NOM      = 'MAIL_ORI',
+                                          POSITION = 'INIT'    , ),) 
+
+# conversion des groupes de mailles en groupes du bloc fissure  
+  if FISS_COUDE!=None:
+    if SYME == 'ENTIER':
+      l_CREA_GROUP_NO.append('NOLIG1')
+      l_CREA_GROUP_NO.append('FACE1')
+    l_CREA_GROUP_NO.append('NOLIG2')
+    l_CREA_GROUP_NO.append('FACE2')
+    l_CREA_GROUP_NO.append('FONDFISS')
+
+  motscles['CREA_GROUP_NO']=[]
+  motscles['CREA_GROUP_NO'].append(_F(GROUP_MA=tuple(l_CREA_GROUP_NO)))
+
+# conversion des groupes de mailles en groupes de noeuds pour les
+# ligaments des sous-ep.
+  if MCL_SOUS_EPAIS!=None:
+    issep=0
+    for ssep in MCL_SOUS_EPAIS:
+      issep=issep+1
+      if ssep['TYPE']=='ELLI':
+        for k in range(2*NLX[issep-1]+1):
+          chtmp=str(issep)+'_'+str(k+1)
+          ch1='CIR'+chtmp
+          ch2='ICI'+chtmp
+          motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
+                                              GROUP_MA = ch1,),)
+        motscles['CREA_GROUP_NO'].append(_F(NOM      = 'IPCEN'+str(issep),
+                                            GROUP_MA = 'PCENT'+str(issep),),)
+        for k in range(2*NLY[issep-1]+1):
+          chtmp=str(issep)+'_'+str(k+1)
+          ch1='LON'+chtmp
+          ch2='ILO'+chtmp
+          motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
+                                              GROUP_MA = ch1,),)
+        for k in range(2*NLX[issep-1]+1):
+          chtmp=str(issep)+'_'+str(k+1)
+          ch1='ICI'+chtmp
+          ch2='OCI'+chtmp
+          ch3='ECI'+chtmp
+          motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
+                                              INTERSEC = ('PEAUEXT',ch1),),)
+          motscles['CREA_GROUP_NO'].append(_F(NOM      = ch3,
+                                              INTERSEC = ('PEAUINT',ch1),),)
+        motscles['CREA_GROUP_NO'].append(_F(NOM      = 'OPCEN'+str(issep),
+                                            INTERSEC = ('PEAUEXT','IPCEN'+str(issep),),),)
+        motscles['CREA_GROUP_NO'].append(_F(NOM      = 'EPCEN'+str(issep),
+                                            INTERSEC = ('PEAUINT','IPCEN'+str(issep),),),)
+        for k in range(2*NLY[issep-1]+1):
+          chtmp=str(issep)+'_'+str(k+1)
+          ch1='ILO'+chtmp
+          ch2='OLO'+chtmp
+          ch3='ELO'+chtmp
+          motscles['CREA_GROUP_NO'].append(_F(NOM      = ch2,
+                                              INTERSEC =  ('PEAUEXT',ch1),),)
+          motscles['CREA_GROUP_NO'].append(_F(NOM      = ch3,
+                                              INTERSEC =  ('PEAUINT',ch1),),)
+        for k in range(2*NLX[issep-1]+1):
+          chtmp=str(issep)+'_'+str(k+1)
+          ch1='CIR'+chtmp
+          ch2='ICI'+chtmp
+          ch3='OCI'+chtmp
+          ch4='ECI'+chtmp  
+          motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
+                                              NOM           = ch1,
+                                              GROUP_NO      = ch2,
+                                              GROUP_NO_ORIG = ch3,
+                                              GROUP_NO_EXTR = ch4,
+                                              PRECISION     = PRECIS,
+                                              CRITERE       = CRITER,),)
+        motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
+                                            NOM           = 'PCENT'+str(issep),
+                                            GROUP_NO      = 'IPCEN'+str(issep),
+                                            GROUP_NO_ORIG = 'OPCEN'+str(issep),
+                                            GROUP_NO_EXTR = 'EPCEN'+str(issep),
+                                            PRECISION     =  PRECIS,
+                                            CRITERE       =  CRITER,),)
+        for k in range(2*NLY[issep-1]+1):
+           chtmp=str(issep)+'_'+str(k+1)
+           ch1='LON'+chtmp
+           ch2='ILO'+chtmp
+           ch3='OLO'+chtmp
+           ch4='ELO'+chtmp  
+           motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
+                                               NOM           = ch1,
+                                               GROUP_NO      = ch2,
+                                               GROUP_NO_ORIG = ch3,
+                                               GROUP_NO_EXTR = ch4,
+                                               PRECISION     = PRECIS,
+                                               CRITERE       = CRITER,),)
+#     1/ noms intermediaires des groupes de noeuds representant les ligaments
+#        des sections: TU,MI,GV et sous-ep.     
+      for k in range(8):
+        motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR3[k]+str(issep),
+                                             GROUP_MA = CAR6[k]+str(issep),),)
+
+    for k in range(3):
+      if SYME == 'ENTIER' or k!=2:
+        for j in range(8):
+          motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR3[j]+SECT[k],
+                                               GROUP_MA = CAR6[j]+SECT[k],),)
+
+#   2/ determination et nommage des noeuds origine et extremite des groupes de noeuds
+#      representant les ligaments de la ou des sections: sous-ep.
+    issep=0
+    for ssep in MCL_SOUS_EPAIS:
+      issep=issep+1
+      for k in range(8):
+        motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR4[k]+str(issep),
+                                             INTERSEC = ('PEAUEXT',CAR3[k]+str(issep),),),)
+        motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR5[k]+str(issep),
+                                             INTERSEC = ('PEAUINT',CAR3[k]+str(issep),),),)        
+#     3/ nommage final des groupes de noeuds representant les ligaments 
+#        de la ou des sections: sous-ep.
+      for k in range(8):
+        motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
+                                            NOM           = CAR6[k]+str(issep),
+                                            GROUP_NO      = CAR3[k]+str(issep),
+                                            GROUP_NO_ORIG = CAR4[k]+str(issep),
+                                            GROUP_NO_EXTR = CAR5[k]+str(issep),
+                                            PRECISION     = PRECIS,
+                                            CRITERE       = CRITER,),)
+
+#   4/ determination et nommage des noeuds origine et extremite des groupes de noeuds
+#      representant les ligaments des sections: TU,MI,GV
+    for k in range(3):
+      if SYME == 'ENTIER' or k!=2:
+        for j in range(8):
+           motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR4[j]+SECT[k],
+                                                INTERSEC = ('PEAUEXT',CAR3[j]+SECT[k],),),) 
+           motscles['CREA_GROUP_NO'].append(_F( NOM      = CAR5[j]+SECT[k],
+                                                INTERSEC = ('PEAUINT',CAR3[j]+SECT[k],),),) 
+#       5/ nommage final des groupes de noeuds representant les ligaments des sections: TU,MI,GV   
+        for j in range(8):    
+           motscles['CREA_GROUP_NO'].append(_F(OPTION        = 'SEGM_DROI_ORDO',
+                                               NOM           = CAR6[j]+SECT[k],
+                                               GROUP_NO      = CAR3[j]+SECT[k],
+                                               GROUP_NO_ORIG = CAR4[j]+SECT[k],
+                                               GROUP_NO_EXTR = CAR5[j]+SECT[k],
+                                               PRECISION     = PRECIS,
+                                               CRITERE       = CRITER,),)
+    
+
+  nomres=DEFI_GROUP(reuse   =nomres,
+                      MAILLAGE=nomres,
+                      **motscles )
+#
+# DEFI_GROUP  2
+  if FISS_COUDE!=None:
+# creation des groupes petit axe et grand axe fissure par
+# intersection de groupes existants
+    motscles={}
+    motscles['CREA_GROUP_NO']=[]
+    l_peau=[]
+    l_intersec=[]
+    if POSIT == 'DEB_INT':
+        l_peau.append('PEAUINT')
+    else:
+        l_peau.append('PEAUEXT')
+    
+    if SYME == 'ENTIER' :
+      l_intersec.append('FACE1')
+      motscles['CREA_GROUP_NO'].append(_F(NOM      = 'P_AXE_1',
+                                          INTERSEC = ('NOLIG1','FACE1'),),)
+      motscles['CREA_GROUP_NO'].append(_F(NOM      = 'G_AXE_1',
+                                          INTERSEC =  tuple(l_peau+l_intersec),),)  
+    l_intersec=[]
+    l_intersec.append('FACE2')  
+    motscles['CREA_GROUP_NO'].append(_F(NOM      = 'P_AXE_2',
+                                        INTERSEC = ('NOLIG2','FACE2'),),)
+    motscles['CREA_GROUP_NO'].append(_F(NOM      = 'G_AXE_2',
+                                        INTERSEC =  tuple(l_peau+l_intersec),),)
+   
+    nomres=DEFI_GROUP(reuse   =nomres,
+                        MAILLAGE=nomres,
+                        **motscles )    
+# AFFE_MODELE
+  __MODELE=AFFE_MODELE( MAILLAGE=nomres,
+                        AFFE=_F( GROUP_MA     = 'COUDE'      ,
+                                 PHENOMENE    = 'MECANIQUE'  ,
+                                 MODELISATION = '3D'         , )
+                         )
+
+# MODI_MAILLAGE  1
+  motscles={}
+  if GEOM == 'COUDE':
+    motscles['TUBE_COUDE']=[]
+    motscles['TUBE_COUDE'].append(_F(ANGLE=ALPHA,
+                                    R_CINTR=RC,
+                                    L_TUBE_P1=LTCHAR),)
+  motscles['PLAQ_TUBE']=[]
+  D_PLAQ_TUBE={}
+  D_PLAQ_TUBE['DEXT']=DEXT
+  D_PLAQ_TUBE['EPAIS']=EP1
+  D_PLAQ_TUBE['L_TUBE_P1']=LTCHAR
+  if SYME == 'QUART' : D_PLAQ_TUBE['COUTURE']='NON'
+  if FISS_COUDE!=None:
+      D_PLAQ_TUBE['AZIMUT']=AZIM
+  elif SOUS_EPAIS_COUDE!=None :
+      D_PLAQ_TUBE['AZIMUT']=MCL_SOUS_EPAIS[0].IPHIC
+  else:pass
+  motscles['PLAQ_TUBE'].append(_F(**D_PLAQ_TUBE),) 
+  nomres=MODI_MAILLAGE( reuse   =nomres,
+                          MAILLAGE=nomres,
+                          **motscles )
+# MODI_MAILLAGE  2
+  motscles={}
+  motscles['ORIE_PEAU_3D']=_F(GROUP_MA=('PEAUINT','EXTUBE'),)
+  if FISS_COUDE!=None:
+    if FISS_COUDE['FISSURE'] == 'DEB_INIT':
+      motscles['ORIE_PEAU_3D']=_F(GROUP_MA=('PEAUINT','EXTUBE','FACE1','FACE2'),)  
+  nomres=MODI_MAILLAGE(reuse   =nomres,
+                       MAILLAGE=nomres,
+                       MODELE  =__MODELE,
+                       **motscles)
+
+# CREA_MAILLAGE
+  if SYME != 'QUART':
+    self.DeclareOut('nomre2',self.sd)
+    motscles={}
+    motscles['CREA_POI1']=[]
+    motscles['CREA_POI1'].append(_F(NOM_GROUP_MA='P1',
+                                    GROUP_NO='P1'),)
+    if TYPBOL == None :
+      motscles['CREA_POI1'].append(_F(NOM_GROUP_MA='P2',
+                                    GROUP_NO='P2'),)    
+    nomre2=CREA_MAILLAGE( MAILLAGE=nomres,
+                          **motscles)
+  else:  
+    nomre2=nomres
+
+# IMPRESSSION
+  if IMPRESSION!=None:
+     if IMPRESSION.__class__.__name__  !='MCList' : IMPRESSION  =[IMPRESSION,]
+     for impr in IMPRESSION :
+#
+         motscles={}
+         if impr['FORMAT']=='IDEAS'  : motscles['VERSION']   =impr['VERSION']
+         if impr['FORMAT']=='CASTEM' : motscles['NIVE_GIBI'] =impr['NIVE_GIBI']
+         if impr['UNITE']!=None      : motscles['UNITE']     =impr['UNITE']
+         impr_resu = _F( MAILLAGE = nomre2,)
+#
+         IMPR_RESU( RESU = impr_resu,
+                    FORMAT= impr['FORMAT'],**motscles)
+
+
+
+  return ier
+
+
diff --git a/Aster/Cata/Macro/stanley_ops.py b/Aster/Cata/Macro/stanley_ops.py
new file mode 100644 (file)
index 0000000..2729d26
--- /dev/null
@@ -0,0 +1,50 @@
+#@ MODIF stanley_ops Macro  DATE 05/04/2004   AUTEUR ASSIRE A.ASSIRE 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
+# (AT YOUR OPTION) ANY LATER VERSION.                                                  
+#                                                                       
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
+#                                                                       
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
+# ======================================================================
+
+def stanley_ops(self,RESULTAT,MODELE,CHAM_MATER,CARA_ELEM,**args):
+
+  """
+     Importation et lancement de Stanley
+  """
+
+  import os,string
+  import aster
+  from Accas import _F
+  from Noyau.N_utils import AsType
+  ier=0
+
+  # La macro compte pour 1 dans la numerotation des commandes
+  self.icmd=1
+
+  import Stanley
+  from Stanley import stanley
+
+  if (RESULTAT and MODELE and CHAM_MATER):
+    _MAIL = aster.getvectjev( string.ljust(MODELE.nom,8) + '.MODELE    .NOMA        ' )
+    _MAIL = string.strip(_MAIL[0])
+    MAILLAGE = self.jdc.g_context[_MAIL]
+    if CARA_ELEM:
+      stanley.STANLEY(RESULTAT,MAILLAGE,MODELE,CHAM_MATER,CARA_ELEM)
+    else:
+      stanley.STANLEY(RESULTAT,MAILLAGE,MODELE,CHAM_MATER,None)
+  else:
+
+    stanley.PRE_STANLEY()
+
+  return ier
diff --git a/Aster/Cata/Macro/test_fichier_ops.py b/Aster/Cata/Macro/test_fichier_ops.py
new file mode 100644 (file)
index 0000000..a885474
--- /dev/null
@@ -0,0 +1,145 @@
+#@ MODIF test_fichier_ops Macro  DATE 30/03/2004   AUTEUR MCOURTOI M.COURTOIS 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
+# (AT YOUR OPTION) ANY LATER VERSION.                                                  
+#                                                                       
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
+#                                                                       
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
+# ======================================================================
+
+def test_fichier_ops(self, FICHIER, NOM_SYSTEME, NB_CHIFFRE, EPSILON, VALE_K, INFO, **args):
+   """
+     Macro TEST_FICHIER permettant de tester la non-regression d'un fichier
+     'a une tolerance' pres pour les nombres reels en calculant
+     le md5sum.
+   """
+   import aster
+   from Accas import _F
+   ier=0
+   # La macro compte pour 1 dans la numerotation des commandes
+   #self.icmd=1
+   self.set_icmd(1)
+
+   # On importe les definitions des commandes a utiliser dans la macro
+   # Le nom de la variable doit etre obligatoirement le nom de la commande
+   CREA_TABLE   =self.get_cmd('CREA_TABLE')
+   TEST_TABLE   =self.get_cmd('TEST_TABLE')
+
+   import os.path
+   from Macro.test_fichier_ops import md5file
+
+   # calcule le md5sum du fichier
+   ier, mdsum = md5file(NOM_SYSTEME, NB_CHIFFRE, EPSILON, INFO)
+   if ier != 0:
+      if ier==4:
+         texte_erreur='Fichier inexistant : '+NOM_SYSTEME
+      else:
+         texte_erreur='Erreur dans md5file, code retour = '+str(ier)
+      texte_erreur='<F> <TEST_FICHIER> '+texte_erreur
+#      raise aster.FatalError,texte_erreur
+      self.cr.fatal(texte_erreur)
+      return ier
+
+   # comparaison a la reference
+   is_ok=0
+   if INFO > 0 :
+      print ' %-20s : %32s' % ('REFERENCE',VALE_K)
+      print
+
+   if mdsum == VALE_K:
+      is_ok=1
+
+   # produit le TEST_TABLE
+   __tab1=CREA_TABLE(LISTE=(_F(PARA='TEST',
+                               TYPE_K='K8',
+                               LISTE_K='VALEUR  ',),
+                            _F(PARA='BOOLEEN',
+                               LISTE_I=is_ok,),),)
+   if args['REFERENCE'] == 'NON_REGRESSION':
+      TEST_TABLE(FICHIER=FICHIER,
+                 TABLE=__tab1,
+                 FILTRE=_F(NOM_PARA='TEST',
+                           VALE_K='VALEUR  ',),
+                 NOM_PARA='BOOLEEN',
+                 VALE_I=1,
+                 PRECISION=1.e-3,
+                 CRITERE='ABSOLU',
+                 REFERENCE=args['REFERENCE'],
+                 VERSION=args['VERSION'],)
+   else:
+      TEST_TABLE(FICHIER=FICHIER,
+                 TABLE=__tab1,
+                 FILTRE=_F(NOM_PARA='TEST',
+                           VALE_K='VALEUR  ',),
+                 NOM_PARA='BOOLEEN',
+                 VALE_I=1,
+                 PRECISION=1.e-3,
+                 CRITERE='ABSOLU',
+                 REFERENCE=args['REFERENCE'],)
+   return ier
+
+
+def md5file(fich,nbch,epsi,info=0):
+   """
+   Cette methode retourne le md5sum d'un fichier en arrondissant les nombres
+   reels a la valeur significative.
+   IN :
+      fich  : nom du fichier
+      nbch : nombre de decimales significatives
+      epsi  : valeur en deca de laquelle on prend 0.
+   OUT :
+      code retour : 0 si ok, >0 sinon
+      md5sum
+   """
+   import os.path
+   import re
+   import string
+   import math
+   import md5
+   #      1 Mo   10 Mo   100 Mo
+   # v0   2.6 s  20.4 s  196.6 s
+   # v1   2.0 s  10.3 s  94.9 s (pas de distinction entier/reel)
+   # remplacer le try/except par if re.search(...), 80% plus lent
+   if not os.path.isfile(fich):
+      return 4, ''
+   f=open(fich,'r')
+   format_float='%'+str(nbch+7)+'.'+str(nbch)+'g'
+   m=md5.new()
+   i=0
+   for ligne in f.xreadlines():
+#python2.3   for ligne in f:
+      i=i+1
+      # pour decouper 123E+987-1.2345
+   #    r=re.split(' +|([0-9]+)\-+',ligne)
+      r=string.split(ligne)
+      for x in r:
+         try:
+            if abs(float(x))<epsi:
+               s='0'
+            else:
+               s=format_float % float(x)
+         except ValueError:
+            s=x
+         if info>=2:
+            print 'LIGNE',i,'VALEUR RETENUE',s
+         m.update(s)
+   f.close()
+   md5sum=m.hexdigest()
+   if info>=1:
+      form=' %-20s : %32s'
+      print form % ('Fichier',fich)
+      print form % ('Nombre de lignes',str(i))
+      print form % ('Format des reels',format_float)
+      print form % ('Epsilon',str(epsi))
+      print form % ('md5sum',md5sum)
+   return 0, md5sum