3 File MEDMEM_Meshing.cxx
10 #include "MEDMEM_STRING.hxx"
11 #include "MEDMEM_Exception.hxx"
12 #include "MEDMEM_define.hxx"
14 #include "MEDMEM_Meshing.hxx"
15 #include "MEDMEM_Group.hxx"
16 using namespace MEDMEM;
18 /*! Create an empty MESH. */
19 MESHING::MESHING(): MESH()
21 MESSAGE("MESHING::MESHING()");
23 SCRUTE(_connectivity);
28 MESSAGE("Deletinh MESHING !!");
31 /*! Set the dimension of the space */
32 void MESHING::setSpaceDimension(const int SpaceDimension)
34 _spaceDimension = SpaceDimension ;
37 /* Set the dimension of the MESHING */
38 // void MESHING::setMeshDimension(const int MeshDimension)
40 // _meshDimension = MeshDimension ;
43 /*! Set the number of nodes used in the MESH */
44 void MESHING::setNumberOfNodes(const int NumberOfNodes)
46 _numberOfNodes = NumberOfNodes ;
50 Set the whole coordinates array in a given system and interlacing mode.
51 The system coordinates are :
55 The interlacing mode are :
56 - MED_NO_INTERLACE : X1 X2 Y1 Y2 Z1 Z2
57 - MED_FULL_INTERLACE : X1 Y1 Z1 X2 Y2 Z2
59 void MESHING::setCoordinates(const int SpaceDimension,
60 const int NumberOfNodes,
61 const double * Coordinates,
63 const medModeSwitch Mode)
65 setSpaceDimension(SpaceDimension);
66 setNumberOfNodes(NumberOfNodes);
69 SCRUTE(_connectivity);
70 //if (NULL != _coordinate) delete _coordinate;
72 _coordinate = new COORDINATE(SpaceDimension,
75 _coordinate->setCoordinates(Mode,Coordinates);
76 _coordinate->setCoordinatesSystem(System);
79 /*! Set the system in which coordinates are given (CARTESIAN,CYLINDRICAL,SPHERICAL) __??MED_CART??__. */
80 void MESHING::setCoordinatesSystem(const string System)
83 if (NULL == _coordinate)
84 throw MEDEXCEPTION(LOCALIZED("MESHING::setCoordinatesSystem : no coordinates defined"));
85 _coordinate->setCoordinatesSystem(System);
88 /*! Set the coordinate names array ("x ","y ","z ")
89 of size n*MED_TAILLE_PNOM
91 void MESHING::setCoordinatesNames(const string * name)
93 // int SpaceDimension = getSpaceDimension() ;
94 // _coordinate->setCoordinatesNames(SpaceDimension,name);
95 _coordinate->setCoordinatesNames(name);
99 Set the (i+1)^th component of coordinate names array
100 ("x ","y ","z ") of size n*MED_TAILLE_PNOM
102 void MESHING::setCoordinateName(const string name, const int i)
104 _coordinate->setCoordinateName(name,i);
107 /*! Set the coordinate unit names array ("cm ","cm ","cm ")
108 of size n*MED_TAILLE_PNOM
110 void MESHING::setCoordinatesUnits(const string * units)
112 // int SpaceDimension = getSpaceDimension() ;
113 // _coordinate->setCoordinatesUnits(SpaceDimension,units);
114 _coordinate->setCoordinatesUnits(units);
118 Set the (i+1)^th component of the coordinate unit names array
119 ("cm ","cm ","cm ") of size n*MED_TAILLE_PNOM
121 void MESHING::setCoordinateUnit(const string unit, const int i)
123 _coordinate->setCoordinateUnit(unit,i);
127 Create a new connectivity object with the given number of type and
128 entity. If a connectivity already exist, delete it !
130 For exemple setNumberOfTypes(3,MED_CELL) create a connectivity with 3
131 medGeometryElement in MESH for MED_CELL entity (like MED_TETRA4,
132 MED_PYRA5 and MED_HEXA6 for example).
134 Return an exception if could not create the connectivity (as if we set
135 MED_FACE connectivity before MED_CELL).
137 void MESHING::setNumberOfTypes(const int NumberOfTypes,
138 const medEntityMesh Entity)
141 const char * LOC = "MESHING::setNumberOfTypes( medEntityMesh ) : ";
143 // No defined for MED_NODE !
144 if (Entity == MED_NODE)
145 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not required with MED_NODE !"));
147 if (MED_CELL == Entity) {
148 SCRUTE(_connectivity);
149 // if (_connectivity != (CONNECTIVITY *) NULL)
150 // delete _connectivity ;
151 _connectivity = new CONNECTIVITY(NumberOfTypes,Entity) ;
155 if (_connectivity == NULL) // we must have defined MED_CELL connectivity
156 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity on MED_CELL defined !"));
158 if (MED_FACE == Entity)
159 if (3 != getSpaceDimension())
160 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity on MED_FACE could be defined in non 3D space !"));
162 if (MED_EDGE == Entity)
163 if (3 == getSpaceDimension()) {
164 if (!_connectivity->existConnectivity(MED_NODAL,MED_FACE))
165 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity on MED_FACE defined !"));
167 if (2 != getSpaceDimension())
168 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Could not set connectivity on MED_EDGE !"));
170 // all rigth, we could create connectivity !
171 CONNECTIVITY * myConnectivity = new CONNECTIVITY(NumberOfTypes,Entity) ;
172 _connectivity->setConstituent(myConnectivity);
177 Set the list of geometric types used by a given entity.
178 medEntityMesh entity could be : MED_CELL, MED_FACE, MED_EDGE
180 REM : Don't use MED_NODE and MED_ALL_ENTITIES
182 If entity is not defined, throw an exception.
184 void MESHING::setTypes(const medGeometryElement * Types,
185 const medEntityMesh entity)
188 if (entity == MED_NODE)
189 throw MEDEXCEPTION(LOCALIZED("MESHING::setTypes : Not defined with MED_NODE entity !"));
191 if (_connectivity == NULL)
192 throw MEDEXCEPTION(LOCALIZED("MESHING::setTypes : No connectivity defined !"));
194 _connectivity->setGeometricTypes(Types,entity) ;
198 Set the number of elements for each geometric type of given entity.
200 Example : setNumberOfElements({12,23},MED_FACE)
201 if we have two type of face (MED_TRIA3 and MED_QUAD4),
202 we set 12 triangles and 23 quadrangles.
204 void MESHING::setNumberOfElements(const int * NumberOfElements,
205 medEntityMesh Entity)
208 const char * LOC = "MESHING::setNumberOfElements(const int *, medEntityMesh) : " ;
210 if (Entity==MED_NODE)
211 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined with MED_NODE entity !"));
213 if (_connectivity == (CONNECTIVITY*)NULL)
214 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity defined !"));
216 int NumberOfTypes = getNumberOfTypes(Entity) ;
217 int * Count = new int[NumberOfTypes+1] ;
219 for (int i=0; i<NumberOfTypes; i++)
220 Count[i+1]=Count[i]+NumberOfElements[i] ;
221 _connectivity->setCount(Count,Entity) ;
226 Set the nodal connectivity for one geometric type of the given entity.
228 Example : setConnectivity({1,2,3,1,4,2},MED_FACE,MED_TRIA3)
229 Define 2 triangles face defined with nodes 1,2,3 and 1,4,2.
231 void MESHING::setConnectivity(const int * Connectivity,
232 const medEntityMesh Entity,
233 const medGeometryElement Type)
236 const char * LOC = "MESHING::setConnectivity : " ;
238 if (Entity==MED_NODE)
239 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined with MED_NODE entity !"));
241 if (_connectivity == (CONNECTIVITY*)NULL)
242 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"No connectivity defined !"));
244 _connectivity->setNodal(Connectivity,Entity,Type) ;
248 NOT YET IMPLEMENTED !! WARNING
250 void MESHING::setConnectivities (const int * ConnectivityIndex,
251 const int * ConnectivityValue,
252 const medConnectivity ConnectivityType,
253 const medEntityMesh Entity)
256 const char * LOC = "MESHING::setConnectivities : " ;
258 SCRUTE(ConnectivityType);
259 SCRUTE(ConnectivityValue);
260 SCRUTE(ConnectivityIndex);
262 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not Yet Implemented :: Warning !"));
268 // void MESHING::setGroup(const string name,
269 // const string description,
270 // const int NumberOfElements,
271 // const int * ElementsNumbers,
272 // const medEntityMesh Entity)
274 // GROUP * myGroup = new GROUP() ;
275 // myGroup->setMesh(*this) ;
276 // myGroup->setName(name) ;
277 // myGroup->setDescription(description) ;
278 // myGroup->setEntity(Entity) ;
279 // // medEntityMesh and medGeometryElement ???
280 // myGroup->setNumberOfGeometricType(NumberOfType) ;
281 // myGroup->setGeometricType(Type) ;
282 // myGroup->setNumberOfGaussPoint(NumberOfGaussPoint) ;
283 // myGroup->setNumberOfElements(NumberOfElements) ;
284 // myGroup->setNumber(Number) ;
287 void MESHING::addGroup(const GROUP & Group)
290 const char * LOC = "MESHING::addGroup : " ;
292 GROUP * myGroup = new GROUP(Group) ;
293 switch(Group.getEntity()){
295 _groupCell.push_back(myGroup);
299 _groupFace.push_back(myGroup);
303 _groupEdge.push_back(myGroup);
307 _groupNode.push_back(myGroup);
311 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Bad Entity !"));