]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
mise à jour avec la branche de developpement pour Clement Stutz V9_8_ReacteurNumerique_Dev_UQ
authorPASCALE NOYRET <pascale.noyret@edf.fr>
Fri, 9 Sep 2022 12:34:43 +0000 (14:34 +0200)
committerPASCALE NOYRET <pascale.noyret@edf.fr>
Fri, 9 Sep 2022 12:34:43 +0000 (14:34 +0200)
13 files changed:
Efi2Xsd/AccasXsd.py
Ihm/I_MCCOMPO.py
Ihm/I_OBJECT.py
InterfaceQT4/editor.py
InterfaceQT4/editorSsIhm.py
InterfaceQT4/groupe.py
Noyau/N_BLOC.py
Noyau/N_ENTITE.py
ReacteurNumerique/cata_RN_EDG.py
ReacteurNumerique/cata_RN_EDG_UQ.py [deleted file]
ReacteurNumerique/cata_RN_UQ.py
ReacteurNumerique/cata_UQ.py
generator/post_csv_rn.py [new file with mode: 0644]

index 3a3749b00ca0f0a106798585add23abe15cdaef3..2cc9258044ec3307b793b0499fec34f9724984b5 100755 (executable)
@@ -137,28 +137,32 @@ class X_definition:
             cata.dictTypesXSD[nom].append(self)
 
     def definitNomDuTypePyxb(self,forceACreer=False,debug=False):
+        #if self.nom == 'A' : debug = True
         if debug : print ('definitNomDuTypePyxb', self, self.nom,self.nomComplet(),forceACreer)
         #PNPN
         if hasattr(self,'nomDuTypePyxb') : self.aCreer = False; return self.nomDuTypePyxb
-        #debug=False
         if debug : print ('definitNomDuTypePyxb traitement pour ',  self.nom)
         self.aCreer = True
         cata = CONTEXT.getCurrentCata()
         nom='T_'+self.nom
         if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
+        if debug : print (nom in cata.dictTypesXSD.keys())
         if not (nom in cata.dictTypesXSD.keys()) :
             if debug : print ('definitNomDuTypePyxb encore jamais traite ',  self.nom , ' a pour type' , nom)
             cata.dictTypesXSD[nom] = [self,]
             self.nomDuTypePyxb=nom
             return nom
+        if debug : print ( cata.dictTypesXSD[nom])
 
+        if debug : print ('definitNomDuTypePyxb deja traite ',  self.nom , ' suite de l algo' )
         if nom == 'T_Consigne' : return nom
 
         if debug : print ('forceACreer : ', forceACreer)
+        debug=True
         if not forceACreer :
             self.aCreer = False
             listePossible=cata.dictTypesXSD[nom]
-            if debug : print ('listePossible : ', listePossible)
+            if debug : print ('listePossible : ', listePossible, 'pour ', nom )
             indice=0
             while (indice < len(listePossible)) :
                 objAComparer=listePossible[indice]
@@ -190,9 +194,15 @@ class X_compoFactoriseAmbigu(X_definition):
 # ----------------------------------------
 
     def __init__(self,nom,listeDeCreation,pere, debug=False):
-
+        debug=True
+        #if pere.nom == 'Test_Ambigu' : debug=True
         if debug :
-            for i in listeDeCreation : print (i.nom)
+            print ('___________________________________________________________________')
+            for i in listeDeCreation :
+                print (i.nom)
+                print (i, type(i))
+                print (i.possedeDejaUnMCFactorise)
+            print ('___________________________________________________________________')
         self.label='BlocAmbigu'
         self.nom=nom
         self.pere=pere
@@ -202,15 +212,20 @@ class X_compoFactoriseAmbigu(X_definition):
         self.typesXSDDejaDumpes=[]
         self.ordre_mc=[]
         self.lesConditions = 'Possible Conditions : '
+        if debug : print ('je suis dans compoFactoriseAmbigu pour', self.pere, self.pere.nom)
+        doitReecrireLesTypes=False
         for mc in listeDeCreation :
             if hasattr(mc, 'condition'):self.lesConditions += '\n\t\t\t\t\t\t' + mc.condition
+            doitReecrireLesTypes+=mc.possedeDejaUnMCFactorise
             self.mcXSD.append(mc)
             self.ordre_mc.append(mc.nom)
-
+        if debug : print ('doitReecrireLesTypes', doitReecrireLesTypes)
         if debug : print (self.mcXSD)
         if debug : print (self.ordre_mc)
         self.construitEntites(self.mcXSD)
         self.constructionArbrePossibles()
+        debug=False
+
         lesPossibles=deepcopy(self.arbrePossibles)
         if debug : print ('lesPossibles ', lesPossibles)
 
@@ -224,6 +239,14 @@ class X_compoFactoriseAmbigu(X_definition):
         lesPossibles.remove([])
         if debug : print ('________________ init de compoAmbigu',self.nom, lesPossibles)
         if debug : print ('self.entites', self.entites)
+        cata = CONTEXT.getCurrentCata()
+        if doitReecrireLesTypes :
+            for nom in self.entites.keys() :
+                 for mc in self.entites[nom]:
+                     try : cata.dictTypesXSD[nom].remove(mc)
+                     except : pass
+                     cata.dictTypesXSD[nom].remove(mc)
+                     if hasattr(mc, 'nomDuTypePyxb'): delattr(mc, 'nomDuTypePyxb'); print ('iiii', nom)
         self.mcXSD=self.factoriseEtCreeDump(lesPossibles,nomAppel='Root')
         if debug : print ('self.mcXSD',self.mcXSD)
         self.texteComplexe += finTypeSubstDsBlocFactorise
@@ -242,9 +265,11 @@ class X_compoFactoriseAmbigu(X_definition):
         return False
 
     def construitEntites(self, laListe):
+        debug = True
         for mc in laListe :
             if mc.nom in self.entites.keys() : self.entites[mc.nom].append(mc)
             else : self.entites[mc.nom] = [mc,]
+            if debug : print ('mc.nom', mc.nom, hasattr(mc, 'nomDuTypePyxb'))
             if mc.label == 'BLOC' or  mc.label == 'BlocAmbigu':
                 self.ajouteLesMCFilsAEntite(mc)
 
@@ -416,7 +441,7 @@ class X_compoFactoriseAmbigu(X_definition):
     def ajouteAuxTextes(self,nomMC,indent,debug=False) :
         if debug : 
             print ('______________________________________________________')
-            print ('ajouteAuxTextes', nomMC, self.nom)
+            print ('ajouteAuxTextes', nomMC, self.nom, self.entites[nomMC])
  
         #  for i in self.entites.keys() : print (self.entites[i][0].nom)
         if (indent  > 3) : indent = indent - 3
@@ -447,7 +472,6 @@ class X_compoFactoriseAmbigu(X_definition):
         if debug : print (nomMC, 'dans ajoute vraiment aux textes' )
         if len(self.entites[nomMC]) == 1:
             mc=self.entites[nomMC][0]
-            #print (mc.nom, mc.dumpXsd)
             mc.dumpXsd(dansFactorisation=True)
             self.texteComplexe += '\t'*(indent) + mc.texteElt
             if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
@@ -488,10 +512,11 @@ class X_compoFactoriseAmbigu(X_definition):
 
         
         # cette boucle ne fonctionne que pour des SIMP
+        #if nomMC=='A': debug=True
         resteATraiter=copy(self.entites[nomMC])
         if debug :
-           print ('________ calcul des unions resteATraiter', resteATraiter)
-           for i in resteATraiter : print (i.nom)
+           print ('________ calcul des unions resteATraiter', resteATraiter, self.nom)
+           #for i in resteATraiter : print (i.nom)
         listePourUnion=[]
         first=1
         while resteATraiter != [] :
@@ -502,6 +527,7 @@ class X_compoFactoriseAmbigu(X_definition):
                 if not (mc.compare(autre)) :  nvlListeATraiter.append(autre)
             resteATraiter=copy(nvlListeATraiter)
 
+        #if nomMC=='A': debug=True
         if debug : print ('listePourUnion : ', listePourUnion)
         if len(listePourUnion) == 1:
             mc=listePourUnion[0]
@@ -723,6 +749,7 @@ class X_definitionComposee (X_definition):
         # pour accepter les PROC et ...
         #
         if debug : print ('dumpXsd', self.nom, self.aCreer)
+        debug=False
         if self.aCreer or dansFactorisationDeFusion:
             if not dansFactorisationDeFusion : self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
             if (isinstance(self,X_OPER) or isinstance(self,X_PROC)) and avecEltAbstrait :
@@ -780,7 +807,9 @@ class X_definitionComposee (X_definition):
         self.chercheListesDeBlocsNonDisjoints()
         for l in list(self.listeDesBlocsNonDisjoints) :
             if not(self.besoinDeFactoriserTrivial(l)) : self.listeDesBlocsNonDisjoints.remove(l)
-            else : self.factorise(l)
+            else : 
+                self.possedeDejaUnMCFactorise = 1
+                self.factorise(l)
 
     def chercheListesDeBlocsNonDisjoints(self):
         self.listeDesBlocsNonDisjoints=[]
@@ -1001,7 +1030,9 @@ class X_SIMP (X_definition):
     def dumpXsd(self, dansFactorisation=False, multiple=False, first=False, debug=False):
         #debug = True
         #if PourTraduction  : print (self.nom)
