1 // Copyright (C) 2007-2012 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.
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 #include "MEDFileData.hxx"
22 using namespace ParaMEDMEM;
24 MEDFileData *MEDFileData::New(const char *fileName) throw(INTERP_KERNEL::Exception)
26 return new MEDFileData(fileName);
29 MEDFileData *MEDFileData::New()
31 return new MEDFileData;
34 MEDFileFields *MEDFileData::getFields() const
36 return const_cast<MEDFileFields *>(static_cast<const MEDFileFields *>(_fields));
39 MEDFileMeshes *MEDFileData::getMeshes() const
41 return const_cast<MEDFileMeshes *>(static_cast<const MEDFileMeshes *>(_meshes));
44 void MEDFileData::setFields(MEDFileFields *fields) throw(INTERP_KERNEL::Exception)
47 throw INTERP_KERNEL::Exception("MEDFileData::setFields : input pointer is null !");
52 void MEDFileData::setMeshes(MEDFileMeshes *meshes) throw(INTERP_KERNEL::Exception)
55 throw INTERP_KERNEL::Exception("MEDFileData::setMeshes : input pointer is null !");
60 int MEDFileData::getNumberOfFields() const throw(INTERP_KERNEL::Exception)
62 const MEDFileFields *f=_fields;
64 throw INTERP_KERNEL::Exception("MEDFileData::getNumberOfFields : no fields set !");
65 return f->getNumberOfFields();
68 int MEDFileData::getNumberOfMeshes() const throw(INTERP_KERNEL::Exception)
70 const MEDFileMeshes *m=_meshes;
72 throw INTERP_KERNEL::Exception("MEDFileData::getNumberOfMeshes : no meshes set !");
73 return m->getNumberOfMeshes();
76 std::string MEDFileData::simpleRepr() const
78 std::ostringstream oss;
79 oss << "(***************)\n(* MEDFileData *)\n(***************)\n\nFields part :\n*************\n\n";
80 const MEDFileFields *tmp=_fields;
83 tmp->simpleRepr(0,oss);
87 oss << "No fields set !!!\n\n";
88 oss << "Meshes part :\n*************\n\n";
89 const MEDFileMeshes *tmp2=_meshes;
92 tmp2->simpleReprWithoutHeader(oss);
95 oss << "No meshes set !!!\n";
99 bool MEDFileData::changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab) throw(INTERP_KERNEL::Exception)
102 MEDFileFields *fields=_fields;
104 ret=fields->changeMeshNames(modifTab) || ret;
105 MEDFileMeshes *meshes=_meshes;
107 ret=meshes->changeNames(modifTab) || ret;
111 bool MEDFileData::changeMeshName(const char *oldMeshName, const char *newMeshName) throw(INTERP_KERNEL::Exception)
113 std::string oldName(oldMeshName);
114 std::vector< std::pair<std::string,std::string> > v(1);
115 v[0].first=oldName; v[0].second=newMeshName;
116 return changeMeshNames(v);
120 * This method performs unpolyzation in meshes in \a this and if it leads to a modification to one or more than one meshes in \a this
121 * the fields are automatically renumbered (for those impacted, that is to say here fields on cells and fields on gauss points on impacted fields)
123 * \return If true is returned it means that some meshes in \a this has been modified and eventually fields have been renumbered.
124 * \n If false \a this remains unchanged.
126 bool MEDFileData::unPolyzeMeshes() throw(INTERP_KERNEL::Exception)
128 MEDFileMeshes *ms=_meshes;
132 std::vector< MEDFileMesh * > meshesImpacted;
133 std::vector< DataArrayInt * > renumParamsOfMeshImpacted;//same size as meshesImpacted
134 std::vector< std::vector<int> > oldCodeOfMeshImpacted,newCodeOfMeshImpacted;//same size as meshesImpacted
135 std::vector<MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > memSaverIfThrow;//same size as meshesImpacted
136 for(int i=0;i<ms->getNumberOfMeshes();i++)
138 MEDFileMesh *m=ms->getMeshAtPos(i);
141 std::vector<int> oldCode,newCode;
142 DataArrayInt *o2nRenumCell=0;
143 bool modif=m->unPolyze(oldCode,newCode,o2nRenumCell);
146 renumParamsOfMeshImpacted.push_back(o2nRenumCell); memSaverIfThrow.push_back(o2nRenumCell);
147 oldCodeOfMeshImpacted.push_back(oldCode);
148 newCodeOfMeshImpacted.push_back(newCode);
149 meshesImpacted.push_back(m);
152 if(!meshesImpacted.empty())
154 MEDFileFields *fs=_fields;
156 for(std::size_t i=0;i<meshesImpacted.size();i++)
157 fs->renumberEntitiesLyingOnMesh(meshesImpacted[i]->getName(),oldCodeOfMeshImpacted[i],newCodeOfMeshImpacted[i],renumParamsOfMeshImpacted[i]);
159 return !meshesImpacted.empty();
162 MEDFileData::MEDFileData()
166 MEDFileData::MEDFileData(const char *fileName) throw(INTERP_KERNEL::Exception)
169 _fields=MEDFileFields::New(fileName);
170 _meshes=MEDFileMeshes::New(fileName);
172 catch(INTERP_KERNEL::Exception& e)
177 void MEDFileData::write(const char *fileName, int mode) const throw(INTERP_KERNEL::Exception)
179 med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
180 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,medmod);
181 const MEDFileMeshes *ms=_meshes;
184 const MEDFileFields *fs=_fields;