.. image:: images/intro_38.png
:align: center
-Comme on continue l'adaptation avec le même critére de saut de température entre noeuds voisins, on garde l'hypothèse "*Hypo_1*". Il suffit de désigner le fichier issu du calcul que l'on vient de faire et qui contient le nouveau champ de température.
+Comme on continue l'adaptation avec le même critère de saut de température entre noeuds voisins, on garde l'hypothèse "*Hypo_1*". Il suffit de désigner le fichier issu du calcul que l'on vient de faire et qui contient le nouveau champ de température.
.. image:: images/intro_39.png
:align: center
:align: center
On peut alors lancer un nouveau calcul sur ce nouveau maillage et poursuiver cette alternance calcul/adaptation jusqu'à l'obtention du résultat attendu.
+
+
+Evolutions du module
+""""""""""""""""""""
+.. index:: single: évolution
+
+On trouvera ici les principales évolutions de HOMARD à partir de la première version livrée dans SALOME 6.5.
+
+SALOME VERSION 6.6 :
+ - Interfaçage avec med 3.0.6
+ - Valeurs par défaut des instants
+ - Acceptation des mailles de type TRIA7 et QUAD9
+ - Option de sortie dans le fichier MED du niveau de raffinement atteint dans chaque maille
+
+SALOME VERSION 7.1 :
+ - Correction d'une anomalie sur le filtrage du raffinement par les groupes
+ - Pilotage de l'adaptation par un seuil basé sur la moyenne et l'écart-type (voir :ref:`tui_create_hypothese`)
+ - En TUI, choix du dernier instant comme instant de pilotage par SetTimeStepRankLast (voir :ref:`tui_create_iteration`)
+ - Possibilité de détruire les objets (GUI et TUI)
+ - Modification des fonctions TUI pour qu'elles agissent sur les objets et non plus sur les noms :
+ homard.AssociateIterHypo(iter_name,hypo_name) devient iter.AssociateHypo(hypo_name)
+
+ homard.AssociateHypoZone(hypo_name,zone_name,type_use) devient hypo.AssociateHypo(zone_name,type_use)
+
+ homard.CreateIteration(iter_name,iter_parent_name) devient iter.NextIteration(iter_name) ou case.NextIteration(iter_name)
+ - Ajout de fonctions :
+ cas.LastIteration() : retourne la dernière itération de la descendance du cas (voir :ref:`tui_create_iteration`)
+
+
+
+
+
+
| * 3 : fraction des mailles en % |
| * 4 : moyenne + n fois l'écart-type |
| |
-| - ``threshold`` : valeur du seuil |
+| - ``threshold`` : valeur numérique entrant dans la |
+| définition du seuil |
+---------------------------------------------------------------+
| .. module:: GetRefinThrType |
| |
| **SetTimeStepRank(TimeStep, Rank)** |
| Définit les instants pour le champ |
| |
+| Si un seul instant est défini pour le champ, il est pris |
+| par défaut. |
+| |
| Inutile si aucun instant n'est défini pour le champ |
| |
| - ``TimeStep`` : l'instant où est pris le champ |
| - ``Rank`` : le numéro d'ordre où est pris le champ |
+---------------------------------------------------------------+
+| .. module:: SetTimeStepRankLast |
+| |
+| **SetTimeStepRankLast()** |
+| Précise que le dernier instant enregistré pour le champ |
+| est utilisé |
++---------------------------------------------------------------+
| .. module:: GetFieldFileName |
| |
| **GetFieldFileName()** |
string GetFieldFile() raises (SALOME::SALOME_Exception);
void SetTimeStepRank(in long TimeStep, in long Rank)
raises (SALOME::SALOME_Exception);
+ void SetTimeStepRankLast() raises (SALOME::SALOME_Exception);
long GetTimeStep() raises (SALOME::SALOME_Exception);
long GetRank() raises (SALOME::SALOME_Exception);
// Le fichier des champs, avec l'instant eventuel
if ( _FieldFile != "" ) {
aScript << "\t" << _Name << ".SetFieldFile(\"" << _FieldFile << "\")\n";
- if ( ( _TimeStep != -1 ) and ( _Rank != -1 ) ) {
- aScript << "\t" << _Name << ".SetTimeStepRank( " << _TimeStep << ", " << _Rank << " )\n";
+ if ( _TimeStep == -2 ) {
+ aScript << "\t" << _Name << ".SetTimeStepRankLast()\n";
+ }
+ else
+ {
+ if ( ( _TimeStep != -1 ) and ( _Rank != -1 ) ) {
+ aScript << "\t" << _Name << ".SetTimeStepRank( " << _TimeStep << ", " << _Rank << " )\n";
+ }
}
}
_Rank = Rank;
}
//=============================================================================
+void HOMARD_Iteration::SetTimeStepRankLast()
+{
+ _TimeStep = -2;
+}
+//=============================================================================
int HOMARD_Iteration::GetTimeStep() const
{
return _TimeStep;
void SetFieldFile( const char* FieldFile );
std::string GetFieldFile() const;
void SetTimeStepRank( int TimeStep, int Rank );
+ void SetTimeStepRankLast();
int GetTimeStep() const;
int GetRank() const;
_Texte += "HOMaiN__ Mai" + _siter + " \"" + DirComputePa + "/maill." + _siter + ".hom.med\"\n" ;
_Texte += "HOMaiNP1 Mai" + _siterp1 + " \"" + DirCompute + "/maill." + _siterp1 + ".hom.med\"\n" ;
_Texte += "RepeTrav \"" + DirCompute + "\"\n" ;
+ _Texte += "RepeInfo \"" + DirCompute + "\"\n" ;
//
}
if ( LEFieldFile->text().trimmed() != QString(""))
{
QString FieldFile=LEFieldFile->text().trimmed();
+ aIter->SetFieldFile(CORBA::string_dup(FieldFile.toStdString().c_str()));
int rank = SpinBox_Rank->value();
int step = SpinBox_TimeStep->value();
- aIter->SetFieldFile(CORBA::string_dup(FieldFile.toStdString().c_str()));
- aIter->SetTimeStepRank(step,rank);
+ if ( step == -2 ) { aIter->SetTimeStepRankLast(); }
+ else { aIter->SetTimeStepRank(step,rank); }
}
_myHomardGen->AssociateIterHypo (IterName, monHypoName.toStdString().c_str());
aIter->SetMeshName(CORBA::string_dup(aMeshName_np1.toStdString().c_str()));
( _step != SpinBox_TimeStep->value()))
{
_FieldFile = LEFieldFile->text().trimmed();
+ aIter->SetFieldFile(CORBA::string_dup(_FieldFile.toStdString().c_str()));
_rank = SpinBox_Rank->value();
_step = SpinBox_TimeStep->value();
- aIter->SetFieldFile(CORBA::string_dup(_FieldFile.toStdString().c_str()));
- aIter->SetTimeStepRank(_step, _rank);
+ if ( _step == -2 ) { aIter->SetTimeStepRankLast(); }
+ else { aIter->SetTimeStepRank(_step, _rank); }
_myHomardGen->InvalideIter(_IterationName.toStdString().c_str());
HOMARD_UTILS::updateObjBrowser();
}
{
MESSAGE ( "Compute : calcul de " << NomIteration );
+// A. Prealable
+// A.1. La base
HOMARD::HOMARD_Iteration_var myIteration = myContextMap[GetCurrentStudyID()]._mesIterations[NomIteration];
ASSERT(!CORBA::is_nil(myIteration));
-// on ne calcule pas l iteration 0
+// A.2. On ne calcule pas l iteration 0
int NumeIter = myIteration->GetNumber();
if ( NumeIter == 0 )
{
return 1;
};
-// on verifie qu il y a une hypothese (erreur improbable);
+// A.3. On verifie qu il y a une hypothese (erreur improbable);
const char* nomHypo = myIteration->GetHypoName();
if (std::string(nomHypo) == std::string(""))
{
}
};
+ // A.5. Le cas
const char* nomCas = myIteration->GetCaseName();
HOMARD::HOMARD_Cas_var myCase = myContextMap[GetCurrentStudyID()]._mesCas[nomCas];
ASSERT(!CORBA::is_nil(myCase));
+ // A.6. Les numeros d'iterations
int codret = 0;
std::stringstream saux0 ;
saux0 << NumeIter - 1 ;
if (NumeIter < 10) { siterp1 = "0" + siterp1 ; }
// B. Les repertoires
- // B.1. Le repertoire du cas
+ // B.1. Le repertoire courant
+ char* nomDirWork = getenv("PWD") ;
+ // B.2. Le repertoire du cas
const char* nomDirCase = myCase->GetDirName();
MESSAGE ( ". nomDirCase = " << nomDirCase );
- // B.2. Le sous-repertoire de l'iteration a calculer, puis le repertoire complet a creer
- // B.2.1. Le nom du sous-repertoire
+ // B.3. Le sous-repertoire de l'iteration a calculer, puis le repertoire complet a creer
+ // B.3.1. Le nom du sous-repertoire
const char* nomDirIt = myIteration->GetDirName();
- // B.2.2. Le nom complet du sous-repertoire
+ // B.3.2. Le nom complet du sous-repertoire
std::stringstream DirCompute ;
DirCompute << nomDirCase << "/" << nomDirIt;
MESSAGE (". DirCompute = " << DirCompute.str() );
- // B.2.3. Si le sous-repertoire n'existe pas, on le cree
+ // B.3.3. Si le sous-repertoire n'existe pas, on le cree
// Si le sous-repertoire existe :
// etatMenage = 0 : on sort en erreur si le repertoire n'est pas vide
// etatMenage = 1 : on fait le menage du repertoire
}
else
{
-// Le repertoire existe et on fait le menage de son contenu :
+// Le repertoire existe
+// On demande de faire le menage de son contenu :
if (etatMenage != 0)
{
MESSAGE (". Menage du repertoire DirCompute = " << DirCompute.str());
ASSERT("Pb au menage du repertoire de calcul" == 0);
}
}
+// On n'a pas demande de faire le menage de son contenu : on sort en erreur :
else
{
-// Le repertoire existe et s'il n'est pas vide, on sort en erreur :
DIR *dp;
struct dirent *dirp;
dp = opendir(DirCompute.str().c_str());
}
}
- // B.3. Le sous-repertoire de l'iteration precedente
+ // B.4. Le sous-repertoire de l'iteration precedente
const char* nomDirItPa ;
std::stringstream DirComputePa ;
if (NumeIter == 1)
MESSAGE( ". nomDirItPa = " << nomDirItPa);
MESSAGE( ". DirComputePa = " << DirComputePa.str() );
- // B.4. Le fichier des messages
- chdir(DirCompute.str().c_str()) ;
+ // B.5. Le fichier des messages
std::string MessFile = DirCompute.str() + "/Liste." + siter + ".vers." + siterp1 ;
MESSAGE (". MessFile = " << MessFile);
myIteration->SetMessFile(MessFile.c_str());
// C. On passe dans le repertoire de l'iteration a calculer
+ MESSAGE ( ". On passe dans DirCompute = " << DirCompute.str() );
chdir(DirCompute.str().c_str()) ;
// D. Les donnees du calcul HOMARD
int TypeRaff = (*ListTypes)[1];
int TypeDera = (*ListTypes)[2];
- // D.6. L'option d'interpolation des champs
+ // D.5. L'option d'interpolation des champs
int TypeFieldInterp = myHypo->GetTypeFieldInterp();
// E. Texte du fichier de configuration
if (codret == 0)
{
delete myDriver;
- chdir(nomDirCase);
+ MESSAGE ( ". On retourne dans nomDirWork = " << nomDirWork );
+ chdir(nomDirWork);
}
return codretexec ;
myHomardIteration->SetTimeStepRank( TimeStep, Rank );
}
//=============================================================================
+void HOMARD_Iteration_i::SetTimeStepRankLast()
+{
+ ASSERT( myHomardIteration );
+ myHomardIteration->SetTimeStepRankLast();
+}
+//=============================================================================
CORBA::Long HOMARD_Iteration_i::GetTimeStep()
{
ASSERT( myHomardIteration );
void SetFieldFile( const char* FieldFile );
char* GetFieldFile();
void SetTimeStepRank( CORBA::Long TimeStep, CORBA::Long Rank );
+ void SetTimeStepRankLast();
CORBA::Long GetTimeStep();
CORBA::Long GetRank();