1#! /usr/bin/env python 2# -*- coding:utf-8 -*- 3# /* This file is part of MED. 4# * 5# * COPYRIGHT (C) 1999 - 2019 EDF R&D, CEA/DEN 6# * MED is free software: you can redistribute it and/or modify 7# * it under the terms of the GNU Lesser General Public License as published by 8# * the Free Software Foundation, either version 3 of the License, or 9# * (at your option) any later version. 10# * 11# * MED is distributed in the hope that it will be useful, 12# * but WITHOUT ANY WARRANTY; without even the implied warranty of 13# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# * GNU Lesser General Public License for more details. 15# * 16# * You should have received a copy of the GNU Lesser General Public License 17# * along with MED. If not, see <http://www.gnu.org/licenses/>. 18# */ 19 20# /****************************************************************************** 21# * How to create an unstructured mesh 22# * 23# * Use case 9 : a 2D unstructured mesh with moving grid 24# * transformation 25# *****************************************************************************/ 26 27import sys 28 29import med 30 31def doCleanup(fid, status) : 32 try : 33 med.MEDfileClose(fid) 34 except RuntimeError as ex : 35 print("ERROR : close file ...\n%s" % ex) 36 status = -1 37 finally : 38 if status != 0 : 39 sys.exit(status) 40 41# max size of meshname : med.MED_NAME_SIZE+1 42meshname = "2D unstructured mesh" 43spacedim = 2 44meshdim = 2 45# max size of axisname and unitname : 2*med.MED_SNAME_SIZE+1 46# 12345678901234561234567890123456 47axisname = "x y " 48unitname = "cm cm " 49initial_coordinates = med.MEDFLOAT([2.,1., 7.,1., 12.,1., 17.,1., 22.,1., 50 2.,6., 7.,6., 12.,6., 17.,6., 22.,6., 51 2.,11., 7.,11., 12.,11., 17.,11., 22.,11. ]) 52nnodes = 15 53triaconnectivity = med.MEDINT([ 1,7,6, 2,7,1, 3,7,2, 8,7,3, 54 13,7,8, 12,7,13, 11,7,12, 6,7,11 ]) 55ntria3 = 8 56quadconnectivity = med.MEDINT([ 3,4,9,8, 4,5,10,9, 57 15,14,9,10, 13,8,9,14 ]) 58nquad4 = 4 59# matrix transformation (step 1) : rotation about the Y-axis : 45 degrees 60transfMatrix_step1 = med.MEDFLOAT([0.0, 0.0, 0.0, 0.92388, 0.0, 0.38268, 0.0]) 61# matrix transformation (step 2) : rotation about the Y-axis : 90 degrees 62transfMatrix_step2 = med.MEDFLOAT([0.0, 0.0, 0.0, 0.707, 0.0, 0.707, 0.0]) 63 64# MED file creation 65try : 66 fid = med.MEDfileOpen("UsesCase_MEDmesh_9.med", med.MED_ACC_CREAT) 67except RuntimeError as ex : 68 print("ERROR : file creation ...\n%s" % ex) 69 sys.exit(-1) 70 71# write a comment in the file 72try : 73 med.MEDfileCommentWr(fid, "A 2D unstructured mesh : 15 nodes, 12 cells") 74except RuntimeError as ex : 75 print("ERROR : write file description ...\n%s" % ex) 76 doCleanup(fid, -1) 77 78# mesh creation : a 2D unstructured mesh 79try : 80 med.MEDmeshCr(fid, meshname, spacedim, meshdim, med.MED_UNSTRUCTURED_MESH, 81 "A 2D unstructured mesh", "", med.MED_SORT_DTIT, 82 med.MED_CARTESIAN, axisname, unitname) 83except RuntimeError as ex : 84 print("ERROR : mesh creation ...\n%s" % ex) 85 doCleanup(fid, -1) 86 87# nodes coordinates in a cartesian axis in full interlace mode 88# (X1,Y1, X2,Y2, X3,Y3, ...) with no iteration and computation step 89try : 90 med.MEDmeshNodeCoordinateWithProfileWr(fid, meshname, med.MED_NO_DT, 91 med.MED_NO_IT, 0.0, med.MED_COMPACT_STMODE, 92 med.MED_NO_PROFILE, med.MED_FULL_INTERLACE, 93 med.MED_ALL_CONSTITUENT, nnodes, initial_coordinates) 94except RuntimeError as ex : 95 print("ERROR : nodes coordinates ...\n%s" % ex) 96 doCleanup(fid, -1) 97 98# cells connectiviy is defined in nodal mode 99try : 100 med.MEDmeshElementConnectivityWithProfileWr(fid, meshname, med.MED_NO_DT, 101 med.MED_NO_IT, 0.0, med.MED_CELL, med.MED_TRIA3, med.MED_NODAL, 102 med.MED_COMPACT_STMODE, med.MED_NO_PROFILE, med.MED_FULL_INTERLACE, 103 med.MED_ALL_CONSTITUENT, ntria3, triaconnectivity) 104except RuntimeError as ex : 105 print("ERROR : triangular cells connectivity ...\n%s" % ex) 106 doCleanup(fid, -1) 107 108try : 109 med.MEDmeshElementConnectivityWithProfileWr(fid, meshname, med.MED_NO_DT, 110 med.MED_NO_IT, 0.0, med.MED_CELL, med.MED_QUAD4, med.MED_NODAL, 111 med.MED_COMPACT_STMODE, med.MED_NO_PROFILE, med.MED_FULL_INTERLACE, 112 med.MED_ALL_CONSTITUENT, nquad4, quadconnectivity) 113except RuntimeError as ex : 114 print("ERROR : quadrangular cells connectivity ...\n%s" % ex) 115 doCleanup(fid, -1) 116 117# Mesh deformation (nodes coordinates) in 2 steps 118# A rotation by step for each node 119 120# STEP 1 : dt1 = 5.5, it = 1 121try : 122 med.MEDmeshNodeCoordinateTrsfWr(fid, meshname, 1, 1, 5.5,transfMatrix_step1) 123except RuntimeError as ex : 124 print("ERROR : geo transformation 1 ...\n%s" % ex) 125 doCleanup(fid, -1) 126 127# STEP 2 : dt2 = 8.9, it = 1 128try : 129 med.MEDmeshNodeCoordinateTrsfWr(fid, meshname, 2, 2, 8.9,transfMatrix_step2) 130except RuntimeError as ex : 131 print("ERROR : geo transformation 2 ...\n%s" % ex) 132 doCleanup(fid, -1) 133 134# create family 0 : by default, all mesh entities family number is 0 135#TODO : Etudier la pertinence de définir MED_NO_GROUP comme un MEDCHAR('') 136#TODO : A confronter aux types des paramètres axisname, axisunit 137try : 138 med.MEDfamilyCr(fid, meshname, med.MED_NO_NAME, 0, 0, 139 med.MEDCHAR(med.MED_NO_GROUP)) 140except RuntimeError as ex : 141 print("ERROR : family 0 creation ...\n%s" % ex) 142 doCleanup(fid, -1) 143 144# close MED file 145doCleanup(fid, 0)