#!/usr/bin/env python # -*- coding: utf-8 -*- """Tests des adaptations par MGAdapt en standalone Copyright 2021 EDF Gérald NICOLAS +33.1.78.19.43.52 """ __revision__ = "V04.04" #========================= Les imports - Début =================================== import inspect import sys import os import tempfile import shutil import salome salome.standalone() salome.salome_init_without_session() import SMESH from salome.smesh import smeshBuilder smesh = smeshBuilder.New() #========================== Les imports - Fin ==================================== #========================= Paramétrage - Début =================================== # 1. REPDATA = répertoire du cas REPDATA = os.path.abspath(os.path.join(os.path.dirname(inspect.getfile(lambda: None)), 'data')) # # 2. Repérage des données D_DATA = dict() D_DATA["01"] = "01" # 2D plan ; carte locale D_DATA["02"] = "02" # 2D plan ; carte en arrière-plan D_DATA["03"] = "01" # 2D plan ; taille constante D_DATA["04"] = "04" # 3D ; carte locale et dernier pas de temps D_DATA["05"] = "04" # 3D ; carte locale et pas de temps n°1 D_DATA["06"] = "06" # 2D non plan; carte locale D_DATA["07"] = "07" # 2D plan ; carte locale anisotrope D_DATA["08"] = "08" # 3D ; carte en arrière-plan anisotrope D_DATA["10"] = "10" # 2D plan ; carte locale et maillage initial quadratique D_DATA["11"] = "11" # 2D plan ; carte locale et maillage initial en quadrangles D_DATA["13"] = "13" # 3D ; carte locale en simple précision et dernier pas de temps #========================== Paramétrage - Fin ==================================== class MGAdaptTest (object): """Test de l'adaptation par MGAdapt Options facultatives ******************** Le(s) nom du/des tests à passer. Si aucun n'est donné, tous les cas sont passés. """ # A. La base message_info = "" _verbose = 0 _verbose_max = 0 affiche_aide_globale = 0 # B. Les variables l_cas = None rep_test = None nro_cas = None cas = None #=========================== Début de la méthode ================================= def __init__ ( self, liste_option ): """Le constructeur de la classe MGAdaptTest""" self.l_cas = list() self.repout = None for option in liste_option : #print (option) saux = option.upper() #print (saux) if saux in ( "-H", "-HELP" ): self.affiche_aide_globale = 1 elif saux == "-V" : self._verbose = 1 elif saux == "-VMAX" : self._verbose = 1 self._verbose_max = 1 else : self.l_cas.append(option) if not self.l_cas: for cle in D_DATA: self.l_cas.append(cle) self.l_cas.sort() if self._verbose_max: print ("Liste des cas : {}".format(self.l_cas)) #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def __del__(self): """A la suppression de l'instance de classe""" if self._verbose_max: print ("Suppression de l'instance de la classe.") #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _add_file_in (self, objet_adapt): """Ajout du fichier med d'entrée Entrées/Sorties : :objet_adapt: l'objet du module """ if self._verbose_max: print ("_add_file_in pour {}".format(self.nro_cas)) ficmed = os.path.join (REPDATA, "test_{}.med".format(D_DATA[self.nro_cas])) if self._verbose_max: print ("Fichier {}".format(ficmed)) if not os.path.isfile(ficmed): erreur = 1 message = "Le fichier {} est inconnu.".format(ficmed) else: objet_adapt.setMEDFileIn(ficmed) erreur = 0 message = "" return erreur, message #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _add_file_out (self, objet_adapt): """Ajout du fichier de sortie Entrées/Sorties : :objet_adapt: l'objet du module """ if self._verbose_max: print ("_add_file_out pour {}".format(self.nro_cas)) if not self.repout: self.repout = tempfile.mkdtemp() ficmed = os.path.join (self.repout, "test_{}.adapt.tui.med".format(self.nro_cas)) if os.path.isfile(ficmed): os.remove(ficmed) objet_adapt.setMEDFileOut(ficmed) if self._verbose: print (". Maillage adapté dans le fichier {}".format(ficmed)) return #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _add_file_bkg (self, objet_adapt): """Ajout du fichier med de fond Entrées/Sorties : :objet_adapt: l'objet du module """ if self._verbose_max: print ("_add_file_bkg pour {}".format(self.nro_cas)) ficmed = os.path.join (REPDATA, "test_{}_bg.med".format(D_DATA[self.nro_cas])) if self._verbose_max: print ("Fichier {}".format(ficmed)) if not os.path.isfile(ficmed): erreur = 1 message = "Le fichier {} est inconnu.".format(ficmed) else: objet_adapt.setMEDFileBackground(ficmed) erreur = 0 message = "" return erreur, message #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _hypo_creation (self, maptype, option, niveau=3): """Création d'une hypothèse Entrées : :maptype: type de carte : "Local", "Background", "Constant" :option: nom du champ si "Local" ou "Background", valeur si "Constant" :niveau: niveau de verbosité Sortie : :hypo: l'objet hypothèse """ if self._verbose_max: print ("_hypo_creation pour {} avec {}".format(maptype,option)) erreur = 0 message = "" while not erreur : #--- Création de l'hypothèse --- hypo = smesh.CreateAdaptationHypothesis() # Type de données if ( maptype in ("Local", "Background", "Constant") ): hypo.setSizeMapType(maptype) else: message = "Le type de carte {} est inconnu.".format(maptype) erreur = 2 break # Valeur if ( maptype in ("Local", "Background") ): hypo.setSizeMapFieldName(option) else: hypo.setConstantSize(option) # Verbosité self._hypo_verbose (hypo, niveau) break return erreur, message, hypo #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _hypo_verbose (self, hypo, niveau=10): """Débogage des hypothèses Entrées : :niveau: niveau de verbosité Entrées/Sorties : :hypo: l'objet hypothèse """ hypo.setVerbosityLevel(niveau) if self._verbose_max: hypo.setPrintLogInFile(True) hypo.setKeepWorkingFiles(True) hypo.setRemoveOnSuccess(False) return #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _calcul (self, objet_adapt, hypo): """Calcul Entrées : :objet_adapt: l'objet du module :hypo: l'objet hypothèse """ #--- association de l'hypothese à l'objet de l'adaptation objet_adapt.AddHypothesis(hypo) #-- Calcul if self._verbose_max: print (hypo.getCommandToRun()) erreur = objet_adapt.Compute(False) if erreur: message = "Echec dans l'adaptation." else: message = "" return erreur, message #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _test_00 (self, objet_adapt): """Test générique Entrées/Sorties : :objet_adapt: l'objet du module """ erreur = 0 message = "" while not erreur : #--- les fichiers MED ---# erreur, message = self._add_file_in (objet_adapt) if erreur: break self._add_file_out (objet_adapt) if self.nro_cas in ("02", "08"): erreur, message = self._add_file_bkg (objet_adapt) if erreur: break #--- Création de l'hypothèse --- if self.nro_cas in ("01", "04", "05", "06", "07", "10", "11", "13"): maptype = "Local" if self.nro_cas in ("01", "04", "05", "06", "07", "10"): option = "TAILLE" elif self.nro_cas in ("11",): option = "Taille de maille" elif self.nro_cas in ("13",): option = "Elevation" elif self.nro_cas in ("02", "08"): maptype = "Background" option = "TAILLE" elif self.nro_cas in ("03",): maptype = "Constant" option = 0.5 if self._verbose: niveau = 3 elif self._verbose_max: niveau = 10 else: niveau = 0 erreur, message, hypo = self._hypo_creation(maptype, option, niveau) if erreur: break #-- Ajout des options if self.nro_cas in ("04", "06", "07", "08", "10", "11"): hypo.setTimeStepRankLast() elif self.nro_cas in ("05",): hypo.setTimeStepRank(1,1) elif self.nro_cas in ("13",): hypo.setTimeStepRank(0,0) # options facultatives if self.nro_cas in ("03",): hypo.setOptionValue("adaptation", "surface") #-- Calcul try : erreur, message = self._calcul (objet_adapt, hypo) except : erreur = 1871 message = "Erreur dans le calcul par SMESH" break return erreur, message #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def _traitement_cas (self ): """Traitement d'un cas Sorties : :erreur: code d'erreur :message: message d'erreur """ nom_fonction = __name__ + "/_traitement_cas" blabla = "\nDans {} :".format(nom_fonction) if self._verbose_max: print (blabla) # 1. Préalables erreur = 0 message = "" if self._verbose: print ("Passage du cas '{}'".format(self.nro_cas)) if ( self.nro_cas in ("01", "02", "03", "04", "05", "06", "07", "08", "10" ,"11" ,"13") ): objet_adapt = smesh.Adaptation('MG_Adapt') erreur, message = self._test_00 (objet_adapt) del objet_adapt else: erreur = 1 message = "Le cas '{}' est inconnu.".format(self.nro_cas) return erreur, message #=========================== Fin de la méthode ================================== #=========================== Début de la méthode ================================= def lancement (self): """Lancement Sorties : :erreur: code d'erreur :message: message d'erreur """ nom_fonction = __name__ + "/lancement" blabla = "\nDans {} :".format(nom_fonction) erreur = 0 message = "" if self._verbose_max: print (blabla) for nom_cas in self.l_cas: self.nro_cas = nom_cas erreur_t, message_t = self._traitement_cas () if erreur_t: erreur += 1 message += "\nErreur n° {} pour le cas {} :\n".format(erreur_t,nom_cas) message += message_t if ( erreur and self._verbose_max ): print (blabla, message) if self.repout: shutil.rmtree(self.repout) return erreur, message #=========================== Fin de la méthode ================================== #========================== Fin de la classe ==================================== #================================================================================== # Lancement #================================================================================== if __name__ == "__main__" : # 1. Options L_OPTIONS = list() #L_OPTIONS.append("-h") #L_OPTIONS.append("-v") #L_OPTIONS.append("-vmax") L_OPTIONS.append("01") L_OPTIONS.append("02") L_OPTIONS.append("03") L_OPTIONS.append("07") L_OPTIONS.append("10") L_OPTIONS.append("11") L_OPTIONS.append("04") L_OPTIONS.append("05") L_OPTIONS.append("06") L_OPTIONS.append("08") L_OPTIONS.append("13") # 2. Lancement de la classe #print ("L_OPTIONS :", L_OPTIONS) MGADAPT_TEST = MGAdaptTest(L_OPTIONS) if MGADAPT_TEST.affiche_aide_globale: sys.stdout.write(MGADAPT_TEST.__doc__+"\n") else: ERREUR, MESSAGE_ERREUR = MGADAPT_TEST.lancement() if ERREUR: sys.stdout.write(MGADAPT_TEST.__doc__+"\n") MESSAGE_ERREUR += "\n {} erreur(s)\n".format(ERREUR) sys.stderr.write(MESSAGE_ERREUR) #raise Exception(MESSAGE_ERREUR) assert(False) del MGADAPT_TEST #sys.exit(0)