Salome HOME
AY a ajouté l'interception de l'exception levée lorsque la chaine passée
[tools/eficas.git] / Minicode / cata_saturne.py
index 40975a2d96f828b5e65a94c32a69d7ade8a240d1..5f86f0a5bf153ba664592109b6da8ae283484209 100755 (executable)
@@ -3,21 +3,37 @@
 import Accas
 from Accas import *
 
+#CONTEXT.debug=1
+
 import ops
 
-JdC = JDC_CATA(code='SATURNE',
+JdC = JDC_CATA(code='ASTER',
                execmodul=None,
                regles = (AU_MOINS_UN('DEBUT','POURSUITE'),
                          AU_MOINS_UN('FIN'),
                          A_CLASSER(('DEBUT','POURSUITE'),'FIN')
                         )
-              );
+              )
 
 # P. RASCLE MMN
 # remarques diverses sur le catalogue Saturne
 # - dans les blocs, il faut au moins un mot clé de statut obligatoire
 # probleme de rafraichissement des blocs dépendants quand la valeur d'un mot cle global (ITURB) passe de 1 à 0
 
+# Type le plus general
+class entier  (ASSD):pass
+class reel    (ASSD):pass
+class complexe(ASSD):pass
+class liste   (ASSD):pass
+class chaine  (ASSD):pass
+
+# Type geometriques
+class no  (GEOM):pass
+class grno(GEOM):pass
+class ma  (GEOM):pass
+class grma(GEOM):pass
+
+
 class sonde(ASSD):pass
 class varsca(ASSD):pass
 class flusca(ASSD):pass
@@ -36,7 +52,42 @@ class tsr23(ASSD):pass
 class resti(ASSD):pass
 
 class maillage(ASSD):pass
-class listr8          (ASSD):pass
+class modele(ASSD):pass
+class matr_asse(ASSD):pass
+class cham_elem_sief_r(ASSD):pass
+class theta_geom(ASSD):pass
+class cham_mater(ASSD):pass
+class cara_elem(ASSD):pass
+class char_ther(ASSD):pass
+class char_meca(ASSD):pass
+class nume_ddl(ASSD):pass
+class char_acou(ASSD):pass
+class listr8 (ASSD):pass
+class matr_elem(ASSD):pass
+class matr_elem_depl_c(matr_elem):pass
+class matr_elem_depl_r(matr_elem):pass
+class matr_elem_pres_c(matr_elem):pass
+class matr_elem_temp_r(matr_elem):pass
+class mater           (ASSD):pass
+
+
+# fonction :
+#--------------------------------
+class para_sensi(fonction):pass
+class fonction_c(fonction):pass
+
+# matr_asse :
+#--------------------------------
+class matr_asse(ASSD):pass
+class matr_asse_depl_c(matr_asse):pass
+class matr_asse_depl_r(matr_asse):pass
+class matr_asse_gene_r(matr_asse):pass
+class matr_asse_gene_c(matr_asse):pass
+class matr_asse_pres_c(matr_asse):pass
+class matr_asse_pres_r(matr_asse):pass
+class matr_asse_temp_c(matr_asse):pass
+class matr_asse_temp_r(matr_asse):pass
+
 
 # fin entete
 
@@ -101,6 +152,33 @@ FORMULE = FORM( nom='FORMULE',op=-5,sd_prod=fonction,
                 COMPLEXE = SIMP(typ = 'shell',max=1),
 ) ;
 
