diff --git a/Geo/GModelIO_MED.cpp b/Geo/GModelIO_MED.cpp index cce4eb6d8b096dde3795fa645256d0f89bf94812..f636bed77543d3cc792b78e730332b57775ff589 100644 --- a/Geo/GModelIO_MED.cpp +++ b/Geo/GModelIO_MED.cpp @@ -1,4 +1,4 @@ -// $Id: GModelIO_MED.cpp,v 1.22 2008-03-30 20:45:27 geuzaine Exp $ +// $Id: GModelIO_MED.cpp,v 1.23 2008-04-01 13:41:33 geuzaine Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -37,29 +37,51 @@ extern "C" { #include <med.h> } -static int getElementTypeForMED(int msh, med_geometrie_element &med) +static med_geometrie_element msh2medElementType(int msh) { switch(msh) { - case MSH_LIN_2: med = MED_SEG2; return 2; - case MSH_TRI_3: med = MED_TRIA3; return 3; - case MSH_QUA_4: med = MED_QUAD4; return 4; - case MSH_TET_4: med = MED_TETRA4; return 4; - case MSH_HEX_8: med = MED_HEXA8; return 8; - case MSH_PRI_6: med = MED_PENTA6; return 6; - case MSH_PYR_5: med = MED_PYRA5; return 5; - case MSH_LIN_3: med = MED_SEG3; return 3; - case MSH_TRI_6: med = MED_TRIA6; return 6; - case MSH_TET_10: med = MED_TETRA10; return 10; - case MSH_PNT: med = MED_POINT1; return 1; - case MSH_QUA_8: med = MED_QUAD8; return 8; - case MSH_HEX_20: med = MED_HEXA20; return 20; - case MSH_PRI_15: med = MED_PENTA15; return 15; - case MSH_PYR_13: med = MED_PYRA13; return 13; - default: med = MED_NONE; return 0; + case MSH_LIN_2: return MED_SEG2; + case MSH_TRI_3: return MED_TRIA3; + case MSH_QUA_4: return MED_QUAD4; + case MSH_TET_4: return MED_TETRA4; + case MSH_HEX_8: return MED_HEXA8; + case MSH_PRI_6: return MED_PENTA6; + case MSH_PYR_5: return MED_PYRA5; + case MSH_LIN_3: return MED_SEG3; + case MSH_TRI_6: return MED_TRIA6; + case MSH_TET_10: return MED_TETRA10; + case MSH_PNT: return MED_POINT1; + case MSH_QUA_8: return MED_QUAD8; + case MSH_HEX_20: return MED_HEXA20; + case MSH_PRI_15: return MED_PENTA15; + case MSH_PYR_13: return MED_PYRA13; + default: return MED_NONE; } } -int med2msh(med_geometrie_element med, int k) +int med2mshElementType(med_geometrie_element med) +{ + switch(med) { + case MED_SEG2: return MSH_LIN_2; + case MED_TRIA3: return MSH_TRI_3; + case MED_QUAD4: return MSH_QUA_4; + case MED_TETRA4: return MSH_TET_4; + case MED_HEXA8: return MSH_HEX_8; + case MED_PENTA6: return MSH_PRI_6; + case MED_PYRA5: return MSH_PYR_5; + case MED_SEG3: return MSH_LIN_3; + case MED_TRIA6: return MSH_TRI_6; + case MED_TETRA10: return MSH_TET_10; + case MED_POINT1: return MSH_PNT; + case MED_QUAD8: return MSH_QUA_8; + case MED_HEXA20: return MSH_HEX_20; + case MED_PENTA15: return MSH_PRI_15; + case MED_PYRA13: return MSH_PYR_13; + default: return 0; + } +} + +int med2mshNodeIndex(med_geometrie_element med, int k) { switch(med) { case MED_SEG2: return k; @@ -206,11 +228,11 @@ int GModel::readMED(const std::string &name, int meshIndex) 0, nodeTags.empty() ? 0 : nodeTags[i]); // read elements for(int mshType = 0; mshType < 50; mshType++){ // loop over all possible MSH types - med_geometrie_element type; - int numNodPerEle = getElementTypeForMED(mshType, type); + med_geometrie_element type = msh2medElementType(mshType); if(type == MED_NONE) continue; med_int numEle = MEDnEntMaa(fid, meshName, MED_CONN, MED_MAILLE, type, MED_NOD); if(numEle <= 0) continue; + int numNodPerEle = type % 100; std::vector<med_int> conn(numEle * numNodPerEle); if(MEDconnLire(fid, meshName, meshDim, &conn[0], MED_FULL_INTERLACE, 0, MED_ALL, MED_MAILLE, type, MED_NOD) < 0) { @@ -241,7 +263,7 @@ int GModel::readMED(const std::string &name, int meshIndex) for(int j = 0; j < numEle; j++){ std::vector<MVertex*> v(numNodPerEle); for(int k = 0; k < numNodPerEle; k++) - v[k] = verts[conn[numNodPerEle * j + med2msh(type, k)] - 1]; + v[k] = verts[conn[numNodPerEle * j + med2mshNodeIndex(type, k)] - 1]; MElement *e = factory.create(mshType, v, eleTags.empty() ? 0 : eleTags[j]); if(e) elements[-fam[j]].push_back(e); } @@ -320,7 +342,7 @@ static void fillElementsMED(med_int family, std::vector<T*> &elements, med_int & for(int j = 0; j < elements[i]->getNumVertices(); j++) conn.push_back(elements[i]->getVertexMED(j)->getIndex()); fam.push_back(family); - if(!i) getElementTypeForMED(elements[i]->getTypeForMSH(), type); + if(!i) type = msh2medElementType(elements[i]->getTypeForMSH()); } } diff --git a/Post/PViewDataGModelIO.cpp b/Post/PViewDataGModelIO.cpp index cec828a50fdf3f1bb65fdf137e20dc789bf90fcc..006f948c9c0f6190fab7a64afeedb8906357453e 100644 --- a/Post/PViewDataGModelIO.cpp +++ b/Post/PViewDataGModelIO.cpp @@ -1,4 +1,4 @@ -// $Id: PViewDataGModelIO.cpp,v 1.32 2008-04-01 12:47:10 geuzaine Exp $ +// $Id: PViewDataGModelIO.cpp,v 1.33 2008-04-01 13:41:33 geuzaine Exp $ // // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle // @@ -146,7 +146,8 @@ extern "C" { #include <med.h> } -extern int med2msh(med_geometrie_element med, int k); +extern int med2mshElementType(med_geometrie_element med); +extern int med2mshNodeIndex(med_geometrie_element med, int k); bool PViewDataGModel::readMED(std::string fileName, int fileIndex) { @@ -262,8 +263,6 @@ bool PViewDataGModel::readMED(std::string fileName, int fileIndex) mult = ngauss; setType(GaussPointData); } - - // only a guess, since several element types may be combined _steps[step]->resizeData(numVal / mult); // read field data @@ -290,6 +289,8 @@ bool PViewDataGModel::readMED(std::string fileName, int fileIndex) // FIXME: store this in stepData, e.g. in a vector indexed by // mshEleType std::vector<std::vector<u,v,w, u,v,w, u,v,w, ...> > // (ele/100==geo dim, ele%100==num nodes) + // int msh = med2mshElementTupe(ele); + // gaussPointsCoordinates[msh] = gscoo; // zero pad } // compute profile (indices in full array of entities of given type) @@ -349,7 +350,7 @@ bool PViewDataGModel::readMED(std::string fileName, int fileIndex) double *d = _steps[step]->getData(num, true, mult); for(int j = 0; j < mult; j++){ // reorder nodes if we have ElementNode data - int j2 = (ent == MED_NOEUD_ELEMENT) ? med2msh(ele, j) : j; + int j2 = (ent == MED_NOEUD_ELEMENT) ? med2mshNodeIndex(ele, j) : j; for(int k = 0; k < numComp; k++) d[numCompMsh * j + k] = val[numComp * mult * i + numComp * j2 + k]; double s = ComputeScalarRep(numCompMsh, &d[numCompMsh * j]);