1 // Copyright (C) 2021 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #ifndef MESHFORMATREADER_HXX
21 #define MESHFORMATREADER_HXX
30 #include "InterpKernelException.hxx"
31 #include "NormalizedUnstructuredMesh.hxx"
33 #include "MEDMESHConverterUtilities.hxx"
34 #include "libmesh5.hxx"
44 class DataArrayDouble;
48 class MEDFileFieldMultiTS;
50 class MEDCouplingUMesh;
52 struct MeshFormatElement
54 MeshFormatElement(int type, int id = 0) : _type(type), _id(id) {}
58 inline friend bool operator==(const MeshFormatElement &a, const MeshFormatElement &b)
60 return ((a._type == b._type) && (a._id == b._id));
64 struct MeshFormatFamily
67 std::map<int, std::vector<MeshFormatElement> *> _meshFormatFams;
68 std::map<int, std::vector<MeshFormatElement> *> _meshFormatFams_0;
69 std::map<int, std::vector<MeshFormatElement> *> _meshFormatFams_1;
70 std::map<int, std::vector<MeshFormatElement> *> _meshFormatFams_2;
71 std::map<int, std::vector<MeshFormatElement> *> _meshFormatFamsNodes;
74 void insert(std::pair<int, MeshFormatElement> addToFamily, int dimRelMax)
76 insertPairInMap(_meshFormatFams, addToFamily);
77 insertPairInMap(getMapAtLevel(dimRelMax), addToFamily);
81 void insertPairInMap(std::map<int, std::vector<MeshFormatElement> *> &aMap, std::pair<int, MeshFormatElement> addToFamily)
83 std::map<int, std::vector<MeshFormatElement> *>::iterator it = aMap.find(addToFamily.first);
86 aMap[addToFamily.first]->push_back(addToFamily.second);
90 std::vector<MeshFormatElement> *tmpVec = new std::vector<MeshFormatElement>;
91 tmpVec->push_back(addToFamily.second);
92 aMap.insert(std::pair<int, std::vector<MeshFormatElement> *>(addToFamily.first, tmpVec));
97 void remove(std::pair<int, MeshFormatElement> removeFromFamily, int dimRelMax)
99 removePairFromMap(_meshFormatFams, removeFromFamily);
100 removePairFromMap(getMapAtLevel(dimRelMax), removeFromFamily);
104 void removePairFromMap(std::map<int, std::vector<MeshFormatElement> *> &aMap, const std::pair<int, MeshFormatElement> removeFromFamily)
109 std::map<int, std::vector<MeshFormatElement> *>::iterator itTmp = aMap.find(removeFromFamily.first);
110 if (itTmp == aMap.end())
114 std::vector<MeshFormatElement> *tmpVec2 = aMap[removeFromFamily.first];
115 #if __GNUC_PREREQ(4, 9)
116 std::vector<MeshFormatElement>::const_iterator itt2;
118 std::vector<MeshFormatElement>::iterator itt2;
120 const MeshFormatElement e = removeFromFamily.second;
121 itt2 = std::find(tmpVec2->begin(), tmpVec2->end(), e);
122 if (itt2 != tmpVec2->end())
123 tmpVec2->erase(itt2);
125 if (!tmpVec2->size())
128 aMap.erase(removeFromFamily.first);
134 std::map<int, std::vector<MeshFormatElement> *> &getMapAtLevel(int dimRelMax)
139 return _meshFormatFams_0;
142 return _meshFormatFams_1;
145 return _meshFormatFams_2;
148 return _meshFormatFamsNodes;
157 freeMap(_meshFormatFams);
158 freeMap(_meshFormatFams_0);
159 freeMap(_meshFormatFams_1);
160 freeMap(_meshFormatFams_2);
161 freeMap(_meshFormatFamsNodes);
165 void freeMap(std::map<int, std::vector<MeshFormatElement> *> &aMap)
167 std::map<int, std::vector<MeshFormatElement> *>::iterator it = aMap.begin();
168 for (; it != aMap.end(); ++it)
172 class MeshFormatReader
175 MEDLOADER_EXPORT MeshFormatReader();
176 MEDLOADER_EXPORT MeshFormatReader(const std::string &meshFileName, const std::vector<std::string> &fieldFileName);
177 MEDLOADER_EXPORT ~MeshFormatReader();
179 MEDLOADER_EXPORT MEDCoupling::MCAuto<MEDCoupling::MEDFileData> loadInMedFileDS();
180 MEDLOADER_EXPORT void setMeshName(const std::string &theMeshName);
181 MEDLOADER_EXPORT std::string getMeshName() const;
182 MEDLOADER_EXPORT void setFile(const std::string &theFileName);
183 MEDLOADER_EXPORT void setFieldFileNames(const std::vector<std::string> &theFieldFileNames);
184 MEDLOADER_EXPORT std::vector<std::string> getFieldFileNames() const;
185 MEDLOADER_EXPORT std::vector<std::string> getErroMessage() const;
188 MeshFormat::Status addMessage(const std::string &msg, const bool isFatal = false);
189 MeshFormat::Status perform();
190 MeshFormat::Status performFields();
191 MeshFormat::Status setNodes(MEDCoupling::DataArrayDouble *coordArray);
192 void setEdges(MEDCoupling::MEDCouplingUMesh *dimMesh1, int nbEdges);
193 void setTriangles(MEDCoupling::MEDCouplingUMesh *dimMesh2, int nbTria);
194 void setQuadrangles(MEDCoupling::MEDCouplingUMesh *dimMesh2, int nbQuad);
195 void setTetrahedras(MEDCoupling::MEDCouplingUMesh *dimMesh3, int nbTet);
196 void setPyramids(MEDCoupling::MEDCouplingUMesh *dimMesh3, int nbPyr);
197 void setHexahedras(MEDCoupling::MEDCouplingUMesh *dimMesh3, int nbHex);
198 void setPrisms(MEDCoupling::MEDCouplingUMesh *dimMesh3, int nbPrism);
199 void callParserGetLin(MeshFormat::GmfKwdCod kwd, double *val, int valSize, int *ref);
200 void setTypeOfFieldAndDimRel(MeshFormat::GmfKwdCod kwd, MEDCoupling::TypeOfField *typeOfField, int *dimRel);
201 void backward_shift(MEDCoupling::mcIdType *, int size);
202 void setFields(MeshFormat::GmfKwdCod kwd, int nmbSol, int nbComp);
203 INTERP_KERNEL::NormalizedCellType toMedType(MeshFormat::GmfKwdCod kwd);
204 void buildFamilies();
205 void buildNodesFamilies();
206 void buildCellsFamilies();
209 MeshFormat::MeshFormatParser _reader;
210 std::string _myCurrentOpenFile;
211 int _myCurrentFileId;
212 std::string _myMeshName;
213 std::vector<std::string> _myFieldFileNames;
215 std::vector<std::string> _myErrorMessages;
216 MeshFormat::Status _myStatus;
217 MEDCoupling::MCAuto<MEDCoupling::MEDFileData> _myMed;
218 MEDCoupling::MCAuto<MEDCoupling::MEDFileUMesh> _uMesh;
219 MEDCoupling::MCAuto<MEDCoupling::MEDFileFields> _fields;
220 // map id family --element
221 MeshFormatFamily _fams;
227 } // namespace MEDCoupling
228 #endif //MESHFORMATREADER_HXX