Salome HOME
Insertion des frontières dans la création des schémas YACS
[modules/homard.git] / src / HOMARD / YACSDriver.cxx
index f48fb7e734bae2fc805a6e64b04d700c371a2260..a8202e39eb00adfabd806d58e6fc2a8aa5b59f4f 100644 (file)
@@ -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 = "<<YACSFile<<", DirName ="<<DirName);
@@ -104,22 +105,22 @@ void YACSDriver::Texte_HOMARD_Init_au_debut_Case_Options( const std::string pyth
 //===============================================================================
 // La description des zones
 // ZoneType : le type de la zone
-// pythonZone : le python correspondant a la zone
+// pythonStructure : le python correspondant a la zone
 // methode : methode associee a la creation de la zone
 // ZoneName : nom de la zone
-// noeud_1 : noeud de depart
 //===============================================================================
-std::string YACSDriver::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 YACSDriver::Texte_HOMARD_Init_au_debut_Zone( int ZoneType, const std::string pythonStructure, const std::string methode, const std::string ZoneName )
 {
-  MESSAGE("Texte_HOMARD_Init_au_debut_Zone, ZoneType = "<<ZoneType<<", pythonZone = "<<pythonZone);
-  MESSAGE("methode = "<<methode<<", ZoneName = "<<ZoneName<<", noeud_1 = "<<noeud_1 );
+  MESSAGE("Texte_HOMARD_Init_au_debut_Zone, ZoneType = "<<ZoneType<<", pythonStructure = "<<pythonStructure);
+  MESSAGE("methode = "<<methode<<", ZoneName = "<<ZoneName );
 //
 // 1. Le nom du noeud
   std::string noeud_2 = methode + "_" + ZoneName ;
   std::string node = "Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.p1_HOMARD_Init_au_debut." ;
   node += noeud_2 ;
 // 2. Texte de controle
-  std::string texte_control = Texte_control (noeud_1, noeud_2) ;
+  std::string texte_control = Texte_control (_noeud_1, noeud_2) ;
+  _noeud_1 = noeud_2 ;
 // 3. Definition du service
   _Texte += "                           <service name=\"" + noeud_2 + "\">\n" ;
   _Texte += "                              <node>Etude_Initialisation.SetCurrentStudy</node>\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 = "<<BoundaryType<<", pythonStructure = "<<pythonStructure);
+  MESSAGE("methode = "<<methode<<", BoundaryName = "<<BoundaryName );
+//
+// 1. Le nom du noeud
+  std::string noeud_2 = methode + "_" + BoundaryName ;
+  std::string node = "Tant_que_le_calcul_n_a_pas_converge.Alternance_Calcul_HOMARD.Adaptation.p0_Adaptation_HOMARD.HOMARD_Initialisation.p1_HOMARD_Init_au_debut." ;
+  node += noeud_2 ;
+// 2. Texte de controle
+  std::string texte_control = Texte_control (_noeud_1, noeud_2) ;
+  _noeud_1 = noeud_2 ;
+// 3. Definition du service
+  _Texte += "                           <service name=\"" + noeud_2 + "\">\n" ;
+  _Texte += "                              <node>Etude_Initialisation.SetCurrentStudy</node>\n" ;
+  _Texte += "                              <method>" + methode + "</method>\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 = "<<lignebis );
+    if      ( iaux == 0 ) { x0 = lignebis ; }
+    else if ( iaux == 1 ) { x1 = lignebis ; }
+    else if ( iaux == 2 ) { x2 = lignebis ; }
+    else if ( iaux == 3 ) { x3 = lignebis ; }
+    else if ( iaux == 4 ) { x4 = lignebis ; }
+    else if ( iaux == 5 ) { x5 = lignebis ; }
+    else if ( iaux == 6 ) { x6 = lignebis ; }
+    ligne = GetStringInTexte( ligne, ",", 1 );
+    iaux += 1 ;
+  }
+// La derniere valeur est toujours mise dans x7
+  x7 = GetStringInTexte ( ligne, ")", 0 ) ;
+  MESSAGE("coor = "<< x0<<","<<x1<< ","<< x2<< ","<< x3<<","<<x4<<","<<x5<<","<<x6<<",x7"<<x7);
+//
+// 4.2. Cas d une frontiere discrete (0)
+  if (BoundaryType == 0) // Cas d une frontiere discrete
+  {
+    _Texte += Texte_inport( "string", "MeshName" ) ;
+    TexteParametre( node, "MeshName", "string", BoundaryName ) ;
+    _Texte += Texte_inport( "string", "FileName" ) ;
+    TexteParametre( node, "FileName", "string", BoundaryName ) ;
+  }
+// 4.2. Cas du cylindre (1)
+  else if ( BoundaryType == 1 )
+  {
+    _Texte += Texte_inport( "double", "Xcentre" ) ;
+    _Texte += Texte_inport( "double", "Ycentre" ) ;
+    _Texte += Texte_inport( "double", "Zcentre" ) ;
+    _Texte += Texte_inport( "double", "Xaxis" ) ;
+    _Texte += Texte_inport( "double", "Yaxis" ) ;
+    _Texte += Texte_inport( "double", "Zaxis" ) ;
+    _Texte += Texte_inport( "double", "Radius" ) ;
+    TexteParametre( node, "Xcentre", "double", x0 ) ;
+    TexteParametre( node, "Ycentre", "double", x1 ) ;
+    TexteParametre( node, "Zcentre", "double", x2 ) ;
+    TexteParametre( node, "Xaxis", "double", x3 ) ;
+    TexteParametre( node, "Yaxis", "double", x4 ) ;
+    TexteParametre( node, "Zaxis", "double", x5 ) ;
+    TexteParametre( node, "Radius", "double", x7 ) ;
+  }
+//
+// 4.2. Cas de la sphere (2)
+  else if ( BoundaryType == 2 )
+  {
+    _Texte += Texte_inport( "double", "Xcentre" ) ;
+    _Texte += Texte_inport( "double", "Ycentre" ) ;
+    _Texte += Texte_inport( "double", "Zcentre" ) ;
+    _Texte += Texte_inport( "double", "Radius" ) ;
+    TexteParametre( node, "Xcentre", "double", x0 ) ;
+    TexteParametre( node, "Ycentre", "double", x1 ) ;
+    TexteParametre( node, "Zcentre", "double", x2 ) ;
+    TexteParametre( node, "Radius", "double", x7 ) ;
+  }
+//
+// 4.2. Cas d un cone defini par un axe et un angle
+  else if ( BoundaryType == 3 )
+  {
+    _Texte += Texte_inport( "double", "Xaxis" ) ;
+    _Texte += Texte_inport( "double", "Yaxis" ) ;
+    _Texte += Texte_inport( "double", "Zaxis" ) ;
+    _Texte += Texte_inport( "double", "Angle" ) ;
+    _Texte += Texte_inport( "double", "Xcentre" ) ;
+    _Texte += Texte_inport( "double", "Ycentre" ) ;
+    _Texte += Texte_inport( "double", "Zcentre" ) ;
+    TexteParametre( node, "Xaxis", "double", x0 ) ;
+    TexteParametre( node, "Yaxis", "double", x1 ) ;
+    TexteParametre( node, "Zaxis", "double", x2 ) ;
+    TexteParametre( node, "Angle", "double", x3 ) ;
+    TexteParametre( node, "Xcentre", "double", x4 ) ;
+    TexteParametre( node, "Ycentre", "double", x5 ) ;
+    TexteParametre( node, "Zcentre", "double", x7 ) ;
+  }
+//
+// 4.2. Cas d un cone defini par les 2 rayons
+  else if ( BoundaryType == 4 )
+  {
+    _Texte += Texte_inport( "double", "Xcentre1" ) ;
+    _Texte += Texte_inport( "double", "Ycentre1" ) ;
+    _Texte += Texte_inport( "double", "Zcentre1" ) ;
+    _Texte += Texte_inport( "double", "Radius1" ) ;
+    _Texte += Texte_inport( "double", "Xcentre2" ) ;
+    _Texte += Texte_inport( "double", "Ycentre2" ) ;
+    _Texte += Texte_inport( "double", "Zcentre2" ) ;
+    _Texte += Texte_inport( "double", "Radius2" ) ;
+    TexteParametre( node, "Xcentre1", "double", x0 ) ;
+    TexteParametre( node, "Ycentre1", "double", x1 ) ;
+    TexteParametre( node, "Zcentre1", "double", x2 ) ;
+    TexteParametre( node, "Radius1", "double", x3 ) ;
+    TexteParametre( node, "Xcentre2", "double", x4 ) ;
+    TexteParametre( node, "Ycentre2", "double", x5 ) ;
+    TexteParametre( node, "Zcentre2", "double", x6 ) ;
+    TexteParametre( node, "Radius2", "double", x7 ) ;
+  }
+//
+// 4.2. Erreur
+  else
+  { ASSERT("Type de frontiere inconnu." == 0); }
+
+//
+// 5. La fin
+  _Texte += "                              <outport name=\"return\" type=\"HOMARD_Boundary\"/>\n" ;
+  _Texte += "                           </service>\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()