-// Copyright (C) 2011-2013 CEA/DEN, EDF R&D
+// Copyright (C) 2011-2014 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
_tag_hypo = 0 ;
_tag_yacs = 0 ;
_tag_zone = 0 ;
- _Langue = "Francais" ;
- _LangueShort = "fr" ;
+
+ SetPreferences( ) ;
}
//=================================
/*!
if (!so->FindAttribute(anAttr, "AttributeComment")) continue;
SALOMEDS::AttributeComment_var aCommentAttr = SALOMEDS::AttributeComment::_narrow(anAttr);
std::string value (aCommentAttr->Value());
+ if(value == std::string("IterationHomard")) continue;
if(value == std::string("HypoHomard")) continue;
SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
aStudyBuilder->RemoveObject(so);
}
}
//=============================================================================
+void HOMARD_Gen_i::InvalideYACS(const char* YACSName)
+{
+ MESSAGE( "InvalideYACS : YACSName = " << YACSName );
+ HOMARD::HOMARD_YACS_var myYACS = myContextMap[GetCurrentStudyID()]._mesYACSs[YACSName];
+ if (CORBA::is_nil(myYACS))
+ {
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::BAD_PARAM;
+ es.text = "Invalid schema YACS";
+ throw SALOME::SALOME_Exception(es);
+ return ;
+ };
+ //
+ SALOMEDS::SObject_var aYACSSO = SALOMEDS::SObject::_narrow(myCurrentStudy->FindObjectIOR(_orb->object_to_string(myYACS)));
+ SALOMEDS::ChildIterator_var aYACS = myCurrentStudy->NewChildIterator(aYACSSO);
+ for (; aYACS->More(); aYACS->Next())
+ {
+ SALOMEDS::SObject_var so = aYACS->Value();
+ SALOMEDS::GenericAttribute_var anAttr;
+ if (!so->FindAttribute(anAttr, "AttributeComment")) continue;
+ SALOMEDS::AttributeComment_var aCommentAttr = SALOMEDS::AttributeComment::_narrow(anAttr);
+ std::string value (aCommentAttr->Value());
+ if( value == std::string("xml") )
+ {
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+ aStudyBuilder->RemoveObject(so);
+ }
+ }
+ std::string nomFichier = myYACS->GetXMLFile();
+ std::string commande = "rm -rf " + std::string(nomFichier) ;
+ MESSAGE ( "commande = " << commande );
+ if ((system(commande.c_str())) != 0)
+ {
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::BAD_PARAM;
+ es.text = "The XML file for the schema YACS cannot be removed." ;
+ throw SALOME::SALOME_Exception(es);
+ return ;
+ }
+}
+//=============================================================================
void HOMARD_Gen_i::InvalideZone(const char* ZoneName)
{
MESSAGE( "InvalideZone : ZoneName = " << ZoneName );
SALOMEDS::SObject_var aIterSO = SALOMEDS::SObject::_narrow(myCurrentStudy->FindObjectIOR(_orb->object_to_string(myIteration)));
ASSERT(!CORBA::is_nil(aIterSO));
- // Gestion de l'etude
+ // Gestion de l'arbre d'etudes
SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
-
aStudyBuilder->NewCommand();
-
SALOMEDS::SObject_var aSubSO = aStudyBuilder->NewObject(aIterSO);
aStudyBuilder->Addreference(aSubSO, aHypoSO);
-
aStudyBuilder->CommitCommand();
// Liens reciproques
IsValidStudy () ;
// Creation du cas
- HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 1, 0, 1) ;
+ int option = 1 ;
+ if ( _PublisMeshIN != 0 ) option = 2 ;
+ HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 1, 0, option) ;
myCase->SetDirName(DirName) ;
// Analyse
myCase->MeshInfo(Qual, Diam, Conn, Tail, Inte) ;
{
INFOS ( "CreateCase : nomCas = " << nomCas << ", MeshName = " << MeshName << ", MeshFile = " << MeshFile );
- // Par defaut, on ne publie pas le maillage
- HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 0, 0, 1) ;
+ int option = 1 ;
+ if ( _PublisMeshIN != 0 ) option = 2 ;
+ HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 0, 0, option) ;
// Valeurs par defaut des filtrages
myCase->SetPyram(0);
// A. Decodage du point de reprise
// A.1. Controle du repertoire de depart de l'iteration
-#ifndef WIN32
- codret = chdir(DirNameStart) ;
-#else
- codret = _chdir(DirNameStart) ;
-#endif
+ codret = CHDIR(DirNameStart) ;
if ( codret != 0 )
{
SALOME::ExceptionStruct es;
// C. Creation effective du cas
- // Par defaut, on ne publie pas le maillage
- HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 1, NumeIter, 1) ;
+ int option = 1 ;
+ if ( _PublisMeshIN != 0 ) option = 2 ;
+ HOMARD::HOMARD_Cas_ptr myCase = CreateCase0(nomCas, MeshName, MeshFile, 1, NumeIter, option) ;
// D. Parametrages lus dans le fichier de configuration
throw SALOME::SALOME_Exception(es);
}
// E.3. Copie du maillage HOMARD au format MED
-#ifndef WIN32
- codret = chdir(DirNameStart) ;
-#else
- codret = _chdir(DirNameStart) ;
-#endif
+ codret = CHDIR(DirNameStart) ;
std::string commande = "cp " + file_maillage_homard + " " + nomDirIterTotal ;
MESSAGE ( "commande : " << commande ) ;
codret = system(commande.c_str()) ;
delete[] MeshName ;
delete[] MeshFile ;
-#ifndef WIN32
- chdir(nomDirWork.c_str());
-#else
- _chdir(nomDirWork.c_str());
-#endif
+ CHDIR(nomDirWork.c_str());
return HOMARD::HOMARD_Cas::_duplicate(myCase);
}
//=============================================================================
int NumeIterMax = -1 ;
// A.1. Controle du repertoire de depart du cas
-#ifndef WIN32
- codret = chdir(DirNameStart) ;
-#else
- codret = _chdir(DirNameStart) ;
-#endif
+ codret = CHDIR(DirNameStart) ;
if ( codret != 0 )
{
SALOME::ExceptionStruct es;
#endif
if ( ( DirName_1 != "." ) && ( DirName_1 != ".." ) )
{
-#ifndef WIN32
- if ( chdir(DirName_1.c_str()) == 0 )
+ if ( CHDIR(DirName_1.c_str()) == 0 )
{
// On cherche le fichier de configuration dans ce sous-repertoire
- codret = chdir(DirNameStart);
+ codret = CHDIR(DirNameStart);
+#ifndef WIN32
DIR *dp_1;
struct dirent *dirp_1;
dp_1 = opendir(DirName_1.c_str()) ;
{
std::string file_name_1(dirp_1->d_name);
#else
- if ( _chdir(DirName_1.c_str()) == 0 )
- {
- codret = _chdir(DirNameStart);
HANDLE hFind1 = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA ffd1;
hFind1 = FindFirstFile(DirName_1.c_str(), &ffd1);
if ( bilan != string::npos )
{
// Decodage du fichier pour trouver le numero d'iteration
-#ifndef WIN32
- chdir(DirName_1.c_str()) ;
-#else
- _chdir(DirName_1.c_str()) ;
-#endif
+ CHDIR(DirName_1.c_str()) ;
std::ifstream fichier( file_name_1.c_str() );
if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
es.text = CORBA::string_dup(text.c_str());
throw SALOME::SALOME_Exception(es);
}
-#ifndef WIN32
- chdir(DirNameStart) ;
-#else
- _chdir(DirNameStart) ;
-#endif
+ CHDIR(DirNameStart) ;
}
if ( existe ) { break ; }
}
}
#ifndef WIN32
closedir(dp);
- chdir(nomDirWork.c_str());
#else
- FindClose(hFind);
- }
- _chdir(nomDirWork.c_str());
+ FindClose(hFind);
#endif
+ CHDIR(nomDirWork.c_str());
if ( ( Number >= 0 && ( !existe ) ) || ( Number < 0 && ( NumeIterMax == -1 ) ) )
{
myHypothesis->SetNivMax(-1);
myHypothesis->SetDiamMin(-1.0);
myHypothesis->SetAdapInit(0);
- myHypothesis->SetLevelOutput(0);
+ myHypothesis->SetExtraOutput(1);
return HOMARD::HOMARD_Hypothesis::_duplicate(myHypothesis);
}
// Lien avec l'iteration precedente
myIterationParent->LinkNextIteration(NomIteration);
myIteration->SetIterParentName(nomIterParent);
+ // Gestion de l'arbre d'etudes
+ SALOMEDS::SObject_var aIterSOParent = SALOMEDS::SObject::_narrow(myCurrentStudy->FindObjectIOR(_orb->object_to_string(myIterationParent)));
+ SALOMEDS::SObject_var aIterSO = SALOMEDS::SObject::_narrow(myCurrentStudy->FindObjectIOR(_orb->object_to_string(myIteration)));
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+ aStudyBuilder->NewCommand();
+ SALOMEDS::SObject_var aSubSO = aStudyBuilder->NewObject(aIterSO);
+ aStudyBuilder->Addreference(aSubSO, aIterSOParent);
+ aStudyBuilder->CommitCommand();
return HOMARD::HOMARD_Iteration::_duplicate(myIteration);
}
//=============================================================================
HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryDi(const char* BoundaryName, const char* MeshName, const char* MeshFile)
{
- INFOS ("CreateBoundaryDi : BoundaryName = " << BoundaryName << "MeshName = " << MeshName );
+ INFOS ("CreateBoundaryDi : BoundaryName = " << BoundaryName << ", MeshName = " << MeshName );
HOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 0);
myBoundary->SetMeshFile( MeshFile ) ;
myBoundary->SetMeshName( MeshName ) ;
return HOMARD::HOMARD_Boundary::_duplicate(myBoundary) ;
}
//=============================================================================
+HOMARD::HOMARD_Boundary_ptr HOMARD_Gen_i::CreateBoundaryTorus(const char* BoundaryName,
+ CORBA::Double Xcentre, CORBA::Double Ycentre, CORBA::Double Zcentre,
+ CORBA::Double Xaxe, CORBA::Double Yaxe, CORBA::Double Zaxe,
+ CORBA::Double RayonRev, CORBA::Double RayonPri)
+{
+ INFOS ("CreateBoundaryTorus : BoundaryName = " << BoundaryName ) ;
+//
+ SALOME::ExceptionStruct es;
+ int error = 0 ;
+ if ( ( RayonRev <= 0.0 ) || ( RayonPri <= 0.0 ) )
+ { es.text = "The radius must be positive." ;
+ error = 1 ; }
+ double daux = fabs(Xaxe) + fabs(Yaxe) + fabs(Zaxe) ;
+ if ( daux < 0.0000001 )
+ { es.text = "The axis must be a non 0 vector." ;
+ error = 2 ; }
+ if ( error != 0 )
+ {
+ es.type = SALOME::BAD_PARAM;
+ throw SALOME::SALOME_Exception(es);
+ return 0;
+ };
+//
+ HOMARD::HOMARD_Boundary_var myBoundary = CreateBoundary(BoundaryName, 5) ;
+ myBoundary->SetTorus( Xcentre, Ycentre, Zcentre, Xaxe, Yaxe, Zaxe, RayonRev, RayonPri ) ;
+
+ return HOMARD::HOMARD_Boundary::_duplicate(myBoundary) ;
+}
+//=============================================================================
HOMARD::HOMARD_Zone_ptr HOMARD_Gen_i::CreateZone(const char* ZoneName, CORBA::Long ZoneType)
{
MESSAGE ("CreateZone : ZoneName = " << ZoneName << ", ZoneType = " << ZoneType);
HOMARD::HOMARD_Iteration_var myIteration = myContextMap[GetCurrentStudyID()]._mesIterations[NomIteration];
ASSERT(!CORBA::is_nil(myIteration));
- // A.2. Numero de l'iteration
+ // A.2. Controle de la possibilite d'agir
+ // A.2.1. Etat de l'iteration
+ int etat = myIteration->GetState();
+ MESSAGE ( "etat = "<<etat );
+ // A.2.2. On ne calcule pas l'iteration initiale, ni une iteration deja calculee
+ if ( modeHOMARD == 1 )
+ {
+ if ( etat <= 0 )
+ {
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::BAD_PARAM;
+ es.text = "This iteration is the first of the case and cannot be computed.";
+ throw SALOME::SALOME_Exception(es);
+ return 1 ;
+ }
+ else if ( ( etat == 2 ) & ( modeHOMARD == 1 ) )
+ {
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::BAD_PARAM;
+ es.text = "This iteration is already computed.";
+ throw SALOME::SALOME_Exception(es);
+ return 1 ;
+ }
+ }
+ // A.2.3. On n'analyse pas une iteration non calculee
+ else
+ {
+ if ( etat == 1 )
+ {
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::BAD_PARAM;
+ es.text = "This iteration is not computed.";
+ throw SALOME::SALOME_Exception(es);
+ return 1 ;
+ }
+ }
+
+ // A.3. Numero de l'iteration
// siterp1 : numero de l'iteration a traiter
// Si adaptation :
// siter : numero de l'iteration parent, ou 0 si deja au debut mais cela ne servira pas !
else
{ siter = siterp1 ; }
- // A.3. Le cas
+ // A.4. Le cas
const char* nomCas = myIteration->GetCaseName();
HOMARD::HOMARD_Cas_var myCase = myContextMap[GetCurrentStudyID()]._mesCas[nomCas];
ASSERT(!CORBA::is_nil(myCase));
// D. On passe dans le repertoire de l'iteration a calculer
MESSAGE ( ". On passe dans DirCompute = " << DirCompute );
-#ifndef WIN32
- chdir(DirCompute);
-#else
- _chdir(DirCompute);
-#endif
+ CHDIR(DirCompute);
// E. Les donnees de l'execution HOMARD
// E.1. L'objet du texte du fichier de configuration
// H.3 Message d'erreur
if (codretexec != 0)
{
- std::string text ;
+ std::string text = "" ;
// Message d'erreur en cas de probleme en adaptation
if ( modeHOMARD == 1 )
{
}
}
}
- else
- {
- text = "Voir le fichier Liste.log.\n" ;
- }
+ text += "\n\nSee the file " + LogFile + "\n" ;
INFOS ( text ) ;
SALOME::ExceptionStruct es;
es.type = SALOME::BAD_PARAM;
delete myDriver;
MESSAGE ( ". On retourne dans nomDirWork = " << nomDirWork );
-#ifndef WIN32
- chdir(nomDirWork.c_str());
-#else
- _chdir(nomDirWork.c_str());
-#endif
+ CHDIR(nomDirWork.c_str());
}
return codretexec ;
// A. Prealable
// A.1. Bases
int codret = 0;
- // Etat de l'iteration
- int etat = myIteration->GetState();
// Numero de l'iteration
int NumeIter = myIteration->GetNumber();
std::stringstream saux0 ;
std::string siter = saux0.str() ;
if (NumeIter < 11) { siter = "0" + siter ; }
- // A.2. On ne calcule pas l iteration initiale
- if ( etat <= 0 )
- {
- MESSAGE ( "etat = "<<etat );
- SALOME::ExceptionStruct es;
- es.type = SALOME::BAD_PARAM;
- es.text = "This iteration is the first of the case and cannot be computed.";
- throw SALOME::SALOME_Exception(es);
- return 1;
- };
-
- // A.3. On verifie qu il y a une hypothese (erreur improbable);
+ // A.2. On verifie qu il y a une hypothese (erreur improbable);
const char* nomHypo = myIteration->GetHypoName();
if (std::string(nomHypo) == std::string(""))
{
int TypeAdap = (*ListTypes)[0];
int TypeRaff = (*ListTypes)[1];
int TypeDera = (*ListTypes)[2];
+// MESSAGE ( ". TypeAdap = " << TypeAdap << ", TypeRaff = " << TypeRaff << ", TypeDera = " << TypeDera );
// E. Texte du fichier de configuration
// E.1. Incontournables du texte
MESSAGE ( ". DiamMin = " << DiamMin );
int AdapInit = myHypo->GetAdapInit();
MESSAGE ( ". AdapInit = " << AdapInit );
- int LevelOutput = myHypo->GetLevelOutput();
- MESSAGE ( ". LevelOutput = " << LevelOutput );
- myDriver->TexteAdvanced(Pyram, NivMax, DiamMin, AdapInit, LevelOutput);
+ int ExtraOutput = myHypo->GetExtraOutput();
+ MESSAGE ( ". ExtraOutput = " << ExtraOutput );
+ myDriver->TexteAdvanced(Pyram, NivMax, DiamMin, AdapInit, ExtraOutput);
// E.7. Ajout des informations sur le deroulement de l'execution
int MessInfo = myIteration->GetInfoCompute();
{
MESSAGE ( "CreateDirNameIter : nomrep ="<< nomrep << ", num = "<<num);
// On verifie que le repertoire parent existe
-#ifndef WIN32
- int codret = chdir(nomrep) ;
-#else
- int codret = _chdir(nomrep) ;
-#endif
+ int codret = CHDIR(nomrep) ;
if ( codret != 0 )
{
SALOME::ExceptionStruct es;
{
// On passe dans le repertoire parent
-#ifndef WIN32
- chdir(nomrep);
-#else
- _chdir(nomrep);
-#endif
+ CHDIR(nomrep);
// On recherche un nom sous la forme Iabc, avec abc representant le numero
int jaux ;
if ( num < 100 ) { jaux = 2 ; }
DirNameA << "I" << iaux.str();
// Si on ne pas peut entrer dans le repertoire, on doit verifier
// que c'est bien un probleme d'absence
-#ifndef WIN32
- if ( chdir(DirNameA.str().c_str()) != 0 )
- {
-#else
- if ( _chdir(DirNameA.str().c_str()) != 0 )
+ if ( CHDIR(DirNameA.str().c_str()) != 0 )
{
-#endif
bool existe = false ;
#ifndef WIN32
DIR *dp;
#ifndef WIN32
closedir(dp);
#else
- }
FindClose(hFind);
#endif
if ( !existe )
MESSAGE ( "==> DirName = " << DirName);
MESSAGE ( ". On retourne dans nomDirActuel = " << nomDirActuel );
-#ifndef WIN32
- chdir(nomDirActuel.c_str());
-#else
- _chdir(nomDirActuel.c_str());
-#endif
+ CHDIR(nomDirActuel.c_str());
return CORBA::string_dup( DirName.c_str() );
}
//=============================================================================
MESSAGE (". DirCompute = " << DirCompute.str() );
// B.3.3. Si le sous-repertoire n'existe pas, on le cree
-#ifndef WIN32
- if (chdir(DirCompute.str().c_str()) != 0)
+ if (CHDIR(DirCompute.str().c_str()) != 0)
{
-// Creation du repertoire car il n'existe pas :
+#ifndef WIN32
if (mkdir(DirCompute.str().c_str(), S_IRWXU|S_IRGRP|S_IXGRP) != 0)
- {
#else
- if (_chdir(DirCompute.str().c_str()) != 0)
- {
-// Creation du repertoire car il n'existe pas :
if (_mkdir(DirCompute.str().c_str()) != 0)
- {
#endif
+ {
// GERALD -- QMESSAGE BOX
std::cerr << "Pb Creation du repertoire DirCompute = " << DirCompute.str() << std::endl;
VERIFICATION("Pb a la creation du repertoire" == 0);
{
SALOME::ExceptionStruct es;
es.type = SALOME::BAD_PARAM;
- std::string text = "Directory : " + DirCompute.str() + "is not empty";
+ std::string text = "Directory : " + DirCompute.str() + " is not empty";
es.text = CORBA::string_dup(text.c_str());
throw SALOME::SALOME_Exception(es);
VERIFICATION("Directory is not empty" == 0);
std::string BoundaryName = std::string((*ListBoundaryGroupType)[NumBoundary]);
MESSAGE ( "... BoundaryName = " << BoundaryName);
// 2.1. La frontiere a-t-elle deja ete ecrite ?
- // Cela arrive quand elle estliéé a plusieurs groupes. Il ne faut l'ecrire que la premiere fois
+ // Cela arrive quand elle est liee a plusieurs groupes. Il ne faut l'ecrire que la premiere fois
int A_faire = 1 ;
std::list<std::string>::const_iterator it = ListeBoundaryTraitees.begin();
while (it != ListeBoundaryTraitees.end())
if (BoundaryType == 0)
{
const char* MeshName = myBoundary->GetMeshName() ;
+ MESSAGE ( ". MeshName = " << MeshName );
const char* MeshFile = myBoundary->GetMeshFile() ;
+ MESSAGE ( ". MeshFile = " << MeshFile );
myDriver->TexteBoundaryDi( MeshName, MeshFile);
if ( BoundaryOption % 2 != 0 ) { BoundaryOption = BoundaryOption*2 ; }
}
myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], (*coor)[7]);
if ( BoundaryOption % 3 != 0 ) { BoundaryOption = BoundaryOption*3 ; }
}
+ else if (BoundaryType == 5) // Cas d un tore
+ {
+ myDriver->TexteBoundaryAn(BoundaryName, NumBoundaryAnalytical, BoundaryType, (*coor)[0], (*coor)[1], (*coor)[2], (*coor)[3], (*coor)[4], (*coor)[5], (*coor)[6], (*coor)[7]);
+ if ( BoundaryOption % 3 != 0 ) { BoundaryOption = BoundaryOption*3 ; }
+ }
}
// 2.2.3. Memorisation du traitement
ListeBoundaryTraitees.push_back( BoundaryName );
icone = "conedxyz.png" ;
break;
}
+ case 5 :
+ { value = "BoundaryAnHomard" ;
+ icone = "toruspointvector.png" ;
+ break;
+ }
}
aResultSO = aStudyBuilder->NewObject(aSObject);
PublishInStudyAttr(aStudyBuilder, aResultSO, theName, value.c_str(), icone.c_str(), _orb->object_to_string(theObject));
{
MESSAGE ( "PublishResultInSmesh : le fichier " << NomFich << " est deja publie." );
// Pour un fichier importe, on ne republie pas
- if ( Option == 0 )
- {
- return;
- }
+ if ( Option == 0 ) { return; }
// Pour un fichier calcule, on commence par faire la depublication
else
{
return ;
}
//=============================================================================
+void HOMARD_Gen_i::PublishMeshIterInSmesh(const char* NomIter)
+{
+ MESSAGE( "PublishMeshIterInSmesh " << NomIter);
+ HOMARD::HOMARD_Iteration_var myIteration = myContextMap[GetCurrentStudyID()]._mesIterations[NomIter];
+
+ SALOMEDS::SObject_var aIterSO=SALOMEDS::SObject::_narrow(myCurrentStudy->FindObjectIOR(_orb->object_to_string(myIteration)));
+ if (CORBA::is_nil(myIteration))
+ {
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::BAD_PARAM;
+ es.text = "Invalid iterationStudy Object";
+ throw SALOME::SALOME_Exception(es);
+ return ;
+ };
+ const char* MeshFile = myIteration->GetMeshFile() ;
+ const char* MeshName = myIteration->GetMeshName() ;
+ CORBA::Long Option = -1 ;
+ int etat = myIteration->GetState();
+// Iteration initiale
+ if ( etat <= 0 ) { Option = 0 ; }
+// ou iteration calculee
+ else if ( etat == 2 ) { Option = 1 ; }
+// Publication effective apres menage eventuel
+ if ( Option >= 0 )
+ {
+ DeleteResultInSmesh(MeshFile, MeshName) ;
+ PublishResultInSmesh(MeshFile, Option) ;
+ }
+
+}
+//=============================================================================
void HOMARD_Gen_i::PublishFileUnderIteration(const char* NomIter, const char* NomFich, const char* Commentaire)
{
// MESSAGE ("PublishFileUnderIteration pour l'iteration " << NomIter << " du fichier " << NomFich << " avec le commentaire " << Commentaire );
myYACS->SetScriptFile( ScriptFile ) ;
myYACS->SetCaseName( nomCas ) ;
// D.2. Defaut
+ int defaut_i ;
// D.2.1. Type constant
myYACS->SetType( 1 ) ;
- // D.2.2. Fichier de sauvegarde dans le repertoire du cas
+ // D.2.2. Convergence
+ defaut_i = GetYACSMaxIter() ;
+ myYACS->SetMaxIter( defaut_i ) ;
+ defaut_i = GetYACSMaxNode() ;
+ myYACS->SetMaxNode( defaut_i ) ;
+ defaut_i = GetYACSMaxElem() ;
+ myYACS->SetMaxElem( defaut_i ) ;
+ // D.3. Fichier de sauvegarde dans le repertoire du cas
HOMARD::HOMARD_Cas_ptr caseyacs = GetCase(nomCas) ;
std::string dirnamecase = caseyacs->GetDirName() ;
std::string XMLFile ;
std::string DirName = myYACS->GetDirName() ;
std::string MeshFile = myYACS->GetMeshFile() ;
std::string ScriptFile = myYACS->GetScriptFile() ;
+ // B.3. Les caracteristiques de convergence
+ int MaxIter = myYACS->GetMaxIter() ;
+ int MaxNode = myYACS->GetMaxNode() ;
+ int MaxElem = myYACS->GetMaxElem() ;
// C. Le cas
// C.1. L'objet cas
// G.1.8. Execution de HOMARD : les options de l'iteration
else if ( mot_cle == "HOMARD_Exec_Iter_Options" )
{ myDriver->Texte_python_2( pythonIter, "TimeStep", "Iter" ) ; }
- // G.1.9. Zones et frontieres : les creations
+ // G.1.9. a. Creation eventuelles des zones et frontieres
+ // b. Enchainement
else if ( mot_cle == "Iter_1" )
{
- std::string texte_control = myDriver->Texte_Iter_1_control() ;
+ std::string texte_control = "" ;
if ( TypeAdap == 0 ) { texte_control += YACSDriverTexteZone( myHypo, myDriver ) ; }
texte_control += YACSDriverTexteBoundary( myCase, myDriver ) ;
+ texte_control += myDriver->Texte_Iter_1_control() ;
myDriver->TexteAdd(texte_control);
}
- // G.1.10. Les parametres
+ // G.1.10. Les tests de convergence
+ else if ( mot_cle == "Analyse_Test_Convergence" )
+ { myDriver->TexteAnalyse_Test_Convergence(MaxIter, MaxNode, MaxElem); }
+ // G.1.11. Les parametres
else if ( mot_cle == "PARAMETRES" )
{ myDriver->TexteAddParametres(); }
// G.1.n. La ligne est recopiee telle quelle
texte_control_0 = myDriver->Texte_Iter_1_Zone(ZoneType, pythonStructure, methode, ZoneName );
texte_control += texte_control_0 ;
// 5. Decalage
- iaux += 1 ;
+ iaux ++ ;
}
return texte_control ;
// 4. Mise en place des instructions
int BoundaryType = myBoundary->GetType();
MESSAGE ( "... BoundaryType = " << BoundaryType);
+ const char* MeshName ;
+ const char* MeshFile ;
+ if (BoundaryType == 0)
+ {
+ MeshName = myBoundary->GetMeshName() ;
+ MESSAGE ( ". MeshName = " << MeshName );
+ MeshFile = myBoundary->GetMeshFile() ;
+ MESSAGE ( ". MeshFile = " << MeshFile );
+ }
std::string texte_control_0 ;
- texte_control_0 = myDriver->Texte_Iter_1_Boundary(BoundaryType, pythonStructure, methode, BoundaryName );
+ texte_control_0 = myDriver->Texte_Iter_1_Boundary(BoundaryType, pythonStructure, methode, BoundaryName, MeshName, MeshFile );
texte_control += texte_control_0 ;
// 5. Memorisation du traitement
ListeBoundaryTraitees.push_back( BoundaryName );
}
else if (line.substr(0, iterSignature.size()) == iterSignature) {
// re-create iteration
- MESSAGE ("Recreation de l iteration" );
+ MESSAGE ("Recreation de l'iteration" );
HOMARD::HOMARD_Iteration_var aIter = newIteration();
PortableServer::ServantBase_var aServant = GetServant(aIter);
HOMARD_Iteration_i* aIterServant = dynamic_cast<HOMARD_Iteration_i*>(aServant.in());
std::string aScript = "\"\"\"\n";
aScript += "Python script for HOMARD\n";
- aScript += "Copyright EDF-R&D 2013\n";
+ aScript += "Copyright EDF-R&D 1996, 2011, 2014\n";
aScript += "\"\"\"\n";
aScript += "__revision__ = \"V1.2\"\n";
aScript += "import HOMARD\n";
#endif
}
//===============================================================================
-// Recuperation de la chaine de caracteres par rapport a l'apparition d'un texte
+// Recuperation de la chaine de caracteres par rapport a l'apparition d'un caractere
// ligne : la ligne a manipuler
-// texte : le texte a reperer
-// option : 0 : la chaine avant le texte
-// 1 : la chaine apres le texte
-// Si le texte est absent, on retourne la chaine totale
+// caractere : le caractere a reperer
+// option : 0 : la chaine avant la premiere apparition du caractere
+// 1 : la chaine apres la premiere apparition du caractere
+// 2 : la chaine avant la derniere apparition du caractere
+// 3 : la chaine apres la derniere apparition du caractere
+// Si le caractere est absent, on retourne la chaine totale
//===============================================================================
-std::string HOMARD_Gen_i::GetStringInTexte( const std::string ligne, const std::string texte, int option )
+std::string HOMARD_Gen_i::GetStringInTexte( const std::string ligne, const std::string caractere, int option )
{
-// MESSAGE("GetStringInTexte, recherche de '"<<texte<<"' dans '"<<ligne<<"'"<<", option = "<<option);
+// MESSAGE("GetStringInTexte, recherche de '"<<caractere<<"' dans '"<<ligne<<"'"<<", option = "<<option);
//
std::string chaine = ligne ;
- int position = ligne.find_first_of( texte ) ;
- if ( position > 0 )
+ int position ;
+ if ( option < 2 ) { position = ligne.find_first_of( caractere ) ; }
+ else { position = ligne.find_last_of( caractere ) ; }
+// MESSAGE("position = "<<position);
+// MESSAGE("a = "<<ligne.substr( 0, position ).c_str());
+// MESSAGE("b = "<<ligne.substr( position+1 ).c_str());
+//
+ if ( position != std::string::npos )
{
- if ( option == 0 ) { chaine = ligne.substr( 0, position ) ; }
- else { chaine = ligne.substr( position+1 ) ; }
+ if ( ( option == 0 ) || ( option == 2 ) ) { chaine = ligne.substr( 0, position ) ; }
+ else { chaine = ligne.substr( position+1 ) ; }
}
return chaine ;
//
}
-// //===============================================================================
-// // Langue de SALOME
-// //===============================================================================
+//=============================================================================
+//=============================================================================
+// Gestion des preferences
+//=============================================================================
+//=============================================================================
+// Decodage du fichier d'arcihvage des preferences
+//
+void HOMARD_Gen_i::SetPreferences( )
+{
+ MESSAGE ( "SetPreferences" );
+
+ std::string ligne, mot_cle, salome_version ;
+ bool ok = true ;
+
+ // A. Les valeurs par defaut ; elles doivent etre coherentes
+ std::string LanguageShort = "en" ;
+ int PublisMeshIN = 0 ;
+ int PublisMeshOUT = 0 ;
+ int YACSMaxIter = 0 ;
+ int YACSMaxNode = 0 ;
+ int YACSMaxElem = 0 ;
+ std::string YACSTypeTestchaine = "None" ;
+
+ // B. La version de salome
+ // Cela se presente sous la forme :
+ // [SALOME KERNEL] : 7.3.0
+ std::string File ;
+ File = getenv("KERNEL_ROOT_DIR") ;
+ File += "/bin/salome/VERSION" ;
+ MESSAGE ( "File = "<<File ) ;
+ std::ifstream fichier0( File.c_str() ) ;
+ if ( fichier0 ) // ce test échoue si le fichier n'est pas ouvert
+ {
+ std::string ligne; // variable contenant chaque ligne lue
+ while ( std::getline( fichier0, ligne ) )
+ {
+ std::istringstream ligne_bis(ligne); // variable contenant chaque ligne sous forme de flux
+ ligne_bis >> mot_cle ;
+ if ( mot_cle == "[SALOME" )
+ {
+ salome_version = GetStringInTexte ( ligne, " ", 3 ) ;
+// MESSAGE ( "salome_version = "<<salome_version<<"|||");
+ break ;
+ }
+ }
+ }
+ else { ok = false ; }
+
+ // B. Decodage du fichier de preferences
+ if ( ok )
+ {
+ std::string PrefFile ;
+ PrefFile = getenv("HOME") ;
+ PrefFile += "/.config/salome/SalomeApprc." + salome_version ;
+ MESSAGE ( "PrefFile = "<<PrefFile ) ;
+
+ std::ifstream fichier( PrefFile.c_str() );
+ if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
+ {
+ bool section_langue = false ;
+ bool section_homard = false ;
+ while ( std::getline( fichier, ligne ) )
+ {
+ std::string chaine ;
+ // 1. Pour la ligne courante, on identifie le premier mot : le mot-cle eventuel
+ std::istringstream ligne_bis(ligne); // variable contenant chaque ligne sous forme de flux
+ ligne_bis >> mot_cle ;
+
+ // 2. Les sections
+ // 2.1. Debut d'une section
+ // MESSAGE(mot_cle);
+ if ( mot_cle == "<section" )
+ { /*MESSAGE ( "Debut de la section : "<< ligne);*/
+ ligne_bis >> mot_cle ;
+ chaine = GetStringInTexte ( mot_cle, "\"", 1 ) ;
+ chaine = GetStringInTexte ( chaine, "\"", 0 ) ;
+ if ( chaine == "language" ) { section_langue = true ; }
+ if ( chaine == "HOMARD" ) { section_homard = true ; }
+ // MESSAGE ( "section_langue = "<<section_langue<<", section_homard = "<<section_homard);
+ }
+ // 2.2. Fin d'une section
+ else if ( mot_cle == "</section>" )
+ { /*MESSAGE ( "Fin de la section : "<< ligne<<", section_langue = "<<section_langue<<", section_homard = "<<section_homard);*/
+ section_langue = false ;
+ section_homard = false ; }
+
+ // 3. Parametres
+ // 3.1. La langue
+ else if ( section_langue || section_homard )
+ { MESSAGE ( "a decoder : "<< ligne);
+// La valeur : entre les deux premieres quotes
+ chaine = GetStringInTexte ( ligne, "\"", 1 ) ;
+// MESSAGE("chaine 1 = |"<<chaine<<"|");
+ chaine = GetStringInTexte ( chaine, "\"", 0 ) ;
+// MESSAGE("chaine = |"<<chaine<<"|");
+// Le mot_cle : entre les deux dernieres quotes
+ std::string chaine2 = GetStringInTexte ( ligne, "\"", 2 ) ;
+// MESSAGE("chaine2 1 = |"<<chaine2<<"|");
+ chaine2 = GetStringInTexte ( chaine2, "\"", 3 ) ;
+// MESSAGE("chaine2 = |"<<chaine2<<"|");
+ // 3.1. La langue
+ if ( section_langue )
+ { if ( chaine2 == "language" ) { LanguageShort = chaine ; } }
+ // 3.2. HOMARD
+ if ( section_homard )
+ {
+ std::istringstream chainebis( chaine ) ;
+ // 3.2.1. Les publications
+ if ( chaine2 == "publish_mesh_in" ) { chainebis >> PublisMeshIN ; }
+ if ( chaine2 == "publish_mesh_out" ) { chainebis >> PublisMeshOUT ; }
+ // 3.2.2. Les maximum pour YACS
+ if ( chaine2 == "yacs_max_iter" ) { chainebis >> YACSMaxIter ; }
+ if ( chaine2 == "yacs_max_node" ) { chainebis >> YACSMaxNode ; }
+ if ( chaine2 == "yacs_max_elem" ) { chainebis >> YACSMaxElem ; }
+ if ( chaine2 == "yacs_type_test" ) { YACSTypeTestchaine = chaine ; }
+ }
+ }
+ }
+ }
+ }
+
+ // C. Enregistrements
+ MESSAGE ("Enregistrement de LanguageShort = " << LanguageShort );
+ SetLanguageShort( LanguageShort.c_str() ) ;
+
+ MESSAGE ("Enregistrement de PublisMeshIN = " << PublisMeshIN<<", PublisMeshOUT = "<< PublisMeshOUT);
+ SetPublisMesh(PublisMeshIN, PublisMeshOUT) ;
+
+ MESSAGE ("Enregistrement de YACSMaxIter = " << YACSMaxIter<<", YACSMaxNode = "<< YACSMaxNode<<", YACSMaxElem = "<< YACSMaxElem);
+ SetYACSMaximum(YACSMaxIter, YACSMaxNode, YACSMaxElem) ;
+
+ MESSAGE ("Enregistrement de TypeTest = " << YACSTypeTestchaine.c_str() );
+ int YACSTypeTest ;
+ if ( ( YACSTypeTestchaine == "VTest > VRef" ) || ( YACSTypeTestchaine == "VTest > VRef" ) ) { YACSTypeTest = 1 ; }
+ else if ( ( YACSTypeTestchaine == "VTest < VRef" ) || ( YACSTypeTestchaine == "VTest < VRef" ) ) { YACSTypeTest = 2 ; }
+ else { YACSTypeTest = 0 ; }
+ MESSAGE ("==> TypeTest = " << YACSTypeTest );
+ SetYACSConvergenceType( YACSTypeTest ) ;
+
+ return ;
+}
+//===============================================================================
+// Langue de SALOME
+//===============================================================================
void HOMARD_Gen_i::SetLanguageShort(const char* LanguageShort)
{
// MESSAGE ("SetLanguageShort pour LanguageShort = " << LanguageShort );
// MESSAGE ("GetLanguageShort");
return CORBA::string_dup( _LangueShort.c_str() );
}
+//===============================================================================
+// Options de publications
+//===============================================================================
+void HOMARD_Gen_i::SetPublisMesh(CORBA::Long PublisMeshIN, CORBA::Long PublisMeshOUT)
+{
+ _PublisMeshIN = PublisMeshIN ;
+ _PublisMeshOUT = PublisMeshOUT ;
+ return ;
+}
+CORBA::Long HOMARD_Gen_i::GetPublisMeshIN()
+{
+ return _PublisMeshIN ;
+}
+CORBA::Long HOMARD_Gen_i::GetPublisMeshOUT()
+{
+ return _PublisMeshOUT ;
+}
+//===============================================================================
+// YACS - test de convergence
+//===============================================================================
+void HOMARD_Gen_i::SetYACSMaximum(CORBA::Long YACSMaxIter, CORBA::Long YACSMaxNode, CORBA::Long YACSMaxElem)
+{
+ _YACSMaxIter = YACSMaxIter ;
+ _YACSMaxNode = YACSMaxNode ;
+ _YACSMaxElem = YACSMaxElem ;
+ return ;
+}
+CORBA::Long HOMARD_Gen_i::GetYACSMaxIter()
+{
+ return _YACSMaxIter ;
+}
+CORBA::Long HOMARD_Gen_i::GetYACSMaxNode()
+{
+ return _YACSMaxNode ;
+}
+CORBA::Long HOMARD_Gen_i::GetYACSMaxElem()
+{
+ return _YACSMaxElem ;
+}
+void HOMARD_Gen_i::SetYACSConvergenceType(CORBA::Long YACSTypeTest)
+{
+ _YACSTypeTest = YACSTypeTest ;
+ return ;
+}
+CORBA::Long HOMARD_Gen_i::GetYACSConvergenceType()
+{
+ return _YACSTypeTest ;
+}
//=============================================================================
extern "C"