+AFFE_MODELE=OPER(nom="AFFE_MODELE",op=18,sd_prod=modele,docu="U4.41.01-f1",
+                 fr="Affectation des éléments finis sur le maillage",reentrant='n',
+         MAILLAGE        =SIMP(statut='o',typ=(maillage) ),
+         INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2) ),
+         VERIF           =SIMP(statut='f',typ='TXM',max=2,into=("MAILLE","NOEUD") ),
+                );
+NUME_DDL=OPER(nom="NUME_DDL",op=11,sd_prod=nume_ddl,docu="U4.61.11-f",reentrant='n',
+              fr="Etablissement de la numérotation des ddl avec ou sans renumérotation et du stockage de la matrice",
+         MATR_RIGI       =SIMP(statut='f',typ=(matr_elem_depl_r ,matr_elem_depl_c,
+                                               matr_elem_temp_r,matr_elem_pres_c),max=100 ),
+         MODELE          =SIMP(statut='f',typ=modele ),
+         b_modele        =BLOC(condition = "MODELE != None",
+           CHARGE     =SIMP(statut='f',max='**',typ=(char_meca,char_ther,char_acou, ),),
+         ),
+         METHODE         =SIMP(statut='f',typ='TXM',defaut="MULT_FRONT",into=("MULT_FRONT","LDLT","GCPC") ),
+         b_mult_front    =BLOC(condition="METHODE=='MULT_FRONT'",fr="paramètres associés à la méthode multifrontale",
+           RENUM           =SIMP(statut='f',typ='TXM',into=("MD","MDA","METIS"),defaut="METIS" ),
+         ),
+         b_ldlt          =BLOC(condition="METHODE=='LDLT'",fr="paramètres associés à la méthode LDLT",
+           RENUM           =SIMP(statut='f',typ='TXM',into=("RCMK","SANS"),defaut="RCMK"  ),
+         ),
+         b_gcpc          =BLOC(condition="METHODE=='GCPC'",fr="paramètres associés à la méthode gradient conjugué",
+           RENUM           =SIMP(statut='f',typ='TXM',into=("RCMK","SANS"),defaut="RCMK"  ),
+         ),
+         INFO            =SIMP(statut='f',typ='I',into=(1,2)),
+)  ;
+
 DEFI_SONDE = OPER(nom="DEFI_SONDE",op= 1,sd_prod=sonde,
      docu="U2D1",
      fr="définition d'une sonde historique avec ses coordonnées",
@@ -1229,3 +1307,448 @@ FIN=PROC(nom="FIN",op=9999,repetable='n',fr="Fin d'une 
 )  ;
 
 
+def macro_matr_asse_ops(self,MODELE,CHAM_MATER,CARA_ELEM,MATR_ASSE,
+                        SOLVEUR,NUME_DDL,CHARGE,INST,**args):
+  """
+     Ecriture de la macro MACRO_MATR_ASSE
+  """
+  ier=0
+  # On met le mot cle NUME_DDL dans une variable locale pour le proteger
+  numeddl=NUME_DDL
+  # 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_MATR_ELEM=self.get_cmd('CALC_MATR_ELEM')
+  NUME_DDL      =self.get_cmd('NUME_DDL')
+  ASSE_MATRICE  =self.get_cmd('ASSE_MATRICE')
+  # La macro compte pour 1 dans la numerotation des commandes
+  self.icmd=1
+
+  if SOLVEUR:
+    methode=SOLVEUR['METHODE']
+    if methode=='LDLT':
+      if SOLVEUR['RENUM']:
+         renum=SOLVEUR['RENUM']
+      else:
+         renum='RCMK'
+      if renum not in ('SANS','RCMK'):
+        ier=ier+1
+        self.cr.fatal("Avec methode LDLT, RENUM doit etre SANS ou RCMK.")
+        return ier
+    elif methode=='MULT_FRONT':
+      if SOLVEUR['RENUM']:
+         renum=SOLVEUR['RENUM']
+      else:
+         renum='MDA'
+      if renum not in ('MDA','MD','METIS'):
+        ier=ier+1
+        self.cr.fatal("Avec methode MULT_FRONT, RENUM doit etre MDA, MD ou RCMK.")
+        return ier
+    elif methode=='GCPC':
+      if SOLVEUR['RENUM']:
+         renum=SOLVEUR['RENUM']
+      else:
+         renum='SANS'
+      if renum not in ('SANS','RCMK'):
+        ier=ier+1
+        self.cr.fatal("Avec methode GCPC, RENUM doit etre SANS ou RCMK.")
+        return ier
+  else:
+    methode='MULT_FRONT'
+    renum  ='MDA'
+
+  if numeddl in self.sdprods:
+    # Si le concept numeddl est dans self.sdprods
+    # il doit etre  produit par la macro
+    # il faudra donc appeler la commande NUME_DDL
+    lnume = 1
+  else:
+    lnume = 0
+  lrigel = 0
+  lmasel = 0
+
+  iocc=0
+  for m in MATR_ASSE:
+    iocc=iocc+1
+    option=m['OPTION']
+    if iocc == 1 and lnume == 1 and option not in ('RIGI_MECA','RIGI_MECA_LAGR',
+                                                   'RIGI_THER','RIGI_ACOU')      :
+      ier=ier+1
+      self.cr.fatal("LA PREMIERE OPTION DOIT ETRE RIGI_MECA OU RIGI_THER OU RIGI_ACOU OU RIGI_MECA_LAGR")
+      return ier
+
+    if m['SIEF_ELGA']!=None and option!='RIGI_GEOM':
+      ier=ier+1
+      self.cr.fatal("SIEF_ELGA N EST ADMIS QU AVEC L OPTION RIGI_GEOM")
+      return ier
+
+    if m['MODE_FOURIER']!=None and option not in ('RIGI_MECA','RIGI_FLUI_STRU','RIGI_THER'):
+      ier=ier+1
+      self.cr.fatal("MODE_FOURIER N EST ADMIS QU AVEC UNE DES OPTIONS RIGI_MECA RIGI_FLUI_STRU RIGI_THER")
+      return ier
+
+    if (m['THETA']!=None or m['PROPAGATION']!=None) and option!='RIGI_MECA_LAGR':
+      ier=ier+1
+      self.cr.fatal("PROPAGATION ET,OU THETA NE SONT ADMIS QU AVEC L OPTION RIGI_MECA_LAGR")
+      return ier
+    motscles={'OPTION':option}
+    if option == 'AMOR_MECA':
+       if (not lrigel or not lmasel):
+          ier=ier+1
+          self.cr.fatal("""POUR CALCULER AMOR_MECA, IL FAUT AVOIR CALCULE
+                           RIGI_MECA ET MASS_MECA AUPARAVANT (DANS LE MEME APPEL)""")
+          return ier
+       if CHAM_MATER != None:
+          motscles['RIGI_MECA']   =rigel
+          motscles['MASS_MECA']   =masel
+    if CHARGE     != None:
+       if option[0:9] not in ('MASS_THER','RIGI_GEOM','MASS_ID_M'):
+                           motscles['CHARGE']      =CHARGE
+    if CHAM_MATER != None: motscles['CHAM_MATER']  =CHAM_MATER
+    if CARA_ELEM  != None: motscles['CARA_ELEM']   =CARA_ELEM
+    if INST       != None: motscles['INST']        =INST
+    if m['SIEF_ELGA']   :  motscles['SIEF_ELGA']   =m['SIEF_ELGA']
+    if m['MODE_FOURIER']:  motscles['MODE_FOURIER']=m['MODE_FOURIER']
+    if m['THETA']       :  motscles['THETA']       =m['THETA']
+    if m['PROPAGATION'] :  motscles['PROPAGATION'] =m['PROPAGATION']
+    __a=CALC_MATR_ELEM(MODELE=MODELE,**motscles)
+
+    if option == 'RIGI_MECA':
+      rigel  = __a
+      lrigel = 1
+    if option == 'MASS_MECA':
+      masel  = __a
+      lmasel = 1
+
+    if lnume and option in ('RIGI_MECA','RIGI_THER','RIGI_ACOU','RIGI_MECA_LAGR'):
+      self.DeclareOut('num',numeddl)
+      # On peut passer des mots cles egaux a None. Ils sont ignores
+      num=NUME_DDL(MATR_RIGI=__a,METHODE=methode,RENUM=renum)
+    else:
+      num=numeddl
+
+    self.DeclareOut('mm',m['MATRICE'])
+    mm=ASSE_MATRICE(MATR_ELEM=__a,NUME_DDL=num)
+  return ier
+
+def macro_matr_asse_prod(self,NUME_DDL,MATR_ASSE,**args):
+  if not MATR_ASSE:  raise AsException("Impossible de typer les concepts resultats")
+  if not NUME_DDL:  raise AsException("Impossible de typer les concepts resultats")
+  self.type_sdprod(NUME_DDL,nume_ddl)
+  for m in MATR_ASSE:
+    opti=m['OPTION']
+
+    if opti in ( "RIGI_MECA","RIGI_FLUI_STRU","RIGI_MECA_LAGR" ,
+       "MASS_MECA" , "MASS_FLUI_STRU" ,"RIGI_GEOM" ,"RIGI_ROTA",
+       "AMOR_MECA","IMPE_MECA","MASS_ID_MDEP_R","MASS_ID_MDNS_R",
+       "ONDE_FLUI","MASS_MECA_DIAG" ) : t=matr_asse_depl_r
+
+    if opti in ( "RIGI_ACOU","MASS_ACOU","AMOR_ACOU",) : t=matr_asse_pres_c
+
+    if opti in ( "RIGI_THER","MASS_THER","RIGI_THER_CONV" ,
+       "RIGI_THER_CONV_D","MASS_ID_MTEM_R","MASS_ID_MTNS_R",) : t=matr_asse_temp_r
+
+    if opti == "RIGI_MECA_HYST"   : t= matr_asse_depl_c
+
+    self.type_sdprod(m['MATRICE'],t)
+  return None
+
+MACRO_MATR_ASSE=MACRO(nom="MACRO_MATR_ASSE",op=macro_matr_asse_ops,docu="U4.61.21-c",
+                      sd_prod=macro_matr_asse_prod,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MODELE          =SIMP(statut='o',typ=modele),
+         CHAM_MATER      =SIMP(statut='f',typ=cham_mater),
+         CARA_ELEM       =SIMP(statut='f',typ=cara_elem),
+         CHARGE          =SIMP(statut='f',typ=(char_meca,char_ther,char_acou)),
+         INST            =SIMP(statut='f',typ='R'),
+         NUME_DDL        =SIMP(statut='o',typ=(nume_ddl,CO)),
+         SOLVEUR         =FACT(statut='d',min=01,max=01,
+           METHODE         =SIMP(statut='f',typ='TXM',defaut="MULT_FRONT",
+                                 into=("LDLT","MULT_FRONT","GCPC")),
+           RENUM           =SIMP(statut='f',typ='TXM',into=("SANS","RCMK","MD","MDA","METIS")),
+         ),
+         MATR_ASSE       =FACT(statut='o',min=01,max='**',
+           MATRICE         =SIMP(statut='o',typ=(matr_asse,CO)),
+           OPTION          =SIMP(statut='o',typ='TXM',
+                                 into=("RIGI_MECA","MASS_MECA","MASS_MECA_DIAG",
+                                       "AMOR_MECA","RIGI_MECA_HYST","IMPE_MECA",
+                                       "ONDE_FLUI","RIGI_FLUI_STRU","MASS_FLUI_STRU",
+                                       "RIGI_ROTA","RIGI_GEOM","RIGI_MECA_LAGR",
+                                       "RIGI_THER","MASS_THER",
+                                       "RIGI_ACOU","MASS_ACOU","AMOR_ACOU",
+                                       "MASS_ID_MTEM_R","MASS_ID_MTNS_R","MASS_ID_MDEP_R","MASS_ID_MDNS_R",)
+                                 ),
+           SIEF_ELGA       =SIMP(statut='f',typ=cham_elem_sief_r),
+           MODE_FOURIER    =SIMP(statut='f',typ='I'),
+           THETA           =SIMP(statut='f',typ=theta_geom),
+           PROPAGATION     =SIMP(statut='f',typ='R'),
+         ),
+         TITRE           =SIMP(statut='f',typ='TXM',max='**'),
+         INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2)),
+)  ;
+
+
+def defi_valeur_prod(self,IS=None,R8=None,TX=None,C8=None,LS=None):
+  if IS != None  : return entier
+  if R8 != None  : return reel
+  if TX != None  : return chaine
+  if C8 != None  : return complexe
+  if LS != None  : return liste
+  raise AsException("type de concept resultat non prevu")
+
+DEFI_VALEUR=MACRO(nom="DEFI_VALEUR",op=-4,sd_prod=defi_valeur_prod,
+                 fr="Affectation d une valeur à une variable Superviseur",
+                 docu="U4.31.04-e1",reentrant='f',
+         regles=(UN_PARMI('IS','R8','TX','C8','LS'),),
+         IS              =SIMP(statut='f',typ='I',max='**'),
+         R8              =SIMP(statut='f',typ='R',max='**'),
+         TX              =SIMP(statut='f',typ='TXM',max='**'),
+         C8              =SIMP(statut='f',typ='C',max='**'),
+         LS              =SIMP(statut='f',typ='L',max='**'),
+)  ;
+
+def macro2_prod(self,MODELE,**args):
+   return maillage
+
+MACRO2 =MACRO(nom="MACRO2",op= -5 ,docu="U4.61.21-c",
+                      sd_prod=macro2_prod,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MODELE          =SIMP(statut='o',typ=modele),
+);
+
+def macro3_prod(self,MAILLAGE,MAIL2,**args):
+   self.type_sdprod(MAIL2,maillage)
+   if not MAILLAGE:return None
+   return maillage
+
+MACRO3 =MACRO(nom="MACRO3",op= -5 ,docu="U4.61.21-c",
+                      sd_prod=macro3_prod,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MAILLAGE          =SIMP(statut='f',typ=maillage),
+         MAIL2          =SIMP(statut='o',typ=(CO,maillage)),
+);
+
+def errmacro_prod(self,MAILLAGE,**args):
+   #Erreur de programmation
+   a=1/0
+   return maillage
+
+ERRMACRO =MACRO(nom="ERRMACRO",op= -5 ,docu="U4.61.21-c",
+                      sd_prod=errmacro_prod,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MAILLAGE          =SIMP(statut='o',typ=maillage),
+);
+
+def erroper_prod(self,MAILLAGE,**args):
+   #Erreur de programmation
+   a=1/0
+   return maillage
+
+ERROPER =OPER(nom="ERROPER",op= -5 ,docu="U4.61.21-c",
+                      sd_prod=erroper_prod,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MAILLAGE          =SIMP(statut='o',typ=maillage),
+);
+
+def errproc_init(self,MAILLAGE,**args):
+   #Erreur de programmation
+   a=1/0
+
+ERRPROC =PROC(nom="ERRPROC",op= -5 ,docu="U4.61.21-c",
+                      op_init=errproc_init,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MAILLAGE          =SIMP(statut='o',typ=maillage),
+);
+
+class concept(ASSD):pass
+
+def op1_prod(x,**args):
+   if x == 0:return concept
+   if x == 1:return concept
+   raise AsException("type de concept resultat non prevu")
+
+OP1 = OPER(nom='OP1',op=1,sd_prod=op1_prod,reentrant='f',
+           a=SIMP(statut='o',typ='I',into=(0,1,2)),
+           b=SIMP(typ=concept),
+           ccc=FACT(statut='d',d=SIMP(typ='I'),e=SIMP(typ='I')),
+           b_1=BLOC(condition="a==0",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                   ),
+           b_2=BLOC(condition="a==1",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    b_2=BLOC(condition="1",
+                             cc=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                             c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                            ),
+                   ),
+          );
+
+
+def op2_prod(self,x,**args):
+   if x == 0:return concept
+   if x == 1:return concept
+   raise AsException("type de concept resultat non prevu")
+
+OP2 = MACRO(nom='OP2',op=1,sd_prod=op2_prod,reentrant='f',
+           a=SIMP(statut='o',typ='I',into=(0,1,2)),
+           b=SIMP(typ=concept),
+           ccc=FACT(statut='d',d=SIMP(typ='I'),e=SIMP(typ='I')),
+           b_1=BLOC(condition="a==0",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                   ),
+           b_2=BLOC(condition="a==1",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    b_2=BLOC(condition="1",
+                             cc=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                             c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                            ),
+                   ),
+          );
+
+DETRUIRE=PROC(nom="DETRUIRE",op=-7,docu="U4.14.01-d",
+            UIinfo={"groupes":("Gestion du travail",)},
+              fr="Destruction d un concept utilisateur dans la base GLOBALE",
+             op_init=ops.detruire,
+            CONCEPT     =FACT(statut='o',min=01,
+            NOM         =SIMP(statut='o',typ=assd,max='**'),
+        ),
+);
+
+INCLUDE_MATERIAU=MACRO(nom="INCLUDE_MATERIAU",op=-14,docu="U4.43.02-a",
+            UIinfo={"groupes":("Modélisation",)},
+                       fr=" ",
+         sd_prod=ops.INCLUDE_MATERIAU,op_init=ops.INCLUDE_context,fichier_ini=0,
+         NOM_AFNOR       =SIMP(statut='o',typ='TXM' ),
+         TYPE_MODELE     =SIMP(statut='o',typ='TXM',into=("REF","PAR") ),
+         VARIANTE        =SIMP(statut='o',typ='TXM',
+                               into=("A","B","C","D","E","F","G","H","I","J",
+                                     "K","L","M","N","O","P","Q","R","S","T","U","V",
+                                     "W","X","Y","Z",) ),
+         TYPE_VALE       =SIMP(statut='o',typ='TXM',into=("NOMI","MINI","MAXI") ),
+         NOM_MATER       =SIMP(statut='o',typ='TXM' ),
+         UNITE           =SIMP(statut='f',typ='I',defaut= 32 ),
+         EXTRACTION      =FACT(statut='f',min=1,max=99,
+           COMPOR          =SIMP(statut='o',typ='TXM' ),
+           TEMP_EVAL       =SIMP(statut='o',typ='R' ),
+         ),
+         INFO            =SIMP(statut='f',typ='I',defaut= 1,into=(1,2) ),
+)  ;
+
+def defi_fonction_prod(VALE,VALE_PARA,VALE_C,NOEUD_PARA,**args):
+  if VALE != None  : return fonction
+  if VALE_C != None  : return fonction_c
+  if VALE_PARA != None  : return fonction
+  if NOEUD_PARA != None  : return fonction
+  raise AsException("type de concept resultat non prevu")
+
+DEFI_FONCTION=OPER(nom="DEFI_FONCTION",op=3,sd_prod=defi_fonction_prod
+                    ,fr="Définition des valeurs réelles ou complexes d une fonction réelle",
+                     docu="U4.31.02-g3",reentrant='n',
+            UIinfo={"groupes":("Fonction",)},
+         regles=(UN_PARMI('VALE','VALE_C','VALE_PARA','NOEUD_PARA'),),
+         NOM_PARA        =SIMP(statut='o',typ='TXM',
+                               into=("DX","DY","DZ","DRX","DRY","DRZ","TEMP",
+                                     "INST","X","Y","Z","EPSI","META","FREQ","PULS",
+                                     "AMOR","ABSC","SIGM","HYDR","SECH","PORO","SAT",
+                                     "PGAZ","PCAP","VITE") ),
+         NOM_RESU        =SIMP(statut='f',typ='TXM',defaut="TOUTRESU"),
+         VALE            =SIMP(statut='f',typ='R',min=2,max='**',
+                               fr ="Fonction réelle définie par une liste de couples (abscisse,ordonnée)"),
+         VALE_C          =SIMP(statut='f',typ='R',min=2,max='**',
+                               fr ="Fonction complexe définie par une liste de couples"),
+         VALE_PARA       =SIMP(statut='f',typ=listr8,
+                               fr ="Fonction réelle définie par deux concepts de type listr8" ),
+         b_vale_para     =BLOC(condition = "VALE_PARA != None",
+           VALE_FONC       =SIMP(statut='o',typ=listr8 ),
+         ),
+         NOEUD_PARA      =SIMP(statut='f',typ=no,max='**',
+                               fr ="Fonction réelle définie par une liste de noeuds et un maillage"),
+         b_noeud_para    =BLOC(condition = "NOEUD_PARA != None",
+           MAILLAGE        =SIMP(statut='o',typ=maillage ),
+           VALE_Y          =SIMP(statut='o',typ='R',max='**'),
+         ),
+
+         INTERPOL        =SIMP(statut='f',typ='TXM',max=2,defaut="LIN",into=("NON","LIN","LOG") ),
+         PROL_DROITE     =SIMP(statut='f',typ='TXM',defaut="EXCLU",into=("CONSTANT","LINEAIRE","EXCLU") ),
+         PROL_GAUCHE     =SIMP(statut='f',typ='TXM',defaut="EXCLU",into=("CONSTANT","LINEAIRE","EXCLU") ),
+         VERIF           =SIMP(statut='f',typ='TXM',defaut="CROISSANT",into=("CROISSANT","NON") ),
+         INFO            =SIMP(statut='f',typ='I',defaut= 1,into=( 1 , 2) ),
+         TITRE           =SIMP(statut='f',typ='TXM',max='**'),
+)  ;
+
+DEFI_MATERIAU=OPER(nom="DEFI_MATERIAU",op=5,sd_prod=mater,
+                   fr="Définition des paramètres décrivant le comportement d un matériau",
+                   docu="U4.43.01-g4",reentrant='n',
+            UIinfo={"groupes":("Modélisation",)},
+       regles=(EXCLUS('ELAS','ELAS_FO','ELAS_FLUI','ELAS_ISTR','ELAS_ISTR_FO','ELAS_ORTH',
+                      'ELAS_ORTH_FO','ELAS_COQUE','ELAS_COQUE_FO',
+                      'SURF_ETAT_SATU','CAM_CLAY_THM','SURF_ETAT_NSAT'),
+               EXCLUS('THER','THER_FO','THER_ORTH','THER_NL'),
+               ),
+#
+# comportement élastique
+#
+           ELAS            =FACT(statut='f',min=0,max=1,
+             E               =SIMP(statut='o',typ='R',val_min=0.E+0),
+             NU              =SIMP(statut='o',typ='R',val_min=-1.E+0,val_max=0.5E+0),
+             RHO             =SIMP(statut='f',typ='R'),
+             ALPHA           =SIMP(statut='f',typ='R'),
+             AMOR_ALPHA      =SIMP(statut='f',typ='R'),
+             AMOR_BETA       =SIMP(statut='f',typ='R'),
+             AMOR_HYST       =SIMP(statut='f',typ='R'),
+           ),
+           ELAS_FO         =FACT(statut='f',min=0,max=1,
+             regles=(PRESENT_PRESENT('ALPHA','TEMP_DEF_ALPHA'),),
+             E               =SIMP(statut='o',typ=fonction),
+             NU              =SIMP(statut='o',typ=fonction),
+             RHO             =SIMP(statut='f',typ='R'),
+             TEMP_DEF_ALPHA  =SIMP(statut='f',typ='R'),
+             PRECISION       =SIMP(statut='f',typ='R',defaut= 1.),
+             ALPHA           =SIMP(statut='f',typ=fonction),
+             AMOR_ALPHA      =SIMP(statut='f',typ=fonction),
+             AMOR_BETA       =SIMP(statut='f',typ=fonction),
+             AMOR_HYST       =SIMP(statut='f',typ=fonction),
+             K_DESSIC        =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
+             B_ENDOGE        =SIMP(statut='f',typ='R',defaut= 0.E+0 ),
+             FONC_DESORP     =SIMP(statut='f',typ=fonction),
+             VERI_P1         =SIMP(statut='c',typ='TXM',defaut="TEMP",into=("TEMP","INST",) ),
+             VERI_P2         =SIMP(statut='c',typ='TXM',defaut="INST",into=("TEMP","INST",) ),
+             VERI_P3         =SIMP(statut='c',typ='TXM',defaut="HYDR",into=("HYDR",) ),
+             VERI_P4         =SIMP(statut='c',typ='TXM',defaut="SECH",into=("SECH",) ),
+           ),
+#
+# comportement thermique
+#
+           THER_NL         =FACT(statut='f',min=0,max=1,
+             regles=(UN_PARMI('BETA','RHO_CP', ),),
+             LAMBDA          =SIMP(statut='o',typ=fonction),
+             BETA            =SIMP(statut='f',typ=fonction),
+             RHO_CP          =SIMP(statut='f',typ=fonction),
+             VERI_P1         =SIMP(statut='c',typ='TXM',defaut="TEMP",into=("TEMP",) ),
+           ),
+           THER_HYDR       =FACT(statut='f',min=0,max=1,
+             LAMBDA          =SIMP(statut='o',typ=fonction),
+             BETA            =SIMP(statut='f',typ=fonction),
+             AFFINITE        =SIMP(statut='o',typ=fonction),
+             CHALHYDR        =SIMP(statut='o',typ='R'),
+             QSR_K           =SIMP(statut='o',typ='R'),
+             VERI_P1         =SIMP(statut='c',typ='TXM',defaut="TEMP",into=("HYDR",) ),
+             VERI_P2         =SIMP(statut='c',typ='TXM',defaut="HYDR",into=("HYDR",) ),
+           ),
+           THER            =FACT(statut='f',min=0,max=1,
+             LAMBDA          =SIMP(statut='o',typ='R'),
+             RHO_CP          =SIMP(statut='f',typ='R'),
+           ),
+           THER_FO         =FACT(statut='f',min=0,max=1,
+             LAMBDA          =SIMP(statut='o',typ=fonction),
+             RHO_CP          =SIMP(statut='f',typ=fonction),
+             VERI_P1         =SIMP(statut='c',typ='TXM',defaut="INST",into=("INST",) ),
+           ),
+)
+
+RETOUR=PROC(nom="RETOUR",op= -2,docu="U4.13.02-e",
+            UIinfo={"groupes":("Gestion du travail",)},
+            fr="Retour au fichier de commandes appelant",
+) ;
+