+        #if self.nom == 'A' : debug = True
         if debug : print ('X_SIMP dumpXsd pour', self.nom, '___________________________')
+        debug=False
         self.prepareDumpXSD()
         # si inUnion la comparaison est fausse : on cree le nomDuType
         if multiple : self.inUnion=True
@@ -1027,8 +1058,10 @@ class X_SIMP (X_definition):
             else :
                 self.nomDuTypePyxb='NonDetermine'
 
+        #if self.nom == 'A' : debug = True
         if debug : print ('nomDuTypePyxb', self.nomDuTypePyxb)
-        if debug : print ('aCreer', self.aCreer)
+        if debug : print ('---------------------------- aCreer', self.aCreer)
+        debug = False
 
 
         # on se sert des listes ou non pour  la gestion des minOccurs /maxOccurs est > 0
@@ -1126,15 +1159,24 @@ class X_SIMP (X_definition):
 
         if not multiple : self.texteSimple  += debutSimpleType.format(self.nomDuTypePyxb)
         else : self.texteSimple  += debutSimpleTypeSsNom
+        # gestion des elements constants        
+        if self.homo == "constant" : 
+           if type(self.defaut) in ( 'tuple', 'list'):
+               self.intoConstant = self.defaut
+           else :
+               self.intoConstant = [self.defaut,]
+        else :
+           self.intoConstant = None
         # On est dans une liste
         if self.max > 1 or self.max == '**' or self.max ==  float('inf') or  hasattr(self.type[0], 'ntuple') :
             self.texteSimple  += debutTypeSimpleListe
             self.texteSimple  += "\t\t\t\t"+debutRestrictionBase.format(self.nomDuTypeDeBase)
             if self.val_min != float('-inf')  : self.texteSimple += "\t\t\t\t"+minInclusiveBorne.format(self.val_min)
             if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple +="\t\t\t\t"+ maxInclusiveBorne.format(self.val_max)
-            if self.into != None:
+            if self.into != None or self.intoConstant != None:
                 # PN --> traduction des into
                 into=self.into
+                if self.intoConstant != None : into = self.intoConstant
                 if self.intoXML != None : into = self.intoXML
                 for val in into : self.texteSimple += "\t\t\t\t"+enumeration.format(val)
                 if PourTraduction  :
@@ -1148,8 +1190,9 @@ class X_SIMP (X_definition):
             self.texteSimple  += debutRestrictionBase.format(self.nomDuTypeDeBase)
             if self.val_min != float('-inf')  : self.texteSimple += minInclusiveBorne.format(self.val_min)
             if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple += maxInclusiveBorne.format(self.val_max)
-            if self.into != None:
+            if self.into != None or self.intoConstant != None:
                 into=self.into
+                if self.intoConstant != None : into = self.intoConstant
                 if self.intoXML != None : into = self.intoXML
                 for val in into : self.texteSimple += enumeration.format(val)
                 if PourTraduction  :
@@ -1197,6 +1240,7 @@ class X_SIMP (X_definition):
            
         
     def dumpSpecifiqueTuple(self,minOccurs):
+        
         self.nomDuTypeDeBase = self.traduitType()
         tousPareil=True
         # il faut gerer l aide et les defaut
@@ -1228,6 +1272,8 @@ class X_SIMP (X_definition):
         #    self.texteSimple  += fermeSimpleType
         #    return
 
+        if self.min==0 : sequenceVide=True
+        else : sequenceVide=False
         self.texteSimple = ''
         complexeTypeTuple = tupleDebutComplexeType.format(self.nomDuTypePyxb)
         num = 1
index 8966c94b202dd55e1cde530bd217163f1aee324a..f24827fad07d72001f61a4c35df47b7bcbdaea2f 100644 (file)
@@ -51,7 +51,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
            il faut encore rearranger cette liste (certains mots-cles deja
            presents ne doivent plus etre proposes, regles ...)
         """
-        return self.filtreListeMc(self.getListeMcOrdonneeBrute(liste,dico,), avecCache=avecCache)
+        return self.filtreListeMc(self.getListeMcOrdonneeBrute(liste,dico))
 
     def getListeMcOrdonneeBrute(self,liste,dico):
         """
@@ -83,7 +83,6 @@ class MCCOMPO(I_OBJECT.OBJECT):
            si avecCache=False on n inclut pas les MC dont le statut = cache
         """
         liste = copy(liste_brute)
-        #print (self.nom, liste_brute)
         listeMcPresents = self.listeMcPresents()
         # on enleve les mots-cles non permis par les regles
         for regle in self.definition.regles:
index 4dc804a9cce7e47dde447db28b7a93c1abf2c6d3..8fc539e5ce01d767130692b52c053e8aac19e806 100644 (file)
@@ -129,7 +129,7 @@ class OBJECT:
 
     def getObjetByMCPath(self,MCPath):
     # a revoir avec les MCFACTs dans les MCLists
-        debug = 1
+        debug = 0
         if debug : print ('getObjetByMCPath pour', self, self.nom)
         objet=None
         nomFils=MCPath[0]
index dae0115cc6fb927e23d784527f04f1bd719b3764..82f56cb4d182a10db145a8209ea42d4e5040d443 100755 (executable)
@@ -900,14 +900,14 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
         if self.jdc.isValid() == 0 :
             msgBox = QMessageBox(None)
             msgBox.setWindowTitle(tr("Fichier invalide / incomplet"))
-            msgBox.setText(tr("Le fichier .comm est invalide / incomplet"))
-            msgBox.addButton(tr("&Sauvegarder le .comm"),0)
+            msgBox.setText(tr("Le fichier .comm est invalide / incomplet \n Seuls les .comm et _UQ.comm seront sauvegardes"))
+            msgBox.addButton(tr("&Sauvegarder les .comm et _UQ.comm"),0)
             msgBox.addButton(tr("&Quitter sans sauvegarder"),1)
             msgBox.addButton(tr("&Annuler"),2)
             res=msgBox.exec_()
             if res == 2 : return (0, None)
             if res == 0 :
-                ret, fichier = JDCEditorSsIhm.saveFile (self,fn) 
+                ret, fichier = JDCEditorSsIhm.saveUQFile (self,fn) 
                 if ret : self.fichier = fichier
                 if self.salome  and ret:
                    self.appliEficas.addJdcInSalome( self.fichier)
index e75c0b7eda14b22e8232dd4233d39b60ee21cc7f..d4c823cc4bc12d7ebe8fc4d60021b71eaf4e0991 100755 (executable)
@@ -567,18 +567,28 @@ class JDCEditorSsIhm :
     #-----------------------------------#
     def saveUQFile(self, fichier = None):
     #------------------------------------#
-        if fichier == None :  print ("nom de fichier obligatoire pour sauvegarde"); return
+        if fichier == None :  
+           self.informe ("nom de fichier obligatoire pour sauvegarde"); 
+           return 0, None
         self.fichier=fichier
         self.generator=generator.plugins['UQ']()
         ret = self.generator.creeNomsFichiers(fichier)
+        if not ret : 
+           self.informe('Sauvegarde UQ', self.generator.commentaire)
+           return ret, None
         ret = self.generator.gener(self.jdc)
         if not ret : 
            self.informe('Sauvegarde UQ', self.generator.commentaire)
-           return (ret, self.generator.commentaire) 
+           return ret, None
+        if ret == 2 :
+           self.informe('Sauvegarde UQ', self.generator.commentaire, critique=False)
+           return 1, fichier
         ret = self.generator.writeUQ(fichier)
         if not ret : self.informe('Sauvegarde UQ', self.generator.commentaire)
-        print ('ok')
-        return ret
+        else:
+            self.informe('Sauvegarde UQ', 'Sauvegardes des fichiers .comm, _UQ.comm  effectuées.\n'\
+                         'Création des fichiers _UQ.py et _UQBalise.comm.',critique=False)
+        return ret, fichier
 
 # ---------------------------------------------
 # Methodes Surchargees par avecIhm
index ad1270672752919679ed283b02a9e4e7f7efef6f..93b2225c9afeca01e2772b8b73f46f13b841fc27 100644 (file)
@@ -99,7 +99,6 @@ class Groupe(QWidget,FacultatifOuOptionnel):
         try :
         #if 1 :
             self.listeMc     = self.obj.getListeMcOrdonnee(genea,self.jdc.cata_ordonne_dico)
-            if self.node.item.nom == "cocagne_options" : print (self.listeMc)
             listeNomsPresents=self.obj.dictMcPresents()
             for regle in self.obj.getRegles():
                 (monToolTip,regleOk)=regle.verif(listeNomsPresents)
index aa565492e4476c474a5a520fec7f335d6e4040ec..ac5525026baa114e2460f949e16a37f55583fd2c 100644 (file)
@@ -82,6 +82,7 @@ class BLOC(N_ENTITE.ENTITE):
         self.entites = args
         self.affecter_parente()
         self.txtNomComplet = ''
+        self.possedeDejaUnMCFactorise = False
 
     def __call__(self, val, nom, parent=None, dicoPyxbDeConstruction=None):
         """
