From ad0d1bcbee5f826d67f106944a6e60fa0ebe2abf Mon Sep 17 00:00:00 2001 From: Eric Fayolle Date: Tue, 12 Jul 2022 16:30:20 +0200 Subject: [PATCH] Correction du bug pleiade #25704 --- Efi2Xsd/MCAccasXML.py | 95 +- ReacteurNumerique/cata_RN_EDG_yp.py | 878 ++++++++++++++++++ .../cata_RN_EDG_yp_test_driver_1.comm | 14 + .../cata_RN_EDG_yp_test_driver_2.comm | 216 +++++ 4 files changed, 1181 insertions(+), 22 deletions(-) create mode 100644 ReacteurNumerique/cata_RN_EDG_yp.py create mode 100644 ReacteurNumerique/cata_RN_EDG_yp_test_driver_1.comm create mode 100644 ReacteurNumerique/cata_RN_EDG_yp_test_driver_2.comm diff --git a/Efi2Xsd/MCAccasXML.py b/Efi2Xsd/MCAccasXML.py index a00bbcf4..c41c2ec6 100755 --- a/Efi2Xsd/MCAccasXML.py +++ b/Efi2Xsd/MCAccasXML.py @@ -102,7 +102,7 @@ class X_OBJECT: if debug :print ('indiceDsLeContenu',indiceDsLeContenu) if debug :print (pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom)) - #if self.objPyxb ! = None : self.objPyxb.objAccas=self + if self.objPyxb != None : self.objPyxb.objAccas=self #ATTENTION TUPLE&MATRICE elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom)) self.perePyxb.objPyxb.orderedContent().insert(indiceDsLeContenu,elt) if (elt.elementDeclaration.isPlural()): @@ -184,13 +184,19 @@ class X_MCSIMP(X_OBJECT): maClasseElt=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier+'_n'+str(num)+'_tuple') listeConstruction.append(maClasseElt(v[i])) self.objPyxb.append(self.maClasseModeleMetier(*listeConstruction)) + # on fait porter au 1er l objet Accas pour retrouver la definition + if self.objPyxb[0] !=None : self.objPyxb[0].objAccas=self if debug : print (self.objPyxb) + if debug : print (self.objPyxb[0].__class__) + if debug : + for o in self.objPyxb : print ('x_MSIMP', o.toDOM(element_name='RN_EDG').toprettyxml()) return if self.waitChaineAvecBlancs() and self.definition.max > 1: self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier) if debug : print (self.valeur) if self.valeur != None and self.valeur != [] : self.objPyxb = self.maClasseModeleMetier(*self.valeur) else :self.objPyxb = self.maClasseModeleMetier() + if self.objPyxb !=None : self.objPyxb.objAccas=self if debug : print ('X_MCSIMP', self.nom, self.objPyxb, ) if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur) return @@ -215,7 +221,17 @@ class X_MCSIMP(X_OBJECT): else : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False) - #if self.objPyxb !=None : self.objPyxb.objAccas=self + if self.objPyxb !=None : + # les dict ont une entree objEnPyxb + if type(self.objPyxb) is list or type(self.objPyxb) is tuple : + porteObjet=self.objPyxb[0] + while (type(porteObjet) is list or type(porteObjet) is tuple) : porteObjet=porteObjet[0] + if type(porteObjet) is dict: porteObjet=porteObjet['objEnPyxb'] + porteObjet.objAccas=self + elif type(self.objPyxb) is dict: + porteObjet = self.objPyxb['objEnPyxb'] + porteObjet.objAccas=self + else : self.objPyxb.objAccas=self if debug : print ('X_MCSIMP', self.nom, self.objPyxb, ) if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur) @@ -266,9 +282,11 @@ class X_MCCOMPO(X_OBJECT) : if debug : print ('X_MCCOMPO', self.nom) deepDebug=False + if debug : print ('****************** X_MCCOMPO------------------------', self.nom) self.listArg=[] self.dicoArg={} for objAccas in mc_list : + if debug : print ('dans le for', objAccas.nom) if objAccas.nature == 'MCBLOC' : self.exploreBLOC(objAccas) elif objAccas.nature == 'MCList' : @@ -284,7 +302,7 @@ class X_MCCOMPO(X_OBJECT) : self.listArg.append(objAccas[0].objPyxb) else : if objAccas.nom == 'Consigne' : continue - if debug : print ('ds X_MCCOMPO pour ', objAccas.nom, objAccas.objPyxb) + if debug : print ('ds X_MCCOMPO de ', self.nom + ' pour ', objAccas.nom, objAccas.objPyxb) self.listArg.append(objAccas.objPyxb) self.dicoArg[objAccas.nom]=objAccas.objPyxb objAccas.perePyxb=self @@ -309,15 +327,18 @@ class X_MCCOMPO(X_OBJECT) : if debug : print (self.listArg) if debug : print (self.maClasseModeleMetier) # self.objPyxb=self.maClasseModeleMetier(*self.listArg) - self.objPyxb=self.maClasseModeleMetier(**self.dicoArg) + self.objPyxb=self.maClasseModeleMetier(**self.dicoArg) # **1 + # **1 Attention passer un complex plural element par **kw corrompt + # - l'élément content associé qui contient une liste au lieu d'un plural + # - l'orderedcontent qui contient une liste de Element Content au lieu des Elements Content directement if deepDebug : - print ('debut de __________ new ordered content') + print ('debut de __________ ordered content') for o in self.objPyxb.orderedContent(): print ('o', o) print ('value', o.value) print ('type', type(o.value)) print ('id', id(o.value)) - print ('fin __________ new ordered content') + print ('fin __________ ordered content') print ('debut de __________ listArg') for obj in self.listArg: print ('obj',obj) @@ -328,17 +349,22 @@ class X_MCCOMPO(X_OBJECT) : newOrderedContent=[] if debug : print ('list Arg') for obj in self.listArg: - if debug : - print ('obj',obj) - print ('type obj', type(obj)) - print ('id(obj)', id(obj)) - - # on teste le caractere pluriel if isinstance(obj, list): - for c in self.objPyxb.orderedContent() : - if hasattr (c,'value') and c.value == obj : - newOrderedContent.append(c) - continue + # traitement particulier des tuples + if hasattr(obj[0],'objAccas') and obj[0].objAccas.nature == 'MCSIMP' and obj[0].objAccas.waitTuple(): + badObjPyxb=self.maClasseModeleMetier(**self.dicoArg) + for c in badObjPyxb.orderedContent() : + if isinstance(c._Content__value,list) and isinstance(c._Content__value[0], type(obj[0])): newOrderedContent.append(c) + # **2 En cohérence avec le **1 + # isinstance(c._Content__value,list) fonctionne par une conséquence de la corruption **1 + # il faudrait en réalité tester/construire le plural pour avoir les objets pyxb bien construit + # et éviter les orphanContentException. + continue + + #for c in self.objPyxb.orderedContent() : + # if hasattr (c,'value') and c.value == obj : + # newOrderedContent.append(c) + #continue if (hasattr(obj, 'nature')) : # attention on a un object Accas et non un pyxb car les MCList n ont pas de objPyxb max=obj[0].definition.max else : max = 1 @@ -349,16 +375,37 @@ class X_MCCOMPO(X_OBJECT) : # newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:type(o.value), self.objPyxb.orderedContent())).index(type(obj))] ) # PN 22 sept 2020 . pourquoi pas toujours l id. le tyoe ne convient pas en cas d union d enum newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] ) - else : # element Pural + else : # element Plural for c in self.objPyxb.orderedContent() : if isinstance(c._Content__value,list) and isinstance(c._Content__value[0], type(obj[0].objPyxb)): newOrderedContent.append(c) - - for i in range(len(self.listArg)): + # **2 En cohérence avec le **1 + # isinstance(c._Content__value,list) fonctionne par une conséquence de la corruption **1 + # il faudrait en réalité tester/construire le plural pour avoir les objets pyxb bien construit + # et éviter les orphanContentException. + + if debug : print ('construction X_MCCOMPO', self, self.nom, self.objPyxb) + i=0 + + # a priori on a a len(newOrderedContent) > len(orderedContent()) + # + if debug : print ('X_MCCOMPO newOrderedContent',len(newOrderedContent)) + if debug : print ('X_MCCOMPO oderedContent',len(self.objPyxb.orderedContent())) + + for i in range(len(newOrderedContent)): self.objPyxb.orderedContent()[i]=newOrderedContent[i] + if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb) if debug : print ('X_MCCOMPO', self.listArg) if debug : print ('X_MCCOMPO', newOrderedContent) if debug : print ('X_MCCOMPO', self.objPyxb.orderedContent()) + if deepDebug : + for obj in self.objPyxb.orderedContent() : + print ('----------------- obj ', obj) + print (obj.value) + try : + for objFils in obj.value.orderedContent(): + print (objFils.value) + except : pass if debug : print ('X_MCCOMPO', self.objPyxb.orderedContent()) if debug : print ('x_MCCOMPO', self.objPyxb.toDOM(element_name='RN_EDG').toprettyxml()) if debug : print ('X_MCCOMPO', self.objPyxb.orderedContent()) @@ -385,12 +432,15 @@ class X_MCCOMPO(X_OBJECT) : fils[0].perePyxb=self self.dicoArg[fils.nom]=fils[0].objPyxb self.listArg.append(fils[0].objPyxb) + if debug : print ('ajout dans exploreBLOC ', self.nom + ' de fact ', fils.nom, fils[0].objPyxb) else : if fils.nom == "Consigne" : continue self.listArg.append(fils.objPyxb) self.dicoArg[fils.nom]=fils.objPyxb fils.perePyxb=self - if debug : print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom) + if debug : print ('ajout dans exploreBLOC ', self.nom + ' de ', fils.nom, fils.objPyxb) + #if debug : print ('ds exploreBLOC de ', self.nom + ' pour ', fils.nom, fils.objPyxb) + #if debug : print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom) if debug : print ('fin ds exploreBLOC', objAccas .nom) @@ -465,9 +515,10 @@ class X_JDC (X_MCCOMPO): self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier) self.objPyxb=self.maClasseModeleMetier() #self.objPyxb.objAccas=self - pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.NEVER) + pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.ALWAYS) pyxb.GlobalValidationConfig._setInvalidElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION) - pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION) + #pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION) #TODO: Réactiver après correction cf **1 **2 + pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.GIVE_UP) diff --git a/ReacteurNumerique/cata_RN_EDG_yp.py b/ReacteurNumerique/cata_RN_EDG_yp.py new file mode 100644 index 00000000..b173c2e6 --- /dev/null +++ b/ReacteurNumerique/cata_RN_EDG_yp.py @@ -0,0 +1,878 @@ +# -*- 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", + 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)"), + ang=("Association between the core elements and the neutronic libraries " + "in the form (fuel assembly, DKLib)"), + statut="o", + 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")), + 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", + 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="**")) diff --git a/ReacteurNumerique/cata_RN_EDG_yp_test_driver_1.comm b/ReacteurNumerique/cata_RN_EDG_yp_test_driver_1.comm new file mode 100644 index 00000000..aa00599f --- /dev/null +++ b/ReacteurNumerique/cata_RN_EDG_yp_test_driver_1.comm @@ -0,0 +1,14 @@ + +thermo_model=Model_data(physics='Thermalhydraulics', + scale='component', + code='THYC', + thyc_options=_F(n_threads=23,), + radial_meshing=_F(fluid='subdivision', + fluid_subdivision=1, + pellet=8, + clad=2,), + axial_meshing=_F(lower_refl=1, + fuel=40, + upper_refl=1,),); +#VERSION_CATALOGUE:V_0:FIN VERSION_CATALOGUE +#CHECKSUM:ea75a6791472ab21137d2c91d59f3362:FIN CHECKSUM \ No newline at end of file diff --git a/ReacteurNumerique/cata_RN_EDG_yp_test_driver_2.comm b/ReacteurNumerique/cata_RN_EDG_yp_test_driver_2.comm new file mode 100644 index 00000000..3fbfefc0 --- /dev/null +++ b/ReacteurNumerique/cata_RN_EDG_yp_test_driver_2.comm @@ -0,0 +1,216 @@ + +REF=Assembly(assembly_type='REF',); + +U1=Assembly(assembly_type='UOX', + assembly_width=0.21504, + fuel_density=0.95, + radial_description=_F(clad_outer_radius=0.00475, + guide_tube_outer_radius=0.006025, + fuel_rod_pitch=0.0126, + nfuel_rods=264,), + axial_description=_F(active_length_start=0.21, + active_length_end=4.4772,), + grids=_F(mixing=_F(positions=(0.69216,1.19766,1.70316,2.20866,2.71416,3.20416,3.69416,4.18416,), + size=0.033,), + non_mixing=_F(positions=(0.026,4.2412,), + size=0.033,),),); + +UGD=Assembly(assembly_type='UOX', + assembly_width=0.21504, + fuel_density=0.95, + radial_description=_F(clad_outer_radius=0.00475, + guide_tube_outer_radius=0.006025, + fuel_rod_pitch=0.0126, + nfuel_rods=264,), + axial_description=_F(active_length_start=0.21, + active_length_end=4.4772,), + grids=_F(mixing=_F(positions=(0.69216,1.19766,1.70316,2.20866,2.71416,3.20416,3.69416,4.18416,), + size=0.033,), + non_mixing=_F(positions=(0.026,), + size=0.033,),),); + +RB=RodBank(rod_type='heterogeneous', + bottom_composition='Black', + splitting_heigh=1.4224, + upper_composition='B4C', + step_height=0.016, + nsteps=260,); + +N1=RodBank(rod_type='heterogeneous', + bottom_composition='Black', + splitting_heigh=1.4224, + upper_composition='B4C', + step_height=0.016, + nsteps=260,); + +N2=RodBank(rod_type='heterogeneous', + bottom_composition='Black', + splitting_heigh=1.4224, + upper_composition='B4C', + step_height=0.016, + nsteps=260,); + +G1=RodBank(rod_type='homogeneous', + rod_composition='Grey', + step_height=0.016, + nsteps=260,); + +G2=RodBank(rod_type='homogeneous', + rod_composition='Grey', + step_height=0.016, + nsteps=260,); + +techno_data=Techno_data(assembly_list=(REF,U1,UGD,), + rodbank_list=(RB,G1,G2,N1,N2,), + radial_description=_F(nb_assembly=15, + xaxis=('RW','S','R','P','N','L','K','J','H','G','F','E','D','C','B','A','RE',), + yaxis= + ('RS','15','14','13','12','11', + '10','09','08','07','06','05','04','03','02','01','RN',), + assembly_map= + ([REF,REF,REF,REF,REF,REF, + REF,REF,REF,REF,REF,REF,REF,REF,REF,REF,REF,],[REF,REF, + REF,REF,REF,U1,U1,U1,U1,U1,U1,U1,REF,REF,REF,REF,REF,], + [REF,REF,REF,UGD,U1,UGD,UGD,U1,U1,U1,UGD,UGD,U1,UGD,REF, + REF,REF,],[REF,REF,UGD,U1,U1,U1,U1,UGD,U1,UGD,U1,U1,U1,U1, + UGD,REF,REF,],[REF,REF,U1,U1,U1,UGD,U1,UGD,U1,UGD,U1,UGD, + U1,U1,U1,REF,REF,],[REF,U1,UGD,U1,UGD,U1,U1,UGD,U1,UGD,U1, + U1,UGD,U1,UGD,U1,REF,],[REF,U1,UGD,U1,U1,U1,UGD,UGD,U1, + UGD,UGD,U1,U1,U1,UGD,U1,REF,],[REF,U1,U1,UGD,UGD,UGD,UGD, + U1,UGD,U1,UGD,UGD,UGD,UGD,U1,U1,REF,],[REF,U1,U1,U1,U1,U1, + U1,UGD,UGD,UGD,U1,U1,U1,U1,U1,U1,REF,],[REF,U1,U1,UGD,UGD, + UGD,UGD,U1,UGD,U1,UGD,UGD,UGD,UGD,U1,U1,REF,],[REF,U1,UGD, + U1,U1,U1,UGD,UGD,U1,UGD,UGD,U1,U1,U1,UGD,U1,REF,],[REF,U1, + UGD,U1,UGD,U1,U1,UGD,U1,UGD,U1,U1,UGD,U1,UGD,U1,REF,], + [REF,REF,U1,U1,U1,UGD,U1,UGD,U1,UGD,U1,UGD,U1,U1,U1,REF, + REF,],[REF,REF,UGD,U1,U1,U1,U1,UGD,U1,UGD,U1,U1,U1,U1,UGD, + REF,REF,],[REF,REF,REF,UGD,U1,UGD,UGD,U1,U1,U1,UGD,UGD,U1, + UGD,REF,REF,REF,],[REF,REF,REF,REF,REF,U1,U1,U1,U1,U1,U1, + U1,REF,REF,REF,REF,REF,],[REF,REF,REF,REF,REF,REF,REF,REF, + REF,REF,REF,REF,REF,REF,REF,REF,REF,],), + rotation_map= + (['.','.','.','.','.','.', + '.','.','.','.','.','.','.','.','.','.','.'],['.','.','.', + '.','.','.','.','.','.','.','.','.','.','.','.','.','.'], + ['.','.','.','.','.','.','.','.','.','.','.','.','.','.', + '.','.','.'],['.','.','.','.','.','.','.','.','.','.','.', + '.','.','.','.','.','.'],['.','.','.','.','.','.','.','.', + '.','.','.','.','.','.','.','.','.'],['.','.','.','.','.', + '.','.','.','.','.','.','.','.','.','.','.','.'],['.','.', + '.','.','.','.','.','.','.','.','.','.','.','.','.','.', + '.'],['.','.','.','.','.','.','.','.','.','.','.','.','.', + '.','.','.','.'],['.','.','.','.','.','.','.','.','.','.', + '.','.','.','.','.','.','.'],['.','.','.','.','.','.','.', + '.','.','.','.','.','.','.','.','.','.'],['.','.','.','.', + '.','.','.','.','.','.','.','.','.','.','.','.','.'],['.', + '.','.','.','.','.','.','.','.','.','.','.','.','.','.', + '.','.'],['.','.','.','.','.','.','.','.','.','.','.','.', + '.','.','.','.','.'],['.','.','.','.','.','.','.','.','.', + '.','.','.','.','.','.','.','.'],['.','.','.','.','.','.', + '.','.','.','.','.','.','.','.','.','.','.'],['.','.','.', + '.','.','.','.','.','.','.','.','.','.','.','.','.','.'], + ['.','.','.','.','.','.','.','.','.','.','.','.','.','.', + '.','.','.'],), + rod_map= + (['#','#','#','#','#','#','#', + '#','#','#','#','#','#','#','#','#','#'],['#','#','#','#','#','.', + '.','.','.','.','.','.','#','#','#','#','#'],['#','#','#','.','.', + '.','.','.','RB','.','.','.','.','.','#','#','#'],['#','#','.','.', + '.','G2','.','N2','.','N2','.','G2','.','.','.','#','#'],['#','#', + '.','.','N1','.','.','.','G1','.','.','.','N1','.','.','#','#'], + ['#','.','.','G2','.','RB','.','.','.','.','.','RB','.','G2','.', + '.','#'],['#','.','.','.','.','.','.','.','N1','.','.','.','.','.', + '.','.','#'],['#','.','.','N2','.','.','.','.','.','.','.','.','.', + 'N2','.','.','#'],['#','.','RB','.','G1','.','N1','.','RB','.','N1', + '.','G1','.','RB','.','#'],['#','.','.','N2','.','.','.','.','.', + '.','.','.','.','N2','.','.','#'],['#','.','.','.','.','.','.','.', + 'N1','.','.','.','.','.','.','.','#'],['#','.','.','G2','.','RB', + '.','.','.','.','.','RB','.','G2','.','.','#'],['#','#','.','.', + 'N1','.','.','.','G1','.','.','.','N1','.','.','#','#'],['#','#', + '.','.','.','G2','.','N2','.','N2','.','G2','.','.','.','#','#'], + ['#','#','#','.','.','.','.','.','RB','.','.','.','.','.','#','#', + '#'],['#','#','#','#','#','.','.','.','.','.','.','.','#','#','#', + '#','#'],['#','#','#','#','#','#','#','#','#','#','#','#','#','#', + '#','#','#'],), + BU_map= + ([0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],[0.0,0.0,0.0,0.0,0.0,0.0,0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],[0.0,0.0,0.0,40.0,0.0,0.0, + 40.0,40.0,20.0,40.0,40.0,0.0,0.0,40.0,0.0,0.0,0.0],[0.0,0.0,40.0,0.0, + 40.0,20.0,40.0,0.0,40.0,0.0,40.0,20.0,40.0,0.0,40.0,0.0,0.0],[0.0,0.0, + 0.0,40.0,20.0,20.0,20.0,40.0,20.0,40.0,20.0,20.0,20.0,40.0,0.0,0.0, + 0.0],[0.0,0.0,0.0,20.0,20.0,20.0,40.0,0.0,40.0,0.0,40.0,20.0,20.0, + 20.0,0.0,0.0,0.0],[0.0,0.0,40.0,40.0,20.0,40.0,20.0,40.0,20.0,40.0, + 20.0,40.0,20.0,40.0,40.0,0.0,0.0],[0.0,0.0,40.0,0.0,40.0,0.0,40.0, + 20.0,20.0,20.0,40.0,0.0,40.0,0.0,40.0,0.0,0.0],[0.0,0.0,20.0,40.0, + 20.0,40.0,20.0,20.0,60.0,20.0,20.0,40.0,20.0,40.0,20.0,0.0,0.0],[0.0, + 0.0,40.0,0.0,40.0,0.0,40.0,20.0,20.0,20.0,40.0,0.0,40.0,0.0,40.0,0.0, + 0.0],[0.0,0.0,40.0,40.0,20.0,40.0,20.0,40.0,20.0,40.0,20.0,40.0,20.0, + 40.0,40.0,0.0,0.0],[0.0,0.0,0.0,20.0,20.0,20.0,40.0,0.0,40.0,0.0,40.0, + 20.0,20.0,20.0,0.0,0.0,0.0],[0.0,0.0,0.0,40.0,20.0,20.0,20.0,40.0, + 20.0,40.0,20.0,20.0,20.0,40.0,0.0,0.0,0.0],[0.0,0.0,40.0,0.0,40.0, + 20.0,40.0,0.0,40.0,0.0,40.0,20.0,40.0,0.0,40.0,0.0,0.0],[0.0,0.0,0.0, + 40.0,0.0,0.0,40.0,40.0,20.0,40.0,40.0,0.0,0.0,40.0,0.0,0.0,0.0],[0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],[0.0, + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],),), + axial_description=_F(lower_refl_size=0.21, + upper_refl_size=0.21,), + nominal_power=4000000000.0, + Fuel_power_fraction=0.974, + by_pass=0.07, + core_volumic_flowrate=90940.0,); + +AF3R_400=AssemblyDKLibFile(filename='cocagne_data/dklib/AF3R_400.dklib', + pattern='PALU_AF3R_17_4.00_0P_0P_100_100__535_306.5_0.7127__500____________________________P13', + rod_bank_names=(('Black','black_rods'),('Grey','grey_rods'),('B4C','b4c_rods')),); + +AF3R_400_12G_GD80U071=AssemblyDKLibFile(filename='cocagne_data/dklib/AF3R_400_12G_GD80U071.dklib', + pattern=\ + 'PALU_AF3R_17_4.0012G12G_100_100__535_306.5_0.7127__500___________GD__8_U_0.71_____P13', + rod_bank_names=(('Black','black_rods'),('Grey','grey_rods'),('B4C','b4c_rods')),); + +REFL_PWR1300=ReflectorDKLibFile(filename='cocagne_data/dklib/Reflecteur_REP1300.dkzip', + radial_pattern='R', + lower_pattern='lower', + upper_pattern='upper',); + +neutro_model=Model_data(physics='Neutronics', + scale='component', + code='COCAGNE', + cocagne_options=_F(core_elements_vs_dklib=((REF,REFL_PWR1300),(U1,AF3R_400),(UGD,AF3R_400_12G_GD80U071)),), + radial_meshing=_F(flux_solver='subdivision', + flux_subdivision=2, + feedback_solver='subdivision', + feedback_subdivision=1,), + axial_meshing=_F(lower_refl=2, + fuel=42, + upper_refl=2,),); + +thermo_model=Model_data(physics='Thermalhydraulics', + scale='component', + code='THYC', + thyc_options=_F(), + radial_meshing=_F(fluid='subdivision', + fluid_subdivision=1, + pellet=8, + clad=2,), + axial_meshing=_F(lower_refl=1, + fuel=40, + upper_refl=1,),); + +scenario_data=Scenario_data(initial_power=0.1, + initial_power_unit='% Nominal power', + initial_core_inlet_temperature=290.0, + initial_boron_concentration=1300.0, + initial_inlet_pressure=160.2, + initial_outlet_pressure=157.2, + initial_rod_positions=(('Rodbank@RB',201),('Rodbank@N1',96),('Rodbank@N2',260),('Rodbank@G1',260),('Rodbank@G2',260),('Rodcluster@H08',260)), + scenario_type='RIA', + ejected_rod='H02', + rod_position_program=((0.0,0),(0.1,260)), + SCRAM='YES', + SCRAM_power=1130.0, + complete_SCRAM_time=1.0, + post_processing=(('Fuel temperature@Thermalhydraulics','MAX'),('Neutronic power@Neutronics','SUM'),('Fuel temperature@Thermalhydraulics','MED'),('Neutronic power@Neutronics','MED')),); +#VERSION_CATALOGUE:V_0:FIN VERSION_CATALOGUE +#CHECKSUM:c06d10ac9fa4f4f20cad8266b6f6455d:FIN CHECKSUM -- 2.39.2