X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2Ftests%2FTest%2Ftest_6.py;h=435b3e5ce9adf222d104e013165f0331796f4463;hb=refs%2Ftags%2FV9_13_0b1;hp=d21baf482d7288e31048fec26e7a6e0999234b21;hpb=bde1941c107d56a45d572f2be6a575d392324025;p=modules%2Fhomard.git diff --git a/src/tests/Test/test_6.py b/src/tests/Test/test_6.py index d21baf48..435b3e5c 100755 --- a/src/tests/Test/test_6.py +++ b/src/tests/Test/test_6.py @@ -1,6 +1,5 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2011-2016 CEA/DEN, EDF R&D +# Copyright (C) 2011-2024 CEA, EDF # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -18,323 +17,305 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -""" -Python script for HOMARD -Test test_6 -""" -__revision__ = "V1.05" +"""Python script for HOMARD - Test test_6""" +__revision__ = "V2.01" -#======================================================================== -TEST_NAME = "test_6" -DEBUG = False -N_ITER_TEST_FILE = 3 -# -TAILLE = 10. -LG_ARETE = TAILLE*2.5 -#======================================================================== import os import sys -import HOMARD + import salome -# +import SHAPERSTUDY +import SMESH +import HOMARD + +from salome.shaper import model +from salome.smesh import smeshBuilder + # ================================== PATH_HOMARD = os.getenv('HOMARD_ROOT_DIR') # Repertoire des scripts utilitaires REP_PYTHON = os.path.join(PATH_HOMARD, "bin", "salome", "test", "HOMARD") REP_PYTHON = os.path.normpath(REP_PYTHON) sys.path.append(REP_PYTHON) -from test_util import saveGeometry from test_util import get_dir from test_util import test_results # ================================== + +#======================================================================== +TEST_NAME = "test_6" +DEBUG = False +VERBOSE = False +N_ITER_TEST_FILE = 3 +TAILLE = 10. +LG_ARETE = TAILLE*2.5 # Répertoires pour ce test REP_DATA, DIRCASE = get_dir(PATH_HOMARD, TEST_NAME, DEBUG) -# ================================== +#======================================================================== -salome.salome_init() -import iparameters -IPAR = iparameters.IParameters(salome.myStudy.GetCommonParameters("Interface Applicative", 1)) -IPAR.append("AP_MODULES_LIST", "Homard") -# -#========================= Debut de la fonction ================================== -# -def create_geom(nom_obj, taille, verbose=False) : - """ -Création de la géométrie - """ -# - erreur = 0 -# - if verbose : - texte = "Geometrie '%s'\n" % nom_obj - texte += "Taille de base = %f" % taille +salome.salome_init_without_session() + +#======================================================================== +def create_cao_smesh (): + """CAO and mesh""" + + structure_sh, xao_file = create_cao () + + error, mesh_file = create_mesh (structure_sh) + + return error, xao_file, mesh_file +#======================================================================== + +#======================================================================== +def create_cao (): + """CAO""" + + if VERBOSE : + texte = "Géométrie '{}'\n".format(TEST_NAME) + texte += "Taille de base ={}".format(TAILLE) print (texte) -# - import GEOM - from salome.geom import geomBuilder - geompy = geomBuilder.New(salome.myStudy) -# -# 1. Les sommets et la première ligne -# - vertex_1 = geompy.MakeVertex( 0.*taille, 0.*taille, 0.*taille, theName = "V1") - vertex_2 = geompy.MakeVertex( 5.*taille, 2.*taille, 0.*taille, theName = "V2") - vertex_3 = geompy.MakeVertex(10.*taille, 1.*taille, 0.*taille, theName = "V3") - vertex_4 = geompy.MakeVertex(16.*taille, 4.*taille, 0.*taille, theName = "V4") - vertex_5 = geompy.MakeVertex(16.*taille, 10.*taille, 0.*taille, theName = "V5") -# - courbe_0 = geompy.MakeInterpol([vertex_1, vertex_2, vertex_3, vertex_4, vertex_5], False, False, theName="courbe_0") -# -# 2. Les sommets et la seconde ligne -# - sommet_1 = geompy.MakeVertex( 0.*taille, 0.*taille, 20.*taille, theName = "S1") - sommet_2 = geompy.MakeVertex( 6.*taille, -5.*taille, 20.*taille, theName = "S2") - sommet_3 = geompy.MakeVertex(11.*taille, -2.*taille, 20.*taille, theName = "S3") - sommet_4 = geompy.MakeVertex(12.*taille, 3.*taille, 20.*taille, theName = "S4") - sommet_5 = geompy.MakeVertex(16.*taille, 10.*taille, 20.*taille, theName = "S5") -# - courbe_1 = geompy.MakeInterpol([sommet_1, sommet_2, sommet_3, sommet_4, sommet_5], False, False, theName="courbe_1") -# -# 3. La face de base -# - structure_g = geompy.MakeFilling([courbe_0, courbe_1], theName=nom_obj) -# -# 4. Groupes : on cherche les entites par des proximités avec des shapes bien choisies -# - l_groupes_g = list() -# - shape = geompy.GetFaceNearPoint (structure_g, vertex_2) - nom = "Voile" - groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["FACE"], nom) - geompy.UnionList ( groupe_g, [shape] ) - l_groupes_g.append( (nom, groupe_g, 2) ) -# - shape = geompy.GetEdgeNearPoint (structure_g, vertex_2) - nom = "C_0" - groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom) - geompy.UnionList ( groupe_g, [shape] ) - l_groupes_g.append( (nom, groupe_g, 1) ) -# - shape = geompy.GetEdgeNearPoint (structure_g, sommet_2) - nom = "C_1" - groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom) - geompy.UnionList ( groupe_g, [shape] ) - l_groupes_g.append( (nom, groupe_g, 1) ) -# - shape = geompy.GetEdge (structure_g, vertex_1, sommet_1) - nom = "D_0" - groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom) - geompy.UnionList ( groupe_g, [shape] ) - l_groupes_g.append( (nom, groupe_g, 1) ) -# - shape = geompy.GetEdge (structure_g, vertex_5, sommet_5) - nom = "D_1" - groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom) - geompy.UnionList ( groupe_g, [shape] ) - l_groupes_g.append( (nom, groupe_g, 1) ) -# - return erreur, structure_g, l_groupes_g -# -#========================== Fin de la fonction ================================== -# -#========================= Debut de la fonction ================================== -# -def create_mail(lg_arete, structure_g, l_groupes_g, rep_mail, verbose=False) : - """ -Création du maillage - """ -# - erreur = 0 - message = "" - ficmed = "" -# - while not erreur : -# - nom = structure_g.GetName() - if verbose : - texte = "Maillage de '%s'\n" % nom - texte += "lg_arete = %f\n" % lg_arete - texte += "rep_mail = '%s'" % rep_mail - print (texte) -# - import SMESH - from salome.smesh import smeshBuilder - smesh = smeshBuilder.New(salome.myStudy) -# -# 2. Maillage de calcul -# - maill_00 = smesh.Mesh(structure_g) - smesh.SetName(maill_00.GetMesh(), nom) -# - MG_CADSurf = maill_00.Triangle(algo=smeshBuilder.MG_CADSurf) + + model.begin() + partset = model.moduleDocument() + + part_1 = model.addPart(partset) + part_1_doc = part_1.document() + + ### Create Point + _ = model.addPoint(part_1_doc, 0.*TAILLE, 0.*TAILLE, 0.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 5.*TAILLE, 2.*TAILLE, 0.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 10.*TAILLE, 1.*TAILLE, 0.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 16.*TAILLE, 4.*TAILLE, 0.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 16.*TAILLE, 10.*TAILLE, 0.*TAILLE) + + ### Create interpolation + interpolation_1_objects = [model.selection("VERTEX", "all-in-Point_1"), \ + model.selection("VERTEX", "all-in-Point_2"), \ + model.selection("VERTEX", "all-in-Point_3"), \ + model.selection("VERTEX", "all-in-Point_4"), \ + model.selection("VERTEX", "all-in-Point_5")] + _ = model.addInterpolation(part_1_doc, interpolation_1_objects, False, False) + + + ### Create Point + _ = model.addPoint(part_1_doc, 0.*TAILLE, 0.*TAILLE, 20.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 6.*TAILLE, -5.*TAILLE, 20.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 11.*TAILLE, -2.*TAILLE, 20.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 12.*TAILLE, 3.*TAILLE, 20.*TAILLE) + + ### Create Point + _ = model.addPoint(part_1_doc, 16.*TAILLE, 10.*TAILLE, 20.*TAILLE) + + ### Create interpolation + interpolation_2_objects = [model.selection("VERTEX", "all-in-Point_6"), \ + model.selection("VERTEX", "all-in-Point_7"), \ + model.selection("VERTEX", "all-in-Point_8"), \ + model.selection("VERTEX", "all-in-Point_9"), \ + model.selection("VERTEX", "all-in-Point_10")] + _ = model.addInterpolation(part_1_doc, interpolation_2_objects, False, False) + + ### Create Filling + structure_sh = model.addFilling(part_1_doc, [model.selection("EDGE", "Interpolation_1_1"), model.selection("EDGE", "Interpolation_2_1")]) + structure_sh.setName(TEST_NAME) + structure_sh.result().setName(TEST_NAME) + + ### Create Group + group_1 = model.addGroup(part_1_doc, "Faces", [model.selection("FACE", TEST_NAME)]) + group_1.setName("Voile") + group_1.result().setName("Voile") + + ### Create Group + group_2 = model.addGroup(part_1_doc, "Edges", [model.selection("EDGE", "Interpolation_1_1")]) + group_2.setName("C_0") + group_2.result().setName("C_0") + + ### Create Group + group_3 = model.addGroup(part_1_doc, "Edges", [model.selection("EDGE", "Interpolation_2_1")]) + group_3.setName("C_1") + group_3.result().setName("C_1") + + ### Create Group + group_4 = model.addGroup(part_1_doc, "Edges", [model.selection("EDGE", TEST_NAME+"/Edge_0_1")]) + group_4.setName("D_0") + group_4.result().setName("D_0") + + ### Create Group + group_5 = model.addGroup(part_1_doc, "Edges", [model.selection("EDGE", TEST_NAME+"/Edge_0_3")]) + group_5.setName("D_1") + group_5.result().setName("D_1") + + xao_file = os.path.join(DIRCASE, TEST_NAME+".xao") + model.exportToXAO(part_1_doc, xao_file, model.selection("FACE", TEST_NAME), "GN", TEST_NAME) + + model.end() + + return structure_sh, xao_file +#======================================================================== + +#======================================================================== +def create_mesh (structure_sh): + """Mesh""" + error = 0 + mesh_file = os.path.join(DIRCASE, 'maill.00.med') + + if VERBOSE : + texte = "Maillage de '{}'\n".format(TEST_NAME) + texte += "lg_arete = {}\n".format(LG_ARETE) + print (texte) + + while not error : + +# 1. Importation to the study +# =========================== + model.publishToShaperStudy() + l_aux = SHAPERSTUDY.shape(model.featureStringId(structure_sh)) + +# 2. Creation of the mesh +# ======================= + smesh = smeshBuilder.New() + structure_m = smesh.Mesh(l_aux[0]) + + MG_CADSurf = structure_m.Triangle(algo=smeshBuilder.MG_CADSurf) smesh.SetName(MG_CADSurf.GetAlgorithm(), 'MG_CADSurf') -# + MG_CADSurf_Parameters = MG_CADSurf.Parameters() smesh.SetName(MG_CADSurf_Parameters, 'MG_CADSurf Triangles') - MG_CADSurf_Parameters.SetPhySize( lg_arete ) - MG_CADSurf_Parameters.SetMinSize( lg_arete/20. ) - MG_CADSurf_Parameters.SetMaxSize( lg_arete*5. ) - MG_CADSurf_Parameters.SetChordalError( lg_arete ) + MG_CADSurf_Parameters.SetPhySize( LG_ARETE ) + MG_CADSurf_Parameters.SetMinSize( LG_ARETE/20. ) + MG_CADSurf_Parameters.SetMaxSize( LG_ARETE*5. ) + MG_CADSurf_Parameters.SetChordalError( LG_ARETE ) MG_CADSurf_Parameters.SetAngleMesh( 12. ) -# -# 3. Les groupes issus de la géométrie -# - for taux in l_groupes_g : - groupe_m = maill_00.Group(taux[1]) - smesh.SetName(groupe_m, taux[0]) -# -# 4. Calcul -# - isDone = maill_00.Compute() + +# Les groupes issus de la géométrie + for groupe in l_aux[1:]: + groupe_nom = groupe.GetName() + if ( groupe_nom == "Voile" ): + shape = SMESH.FACE + else: + shape = SMESH.EDGE + _ = structure_m.GroupOnGeom(groupe,groupe_nom,shape) + +# Computation + isDone = structure_m.Compute() if not isDone : - message += "Probleme dans le maillage de la surface." - erreur = 13 + error = 1 break -# -# 5. Export MED -# - ficmed = os.path.join(rep_mail,'maill.00.med') - if verbose : - texte = "Ecriture du fichier '%s'" % ficmed - print (texte) - maill_00.ExportMED( ficmed, 0, SMESH.MED_V2_2, 1 ) -# + +# MED exportation + try: + structure_m.ExportMED(mesh_file) + except IOError as eee: + error = 2 + raise Exception('ExportMED() failed. ' + str(eee)) + break -# - return erreur, message, ficmed -# -#========================== Fin de la fonction ================================== -# + + return error, mesh_file +#======================================================================== + #========================= Debut de la fonction ================================== -# -def homard_exec(nom, ficmed, xao_file, verbose=False): - """ -Python script for HOMARD - """ - erreur = 0 - message = "" -# - while not erreur : + +def homard_exec(xao_file, mesh_file): + """Python script for HOMARD""" + error = 0 + + while not error : # - HOMARD.SetCurrentStudy(salome.myStudy) + #HOMARD.UpdateStudy() # # Frontière # ========= - if verbose : + if VERBOSE : print(". Frontière") - cao_name = "CAO_" + nom - la_frontiere = HOMARD.CreateBoundaryCAO(cao_name, xao_file) + cao_name = "CAO_" + TEST_NAME + _ = HOMARD.CreateBoundaryCAO(cao_name, xao_file) # # Hypotheses # ========== - if verbose : + if VERBOSE : print(". Hypothèses") - hyponame = "hypo_" + nom + hyponame = "hypo_" + TEST_NAME l_hypothese = HOMARD.CreateHypothesis(hyponame) l_hypothese.SetUnifRefinUnRef(1) # # Cas # === - if verbose : + if VERBOSE : print(". Cas") - le_cas = HOMARD.CreateCase('case_'+nom, nom, ficmed) + le_cas = HOMARD.CreateCase('case_'+TEST_NAME, TEST_NAME, mesh_file) le_cas.SetDirName(DIRCASE) le_cas.AddBoundary(cao_name) # - # Creation des iterations - # ======================= - if verbose : + # Creation of the iterations + # ========================== + if VERBOSE : option = 2 else : option = 1 # for niter in range(1, N_ITER_TEST_FILE+1): - if verbose : + if VERBOSE : print(". Itération numéro %d" % niter) - iter_name = "I_" + nom + "_%02d" % niter + iter_name = "I_" + TEST_NAME + "_%02d" % niter if ( niter == 1 ) : l_iteration = le_cas.NextIteration(iter_name) else : l_iteration = l_iteration.NextIteration(iter_name) - l_iteration.SetMeshName(nom) + l_iteration.SetMeshName(TEST_NAME) mesh_file = os.path.join(DIRCASE, "maill.%02d.med" % niter) l_iteration.SetMeshFile(mesh_file) l_iteration.AssociateHypo(hyponame) - erreur = l_iteration.Compute(1, option) - if erreur : - erreur = niter + error = l_iteration.Compute(1, option) + if error : + error = niter break # break - # - if erreur : - message += "Erreur au calcul de l'itération %d" % erreur - # - return erreur, message + + return error # #========================== Fin de la fonction ================================== -# -# -ERREUR = 0 -MESSAGE = "" -while not ERREUR : - # - VERBOSE = DEBUG - # - # A. Geometry - # - ERREUR, STRUCTURE_G, L_GROUPES_G = create_geom(TEST_NAME, TAILLE, VERBOSE) - if ERREUR : - MESSAGE = "The construction of the geometry failed." - break - # - # B. Save the geometry - # - XAO_FILE = os.path.join(DIRCASE, TEST_NAME+".xao") - try : - ERREUR = saveGeometry(XAO_FILE, TEST_NAME, "test_salome_"+TEST_NAME) - except IOError as eee: - ERREUR = os.error - MESSAGE = str(eee.message) - # - if ERREUR : - MESSAGE += "Pb in saveGeometry" - break - # - # C. Mesh - # - ERREUR, MESSAGE, FICMED = create_mail(LG_ARETE, STRUCTURE_G, L_GROUPES_G, DIRCASE, VERBOSE) - if ERREUR : - break - # - # D. Exec of HOMARD-SALOME - # - HOMARD = salome.lcc.FindOrLoadComponent('FactoryServer', 'HOMARD') - assert HOMARD is not None, "Impossible to load homard engine" - HOMARD.SetLanguageShort("fr") -# - try: - ERREUR, MESSAGE = homard_exec(TEST_NAME, FICMED, XAO_FILE, VERBOSE) - except RuntimeError as eee: - ERREUR = os.error - MESSAGE = str(eee.message) - # - if ERREUR : - MESSAGE += "Pb in homard_exec" - break - # - # E. Test of the results - # - N_REP_TEST_FILE = N_ITER_TEST_FILE - DESTROY_DIR = not DEBUG - test_results(REP_DATA, TEST_NAME, DIRCASE, N_ITER_TEST_FILE, N_REP_TEST_FILE, DESTROY_DIR) - # - break -# -if ERREUR: - MESSAGE = "\nErreur numéro %d\n" % ERREUR + MESSAGE - raise Exception(MESSAGE) -# -if salome.sg.hasDesktop(): - salome.sg.updateObjBrowser(True) - iparameters.getSession().restoreVisualState(1) +# CAO and Mesh + +try : + ERROR, XAO_FILE, MESH_FILE = create_cao_smesh() + if ERROR : + raise Exception('Pb in create_cao_smesh') +except RuntimeError as eee: + raise Exception('Pb in create_cao_smesh: '+str(eee.message)) + +HOMARD = salome.lcc.FindOrLoadComponent('FactoryServer', 'HOMARD') +assert HOMARD is not None, "Impossible to load homard engine" +HOMARD.SetLanguageShort("fr") + +# Exec of HOMARD-SALOME + +try : + ERROR = homard_exec(XAO_FILE, MESH_FILE) + if ERROR : + raise Exception('Pb in homard_exec at iteration %d' %ERROR ) +except RuntimeError as eee: + raise Exception('Pb in homard_exec: '+str(eee.message)) + +# Test of the results + +N_REP_TEST_FILE = N_ITER_TEST_FILE +DESTROY_DIR = not DEBUG +test_results(REP_DATA, TEST_NAME, DIRCASE, N_ITER_TEST_FILE, N_REP_TEST_FILE, DESTROY_DIR) + +if salome.sg.hasDesktop(): + salome.sg.updateObjBrowser()