From 12d79e2f33e6221f25043930a65e8d2efa9f0259 Mon Sep 17 00:00:00 2001 From: ageay Date: Wed, 9 Mar 2011 07:10:21 +0000 Subject: [PATCH] *** empty log message *** --- doc/MEDMEM/FIELDcreate.cxx | 5 +- doc/MEDMEM/FIELDcreate.py | 4 +- doc/MEDMEM/FIELDgeneral.cxx | 6 +- doc/MEDMEM/FIELDgeneral.py | 4 +- doc/MEDMEM/MEDMEM_Content.tex.in | 81 ++-- ...MEM_InvokingDriverAtObjectCreationTime.cxx | 12 +- ...DMEM_InvokingDriverAtObjectCreationTime.py | 8 +- ..._InvokingDriverByAttachingItToAnObject.cxx | 20 +- ...M_InvokingDriverByAttachingItToAnObject.py | 18 +- ...InvokingDriverFromStandardObjectMethod.cxx | 14 +- ..._InvokingDriverFromStandardObjectMethod.py | 8 +- .../MEDMEM_MedAddingAnExistingObject.cxx | 11 +- doc/MEDMEM/MEDMEM_UsersGuide.lyx | 8 +- doc/MEDMEM/MESHINGexample.cxx | 168 ++++---- doc/MEDMEM/MESHINGexample.py | 402 ++++-------------- doc/MEDMEM/MESHconnectivities.cxx | 79 +--- doc/MEDMEM/MESHconnectivities.py | 51 +-- doc/doxygen/figures/UML_light.png | Bin 2803 -> 3990 bytes doc/doxygen/figures/UML_small.png | Bin 25901 -> 27022 bytes 19 files changed, 254 insertions(+), 645 deletions(-) diff --git a/doc/MEDMEM/FIELDcreate.cxx b/doc/MEDMEM/FIELDcreate.cxx index c511feb34..a579b80a7 100644 --- a/doc/MEDMEM/FIELDcreate.cxx +++ b/doc/MEDMEM/FIELDcreate.cxx @@ -34,7 +34,6 @@ int main (int argc, char ** argv) { /* read MESH */ MESH * myMesh = new MESH(MED_DRIVER,MedFile,MeshName) ; - // myMesh->read() ; // we need a support : SUPPORT * mySupport = new SUPPORT(myMesh,"Support on all CELLs",MED_CELL); @@ -75,7 +74,7 @@ int main (int argc, char ** argv) { myField.setTime(Time) ; // Value : - int NumberOfValue = mySupport->getNumberOfElements(MED_ALL_ELEMENTS); + int NumberOfValue = mySupport->getNumberOfElements(MEDMEM_ALL_ELEMENTS); for(int i=1; i<=NumberOfValue; i++) // i^th element for (int j=1; j<=NumberOfCompoennts; j++) { // j^th component double myValue = (i+j) * 0.1 ; @@ -83,7 +82,7 @@ int main (int argc, char ** argv) { } // save this new field - int id = myField.addDriver(MED_DRIVER) ; + myField.write(MED_DRIVER,filename) ; return 0 ; } diff --git a/doc/MEDMEM/FIELDcreate.py b/doc/MEDMEM/FIELDcreate.py index 944843076..c2dc59c37 100644 --- a/doc/MEDMEM/FIELDcreate.py +++ b/doc/MEDMEM/FIELDcreate.py @@ -34,7 +34,7 @@ meshName = "maa1" myMesh = MESH(MED_DRIVER,MedFile,meshName) -mySupport = myMesh.getSupportOnAll(MED_CELL) +mySupport = SUPPORT(myMesh,"Support on all CELLs",MED_CELL) numberOfComponents = 3 myField = FIELDDOUBLE(mySupport,numberOfComponents) @@ -66,7 +66,7 @@ myField.setOrderNumber(orderNumber) time = 3.435678 myField.setTime(time) -numberOfValue = mySupport.getNumberOfElements(MED_ALL_ELEMENTS) +numberOfValue = mySupport.getNumberOfElements(MEDMEM_ALL_ELEMENTS) for i in range(numberOfValue): ip1 = i+1 diff --git a/doc/MEDMEM/FIELDgeneral.cxx b/doc/MEDMEM/FIELDgeneral.cxx index ee63c79f0..0b9178de4 100644 --- a/doc/MEDMEM/FIELDgeneral.cxx +++ b/doc/MEDMEM/FIELDgeneral.cxx @@ -68,7 +68,7 @@ int main (int argc, char ** argv) { " (and order number " << OrderNumber << ")" << endl ; // How many Value : - int NumberOfValue = mySupport->getNumberOfElements(MED_ALL_ELEMENTS); + int NumberOfValue = mySupport->getNumberOfElements(MEDMEM_ALL_ELEMENTS); // Value const double * Value = myField.getValue(); for(int i=0; iremoveReference(); + myMesh->removeReference(); return 0 ; } diff --git a/doc/MEDMEM/FIELDgeneral.py b/doc/MEDMEM/FIELDgeneral.py index bbb9efa34..c2bd995a8 100644 --- a/doc/MEDMEM/FIELDgeneral.py +++ b/doc/MEDMEM/FIELDgeneral.py @@ -35,7 +35,7 @@ fieldName = "fieldcelldoublescalar" myMesh = MESH(MED_DRIVER,MedFile,meshName) -mySupport = myMesh.getSupportOnAll(MED_CELL) +mySupport = SUPPORT(myMesh,"Support on CELLs",MED_CELL) myField = FIELDDOUBLE(mySupport,MED_DRIVER,MedFile,fieldName,-1,-1) @@ -58,7 +58,7 @@ time = myField.getTime() print "Iteration ",iterationNumber," at time ",time,\ " (and order number ",orderNumber,")" -numberOfValue = mySupport.getNumberOfElements(MED_ALL_ELEMENTS) +numberOfValue = mySupport.getNumberOfElements(MEDMEM_ALL_ELEMENTS) value = myField.getValue() for i in range(numberOfValue): diff --git a/doc/MEDMEM/MEDMEM_Content.tex.in b/doc/MEDMEM/MEDMEM_Content.tex.in index 109e8bc66..db50cff9a 100644 --- a/doc/MEDMEM/MEDMEM_Content.tex.in +++ b/doc/MEDMEM/MEDMEM_Content.tex.in @@ -220,25 +220,25 @@ available types are linear and quadratic elements (consult \cite{RefManualMedMemory}). The entries of the enum are quite self-explanatory~: \begin{itemize} -\item \verb+MED_NONE+ -\item \verb+MED_POINT1+ -\item \verb+MED_SEG2+ -\item \verb+MED_SEG3+ -\item \verb+MED_TRIA3+ -\item \verb+MED_QUAD4+ -\item \verb+MED_TRIA6+ -\item \verb+MED_QUAD8+ -\item \verb+MED_TETRA4+ -\item \verb+MED_PYRA5+ -\item \verb+MED_PENTA6+ -\item \verb+MED_HEXA8+ -\item \verb+MED_TETRA10+ -\item \verb+MED_PYRA13+ -\item \verb+MED_PENTA15+ -\item \verb+MED_HEXA20+ -\item \verb+MED_POLYGON+ -\item \verb+MED_POLYHEDRA+ -\item \verb+MED_ALL_ELEMENTS+ +\item \verb+MEDMEM_NONE+ +\item \verb+MEDMEM_POINT1+ +\item \verb+MEDMEM_SEG2+ +\item \verb+MEDMEM_SEG3+ +\item \verb+MEDMEM_TRIA3+ +\item \verb+MEDMEM_QUAD4+ +\item \verb+MEDMEM_TRIA6+ +\item \verb+MEDMEM_QUAD8+ +\item \verb+MEDMEM_TETRA4+ +\item \verb+MEDMEM_PYRA5+ +\item \verb+MEDMEM_PENTA6+ +\item \verb+MEDMEM_HEXA8+ +\item \verb+MEDMEM_TETRA10+ +\item \verb+MEDMEM_PYRA13+ +\item \verb+MEDMEM_PENTA15+ +\item \verb+MEDMEM_HEXA20+ +\item \verb+MEDMEM_POLYGON+ +\item \verb+MEDMEM_POLYHEDRA+ +\item \verb+MEDMEM_ALL_ELEMENTS+ \end{itemize} \item an enum which contains the different mesh entities, \verb+medEntityMesh+, the @@ -385,7 +385,7 @@ type of this entity. \textbf{C++ Example~:} -\verb+int NumberOfTriangle = myMesh.getNumberOfElements(MED_FACE,MED_TRIA3);+ +\verb+int NumberOfTriangle = myMesh.getNumberOfElements(MED_FACE,MEDMEM_TRIA3);+ \verb+int NumberOfFace = myMesh.getNumberOfElements(MED_FACE,MED_ALL_ELEMENT);+ @@ -408,18 +408,18 @@ return an array with connectivity values. \textbf{C++ Example~:} \begin{verbatim} -int NumberOfTetrahedron = myMesh.getNumberOfElements(MED_CELL,MED_TETRA4); +int NumberOfTetrahedron = myMesh.getNumberOfElements(MED_CELL,MEDMEM_TETRA4); const int * TetrahedronConnectivity = myMesh.getConnectivity(MED_FULL_ENTERLACE, MED_NODAL, MED_CELL, - MED_TETRA4); + MEDMEM_TETRA4); \end{verbatim} \verb+TetrahedronConnectivity+ contain nodal connectivity of tetrahedron in mesh. It is arranged in full enterlace mode and its size is \verb+NumberOfTetrahedron x 4+. -If you want to get connectivity of all elements (with \verb+Type=MED_ALL_ELEMENTS+), +If you want to get connectivity of all elements (with \verb+Type=MEDMEM_ALL_ELEMENTS+), you must use the index array (return by \method{getConnectivityIndex}) to get connectivity for each elements (see example \myref{MESHconnectivities.cxx}). @@ -434,30 +434,6 @@ int myNumber = myMesh.getElementNumber(MED_NODAL,MED_CELL, myElementConnectivity); \end{verbatim} -%%%%%%%%%%% WITH POLY METHODS %%%%%%%%%%%% - -\item The listed above methods do not take into account information about - \verb+polygonal+ and \verb+polyhedral+ cells contained in a MESH object. To get - full information about cell types, use the same methods with - \verb+WithPoly+ postfix: -\begin{itemize} -\item use \method{getNumberOfTypesWithPoly} to get the number of - geometric types for a mesh entity; -\item use \method{getTypesWithPoly} to get all geometric types for a mesh entity; -\item use \method{getNumberOfElementsWithPoly} to get the number of cells; -\item use \method{getElementTypeWithPoly} to get the geometric type of - one element. -\end{itemize} -There are separate methods to get number of polygons and polyhedrons: -\method{getNumberOfPolygons} and \method{getNumberOfPolyhedron} - -To get connectivity of polygonal elements, use \method{getPolygonsConnectivity} along with -\method{getPolygonsConnectivityIndex} (see example \myref{MESHconnectivities.cxx}). - -To get nodal connectivity of polyhedral elements, it is necessary use together -3 methods: \method{getPolyhedronConnectivity}, \method{getPolyhedronFacesIndex} -and \method{getPolyhedronIndex} (see example \myref{MESHconnectivities.cxx}). - \end{enumerate} Here is a small C++ example program which the Python version may be found in @@ -700,8 +676,7 @@ in increasing order of number of nodes for this type ; \item \method{setNumberOfElements} to set the number of elements for each geometric type. This method allocates connectivities array ; \item \method{setConnectivity} to set the connectivity in MED\_FULL\_INTERLACE -mode for each geometric type (use \method{setPolygonsConnectivity} and -\method{setPolyhedraConnectivity} for poly elements); +mode for each geometric type; \end{itemize} \textbf{C++ Example~:} @@ -710,10 +685,10 @@ MESHING myMeshing ; myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,System,Mode); myMeshing.setNumberOfTypes(2,MED_CELL); -myMeshing.setTypes({MED_TRIA3,MED_QUAD4},MED_CELL); -myMeshing.setNumberOfElements({3,2},MED_CELL); // 3 MED_TRIA3 and 2 MED_QUAD4 -myMeshing.setConnectivity({1,2,3,6,8,9,4,5,6},MED_CELL,MED_TRIA3); -myMeshing.setConnectivity({1,3,4,5,4,5,7,8},MED_CELL,MED_QUAD4); +myMeshing.setTypes({MEDMEM_TRIA3,MEDMEM_QUAD4},MED_CELL); +myMeshing.setNumberOfElements({3,2},MED_CELL); // 3 MEDMEM_TRIA3 and 2 MEDMEM_QUAD4 +myMeshing.setConnectivity({1,2,3,6,8,9,4,5,6},MED_CELL,MEDMEM_TRIA3); +myMeshing.setConnectivity({1,3,4,5,4,5,7,8},MED_CELL,MEDMEM_QUAD4); \end{verbatim} diff --git a/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.cxx b/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.cxx index 3ae53a608..8fe5c483e 100644 --- a/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.cxx +++ b/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.cxx @@ -25,7 +25,6 @@ #include "MEDMEM_Field.hxx" #include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Med.hxx" using namespace MEDMEM ; using namespace MED_EN ; @@ -33,24 +32,21 @@ using namespace MED_EN ; main () { const char * fileName = "pointe.med"; - const char * fieldName = "fieldcelldouble"; + const char * fieldName = "fieldcelldoublescalar"; const char * meshName = "maa1"; try { // Test creation of drivers at object Creation time - //This test failed due to inadequate Support implementation - // FIELD myField (MED_DRIVER,fileName,fieldName); + FIELD myField (MED_DRIVER,fileName,fieldName); MESH myMesh (MED_DRIVER,fileName,meshName); - MED myMed (MED_DRIVER,fileName); // Test removal of drivers - //myField.rmDriver(); + myField.rmDriver(); myMesh.rmDriver (); - myMed.rmDriver (); } catch (MEDEXCEPTION& ex){ - MESSAGE(ex.what()) ; + MESSAGE_MED(ex.what()) ; } } diff --git a/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.py b/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.py index d6c56cb89..939395bc1 100644 --- a/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.py +++ b/doc/MEDMEM/MEDMEM_InvokingDriverAtObjectCreationTime.py @@ -37,15 +37,9 @@ try: print "Creation of MESH object" myMesh = MESH(MED_DRIVER,medFile,meshName) - print "Creation of MED object" - myMed = MED(MED_DRIVER,medFile) - - print "Test the driver removal dor MESH" + print "Test the driver removal for MESH" myMesh.rmDriver() - print "Test the driver removal dor MED" - myMed.rmDriver() - print "End of Python script" except: diff --git a/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.cxx b/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.cxx index 2c3240a13..2ec038ab6 100644 --- a/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.cxx +++ b/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.cxx @@ -25,8 +25,6 @@ #include "MEDMEM_Field.hxx" #include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Med.hxx" -#include "MEDMEM_MedMedDriver.hxx" #include "MEDMEM_MedMeshDriver.hxx" using namespace MEDMEM ; @@ -84,25 +82,9 @@ main () { delete myMesh; } - { - MED * myMed = new MED(); - MED_MED_RDONLY_DRIVER myRdOnlyDriver(fileName,myMed); - myRdOnlyDriver.open(); - myRdOnlyDriver.readFileStruct(); - myRdOnlyDriver.close(); - myMed->updateSupport(); // DOIT ETRE SUPPRIMEE - // myRdOnlyDriver.read(); - // try { myRdOnlyDriver.write(); } catch (MEDEXCEPTION& ex) - // { MESSAGE(ex.what()); } - //MED_MED_WRONLY_DRIVER myWrOnlyDriver(fileName3,myMed); - //myWrOnlyDriver.open(); - //myWrOnlyDriver.write(); // Not implemented yet. - //myWrOnlyDriver.close(); - delete myMed; - } } catch (MEDEXCEPTION& ex){ cout << "MAIN BLOCK EXCEPTION" << endl; - MESSAGE(ex.what()) ; + MESSAGE_MED(ex.what()) ; } } diff --git a/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.py b/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.py index ea1316c7b..714c93803 100644 --- a/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.py +++ b/doc/MEDMEM/MEDMEM_InvokingDriverByAttachingItToAnObject.py @@ -31,7 +31,7 @@ from libMEDMEM_Swig import * medFile = "pointe.med" medFile2 = "Field&MeshGeneratedPointe.med" -fieldName = "fieldcelldouble" +fieldName = "fieldcelldoublescalar" meshName = "maa1" try: @@ -53,17 +53,17 @@ except : try: myMesh = MESH() - myRdOnlyDriver = MED_MESH_RDONLY_DRIVER(medFile,myMesh) myRdOnlyDriver.setMeshName(meshName) myRdOnlyDriver.open() myRdOnlyDriver.read() myRdOnlyDriver.close() - myWrOnlyDriver = MED_MESH_WRONLY_DRIVER(medFile2,myMesh) + myWrOnlyDriver = MED_MESH_WRONLY_DRIVER(medFile,myMesh) myWrOnlyDriver.setMeshName(meshName) myWrOnlyDriver.open() myWrOnlyDriver.write() + myWrOnlyDriver.close() print "Invoking mesh drivers OK" @@ -71,15 +71,3 @@ except : print "there is a problem in invoking mesh drivers !!" print "Please consult the error standart output of the python execution !!" -try: - myMed = MED() - myRdOnlyDriver = MED_MED_RDONLY_DRIVER(medFile,myMed) - myRdOnlyDriver.open() - myRdOnlyDriver.readFileStruct() - myRdOnlyDriver.close() - myMed.updateSupport() - - print "Invoking Med drivers OK" -except : - print "There is a problem in invoking MED drivers !!" - print "Please consult the error standart output of the python execution !!" diff --git a/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.cxx b/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.cxx index 01ea3d2ce..8fb7cf3dc 100644 --- a/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.cxx +++ b/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.cxx @@ -25,7 +25,6 @@ #include "MEDMEM_Field.hxx" #include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Med.hxx" using namespace MEDMEM ; using namespace MED_EN ; @@ -34,7 +33,7 @@ main () { const char * fileName = "pointe.med"; const char * fileName2 = "fieldCellDoubleOfpointe.med"; - const char * fieldName = "fieldcelldouble"; + const char * fieldName = "fieldcelldoublescalar"; const char * meshName = "maa1"; try { @@ -55,16 +54,11 @@ main () { myMesh->read(); myMesh->rmDriver(); - MED * myMed = new MED(); - int myDriver4 = myMed->addDriver(MED_DRIVER, fileName); - myMed->readFileStruct(); - myMed->rmDriver(); - delete myField; - delete myMesh; - delete myMed; + myMesh->removeReference(); + myField->removeReference(); } catch (MEDEXCEPTION& ex){ - MESSAGE(ex.what()) ; + MESSAGE_MED(ex.what()) ; } } diff --git a/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.py b/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.py index c1d870b51..aafefdeee 100644 --- a/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.py +++ b/doc/MEDMEM/MEDMEM_InvokingDriverFromStandardObjectMethod.py @@ -30,8 +30,8 @@ from libMEDMEM_Swig import * medFile = "pointe.med" -medFile2 = "fieldCellDoubleOfpointe.med" -fieldName = "fieldcelldouble" +medFile2 = "fieldCellDoubleOfpointe.me" +fieldName = "fieldcelldoublescalar" meshName = "maa1" try: @@ -48,10 +48,6 @@ try: myMesh.read() myMesh.rmDriver() - myMed = MED(MED_DRIVER,medFile) - myMed.readFileStruct() - myMed.rmDriver() - except: print "There is a problem somewhere !!" print "Please consult the error standart output of the python execution !!" diff --git a/doc/MEDMEM/MEDMEM_MedAddingAnExistingObject.cxx b/doc/MEDMEM/MEDMEM_MedAddingAnExistingObject.cxx index f3794fbe1..e5558d0bc 100644 --- a/doc/MEDMEM/MEDMEM_MedAddingAnExistingObject.cxx +++ b/doc/MEDMEM/MEDMEM_MedAddingAnExistingObject.cxx @@ -25,14 +25,13 @@ #include "MEDMEM_Field.hxx" #include "MEDMEM_Mesh.hxx" -#include "MEDMEM_Med.hxx" main () { const char * fileName = "pointe.med"; const char * fileName2 = "Field&MeshGeneratedPointe.med"; const char * fileName3 = "MedGeneratedPointe.med"; - const char * fieldName1 = "fieldcelldouble"; + const char * fieldName1 = "fieldcelldoublescalar"; const char * fieldName2 = "fieldcelldoublebis"; const char * meshName1 = "maa1"; const char * meshName2 = "maa1bis"; @@ -45,15 +44,9 @@ main () { myMesh.setName(meshName2); myMesh.rmDriver(); - MED myMed(MED_DRIVER,fileName); - myMed.read(); - myMed.addMesh(&myMesh); - int myMedDriver = myMed.addDriver(MED_DRIVER,fileName3); - myMed.write(myMedDriver); - // FAIRE LE TEST AVEC LES CHAMPS AUSSI !. } catch (MEDEXCEPTION& ex){ - MESSAGE(ex.what()) ; + MESSAGE_MED(ex.what()) ; } } diff --git a/doc/MEDMEM/MEDMEM_UsersGuide.lyx b/doc/MEDMEM/MEDMEM_UsersGuide.lyx index e0008ba8c..77a677e17 100644 --- a/doc/MEDMEM/MEDMEM_UsersGuide.lyx +++ b/doc/MEDMEM/MEDMEM_UsersGuide.lyx @@ -488,7 +488,7 @@ C++ Example\SpecialChar ~ \latex latex \backslash -verb+int NumberOfTriangle = myMesh.getNumberOfElements(MED_FACE,MED_TRIA3);+ +verb+int NumberOfTriangle = myMesh.getNumberOfElements(MED_FACE,MEDMEM_TRIA3);+ \layout Standard @@ -574,7 +574,7 @@ C++ Example\SpecialChar ~ \backslash begin{verbatim} \newline -int NumberOfTetrahedron = myMesh.getNumberOfElements(MED_CELL,MED_TETRA4); +int NumberOfTetrahedron = myMesh.getNumberOfElements(MED_CELL,MEDMEM_TETRA4); \newline int * TetrahedronConnectivity = \newline @@ -584,7 +584,7 @@ int * TetrahedronConnectivity = \newline MED_CELL, \newline - MED_TETRA4); + MEDMEM_TETRA4); \newline \backslash @@ -606,7 +606,7 @@ If you want to get connectivity of all elements (with \latex latex \backslash -verb+Type=MED_ALL_ELEMENTS+ +verb+Type=MEDMEM_ALL_ELEMENTS+ \latex default ), you must use the index array (return by \latex latex diff --git a/doc/MEDMEM/MESHINGexample.cxx b/doc/MEDMEM/MESHINGexample.cxx index 4a4fdc7d0..3c85ce73e 100644 --- a/doc/MEDMEM/MESHINGexample.cxx +++ b/doc/MEDMEM/MESHINGexample.cxx @@ -33,8 +33,8 @@ int main (int argc, char ** argv) { // filename to save the generated MESH string filename = "meshing.med" ; - MESHING myMeshing ; - myMeshing.setName("meshing") ; + MESHING* myMeshing = new MESHING; + myMeshing->setName("meshing") ; // define coordinates @@ -62,25 +62,25 @@ int main (int argc, char ** argv) { 0.0, 0.0, 5.0 }; - myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,"CARTESIAN",MED_FULL_INTERLACE); + myMeshing->setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,"CARTESIAN",MED_FULL_INTERLACE); string Names[3] = { "X","Y","Z" } ; - myMeshing.setCoordinatesNames(Names); + myMeshing->setCoordinatesNames(Names); string Units[3] = { "cm","cm","cm" } ; - myMeshing.setCoordinatesUnits(Units) ; + myMeshing->setCoordinatesUnits(Units) ; // define conectivities // cell part const int NumberOfTypes = 3 ; - medGeometryElement Types[NumberOfTypes] = {MED_TETRA4,MED_PYRA5,MED_HEXA8} ; + medGeometryElement Types[NumberOfTypes] = {MEDMEM_TETRA4,MEDMEM_PYRA5,MEDMEM_HEXA8} ; const int NumberOfElements[NumberOfTypes] = {12,2,2} ; - myMeshing.setNumberOfTypes(NumberOfTypes,MED_CELL); - myMeshing.setTypes(Types,MED_CELL); - myMeshing.setNumberOfElements(NumberOfElements,MED_CELL); + myMeshing->setNumberOfTypes(NumberOfTypes,MED_CELL); + myMeshing->setTypes(Types,MED_CELL); + myMeshing->setNumberOfElements(NumberOfElements,MED_CELL); const int sizeTetra = 12*4 ; int ConnectivityTetra[sizeTetra]= @@ -99,7 +99,7 @@ int main (int argc, char ** argv) { 2,10,6,9 }; - myMeshing.setConnectivity(ConnectivityTetra,MED_CELL,MED_TETRA4); + myMeshing->setConnectivity(MED_CELL,MEDMEM_TETRA4,ConnectivityTetra); int ConnectivityPyra[2*5]= { @@ -107,7 +107,7 @@ int main (int argc, char ** argv) { 15,18,17,16,19 }; - myMeshing.setConnectivity(ConnectivityPyra,MED_CELL,MED_PYRA5); + myMeshing->setConnectivity(MED_CELL,MEDMEM_PYRA5,ConnectivityPyra); int ConnectivityHexa[2*8]= { @@ -115,17 +115,17 @@ int main (int argc, char ** argv) { 15,16,17,18,11,12,13,14 }; - myMeshing.setConnectivity(ConnectivityHexa,MED_CELL,MED_HEXA8); + myMeshing->setConnectivity(MED_CELL,MEDMEM_HEXA8,ConnectivityHexa); // face part const int NumberOfFacesTypes = 2 ; - medGeometryElement FacesTypes[NumberOfFacesTypes] = {MED_TRIA3,MED_QUAD4} ; + medGeometryElement FacesTypes[NumberOfFacesTypes] = {MEDMEM_TRIA3,MEDMEM_QUAD4} ; const int NumberOfFacesElements[NumberOfFacesTypes] = {4,4} ; - myMeshing.setNumberOfTypes(NumberOfFacesTypes,MED_FACE); - myMeshing.setTypes(FacesTypes,MED_FACE); - myMeshing.setNumberOfElements(NumberOfFacesElements,MED_FACE); + myMeshing->setNumberOfTypes(NumberOfFacesTypes,MED_FACE); + myMeshing->setTypes(FacesTypes,MED_FACE); + myMeshing->setNumberOfElements(NumberOfFacesElements,MED_FACE); const int sizeTria = 3*4 ; int ConnectivityTria[sizeTria]= @@ -136,7 +136,7 @@ int main (int argc, char ** argv) { 1,3,6 }; - myMeshing.setConnectivity(ConnectivityTria,MED_FACE,MED_TRIA3); + myMeshing->setConnectivity(MED_FACE,MEDMEM_TRIA3,ConnectivityTria); int ConnectivityQua[4*4]= { @@ -146,7 +146,7 @@ int main (int argc, char ** argv) { 12,8,9,13 }; - myMeshing.setConnectivity(ConnectivityQua,MED_FACE,MED_QUAD4); + myMeshing->setConnectivity(MED_FACE,MEDMEM_QUAD4,ConnectivityQua); // edge part @@ -156,49 +156,51 @@ int main (int argc, char ** argv) { // Node : { - GROUP myGroup ; - myGroup.setName("SomeNodes"); - myGroup.setMesh(&myMeshing); - myGroup.setEntity(MED_NODE); - myGroup.setNumberOfGeometricType(1); - medGeometryElement myTypes[1] = {MED_NONE}; - myGroup.setGeometricType(myTypes); + GROUP* myGroup = new GROUP; + myGroup->setName("SomeNodes"); + myGroup->setMesh(myMeshing); + myGroup->setEntity(MED_NODE); + myGroup->setNumberOfGeometricType(1); + medGeometryElement myTypes[1] = {MEDMEM_NONE}; + myGroup->setGeometricType(myTypes); const int myNumberOfElements[1] = {4} ; - myGroup.setNumberOfElements(myNumberOfElements); + myGroup->setNumberOfElements(myNumberOfElements); const int index[1+1] = {1,5} ; const int value[4]= { 1,4,5,7} ; - myGroup.setNumber(index,value); + myGroup->setNumber(index,value); - myMeshing.addGroup(myGroup); + myMeshing->addGroup(*myGroup); + myGroup->removeReference(); } { - GROUP myGroup ; - myGroup.setName("OtherNodes"); - myGroup.setMesh(&myMeshing); - myGroup.setEntity(MED_NODE); - myGroup.setNumberOfGeometricType(1); - medGeometryElement myTypes[1] = {MED_NONE}; - myGroup.setGeometricType(myTypes); + GROUP* myGroup = new GROUP; + myGroup->setName("OtherNodes"); + myGroup->setMesh(myMeshing); + myGroup->setEntity(MED_NODE); + myGroup->setNumberOfGeometricType(1); + medGeometryElement myTypes[1] = {MEDMEM_NONE}; + myGroup->setGeometricType(myTypes); const int myNumberOfElements[1] = {3} ; - myGroup.setNumberOfElements(myNumberOfElements); + myGroup->setNumberOfElements(myNumberOfElements); const int index[1+1] = {1,4} ; const int value[3]= { 2,3,6} ; - myGroup.setNumber(index,value); + myGroup->setNumber(index,value); - myMeshing.addGroup(myGroup); + myMeshing->addGroup(*myGroup); + myGroup->removeReference(); } // Cell : { - GROUP myGroup ; - myGroup.setName("SomeCells"); - myGroup.setMesh(&myMeshing); - myGroup.setEntity(MED_CELL); - myGroup.setNumberOfGeometricType(3); - medGeometryElement myTypes[3] = {MED_TETRA4,MED_PYRA5,MED_HEXA8}; - myGroup.setGeometricType(myTypes); + GROUP* myGroup = new GROUP; + myGroup->setName("SomeCells"); + myGroup->setMesh(myMeshing); + myGroup->setEntity(MED_CELL); + myGroup->setNumberOfGeometricType(3); + medGeometryElement myTypes[3] = {MEDMEM_TETRA4,MEDMEM_PYRA5,MEDMEM_HEXA8}; + myGroup->setGeometricType(myTypes); const int myNumberOfElements[3] = {4,1,2} ; - myGroup.setNumberOfElements(myNumberOfElements); + myGroup->setNumberOfElements(myNumberOfElements); const int index[3+1] = {1,5,6,8} ; const int value[4+1+2]= { @@ -206,75 +208,79 @@ int main (int argc, char ** argv) { 13, 15,16 }; - myGroup.setNumber(index,value); + myGroup->setNumber(index,value); - myMeshing.addGroup(myGroup); + myMeshing->addGroup(*myGroup); + myGroup->removeReference(); } { - GROUP myGroup ; - myGroup.setName("OtherCells"); - myGroup.setMesh(&myMeshing); - myGroup.setEntity(MED_CELL); - myGroup.setNumberOfGeometricType(2); - medGeometryElement myTypes[] = {MED_TETRA4,MED_PYRA5}; - myGroup.setGeometricType(myTypes); + GROUP* myGroup = new GROUP; + myGroup->setName("OtherCells"); + myGroup->setMesh(myMeshing); + myGroup->setEntity(MED_CELL); + myGroup->setNumberOfGeometricType(2); + medGeometryElement myTypes[] = {MEDMEM_TETRA4,MEDMEM_PYRA5}; + myGroup->setGeometricType(myTypes); const int myNumberOfElements[] = {4,1} ; - myGroup.setNumberOfElements(myNumberOfElements); + myGroup->setNumberOfElements(myNumberOfElements); const int index[3+1] = {1,5,6} ; const int value[4+1]= { 3,4,5,9, 14 }; - myGroup.setNumber(index,value); + myGroup->setNumber(index,value); - myMeshing.addGroup(myGroup); + myMeshing->addGroup(*myGroup); + myGroup->removeReference(); } // Face : { - GROUP myGroup ; - myGroup.setName("SomeFaces"); - myGroup.setMesh(&myMeshing); - myGroup.setEntity(MED_FACE); - myGroup.setNumberOfGeometricType(2); - medGeometryElement myTypes[2] = {MED_TRIA3,MED_QUAD4}; - myGroup.setGeometricType(myTypes); + GROUP* myGroup = new GROUP; + myGroup->setName("SomeFaces"); + myGroup->setMesh(myMeshing); + myGroup->setEntity(MED_FACE); + myGroup->setNumberOfGeometricType(2); + medGeometryElement myTypes[2] = {MEDMEM_TRIA3,MEDMEM_QUAD4}; + myGroup->setGeometricType(myTypes); const int myNumberOfElements[2] = {2,3} ; - myGroup.setNumberOfElements(myNumberOfElements); + myGroup->setNumberOfElements(myNumberOfElements); const int index[2+1] = {1,3,6} ; const int value[2+3]= { 2,4, 5,6,8 } ; - myGroup.setNumber(index,value); + myGroup->setNumber(index,value); - myMeshing.addGroup(myGroup); + myMeshing->addGroup(*myGroup); + myGroup->removeReference(); } { - GROUP myGroup ; - myGroup.setName("OtherFaces"); - myGroup.setMesh(&myMeshing); - myGroup.setEntity(MED_FACE); - myGroup.setNumberOfGeometricType(1); - medGeometryElement myTypes[1] = {MED_TRIA3}; - myGroup.setGeometricType(myTypes); + GROUP* myGroup = new GROUP; + myGroup->setName("OtherFaces"); + myGroup->setMesh(myMeshing); + myGroup->setEntity(MED_FACE); + myGroup->setNumberOfGeometricType(1); + medGeometryElement myTypes[1] = {MEDMEM_TRIA3}; + myGroup->setGeometricType(myTypes); const int myNumberOfElements[1] = {2} ; - myGroup.setNumberOfElements(myNumberOfElements); + myGroup->setNumberOfElements(myNumberOfElements); const int index[1+1] = {1,3} ; const int value[2]= { 1,3 } ; - myGroup.setNumber(index,value); + myGroup->setNumber(index,value); - myMeshing.addGroup(myGroup); + myMeshing->addGroup(*myGroup); + myGroup->removeReference(); } // all rigtht, we save it ! - int id = myMeshing.addDriver(MED_DRIVER,filename,myMeshing.getName()); - myMeshing.write(id) ; - + int id = myMeshing->addDriver(MED_DRIVER,filename,myMeshing->getName()); + myMeshing->write(id) ; + myMeshing->removeReference(); } diff --git a/doc/MEDMEM/MESHINGexample.py b/doc/MEDMEM/MESHINGexample.py index 77694b2fc..a05a00319 100644 --- a/doc/MEDMEM/MESHINGexample.py +++ b/doc/MEDMEM/MESHINGexample.py @@ -49,84 +49,26 @@ spaceDimension = 3 numberOfNodes = 19 -coordinates = [] - -coordinate = [0.0, 0.0, 0.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [0.0, 0.0, 1.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [2.0, 0.0, 1.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [0.0, 2.0, 1.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [-2.0, 0.0, 1.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [0.0, -2.0, 1.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [1.0, 1.0, 2.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [-1.0, 1.0, 2.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [-1.0, -1.0, 2.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [1.0, -1.0, 2.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [1.0, 1.0, 3.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [-1.0, 1.0, 3.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [-1.0, -1.0, 3.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [1.0, -1.0, 3.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [1.0, 1.0, 4.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [-1.0, 1.0, 4.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [-1.0, -1.0, 4.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [1.0, -1.0, 4.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) -coordinate = [0.0, 0.0, 5.0] -coordinates.append(coordinate[0]) -coordinates.append(coordinate[1]) -coordinates.append(coordinate[2]) +coordinates = [ + 0.0, 0.0, 0.0 , + 0.0, 0.0, 1.0 , + 2.0, 0.0, 1.0 , + 0.0, 2.0, 1.0 , + -2.0, 0.0, 1.0 , + 0.0, -2.0, 1.0 , + 1.0, 1.0, 2.0 , + -1.0, 1.0, 2.0 , + -1.0, -1.0, 2.0, + 1.0, -1.0, 2.0 , + 1.0, 1.0, 3.0 , + -1.0, 1.0, 3.0 , + -1.0, -1.0, 3.0, + 1.0, -1.0, 3.0 , + 1.0, 1.0, 4.0 , + -1.0, 1.0, 4.0 , + -1.0, -1.0, 4.0, + 1.0, -1.0, 4.0 , + 0.0, 0.0, 5.0] myMeshing.setCoordinates(spaceDimension,numberOfNodes,coordinates,"CARTESIAN",MED_FULL_INTERLACE) @@ -151,121 +93,46 @@ entity = MED_CELL types = [] numberOfElements = [] -types.append(MED_TETRA4) +types.append(MEDMEM_TETRA4) numberOfElements.append(12) -types.append(MED_PYRA5) +types.append(MEDMEM_PYRA5) numberOfElements.append(2) -types.append(MED_HEXA8) +types.append(MEDMEM_HEXA8) numberOfElements.append(2) myMeshing.setNumberOfTypes(numberOfTypes,entity) myMeshing.setTypes(types,entity) myMeshing.setNumberOfElements(numberOfElements,entity) -connectivityTetra = [] - -connectivity = [1,2,3,6] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [1,2,4,3] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [1,2,5,4] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [1,2,6,5] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,7,4,3] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,8,5,4] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,9,6,5] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,10,3,6] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,7,3,10] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,8,4,7] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,9,5,8] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) -connectivity = [2,10,6,9] -connectivityTetra.append(connectivity[0]) -connectivityTetra.append(connectivity[1]) -connectivityTetra.append(connectivity[2]) -connectivityTetra.append(connectivity[3]) - -myMeshing.setConnectivity(connectivityTetra,entity,types[0]) - -connectivityPyra = [] -connectivity = [7,8,9,10,2] -connectivityPyra.append(connectivity[0]) -connectivityPyra.append(connectivity[1]) -connectivityPyra.append(connectivity[2]) -connectivityPyra.append(connectivity[3]) -connectivityPyra.append(connectivity[4]) -connectivity = [15,18,17,16,19] -connectivityPyra.append(connectivity[0]) -connectivityPyra.append(connectivity[1]) -connectivityPyra.append(connectivity[2]) -connectivityPyra.append(connectivity[3]) -connectivityPyra.append(connectivity[4]) - -myMeshing.setConnectivity(connectivityPyra,entity,types[1]) - -connectivityHexa = [] -connectivity = [11,12,13,14,7,8,9,10] -connectivityHexa.append(connectivity[0]) -connectivityHexa.append(connectivity[1]) -connectivityHexa.append(connectivity[2]) -connectivityHexa.append(connectivity[3]) -connectivityHexa.append(connectivity[4]) -connectivityHexa.append(connectivity[5]) -connectivityHexa.append(connectivity[6]) -connectivityHexa.append(connectivity[7]) -connectivity = [15,16,17,18,11,12,13,14] -connectivityHexa.append(connectivity[0]) -connectivityHexa.append(connectivity[1]) -connectivityHexa.append(connectivity[2]) -connectivityHexa.append(connectivity[3]) -connectivityHexa.append(connectivity[4]) -connectivityHexa.append(connectivity[5]) -connectivityHexa.append(connectivity[6]) -connectivityHexa.append(connectivity[7]) - -myMeshing.setConnectivity(connectivityHexa,entity,types[2]) +connectivityTetra = [ + 1,2,3,6 , + 1,2,4,3 , + 1,2,5,4 , + 1,2,6,5 , + 2,7,4,3 , + 2,8,5,4 , + 2,9,6,5 , + 2,10,3,6, + 2,7,3,10, + 2,8,4,7 , + 2,9,5,8 , + 2,10,6,9] + +myMeshing.setConnectivity(entity,types[0],connectivityTetra) + +connectivityPyra = [ + 7,8,9,10,2, + 15,18,17,16,19] + +myMeshing.setConnectivity(entity,types[1],connectivityPyra) + +connectivityHexa = [ + 11,12,13,14,7,8,9,10, + 15,16,17,18,11,12,13,14] + +myMeshing.setConnectivity(entity,types[2],connectivityPyra) # face part @@ -275,62 +142,31 @@ entity = MED_FACE types = [] numberOfElements = [] -types.append(MED_TRIA3) +types.append(MEDMEM_TRIA3) numberOfElements.append(4) -types.append(MED_QUAD4) +types.append(MEDMEM_QUAD4) numberOfElements.append(4) myMeshing.setNumberOfTypes(numberOfTypes,entity) myMeshing.setTypes(types,entity) myMeshing.setNumberOfElements(numberOfElements,entity) -connectivityTria = [] -connectivity = [1,4,3] -connectivityTria.append(connectivity[0]) -connectivityTria.append(connectivity[1]) -connectivityTria.append(connectivity[2]) -connectivity = [1,5,4] -connectivityTria.append(connectivity[0]) -connectivityTria.append(connectivity[1]) -connectivityTria.append(connectivity[2]) -connectivity = [1,6,5] -connectivityTria.append(connectivity[0]) -connectivityTria.append(connectivity[1]) -connectivityTria.append(connectivity[2]) -connectivity = [1,3,6] -connectivityTria.append(connectivity[0]) -connectivityTria.append(connectivity[1]) -connectivityTria.append(connectivity[2]) - -myMeshing.setConnectivity(connectivityTria,entity,types[0]) - -connectivityQuad = [] -connectivity = [7,8,9,10] -connectivityQuad.append(connectivity[0]) -connectivityQuad.append(connectivity[1]) -connectivityQuad.append(connectivity[2]) -connectivityQuad.append(connectivity[3]) -connectivity = [11,12,13,14] -connectivityQuad.append(connectivity[0]) -connectivityQuad.append(connectivity[1]) -connectivityQuad.append(connectivity[2]) -connectivityQuad.append(connectivity[3]) -connectivity = [11,7,8,12] -connectivityQuad.append(connectivity[0]) -connectivityQuad.append(connectivity[1]) -connectivityQuad.append(connectivity[2]) -connectivityQuad.append(connectivity[3]) -connectivity = [12,8,9,13] -connectivityQuad.append(connectivity[0]) -connectivityQuad.append(connectivity[1]) -connectivityQuad.append(connectivity[2]) -connectivityQuad.append(connectivity[3]) - -myMeshing.setConnectivity(connectivityQuad,entity,types[1]) - -meshDimension = spaceDimension # because there 3D cells in the mesh -myMeshing.setMeshDimension(meshDimension) +connectivityTria = [ + 1,4,3, + 1,5,4, + 1,6,5, + 1,3,6] + +myMeshing.setConnectivity(entity,types[0],connectivityPyra) + +connectivityQuad = [ + 7,8,9,10 , + 11,12,13,14, + 11,7,8,12 , + 12,8,9,13] + +myMeshing.setConnectivity(entity,types[1],connectivityQuad) # edge part @@ -343,7 +179,7 @@ myGroup.setMesh(myMeshing) myGroup.setEntity(MED_NODE) myGroup.setNumberOfGeometricType(1) -myTypes = [MED_NONE] +myTypes = [MEDMEM_NONE] myGroup.setGeometricType(myTypes) myNumberOfElements = [4] @@ -361,7 +197,7 @@ myGroup.setMesh(myMeshing) myGroup.setEntity(MED_NODE) myGroup.setNumberOfGeometricType(1) -myTypes = [MED_NONE] +myTypes = [MEDMEM_NONE] myGroup.setGeometricType(myTypes) myNumberOfElements = [3] @@ -381,7 +217,7 @@ myGroup.setMesh(myMeshing) myGroup.setEntity(MED_CELL) myGroup.setNumberOfGeometricType(3) -myTypes = [MED_TETRA4,MED_PYRA5,MED_HEXA8] +myTypes = [MEDMEM_TETRA4,MEDMEM_PYRA5,MEDMEM_HEXA8] myGroup.setGeometricType(myTypes) myNumberOfElements = [4,1,2] @@ -403,7 +239,7 @@ myGroup.setMesh(myMeshing) myGroup.setEntity(MED_CELL) myGroup.setNumberOfGeometricType(2) -myTypes = [MED_TETRA4,MED_PYRA5] +myTypes = [MEDMEM_TETRA4,MEDMEM_PYRA5] myGroup.setGeometricType(myTypes) myNumberOfElements = [4,1] @@ -426,7 +262,7 @@ myGroup.setMesh(myMeshing) myGroup.setEntity(MED_FACE) myGroup.setNumberOfGeometricType(2) -myTypes = [MED_TRIA3,MED_QUAD4] +myTypes = [MEDMEM_TRIA3,MEDMEM_QUAD4] myGroup.setGeometricType(myTypes) myNumberOfElements = [2,3] @@ -447,7 +283,7 @@ myGroup.setMesh(myMeshing) myGroup.setEntity(MED_FACE) myGroup.setNumberOfGeometricType(1) -myTypes = [MED_TRIA3] +myTypes = [MEDMEM_TRIA3] myGroup.setGeometricType(myTypes) myNumberOfElements = [2] @@ -461,36 +297,21 @@ myGroup.setNumber(index,values) myMeshing.addGroup(myGroup) -# saving of the generated mesh in MED 2.1, 2.2 and VTK format +# saving of the generated mesh in MED and VTK format -medFileVersion = getMedFileVersionForWriting() -print "Med File Version For Writing ",medFileVersion +myMeshing.write(MED_DRIVER,med22FileName) -if (medFileVersion == V22): - setMedFileVersionForWriting(V21) - -idMedV21 = myMeshing.addDriver(MED_DRIVER,med21FileName,myMeshing.getName()) -myMeshing.write(idMedV21) - -medFileVersion = getMedFileVersionForWriting() -if (medFileVersion == V21): - setMedFileVersionForWriting(V22) - -idMedV22 = myMeshing.addDriver(MED_DRIVER,med22FileName,myMeshing.getName()) -myMeshing.write(idMedV22) - -idVtk = myMeshing.addDriver(VTK_DRIVER,vtkFileName,myMeshing.getName()) -myMeshing.write(idVtk) +myMeshing.write(VTK_DRIVER,vtkFileName) # we build now 8 fields : 4 fields double (integer) : # 2 fields on nodes (cells) : # 1 scalar (vector) -supportOnNodes = myMeshing.getSupportOnAll(MED_NODE) -numberOfNodes = supportOnNodes.getNumberOfElements(MED_ALL_ELEMENTS) +supportOnNodes = SUPPORT(myMeshing,"On_All_Nodes",MED_NODE) +numberOfNodes = supportOnNodes.getNumberOfElements(MEDMEM_ALL_ELEMENTS) -supportOnCells = myMeshing.getSupportOnAll(MED_CELL) -numberOfCells = supportOnCells.getNumberOfElements(MED_ALL_ELEMENTS) +supportOnCells = SUPPORT(myMeshing,"On_All_Cells",MED_CELL) +numberOfCells = supportOnCells.getNumberOfElements(MEDMEM_ALL_ELEMENTS) fieldDoubleScalarOnNodes = FIELDDOUBLE(supportOnNodes,1) fieldDoubleScalarOnNodes.setName("fieldScalarDoubleNode") @@ -634,63 +455,14 @@ for i in range(numberOfCells): fieldIntVectorOnCells.setValueIJ(i+1,2,valueInt2) fieldIntVectorOnCells.setValueIJ(i+1,3,valueInt3) -medFileVersion = getMedFileVersionForWriting() -print "Med File Version For Writing ",medFileVersion - -if (medFileVersion == V22): - setMedFileVersionForWriting(V21) - -idMedV21 = fieldDoubleScalarOnNodes.addDriver(MED_DRIVER,med21FileName,fieldDoubleScalarOnNodes.getName()) -fieldDoubleScalarOnNodes.write(idMedV21) - -idMedV21 = fieldIntScalarOnNodes.addDriver(MED_DRIVER,med21FileName,fieldIntScalarOnNodes.getName()) -fieldIntScalarOnNodes.write(idMedV21) - -idMedV21 = fieldDoubleVectorOnNodes.addDriver(MED_DRIVER,med21FileName,fieldDoubleVectorOnNodes.getName()) -fieldDoubleVectorOnNodes.write(idMedV21) - -idMedV21 = fieldIntVectorOnNodes.addDriver(MED_DRIVER,med21FileName,fieldIntVectorOnNodes.getName()) -fieldIntVectorOnNodes.write(idMedV21) - -idMedV21 = fieldDoubleScalarOnCells.addDriver(MED_DRIVER,med21FileName,fieldDoubleScalarOnCells.getName()) -fieldDoubleScalarOnCells.write(idMedV21) - -idMedV21 = fieldIntScalarOnCells.addDriver(MED_DRIVER,med21FileName,fieldIntScalarOnCells.getName()) -fieldIntScalarOnCells.write(idMedV21) - -idMedV21 = fieldDoubleVectorOnCells.addDriver(MED_DRIVER,med21FileName,fieldDoubleVectorOnCells.getName()) -fieldDoubleVectorOnCells.write(idMedV21) - -idMedV21 = fieldIntVectorOnCells.addDriver(MED_DRIVER,med21FileName,fieldIntVectorOnCells.getName()) -fieldIntVectorOnCells.write(idMedV21) - -medFileVersion = getMedFileVersionForWriting() -if (medFileVersion == V21): - setMedFileVersionForWriting(V22) - -idMedV22 = fieldDoubleScalarOnNodes.addDriver(MED_DRIVER,med22FileName,fieldDoubleScalarOnNodes.getName()) -fieldDoubleScalarOnNodes.write(idMedV22) - -idMedV22 = fieldIntScalarOnNodes.addDriver(MED_DRIVER,med22FileName,fieldIntScalarOnNodes.getName()) -fieldIntScalarOnNodes.write(idMedV22) - -idMedV22 = fieldDoubleVectorOnNodes.addDriver(MED_DRIVER,med22FileName,fieldDoubleVectorOnNodes.getName()) -fieldDoubleVectorOnNodes.write(idMedV22) - -idMedV22 = fieldIntVectorOnNodes.addDriver(MED_DRIVER,med22FileName,fieldIntVectorOnNodes.getName()) -fieldIntVectorOnNodes.write(idMedV22) - -idMedV22 = fieldDoubleScalarOnCells.addDriver(MED_DRIVER,med22FileName,fieldDoubleScalarOnCells.getName()) -fieldDoubleScalarOnCells.write(idMedV22) - -idMedV22 = fieldIntScalarOnCells.addDriver(MED_DRIVER,med22FileName,fieldIntScalarOnCells.getName()) -fieldIntScalarOnCells.write(idMedV22) - -idMedV22 = fieldDoubleVectorOnCells.addDriver(MED_DRIVER,med22FileName,fieldDoubleVectorOnCells.getName()) -fieldDoubleVectorOnCells.write(idMedV22) +fieldIntScalarOnNodes.write(MED_DRIVER,med21FileName) +fieldDoubleVectorOnNodes.write(MED_DRIVER,med21FileName) +fieldIntVectorOnNodes.write(MED_DRIVER,med21FileName) +fieldDoubleScalarOnCells.write(MED_DRIVER,med21FileName) +fieldIntScalarOnCells.write(MED_DRIVER,med21FileName) +fieldDoubleVectorOnCells.write(MED_DRIVER,med21FileName) +fieldIntVectorOnCells.addDriver(MED_DRIVER,med21FileName) -idMedV22 = fieldIntVectorOnCells.addDriver(MED_DRIVER,med22FileName,fieldIntVectorOnCells.getName()) -fieldIntVectorOnCells.write(idMedV22) idVtk = fieldDoubleScalarOnNodes.addDriver(VTK_DRIVER,vtkFileName,fieldDoubleScalarOnNodes.getName()) fieldDoubleScalarOnNodes.writeAppend(idVtk) diff --git a/doc/MEDMEM/MESHconnectivities.cxx b/doc/MEDMEM/MESHconnectivities.cxx index 389546240..8edffe2a2 100644 --- a/doc/MEDMEM/MESHconnectivities.cxx +++ b/doc/MEDMEM/MESHconnectivities.cxx @@ -25,16 +25,15 @@ using namespace MEDMEM ; using namespace MED_EN ; -int main (int argc, char ** argv) { - -// const string MedFile = "polyedres.med" ; -// const string MeshName = "Erreur orientation" ; -// const string MedFile = "polygones.med" ; -// const string MeshName = "Bord" ; +int main (int argc, char ** argv) +{ + // const string MedFile = "polyedres.med" ; + // const string MeshName = "Erreur orientation" ; + // const string MedFile = "polygones.med" ; + // const string MeshName = "Bord" ; const string MedFile = "pointe.med" ; const string MeshName = "maa1" ; MESH myMesh(MED_DRIVER,MedFile,MeshName) ; - myMesh.read() ; cout << "Mesh name : " << myMesh.getName() << endl << endl ; @@ -49,11 +48,7 @@ int main (int argc, char ** argv) { medGeometryElement myType = Types[i] ; int NumberOfElements = myMesh.getNumberOfElements(MED_CELL,myType); int NomberOfNodesPerCell = Types[i]%100 ; - const int * Connectivity = - myMesh.getConnectivity(MED_FULL_INTERLACE, - MED_NODAL, - MED_CELL, - myType); + const int * Connectivity = myMesh.getConnectivity(MED_NODAL,MED_CELL,myType); for (int j=0; j 0 ) - { - cout << "Show Connectivity (Nodal) of POLYGONS:" << endl ; - const int* Connectivity = myMesh.getPolygonsConnectivity(MED_NODAL,MED_CELL); - const int* ConnectivityIndex = myMesh.getPolygonsConnectivityIndex(MED_NODAL,MED_CELL); - for (int j=0; j 0 ) - { - cout << "Show Connectivity (Nodal) of POLYHEDRONS:" << endl ; - const int* Connectivity = myMesh.getPolyhedronConnectivity(MED_NODAL); - const int* FaceIndex = myMesh.getPolyhedronFacesIndex(); - const int* Index = myMesh.getPolyhedronIndex(MED_NODAL); - for (int j=0; j 0 : - print "" - print " Show Connectivity (Nodal) of POLYGONS:" - print "" - connectivity = myMesh.getPolygonsConnectivity(MED_NODAL,MED_CELL) - index = myMesh.getPolygonsConnectivityIndex(MED_NODAL,MED_CELL) - for j in range(nbPolygons): - print " Polygon",(j+1)," ",connectivity[ index[j]-1 : index[j+1]-1 ] - pass - pass - -nbPolyhedrons = myMesh.getNumberOfPolyhedron() -if nbPolyhedrons > 0 : - print "" - print " Show Connectivity (Nodal) of POLYHEDRONS:" - print "" - connectivity = myMesh.getPolyhedronConnectivity(MED_NODAL) - fIndex = myMesh.getPolyhedronFacesIndex() - index = myMesh.getPolyhedronIndex(MED_NODAL) - for j in range(nbPolyhedrons): - print " Polyhedra",(j+1) - iF1, iF2 = index[ j ]-1, index[ j+1 ]-1 - for f in range( iF2 - iF1 ): - iN1, iN2 = fIndex[ iF1+f ]-1, fIndex[ iF1+f+1 ]-1 - print " Face",f+1," ",connectivity[ iN1 : iN2 ] - pass - pass - pass diff --git a/doc/doxygen/figures/UML_light.png b/doc/doxygen/figures/UML_light.png index 8eff5fa9c564a18200e14ddeff717d653cc8eff1..08ecacdbb7ccf09599668346827a52e6316f4a3e 100644 GIT binary patch literal 3990 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 literal 2803 zcmb_eX;4$=8a_!#iV$zDNE1)otMqDG@RUT{t^@_QM&q7wNrX8XHWiQ(1Bh&1M_Z1O zK{SkFT`DSDfT&am5UL&(0|pQwifmf6mB^A&z(8`plLV?W{c-Qi{gXL--}^q#^R6Gq z)~#JJ)(LikAZYBWmA)Gwh&&y9TO7&Y_i9UO76dt!tn&5QBztOjF53TW{x~S0)v{^f zhJEMb!td5@n=v0Eji($EnTiV2P9oL8!>`_qp|?46$I%|| zt6v55H@?91!y-UW=XCaGo*5{cWHq~lBmhDhN0P&y!lnSfO9;XDwvnk6(ZHX^?s(_* zy=I^>JYxKZ{KsQhs`sX$M;6CPJak=cvKl+KBB7mq6>dA_1cUF=xpAWHqguuhTXv{o(;!-rc^~ON& z&XB^Xr5s7WjD%HoM9sEbtZr&ngnB!`IwpV9>AbK47ZzOqzPlNMlkdLiGgsdXF!a&{ zTK!TqMjWLextui|&TJw#9>sSwGgT4Z_%O2{E#m8@2hoq5#*IkzXC~vploFswkx?fT z=}+K${$)_QgFHy2^>wm%ek<-EXS`3x75Y4nZ(SDGF$1q6Fe;f_S%{IIadEAG5{xG8 zX=EzS;|T_Ek-u>CoN_ai&R>UWq!{8U%*5x9y&0O4QR%>?eQI9I{M+*&x*eW?$;z14 z0W<~?{?FxrnC5mB@h=6UbN&I}CJ1c&6qm=$0uid!ZvG4l0M`?3{E1^i=uP>Eq%%7i zC$8x>Z;efhXJms9N?g-y-fh|Se+!bc)*j1b&JiNixjsawwCMbWcWRlSXFZpFC0{Ub z>d&YP0>|y3@LD=ZV}X)rBa3FJsX_gkO9PpNW@R=}O{>8*C29t!8PL9M1?>sZLYG*AXDN*A;>_1Gb9eC+fi(g{tO8CB-l`F zkd^Kb@PTY7HppZV1ehTkiXE~P0?hxDFn}WVK|f*aBKJ7Kl#ikO83{ri(<&a{Ga9gr zijkg2|Gy%>67!DhMWpK%%XrY7VXW|%aA;D}dE{H{*iaXtN2kE?F7trx^F4l2Fl`Om zAwagyYIA+kGv|BM$=mNZ?l5&Aw!Dmt5AGk8~AP!~Ujyb3T5s z{QKgU+QqpfaR5o#8E@!&Ym$7q2UH-py+Ml|TOvRi8u#$;bc*9x^x`Ri4aBZkj}1OZ z!8Pt}uAHoRwA?eT^Txw&!9S_3B!?cSRb_RGjbWf@zvY3tl|oVys1*@P220hub^=!D z404v;I;?om-3-<_nb_6<$SoGt4Yw+3g|fRjhxWY;qenbVYF48hNlSFaxyfB*aWD7-cQ0@Teo=5*SDaazDDr3Y{3ryo0zNhDKtPW& zc&O|y8_ZNGAzKNCsf$d+!UTHGBSZ%WrF`lJwuAcY%J#@ztraCE%g~z8lzUZA_VJDA?(MDPa{a<*r$owy#UcF75{|^kD?aiIBCVW>>En)om!Y$d zdl`v?U80wA&Aco4%%{{F@&ik|X{nyDsv$kQ_heX4Ozxh`qH$-#20J`<{v0957EjMZyn?l}TaZi|J>&n)6dUPt0n%SyK7&4$z7#+kn!5&^18ulA|&FXx!E z(;|um(dieFUaqSp8~@?l4nxm5)giGy=dH9dRTSQH`%cN?MdOFmMFVR#iG%rrIae|p zlCZ5U-TjFRG#5af!@mJ7@JZ!CZ-UZ;{#h^)Y$*{h23U=r5k2Kr>;CJ@cSofpB^d2n zwT3lKRC}9*|4Dtsw)frqw(6GH7n$RgM3bk5NjC0H{O#*wUmOt0?!!OWL6VGwH1Y!5H@)4^wj^> zMN3SV6WGc%Rnx&d5z}l}GjHY`tNPxEG8ZDgpUAOYmu}Gx(Pe z*zpp^$gb8{(`OS4@&we5?ooRN2*RzWGc2 Gll}vI@+C+B diff --git a/doc/doxygen/figures/UML_small.png b/doc/doxygen/figures/UML_small.png index 77109ab34035dcf9e9efddfdfc74e42de40087d0..791728fa43c41d13151b8666998e6a54a2168372 100644 GIT binary patch literal 27022 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 T@A`L$xMwjl+GbclbBXvLPlWqV literal 25901 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 A+5i9m -- 2.39.2