1 // Project MULTIPR, IOLS WP1.2.1 - EDF/CS
2 // Partitioning/decimation module for the SALOME v3.2 platform
5 * \file MULTIPR_GaussLoc.cxx
7 * \brief see MULTIPR_GaussLoc.hxx
9 * \author Olivier LE ROUX - CS, Virtual Reality Dpt
14 //*****************************************************************************
16 //*****************************************************************************
18 #include "MULTIPR_GaussLoc.hxx"
19 #include "MULTIPR_Utils.hxx"
20 #include "MULTIPR_Exceptions.hxx"
31 //*****************************************************************************
32 // Class GaussLoc implementation
33 //*****************************************************************************
45 GaussLoc::GaussLoc(const GaussLoc& pGaussLoc)
51 strcpy(mName, pGaussLoc.mName);
53 mGeom = pGaussLoc.mGeom;
54 mDim = pGaussLoc.mDim;
55 mNumNodes = pGaussLoc.mNumNodes;
56 mNumGauss = pGaussLoc.mNumGauss;
58 if (mDim != (mGeom / 100)) throw IllegalStateException("", __FILE__, __LINE__);
59 if (mNumNodes != (mGeom % 100)) throw IllegalStateException("", __FILE__, __LINE__);
61 if (pGaussLoc.mRefCoo != NULL)
63 mRefCoo = new med_float[mDim * mNumNodes];
64 memcpy(mRefCoo, pGaussLoc.mRefCoo, sizeof(med_float) * mDim * mNumNodes);
67 if (pGaussLoc.mGaussCoo != NULL)
69 mGaussCoo = new med_float[mDim * mNumGauss];
70 memcpy(mGaussCoo, pGaussLoc.mGaussCoo, sizeof(med_float) * mDim * mNumGauss);
73 if (pGaussLoc.mWeight != NULL)
75 mWeight = new med_float[mNumGauss];
76 memcpy(mWeight, pGaussLoc.mWeight, sizeof(med_float) * mNumGauss);
87 void GaussLoc::reset()
95 if (mRefCoo != NULL) { delete[] mRefCoo; mRefCoo = NULL; }
96 if (mGaussCoo != NULL) { delete[] mGaussCoo; mGaussCoo = NULL; }
97 if (mWeight != NULL) { delete[] mWeight; mWeight = NULL; }
101 void GaussLoc::getCoordGaussPoints(
102 const med_float* pCooElt,
103 med_float* pCooGaussPoints) const
106 //printArray2D(pCooElt, mNumNodes, mDim, "Node");
108 // WARNING: assumes TETRA10 !!!
109 // This method is not completely generic and should be extended to support all cases.
110 if (mGeom != MED_TETRA10) throw UnsupportedOperationException("only support TETRA10 for the moment", __FILE__, __LINE__);
112 const med_float* pt1 = pCooElt;
113 const med_float* pt2 = pt1 + mDim;
114 const med_float* pt3 = pt2 + mDim;
115 const med_float* pt4 = pt3 + mDim;
117 const med_float* coeff = mGaussCoo;
118 med_float* dest = pCooGaussPoints;
120 // for each Gauss point
121 for (int i = 0 ; i < mNumGauss ; i++)
123 dest[0] = pt2[0] + (pt4[0] - pt2[0]) * coeff[0] + (pt1[0] - pt2[0]) * coeff[1] + (pt3[0] - pt2[0]) * coeff[2];
124 dest[1] = pt2[1] + (pt4[1] - pt2[1]) * coeff[0] + (pt1[1] - pt2[1]) * coeff[1] + (pt3[1] - pt2[1]) * coeff[2];
125 dest[2] = pt2[2] + (pt4[2] - pt2[2]) * coeff[0] + (pt1[2] - pt2[2]) * coeff[1] + (pt3[2] - pt2[2]) * coeff[2];
127 // prepare next point
134 void GaussLoc::readMED(med_idt pMEDfile, med_int pIndex)
136 if (pMEDfile == 0) throw IOException("pMEDfile should not be NULL", __FILE__, __LINE__);
137 if (pIndex < 1) throw IllegalArgumentException("pIndex should be >= 1", __FILE__, __LINE__);
141 med_err ret = MEDgaussInfo(
148 if (ret != 0) throw IOException("i/o error while reading Gauss localization information in MED file", __FILE__, __LINE__);
151 mNumNodes = mGeom % 100;
153 mRefCoo = new med_float[mDim * mNumNodes];
154 mGaussCoo = new med_float[mDim * mNumGauss];
155 mWeight = new med_float[mNumGauss];
165 if (ret != 0) throw IOException("i/o error while reading Gauss localization in MED file", __FILE__, __LINE__);
169 void GaussLoc::writeMED(med_idt pMEDfile)
171 if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__);
172 if (mNumGauss < 0) throw IllegalStateException("", __FILE__, __LINE__);
173 if (mRefCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__);
174 if (mGaussCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__);
175 if (mWeight == NULL) throw IllegalStateException("", __FILE__, __LINE__);
176 if (strlen(mName) > MED_TAILLE_NOM) throw IllegalStateException("", __FILE__, __LINE__);
178 med_err ret = MEDgaussEcr(
188 if (ret != 0) throw IOException("i/o error while writing Gauss localization", __FILE__, __LINE__);
192 ostream& operator<<(ostream& pOs, GaussLoc& pG)
194 pOs << "Gauss ref:" << endl;
195 pOs << " Name =|" << pG.mName << "|" << endl;
196 pOs << " Geom =" << pG.mGeom << endl;
197 pOs << " #Pt Gauss=" << pG.mNumGauss << endl;
199 pOs << " Ref nodes coords.: (#nodes=" << pG.mNumNodes << " dim=" << pG.mDim << ")" << endl;
200 for (int itNode = 0 ; itNode < pG.mNumNodes ; itNode++)
202 pOs << " Node " << (itNode + 1) << ": ";
203 for (int itDim = 0; itDim < pG.mDim ; itDim++)
205 pOs << pG.mRefCoo[itNode * pG.mDim + itDim] << " ";
210 pOs << " Gauss coords. and weight:" << endl;
211 for (int itGauss = 0 ; itGauss < pG.mNumGauss ; itGauss++)
213 pOs << " Pt " << (itGauss+1) << ": ";
214 for (int itDim = 0; itDim < pG.mDim ; itDim++)
216 pOs << pG.mGaussCoo[itGauss * pG.mDim + itDim] << " ";
218 pOs << "weight=" << pG.mWeight[itGauss];
225 pG.getCoordGaussPoints(pG.mRefCoo, res);
226 printArray2D(res, pG.mNumGauss, pG.mDim, "Gauss pt");
233 } // namespace multipr