From: nicolas Date: Tue, 10 Sep 2013 14:50:33 +0000 (+0000) Subject: Insertion des frontières dans la création des schémas YACS X-Git-Tag: V7_3_0a1~49 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=aaa87f7e842a16ea5390beadceea50282feac559;p=modules%2Fhomard.git Insertion des frontières dans la création des schémas YACS --- diff --git a/resources/yacs_01.xml b/resources/yacs_01.xml new file mode 100644 index 00000000..b327c599 --- /dev/null +++ b/resources/yacs_01.xml @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DataInit_MeshFile + + + + + + + + + HOMARD + + SetCurrentStudy + + + StudyCreation SetCurrentStudy + + StudyCreation NewStudy + SetCurrentStudy theStudy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Etude_Initialisation.SetCurrentStudy + LastIteration + + + + + Etude_Initialisation.SetCurrentStudy + GetHypothesis + + + + LastIteration GetHypothesis + + + + + + Etude_Initialisation.SetCurrentStudy + CreateCase + + + + + + + + + + + + Etude_Initialisation.SetCurrentStudy + CreateHypothesis + + + +HOMARD_Init_au_debut + + CreateCase return + Case_Options Case + + + + + + + + + + + + + + + HOMARD_Initialisation HOMARD_Exec + + HOMARD_Initialisation.default_HOMARD_Init_ensuite.LastIteration return + HOMARD_Exec LastIter + + + HOMARD_Initialisation.p1_HOMARD_Init_au_debut.Case_Options Iter0 + HOMARD_Exec LastIter + + + HOMARD_Initialisation.default_HOMARD_Init_ensuite.GetHypothesis return + HOMARD_Exec Hypo + + + HOMARD_Initialisation.p1_HOMARD_Init_au_debut.CreateHypothesis return + HOMARD_Exec Hypo + + + + + Calcul Analyse + Analyse Adaptation + + Analyse Error + Adaptation select + + + Analyse NumCalcP1 + Calcul numCalc + + + Analyse NumCalcP1 + Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation select + + + Analyse NumCalcP1 + Adaptation.p0_Adaptation_HOMARD.HOMARD_Exec NumAdapt + + + Analyse MeshName + Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.p1_HOMARD_Init_au_debut.CreateCase MeshName + + + Analyse FileName + Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.p1_HOMARD_Init_au_debut.CreateCase FileName + + + Analyse MessInfo + Adaptation.default_Arret_boucle.Arret MessInfo + + + Calcul Error + Analyse ErrCalc + + + Calcul dico_resu + Analyse dico_resu + + + Calcul dico_resu + Adaptation.p0_Adaptation_HOMARD.HOMARD_Exec dico_resu + + + Adaptation.default_Arret_boucle.Arret MeshFile + Calcul MeshFile + + + Adaptation.p0_Adaptation_HOMARD.HOMARD_Exec MeshFile + Calcul MeshFile + + + + Alternance_Calcul_HOMARD.Analyse NumCalcP1 + Alternance_Calcul_HOMARD.Analyse NumCalc + + + + + + + DataInit Etude_Initialisation + Etude_Initialisation Tant_que_le_calcul_n_a_pas_converge + Tant_que_le_calcul_n_a_pas_converge Bilan + + DataInit MeshFile + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Calcul MeshFile + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.default_Arret_boucle.Arret OK + Tant_que_le_calcul_n_a_pas_converge condition + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Exec OK + Tant_que_le_calcul_n_a_pas_converge condition + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.default_Arret_boucle.Arret MessInfo + Bilan MessInfo + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Exec MessInfo + Bilan MessInfo + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.p1_HOMARD_Init_au_debut.CreateCaseCaseName + Calcul + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.CalculnumCalc + 0 + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptationselect + 0 + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisationselect + 0 + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.default_HOMARD_Init_ensuite.LastIterationCaseName + Calcul + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.default_HOMARD_Init_ensuite.GetHypothesisHypoName + Hypo + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.p1_HOMARD_Init_au_debut.CreateHypothesisHypoName + Hypo + + + Tant_que_le_calcul_n_a_pas_convergecondition + true + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.AnalyseNumCalc + 0 + + + Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.AnalyseErrCalc + 0 + +PARAMETRES + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/HOMARD/YACSDriver.cxx b/src/HOMARD/YACSDriver.cxx index f48fb7e7..a8202e39 100644 --- a/src/HOMARD/YACSDriver.cxx +++ b/src/HOMARD/YACSDriver.cxx @@ -35,6 +35,7 @@ YACSDriver::YACSDriver(const std::string YACSFile, const std::string DirName): _YACSFile( "" ), _DirName( "" ), _Texte( "" ), _Texte_parametres( "" ), + _noeud_1( "CreateHypothesis" ), _bLu( false ) { MESSAGE("YACSFile = "<\n" ; _Texte += " Etude_Initialisation.SetCurrentStudy\n" ; @@ -131,9 +132,9 @@ std::string YACSDriver::Texte_HOMARD_Init_au_debut_Zone( int ZoneType, const std // 4.2. Les valeurs numeriques // ATTENTION : les noms doivent etre les memes que dans Gen.xml, donc HOMARD_Gen.idl // 4.2.1. Decodage des valeurs -// La chaine pythonZone est de ce genre : +// La chaine pythonStructure est de ce genre : // CreateZoneBox( "Zone_1", 0.144, 0.216, 0.096, 0.1464, 0.076, 0.12) - std::string ligne = pythonZone ; + std::string ligne = pythonStructure ; // On commence par ne garder que ce qui suit la premiere virgule ligne = GetStringInTexte( ligne, ",", 1 ); // On boucle pour isoler toutes les chaines dans les virgules @@ -264,6 +265,156 @@ std::string YACSDriver::Texte_HOMARD_Init_au_debut_Zone( int ZoneType, const std // } //=============================================================================== +// La description des frontieres +// BoundaryType : le type de la frontiere +// pythonStructure : le python correspondant a la frontiere +// methode : methode associee a la creation de la frontiere +// BoundaryName : nom de la frontiere +//=============================================================================== +std::string YACSDriver::Texte_HOMARD_Init_au_debut_Boundary( int BoundaryType, const std::string pythonStructure, const std::string methode, const std::string BoundaryName ) +{ + MESSAGE("Texte_HOMARD_Init_au_debut_Boundary, BoundaryType = "<\n" ; + _Texte += " Etude_Initialisation.SetCurrentStudy\n" ; + _Texte += " " + methode + "\n" ; +// 4. Les inports +// 4.1. Le nom de la zone + _Texte += Texte_inport( "string", "BoundaryName" ) ; + TexteParametre( node, "BoundaryName", "string", BoundaryName ) ; +// 4.2. Les valeurs numeriques +// ATTENTION : les noms doivent etre les memes que dans Gen.xml, donc HOMARD_Gen.idl +// 4.2.1. Decodage des valeurs +// La chaine pythonStructure est de ce genre : +// CreateBoundaryCylinder('cyl_2', 17.5, -2.5, -12.5, -100., -75., -25., 50.) +// CreateBoundaryDi("intersection", "PIQUAGE", "/scratch/D68518/Salome/script/sfr_2d_piquage.fr.med") + std::string ligne = pythonStructure ; +// On commence par ne garder que ce qui suit la premiere virgule + ligne = GetStringInTexte( ligne, ",", 1 ); +// On boucle pour isoler toutes les chaines dans les virgules + std::string lignebis ; + std::string x0, x1, x2, x3, x4, x5, x6, x7 ; + int iaux = 0 ; + while ( ligne != lignebis ) + { + lignebis = GetStringInTexte ( ligne, ",", 0 ) ; +// MESSAGE("lignebis = "<\n" ; + _Texte += " \n" ; +// + return texte_control ; +// +} +//=============================================================================== // Controle des enchainements de noeud dans le noeud HOMARD_Init_au_debut //=============================================================================== std::string YACSDriver::Texte_HOMARD_Init_au_debut_control() diff --git a/src/HOMARD/YACSDriver.hxx b/src/HOMARD/YACSDriver.hxx index b95cf1ff..1c565bda 100644 --- a/src/HOMARD/YACSDriver.hxx +++ b/src/HOMARD/YACSDriver.hxx @@ -35,7 +35,8 @@ public: void Texte_DataInit_MeshFile( const std::string Meshfile ) ; void Texte_Alternance_Calcul_HOMARD_Calcul( const std::string FileName ) ; void Texte_HOMARD_Init_au_debut_Case_Options( const std::string pythonCas ) ; - std::string Texte_HOMARD_Init_au_debut_Zone( int ZoneType, const std::string pythonZone, const std::string methode, const std::string ZoneName, const std::string noeud_1 ) ; + std::string Texte_HOMARD_Init_au_debut_Boundary( int BoundaryType, const std::string pythonStructure, const std::string methode, const std::string BoundaryName ) ; + std::string Texte_HOMARD_Init_au_debut_Zone( int ZoneType, const std::string pythonStructure, const std::string methode, const std::string ZoneName ) ; std::string Texte_HOMARD_Init_au_debut_control() ; std::string Texte_control( const std::string noeud_1, const std::string noeud_2 ) ; std::string Texte_inport( const std::string inport_type, const std::string inport_nom ) ; @@ -47,10 +48,11 @@ public: // public: - std::string _YACSFile; - std::string _DirName; - std::string _Texte; - std::string _Texte_parametres; + std::string _YACSFile ; + std::string _DirName ; + std::string _Texte ; + std::string _Texte_parametres ; + std::string _noeud_1 ; bool _bLu; private : diff --git a/src/HOMARD_I/HOMARD_Gen_i.cxx b/src/HOMARD_I/HOMARD_Gen_i.cxx index d99eb184..0e161e08 100755 --- a/src/HOMARD_I/HOMARD_Gen_i.cxx +++ b/src/HOMARD_I/HOMARD_Gen_i.cxx @@ -2777,7 +2777,7 @@ void HOMARD_Gen_i::DriverTexteBoundary(HOMARD::HOMARD_Cas_var myCase, HomardDriv std::list::const_iterator it = ListeBoundaryTraitees.begin(); while (it != ListeBoundaryTraitees.end()) { - MESSAGE ( "... BoundaryNameTraitee = " << *it); + MESSAGE ( "..... BoundaryNameTraitee = " << *it); if ( BoundaryName == *it ) { A_faire = 0 ; } it++; } @@ -3540,17 +3540,13 @@ CORBA::Long HOMARD_Gen_i::WriteYACSSchema (const char* nomCas, const char* Scrip { myDriver->Texte_python( pythonHypo, 3, "Hypo" ) ; } - // F.1.7. Zones : les creations - else if ( mot_cle == "HOMARD_Init_au_debut_Zone" ) + // F.1.7. Zones et frontieres : les creations + else if ( mot_cle == "HOMARD_Init_au_debut" ) { - std::string saux ; - if ( TypeAdap == 0 ) - { YACSDriverTexteZone( myHypo, myDriver ) ; } - else - { - saux = myDriver->Texte_HOMARD_Init_au_debut_control(); - myDriver->TexteAdd(saux); - } + std::string texte_control = myDriver->Texte_HOMARD_Init_au_debut_control() ; + if ( TypeAdap == 0 ) { texte_control += YACSDriverTexteZone( myHypo, myDriver ) ; } + texte_control += YACSDriverTexteBoundary( myCase, myDriver ) ; + myDriver->TexteAdd(texte_control); } // F.1.8. Zones : les parametres else if ( mot_cle == "PARAMETRES" ) @@ -3584,18 +3580,15 @@ CORBA::Long HOMARD_Gen_i::WriteYACSSchema (const char* nomCas, const char* Scrip //============================================================================= // Ecriture d'un schema YACS : ecriture des zones associees a une hypothese //============================================================================= -void HOMARD_Gen_i::YACSDriverTexteZone(HOMARD::HOMARD_Hypothesis_var myHypo, YACSDriver* myDriver) +std::string HOMARD_Gen_i::YACSDriverTexteZone(HOMARD::HOMARD_Hypothesis_var myHypo, YACSDriver* myDriver) { MESSAGE ( "YACSDriverTexteZone" ); // A. Les zones associees a cette hypothese HOMARD::listeZonesHypo* ListZone = myHypo->GetZones(); int numberOfZonesx2 = ListZone->length(); - // B. Initialisation du texte de controle - std::string texte_control = myDriver->Texte_HOMARD_Init_au_debut_control() ; - - // C. Parcours des zones - std::string noeud = "CreateHypothesis" ; + // B. Parcours des zones + std::string texte_control ; for (int iaux = 0; iaux< numberOfZonesx2; iaux++) { // 1. Reperage de la zone @@ -3607,33 +3600,88 @@ void HOMARD_Gen_i::YACSDriverTexteZone(HOMARD::HOMARD_Hypothesis_var myHypo, YAC // La premiere ligne est un commentaire a eliminer // La seconde ligne est l'instruction a proprement parler ; on ne garde que ce qui suit le "." CORBA::String_var dumpCorbaZone = myZone->GetDumpPython(); - std::string pythonZone_0 = dumpCorbaZone.in(); - MESSAGE ("pythonZone_0 :"<TexteAdd(texte_control) ; + return texte_control ; +} +//============================================================================= +// Ecriture d'un schema YACS : ecriture des frontieres associees au cas +//============================================================================= +std::string HOMARD_Gen_i::YACSDriverTexteBoundary(HOMARD::HOMARD_Cas_var myCase, YACSDriver* myDriver) +{ + MESSAGE ( "YACSDriverTexteBoundary" ); + // A. Les frontieres associees au cas + HOMARD::ListBoundaryGroupType* ListBoundaryGroupType = myCase->GetBoundaryGroup(); + int numberOfitems = ListBoundaryGroupType->length(); - return ; + // B. Parcours des frontieres + std::string texte_control ; + std::list ListeBoundaryTraitees ; + for (int NumBoundary = 0; NumBoundary< numberOfitems; NumBoundary=NumBoundary+2) + { + std::string BoundaryName = std::string((*ListBoundaryGroupType)[NumBoundary]); + MESSAGE ( "... BoundaryName = " << BoundaryName); + // Attention a n'ecrire la definition qu'une seule fois car elle peut se trouver + // plusieurs fois dans la definition du cas, d'ou la liste ListeBoundaryTraitees + int A_faire = 1 ; + std::list::const_iterator it = ListeBoundaryTraitees.begin(); + while (it != ListeBoundaryTraitees.end()) + { + MESSAGE ( "..... BoundaryNameTraitee = " << *it); + if ( BoundaryName == *it ) { A_faire = 0 ; } + it++; + } + if ( A_faire == 1 ) + { + // 1. Caracteristiques de la frontiere + HOMARD::HOMARD_Boundary_var myBoundary = myContextMap[GetCurrentStudyID()]._mesBoundarys[BoundaryName]; + ASSERT(!CORBA::is_nil(myBoundary)); + // 2. Les instructions python associees a la frontiere + // La premiere ligne est un commentaire a eliminer + // La seconde ligne est l'instruction a proprement parler ; on ne garde que ce qui suit le "." + CORBA::String_var dumpCorbaBoundary = myBoundary->GetDumpPython(); + std::string pythonStructure_0 = dumpCorbaBoundary.in(); + MESSAGE ("pythonStructure_0 :"<