1 // Project MULTIPR, IOLS WP1.2.1 - EDF/CS
2 // Partitioning/decimation module for the SALOME v3.2 platform
5 * \file MULTIPR_Nodes.cxx
7 * \brief see MULTIPR_Nodes.hxx
9 * \author Olivier LE ROUX - CS, Virtual Reality Dpt
14 //*****************************************************************************
16 //*****************************************************************************
18 #include "MULTIPR_Nodes.hxx"
19 #include "MULTIPR_Exceptions.hxx"
30 //*****************************************************************************
31 // Class Nodes implementation
32 //*****************************************************************************
57 mCoordSystem = MED_CART;
59 if (mId != NULL) { delete[] mId; mId = NULL; }
60 if (mFamIdent != NULL) { delete[] mFamIdent; mFamIdent = NULL; }
61 if (mNames != NULL) { delete[] mNames; mNames = NULL; }
62 if (mCoo != NULL) { delete[] mCoo; mCoo = NULL; }
63 if (mNamesCoo != NULL) { delete[] mNamesCoo; mNamesCoo = NULL; }
64 if (mNamesUnitCoo != NULL) { delete[] mNamesUnitCoo; mNamesUnitCoo = NULL; }
66 mFlagPrintAll = false;
70 const med_float* Nodes::getCoordinates(med_int pIndexNode) const
72 if ((pIndexNode < 0) || (pIndexNode >= mNum)) throw IndexOutOfBoundsException("", __FILE__, __LINE__);
74 return mCoo + pIndexNode * mDim;
78 med_int Nodes::getFamIdent(med_int pIndexNode) const
80 if ((pIndexNode < 0) || (pIndexNode >= mNum)) throw IndexOutOfBoundsException("", __FILE__, __LINE__);
82 return mFamIdent[pIndexNode];
86 void Nodes::getBBox(med_float pMin[3], med_float pMax[3]) const
88 //---------------------------------------------------------------------
89 // Special case: no nodes => bbox = [0 ; 0] x [0 ; 0] x [0 ; 0]
90 //---------------------------------------------------------------------
93 for (int itDim = 0 ; itDim < mDim ; itDim++)
95 pMin[itDim] = med_float(0.0);
96 pMax[itDim] = med_float(0.0);
102 //---------------------------------------------------------------------
103 // Compute axis-aligned bounding box
104 //---------------------------------------------------------------------
105 for (int itDim = 0 ; itDim < mDim ; itDim++)
107 pMin[itDim] = numeric_limits<med_float>::max();
108 pMax[itDim] = -pMin[itDim];
110 for (int itNode = 0 ; itNode < mNum ; itNode++)
112 for (int itDim = 0 ; itDim < mDim ; itDim++)
114 med_float coord = mCoo[itNode * mDim + itDim];
115 if (coord < pMin[itDim]) pMin[itDim] = coord;
116 if (coord > pMax[itDim]) pMax[itDim] = coord;
122 set<med_int> Nodes::getSetOfFamilies() const
124 set<med_int> setOfFamilies;
126 // for each node, ad its family to the set
127 for (int itNode = 0 ; itNode < mNum ; itNode++)
129 setOfFamilies.insert(mFamIdent[itNode]);
132 return setOfFamilies;
136 Nodes* Nodes::extractSubSet(const set<med_int>& pSetIndices) const
138 Nodes* subset = new Nodes();
140 subset->mNum = pSetIndices.size();
142 subset->mCoordSystem = mCoordSystem;
144 //---------------------------------------------------------------------
146 //---------------------------------------------------------------------
147 subset->mFamIdent = new med_int[subset->mNum];
148 subset->mCoo = new med_float[subset->mDim * subset->mNum];
149 subset->mNamesCoo = new char[subset->mDim * MED_TAILLE_PNOM + 1];
150 subset->mNamesUnitCoo = new char[subset->mDim * MED_TAILLE_PNOM + 1];
152 memcpy(subset->mNamesCoo, mNamesCoo, subset->mDim * MED_TAILLE_PNOM + 1);
153 memcpy(subset->mNamesUnitCoo, mNamesUnitCoo, subset->mDim * MED_TAILLE_PNOM + 1);
155 //---------------------------------------------------------------------
156 // Copy subset of familys id and coords.
157 //---------------------------------------------------------------------
158 set<med_int>::iterator itSet = pSetIndices.begin();
159 for (int i = 0 ; i < subset->mNum; i++)
162 med_int srcIndex = (*itSet) - 1; // MED index start at 1
163 subset->mFamIdent[i] = mFamIdent[srcIndex];
165 med_float* srcCoo = mCoo + srcIndex * mDim;
166 med_float* destCoo = subset->mCoo + i * subset->mDim;
167 for (int itDim = 0 ; itDim < mDim ; itDim++)
169 destCoo[itDim] = srcCoo[itDim];
175 //---------------------------------------------------------------------
176 // Copy subset of identifiers if necessary
177 //---------------------------------------------------------------------
180 itSet = pSetIndices.begin();
181 subset->mId = new med_int[subset->mNum];
182 for (int i = 0 ; i < subset->mNum; i++)
184 med_int srcIndex = (*itSet) - 1; // MED index start at 1
185 subset->mId[i] = mId[srcIndex];
191 //---------------------------------------------------------------------
192 // Copy subset of names if necessary
193 //---------------------------------------------------------------------
196 subset->mNames = new char[MED_TAILLE_PNOM * subset->mNum + 1];
197 char* destPtr = subset->mNames;
198 itSet = pSetIndices.begin();
199 for (int i = 0 ; i < subset->mNum; i++)
201 med_int srcIndex = (*itSet) - 1; // MED index start at 1
202 char* srcPtr = mNames + srcIndex * MED_TAILLE_PNOM;
203 memcpy(destPtr, srcPtr, MED_TAILLE_PNOM);
204 destPtr += MED_TAILLE_PNOM;
208 subset->mNames[MED_TAILLE_PNOM * subset->mNum] = '\0';
215 void Nodes::readMED(med_idt pMEDfile, char* pMeshName, med_int pDim)
217 if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__);
218 if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__);
219 if (pDim != 3) throw IllegalArgumentException("", __FILE__, __LINE__);
229 med_geometrie_element(0),
230 med_connectivite(0));
232 if (mNum <= 0) throw IOException("", __FILE__, __LINE__);
234 mId = new med_int[mNum];
235 mFamIdent = new med_int[mNum];
236 mNames = new char[MED_TAILLE_PNOM * mNum + 1];
237 mCoo = new med_float[mDim * mNum];
238 mNamesCoo = new char[mDim * MED_TAILLE_PNOM + 1];
239 mNamesUnitCoo = new char[mDim * MED_TAILLE_PNOM + 1];
243 mNamesUnitCoo[0] = '\0';
245 med_booleen isIdentifiers;
248 med_err ret = MEDnoeudsLire(
264 if (ret != 0) throw IOException("", __FILE__, __LINE__);
266 // check if coordinates system is CARTESIAN
267 if (mCoordSystem != MED_CART) throw IllegalStateException("", __FILE__, __LINE__);
283 void Nodes::writeMED(med_idt pMEDfile, char* pMeshName) const
285 if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__);
286 if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__);
287 if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__);
288 if ((mDim < 1) || (mDim > 3)) throw IllegalStateException("", __FILE__, __LINE__);
289 if (mFamIdent == NULL) throw IllegalStateException("", __FILE__, __LINE__);
290 if (mCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__);
291 if (mNamesCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__);
292 if (mNamesUnitCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__);
294 // special case: if no nodes => do nothing
295 if (mNum == 0) return;
297 med_err ret = MEDnoeudsEcr(
307 isNames()?MED_VRAI:MED_FAUX,
309 isIdentifiers()?MED_VRAI:MED_FAUX,
313 if (ret != 0) throw IOException("i/o error while writing nodes", __FILE__, __LINE__);
318 ostream& operator<<(ostream& pOs, Nodes& pN)
320 char strCoordSystem[16];
321 switch (pN.mCoordSystem)
323 case MED_CART: strcpy(strCoordSystem, "CARTESIAN"); break;
324 case MED_CYL: strcpy(strCoordSystem, "CYLINDRIC"); break;
325 case MED_SPHER: strcpy(strCoordSystem, "SPHERIC"); break;
326 default: strcpy(strCoordSystem, "UNKNOWN"); break;
329 pOs << "Nodes: " << endl;
330 pOs << " #number =" << pN.mNum << endl;
331 pOs << " Dimension =" << pN.mDim << endl;
332 pOs << " Coord. system=" << strCoordSystem << endl;
333 pOs << " Has names ?" << (pN.isNames()?"yes":"no") << endl;
334 pOs << " Has id ?" << (pN.isIdentifiers()?"yes":"no") << endl;
335 pOs << " Axis names =" << "|" << pN.mNamesCoo << "|" << endl;
336 pOs << " Unit axis =" << "|" << pN.mNamesUnitCoo << "|" << endl;
339 set<med_int> setOfFam = pN.getSetOfFamilies();
340 if (setOfFam.size() == 0)
342 pOs << " Families: #fam=0" << endl;
346 set<med_int>::iterator itFam = setOfFam.end();
348 pOs << " Families: #fam=" << setOfFam.size() << " id_min=" << (*(setOfFam.begin())) << " id_max=" << (*itFam) << endl;
351 if (pN.mFlagPrintAll)
353 for (int itNode = 0 ; itNode < pN.mNum; itNode++)
355 pOs << " Node " << (itNode+1) << ": " << pN.mFamIdent[itNode] << endl;
360 med_float bboxMin[3], bboxMax[3];
361 pN.getBBox(bboxMin, bboxMax);
362 pOs << " BBox: [" << bboxMin[0] << " ; " << bboxMax[0] << "] x [" << bboxMin[1] << " ; " << bboxMax[1] << "] x [" << bboxMin[2] << " ; " << bboxMax[2] << "]" << endl;
364 if (pN.mFlagPrintAll)
366 pOs << " Coordinates: " << endl;
367 for (int itNode = 0 ; itNode < pN.mNum ; itNode++)
369 pOs << " Node " << (itNode+1) << ": ";
370 for (int itDim = 0 ; itDim < pN.mDim ; itDim++)
372 pOs << pN.mCoo[itNode * pN.mDim + itDim] << " ";
377 if (pN.isIdentifiers())
379 pOs << " Num: " << endl;
380 for (int itNode = 0 ; itNode < pN.mNum; itNode++)
382 pOs << " Node " << (itNode+1) << ": " << pN.mId[itNode] << endl;
388 pN.mNames[MED_TAILLE_PNOM * pN.mNum] = '\0';
389 pOs << " Names: |" << pN.mNames << "|" << endl;
398 } // namespace multipr