1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 File MEDMEM_Meshing.cxx
27 #include "MEDMEM_Utilities.hxx"
28 #include "MEDMEM_STRING.hxx"
29 #include "MEDMEM_Exception.hxx"
30 #include "MEDMEM_define.hxx"
32 #include "MEDMEM_Meshing.hxx"
33 #include "MEDMEM_Group.hxx"
36 using namespace MEDMEM;
37 using namespace MED_EN;
39 /*! Create an empty MESH. */
40 MESHING::MESHING(): MESH()
42 MESSAGE("MESHING::MESHING()");
44 SCRUTE(_connectivity);
49 MESSAGE("Deletinh MESHING !!");
52 /*! Set the dimension of the space */
53 void MESHING::setSpaceDimension(const int SpaceDimension)
55 _spaceDimension = SpaceDimension ;
58 /*! Set the dimension of the MESHING */
59 void MESHING::setMeshDimension(const int MeshDimension)
61 _meshDimension = MeshDimension ;
63 _connectivity->setEntityDimension(MeshDimension);
66 /*! Set the number of nodes used in the MESH */
67 void MESHING::setNumberOfNodes(const int NumberOfNodes)
69 _numberOfNodes = NumberOfNodes ;
71 _connectivity->setNumberOfNodes(NumberOfNodes);
75 Set the whole coordinates array in a given system and interlacing mode.
76 The system coordinates are :
80 The interlacing mode are :
81 - MED_NO_INTERLACE : X1 X2 Y1 Y2 Z1 Z2
82 - MED_FULL_INTERLACE : X1 Y1 Z1 X2 Y2 Z2
84 void MESHING::setCoordinates(const int SpaceDimension,
85 const int NumberOfNodes,
86 const double * Coordinates,
88 const medModeSwitch Mode)
90 setSpaceDimension(SpaceDimension);
91 setNumberOfNodes(NumberOfNodes);
94 SCRUTE(_connectivity);
95 //if (NULL != _coordinate) delete _coordinate;
97 _coordinate = new COORDINATE(SpaceDimension,
100 _coordinate->setCoordinates(Mode,Coordinates);
101 _coordinate->setCoordinatesSystem(System);
104 /*! Set the system in which coordinates are given (CARTESIAN,CYLINDRICAL,SPHERICAL) __??MED_CART??__. */
105 void MESHING::setCoordinatesSystem(const string System)
108 if (NULL == _coordinate)
109 throw MEDEXCEPTION(LOCALIZED("MESHING::setCoordinatesSystem : no coordinates defined"));
110 _coordinate->setCoordinatesSystem(System);
113 /*! Set the coordinate names array ("x ","y ","z ")
114 of size n*MED_TAILLE_PNOM
116 void MESHING::setCoordinatesNames(const string * name)
118 // int SpaceDimension = getSpaceDimension() ;
119 // _coordinate->setCoordinatesNames(SpaceDimension,name);
120 _coordinate->setCoordinatesNames(name);
124 Set the (i+1)^th component of coordinate names array
125 ("x ","y ","z ") of size n*MED_TAILLE_PNOM
127 void MESHING::setCoordinateName(const string name, const int i)
129 _coordinate->setCoordinateName(name,i);
132 /*! Set the coordinate unit names array ("cm ","cm ","cm ")
133 of size n*MED_TAILLE_PNOM
135 void MESHING::setCoordinatesUnits(const string * units)
137 // int SpaceDimension = getSpaceDimension() ;
138 // _coordinate->setCoordinatesUnits(SpaceDimension,units);
139 _coordinate->setCoordinatesUnits(units);
143 Set the (i+1)^th component of the coordinate unit names array
144 ("cm ","cm ","cm ") of size n*MED_TAILLE_PNOM
146 void MESHING::setCoordinateUnit(const string unit, const int i)
148 _coordinate->setCoordinateUnit(unit,i);
152 Create a new connectivity object with the given number of type and
153 entity. If a connectivity already exist, delete it !
155 For exemple setNumberOfTypes(3,MED_CELL) create a connectivity with 3
156 medGeometryElement in MESH for MED_CELL entity (like MED_TETRA4,
157 MED_PYRA5 and MED_HEXA6 for example).
159 Return an exception if could not create the connectivity (as if we set
160 MED_FACE connectivity before MED_CELL).
162 void MESHING::setNumberOfTypes(const int NumberOfTypes,
163 const medEntityMesh Entity)
166 const char * LOC = "MESHING::setNumberOfTypes( medEntityMesh ) : ";
168 // No defined for MED_NODE !
169 if (Entity == MED_NODE)
170 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not required with MED_NODE !"));
172 if (MED_CELL == Entity) {
173 SCRUTE(_connectivity);
174 // if (_connectivity != (CONNECTIVITY *) NULL)
175 // delete _connectivity ;
176 _connectivity = new CONNECTIVITY(NumberOfTypes,Entity) ;
180 if (_connectivity == NULL) // we must have defined MED_CELL connectivity
181 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity on MED_CELL defined !"));
183 if (MED_FACE == Entity)
184 if (3 != getSpaceDimension())
185 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity on MED_FACE could be defined in non 3D space !"));
187 if (MED_EDGE == Entity)
188 if (3 == getSpaceDimension()) {
189 if (!_connectivity->existConnectivity(MED_NODAL,MED_FACE))
190 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity on MED_FACE defined !"));
192 if (2 != getSpaceDimension())
193 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Could not set connectivity on MED_EDGE !"));
195 // all rigth, we could create connectivity !
196 CONNECTIVITY * myConnectivity = new CONNECTIVITY(NumberOfTypes,Entity) ;
197 myConnectivity->setEntityDimension(_connectivity->getEntityDimension()-1);
198 _connectivity->setConstituent(myConnectivity);
203 Set the list of geometric types used by a given entity.
204 medEntityMesh entity could be : MED_CELL, MED_FACE, MED_EDGE
206 REM : Don't use MED_NODE and MED_ALL_ENTITIES
208 If entity is not defined, throw an exception.
210 void MESHING::setTypes(const medGeometryElement * Types,
211 const medEntityMesh entity)
214 if (entity == MED_NODE)
215 throw MEDEXCEPTION(LOCALIZED("MESHING::setTypes : Not defined with MED_NODE entity !"));
217 if (_connectivity == NULL)
218 throw MEDEXCEPTION(LOCALIZED("MESHING::setTypes : No connectivity defined !"));
220 _connectivity->setGeometricTypes(Types,entity) ;
224 Set the number of elements for each geometric type of given entity.
226 Example : setNumberOfElements({12,23},MED_FACE)
227 if we have two type of face (MED_TRIA3 and MED_QUAD4),
228 we set 12 triangles and 23 quadrangles.
230 void MESHING::setNumberOfElements(const int * NumberOfElements,
231 const medEntityMesh Entity)
234 const char * LOC = "MESHING::setNumberOfElements(const int *, medEntityMesh) : " ;
236 if (Entity==MED_NODE)
237 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined with MED_NODE entity !"));
239 if (_connectivity == (CONNECTIVITY*)NULL)
240 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity defined !"));
242 int NumberOfTypes = getNumberOfTypes(Entity) ;
243 int * Count = new int[NumberOfTypes+1] ;
245 for (int i=0; i<NumberOfTypes; i++)
246 Count[i+1]=Count[i]+NumberOfElements[i] ;
247 _connectivity->setCount(Count,Entity) ;
252 Set the nodal connectivity for one geometric type of the given entity.
254 Example : setConnectivity({1,2,3,1,4,2},MED_FACE,MED_TRIA3)
255 Define 2 triangles face defined with nodes 1,2,3 and 1,4,2.
257 void MESHING::setConnectivity(const int * Connectivity,
258 const medEntityMesh Entity,
259 const medGeometryElement Type)
262 const char * LOC = "MESHING::setConnectivity : " ;
264 if (Entity==MED_NODE)
265 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined with MED_NODE entity !"));
267 if (_connectivity == (CONNECTIVITY*)NULL)
268 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity defined !"));
270 _connectivity->setNodal(Connectivity,Entity,Type) ;
273 void MESHING::setPolygonsConnectivity (const int * ConnectivityIndex,
274 const int * ConnectivityValue,
276 const MED_EN::medEntityMesh Entity)
279 if (_connectivity == (CONNECTIVITY*)NULL)
280 throw MEDEXCEPTION("No connectivity defined !");
282 _connectivity->setPolygonsConnectivity(MED_NODAL, Entity, ConnectivityValue, ConnectivityIndex,ConnectivityIndex[nbOfPolygons]-1,nbOfPolygons) ;
285 void MESHING::setPolyhedraConnectivity (const int * PolyhedronIndex,
286 const int * FacesIndex,
289 const MED_EN::medEntityMesh Entity)
292 if (_connectivity == (CONNECTIVITY*)NULL)
293 throw MEDEXCEPTION("No connectivity defined !");
294 if(_connectivity->getPolyTypeRelativeTo()==MED_EN::MED_POLYHEDRA)
296 int nbOfFacesOfAllPolyhedra=PolyhedronIndex[nbOfPolyhedra]-1;
297 _connectivity->setPolyhedronConnectivity(MED_NODAL, Nodes, PolyhedronIndex, FacesIndex[nbOfFacesOfAllPolyhedra]-1 , nbOfPolyhedra, FacesIndex, nbOfFacesOfAllPolyhedra) ;
300 throw MEDEXCEPTION("Invalid connectivity for polyhedra !!!");
304 NOT YET IMPLEMENTED !! WARNING
306 void MESHING::setConnectivities (const int * ConnectivityIndex,
307 const int * ConnectivityValue,
308 const medConnectivity ConnectivityType,
309 const medEntityMesh Entity)
312 const char * LOC = "MESHING::setConnectivities : " ;
314 SCRUTE(ConnectivityType);
315 SCRUTE(ConnectivityValue);
316 SCRUTE(ConnectivityIndex);
318 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not Yet Implemented :: Warning !"));
324 // void MESHING::setGroup(const string name,
325 // const string description,
326 // const int NumberOfElements,
327 // const int * ElementsNumbers,
328 // const medEntityMesh Entity)
330 // GROUP * myGroup = new GROUP() ;
331 // myGroup->setMesh(*this) ;
332 // myGroup->setName(name) ;
333 // myGroup->setDescription(description) ;
334 // myGroup->setEntity(Entity) ;
335 // // medEntityMesh and medGeometryElement ???
336 // myGroup->setNumberOfGeometricType(NumberOfType) ;
337 // myGroup->setGeometricType(Type) ;
338 // myGroup->setNumberOfGaussPoint(NumberOfGaussPoint) ;
339 // myGroup->setNumberOfElements(NumberOfElements) ;
340 // myGroup->setNumber(Number) ;
343 void MESHING::addGroup(const GROUP & Group)
346 const char * LOC = "MESHING::addGroup : " ;
348 GROUP * myGroup = new GROUP(Group) ;
349 switch(Group.getEntity()){
351 _groupCell.push_back(myGroup);
355 _groupFace.push_back(myGroup);
359 _groupEdge.push_back(myGroup);
363 _groupNode.push_back(myGroup);
367 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Bad Entity !"));