index bdb2535088102fcf015830ba8a0ba4de7b88e6cf..1e4f42737f83e91cab52f33c073abe8c7da86a82 100644 (file)
@@ -43,7 +43,7 @@ stringTypes = (str, six.text_type)
 class ENTITE(object):
 
     """
-       Classe de base pour tous les objets de definition : mots cles et commandes
+       Classe de base pour tous les objets de definition  : mots cles et commandes 
        Cette classe ne contient que des methodes utilitaires
        Elle ne peut être instanciee et doit d abord être specialisee
     """
@@ -60,6 +60,9 @@ class ENTITE(object):
 
            L'attribut entités doit contenir le dictionnaires des sous-entités
            (clé = nom, valeur=objet)
+           Les attributs utiles pour la projection xsd sont aussi initialises
+           init non appele pour bloc
         """
         self.regles = ()
         self.entites = {}
@@ -71,6 +74,7 @@ class ENTITE(object):
         self.txtNomComplet=''
         self.redefinit=False
         self.dejaPrepareDump=False
+        self.possedeDejaUnMCFactorise=False
 
     def affecter_parente(self):
         """
index 94af20c7f16d7e4d0028442d635ba95db61d7232..8ce7d62b832b4dfa4a6e476ba4f8736776e175e3 100644 (file)
@@ -602,12 +602,6 @@ Model_data = OPER(
                 fr="Options de modélisations spécifiques au code COCAGNE.",
                 ang="COCAGNE specific modeling options",
                 statut="o",
-                n_threads=SIMP(
-                    fr="Nombre de threads alloués aux solveurs",
-                    ang="Number of threads allocated to the solvers",
-                    statut="f",
-                    typ="I",
-                    val_min=1),
                 core_elements_vs_dklib=SIMP(
                     fr=("Association des éléments du cœur aux bibliothèques neutroniques "
                         "sous la forme (assemblage combustible, DKLib)"),
@@ -674,18 +668,6 @@ Model_data = OPER(
             statut="o",
             typ="TXM",
             into=("THYC", "CATHARE3", "FLICA4")),
-        thyc_bloc=BLOC(
-            condition="code == 'THYC'",
-            thyc_options=FACT(
-                fr="Options de modélisations spécifiques au code THYC.",
-                ang="THYC specific modeling options",
-                statut="o",
-                n_threads=SIMP(
-                    fr="Nombre de threads alloués aux solveurs",
-                    ang="Number of threads allocated to the solvers",
-                    statut="f",
-                    typ="I",
-                    val_min=1))),
         radial_meshing=FACT(
             fr="Description du maillage radial thermohydraulique à l'échelle du composant",
             ang="Thermalhydraulic radial meshing description at the component scale",
@@ -876,3 +858,5 @@ Scenario_data = OPER(
         typ=Tuple(2),  # TODO: Use a triplet (parameter, physic, format) instead of a doublet
         validators=VerifPostTreatment(),
         max="**"))
+
+#from cata_RN_UQ import *
diff --git a/ReacteurNumerique/cata_RN_EDG_UQ.py b/ReacteurNumerique/cata_RN_EDG_UQ.py
deleted file mode 100644 (file)
index a151ae3..0000000
+++ /dev/null
@@ -1,862 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""Definition of the data model used by the integration bench.
-
-Warnings
---------
-EFICAS will import this file as Python module with the ``__import__`` special
-function so, this module must not use relative import.
-"""
-# pylint: disable=import-error
-# pylint: disable=too-few-public-methods
-
-# TODO: Create a main object that point on the different subobjects and force its name
-
-# EFICAS
-from Accas import OPER, BLOC, FACT, SIMP, ASSD, JDC_CATA, VerifTypeTuple, Matrice
-from Accas import Tuple as _Tuple
-from Extensions.i18n import tr
-
-# Warning: The names of these variables are defined by EFICAS
-JdC = JDC_CATA(code="RN_EDG")
-VERSION_CATALOGUE = "V_0"
-
-# Define the minimum and the maximum number of elements (reflectors and fuel
-# assemblies) on the core's side
-NMIN_CORE_FUEL_ELTS = 1
-NMAX_CORE_FUEL_ELTS = 18
-
-# Available absorbing material type in the rod clusters
-ROD_COMPOSITIONS = (
-    "Black",   # Full AIC rods
-    "Grey",    # Mix between AIC and steel rods
-    "B4C",     # Full B4C rods
-)
-
-# Available options for the core elements rotation
-ASSEMBLY_ROTATIONS = (
-    ".",   # identity
-    "R1",  # 90° counter-clock
-    "R2",  # 180°
-    "R3",  # 270° counter-clock
-    "UD",  # up-down
-    "LR",  # left-right
-    "TR",  # transpose x/y
-    "RT",  # transpose x/-y
-)
-
-class Tuple(_Tuple):
-    """Organize the data into a fixed size tuple.
-
-    Warnings
-    --------
-    This class respect the EFICAS conventions.
-    """
-
-    def __convert__(self, valeur):
-        if len(valeur) != self.ntuple:
-            return None
-        return valeur
-
-
-class VerifPostTreatment(VerifTypeTuple):
-    """Validate the data comming from ``Scenario_data.post_processing``.
-
-    Warnings
-    --------
-    This class respect the EFICAS conventions.
-    """
-    # pylint: disable=invalid-name
-    # pylint: disable=missing-function-docstring
-    # pylint: disable=no-self-use
-
-    PHYSICS = ("Neutronics", "Thermalhydraulics")
-    FORMATS = ("MED", "SUM", "MIN", "MAX", "MEAN")
-
-    def __init__(self):
-        super().__init__(("TXM", "TXM"))
-        self.cata_info = ""
-
-    def info(self):
-        return tr(": vérifie les \ntypes dans un tuple")
-
-    def infoErreurListe(self):
-        return tr("Les types entres ne sont pas permis")
-
-    def default(self, valeur):
-        return valeur
-
-    def isList(self):
-        return 1
-
-    def convertItem(self, valeur):
-        if len(valeur) != len(self.typeDesTuples):
-            raise ValueError(
-                tr("%s devrait être de type  %s ") % (valeur, self.typeDesTuples))
-        ok = self.verifType(valeur)
-        if ok == 0:
-            raise ValueError(
-                tr("%s devrait être de type  %s (%d)") % (valeur, self.typeDesTuples, ok))
-        if ok < 0:
-            raise ValueError(
-                tr("%s devrait être dans %s ") % (valeur[1], self.FORMATS))
-        return valeur
-
-    def verifItem(self, valeur):
-        try:
-            if len(valeur) != len(self.typeDesTuples):
-                return 0
-            ok = self.verifType(valeur)
-            if ok != 1:
-                return 0
-        except:  # pylint: disable=bare-except
-            return 0
-        return 1
-
-    def verifType(self, valeur):  # pylint: disable=arguments-differ
-        ok = 0
-        for v in valeur:
-            if isinstance(v, (bytes, str)):
-                ok += 1
-        if ok == len(self.typeDesTuples):
-            if valeur[1] in self.FORMATS:
-                return 1
-            return -1
-        return 0
-
-    def verif(self, valeur):
-        if type(valeur) in (list, tuple):
-            liste = list(valeur)
-            for val in liste:
-                if self.verifItem(val) != 1:
-                    return 0
-            return 1
-        return 0
-
-
-class _Assembly(ASSD):
-    pass
-
-
-class _TechnoData(ASSD):
-    pass
-
-
-class _RodBank(ASSD):
-    pass
-
-
-class _ModelData(ASSD):
-    pass
-
-
-class _ScenarioData(ASSD):
-    pass
-
-
-Assembly = OPER(
-    nom="Assembly",
-    sd_prod=_Assembly,
-    fr="Description d'un élément du cœur",
-    ang="Core element description",
-    assembly_type=SIMP(
-        fr="Type d'élément cœur (assemblage combustible ou réflecteur",
-        ang="Type of the core element (fuel assembly or reflector",
-        statut="o",
-        typ="TXM",
-        into=("UOX", "MOX", "REF")),
-    description=BLOC(
-        condition="assembly_type != 'REF'",
-        fr="Description d'un assemblage combustible",
-        ang="Fuel assembly description",
-        assembly_width=SIMP(
-            fr="Pas inter-assemblage dans le cœur",
-            ang="Fuel assembly pitch in the core",
-            unite="m",
-            statut="o",
-            typ="R"),
-        fuel_density=SIMP(
-            fr=("Ratio entre masse volumique nominale et la masse volumique "
-                "théorique des pastilles combustible"),
-            ang=("Ratio between the nominal density and the theoretical "
-                 "density of the fuel pellets"),
-            unite="g/cm3",
-            statut="o",
-            typ="R",
-            defaut=0.95),
-        radial_description=FACT(
-            fr="Description radiale de l'assemblage combustible",
-            ang="Fuel assembly radial description",
-            statut="o",
-            clad_outer_radius=SIMP(
-                fr="Rayon externe de la gaine des crayons combustible",
-                ang="Clad external radius of the fuel pins",
-                unite="m",
-                statut="o",
-                typ="R"),
-            guide_tube_outer_radius=SIMP(
-                fr="Rayon externe des tubes guides",
-                ang="Clad external radius of the guide tubes",
-                unite="m",
-                statut="o",
-                typ="R"),
-            fuel_rod_pitch=SIMP(
-                fr="Pas inter-crayon dans l'assemblage",
-                ang="Fuel pin pitch in the assembly",
-                unite="m",
-                statut="o",
-                typ="R"),
-            nfuel_rods=SIMP(
-                fr="Nombre de crayons combustibles dans l'assemblage",
-                ang="Number of fuel pins in the assembly",
-                statut="o",
-                typ="I")),
-        axial_description=FACT(
-            fr="Description axiale de l'assemblage combustible",
-            ang="Fuel assembly axial description",
-            statut="o",
-            active_length_start=SIMP(
-                fr="Altitude basse de la partie active",
-                ang="Lower altitude of the active part",
-                unite="m",
-                statut="o",
-                typ="R"),
-            active_length_end=SIMP(
-                fr="Altitude haute de la partie active",
-                ang="Upper altitude of the active part",
-                unite="m",
-                statut="o",
-                typ="R")),
-        grids=FACT(
-            fr="Description des grilles",
-            ang="Grids description",
-            statut="o",
-            mixing=FACT(
-                fr="Description des grilles de mélange",
-                ang="Mixing grids description",
-                statut="o",
-                positions=SIMP(
-                    fr="Altitude basse de la grille",
-                    ang="Grid lower altitude",
-                    unite="m",
-                    statut="f",
-                    typ="R",
-                    max="**"),
-                size=SIMP(
-                    fr="Hauteur de la grille",
-                    ang="Grid height",
-                    unite="m",
-                    statut="o",
-                    typ="R")),
-            non_mixing=FACT(
-                fr="Description des grilles de maintien",
-                ang="Holding grids description",
-                statut="o",
-                positions=SIMP(
-                    fr="Altitude basse de la grille",
-                    ang="Grid lower altitude",
-                    unite="m",
-                    statut="f",
-                    typ="R",
-                    max="**"),
-                size=SIMP(
-                    fr="Hauteur de la grille",
-                    ang="Grid height",
-                    unite="m",
-                    statut="o",
-                    typ="R")))))
-
-
-# TODO: Define the names of the possible compositions (Black, Grey, B4C, Hafnium and Pyrex)
-RodBank = OPER(
-    nom="RodBank",
-    sd_prod=_RodBank,
-    fr="Description d'un groupe de grappes absorbantes",
-    ang="Rod bank description",
-    rod_type=SIMP(
-        fr="Type de grappes absorbantes",
-        ang="Type of rod clusters",
-        statut="o",
-        typ="TXM",
-        into=("homogeneous", "heterogeneous")),
-    description_HOM=BLOC(
-        condition="rod_type == 'homogeneous'",
-        fr="Description d'un groupe de grappes absorbantes homogènes axialement",
-        ang="Axially homogeneous rod bank description",
-        rod_composition=SIMP(
-            fr=("Type de matériau absorbant des grappes absorbantes (Types "
-                "autorisés : {})").format(
-                    ", ".join(ROD_COMPOSITIONS)),
-            ang=("Absorbing material type of the rod clusters (Authorized "
-                 "types: {})").format(
-                     ", ".join(ROD_COMPOSITIONS)),
-            statut="o",
-            typ="TXM",
-            into=ROD_COMPOSITIONS)),
-    description_HET=BLOC(
-        condition="rod_type == 'heterogeneous'",
-        fr="Description d'un groupe de grappes absorbantes hétérogène axialement",
-        ang="Axially heterogeneous rod bank description",
-        bottom_composition=SIMP(
-            fr=("Type de matériau absorbant dans la partie basse des grappes "
-                "absorantes (Types autorisés : {})").format(
-                    ", ".join(ROD_COMPOSITIONS)),
-            ang=("Absorbing material type in the lower part of the rod "
-                 "clusters (Authorized types: {})").format(
-                     ", ".join(ROD_COMPOSITIONS)),
-            statut="o",
-            typ="TXM",
-            into=ROD_COMPOSITIONS),
-        splitting_heigh=SIMP(
-            fr=("Altitude de séparation entre la partie haute et la partie "
-                "basse des grappes absorbantes"),
-            ang=("Splitting height between the upper part and the lower part "
-                 "of the rod clusters"),
-            unite="m",
-            statut="o",
-            typ="R"),
-        upper_composition=SIMP(
-            fr=("Type de matériau absorbant dans la partie haute des grappes "
-                "absorantes (Types autorisés : {})").format(
-                    ", ".join(ROD_COMPOSITIONS)),
-            ang=("Absorbing material type in the upper part of the rod "
-                 "clusters (Authorized types: {})").format(
-                     ", ".join(ROD_COMPOSITIONS)),
-            statut="o",
-            typ="TXM",
-            into=ROD_COMPOSITIONS)),
-    step_height=SIMP(
-        fr="Hauteur d'un pas",
-        ang="Step height",
-        unite="m",
-        statut="o",
-        typ="R"),
-    nsteps=SIMP(
-        fr="Nombre de pas du groupe de grappes",
-        ang="Rod bank steps number",
-        statut="o",
-        typ="I"))
-
-
-def gen_assembly_maps():
-    """Generate all the possible maps (one for each possible core size) for the
-    data cointained in ``Techno_data.radial_description.assembly_map``."""
-    # Build the default axes names
-    xsym_list = list("ABCDEFGHJKLNPRSTUVWXYZ")
-    xsym_list.reverse()
-    ysym_list = ["%02d" % i for i in range(NMIN_CORE_FUEL_ELTS, NMAX_CORE_FUEL_ELTS + 1)]
-    ysym_list.reverse()
-    def_xaxis = {}
-    def_yaxis = {}
-    for i in range(NMIN_CORE_FUEL_ELTS, NMAX_CORE_FUEL_ELTS + 1):
-        def_xaxis[i] = ["RW"] + xsym_list[-i:] + ["RE"]
-        def_yaxis[i] = ["RS"] + ysym_list[-i:] + ["RN"]
-
-    dico = {}
-    for i in range(NMIN_CORE_FUEL_ELTS, NMAX_CORE_FUEL_ELTS):
-        dico["assembly_map_%d" % i] = BLOC(
-            condition="nb_assembly == %d" % i,
-            fr="Description radiale du cœur",
-            ang="Core radial description",
-            xaxis=SIMP(
-                fr="Nom des repères radiaux du cœur suivant l'axe ouest-est",
-                ang="Name of core radial marks following the west-east axis",
-                statut="o",
-                typ="TXM",
-                min=i + 2,
-                max=i + 2,
-                defaut=def_xaxis[i]),
-            yaxis=SIMP(
-                fr="Nom des repères radiaux du cœur suivant l'axe nord-sud",
-                ang="Name of core radial marks following the north-south axis",
-                statut="o",
-                typ="TXM",
-                min=i + 2,
-                max=i + 2,
-                defaut=def_yaxis[i]),
-            assembly_map=SIMP(
-                fr=("Répartition radiale des assemblages combustibles et des "
-                    "réflecteurs dans le cœur"),
-                ang=("Radial repartition of the fuel assemblies and the "
-                     "reflectors in the core"),
-                statut="o",
-                typ=Matrice(
-                    nbLigs=i + 2,
-                    nbCols=i + 2,
-                    typElt=_Assembly,
-                    listeHeaders=(
-                        ("RW","S","R","P","N","L","K","J","H","G","F","E","D","C","B","A","RE",),
-                        ("RS","15","14","13","12","11","10","09","08","07","06","05","04","03","02","01","RN",)),  # pylint: disable=line-too-long
-                    defaut=(i + 2) * [(i + 2) * ["."]],
-                    coloree=True)),
-            rotation_map=SIMP(
-                fr="Rotation des éléments du cœur. Valeur possibles : {}".format(
-                    ", ".join([repr(elt) for elt in ASSEMBLY_ROTATIONS])),
-                ang="Core elements rotation. Possible values : {}".format(
-                    ", ".join([repr(elt) for elt in ASSEMBLY_ROTATIONS])),
-                statut="o",
-                typ=Matrice(
-                    nbLigs=i + 2,
-                    nbCols=i + 2,
-                    typElt="TXM",
-                    typEltInto=ASSEMBLY_ROTATIONS,
-                    coloree=True),
-                defaut=(i + 2) * [(i + 2) * ["."]]),
-            rod_map=SIMP(
-                fr="Répartition radiale des groupes de grappes dans le cœur",
-                ang="Rod banks radial repartition in the core",
-                statut="o",
-                typ=Matrice(
-                    nbLigs=i + 2,
-                    nbCols=i + 2,
-                    valSup=1,
-                    valMin=-1,
-                    typElt="TXM",
-                    listeHeaders=None,
-                    coloree=True),
-                defaut=(i + 2) * [(i + 2) * ["."]]),
-            BU_map=SIMP(
-                fr="Taux de combustion moyen des assemblages combustibles en GW.j/t",
-                ang="Average burnup of the fuel assemblies in GW.d/t",
-                statut="o",
-                typ=Matrice(
-                    nbLigs=i + 2,
-                    nbCols=i + 2,
-                    valSup=90000.,
-                    valMin=0.,
-                    typElt="R",
-                    listeHeaders=None,
-                    coloree=True),
-                defaut=(i + 2) * [(i + 2) * ["."]]))
-    return dico
-
-
-Techno_data = OPER(
-    nom="Techno_data",
-    sd_prod=_TechnoData,
-    fr="Description technologique du cœur",
-    ang="Core technological description",
-    assembly_list=SIMP(
-        fr="Sélection des assemblages combustible",
-        ang="Fuel assemblies selection",
-        statut="o",
-        typ=_Assembly,
-        min=1,
-        max="**"),
-    rodbank_list=SIMP(
-        fr="Sélection des groupes de grappes",
-        ang="Rod banks selection",
-        statut="o",
-        typ=_RodBank,
-        min=0,
-        max="**"),
-    radial_description=FACT(
-        fr="Description radiale du cœur",
-        ang="Radial description of the core",
-        statut="o",
-        nb_assembly=SIMP(
-            fr="Nombre d'éléments combustible sur la tranche du cœur",
-            ang="Number of fuel elements on one side of the core",
-            statut="o",
-            typ="I",
-            into=list(range(NMIN_CORE_FUEL_ELTS, NMAX_CORE_FUEL_ELTS))),
-        **(gen_assembly_maps())),
-    axial_description=FACT(
-        fr="Description axiale du cœur",
-        ang="Axial description of the core",
-        statut="o",
-        lower_refl_size=SIMP(
-            fr="Hauteur du réflecteur axial bas",
-            ang="Height of bottom axial reflector",
-            unite="m",
-            statut="o",
-            typ="R"),
-        upper_refl_size=SIMP(
-            fr="Hauteur du réflecteur axial haut",
-            ang="Height of top axial reflector",
-            unite="m",
-            statut="o",
-            typ="R")),
-    nominal_power=SIMP(
-        fr="Puissance thermique nominale du cœur",
-        ang="Nominal thermal power of the core",
-        unite="W",
-        statut="o",
-        typ="R"),
-    Fuel_power_fraction=SIMP(
-        fr="Fraction de la puissance dissipée dans le combustible",
-        ang="Power fraction dissipated in the fuel",
-        statut="o",
-        typ="R",
-        defaut=0.974),
-    by_pass=SIMP(
-        fr="Fraction du débit de bypass cœur",
-        ang="Bypass core flow fraction",
-        statut="o",
-        typ="R",
-        defaut=0.07),
-    core_volumic_flowrate=SIMP(
-        fr="Débit volumique cœur",
-        ang="Core volume flowrate",
-        unite="m3/h",
-        statut="o",
-        typ="R"))
-
-
-class _AssemblyDKLibFile(ASSD):
-    """Manage informations about a fuel assembly DKLib file."""
-
-
-class _ReflectorDKLibFile(ASSD):
-    """Manage informations about a reflector DKLib file."""
-
-
-AssemblyDKLibFile = OPER(
-    nom="AssemblyDKLibFile",
-    sd_prod=_AssemblyDKLibFile,
-    fr="Description d'un fichier DKLib assemblage combustible",
-    ang="Description of a fuel assembly DKLib file",
-    filename=SIMP(
-        fr="Nom du fichier DKLib",
-        ang="DKLib filename",
-        statut="o",
-        typ=("Fichier", "DKLib Files (.dklib);;DKZip Files (.dkzip);;All Files ()", "Sauvegarde")),
-    pattern=SIMP(
-        fr="Nom du pattern à utiliser dans le fichier DKLib",
-        ang="Name of the pattern to use in the DKLib file",
-        statut="o",
-        typ="TXM"),
-    rod_bank_names=SIMP(
-        fr=("Nom de la configuration de grappe dans la DKLib pour chaque type "
-            "de matériaux absorbants disponibles dans le modèle sous la forme "
-            "({{{}}}, nom dans la DKLib)").format(", ".join(ROD_COMPOSITIONS)),
-        ang=("Name of the rod cluster configuration in the DKLib file for any "
-             "type of absorbing materials available in the model under the form "
-             "({{{}}}, name in the DKLib)").format(", ".join(ROD_COMPOSITIONS)),
-        statut="o",
-        typ=Tuple(2),
-        # TODO: Check if the first string is ROD_COMPOSITIONS
-        validators=VerifTypeTuple(("TXM", "TXM")),
-        max="**"))
-
-
-ReflectorDKLibFile = OPER(
-    nom="ReflectorDKLibFile",
-    sd_prod=_ReflectorDKLibFile,
-    fr="Description d'un fichier DKLib réflecteur",
-    ang="Description of a reflector DKLib file",
-    filename=SIMP(
-        fr="Nom du fichier DKLib",
-        ang="DKLib filename",
-        statut="o",
-        typ=("Fichier", "DKLib Files (.dklib);;DKZip Files (.dkzip);;All Files ()","Sauvegarde")),
-    radial_pattern=SIMP(
-        fr="Nom du pattern contenant les données du réflecteur radial",
-        ang="Name of the pattern containing the radial reflector data",
-        statut="o",
-        typ="TXM"),
-    lower_pattern=SIMP(
-        fr="Nom du pattern contenant les données du réflecteur axial bas",
-        ang="Name of the pattern containing the lower reflector data",
-        statut="o",
-        typ="TXM"),
-    upper_pattern=SIMP(
-        fr="Nom du pattern contenant les données du réflecteur axial haut",
-        ang="Name of the pattern containing the upper reflector data",
-        statut="o",
-        typ="TXM"))
-
-
-# TODO: Split this class in two: neutronic and thermalhydraulic)
-# TODO: Or split this class in N classes (one for each code)
-Model_data = OPER(
-    nom="Model_data",
-    sd_prod=_ModelData,
-    fr="Description de la modélisation physique",
-    ang="Physical modeling description",
-    physics=SIMP(
-        fr="Sélection de la physique du modèle",
-        ang="Physic model selection",
-        statut="o",
-        typ="TXM",
-        into=("Neutronics", "Thermalhydraulics")),
-    scale=SIMP(
-        fr="Sélection de l'échelle du modèle",
-        ang="Scale model selection",
-        statut="o",
-        typ="TXM",
-        into=("system", "component", "local")),
-    b_neutro_compo=BLOC(
-        condition="physics == 'Neutronics' and scale == 'component'",
-        fr="Description de la modélisation neutronique à l'échelle du composant",
-        ang="Neutronic modeling description at the component scale",
-        code=SIMP(
-            fr="Sélection du code de neutronique cœur",
-            ang="Core neutronic code selection",
-            statut="o",
-            typ="TXM",
-            into=("COCAGNE", "APOLLO3")),
-        cocagne_bloc=BLOC(
-            condition="code == 'COCAGNE'",
-            cocagne_options=FACT(
-                fr="Options de modélisations spécifiques au code COCAGNE.",
-                ang="COCAGNE specific modeling options",
-                statut="o",
-                core_elements_vs_dklib=SIMP(
-                    fr=("Association des éléments du cœur aux bibliothèques neutroniques "
-                        "sous la forme (assemblage combustible, DKLib)"),
-                    ang=("Association between the core elements and the neutronic libraries "
-                        "in the form (fuel assembly, DKLib)"),
-                    statut="f",
-                    typ=Tuple(2),
-                    # TODO: Check if the attribute assembly_type of the
-                    #       Assembly object is 'REF' then the type of the
-                    #       DKLibFile must be ReflectorDKLibFile and, if not,
-                    #       the type of the DKLibFile must be AssemblyDKLibFile
-                    validators=VerifTypeTuple((_Assembly, (_AssemblyDKLibFile, _ReflectorDKLibFile))),
-                    max="**"))),
-        # TODO: Implement the *4x4* mesh
-        radial_meshing=FACT(
-            fr="Maillage radial du cœur",
-            ang="Core radial meshing",
-            statut="o",
-            flux_solver=SIMP(
-                fr="Type de maillage radial du solveur de flux",
-                ang="Radial mesh type for the flux solver",
-                statut="o",
-                typ="TXM",
-                into=("subdivision", "pin-by-pin")),
-            b_flux_subdivision=BLOC(
-                condition="flux_solver == 'subdivision'",
-                fr=("Paramètres pour les maillages radiaux de type subdivisé "
-                    "pour le solveur de flux"),
-                ang=("Parameters for the subdivided radial meshes types for the "
-                     "flux solver"),
-                flux_subdivision=SIMP(
-                    fr=("Nombre de sous-divisions à appliquer à chaque maille "
-                        "radiale pour le solveur de flux"),
-                    ang=("Subdivision number to apply to all radial meshes for "
-                         "the flux solver"),
-                    statut="o",
-                    typ="I")),
-            feedback_solver=SIMP(
-                fr="Type de maillage radial du solveur de contre-réaction",
-                ang="Radial mesh type for the feedback solver",
-                statut="o",
-                typ="TXM",
-                into=("subdivision", "pin-by-pin")),
-            b_feedback_subdivision=BLOC(
-                condition="feedback_solver == 'subdivision'",
-                fr=("Paramètres pour les maillages radiaux de type subdivisé "
-                    "pour le solveur de contre-réaction"),
-                ang=("Parameters for the subdivided radial meshes types for the "
-                     "feedback solver"),
-                feedback_subdivision=SIMP(
-                    fr=("Nombre de sous-divisions à appliquer à chaque maille "
-                        "radiale pour le solveur de contre-réaction"),
-                    ang=("Subdivision number to apply to all radial meshes for "
-                         "the feedback solver"),
-                    statut="o",
-                    typ="I")))),
-    b_thermo_compo=BLOC(
-        condition="physics == 'Thermalhydraulics' and scale == 'component'",
-        fr="Description de la modélisation thermohydraulique à l'échelle du composant",
-        ang="Thermalhydraulic modeling description at the component scale",
-        code=SIMP(
-            fr="Sélection du code de thermohydraulique cœur",
-            ang="Core thermalhydraulic code selection",
-            statut="o",
-            typ="TXM",
-            into=("THYC", "CATHARE3", "FLICA4")),
-        radial_meshing=FACT(
-            fr="Description du maillage radial thermohydraulique à l'échelle du composant",
-            ang="Thermalhydraulic radial meshing description at the component scale",
-            statut="o",
-            fluid=SIMP(
-                fr="Méthode de maillage radial",
-                ang="Radial meshing method",
-                statut="o",
-                typ="TXM",
-                into=("subdivision", "subchannel")),
-            b_fluid_subdivision=BLOC(
-                condition="fluid == 'subdivision'",
-                fr="Données spécifiques au maillage radial par subdivision",
-                ang="Specific data for the radial meshing by subdivision",
-                fluid_subdivision=SIMP(
-                    fr="Nombre de mailles radiales dans les assemblages combustibles",
-                    ang="Radial mesh number in the fuel assemblies",
-                    statut="o",
-                    typ="I")),
-            pellet=SIMP(
-                fr="Nombre de mailles radiales dans la pastille combustible",
-                ang="Radial mesh number in the fuel pellet",
-                statut="o",
-                typ="I"),
-            clad=SIMP(
-                fr="Nombre de mailles radiales dans la gaine des crayons combustibles",
-                ang="Radial mesh number in the clad of the fuel pins",
-                statut="o",
-                typ="I"))),
-    b_scale_compo=BLOC(
-        condition="scale == 'component'",
-        fr="Description de la modélisation à l'échelle du composant",
-        ang="Modeling description at the component scale",
-        axial_meshing=FACT(
-            fr="Maillage axial du cœur",
-            ang="Core axial meshing",
-            statut="o",
-            lower_refl=SIMP(
-                fr="Nombre de mailles axiales dans le réflecteur bas",
-                ang="Axial mesh number in the lower reflector",
-                statut="o",
-                typ="I"),
-            fuel=SIMP(
-                fr="Nombre de mailles axiales dans la partie active de l'assemblage combustible",
-                ang="Axial mesh number in the active part of the fuel assembly",
-                statut="o",
-                typ="I"),
-            upper_refl=SIMP(
-                fr="Nombre de mailles axiales dans le réflecteur haut",
-                ang="Axial mesh number in the upper reflector",
-                statut="o",
-                typ="I"))),
-    b_scale_local=BLOC(
-        condition="scale == 'local'",
-        fr="Description de la modélisation à l'échelle du locale",
-        ang="Modeling description at the local scale",
-        mesh_file=SIMP(
-            fr="Nom du fichier décrivant le maillage",
-            ang="Name of the file describing the mesh",
-            statut="o",
-            typ="Fichier")))
-
-
-Scenario_data = OPER(
-    nom="Scenario_data",
-    sd_prod=_ScenarioData,
-    fr="Description du transitoire",
-    ang="Transient description",
-    initial_power=SIMP(
-        fr="Puissance thermique initiale du cœur",
-        ang="Initial thermal power of the core",
-        statut="o",
-        typ="R",
-        val_min=0.,
-        defaut=100.),
-    initial_power_unit=SIMP(
-        fr="Unité de la puissance thermique initiale du cœur",
-        ang="Unit of the initial thermal power of the core",
-        statut="o",
-        typ="TXM",
-        into=("% Nominal power", "W"),
-        defaut="% Nominal power"),
-    initial_core_inlet_temperature=SIMP(
-        fr="Température initiale de l'eau à l'entrée du cœur",
-        ang="Initial water temperature at the inlet of the core",
-        unite="°C",
-        statut="o",
-        typ="R",
-        val_min=0.,
-        defaut=280.),
-    initial_boron_concentration=SIMP(
-        fr="Concentration en bore initiale",
-        ang="Initial boron concentration",
-        unite="ppm",
-        statut="o",
-        typ="R",
-        val_min=0.,
-        defaut=1300.),
-    initial_inlet_pressure=SIMP(
-        fr="Pression initiale de l'eau à l'entrée du cœur",
-        ang="Initial water pressure at the inlet of the core",
-        unite="bar",
-        statut="o",
-        typ="R",
-        val_min=0.,
-        defaut=160.2),
-    initial_outlet_pressure=SIMP(
-        fr="Pression initiale de l'eau à la sortie du cœur",
-        ang="Initial water pressure at the outlet of the core",
-        unite="bar",
-        statut="o",
-        typ="R",
-        val_min=0.,
-        defaut=157.2),
-    initial_rod_positions=SIMP(
-        fr=("Position initiale des groupes de grappes et des grappes dans le "
-            "cœur sous la forme (type@nom, position) "
-            "(ex. (Rodbank@RB, 62) pour le groupe de grappe RB positionné à 62 "
-            "pas extraits et (Rodcluster@H08, 0) pour la grappe H08 "
-            "complètement insérée)"),
-        ang=("Initial position of the rod banks and the rod clusters in the "
-             "core in the form (type@name, position) "
-             "(e.g. (Rodbank@RB, 62) for the RB rod bank placed at 62 "
-             "extracted steps and (Rodcluster@H08, 0) for the rod cluster H08 "
-             "completely inserted)"),
-        unite="extracted steps",
-        statut="o",
-        typ=Tuple(2),  # TODO: Use a triplet (type, name, position) instead of a doublet
-        validators=VerifTypeTuple(("TXM", "I")),
-        max="**"),
-    scenario_type=SIMP(
-        fr="Type de transitoire à modéliser",
-        ang="Type of transient to model",
-        statut="o",
-        typ="TXM",
-        into=("RIA", )),
-    b_ria=BLOC(
-        condition="scenario_type == 'RIA'",
-        fr="Données du transitoire 'accident de réactivité'",
-        ang="Data of the 'Reactivity-initiated Accident' transient",
-        ejected_rod=SIMP(
-            fr="Nom de la grappe éjectée",
-            ang="Name of the ejected rod cluster",
-            statut="o",
-            typ="TXM"),
-        rod_position_program=SIMP(
-            fr="Loi d'éjection à appliquer à la grappe sous la forme (temps, position)",
-            ang="Ejection law to apply to the ejected rod cluster in the form (time, position)",
-            unite="s, extracted steps",
-            statut="o",
-            typ=Tuple(2),
-            validators=VerifTypeTuple(("R", "I")),
-            max="**"),
-        SCRAM=SIMP(
-            fr="Activation/désactivation de l'arrêt automatique du réacteur",
-            ang="Activation/deactivation of automatic reactor shutdown",
-            statut="o",
-            typ="TXM",
-            into=("YES", "NO")),
-        SCRAM_option=BLOC(
-            condition="SCRAM == 'YES'",
-            fr="Options relatives à l'arrêt automatique du réacteur",
-            ang="Options relative to the automatic reactor shutdown",
-            SCRAM_power=SIMP(
-                fr=("Puissance thermique du cœur déclenchant un arrêt "
-                    "automatique du réacteur"),
-                ang="Core thermal power triggering an automatic reactor shutdown",
-                unite="MW",
-                statut="o",
-                typ="R"),
-            complete_SCRAM_time=SIMP(
-                fr="Temps de chute des grappes",
-                ang="Rod cluster fall time",
-                unite="s",
-                statut="o",
-                typ="R"))),
-    post_processing=SIMP(
-        # TODO: Give all the possible parameters depending of the physics
-        fr=("Données de sortie du calcul sous la forme (paramètre@physique, format). "
-            "'physique' peut valoir {physics!r} et 'format' peut valoir {formats!r}".format(
-                physics=VerifPostTreatment.PHYSICS,
-                formats=VerifPostTreatment.FORMATS)),
-        ang=("Output computed data in function of time in the form (parameter@physic, format). "
-             "'physic' can be {physics!r} and 'format' can be {formats!r})".format(
-                physics=VerifPostTreatment.PHYSICS,
-                formats=VerifPostTreatment.FORMATS)),
-        statut="f",
-        typ=Tuple(2),  # TODO: Use a triplet (parameter, physic, format) instead of a doublet
-        validators=VerifPostTreatment(),
-        max="**"))
-
-from cata_RN_UQ import *
index 7a3a2159538b82850939cc6824cc938de4917969..6d7a73e31fe322315979225c36a049fce85c944c 100644 (file)
@@ -7,9 +7,19 @@ if os.path.dirname(repEficas) not in sys.path :
    sys.path.insert(0,repEficas)
 import types
 
-from Accas import OPER, BLOC, FACT, SIMP, ASSD, JDC_CATA,  Matrice, Tuple, AU_MOINS_UN, A_VALIDATOR, PROC
+#from Accas import OPER, BLOC, FACT, SIMP, ASSD, JDC_CATA,  Matrice, Tuple, AU_MOINS_UN, A_VALIDATOR, PROC
 from Noyau.N_VALIDATOR import Valid
 
+# #autonome=1
+# autonome=0
+# if autonome : 
+#     from Accas import *
+#     #from Accas import OPER, BLOC, FACT, SIMP, ASSD, JDC_CATA,  Matrice, Tuple, AU_MOINS_UN, A_VALIDATOR, PROC
+#     JdC = JDC_CATA(code="UQ");
+#     ExpressionIncertitude = creeOperExpressionIncertitude(dictUQ, dicoDesSortiesPossibles);
+# else:
+from cata_RN_EDG import *
+
 # sert a activer les options d incertitude dans eficas
 # et a changer le convert en convertUQ
 avecIncertitude=True
@@ -26,16 +36,11 @@ dictUQ = {'initial_power' : ({'Uniform' : {}}, {'TruncatedNormal' : {}}, {'UserD
 listeDesSortiesNeutro = ( "Boron concentration",   "Kinetic reactivity",   "Neutronic power",  )
 listeDesSortiesThermo = ("Average mass flux", "Boiling power fraction",  "Enthalpy",  "Fuel temperature", "Liquid power", "Mass flux", "Mass fraction", "Mass title", "Mixture density", "Mixture specific enthalpy", "Mixture temperature", "Outlet pressure", "Pollutant concentration", "Pressure ", "Rowlands fuel effective temp", "Thermal power", "Water density", "Water temperature", )
 
+scriptPosttraitement = os.path.join(repEficas,"generator","post_csv_rn.py")
+scriptDeLancement = os.path.join(repInitial,"ib_test.sh")
 dicoDesSortiesPossibles={'Neutronics':listeDesSortiesNeutro,'Thermalhydraulics':listeDesSortiesThermo}
 #dicoDesSortiesPossibles={'Thermalhydraulics':listeDesSortiesThermo}
 from cata_UQ import creeOperExpressionIncertitude
-ExpressionIncertitude=creeOperExpressionIncertitude(dictUQ, dicoDesSortiesPossibles)
-
+ExpressionIncertitude=creeOperExpressionIncertitude(dictUQ, dicoDesSortiesPossibles, scriptPosttraitement, scriptDeLancement)
 
-#autonome=1
-autonome=0
-if autonome : 
-    from Accas import *
-    JdC = JDC_CATA(code="UQ");
-    ExpressionIncertitude = creeOperExpressionIncertitude(dictUQ, dicoDesSortiesPossibles);
 
index c739c8114b81e0a8cbbee32a217fcdb7cc0d3444..c95d469e93d809231716037740ca43bbaa515d48 100644 (file)
@@ -24,8 +24,6 @@ class compareAutreMC(Valid) :
         self.nomFrere=frere
         
     def set_MCSimp (self, MCSimp):
-        debug = 0
-        if debug : print ('je passe la pour ', self, MCSimp.nom)
         self.MCSimp=MCSimp
 
 class supValeurProbabiliste(compareAutreMC):
@@ -79,7 +77,8 @@ class infFrereMC(compareAutreMC):
     def convert(self, valeur):
         # on sort de cardProto on a une liste
         valeur=valeur[0]
-        MCFrere=self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere)
+        try: MCFrere=self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere)
+        except : return valeur
         if not MCFrere    : return valeur
         if MCFrere== None : return valeur
         if MCFrere.valeur  == None : return valeur
@@ -88,7 +87,8 @@ class infFrereMC(compareAutreMC):
         return valeur
 
     def verifItem(self, valeur):
-        MCFrere=self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere)
+        try: MCFrere=self.MCSimp.parent.getChildOrChildInBloc(self.nomFrere)
+        except : return valeur
         if not MCFrere    : return valeur
         if MCFrere== None : return valeur
         if MCFrere.valeur  == None : return valeur
@@ -1354,18 +1354,28 @@ def definitIntoOuput(objExpression, contexte):
 def changeIntoOuput(objPostPro):
     mesPostProVal=objPostPro.valeur
     contexte=objPostPro.etape.parent.g_context
-    for (variable,fonct) in mesPostProVal :
-        if fonct == 'MED' : continue
-        nomVar=variable.split('@')[0]
-        phys=variable.split('@')[1]
-        nomAProposer= variable+'@'+fonct
-        nomBloc    = 'b_physique_' + phys 
-        nomBlocVar = ('b_var_'+nomVar).replace( ' ','__')
-        maDef=contexte['ExpressionIncertitude'].entites['Output'].entites['VariableDeSortie'].entites[nomBloc].entites[nomBlocVar].entites['VariablePosttraiteeAssociee']
-        maDef.addInto(nomAProposer)
-    
+    # on essaye d assurer la compatibilite du catalogue UQ pour les 2 versions du catalogue RN_EDG
+    if len(mesPostProVal[0]) == 2 :
+        for (variable,fonct) in mesPostProVal :
+            if fonct == 'MED' : continue
+            nomVar=variable.split('@')[0]
+            phys=variable.split('@')[1]
+            nomAProposer= variable+'@'+fonct
+            nomBloc    = 'b_physique_' + phys 
+            nomBlocVar = ('b_var_'+nomVar).replace( ' ','__')
+            maDef=contexte['ExpressionIncertitude'].entites['Output'].entites['VariableDeSortie'].entites[nomBloc].entites[nomBlocVar].entites['VariablePosttraiteeAssociee']
+            maDef.addInto(nomAProposer)
+    if len(mesPostProVal[0]) == 3 :
+        for (nomVar,phys,fonct) in mesPostProVal :
+            if '@' in nomVar : continue # Les noms des grandeurs et les associations à leurs définitions doivent être revues dans une nvlle version du cata_RN.py
+            if fonct == 'MED' : continue
+            nomAProposer= nomVar+'@'+phys+'@'+fonct
+            nomBloc    = 'b_physique_' + phys 
+            nomBlocVar = ('b_var_'+nomVar).replace( ' ','__')
+            maDef=contexte['ExpressionIncertitude'].entites['Output'].entites['VariableDeSortie'].entites[nomBloc].entites[nomBlocVar].entites['VariablePosttraiteeAssociee']
+            maDef.addInto(nomAProposer)
 
-def creeOutput(monDicoVarSortie):
+def creeOutput(monDicoVarSortie,scriptPosttraitement):
     intoVariable=list(monDicoVarSortie.keys())
     lesBlocs={}
     Physique = SIMP (statut = "o", typ = "TXM",into = intoVariable,defaut=intoVariable[0])
@@ -1385,11 +1395,16 @@ def creeOutput(monDicoVarSortie):
         lesBlocs[nomBloc] = BLOC (condition=laCondition, VariablePhysique = VariablePhysique, **lesBlocsVar)
     FonctionDAggregation = SIMP(statut = 'o', typ= 'TXM', into = ('valeur à t=O', 'valeur à mi-temps', 'valeur à t final',  'valeur moyenne', 'valeur cumulée', 'valeur minimale', 'valeur maximale' ),
                                 defaut=('Max'), max='**', homo='SansOrdreNiDoublon')
+    ScriptPosttraitement=SIMP(
+       fr="Nom du fichier Script de Postraitement",
+       ang="Postprocessing Script File",
+       statut="o",
+       typ=("FichierNoAbs", "All Files ()"),  defaut=scriptPosttraitement)
     VariableDeSortie = FACT ( max='**', statut ='o', Physique=Physique, **lesBlocs, FonctionDAggregation=FonctionDAggregation, Unit=Unit,Format=Format)
-    output = FACT (max=1, statut ='o', VariableDeSortie=VariableDeSortie)
+    output = FACT (max=1, statut ='o', VariableDeSortie=VariableDeSortie, ScriptPosttraitement=ScriptPosttraitement)
     return output
 
-def creeOperExpressionIncertitude(monDicoVarDeter, monDicoVarSortie):
+def creeOperExpressionIncertitude(monDicoVarDeter, monDicoVarSortie,scriptPosttraitement, scriptDeLancement ):
     listeDesVariablesPossibles = list(monDicoVarDeter.keys())
     #monOutput = creeOutput(monDicoVarSortie)
     objectName =  SIMP ( statut = "f", typ =  'TXM', into=[],  fenetreIhm='menuDeroulant', homo='constant' ) # on ne met pas [] pour la projection XSD, intoXML=?
@@ -1408,7 +1423,7 @@ def creeOperExpressionIncertitude(monDicoVarDeter, monDicoVarSortie):
     # l ordre des motclefs en 3.7 a l air de dépendre de l ordre de creation des objets
     # et non d un dict ordonné. on retombe toujours sur ce pb
     return  PROC ( nom = "ExpressionIncertitude",  UIinfo={"groupes":("CACHE",)}, op_init=definitIntoOuput,
-        UncertaintyTool =  SIMP ( statut = "o", typ = "TXM", into = ['Uranie', 'OpenTurns'], defaut='Uranie',position='global'),
+        UncertaintyTool =  SIMP ( statut = "o", typ = "TXM", into = ['Uranie', 'OpenTurns'], defaut='OpenTurns',position='global'),
         Input = FACT( max=1, statut ='o',
             VariableProbabiliste = FACT ( max='**', statut ='cache',
                 fr  = "Variable probabiliste",
@@ -1479,9 +1494,9 @@ def creeOperExpressionIncertitude(monDicoVarDeter, monDicoVarSortie):
                     EmpiricalStandardDeviation = SIMP ( statut = "o", typ = 'TXM', into = ( 'yes', 'no' ), defaut = 'yes',
                         fr = "Ecart-type empirique",
                         ang = "Empirical standard deviation",),
-                    EmpiricalQuantile = SIMP ( statut = "o", typ = 'TXM', into = ( 'yes', 'no' ), defaut = 'yes',
-                        fr = "Quantile empirique",
-                        ang = "Empirical quantile",),
+                    EmpiricalQuantile = SIMP ( statut = "o", typ = 'TXM', into = ( 'no', ), defaut = 'no', #into = ( 'yes', 'no' ), 
+                                               fr = "Quantile empirique (Non encore implémenté)",
+                        ang = "Empirical quantile (Not Yet Implemented)",),
                     BlocEmpiricalQuantileSettings = BLOC ( condition = " EmpiricalQuantile in ( 'yes', ) ",
                         EmpiricalQuantile_Order = SIMP ( statut = "o", typ = 'R', defaut = 0.95,
                             val_min = 0.0, val_max = 1.0,
@@ -1495,29 +1510,36 @@ def creeOperExpressionIncertitude(monDicoVarDeter, monDicoVarSortie):
             Methode = SIMP( statut = "o", typ = "TXM", max=1, into = ('SRS', 'Sobol'), defaut='Sobol'),
           ), # fin UraniePropagation
         ), # fin Propagation
-        Output=creeOutput(monDicoVarSortie),
+        Output=creeOutput(monDicoVarSortie,scriptPosttraitement),
         Execution = FACT (max=1, statut ='o',
              bloc_OT = BLOC (condition = 'UncertaintyTool == "OpenTurns"',
                 ExecutionMode = SIMP ( statut = "o", typ = "TXM", into = ['desktop', 'cluster']),
-                NbOfProcs      = SIMP ( statut = 'o', typ ="I" ,  defaut = 1, val_min = 1),
-                NbDeBranches  = SIMP ( statut = "o", typ = "I", val_min = 0, fr='nb d evaluations simultanees'),
-                JobName        = SIMP ( statut = 'o', typ ="TXM", defaut='idefix_rn_job'),
+                NbDeBranches  = SIMP ( statut = "o", typ = "I", val_min = 0, fr='nb d evaluations Persalys simultanees'),
                 bloc_OT_local = BLOC (condition = 'ExecutionMode == "desktop"',
+                    JobName        = SIMP ( statut = 'o', typ ="TXM", defaut='idefix_rn_job'),
                     ResourceName   = SIMP ( statut = 'o', typ ="TXM", defaut ='localhost'),
                     Login   = SIMP ( statut = 'o', typ ="TXM", defaut ='C65845'), #TODO
 #                    WorkDirectory = SIMP ( statut = 'o', typ='Repertoire' , defaut='/tmp/C65845_workingdir_uncertainty'), #TODO: Login + NonExistent
                     WorkDirectory = SIMP ( statut = 'o', typ='TXM' , defaut='/tmp/C65845_workingdir_uncertainty'), #TODO: Login + NonExistent
 #                    ResultDirectory = SIMP ( statut = 'o', typ='Repertoire' , defaut='/tmp/idefix_rn_job'), #TODO: JobName
                     ResultDirectory = SIMP ( statut = 'o', typ='TXM' , defaut='/tmp/idefix_rn_job'), #TODO: JobName
+                    ScriptDeLancement=SIMP( statut="o",  typ=("FichierNoAbs", "All Files ()"), defaut=scriptDeLancement,
+                       fr="Nom du fichier script de lancement",  ang="script File to launch",),
                 ),
                 bloc_OT_cluster = BLOC (condition = 'ExecutionMode == "cluster"',
+                    MultiJobStudy  = SIMP ( statut = "o", typ = bool, defaut=False,fr='Si True, un job est soumis pour chaque évaluation de branche'),
+                    NbOfProcs      = SIMP ( statut = 'o', typ ="I" ,  defaut = 1, val_min = 1, fr='Equivaut au nombre de tasks SLURM affectées à chaque job'),
+                    JobName        = SIMP ( statut = 'o', typ ="TXM", defaut='idefix_rn_job'),
                     ResourceName   = SIMP ( statut = 'o', typ ="TXM", defaut ='gaia'),
                     Login   = SIMP( statut = 'o', typ ="TXM", defaut ='C65845'),
                     WorkDirectory = SIMP ( statut = 'o', typ='TXM' , defaut='/scratch/C65845/workingdir/persalys_light'), #TODO: Login
 #                    WorkDirectory = SIMP ( statut = 'o', typ='Repertoire' , defaut='/scratch/C65845/workingdir/persalys_light'), #TODO: Login
                     ResultDirectory = SIMP ( statut = 'o', typ='TXM' , defaut='/tmp/idefix_rn_job'), #TODO: JobName
 #                    ResultDirectory = SIMP ( statut = 'o', typ='Repertoire' , defaut='/tmp/idefix_rn_job'), #TODO: JobName
-                    MultiJobStudy  = SIMP ( statut = "o", typ = bool, defaut=False),
+                    Consigne =  SIMP(statut="o", homo="information", typ="TXM",
+                       defaut="Le chemin d'accès au script de lancement est celui utilisé par les machines du cluster."),
+                    ScriptDeLancement=SIMP( statut="o",  typ=("FichierNoAbs", "All Files ()"), defaut=scriptDeLancement,
+                       fr="Nom du fichier script de lancement",  ang="script File to launch",),
                 ),
              ),
              bloc_Uranie = BLOC (condition = 'UncertaintyTool == "Uranie"',
diff --git a/generator/post_csv_rn.py b/generator/post_csv_rn.py
new file mode 100644 (file)
index 0000000..e3ad068
--- /dev/null
@@ -0,0 +1,98 @@
+# Exemple de script pour lire la sortie csv du banc 
+#
+# Lecture des valeurs dans le csv et renvoi de la valeur après application de la fonction d'agragation max,min et moy
+
+#To get the history in python
+#print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))
+
+def vMax(arrayNx2):
+    import numpy as np
+    
+    return np.apply_along_axis(max, 0, arrayNx2[:,1]).item()
+
+def vMin(arrayNx2):
+    import numpy as np
+    
+    return np.apply_along_axis(min, 0, arrayNx2[:,1]).item()
+
+def vMean(arrayNx2):
+    import numpy as np
+    import statistics
+    
+    return np.apply_along_axis(statistics.mean, 0, arrayNx2[:,1]).item()
+
+def vSum(arrayNx2):
+    import numpy as np
+    
+    return np.apply_along_axis(sum, 0, arrayNx2[:,1]).item()
+
+def vInitialTime(arrayNx2):
+    import numpy as np
+    
+    #Dates on first column, Values on second one
+    timeColumn= arrayNx2[:,0]
+    # Tmin=np.apply_along_axis(min, 0, timeColumn)
+    # assert(arrayNx2[0,0]==Tmin)
+    idxTmin = timeColumn.argmin()
+    assert(idxTmin==0)
+    
+    valTmin= arrayNx2[idxTmin][1].item()
+    
+    return valTmin
+
+def vFinalTime(arrayNx2):
+    import numpy as np
+    
+    #Dates on first column, Values on second one
+    timeColumn= arrayNx2[:,0]
+    # Tmax=np.apply_along_axis(max, 0, timeColumn)
+    # assert(arrayNx2[timeColumn.size,0]==Tmax)
+    idxTmax = timeColumn.argmax()
+    idxMax=timeColumn.size-1
+    assert(idxTmax==idxMax)
+    
+    valTmax= arrayNx2[idxTmax][1].item()
+    
+    return valTmax
+
+def vHalfTime(arrayNx2):
+    import numpy as np
+    
+    #Dates on first column, Values on second one
+    timeColumn= arrayNx2[:,0]
+    Tmin=np.apply_along_axis(min, 0, timeColumn)
+    Tmax=np.apply_along_axis(max, 0, timeColumn)
+    
+    Thalf=(Tmax-Tmin)/2+Tmin
+    idxThalf = (np.abs(timeColumn-Thalf)).argmin()
+    valThalf= arrayNx2[idxThalf][1].item()
+    
+    return valThalf
+
+def get_result_from_csv(variableName:str, functionList, filename:str=None, delimiter=','):
+    from csv import reader
+    import numpy as np
+    
+    transientName = 'Transient duration'
+    
+    #ex: file_csv = "Fuel temperature@Thermalhydraulics@MAX.csv"
+    if filename == None: filename = variableName+'.csv'
+    
+    with open(filename, "r") as csv_file:
+         csv_reader = reader(csv_file, delimiter=delimiter)
+         header = next(csv_reader)
+         header_transient_name=header[1]
+         header_variable_name=header[2]
+         if header_variable_name != variableName:
+             print(sys.stderr,"The variable name {} differs from the file's header one {}".format(variableName, header_variable_name))
+             return -1 #TODO Exception ?
+         if header_transient_name != transientName:
+             print(sys.stderr,"The transient duration name {} differs from the file's header one {}".format(transientName, header_transient_name))
+             return -1 #TODO Exception ?
+    
+    date_value_array=np.loadtxt(filename, delimiter = delimiter, skiprows = 1)[:,1:3]
+    valList=[]
+    for func in functionList:
+         valList.append(func(date_value_array))
+    return valList
+