1 // Copyright (C) 2007-2013 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
19 // Author : Anthony Geay (CEA/DEN)
21 #include "MEDFileField.hxx"
22 #include "MEDFileMesh.hxx"
23 #include "MEDLoaderBase.hxx"
24 #include "MEDFileUtilities.hxx"
26 #include "MEDCouplingFieldDouble.hxx"
27 #include "MEDCouplingFieldDiscretization.hxx"
29 #include "InterpKernelAutoPtr.hxx"
30 #include "CellModel.hxx"
35 extern med_geometry_type typmai[MED_N_CELL_FIXED_GEO];
36 extern INTERP_KERNEL::NormalizedCellType typmai2[MED_N_CELL_FIXED_GEO];
37 extern med_geometry_type typmainoeud[1];
38 extern med_geometry_type typmai3[32];
40 using namespace ParaMEDMEM;
42 const char MEDFileField1TSWithoutSDA::TYPE_STR[]="FLOAT64";
43 const char MEDFileIntField1TSWithoutSDA::TYPE_STR[]="INT32";
45 MEDFileFieldLoc *MEDFileFieldLoc::New(med_idt fid, const char *locName)
47 return new MEDFileFieldLoc(fid,locName);
50 MEDFileFieldLoc *MEDFileFieldLoc::New(med_idt fid, int id)
52 return new MEDFileFieldLoc(fid,id);
55 MEDFileFieldLoc *MEDFileFieldLoc::New(const char *locName, INTERP_KERNEL::NormalizedCellType geoType, const std::vector<double>& refCoo, const std::vector<double>& gsCoo, const std::vector<double>& w)
57 return new MEDFileFieldLoc(locName,geoType,refCoo,gsCoo,w);
60 MEDFileFieldLoc::MEDFileFieldLoc(med_idt fid, const char *locName):_name(locName)
62 med_geometry_type geotype;
63 med_geometry_type sectiongeotype;
65 INTERP_KERNEL::AutoPtr<char> geointerpname=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
66 INTERP_KERNEL::AutoPtr<char> sectionmeshname=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
67 MEDlocalizationInfoByName(fid,locName,&geotype,&_dim,&_nb_gauss_pt,geointerpname,sectionmeshname,&nsectionmeshcell,§iongeotype);
68 _geo_type=(INTERP_KERNEL::NormalizedCellType)(std::distance(typmai3,std::find(typmai3,typmai3+32,geotype)));
69 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
70 _nb_node_per_cell=cm.getNumberOfNodes();
71 _ref_coo.resize(_dim*_nb_node_per_cell);
72 _gs_coo.resize(_dim*_nb_gauss_pt);
73 _w.resize(_nb_gauss_pt);
74 MEDlocalizationRd(fid,locName,MED_FULL_INTERLACE,&_ref_coo[0],&_gs_coo[0],&_w[0]);
77 MEDFileFieldLoc::MEDFileFieldLoc(med_idt fid, int id)
79 med_geometry_type geotype;
80 med_geometry_type sectiongeotype;
82 INTERP_KERNEL::AutoPtr<char> locName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
83 INTERP_KERNEL::AutoPtr<char> geointerpname=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
84 INTERP_KERNEL::AutoPtr<char> sectionmeshname=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
85 MEDlocalizationInfo(fid,id+1,locName,&geotype,&_dim,&_nb_gauss_pt,geointerpname,sectionmeshname,&nsectionmeshcell,§iongeotype);
87 _geo_type=(INTERP_KERNEL::NormalizedCellType)(std::distance(typmai3,std::find(typmai3,typmai3+32,geotype)));
88 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
89 _nb_node_per_cell=cm.getNumberOfNodes();
90 _ref_coo.resize(_dim*_nb_node_per_cell);
91 _gs_coo.resize(_dim*_nb_gauss_pt);
92 _w.resize(_nb_gauss_pt);
93 MEDlocalizationRd(fid,locName,MED_FULL_INTERLACE,&_ref_coo[0],&_gs_coo[0],&_w[0]);
96 MEDFileFieldLoc::MEDFileFieldLoc(const char *locName, INTERP_KERNEL::NormalizedCellType geoType,
97 const std::vector<double>& refCoo, const std::vector<double>& gsCoo, const std::vector<double>& w):_name(locName),_geo_type(geoType),_ref_coo(refCoo),_gs_coo(gsCoo),
100 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
101 _dim=cm.getDimension();
102 _nb_node_per_cell=cm.getNumberOfNodes();
103 _nb_gauss_pt=_w.size();
106 MEDFileFieldLoc *MEDFileFieldLoc::deepCpy() const
108 return new MEDFileFieldLoc(*this);
111 std::size_t MEDFileFieldLoc::getHeapMemorySize() const
113 return (_ref_coo.capacity()+_gs_coo.capacity()+_w.capacity())*sizeof(double)+_name.capacity();
116 void MEDFileFieldLoc::simpleRepr(std::ostream& oss) const
118 static const char OFF7[]="\n ";
119 oss << "\"" << _name << "\"" << OFF7;
120 oss << "GeoType=" << INTERP_KERNEL::CellModel::GetCellModel(_geo_type).getRepr() << OFF7;
121 oss << "Dimension=" << _dim << OFF7;
122 oss << "Number of Gauss points=" << _nb_gauss_pt << OFF7;
123 oss << "Number of nodes per cell=" << _nb_node_per_cell << OFF7;
124 oss << "RefCoords="; std::copy(_ref_coo.begin(),_ref_coo.end(),std::ostream_iterator<double>(oss," ")); oss << OFF7;
125 oss << "Weights="; std::copy(_w.begin(),_w.end(),std::ostream_iterator<double>(oss," ")); oss << OFF7;
126 oss << "GaussPtsCoords="; std::copy(_gs_coo.begin(),_gs_coo.end(),std::ostream_iterator<double>(oss," ")); oss << std::endl;
129 void MEDFileFieldLoc::setName(const char *name)
134 bool MEDFileFieldLoc::isEqual(const MEDFileFieldLoc& other, double eps) const
136 if(_name!=other._name)
140 if(_nb_gauss_pt!=other._nb_gauss_pt)
142 if(_nb_node_per_cell!=other._nb_node_per_cell)
144 if(_geo_type!=other._geo_type)
146 if(MEDCouplingGaussLocalization::AreAlmostEqual(_ref_coo,other._ref_coo,eps))
148 if(MEDCouplingGaussLocalization::AreAlmostEqual(_gs_coo,other._gs_coo,eps))
150 if(MEDCouplingGaussLocalization::AreAlmostEqual(_w,other._w,eps))
156 void MEDFileFieldLoc::writeLL(med_idt fid) const
158 MEDlocalizationWr(fid,_name.c_str(),typmai3[(int)_geo_type],_dim,&_ref_coo[0],MED_FULL_INTERLACE,_nb_gauss_pt,&_gs_coo[0],&_w[0],MED_NO_INTERPOLATION,MED_NO_MESH_SUPPORT);
161 std::string MEDFileFieldLoc::repr() const
163 std::ostringstream oss; oss.precision(15);
164 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
165 oss << "Localization \"" << _name << "\" :\n" << " - Geometric Type : " << cm.getRepr();
166 oss << "\n - Dimension : " << _dim << "\n - Number of gauss points : ";
167 oss << _nb_gauss_pt << "\n - Number of nodes in cell : " << _nb_node_per_cell;
168 oss << "\n - Ref coords are : ";
169 int sz=_ref_coo.size();
172 int nbOfTuples=sz/_dim;
173 for(int i=0;i<nbOfTuples;i++)
176 for(int j=0;j<_dim;j++)
177 { oss << _ref_coo[i*_dim+j]; if(j!=_dim-1) oss << ", "; }
182 std::copy(_ref_coo.begin(),_ref_coo.end(),std::ostream_iterator<double>(oss," "));
183 oss << "\n - Gauss coords in reference element : ";
187 int nbOfTuples=sz/_dim;
188 for(int i=0;i<nbOfTuples;i++)
191 for(int j=0;j<_dim;j++)
192 { oss << _gs_coo[i*_dim+j]; if(j!=_dim-1) oss << ", "; }
197 std::copy(_gs_coo.begin(),_gs_coo.end(),std::ostream_iterator<double>(oss," "));
198 oss << "\n - Weights of Gauss coords are : "; std::copy(_w.begin(),_w.end(),std::ostream_iterator<double>(oss," "));
202 void MEDFileFieldPerMeshPerTypePerDisc::assignFieldNoProfile(int& start, int offset, int nbOfCells, const MEDCouplingFieldDouble *field, const DataArray *arrr, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
204 _type=field->getTypeOfField();
210 getOrCreateAndGetArray()->setContigPartOfSelectedValues2(_start,arrr,offset,offset+nbOfCells,1);
211 _end=_start+nbOfCells;
217 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr=field->getDiscretization()->getOffsetArr(field->getMesh());
218 const int *arrPtr=arr->getConstPointer();
219 getOrCreateAndGetArray()->setContigPartOfSelectedValues2(_start,arrr,arrPtr[offset],arrPtr[offset+nbOfCells],1);
220 _end=_start+(arrPtr[offset+nbOfCells]-arrPtr[offset]);
226 const MEDCouplingFieldDiscretization *disc=field->getDiscretization();
227 const MEDCouplingGaussLocalization& gsLoc=field->getGaussLocalization(_loc_id);
228 const MEDCouplingFieldDiscretizationGauss *disc2=dynamic_cast<const MEDCouplingFieldDiscretizationGauss *>(disc);
230 throw INTERP_KERNEL::Exception("assignFieldNoProfile : invalid call to this method ! Internal Error !");
231 const DataArrayInt *dai=disc2->getArrayOfDiscIds();
232 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> dai2=disc2->getOffsetArr(field->getMesh());
233 const int *dai2Ptr=dai2->getConstPointer();
234 int nbi=gsLoc.getWeights().size();
235 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da2=dai->selectByTupleId2(offset,offset+nbOfCells,1);
236 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da3=da2->getIdsEqual(_loc_id);
237 const int *da3Ptr=da3->getConstPointer();
238 if(da3->getNumberOfTuples()!=nbOfCells)
239 {//profile : for gauss even in NoProfile !!!
240 std::ostringstream oss; oss << "Pfl_" << nasc.getName() << "_" << INTERP_KERNEL::CellModel::GetCellModel(getGeoType()).getRepr() << "_" << _loc_id;
242 da3->setName(_profile.c_str());
243 glob.appendProfile(da3);
245 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da4=DataArrayInt::New();
246 _nval=da3->getNbOfElems();
247 da4->alloc(_nval*nbi,1);
248 int *da4Ptr=da4->getPointer();
249 for(int i=0;i<_nval;i++)
251 int ref=dai2Ptr[offset+da3Ptr[i]];
252 for(int j=0;j<nbi;j++)
255 std::ostringstream oss2; oss2 << "Loc_" << nasc.getName() << "_" << INTERP_KERNEL::CellModel::GetCellModel(getGeoType()).getRepr() << "_" << _loc_id;
256 _localization=oss2.str();
257 getOrCreateAndGetArray()->setContigPartOfSelectedValues(_start,arrr,da4);
258 _end=_start+_nval*nbi;
259 glob.appendLoc(_localization.c_str(),getGeoType(),gsLoc.getRefCoords(),gsLoc.getGaussCoords(),gsLoc.getWeights());
263 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::assignFieldNoProfile : not implemented yet for such discretization type of field !");
269 * Leaf method of field with profile assignement. This method is the most general one. No optimization is done here.
270 * \param [in] pflName input containing name of profile if any. 0 if no profile (except for GAUSS_PT where a no profile can hide a profile when splitted by loc_id).
271 * \param [in] multiTypePfl is the end user profile specified in high level API
272 * \param [in] idsInPfl is the selection into the \a multiTypePfl whole profile that corresponds to the current geometric type.
273 * \param [in] locIds is the profile needed to be created for MED file format. It can be null if all cells of current geometric type are fetched in \a multiTypePfl.
274 * \b WARNING if not null the MED file profile can be subdivided again in case of Gauss points.
275 * \param [in] mesh is the mesh coming from the MEDFileMesh instance in correspondance with the MEDFileField. The mesh inside the \a field is simply ignored.
277 void MEDFileFieldPerMeshPerTypePerDisc::assignFieldProfile(int& start, const DataArrayInt *multiTypePfl, const DataArrayInt *idsInPfl, DataArrayInt *locIds, int nbOfEltsInWholeMesh, const MEDCouplingFieldDouble *field, const DataArray *arrr, const MEDCouplingMesh *mesh, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
280 _type=field->getTypeOfField();
281 std::string pflName(multiTypePfl->getName());
282 std::ostringstream oss; oss << pflName;
283 if(_type!=ON_NODES) { const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(getGeoType()); oss << "_" << cm.getRepr(); } else { oss << "_NODE"; }
287 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::assignFieldProfile : existing profile with empty name !");
288 if(_type!=ON_GAUSS_PT)
290 locIds->setName(oss.str().c_str());
291 glob.appendProfile(locIds);
300 _nval=idsInPfl->getNumberOfTuples();
301 getOrCreateAndGetArray()->setContigPartOfSelectedValues2(_start,arrr,0,arrr->getNumberOfTuples(),1);
307 _nval=idsInPfl->getNumberOfTuples();
308 getOrCreateAndGetArray()->setContigPartOfSelectedValues(_start,arrr,idsInPfl);
314 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr=field->getDiscretization()->getOffsetArr(mesh);
315 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr2=arr->deltaShiftIndex();
316 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr3=arr2->selectByTupleId(multiTypePfl->begin(),multiTypePfl->end());
317 arr3->computeOffsets2();
318 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp=idsInPfl->buildExplicitArrByRanges(arr3);
319 int trueNval=tmp->getNumberOfTuples();
320 _nval=idsInPfl->getNumberOfTuples();
321 getOrCreateAndGetArray()->setContigPartOfSelectedValues(_start,arrr,tmp);
322 _end=_start+trueNval;
327 const MEDCouplingFieldDiscretizationGauss *disc2=dynamic_cast<const MEDCouplingFieldDiscretizationGauss *>(field->getDiscretization());
329 throw INTERP_KERNEL::Exception("addNewEntryIfNecessaryGauss : invalid call to this method ! Internal Error !");
330 const DataArrayInt *da1=disc2->getArrayOfDiscIds();
331 const MEDCouplingGaussLocalization& gsLoc=field->getGaussLocalization(_loc_id);
332 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da2=da1->selectByTupleId(idsInPfl->begin(),idsInPfl->end());
333 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da3=da2->getIdsEqual(_loc_id);
334 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da4=idsInPfl->selectByTupleId(da3->begin(),da3->end());
336 MEDCouplingAutoRefCountObjectPtr<MEDCouplingMesh> mesh2=mesh->buildPart(multiTypePfl->begin(),multiTypePfl->end());
337 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr=disc2->getOffsetArr(mesh2);
339 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp=DataArrayInt::New();
341 for(const int *pt=da4->begin();pt!=da4->end();pt++)
342 trueNval+=arr->getIJ(*pt+1,0)-arr->getIJ(*pt,0);
343 tmp->alloc(trueNval,1);
344 int *tmpPtr=tmp->getPointer();
345 for(const int *pt=da4->begin();pt!=da4->end();pt++)
346 for(int j=arr->getIJ(*pt,0);j<arr->getIJ(*pt+1,0);j++)
349 _nval=da4->getNumberOfTuples();
350 getOrCreateAndGetArray()->setContigPartOfSelectedValues(_start,arrr,tmp);
351 _end=_start+trueNval;
352 oss << "_loc_" << _loc_id;
355 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da5=locIds->selectByTupleId(da3->begin(),da3->end());
356 da5->setName(oss.str().c_str());
357 glob.appendProfile(da5);
362 if(da3->getNumberOfTuples()!=nbOfEltsInWholeMesh || !da3->isIdentity())
364 da3->setName(oss.str().c_str());
365 glob.appendProfile(da3);
369 std::ostringstream oss2; oss2 << "Loc_" << nasc.getName() << "_" << INTERP_KERNEL::CellModel::GetCellModel(getGeoType()).getRepr() << "_" << _loc_id;
370 _localization=oss2.str();
371 glob.appendLoc(_localization.c_str(),getGeoType(),gsLoc.getRefCoords(),gsLoc.getGaussCoords(),gsLoc.getWeights());
375 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::assignFieldProfile : not implemented yet for such discretization type of field !");
380 void MEDFileFieldPerMeshPerTypePerDisc::assignNodeFieldNoProfile(int& start, const MEDCouplingFieldDouble *field, const DataArray *arrr, MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
383 _nval=arrr->getNumberOfTuples();
384 getOrCreateAndGetArray()->setContigPartOfSelectedValues2(_start,arrr,0,_nval,1);
389 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerTypePerDisc::NewOnRead(MEDFileFieldPerMeshPerType *fath, TypeOfField type, int profileIt) throw(INTERP_KERNEL::Exception)
391 return new MEDFileFieldPerMeshPerTypePerDisc(fath,type,profileIt);
394 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerTypePerDisc::New(MEDFileFieldPerMeshPerType *fath, TypeOfField type, int locId)
396 return new MEDFileFieldPerMeshPerTypePerDisc(fath,type,locId,std::string());
399 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerTypePerDisc::New(const MEDFileFieldPerMeshPerTypePerDisc& other)
401 return new MEDFileFieldPerMeshPerTypePerDisc(other);
404 std::size_t MEDFileFieldPerMeshPerTypePerDisc::getHeapMemorySize() const
406 return _profile.capacity()+_localization.capacity()+5*sizeof(int);
409 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerTypePerDisc::deepCpy(MEDFileFieldPerMeshPerType *father) const throw(INTERP_KERNEL::Exception)
411 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> ret=new MEDFileFieldPerMeshPerTypePerDisc(*this);
416 MEDFileFieldPerMeshPerTypePerDisc::MEDFileFieldPerMeshPerTypePerDisc(MEDFileFieldPerMeshPerType *fath, TypeOfField atype, int profileIt) throw(INTERP_KERNEL::Exception)
417 try:_type(atype),_father(fath)
420 catch(INTERP_KERNEL::Exception& e)
425 MEDFileFieldPerMeshPerTypePerDisc::MEDFileFieldPerMeshPerTypePerDisc(MEDFileFieldPerMeshPerType *fath, TypeOfField type, int locId, const std::string& dummy):_type(type),_father(fath),_loc_id(locId)
429 MEDFileFieldPerMeshPerTypePerDisc::MEDFileFieldPerMeshPerTypePerDisc(const MEDFileFieldPerMeshPerTypePerDisc& other):_type(other._type),_father(0),_start(other._start),_end(other._end),_nval(other._nval),_profile(other._profile),_localization(other._localization),_loc_id(other._loc_id),_tmp_work1(other._tmp_work1)
433 MEDFileFieldPerMeshPerTypePerDisc::MEDFileFieldPerMeshPerTypePerDisc():_type(ON_CELLS),_father(0),_start(-std::numeric_limits<int>::max()),_end(-std::numeric_limits<int>::max()),
434 _nval(-std::numeric_limits<int>::max()),_loc_id(-std::numeric_limits<int>::max())
438 const MEDFileFieldPerMeshPerType *MEDFileFieldPerMeshPerTypePerDisc::getFather() const
443 void MEDFileFieldPerMeshPerTypePerDisc::loadOnlyStructureOfDataRecursively(med_idt fid, int profileIt, int& start, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
445 INTERP_KERNEL::AutoPtr<char> locname=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
446 INTERP_KERNEL::AutoPtr<char> pflname=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
447 std::string fieldName=nasc.getName();
448 std::string meshName=getMeshName();
449 int iteration=getIteration();
450 int order=getOrder();
451 TypeOfField type=getType();
452 INTERP_KERNEL::NormalizedCellType geoType=getGeoType();
454 med_geometry_type mgeoti;
455 med_entity_type menti=MEDFileFieldPerMeshPerType::ConvertIntoMEDFileType(type,geoType,mgeoti);
456 _nval=MEDfieldnValueWithProfile(fid,fieldName.c_str(),iteration,order,menti,mgeoti,profileIt,MED_COMPACT_PFLMODE,
457 pflname,&profilesize,locname,&nbi);
458 _profile=MEDLoaderBase::buildStringFromFortran(pflname,MED_NAME_SIZE);
459 _localization=MEDLoaderBase::buildStringFromFortran(locname,MED_NAME_SIZE);
461 _end=start+_nval*nbi;
463 if(type==ON_CELLS && !_localization.empty())
465 if(_localization!="MED_GAUSS_ELNO")//For compatibily with MED2.3
466 setType(ON_GAUSS_PT);
469 setType(ON_GAUSS_NE);
470 _localization.clear();
475 void MEDFileFieldPerMeshPerTypePerDisc::loadBigArray(med_idt fid, int profileIt, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
477 std::string fieldName=nasc.getName();
478 std::string meshName=getMeshName();
479 int iteration=getIteration();
480 int order=getOrder();
481 TypeOfField type=getType();
482 INTERP_KERNEL::NormalizedCellType geoType=getGeoType();
483 med_geometry_type mgeoti;
484 med_entity_type menti=MEDFileFieldPerMeshPerType::ConvertIntoMEDFileType(type,geoType,mgeoti);
486 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::loadBigArray : internal error in range !");
489 DataArray *arr=getOrCreateAndGetArray();//arr is not null due to the spec of getOrCreateAndGetArray
490 if(_start<0 || _start>=arr->getNumberOfTuples())
492 std::ostringstream oss; oss << "MEDFileFieldPerMeshPerTypePerDisc::loadBigArray : Invalid start ("<< _start << ") regarding admissible range of allocated array [0," << arr->getNumberOfTuples() << ") !";
493 throw INTERP_KERNEL::Exception(oss.str().c_str());
495 if(_end<0 || _end>arr->getNumberOfTuples())
497 std::ostringstream oss; oss << "MEDFileFieldPerMeshPerTypePerDisc::loadBigArray : Invalid start ("<< _start << ") regarding admissible range of allocated array [0," << arr->getNumberOfTuples() << "] !";
498 throw INTERP_KERNEL::Exception(oss.str().c_str());
501 INTERP_KERNEL::AutoPtr<char> locname=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
502 med_int nbValsInFile=MEDfieldnValueWithProfileByName(fid,fieldName.c_str(),iteration,order,menti,mgeoti,_profile.c_str(),MED_COMPACT_PFLMODE,&tmp1,locname,&nbi);
503 int nbOfCompo=arr->getNumberOfComponents();
504 if(_end-_start!=nbValsInFile*nbi)
506 std::ostringstream oss; oss << "MEDFileFieldPerMeshPerTypePerDisc::loadBigArray : The number of tuples to read is " << nbValsInFile << "*" << nbi << " (nb integration points) ! But in data structure it values " << _end-_start << " is expected !";
507 throw INTERP_KERNEL::Exception(oss.str().c_str());
509 DataArrayDouble *arrD=dynamic_cast<DataArrayDouble *>(arr);
512 double *startFeeding=arrD->getPointer()+_start*nbOfCompo;
513 MEDfieldValueWithProfileRd(fid,fieldName.c_str(),iteration,order,menti,mgeoti,MED_COMPACT_PFLMODE,
514 _profile.c_str(),MED_FULL_INTERLACE,MED_ALL_CONSTITUENT,reinterpret_cast<unsigned char*>(startFeeding));
517 DataArrayInt *arrI=dynamic_cast<DataArrayInt *>(arr);
520 int *startFeeding=arrI->getPointer()+_start*nbOfCompo;
521 MEDfieldValueWithProfileRd(fid,fieldName.c_str(),iteration,order,menti,mgeoti,MED_COMPACT_PFLMODE,
522 _profile.c_str(),MED_FULL_INTERLACE,MED_ALL_CONSTITUENT,reinterpret_cast<unsigned char*>(startFeeding));
525 throw INTERP_KERNEL::Exception("Error on array reading ! Unrecognized type of field ! Should be in FLOAT64 or INT32 !");
529 * Set a \c this->_start **and** \c this->_end keeping the same delta between the two.
531 void MEDFileFieldPerMeshPerTypePerDisc::setNewStart(int newValueOfStart) throw(INTERP_KERNEL::Exception)
533 int delta=_end-_start;
534 _start=newValueOfStart;
538 int MEDFileFieldPerMeshPerTypePerDisc::getIteration() const
540 return _father->getIteration();
543 int MEDFileFieldPerMeshPerTypePerDisc::getOrder() const
545 return _father->getOrder();
548 double MEDFileFieldPerMeshPerTypePerDisc::getTime() const
550 return _father->getTime();
553 std::string MEDFileFieldPerMeshPerTypePerDisc::getMeshName() const
555 return _father->getMeshName();
558 void MEDFileFieldPerMeshPerTypePerDisc::simpleRepr(int bkOffset, std::ostream& oss, int id) const
560 const char startLine[]=" ## ";
561 std::string startLine2(bkOffset,' ');
562 startLine2+=startLine;
563 MEDCouplingFieldDiscretization *tmp=MEDCouplingFieldDiscretization::New(_type);
564 oss << startLine2 << "Localization #" << id << "." << std::endl;
565 oss << startLine2 << " Type=" << tmp->getRepr() << "." << std::endl;
567 oss << startLine2 << " This type discretization lies on profile : \"" << _profile << "\" and on the following localization : \"" << _localization << "\"." << std::endl;
568 oss << startLine2 << " This type discretization has " << _end-_start << " tuples (start=" << _start << ", end=" << _end << ")." << std::endl;
569 oss << startLine2 << " This type discretization has " << (_end-_start)/_nval << " integration points." << std::endl;
572 TypeOfField MEDFileFieldPerMeshPerTypePerDisc::getType() const
577 void MEDFileFieldPerMeshPerTypePerDisc::fillTypesOfFieldAvailable(std::set<TypeOfField>& types) const throw(INTERP_KERNEL::Exception)
582 void MEDFileFieldPerMeshPerTypePerDisc::setType(TypeOfField newType)
587 INTERP_KERNEL::NormalizedCellType MEDFileFieldPerMeshPerTypePerDisc::getGeoType() const
589 return _father->getGeoType();
592 int MEDFileFieldPerMeshPerTypePerDisc::getNumberOfComponents() const
594 return _father->getNumberOfComponents();
597 int MEDFileFieldPerMeshPerTypePerDisc::getNumberOfTuples() const
602 DataArray *MEDFileFieldPerMeshPerTypePerDisc::getOrCreateAndGetArray()
604 return _father->getOrCreateAndGetArray();
607 const DataArray *MEDFileFieldPerMeshPerTypePerDisc::getOrCreateAndGetArray() const
609 const MEDFileFieldPerMeshPerType *fath=_father;
610 return fath->getOrCreateAndGetArray();
613 const std::vector<std::string>& MEDFileFieldPerMeshPerTypePerDisc::getInfo() const
615 return _father->getInfo();
618 std::string MEDFileFieldPerMeshPerTypePerDisc::getProfile() const
623 void MEDFileFieldPerMeshPerTypePerDisc::setProfile(const char *newPflName)
628 std::string MEDFileFieldPerMeshPerTypePerDisc::getLocalization() const
630 return _localization;
633 void MEDFileFieldPerMeshPerTypePerDisc::setLocalization(const char *newLocName)
635 _localization=newLocName;
638 void MEDFileFieldPerMeshPerTypePerDisc::changePflsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
640 for(std::vector< std::pair<std::vector<std::string>, std::string > >::const_iterator it2=mapOfModif.begin();it2!=mapOfModif.end();it2++)
642 if(std::find((*it2).first.begin(),(*it2).first.end(),_profile)!=(*it2).first.end())
644 _profile=(*it2).second;
650 void MEDFileFieldPerMeshPerTypePerDisc::changeLocsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
652 for(std::vector< std::pair<std::vector<std::string>, std::string > >::const_iterator it2=mapOfModif.begin();it2!=mapOfModif.end();it2++)
654 if(std::find((*it2).first.begin(),(*it2).first.end(),_localization)!=(*it2).first.end())
656 _localization=(*it2).second;
662 void MEDFileFieldPerMeshPerTypePerDisc::getFieldAtLevel(TypeOfField type, const MEDFileFieldGlobsReal *glob, std::vector< std::pair<int,int> >& dads, std::vector<const DataArrayInt *>& pfls, std::vector<int>& locs, std::vector<INTERP_KERNEL::NormalizedCellType>& geoTypes) const
666 dads.push_back(std::pair<int,int>(_start,_end));
667 geoTypes.push_back(getGeoType());
672 pfls.push_back(glob->getProfile(_profile.c_str()));
674 if(_localization.empty())
678 locs.push_back(glob->getLocalizationId(_localization.c_str()));
682 void MEDFileFieldPerMeshPerTypePerDisc::fillValues(int discId, int& startEntryId, std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const
684 entries[startEntryId]=std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int> ,std::pair<int,int> >(std::pair<INTERP_KERNEL::NormalizedCellType,int>(getGeoType(),discId),std::pair<int,int>(_start,_end));
688 void MEDFileFieldPerMeshPerTypePerDisc::writeLL(med_idt fid, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
690 TypeOfField type=getType();
691 INTERP_KERNEL::NormalizedCellType geoType=getGeoType();
692 med_geometry_type mgeoti;
693 med_entity_type menti=MEDFileFieldPerMeshPerType::ConvertIntoMEDFileType(type,geoType,mgeoti);
694 const DataArray *arr=getOrCreateAndGetArray();
696 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::writeLL : no array set !");
697 const DataArrayDouble *arrD=dynamic_cast<const DataArrayDouble *>(arr);
698 const DataArrayInt *arrI=dynamic_cast<const DataArrayInt *>(arr);
699 const unsigned char *locToWrite=0;
701 locToWrite=reinterpret_cast<const unsigned char *>(arrD->getConstPointer()+_start*arr->getNumberOfComponents());
703 locToWrite=reinterpret_cast<const unsigned char *>(arrI->getConstPointer()+_start*arr->getNumberOfComponents());
705 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::writeLL : not recognized type of values ! Supported are FLOAT64 and INT32 !");
706 MEDfieldValueWithProfileWr(fid,nasc.getName().c_str(),getIteration(),getOrder(),getTime(),menti,mgeoti,
707 MED_COMPACT_PFLMODE,_profile.c_str(),_localization.c_str(),MED_FULL_INTERLACE,MED_ALL_CONSTITUENT,_nval,
711 void MEDFileFieldPerMeshPerTypePerDisc::getCoarseData(TypeOfField& type, std::pair<int,int>& dad, std::string& pfl, std::string& loc) const throw(INTERP_KERNEL::Exception)
716 dad.first=_start; dad.second=_end;
720 * \param [in] codeOfMesh is of format returned by MEDCouplingUMesh::getDistributionOfTypes. And for each *i* oldCode[3*i+2] gives the position (MEDFileUMesh::PutInThirdComponentOfCodeOffset).
721 * This code corresponds to the distribution of types in the corresponding mesh.
722 * \param [out] ptToFill memory zone where the output will be stored.
723 * \return the size of data pushed into output param \a ptToFill
725 int MEDFileFieldPerMeshPerTypePerDisc::fillEltIdsFromCode(int offset, const std::vector<int>& codeOfMesh, const MEDFileFieldGlobsReal& glob, int *ptToFill) const throw(INTERP_KERNEL::Exception)
728 std::ostringstream oss;
729 std::size_t nbOfType=codeOfMesh.size()/3;
731 for(std::size_t i=0;i<nbOfType && found==-1;i++)
732 if(getGeoType()==(INTERP_KERNEL::NormalizedCellType)codeOfMesh[3*i])
736 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(getGeoType());
737 oss << "MEDFileFieldPerMeshPerTypePerDisc::fillEltIdsFromCode : not found geometric type " << cm.getRepr() << " in the referenced mesh of field !";
738 throw INTERP_KERNEL::Exception(oss.str().c_str());
743 if(_nval!=codeOfMesh[3*found+1])
745 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(getGeoType());
746 oss << "MEDFileFieldPerMeshPerTypePerDisc::fillEltIdsFromCode : for geometric type " << cm.getRepr() << " number of elt ids in mesh is equal to " << _nval;
747 oss << " whereas mesh has " << codeOfMesh[3*found+1] << " for this geometric type !";
748 throw INTERP_KERNEL::Exception(oss.str().c_str());
750 for(int ii=codeOfMesh[3*found+2];ii<codeOfMesh[3*found+2]+_nval;ii++)
755 const DataArrayInt *pfl=glob.getProfile(_profile.c_str());
756 if(pfl->getNumberOfTuples()!=_nval)
758 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(getGeoType());
759 oss << "MEDFileFieldPerMeshPerTypePerDisc::fillEltIdsFromCode : for geometric type " << cm.getRepr() << ", field is defined on profile \"" << _profile << "\" and size of profile is ";
761 oss << pfl->getNumberOfTuples() << " whereas the number of ids is set to " << _nval << " for this geometric type !";
762 throw INTERP_KERNEL::Exception(oss.str().c_str());
764 int offset2=codeOfMesh[3*found+2];
765 for(const int *pflId=pfl->begin();pflId!=pfl->end();pflId++)
767 if(*pflId<codeOfMesh[3*found+1])
768 *work++=offset2+*pflId;
774 int MEDFileFieldPerMeshPerTypePerDisc::fillTupleIds(int *ptToFill) const throw(INTERP_KERNEL::Exception)
776 for(int i=_start;i<_end;i++)
781 int MEDFileFieldPerMeshPerTypePerDisc::ConvertType(TypeOfField type, int locId) throw(INTERP_KERNEL::Exception)
792 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::ConvertType : not managed type of field !");
796 std::vector< std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> > MEDFileFieldPerMeshPerTypePerDisc::SplitPerDiscretization(const std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>& entries)
799 std::map<std::pair<std::string,TypeOfField>,int> m;
800 std::vector< std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> > ret;
801 for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator it=entries.begin();it!=entries.end();it++)
802 if(m.find(std::pair<std::string,TypeOfField>((*it)->getLocalization(),(*it)->getType()))==m.end())
803 m[std::pair<std::string,TypeOfField>((*it)->getLocalization(),(*it)->getType())]=id++;
805 for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator it=entries.begin();it!=entries.end();it++)
806 ret[m[std::pair<std::string,TypeOfField>((*it)->getLocalization(),(*it)->getType())]].push_back(*it);
811 * - \c this->_loc_id mutable attribute is used for elt id in mesh offsets.
813 * \param [in] offset the offset id used to take into account that \a result is not compulsary empty in input
814 * \param [in] entriesOnSameDisc some entries **on same localization** if not the result can be invalid. The _start and _end on them are relative to \a arr parameter.
815 * \param [in] explicitIdsInMesh ids in mesh of the considered chunk.
816 * \param [in] newCode one of the input parameter to explicit the new geo type dispatch (in classical format same than those asked by MEDFileFields::renumberEntitiesLyingOnMesh)
817 * \param [in,out] glob if necessary by the method, new profiles can be added to it
818 * \param [in,out] arr after the call of this method \a arr is renumbered to be compliant with added entries to \a result.
819 * \param [out] result All new entries will be appended on it.
820 * \return false if the configuration of renumbering leads to an unnecessary resplit of input \a entriesOnSameDisc. If not true is returned (the most general case !)
822 bool MEDFileFieldPerMeshPerTypePerDisc::RenumberChunks(int offset, const std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>& entriesOnSameDisc,
823 const DataArrayInt *explicitIdsInMesh,
824 const std::vector<int>& newCode,
825 MEDFileFieldGlobsReal& glob, DataArrayDouble *arr,
826 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >& result)
828 if(entriesOnSameDisc.empty())
830 TypeOfField type=entriesOnSameDisc[0]->getType();
831 int szEntities=0,szTuples=0;
832 for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator it=entriesOnSameDisc.begin();it!=entriesOnSameDisc.end();it++)
833 { szEntities+=(*it)->_nval; szTuples+=(*it)->_end-(*it)->_start; }
834 int nbi=szTuples/szEntities;
835 if(szTuples%szEntities!=0)
836 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::RenumberChunks : internal error the splitting into same dicretization failed !");
837 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> renumTuples=DataArrayInt::New(); renumTuples->alloc(szTuples,1);
838 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ranges=MEDCouplingUMesh::ComputeRangesFromTypeDistribution(newCode);
839 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > newGeoTypesPerChunk(entriesOnSameDisc.size());
840 std::vector< const DataArrayInt * > newGeoTypesPerChunk2(entriesOnSameDisc.size());
841 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > newGeoTypesPerChunk_bis(entriesOnSameDisc.size());
842 std::vector< const DataArrayInt * > newGeoTypesPerChunk3(entriesOnSameDisc.size());
843 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> newGeoTypesPerChunk4=DataArrayInt::New(); newGeoTypesPerChunk4->alloc(szEntities,nbi);
845 for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator it=entriesOnSameDisc.begin();it!=entriesOnSameDisc.end();it++,id++)
847 int startOfEltIdOfChunk=(*it)->_start;
848 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> newEltIds=explicitIdsInMesh->substr(startOfEltIdOfChunk,startOfEltIdOfChunk+(*it)->_nval);
849 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> rangeIdsForChunk=newEltIds->findRangeIdForEachTuple(ranges);
850 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> idsInRrangeForChunk=newEltIds->findIdInRangeForEachTuple(ranges);
852 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp=rangeIdsForChunk->duplicateEachTupleNTimes(nbi); rangeIdsForChunk->rearrange(nbi);
853 newGeoTypesPerChunk4->setPartOfValues1(tmp,(*it)->_tmp_work1-offset,(*it)->_tmp_work1+(*it)->_nval*nbi-offset,1,0,nbi,1);
855 newGeoTypesPerChunk[id]=rangeIdsForChunk; newGeoTypesPerChunk2[id]=rangeIdsForChunk;
856 newGeoTypesPerChunk_bis[id]=idsInRrangeForChunk; newGeoTypesPerChunk3[id]=idsInRrangeForChunk;
858 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> newGeoTypesEltIdsAllGather=DataArrayInt::Aggregate(newGeoTypesPerChunk2); newGeoTypesPerChunk.clear(); newGeoTypesPerChunk2.clear();
859 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> newGeoTypesEltIdsAllGather2=DataArrayInt::Aggregate(newGeoTypesPerChunk3); newGeoTypesPerChunk_bis.clear(); newGeoTypesPerChunk3.clear();
860 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> diffVals=newGeoTypesEltIdsAllGather->getDifferentValues();
861 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> renumEltIds=newGeoTypesEltIdsAllGather->buildPermArrPerLevel();
863 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> renumTupleIds=newGeoTypesPerChunk4->buildPermArrPerLevel();
865 MEDCouplingAutoRefCountObjectPtr<DataArrayDouble> arrPart=arr->substr(offset,offset+szTuples);
866 arrPart->renumberInPlace(renumTupleIds->begin());
867 arr->setPartOfValues1(arrPart,offset,offset+szTuples,1,0,arrPart->getNumberOfComponents(),1);
869 const int *idIt=diffVals->begin();
870 std::list<const MEDFileFieldPerMeshPerTypePerDisc *> li(entriesOnSameDisc.begin(),entriesOnSameDisc.end());
872 for(int i=0;i<diffVals->getNumberOfTuples();i++,idIt++)
874 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ids=newGeoTypesEltIdsAllGather->getIdsEqual(*idIt);
875 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> subIds=newGeoTypesEltIdsAllGather2->selectByTupleId(ids->begin(),ids->end());
876 int nbEntityElts=subIds->getNumberOfTuples();
878 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> eltToAdd=MEDFileFieldPerMeshPerTypePerDisc::
879 NewObjectOnSameDiscThanPool(type,(INTERP_KERNEL::NormalizedCellType)newCode[3*(*idIt)],subIds,!subIds->isIdentity() || nbEntityElts!=newCode[3*(*idIt)+1],nbi,
883 result.push_back(eltToAdd);
884 offset2+=nbEntityElts*nbi;
886 ret=ret || li.empty();
891 * \param [in] typeF type of field of new chunk
892 * \param [in] geoType the geometric type of the chunk
893 * \param [in] idsOfMeshElt the entity ids of mesh (cells or nodes) of the new chunk.
894 * \param [in] isPfl specifies if a profile is requested regarding size of \a idsOfMeshElt and the number of such entities regarding underlying mesh.
895 * \param [in] nbi number of integration points
896 * \param [in] offset The offset in the **global array of data**.
897 * \param [in,out] entriesOnSameDisc the pool **on the same discretization** inside which it will be attempted to find an existing entry corresponding exactly
898 * to the new chunk to create.
899 * \param [in,out] glob the global shared info that will be requested for existing profiles or to append a new profile if needed.
900 * \param [out] notInExisting If false the return newly allocated entry is not coming from \a entriesOnSameDisc. If true the output comes from copy of \a entriesOnSameDisc
901 * and corresponding entry erased from \a entriesOnSameDisc.
902 * \return a newly allocated chunk
904 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerTypePerDisc::NewObjectOnSameDiscThanPool(TypeOfField typeF, INTERP_KERNEL::NormalizedCellType geoType, DataArrayInt *idsOfMeshElt,
905 bool isPfl, int nbi, int offset,
906 std::list< const MEDFileFieldPerMeshPerTypePerDisc *>& entriesOnSameDisc,
907 MEDFileFieldGlobsReal& glob,
908 bool ¬InExisting) throw(INTERP_KERNEL::Exception)
910 int nbMeshEntities=idsOfMeshElt->getNumberOfTuples();
911 std::list< const MEDFileFieldPerMeshPerTypePerDisc *>::iterator it=entriesOnSameDisc.begin();
912 for(;it!=entriesOnSameDisc.end();it++)
914 if(((INTERP_KERNEL::NormalizedCellType)(*it)->_loc_id)==geoType && (*it)->_nval==nbMeshEntities)
918 if((*it)->_profile.empty())
921 if(!(*it)->_profile.empty())
923 const DataArrayInt *pfl=glob.getProfile((*it)->_profile.c_str());
924 if(pfl->isEqualWithoutConsideringStr(*idsOfMeshElt))
930 if(it==entriesOnSameDisc.end())
933 MEDFileFieldPerMeshPerTypePerDisc *ret=new MEDFileFieldPerMeshPerTypePerDisc;
935 ret->_loc_id=(int)geoType;
936 ret->_nval=nbMeshEntities;
938 ret->_end=ret->_start+ret->_nval*nbi;
941 idsOfMeshElt->setName(glob.createNewNameOfPfl().c_str());
942 glob.appendProfile(idsOfMeshElt);
943 ret->_profile=idsOfMeshElt->getName();
945 //tony treatment of localization
951 MEDFileFieldPerMeshPerTypePerDisc *ret=MEDFileFieldPerMeshPerTypePerDisc::New(*(*it));
952 ret->_loc_id=(int)geoType;
953 ret->setNewStart(offset);
954 entriesOnSameDisc.erase(it);
960 MEDFileFieldPerMeshPerType *MEDFileFieldPerMeshPerType::NewOnRead(med_idt fid, MEDFileFieldPerMesh *fath, TypeOfField type, INTERP_KERNEL::NormalizedCellType geoType, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
962 return new MEDFileFieldPerMeshPerType(fid,fath,type,geoType,nasc);
965 MEDFileFieldPerMeshPerType *MEDFileFieldPerMeshPerType::New(MEDFileFieldPerMesh *fath, INTERP_KERNEL::NormalizedCellType geoType) throw(INTERP_KERNEL::Exception)
967 return new MEDFileFieldPerMeshPerType(fath,geoType);
970 std::size_t MEDFileFieldPerMeshPerType::getHeapMemorySize() const
972 std::size_t ret=_field_pm_pt_pd.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc>);
973 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++)
974 ret+=(*it)->getHeapMemorySize();
978 MEDFileFieldPerMeshPerType *MEDFileFieldPerMeshPerType::deepCpy(MEDFileFieldPerMesh *father) const throw(INTERP_KERNEL::Exception)
980 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerType> ret=new MEDFileFieldPerMeshPerType(*this);
983 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++,i++)
985 if((const MEDFileFieldPerMeshPerTypePerDisc *)*it)
986 ret->_field_pm_pt_pd[i]=(*it)->deepCpy((MEDFileFieldPerMeshPerType *)ret);
991 void MEDFileFieldPerMeshPerType::assignFieldNoProfile(int& start, int offset, int nbOfCells, const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
993 std::vector<int> pos=addNewEntryIfNecessary(field,offset,nbOfCells);
994 for(std::vector<int>::const_iterator it=pos.begin();it!=pos.end();it++)
995 _field_pm_pt_pd[*it]->assignFieldNoProfile(start,offset,nbOfCells,field,arr,glob,nasc);
999 * This method is the most general one. No optimization is done here.
1000 * \param [in] multiTypePfl is the end user profile specified in high level API
1001 * \param [in] idsInPfl is the selection into the \a multiTypePfl whole profile that corresponds to the current geometric type.
1002 * \param [in] locIds is the profile needed to be created for MED file format. It can be null if all cells of current geometric type are fetched in \a multiTypePfl.
1003 * \b WARNING if not null the MED file profile can be subdivided again in case of Gauss points.
1004 * \param [in] nbOfEltsInWholeMesh nb of elts of type \a this->_geo_type in \b WHOLE mesh
1005 * \param [in] mesh is the mesh coming from the MEDFileMesh instance in correspondance with the MEDFileField. The mesh inside the \a field is simply ignored.
1007 void MEDFileFieldPerMeshPerType::assignFieldProfile(int& start, const DataArrayInt *multiTypePfl, const DataArrayInt *idsInPfl, DataArrayInt *locIds, int nbOfEltsInWholeMesh, const MEDCouplingFieldDouble *field, const DataArray *arr, const MEDCouplingMesh *mesh, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1009 std::vector<int> pos=addNewEntryIfNecessary(field,idsInPfl);
1010 for(std::vector<int>::const_iterator it=pos.begin();it!=pos.end();it++)
1011 _field_pm_pt_pd[*it]->assignFieldProfile(start,multiTypePfl,idsInPfl,locIds,nbOfEltsInWholeMesh,field,arr,mesh,glob,nasc);
1014 void MEDFileFieldPerMeshPerType::assignNodeFieldNoProfile(int& start, const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
1016 _field_pm_pt_pd.resize(1);
1017 _field_pm_pt_pd[0]=MEDFileFieldPerMeshPerTypePerDisc::New(this,ON_NODES,-3);
1018 _field_pm_pt_pd[0]->assignNodeFieldNoProfile(start,field,arr,glob);
1021 void MEDFileFieldPerMeshPerType::assignNodeFieldProfile(int& start, const DataArrayInt *pfl, const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1023 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> pfl2=pfl->deepCpy();
1025 _field_pm_pt_pd.resize(1);
1026 _field_pm_pt_pd[0]=MEDFileFieldPerMeshPerTypePerDisc::New(this,ON_NODES,-3);
1027 _field_pm_pt_pd[0]->assignFieldProfile(start,pfl,pfl2,pfl2,-1,field,arr,0,glob,nasc);//mesh is not requested so 0 is send.
1030 std::vector<int> MEDFileFieldPerMeshPerType::addNewEntryIfNecessary(const MEDCouplingFieldDouble *field, int offset, int nbOfCells) throw(INTERP_KERNEL::Exception)
1032 TypeOfField type=field->getTypeOfField();
1033 if(type!=ON_GAUSS_PT)
1035 int locIdToFind=MEDFileFieldPerMeshPerTypePerDisc::ConvertType(type,0);
1036 int sz=_field_pm_pt_pd.size();
1038 for(int j=0;j<sz && !found;j++)
1040 if(_field_pm_pt_pd[j]->getLocId()==locIdToFind)
1042 _field_pm_pt_pd[j]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1048 _field_pm_pt_pd.resize(sz+1);
1049 _field_pm_pt_pd[sz]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1051 std::vector<int> ret(1,0);
1056 std::vector<int> ret2=addNewEntryIfNecessaryGauss(field,offset,nbOfCells);
1057 int sz2=ret2.size();
1058 std::vector<int> ret3(sz2);
1060 for(int i=0;i<sz2;i++)
1062 int sz=_field_pm_pt_pd.size();
1063 int locIdToFind=ret2[i];
1065 for(int j=0;j<sz && !found;j++)
1067 if(_field_pm_pt_pd[j]->getLocId()==locIdToFind)
1069 _field_pm_pt_pd[j]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1076 _field_pm_pt_pd.resize(sz+1);
1077 _field_pm_pt_pd[sz]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1085 std::vector<int> MEDFileFieldPerMeshPerType::addNewEntryIfNecessaryGauss(const MEDCouplingFieldDouble *field, int offset, int nbOfCells) throw(INTERP_KERNEL::Exception)
1087 const MEDCouplingFieldDiscretization *disc=field->getDiscretization();
1088 const MEDCouplingFieldDiscretizationGauss *disc2=dynamic_cast<const MEDCouplingFieldDiscretizationGauss *>(disc);
1090 throw INTERP_KERNEL::Exception("addNewEntryIfNecessaryGauss : invalid call to this method ! Internal Error !");
1091 const DataArrayInt *da=disc2->getArrayOfDiscIds();
1093 throw INTERP_KERNEL::Exception("addNewEntryIfNecessaryGauss (no profile) : no localization ids per cell array available ! The input Gauss node field is maybe invalid !");
1094 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da2=da->selectByTupleId2(offset,offset+nbOfCells,1);
1095 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> retTmp=da2->getDifferentValues();
1096 if(retTmp->presenceOfValue(-1))
1097 throw INTERP_KERNEL::Exception("addNewEntryIfNecessaryGauss : some cells have no dicretization description !");
1098 std::vector<int> ret(retTmp->begin(),retTmp->end());
1102 std::vector<int> MEDFileFieldPerMeshPerType::addNewEntryIfNecessary(const MEDCouplingFieldDouble *field, const DataArrayInt *subCells) throw(INTERP_KERNEL::Exception)
1104 TypeOfField type=field->getTypeOfField();
1105 if(type!=ON_GAUSS_PT)
1107 int locIdToFind=MEDFileFieldPerMeshPerTypePerDisc::ConvertType(type,0);
1108 int sz=_field_pm_pt_pd.size();
1110 for(int j=0;j<sz && !found;j++)
1112 if(_field_pm_pt_pd[j]->getLocId()==locIdToFind)
1114 _field_pm_pt_pd[j]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1120 _field_pm_pt_pd.resize(sz+1);
1121 _field_pm_pt_pd[sz]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1123 std::vector<int> ret(1,0);
1128 std::vector<int> ret2=addNewEntryIfNecessaryGauss(field,subCells);
1129 int sz2=ret2.size();
1130 std::vector<int> ret3(sz2);
1132 for(int i=0;i<sz2;i++)
1134 int sz=_field_pm_pt_pd.size();
1135 int locIdToFind=ret2[i];
1137 for(int j=0;j<sz && !found;j++)
1139 if(_field_pm_pt_pd[j]->getLocId()==locIdToFind)
1141 _field_pm_pt_pd[j]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1148 _field_pm_pt_pd.resize(sz+1);
1149 _field_pm_pt_pd[sz]=MEDFileFieldPerMeshPerTypePerDisc::New(this,type,locIdToFind);
1157 std::vector<int> MEDFileFieldPerMeshPerType::addNewEntryIfNecessaryGauss(const MEDCouplingFieldDouble *field, const DataArrayInt *subCells) throw(INTERP_KERNEL::Exception)
1159 const MEDCouplingFieldDiscretization *disc=field->getDiscretization();
1160 const MEDCouplingFieldDiscretizationGauss *disc2=dynamic_cast<const MEDCouplingFieldDiscretizationGauss *>(disc);
1162 throw INTERP_KERNEL::Exception("addNewEntryIfNecessaryGauss : invalid call to this method ! Internal Error !");
1163 const DataArrayInt *da=disc2->getArrayOfDiscIds();
1165 throw INTERP_KERNEL::Exception("addNewEntryIfNecessaryGauss : no localization ids per cell array available ! The input Gauss node field is maybe invalid !");
1166 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da2=da->selectByTupleIdSafe(subCells->getConstPointer(),subCells->getConstPointer()+subCells->getNumberOfTuples());
1167 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> retTmp=da2->getDifferentValues();
1168 if(retTmp->presenceOfValue(-1))
1169 throw INTERP_KERNEL::Exception("addNewEntryIfNecessaryGauss : some cells have no dicretization description !");
1170 std::vector<int> ret(retTmp->begin(),retTmp->end());
1174 const MEDFileFieldPerMesh *MEDFileFieldPerMeshPerType::getFather() const
1179 void MEDFileFieldPerMeshPerType::getDimension(int& dim) const
1181 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
1182 int curDim=(int)cm.getDimension();
1183 dim=std::max(dim,curDim);
1186 void MEDFileFieldPerMeshPerType::fillTypesOfFieldAvailable(std::set<TypeOfField>& types) const throw(INTERP_KERNEL::Exception)
1188 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++)
1190 (*it)->fillTypesOfFieldAvailable(types);
1194 void MEDFileFieldPerMeshPerType::fillFieldSplitedByType(std::vector< std::pair<int,int> >& dads, std::vector<TypeOfField>& types, std::vector<std::string>& pfls, std::vector<std::string>& locs) const throw(INTERP_KERNEL::Exception)
1196 int sz=_field_pm_pt_pd.size();
1197 dads.resize(sz); types.resize(sz); pfls.resize(sz); locs.resize(sz);
1198 for(int i=0;i<sz;i++)
1200 _field_pm_pt_pd[i]->getCoarseData(types[i],dads[i],pfls[i],locs[i]);
1204 int MEDFileFieldPerMeshPerType::getIteration() const
1206 return _father->getIteration();
1209 int MEDFileFieldPerMeshPerType::getOrder() const
1211 return _father->getOrder();
1214 double MEDFileFieldPerMeshPerType::getTime() const
1216 return _father->getTime();
1219 std::string MEDFileFieldPerMeshPerType::getMeshName() const
1221 return _father->getMeshName();
1224 void MEDFileFieldPerMeshPerType::simpleRepr(int bkOffset, std::ostream& oss, int id) const
1226 const char startLine[]=" ## ";
1227 std::string startLine2(bkOffset,' ');
1228 std::string startLine3(startLine2);
1229 startLine3+=startLine;
1230 if(_geo_type!=INTERP_KERNEL::NORM_ERROR)
1232 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
1233 oss << startLine3 << "Entry geometry type #" << id << " is lying on geometry types " << cm.getRepr() << "." << std::endl;
1236 oss << startLine3 << "Entry geometry type #" << id << " is lying on NODES." << std::endl;
1237 oss << startLine3 << "Entry is defined on " << _field_pm_pt_pd.size() << " localizations." << std::endl;
1239 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++,i++)
1241 const MEDFileFieldPerMeshPerTypePerDisc *cur=(*it);
1243 cur->simpleRepr(bkOffset,oss,i);
1246 oss << startLine2 << " ## " << "Localization #" << i << " is empty !" << std::endl;
1251 void MEDFileFieldPerMeshPerType::getSizes(int& globalSz, int& nbOfEntries) const
1253 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++)
1255 globalSz+=(*it)->getNumberOfTuples();
1257 nbOfEntries+=(int)_field_pm_pt_pd.size();
1260 INTERP_KERNEL::NormalizedCellType MEDFileFieldPerMeshPerType::getGeoType() const
1266 int MEDFileFieldPerMeshPerType::getNumberOfComponents() const
1268 return _father->getNumberOfComponents();
1271 DataArray *MEDFileFieldPerMeshPerType::getOrCreateAndGetArray()
1273 return _father->getOrCreateAndGetArray();
1276 const DataArray *MEDFileFieldPerMeshPerType::getOrCreateAndGetArray() const
1278 const MEDFileFieldPerMesh *fath=_father;
1279 return fath->getOrCreateAndGetArray();
1282 const std::vector<std::string>& MEDFileFieldPerMeshPerType::getInfo() const
1284 return _father->getInfo();
1287 std::vector<std::string> MEDFileFieldPerMeshPerType::getPflsReallyUsed() const
1289 std::vector<std::string> ret;
1290 std::set<std::string> ret2;
1291 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it1=_field_pm_pt_pd.begin();it1!=_field_pm_pt_pd.end();it1++)
1293 std::string tmp=(*it1)->getProfile();
1295 if(ret2.find(tmp)==ret2.end())
1304 std::vector<std::string> MEDFileFieldPerMeshPerType::getLocsReallyUsed() const
1306 std::vector<std::string> ret;
1307 std::set<std::string> ret2;
1308 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it1=_field_pm_pt_pd.begin();it1!=_field_pm_pt_pd.end();it1++)
1310 std::string tmp=(*it1)->getLocalization();
1311 if(!tmp.empty() && tmp!=MED_GAUSS_ELNO)
1312 if(ret2.find(tmp)==ret2.end())
1321 std::vector<std::string> MEDFileFieldPerMeshPerType::getPflsReallyUsedMulti() const
1323 std::vector<std::string> ret;
1324 std::set<std::string> ret2;
1325 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it1=_field_pm_pt_pd.begin();it1!=_field_pm_pt_pd.end();it1++)
1327 std::string tmp=(*it1)->getProfile();
1334 std::vector<std::string> MEDFileFieldPerMeshPerType::getLocsReallyUsedMulti() const
1336 std::vector<std::string> ret;
1337 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it1=_field_pm_pt_pd.begin();it1!=_field_pm_pt_pd.end();it1++)
1339 std::string tmp=(*it1)->getLocalization();
1340 if(!tmp.empty() && tmp!=MED_GAUSS_ELNO)
1346 void MEDFileFieldPerMeshPerType::changePflsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
1348 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::iterator it1=_field_pm_pt_pd.begin();it1!=_field_pm_pt_pd.end();it1++)
1349 (*it1)->changePflsRefsNamesGen(mapOfModif);
1352 void MEDFileFieldPerMeshPerType::changeLocsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
1354 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::iterator it1=_field_pm_pt_pd.begin();it1!=_field_pm_pt_pd.end();it1++)
1355 (*it1)->changeLocsRefsNamesGen(mapOfModif);
1358 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerType::getLeafGivenLocId(int locId) throw(INTERP_KERNEL::Exception)
1360 if(_field_pm_pt_pd.empty())
1362 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
1363 std::ostringstream oss; oss << "MEDFileFieldPerMeshPerType::getLeafGivenLocId : no localizations for geotype \"" << cm.getRepr() << "\" !";
1364 throw INTERP_KERNEL::Exception(oss.str().c_str());
1366 if(locId>=0 && locId<(int)_field_pm_pt_pd.size())
1367 return _field_pm_pt_pd[locId];
1368 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
1369 std::ostringstream oss2; oss2 << "MEDFileFieldPerMeshPerType::getLeafGivenLocId : no such locId available (" << locId;
1370 oss2 << ") for geometric type \"" << cm.getRepr() << "\" It should be in [0," << _field_pm_pt_pd.size() << ") !";
1371 throw INTERP_KERNEL::Exception(oss2.str().c_str());
1372 return static_cast<MEDFileFieldPerMeshPerTypePerDisc*>(0);
1375 const MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerType::getLeafGivenLocId(int locId) const throw(INTERP_KERNEL::Exception)
1377 if(_field_pm_pt_pd.empty())
1379 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
1380 std::ostringstream oss; oss << "MEDFileFieldPerMeshPerType::getLeafGivenLocId : no localizations for geotype \"" << cm.getRepr() << "\" !";
1381 throw INTERP_KERNEL::Exception(oss.str().c_str());
1383 if(locId>=0 && locId<(int)_field_pm_pt_pd.size())
1384 return _field_pm_pt_pd[locId];
1385 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
1386 std::ostringstream oss2; oss2 << "MEDFileFieldPerMeshPerType::getLeafGivenLocId : no such locId available (" << locId;
1387 oss2 << ") for geometric type \"" << cm.getRepr() << "\" It should be in [0," << _field_pm_pt_pd.size() << ") !";
1388 throw INTERP_KERNEL::Exception(oss2.str().c_str());
1389 return static_cast<const MEDFileFieldPerMeshPerTypePerDisc*>(0);
1392 void MEDFileFieldPerMeshPerType::getFieldAtLevel(int meshDim, TypeOfField type, const MEDFileFieldGlobsReal *glob, std::vector< std::pair<int,int> >& dads, std::vector<const DataArrayInt *>& pfls, std::vector<int>& locs, std::vector<INTERP_KERNEL::NormalizedCellType>& geoTypes) const
1394 if(_geo_type!=INTERP_KERNEL::NORM_ERROR)
1396 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(_geo_type);
1397 if(meshDim!=(int)cm.getDimension())
1400 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++)
1401 (*it)->getFieldAtLevel(type,glob,dads,pfls,locs,geoTypes);
1404 void MEDFileFieldPerMeshPerType::fillValues(int& startEntryId, std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const
1407 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++,i++)
1409 (*it)->fillValues(i,startEntryId,entries);
1413 void MEDFileFieldPerMeshPerType::setLeaves(const std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerTypePerDisc > >& leaves) throw(INTERP_KERNEL::Exception)
1415 _field_pm_pt_pd=leaves;
1416 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++)
1417 (*it)->setFather(this);
1421 * \param [in,out] globalNum a global numbering counter for the renumbering.
1422 * \param [out] its - list of pair (start,stop) kept
1423 * \return bool - false if the type of field \a tof is not contained in \a this.
1425 bool MEDFileFieldPerMeshPerType::keepOnlySpatialDiscretization(TypeOfField tof, int &globalNum, std::vector< std::pair<int,int> >& its) throw(INTERP_KERNEL::Exception)
1428 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> > newPmPtPd;
1429 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++)
1430 if((*it)->getType()==tof)
1432 newPmPtPd.push_back(*it);
1433 std::pair<int,int> bgEnd; bgEnd.first=(*it)->getStart(); bgEnd.second=(*it)->getEnd();
1434 (*it)->setNewStart(globalNum);
1435 globalNum=(*it)->getEnd();
1436 its.push_back(bgEnd);
1440 _field_pm_pt_pd=newPmPtPd;
1444 MEDFileFieldPerMeshPerType::MEDFileFieldPerMeshPerType(MEDFileFieldPerMesh *fath, INTERP_KERNEL::NormalizedCellType geoType) throw(INTERP_KERNEL::Exception):_father(fath),_geo_type(geoType)
1448 MEDFileFieldPerMeshPerType::MEDFileFieldPerMeshPerType(med_idt fid, MEDFileFieldPerMesh *fath, TypeOfField type, INTERP_KERNEL::NormalizedCellType geoType, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception):_father(fath),_geo_type(geoType)
1450 INTERP_KERNEL::AutoPtr<char> pflName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
1451 INTERP_KERNEL::AutoPtr<char> locName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
1452 med_geometry_type mgeoti;
1453 med_entity_type menti=ConvertIntoMEDFileType(type,geoType,mgeoti);
1454 int nbProfiles=MEDfieldnProfile(fid,nasc.getName().c_str(),getIteration(),getOrder(),menti,mgeoti,pflName,locName);
1455 _field_pm_pt_pd.resize(nbProfiles);
1456 for(int i=0;i<nbProfiles;i++)
1458 _field_pm_pt_pd[i]=MEDFileFieldPerMeshPerTypePerDisc::NewOnRead(this,type,i+1);
1462 void MEDFileFieldPerMeshPerType::loadOnlyStructureOfDataRecursively(med_idt fid, int &start, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1465 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++,pflId++)
1467 (*it)->loadOnlyStructureOfDataRecursively(fid,pflId+1,start,nasc);//tony
1471 void MEDFileFieldPerMeshPerType::loadBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1474 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++,pflId++)
1476 (*it)->loadBigArray(fid,pflId+1,nasc);//tony
1480 void MEDFileFieldPerMeshPerType::writeLL(med_idt fid, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
1482 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++)
1484 (*it)->copyOptionsFrom(*this);
1485 (*it)->writeLL(fid,nasc);
1489 med_entity_type MEDFileFieldPerMeshPerType::ConvertIntoMEDFileType(TypeOfField ikType, INTERP_KERNEL::NormalizedCellType ikGeoType, med_geometry_type& medfGeoType)
1494 medfGeoType=typmai3[(int)ikGeoType];
1497 medfGeoType=MED_NONE;
1500 medfGeoType=typmai3[(int)ikGeoType];
1501 return MED_NODE_ELEMENT;
1503 medfGeoType=typmai3[(int)ikGeoType];
1506 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerType::ConvertIntoMEDFileType : unexpected entity type ! internal error");
1508 return MED_UNDEF_ENTITY_TYPE;
1511 MEDFileFieldPerMesh *MEDFileFieldPerMesh::NewOnRead(med_idt fid, MEDFileAnyTypeField1TSWithoutSDA *fath, int meshCsit, int meshIteration, int meshOrder, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1513 return new MEDFileFieldPerMesh(fid,fath,meshCsit,meshIteration,meshOrder,nasc);
1516 MEDFileFieldPerMesh *MEDFileFieldPerMesh::New(MEDFileAnyTypeField1TSWithoutSDA *fath, const MEDCouplingMesh *mesh)
1518 return new MEDFileFieldPerMesh(fath,mesh);
1521 std::size_t MEDFileFieldPerMesh::getHeapMemorySize() const
1523 std::size_t ret=_mesh_name.capacity()+_field_pm_pt.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType >);
1524 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1525 if((const MEDFileFieldPerMeshPerType *)*it)
1526 ret+=(*it)->getHeapMemorySize();
1530 MEDFileFieldPerMesh *MEDFileFieldPerMesh::deepCpy(MEDFileAnyTypeField1TSWithoutSDA *father) const throw(INTERP_KERNEL::Exception)
1532 MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > ret=new MEDFileFieldPerMesh(*this);
1533 ret->_father=father;
1535 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++,i++)
1537 if((const MEDFileFieldPerMeshPerType *)*it)
1538 ret->_field_pm_pt[i]=(*it)->deepCpy((MEDFileFieldPerMesh *)(ret));
1543 void MEDFileFieldPerMesh::simpleRepr(int bkOffset, std::ostream& oss, int id) const
1545 std::string startLine(bkOffset,' ');
1546 oss << startLine << "## Field part (" << id << ") lying on mesh \"" << _mesh_name << "\", Mesh iteration=" << _mesh_iteration << ". Mesh order=" << _mesh_order << "." << std::endl;
1547 oss << startLine << "## Field is defined on " << _field_pm_pt.size() << " types." << std::endl;
1549 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++,i++)
1551 const MEDFileFieldPerMeshPerType *cur=*it;
1553 cur->simpleRepr(bkOffset,oss,i);
1556 oss << startLine << " ## Entry geometry type #" << i << " is empty !" << std::endl;
1561 void MEDFileFieldPerMesh::copyTinyInfoFrom(const MEDCouplingMesh *mesh) throw(INTERP_KERNEL::Exception)
1563 _mesh_name=mesh->getName();
1564 mesh->getTime(_mesh_iteration,_mesh_order);
1567 void MEDFileFieldPerMesh::assignFieldNoProfileNoRenum(int& start, const std::vector<int>& code, const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1569 int nbOfTypes=code.size()/3;
1571 for(int i=0;i<nbOfTypes;i++)
1573 INTERP_KERNEL::NormalizedCellType type=(INTERP_KERNEL::NormalizedCellType)code[3*i];
1574 int nbOfCells=code[3*i+1];
1575 int pos=addNewEntryIfNecessary(type);
1576 _field_pm_pt[pos]->assignFieldNoProfile(start,offset,nbOfCells,field,arr,glob,nasc);
1582 * This method is the most general one. No optimization is done here.
1583 * \param [in] multiTypePfl is the end user profile specified in high level API
1584 * \param [in] code is the code of \a mesh[multiTypePfl] mesh. It is of size of number of different geometric types into \a mesh[multiTypePfl].
1585 * \param [in] code2 is the code of the \b WHOLE mesh on the same level. So all types in \a code are in \a code2.
1586 * \param [in] idsInPflPerType is the selection into the \a multiTypePfl whole profile that corresponds to the given geometric type. This vector is always 3 times smaller than \a code.
1587 * \param [in] idsPerType is a vector containing the profiles needed to be created for MED file format. \b WARNING these processed MED file profiles can be subdivided again in case of Gauss points.
1588 * \param [in] mesh is the mesh coming from the MEDFileMesh instance in correspondance with the MEDFileField. The mesh inside the \a field is simply ignored.
1590 void MEDFileFieldPerMesh::assignFieldProfile(int& start, const DataArrayInt *multiTypePfl, const std::vector<int>& code, const std::vector<int>& code2, const std::vector<DataArrayInt *>& idsInPflPerType, const std::vector<DataArrayInt *>& idsPerType, const MEDCouplingFieldDouble *field, const DataArray *arr, const MEDCouplingMesh *mesh, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1592 int nbOfTypes=code.size()/3;
1593 for(int i=0;i<nbOfTypes;i++)
1595 INTERP_KERNEL::NormalizedCellType type=(INTERP_KERNEL::NormalizedCellType)code[3*i];
1596 int pos=addNewEntryIfNecessary(type);
1597 DataArrayInt *pfl=0;
1599 pfl=idsPerType[code[3*i+2]];
1600 int nbOfTupes2=code2.size()/3;
1602 for(;found<nbOfTupes2;found++)
1603 if(code[3*i]==code2[3*found])
1605 if(found==nbOfTupes2)
1606 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::assignFieldProfile : internal problem ! Should never happen ! Please report bug to anthony.geay@cea.fr !");
1607 _field_pm_pt[pos]->assignFieldProfile(start,multiTypePfl,idsInPflPerType[i],pfl,code2[3*found+1],field,arr,mesh,glob,nasc);
1611 void MEDFileFieldPerMesh::assignNodeFieldNoProfile(int& start, const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
1613 int pos=addNewEntryIfNecessary(INTERP_KERNEL::NORM_ERROR);
1614 _field_pm_pt[pos]->assignNodeFieldNoProfile(start,field,arr,glob);
1617 void MEDFileFieldPerMesh::assignNodeFieldProfile(int& start, const DataArrayInt *pfl, const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1619 int pos=addNewEntryIfNecessary(INTERP_KERNEL::NORM_ERROR);
1620 _field_pm_pt[pos]->assignNodeFieldProfile(start,pfl,field,arr,glob,nasc);
1623 void MEDFileFieldPerMesh::loadOnlyStructureOfDataRecursively(med_idt fid, int& start, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1625 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1626 (*it)->loadOnlyStructureOfDataRecursively(fid,start,nasc);
1629 void MEDFileFieldPerMesh::loadBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
1631 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1632 (*it)->loadBigArraysRecursively(fid,nasc);
1635 void MEDFileFieldPerMesh::writeLL(med_idt fid, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
1637 int nbOfTypes=_field_pm_pt.size();
1638 for(int i=0;i<nbOfTypes;i++)
1640 _field_pm_pt[i]->copyOptionsFrom(*this);
1641 _field_pm_pt[i]->writeLL(fid,nasc);
1645 void MEDFileFieldPerMesh::getDimension(int& dim) const
1647 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1648 (*it)->getDimension(dim);
1651 void MEDFileFieldPerMesh::fillTypesOfFieldAvailable(std::set<TypeOfField>& types) const throw(INTERP_KERNEL::Exception)
1653 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1654 (*it)->fillTypesOfFieldAvailable(types);
1657 std::vector< std::vector< std::pair<int,int> > > MEDFileFieldPerMesh::getFieldSplitedByType(std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> > & locs) const throw(INTERP_KERNEL::Exception)
1659 int sz=_field_pm_pt.size();
1660 std::vector< std::vector<std::pair<int,int> > > ret(sz);
1661 types.resize(sz); typesF.resize(sz); pfls.resize(sz); locs.resize(sz);
1662 for(int i=0;i<sz;i++)
1664 types[i]=_field_pm_pt[i]->getGeoType();
1665 _field_pm_pt[i]->fillFieldSplitedByType(ret[i],typesF[i],pfls[i],locs[i]);
1670 double MEDFileFieldPerMesh::getTime() const
1673 return _father->getTime(tmp1,tmp2);
1676 int MEDFileFieldPerMesh::getIteration() const
1678 return _father->getIteration();
1681 int MEDFileFieldPerMesh::getOrder() const
1683 return _father->getOrder();
1686 int MEDFileFieldPerMesh::getNumberOfComponents() const
1688 return _father->getNumberOfComponents();
1691 DataArray *MEDFileFieldPerMesh::getOrCreateAndGetArray()
1694 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::getOrCreateAndGetArray : no father ! internal error !");
1695 return _father->getOrCreateAndGetArray();
1698 const DataArray *MEDFileFieldPerMesh::getOrCreateAndGetArray() const
1701 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::getOrCreateAndGetArray : no father ! internal error !");
1702 return _father->getOrCreateAndGetArray();
1705 const std::vector<std::string>& MEDFileFieldPerMesh::getInfo() const
1707 return _father->getInfo();
1711 * type,geoTypes,dads,pfls,locs are input parameters. They should have the same size.
1712 * Before the call of this method 'geoTypes','dads','pfls','locs' must be reorganized so that types in geoTypes are contiguous and ordered following typmai2 array.
1713 * It returns 2 output vectors :
1714 * - 'code' of size 3*sz where sz is the number of different values into 'geoTypes'
1715 * - 'notNullPfls' contains sz2 values that are extracted from 'pfls' in which null profiles have been removed.
1716 * 'code' and 'notNullPfls' are in MEDCouplingUMesh::checkTypeConsistencyAndContig format.
1718 void MEDFileFieldPerMesh::SortArraysPerType(const MEDFileFieldGlobsReal *glob, TypeOfField type, const std::vector<INTERP_KERNEL::NormalizedCellType>& geoTypes, const std::vector< std::pair<int,int> >& dads, const std::vector<const DataArrayInt *>& pfls, const std::vector<int>& locs, std::vector<int>& code, std::vector<DataArrayInt *>& notNullPfls)
1720 int notNullPflsSz=0;
1721 int nbOfArrs=geoTypes.size();
1722 for(int i=0;i<nbOfArrs;i++)
1725 std::set<INTERP_KERNEL::NormalizedCellType> geoTypes3(geoTypes.begin(),geoTypes.end());
1726 int nbOfDiffGeoTypes=geoTypes3.size();
1727 code.resize(3*nbOfDiffGeoTypes);
1728 notNullPfls.resize(notNullPflsSz);
1731 for(int i=0;i<nbOfDiffGeoTypes;i++)
1734 INTERP_KERNEL::NormalizedCellType refType=geoTypes[j];
1735 std::vector<const DataArrayInt *> notNullTmp;
1737 notNullTmp.push_back(pfls[j]);
1739 for(;j<nbOfArrs;j++)
1740 if(geoTypes[j]==refType)
1743 notNullTmp.push_back(pfls[j]);
1747 std::vector< std::pair<int,int> > tmpDads(dads.begin()+startZone,dads.begin()+j);
1748 std::vector<const DataArrayInt *> tmpPfls(pfls.begin()+startZone,pfls.begin()+j);
1749 std::vector<int> tmpLocs(locs.begin()+startZone,locs.begin()+j);
1750 code[3*i]=(int)refType;
1751 std::vector<INTERP_KERNEL::NormalizedCellType> refType2(1,refType);
1752 code[3*i+1]=ComputeNbOfElems(glob,type,refType2,tmpDads,tmpLocs);
1753 if(notNullTmp.empty())
1757 notNullPfls[notNullPflsSz]=DataArrayInt::Aggregate(notNullTmp);
1758 code[3*i+2]=notNullPflsSz++;
1764 * 'dads' 'geoTypes' and 'locs' are input parameters that should have same size sz. sz should be >=1.
1766 int MEDFileFieldPerMesh::ComputeNbOfElems(const MEDFileFieldGlobsReal *glob, TypeOfField type, const std::vector<INTERP_KERNEL::NormalizedCellType>& geoTypes, const std::vector< std::pair<int,int> >& dads, const std::vector<int>& locs) throw(INTERP_KERNEL::Exception)
1770 for(int i=0;i<sz;i++)
1774 if(type!=ON_GAUSS_NE)
1775 ret+=dads[i].second-dads[i].first;
1778 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(geoTypes[i]);
1779 ret+=(dads[i].second-dads[i].first)/cm.getNumberOfNodes();
1784 int nbOfGaussPtPerCell=glob->getNbOfGaussPtPerCell(locs[i]);
1785 ret+=(dads[i].second-dads[i].first)/nbOfGaussPtPerCell;
1791 std::vector<std::string> MEDFileFieldPerMesh::getPflsReallyUsed() const
1793 std::vector<std::string> ret;
1794 std::set<std::string> ret2;
1795 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1797 std::vector<std::string> tmp=(*it)->getPflsReallyUsed();
1798 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
1799 if(ret2.find(*it2)==ret2.end())
1801 ret.push_back(*it2);
1808 std::vector<std::string> MEDFileFieldPerMesh::getPflsReallyUsedMulti() const
1810 std::vector<std::string> ret;
1811 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1813 std::vector<std::string> tmp=(*it)->getPflsReallyUsedMulti();
1814 ret.insert(ret.end(),tmp.begin(),tmp.end());
1819 std::vector<std::string> MEDFileFieldPerMesh::getLocsReallyUsed() const
1821 std::vector<std::string> ret;
1822 std::set<std::string> ret2;
1823 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1825 std::vector<std::string> tmp=(*it)->getLocsReallyUsed();
1826 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
1827 if(ret2.find(*it2)==ret2.end())
1829 ret.push_back(*it2);
1836 std::vector<std::string> MEDFileFieldPerMesh::getLocsReallyUsedMulti() const
1838 std::vector<std::string> ret;
1839 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1841 std::vector<std::string> tmp=(*it)->getLocsReallyUsedMulti();
1842 ret.insert(ret.end(),tmp.begin(),tmp.end());
1847 bool MEDFileFieldPerMesh::changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab) throw(INTERP_KERNEL::Exception)
1849 for(std::vector< std::pair<std::string,std::string> >::const_iterator it=modifTab.begin();it!=modifTab.end();it++)
1851 if((*it).first==_mesh_name)
1853 _mesh_name=(*it).second;
1860 bool MEDFileFieldPerMesh::renumberEntitiesLyingOnMesh(const char *meshName, const std::vector<int>& oldCode, const std::vector<int>& newCode, const DataArrayInt *renumO2N,
1861 MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
1863 if(_mesh_name!=meshName)
1865 std::set<INTERP_KERNEL::NormalizedCellType> typesToKeep;
1866 for(std::size_t i=0;i<oldCode.size()/3;i++) typesToKeep.insert((INTERP_KERNEL::NormalizedCellType)oldCode[3*i]);
1867 std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > > entries;
1868 std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> entriesKept;
1869 std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> otherEntries;
1870 getUndergroundDataArrayExt(entries);
1871 DataArray *arr0=getOrCreateAndGetArray();//tony
1873 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::renumberEntitiesLyingOnMesh : DataArray storing values of field is null !");
1874 DataArrayDouble *arr=dynamic_cast<DataArrayDouble *>(arr0);//tony
1876 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::renumberEntitiesLyingOnMesh : DataArray storing values is double ! Not managed for the moment !");
1879 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::renumberEntitiesLyingOnMesh : DataArrayDouble storing values of field is null !");
1880 for(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >::const_iterator it=entries.begin();it!=entries.end();it++)
1882 if(typesToKeep.find((*it).first.first)!=typesToKeep.end())
1884 entriesKept.push_back(getLeafGivenTypeAndLocId((*it).first.first,(*it).first.second));
1885 sz+=(*it).second.second-(*it).second.first;
1888 otherEntries.push_back(getLeafGivenTypeAndLocId((*it).first.first,(*it).first.second));
1890 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> renumDefrag=DataArrayInt::New(); renumDefrag->alloc(arr->getNumberOfTuples(),1); renumDefrag->fillWithZero();
1891 ////////////////////
1892 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> explicitIdsOldInMesh=DataArrayInt::New(); explicitIdsOldInMesh->alloc(sz,1);//sz is a majorant of the real size. A realloc will be done after
1893 int *workI2=explicitIdsOldInMesh->getPointer();
1894 int sz1=0,sz2=0,sid=1;
1895 std::vector< std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> > entriesKeptML=MEDFileFieldPerMeshPerTypePerDisc::SplitPerDiscretization(entriesKept);
1896 // std::vector<int> tupleIdOfStartOfNewChuncksV(entriesKeptML.size());
1897 for(std::vector< std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> >::const_iterator itL1=entriesKeptML.begin();itL1!=entriesKeptML.end();itL1++,sid++)
1899 // tupleIdOfStartOfNewChuncksV[sid-1]=sz2;
1900 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> explicitIdsOldInArr=DataArrayInt::New(); explicitIdsOldInArr->alloc(sz,1);
1901 int *workI=explicitIdsOldInArr->getPointer();
1902 for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator itL2=(*itL1).begin();itL2!=(*itL1).end();itL2++)
1904 int delta1=(*itL2)->fillTupleIds(workI); workI+=delta1; sz1+=delta1;
1905 (*itL2)->setLocId(sz2);
1906 (*itL2)->_tmp_work1=(*itL2)->getStart();
1907 int delta2=(*itL2)->fillEltIdsFromCode(sz2,oldCode,glob,workI2); workI2+=delta2; sz2+=delta2;
1909 renumDefrag->setPartOfValuesSimple3(sid,explicitIdsOldInArr->begin(),explicitIdsOldInArr->end(),0,1,1);
1911 explicitIdsOldInMesh->reAlloc(sz2);
1912 int tupleIdOfStartOfNewChuncks=arr->getNumberOfTuples()-sz2;
1913 ////////////////////
1914 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> permArrDefrag=renumDefrag->buildPermArrPerLevel(); renumDefrag=0;
1915 // perform redispatching of non concerned MEDFileFieldPerMeshPerTypePerDisc
1916 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> > otherEntriesNew;
1917 for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator it=otherEntries.begin();it!=otherEntries.end();it++)
1919 otherEntriesNew.push_back(MEDFileFieldPerMeshPerTypePerDisc::New(*(*it)));
1920 otherEntriesNew.back()->setNewStart(permArrDefrag->getIJ((*it)->getStart(),0));
1921 otherEntriesNew.back()->setLocId((*it)->getGeoType());
1923 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> > entriesKeptNew;
1924 std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> entriesKeptNew2;
1925 for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator it=entriesKept.begin();it!=entriesKept.end();it++)
1927 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerTypePerDisc> elt=MEDFileFieldPerMeshPerTypePerDisc::New(*(*it));
1928 int newStart=elt->getLocId();
1929 elt->setLocId((*it)->getGeoType());
1930 elt->setNewStart(newStart);
1931 elt->_tmp_work1=permArrDefrag->getIJ(elt->_tmp_work1,0);
1932 entriesKeptNew.push_back(elt);
1933 entriesKeptNew2.push_back(elt);
1935 MEDCouplingAutoRefCountObjectPtr<DataArrayDouble> arr2=arr->renumber(permArrDefrag->getConstPointer());
1936 // perform redispatching of concerned MEDFileFieldPerMeshPerTypePerDisc -> values are in arr2
1937 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> explicitIdsNewInMesh=renumO2N->selectByTupleId(explicitIdsOldInMesh->begin(),explicitIdsOldInMesh->end());
1938 std::vector< std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> > entriesKeptPerDisc=MEDFileFieldPerMeshPerTypePerDisc::SplitPerDiscretization(entriesKeptNew2);
1940 for(std::vector< std::vector< const MEDFileFieldPerMeshPerTypePerDisc *> >::const_iterator it4=entriesKeptPerDisc.begin();it4!=entriesKeptPerDisc.end();it4++)
1943 /*for(std::vector< const MEDFileFieldPerMeshPerTypePerDisc *>::const_iterator itL2=(*it4).begin();itL2!=(*it4).end();itL2++)
1945 MEDFileFieldPerMeshPerTypePerDisc *curNC=const_cast<MEDFileFieldPerMeshPerTypePerDisc *>(*itL2);
1946 curNC->setNewStart(permArrDefrag->getIJ((*itL2)->getStart(),0)-tupleIdOfStartOfNewChuncks+tupleIdOfStartOfNewChuncksV[sid]);
1948 ret=MEDFileFieldPerMeshPerTypePerDisc::RenumberChunks(tupleIdOfStartOfNewChuncks,*it4,explicitIdsNewInMesh,newCode,
1949 glob,arr2,otherEntriesNew) || ret;
1953 // Assign new dispatching
1954 assignNewLeaves(otherEntriesNew);
1955 arr->cpyFrom(*arr2);
1960 * \param [in,out] globalNum a global numbering counter for the renumbering.
1961 * \param [out] its - list of pair (start,stop) kept
1963 void MEDFileFieldPerMesh::keepOnlySpatialDiscretization(TypeOfField tof, int &globalNum, std::vector< std::pair<int,int> >& its) throw(INTERP_KERNEL::Exception)
1965 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > > ret;
1966 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1968 std::vector< std::pair<int,int> > its2;
1969 if((*it)->keepOnlySpatialDiscretization(tof,globalNum,its2))
1972 its.insert(its.end(),its2.begin(),its2.end());
1978 void MEDFileFieldPerMesh::assignNewLeaves(const std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerTypePerDisc > >& leaves) throw(INTERP_KERNEL::Exception)
1980 std::map<INTERP_KERNEL::NormalizedCellType,std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerTypePerDisc> > > types;
1981 for( std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerTypePerDisc > >::const_iterator it=leaves.begin();it!=leaves.end();it++)
1982 types[(INTERP_KERNEL::NormalizedCellType)(*it)->getLocId()].push_back(*it);
1984 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > > fieldPmPt(types.size());
1985 std::map<INTERP_KERNEL::NormalizedCellType,std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerTypePerDisc> > >::const_iterator it1=types.begin();
1986 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it2=fieldPmPt.begin();
1987 for(;it1!=types.end();it1++,it2++)
1989 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldPerMeshPerType> elt=MEDFileFieldPerMeshPerType::New(this,(INTERP_KERNEL::NormalizedCellType)((*it1).second[0]->getLocId()));
1990 elt->setLeaves((*it1).second);
1993 _field_pm_pt=fieldPmPt;
1996 void MEDFileFieldPerMesh::changePflsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
1998 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
1999 (*it)->changePflsRefsNamesGen(mapOfModif);
2002 void MEDFileFieldPerMesh::changeLocsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
2004 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2005 (*it)->changeLocsRefsNamesGen(mapOfModif);
2009 * \param [in] mesh is the whole mesh
2011 MEDCouplingFieldDouble *MEDFileFieldPerMesh::getFieldOnMeshAtLevel(TypeOfField type, const MEDFileFieldGlobsReal *glob, const MEDCouplingMesh *mesh, bool& isPfl, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
2013 if(_field_pm_pt.empty())
2014 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::getFieldOnMeshAtLevel : no types field set !");
2016 std::vector< std::pair<int,int> > dads;
2017 std::vector<const DataArrayInt *> pfls;
2018 std::vector<DataArrayInt *> notNullPflsPerGeoType;
2019 std::vector<int> locs,code;
2020 std::vector<INTERP_KERNEL::NormalizedCellType> geoTypes;
2021 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2022 (*it)->getFieldAtLevel(mesh->getMeshDimension(),type,glob,dads,pfls,locs,geoTypes);
2024 SortArraysPerType(glob,type,geoTypes,dads,pfls,locs,code,notNullPflsPerGeoType);
2027 std::ostringstream oss; oss << "MEDFileFieldPerMesh::getFieldOnMeshAtLevel : " << "The field \"" << nasc.getName() << "\" exists but not with such spatial discretization or such dimension specified !";
2028 throw INTERP_KERNEL::Exception(oss.str().c_str());
2031 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > notNullPflsPerGeoType2(notNullPflsPerGeoType.begin(),notNullPflsPerGeoType.end());
2032 std::vector< const DataArrayInt *> notNullPflsPerGeoType3(notNullPflsPerGeoType.begin(),notNullPflsPerGeoType.end());
2035 DataArrayInt *arr=mesh->checkTypeConsistencyAndContig(code,notNullPflsPerGeoType3);
2037 return finishField(type,glob,dads,locs,mesh,isPfl,arrOut,nasc);
2040 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr2(arr);
2041 return finishField2(type,glob,dads,locs,geoTypes,mesh,arr,isPfl,arrOut,nasc);
2047 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::getFieldOnMeshAtLevel : internal error #1 !");
2051 if(nb!=mesh->getNumberOfNodes())
2053 std::ostringstream oss; oss << "MEDFileFieldPerMesh::getFieldOnMeshAtLevel : There is a problem there is " << nb << " nodes in field whereas there is " << mesh->getNumberOfNodes();
2054 oss << " nodes in mesh !";
2055 throw INTERP_KERNEL::Exception(oss.str().c_str());
2057 return finishField(type,glob,dads,locs,mesh,isPfl,arrOut,nasc);
2060 return finishFieldNode2(glob,dads,locs,mesh,notNullPflsPerGeoType3[0],isPfl,arrOut,nasc);
2064 DataArray *MEDFileFieldPerMesh::getFieldOnMeshAtLevelWithPfl(TypeOfField type, const MEDCouplingMesh *mesh, DataArrayInt *&pfl, const MEDFileFieldGlobsReal *glob, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
2066 if(_field_pm_pt.empty())
2067 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::getFieldOnMeshAtLevel : no types field set !");
2069 std::vector<std::pair<int,int> > dads;
2070 std::vector<const DataArrayInt *> pfls;
2071 std::vector<DataArrayInt *> notNullPflsPerGeoType;
2072 std::vector<int> locs,code;
2073 std::vector<INTERP_KERNEL::NormalizedCellType> geoTypes;
2074 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2075 (*it)->getFieldAtLevel(mesh->getMeshDimension(),type,glob,dads,pfls,locs,geoTypes);
2077 SortArraysPerType(glob,type,geoTypes,dads,pfls,locs,code,notNullPflsPerGeoType);
2080 std::ostringstream oss; oss << "MEDFileFieldPerMesh::getFieldOnMeshAtLevelWithPfl : " << "The field \"" << nasc.getName() << "\" exists but not with such spatial discretization or such dimension specified !";
2081 throw INTERP_KERNEL::Exception(oss.str().c_str());
2083 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > notNullPflsPerGeoType2(notNullPflsPerGeoType.begin(),notNullPflsPerGeoType.end());
2084 std::vector< const DataArrayInt *> notNullPflsPerGeoType3(notNullPflsPerGeoType.begin(),notNullPflsPerGeoType.end());
2087 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr=mesh->checkTypeConsistencyAndContig(code,notNullPflsPerGeoType3);
2088 return finishField4(dads,arr,mesh->getNumberOfCells(),pfl);
2093 throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::getFieldOnMeshAtLevel : internal error #1 !");
2097 if(nb!=mesh->getNumberOfNodes())
2099 std::ostringstream oss; oss << "MEDFileFieldPerMesh::getFieldOnMeshAtLevel : There is a problem there is " << nb << " nodes in field whereas there is " << mesh->getNumberOfNodes();
2100 oss << " nodes in mesh !";
2101 throw INTERP_KERNEL::Exception(oss.str().c_str());
2104 return finishField4(dads,code[2]==-1?0:notNullPflsPerGeoType3[0],mesh->getNumberOfNodes(),pfl);
2110 void MEDFileFieldPerMesh::getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
2114 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2116 (*it)->getSizes(globalSz,nbOfEntries);
2118 entries.resize(nbOfEntries);
2120 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2122 (*it)->fillValues(nbOfEntries,entries);
2126 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMesh::getLeafGivenTypeAndLocId(INTERP_KERNEL::NormalizedCellType typ, int locId) throw(INTERP_KERNEL::Exception)
2128 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2130 if((*it)->getGeoType()==typ)
2131 return (*it)->getLeafGivenLocId(locId);
2133 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(typ);
2134 std::ostringstream oss; oss << "MEDFileFieldPerMesh::getLeafGivenTypeAndLocId : no such geometric type \"" << cm.getRepr() << "\" in this !" << std::endl;
2135 oss << "Possiblities are : ";
2136 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2138 const INTERP_KERNEL::CellModel& cm2=INTERP_KERNEL::CellModel::GetCellModel((*it)->getGeoType());
2139 oss << "\"" << cm2.getRepr() << "\", ";
2141 throw INTERP_KERNEL::Exception(oss.str().c_str());
2144 const MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMesh::getLeafGivenTypeAndLocId(INTERP_KERNEL::NormalizedCellType typ, int locId) const throw(INTERP_KERNEL::Exception)
2146 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2148 if((*it)->getGeoType()==typ)
2149 return (*it)->getLeafGivenLocId(locId);
2151 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(typ);
2152 std::ostringstream oss; oss << "MEDFileFieldPerMesh::getLeafGivenTypeAndLocId : no such geometric type \"" << cm.getRepr() << "\" in this !" << std::endl;
2153 oss << "Possiblities are : ";
2154 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::const_iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
2156 const INTERP_KERNEL::CellModel& cm2=INTERP_KERNEL::CellModel::GetCellModel((*it)->getGeoType());
2157 oss << "\"" << cm2.getRepr() << "\", ";
2159 throw INTERP_KERNEL::Exception(oss.str().c_str());
2162 int MEDFileFieldPerMesh::addNewEntryIfNecessary(INTERP_KERNEL::NormalizedCellType type)
2165 int pos=std::distance(typmai2,std::find(typmai2,typmai2+MED_N_CELL_FIXED_GEO,type));
2166 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it2=_field_pm_pt.begin();
2167 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMeshPerType > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++,i++)
2169 INTERP_KERNEL::NormalizedCellType curType=(*it)->getGeoType();
2174 int pos2=std::distance(typmai2,std::find(typmai2,typmai2+MED_N_CELL_FIXED_GEO,curType));
2179 int ret=std::distance(_field_pm_pt.begin(),it2);
2180 _field_pm_pt.insert(it2,MEDFileFieldPerMeshPerType::New(this,type));
2185 * 'dads' and 'locs' input parameters have the same number of elements
2186 * \param [in] mesh is \b NOT the global mesh, but the possibly reduced mesh. \a mesh parameter will be directly aggregated in the returned field
2188 MEDCouplingFieldDouble *MEDFileFieldPerMesh::finishField(TypeOfField type, const MEDFileFieldGlobsReal *glob,
2189 const std::vector< std::pair<int,int> >& dads, const std::vector<int>& locs,
2190 const MEDCouplingMesh *mesh, bool& isPfl, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
2193 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=MEDCouplingFieldDouble::New(type,ONE_TIME);
2194 ret->setMesh(mesh); ret->setName(nasc.getName().c_str()); ret->setTime(getTime(),getIteration(),getOrder()); ret->setTimeUnit(nasc.getDtUnit().c_str());
2195 MEDCouplingAutoRefCountObjectPtr<DataArray> da=getOrCreateAndGetArray()->selectByTupleRanges(dads);
2196 const std::vector<std::string>& infos=getInfo();
2197 da->setInfoOnComponents(infos);
2199 if(type==ON_GAUSS_PT)
2202 int nbOfArrs=dads.size();
2203 for(int i=0;i<nbOfArrs;i++)
2205 std::vector<std::pair<int,int> > dads2(1,dads[i]); const std::vector<int> locs2(1,locs[i]);
2206 const std::vector<INTERP_KERNEL::NormalizedCellType> geoTypes2(1,INTERP_KERNEL::NORM_ERROR);
2207 int nbOfElems=ComputeNbOfElems(glob,type,geoTypes2,dads2,locs2);
2208 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> di=DataArrayInt::New();
2209 di->alloc(nbOfElems,1);
2211 const MEDFileFieldLoc& fl=glob->getLocalizationFromId(locs[i]);
2212 ret->setGaussLocalizationOnCells(di->getConstPointer(),di->getConstPointer()+nbOfElems,fl.getRefCoords(),fl.getGaussCoords(),fl.getGaussWeights());
2221 * This method is an extension of MEDFileFieldPerMesh::finishField method. It deals with profiles. This method should be called when type is different from ON_NODES.
2222 * 'dads', 'locs' and 'geoTypes' input parameters have the same number of elements.
2223 * No check of this is performed. 'da' array contains an array in old2New style to be applyied to mesh to obtain the right support.
2224 * The order of cells in the returned field is those imposed by the profile.
2225 * \param [in] mesh is the global mesh.
2227 MEDCouplingFieldDouble *MEDFileFieldPerMesh::finishField2(TypeOfField type, const MEDFileFieldGlobsReal *glob,
2228 const std::vector<std::pair<int,int> >& dads, const std::vector<int>& locs,
2229 const std::vector<INTERP_KERNEL::NormalizedCellType>& geoTypes,
2230 const MEDCouplingMesh *mesh, const DataArrayInt *da, bool& isPfl, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
2232 if(da->isIdentity())
2234 int nbOfTuples=da->getNumberOfTuples();
2235 if(nbOfTuples==mesh->getNumberOfCells())
2236 return finishField(type,glob,dads,locs,mesh,isPfl,arrOut,nasc);
2238 MEDCouplingAutoRefCountObjectPtr<MEDCouplingMesh> m2=mesh->buildPart(da->getConstPointer(),da->getConstPointer()+da->getNbOfElems());
2239 m2->setName(mesh->getName());
2240 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=finishField(type,glob,dads,locs,m2,isPfl,arrOut,nasc);
2246 * This method is the complement of MEDFileFieldPerMesh::finishField2 method except that this method works for node profiles.
2248 MEDCouplingFieldDouble *MEDFileFieldPerMesh::finishFieldNode2(const MEDFileFieldGlobsReal *glob,
2249 const std::vector<std::pair<int,int> >& dads, const std::vector<int>& locs,
2250 const MEDCouplingMesh *mesh, const DataArrayInt *da, bool& isPfl, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
2252 if(da->isIdentity())
2254 int nbOfTuples=da->getNumberOfTuples();
2255 if(nbOfTuples==mesh->getNumberOfNodes())//No problem for NORM_ERROR because it is in context of node
2256 return finishField(ON_NODES,glob,dads,locs,mesh,isPfl,arrOut,nasc);
2258 // Treatment of particular case where nodal field on pfl is requested with a meshDimRelToMax=1.
2259 const MEDCouplingUMesh *meshu=dynamic_cast<const MEDCouplingUMesh *>(mesh);
2262 if(meshu->getNodalConnectivity()==0)
2264 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=finishField(ON_CELLS,glob,dads,locs,mesh,isPfl,arrOut,nasc);
2265 int nb=da->getNbOfElems();
2266 const int *ptr=da->getConstPointer();
2267 MEDCouplingUMesh *meshuc=const_cast<MEDCouplingUMesh *>(meshu);
2268 meshuc->allocateCells(nb);
2269 for(int i=0;i<nb;i++)
2270 meshuc->insertNextCell(INTERP_KERNEL::NORM_POINT1,1,ptr+i);
2271 meshuc->finishInsertingCells();
2272 ret->setMesh(meshuc);
2273 const MEDCouplingFieldDiscretization *disc=ret->getDiscretization();
2274 if(!disc) throw INTERP_KERNEL::Exception("MEDFileFieldPerMesh::finishFieldNode2 : internal error, no discretization on field !");
2275 disc->checkCoherencyBetween(meshuc,arrOut);
2280 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=finishField(ON_NODES,glob,dads,locs,mesh,isPfl,arrOut,nasc);
2282 DataArrayInt *arr2=0;
2283 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> cellIds=mesh->getCellIdsFullyIncludedInNodeIds(da->getConstPointer(),da->getConstPointer()+da->getNbOfElems());
2284 MEDCouplingAutoRefCountObjectPtr<MEDCouplingMesh> mesh2=mesh->buildPartAndReduceNodes(cellIds->getConstPointer(),cellIds->getConstPointer()+cellIds->getNbOfElems(),arr2);
2285 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr3(arr2);
2286 int nnodes=mesh2->getNumberOfNodes();
2287 if(nnodes==(int)da->getNbOfElems())
2289 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da3=da->transformWithIndArrR(arr2->begin(),arr2->end());
2290 arrOut->renumberInPlace(da3->getConstPointer());
2291 mesh2->setName(mesh->getName());
2292 ret->setMesh(mesh2);
2297 std::ostringstream oss; oss << "MEDFileFieldPerMesh::finishFieldNode2 : The field on nodes lies on a node profile so that it is impossible to find a submesh having exactly the same nodes of that profile !!!";
2298 oss << "So it is impossible to return a well definied MEDCouplingFieldDouble instance on specified mesh on a specified meshDim !" << std::endl;
2299 oss << "To retrieve correctly such a field you have 3 possibilities :" << std::endl;
2300 oss << " - use an another meshDim compatible with the field on nodes (MED file does not have such information)" << std::endl;
2301 oss << " - use an another a meshDimRelToMax equal to 1 -> it will return a mesh with artificial cell POINT1 containing the profile !" << std::endl;
2302 oss << " - if definitely the node profile has no link with mesh connectivity use MEDFileField1TS::getFieldWithProfile or MEDFileFieldMultiTS::getFieldWithProfile methods instead !";
2303 throw INTERP_KERNEL::Exception(oss.str().c_str());
2309 * This method is the most light method of field retrieving.
2311 DataArray *MEDFileFieldPerMesh::finishField4(const std::vector<std::pair<int,int> >& dads, const DataArrayInt *pflIn, int nbOfElems, DataArrayInt *&pflOut) const throw(INTERP_KERNEL::Exception)
2315 pflOut=DataArrayInt::New();
2316 pflOut->alloc(nbOfElems,1);
2321 pflOut=const_cast<DataArrayInt*>(pflIn);
2324 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> safePfl(pflOut);
2325 MEDCouplingAutoRefCountObjectPtr<DataArray> da=getOrCreateAndGetArray()->selectByTupleRanges(dads);
2326 const std::vector<std::string>& infos=getInfo();
2327 int nbOfComp=infos.size();
2328 for(int i=0;i<nbOfComp;i++)
2329 da->setInfoOnComponent(i,infos[i].c_str());
2334 MEDFileFieldPerMesh::MEDFileFieldPerMesh(med_idt fid, MEDFileAnyTypeField1TSWithoutSDA *fath, int meshCsit, int meshIteration, int meshOrder, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception):_mesh_iteration(meshIteration),_mesh_order(meshOrder),
2335 _mesh_csit(meshCsit),_father(fath)
2337 INTERP_KERNEL::AutoPtr<char> meshName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
2338 INTERP_KERNEL::AutoPtr<char> pflName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
2339 INTERP_KERNEL::AutoPtr<char> locName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
2340 for(int i=0;i<MED_N_CELL_FIXED_GEO;i++)
2342 int nbProfile=MEDfield23nProfile(fid,nasc.getName().c_str(),getIteration(),getOrder(),MED_CELL,typmai[i],_mesh_csit,meshName,pflName,locName);
2345 _field_pm_pt.push_back(MEDFileFieldPerMeshPerType::NewOnRead(fid,this,ON_CELLS,typmai2[i],nasc));
2346 _mesh_name=MEDLoaderBase::buildStringFromFortran(meshName,MED_NAME_SIZE+1);
2348 nbProfile=MEDfield23nProfile(fid,nasc.getName().c_str(),getIteration(),getOrder(),MED_NODE_ELEMENT,typmai[i],_mesh_csit,meshName,pflName,locName);
2351 _field_pm_pt.push_back(MEDFileFieldPerMeshPerType::NewOnRead(fid,this,ON_GAUSS_NE,typmai2[i],nasc));
2352 _mesh_name=MEDLoaderBase::buildStringFromFortran(meshName,MED_NAME_SIZE+1);
2355 int nbProfile=MEDfield23nProfile(fid,nasc.getName().c_str(),getIteration(),getOrder(),MED_NODE,MED_NONE,_mesh_csit,meshName,pflName,locName);
2358 _field_pm_pt.push_back(MEDFileFieldPerMeshPerType::NewOnRead(fid,this,ON_NODES,INTERP_KERNEL::NORM_ERROR,nasc));
2359 _mesh_name=MEDLoaderBase::buildStringFromFortran(meshName,MED_NAME_SIZE+1);
2363 MEDFileFieldPerMesh::MEDFileFieldPerMesh(MEDFileAnyTypeField1TSWithoutSDA *fath, const MEDCouplingMesh *mesh):_father(fath)
2365 copyTinyInfoFrom(mesh);
2368 void MEDFileFieldGlobs::loadProfileInFile(med_idt fid, int id, const char *pflName) throw(INTERP_KERNEL::Exception)
2370 if(id>=(int)_pfls.size())
2372 _pfls[id]=DataArrayInt::New();
2373 int lgth=MEDprofileSizeByName(fid,pflName);
2374 _pfls[id]->setName(pflName);
2375 _pfls[id]->alloc(lgth,1);
2376 MEDprofileRd(fid,pflName,_pfls[id]->getPointer());
2377 _pfls[id]->applyLin(1,-1,0);//Converting into C format
2380 void MEDFileFieldGlobs::loadProfileInFile(med_idt fid, int i)
2382 INTERP_KERNEL::AutoPtr<char> pflName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
2384 MEDprofileInfo(fid,i+1,pflName,&sz);
2385 std::string pflCpp=MEDLoaderBase::buildStringFromFortran(pflName,MED_NAME_SIZE);
2386 if(i>=(int)_pfls.size())
2388 _pfls[i]=DataArrayInt::New();
2389 _pfls[i]->alloc(sz,1);
2390 _pfls[i]->setName(pflCpp.c_str());
2391 MEDprofileRd(fid,pflName,_pfls[i]->getPointer());
2392 _pfls[i]->applyLin(1,-1,0);//Converting into C format
2395 void MEDFileFieldGlobs::writeGlobals(med_idt fid, const MEDFileWritable& opt) const throw(INTERP_KERNEL::Exception)
2397 int nbOfPfls=_pfls.size();
2398 for(int i=0;i<nbOfPfls;i++)
2400 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> cpy=_pfls[i]->deepCpy();
2401 cpy->applyLin(1,1,0);
2402 INTERP_KERNEL::AutoPtr<char> pflName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
2403 MEDLoaderBase::safeStrCpy(_pfls[i]->getName().c_str(),MED_NAME_SIZE,pflName,opt.getTooLongStrPolicy());
2404 MEDprofileWr(fid,pflName,_pfls[i]->getNumberOfTuples(),cpy->getConstPointer());
2407 int nbOfLocs=_locs.size();
2408 for(int i=0;i<nbOfLocs;i++)
2409 _locs[i]->writeLL(fid);
2412 void MEDFileFieldGlobs::appendGlobs(const MEDFileFieldGlobs& other, double eps) throw(INTERP_KERNEL::Exception)
2414 std::vector<std::string> pfls=getPfls();
2415 for(std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::const_iterator it=other._pfls.begin();it!=other._pfls.end();it++)
2417 std::vector<std::string>::iterator it2=std::find(pfls.begin(),pfls.end(),(*it)->getName());
2420 _pfls.push_back(*it);
2424 int id=std::distance(pfls.begin(),it2);
2425 if(!(*it)->isEqual(*_pfls[id]))
2427 std::ostringstream oss; oss << "MEDFileFieldGlobs::appendGlobs : Profile \"" << (*it)->getName() << "\" already exists and is different from those expecting to be append !";
2428 throw INTERP_KERNEL::Exception(oss.str().c_str());
2432 std::vector<std::string> locs=getLocs();
2433 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> >::const_iterator it=_locs.begin();it!=_locs.end();it++)
2435 std::vector<std::string>::iterator it2=std::find(locs.begin(),locs.end(),(*it)->getName());
2438 _locs.push_back(*it);
2442 int id=std::distance(locs.begin(),it2);
2443 if(!(*it)->isEqual(*_locs[id],eps))
2445 std::ostringstream oss; oss << "MEDFileFieldGlobs::appendGlobs : Localization \"" << (*it)->getName() << "\" already exists and is different from those expecting to be append !";
2446 throw INTERP_KERNEL::Exception(oss.str().c_str());
2452 void MEDFileFieldGlobs::checkGlobsPflsPartCoherency(const std::vector<std::string>& pflsUsed) const throw(INTERP_KERNEL::Exception)
2454 for(std::vector<std::string>::const_iterator it=pflsUsed.begin();it!=pflsUsed.end();it++)
2455 getProfile((*it).c_str());
2458 void MEDFileFieldGlobs::checkGlobsLocsPartCoherency(const std::vector<std::string>& locsUsed) const throw(INTERP_KERNEL::Exception)
2460 for(std::vector<std::string>::const_iterator it=locsUsed.begin();it!=locsUsed.end();it++)
2461 getLocalization((*it).c_str());
2464 void MEDFileFieldGlobs::loadGlobals(med_idt fid, const MEDFileFieldGlobsReal& real) throw(INTERP_KERNEL::Exception)
2466 std::vector<std::string> profiles=real.getPflsReallyUsed();
2467 int sz=profiles.size();
2469 for(int i=0;i<sz;i++)
2470 loadProfileInFile(fid,i,profiles[i].c_str());
2472 std::vector<std::string> locs=real.getLocsReallyUsed();
2475 for(int i=0;i<sz;i++)
2476 _locs[i]=MEDFileFieldLoc::New(fid,locs[i].c_str());
2479 void MEDFileFieldGlobs::loadAllGlobals(med_idt fid) throw(INTERP_KERNEL::Exception)
2481 int nProfil=MEDnProfile(fid);
2482 for(int i=0;i<nProfil;i++)
2483 loadProfileInFile(fid,i);
2484 int sz=MEDnLocalization(fid);
2486 for(int i=0;i<sz;i++)
2488 _locs[i]=MEDFileFieldLoc::New(fid,i);
2492 MEDFileFieldGlobs *MEDFileFieldGlobs::New(const char *fname)
2494 return new MEDFileFieldGlobs(fname);
2497 MEDFileFieldGlobs *MEDFileFieldGlobs::New()
2499 return new MEDFileFieldGlobs;
2502 std::size_t MEDFileFieldGlobs::getHeapMemorySize() const
2504 std::size_t ret=_file_name.capacity()+_pfls.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr<DataArrayInt>)+_locs.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc>);
2505 for(std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::const_iterator it=_pfls.begin();it!=_pfls.end();it++)
2506 ret+=(*it)->getHeapMemorySize();
2507 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> >::const_iterator it=_locs.begin();it!=_locs.end();it++)
2508 ret+=(*it)->getHeapMemorySize();
2512 MEDFileFieldGlobs *MEDFileFieldGlobs::deepCpy() const throw(INTERP_KERNEL::Exception)
2514 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldGlobs> ret=new MEDFileFieldGlobs(*this);
2516 for(std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::const_iterator it=_pfls.begin();it!=_pfls.end();it++,i++)
2518 if((const DataArrayInt *)*it)
2519 ret->_pfls[i]=(*it)->deepCpy();
2522 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> >::const_iterator it=_locs.begin();it!=_locs.end();it++,i++)
2524 if((const MEDFileFieldLoc*)*it)
2525 ret->_locs[i]=(*it)->deepCpy();
2531 * \throw if a profile in \a pfls in not in \a this.
2532 * \throw if a localization in \a locs in not in \a this.
2533 * \sa MEDFileFieldGlobs::deepCpyPart
2535 MEDFileFieldGlobs *MEDFileFieldGlobs::shallowCpyPart(const std::vector<std::string>& pfls, const std::vector<std::string>& locs) const throw(INTERP_KERNEL::Exception)
2537 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldGlobs> ret=MEDFileFieldGlobs::New();
2538 for(std::vector<std::string>::const_iterator it1=pfls.begin();it1!=pfls.end();it1++)
2540 DataArrayInt *pfl=const_cast<DataArrayInt *>(getProfile((*it1).c_str()));
2542 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::shallowCpyPart : internal error ! pfl null !");
2544 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> pfl2(pfl);
2545 ret->_pfls.push_back(pfl2);
2547 for(std::vector<std::string>::const_iterator it2=locs.begin();it2!=locs.end();it2++)
2549 MEDFileFieldLoc *loc=const_cast<MEDFileFieldLoc *>(&getLocalization((*it2).c_str()));
2551 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::shallowCpyPart : internal error ! loc null !");
2553 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> loc2(loc);
2554 ret->_locs.push_back(loc2);
2556 ret->setFileName(getFileName());
2561 * \throw if a profile in \a pfls in not in \a this.
2562 * \throw if a localization in \a locs in not in \a this.
2563 * \sa MEDFileFieldGlobs::shallowCpyPart
2565 MEDFileFieldGlobs *MEDFileFieldGlobs::deepCpyPart(const std::vector<std::string>& pfls, const std::vector<std::string>& locs) const throw(INTERP_KERNEL::Exception)
2567 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldGlobs> ret=MEDFileFieldGlobs::New();
2568 for(std::vector<std::string>::const_iterator it1=pfls.begin();it1!=pfls.end();it1++)
2570 DataArrayInt *pfl=const_cast<DataArrayInt *>(getProfile((*it1).c_str()));
2572 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::deepCpyPart : internal error ! pfl null !");
2573 ret->_pfls.push_back(pfl->deepCpy());
2575 for(std::vector<std::string>::const_iterator it2=locs.begin();it2!=locs.end();it2++)
2577 MEDFileFieldLoc *loc=const_cast<MEDFileFieldLoc *>(&getLocalization((*it2).c_str()));
2579 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::deepCpyPart : internal error ! loc null !");
2580 ret->_locs.push_back(loc->deepCpy());
2582 ret->setFileName(getFileName());
2586 MEDFileFieldGlobs::MEDFileFieldGlobs(const char *fname):_file_name(fname)
2590 MEDFileFieldGlobs::MEDFileFieldGlobs()
2594 MEDFileFieldGlobs::~MEDFileFieldGlobs()
2598 void MEDFileFieldGlobs::simpleRepr(std::ostream& oss) const
2600 oss << "Profiles :\n";
2601 std::size_t n=_pfls.size();
2602 for(std::size_t i=0;i<n;i++)
2604 oss << " - #" << i << " ";
2605 const DataArrayInt *pfl=_pfls[i];
2607 oss << "\"" << pfl->getName() << "\"\n";
2612 oss << "Localizations :\n";
2613 for(std::size_t i=0;i<n;i++)
2615 oss << " - #" << i << " ";
2616 const MEDFileFieldLoc *loc=_locs[i];
2618 loc->simpleRepr(oss);
2624 void MEDFileFieldGlobs::setFileName(const char *fileName)
2626 _file_name=fileName;
2629 void MEDFileFieldGlobs::changePflsNamesInStruct(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
2631 for(std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::iterator it=_pfls.begin();it!=_pfls.end();it++)
2633 DataArrayInt *elt(*it);
2636 std::string name(elt->getName());
2637 for(std::vector< std::pair<std::vector<std::string>, std::string > >::const_iterator it2=mapOfModif.begin();it2!=mapOfModif.end();it2++)
2639 if(std::find((*it2).first.begin(),(*it2).first.end(),name)!=(*it2).first.end())
2641 elt->setName((*it2).second.c_str());
2649 void MEDFileFieldGlobs::changeLocsNamesInStruct(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
2651 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> >::iterator it=_locs.begin();it!=_locs.end();it++)
2653 MEDFileFieldLoc *elt(*it);
2656 std::string name(elt->getName());
2657 for(std::vector< std::pair<std::vector<std::string>, std::string > >::const_iterator it2=mapOfModif.begin();it2!=mapOfModif.end();it2++)
2659 if(std::find((*it2).first.begin(),(*it2).first.end(),name)!=(*it2).first.end())
2661 elt->setName((*it2).second.c_str());
2669 int MEDFileFieldGlobs::getNbOfGaussPtPerCell(int locId) const throw(INTERP_KERNEL::Exception)
2671 if(locId<0 || locId>=(int)_locs.size())
2672 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::getNbOfGaussPtPerCell : Invalid localization id !");
2673 return _locs[locId]->getNbOfGaussPtPerCell();
2676 const MEDFileFieldLoc& MEDFileFieldGlobs::getLocalization(const char *locName) const throw(INTERP_KERNEL::Exception)
2678 return getLocalizationFromId(getLocalizationId(locName));
2681 const MEDFileFieldLoc& MEDFileFieldGlobs::getLocalizationFromId(int locId) const throw(INTERP_KERNEL::Exception)
2683 if(locId<0 || locId>=(int)_locs.size())
2684 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::getLocalizationFromId : Invalid localization id !");
2685 return *_locs[locId];
2688 namespace ParaMEDMEMImpl
2693 LocFinder(const char *loc):_loc(loc) { }
2694 bool operator() (const MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc>& loc) { return loc->isName(_loc); }
2702 PflFinder(const std::string& pfl):_pfl(pfl) { }
2703 bool operator() (const MEDCouplingAutoRefCountObjectPtr<DataArrayInt>& pfl) { return _pfl==pfl->getName(); }
2705 const std::string& _pfl;
2709 int MEDFileFieldGlobs::getLocalizationId(const char *loc) const throw(INTERP_KERNEL::Exception)
2711 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> >::const_iterator it=std::find_if(_locs.begin(),_locs.end(),ParaMEDMEMImpl::LocFinder(loc));
2714 std::ostringstream oss; oss << "MEDFileFieldGlobs::getLocalisationId : no such localisation name : \"" << loc << "\" Possible localizations are : ";
2715 for(it=_locs.begin();it!=_locs.end();it++)
2716 oss << "\"" << (*it)->getName() << "\", ";
2717 throw INTERP_KERNEL::Exception(oss.str().c_str());
2719 return std::distance(_locs.begin(),it);
2723 * The returned value is never null.
2725 const DataArrayInt *MEDFileFieldGlobs::getProfile(const char *pflName) const throw(INTERP_KERNEL::Exception)
2727 std::string pflNameCpp(pflName);
2728 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::const_iterator it=std::find_if(_pfls.begin(),_pfls.end(),ParaMEDMEMImpl::PflFinder(pflNameCpp));
2731 std::ostringstream oss; oss << "MEDFileFieldGlobs::getProfile: no such profile name : \"" << pflNameCpp << "\" Possible profiles are : ";
2732 for(it=_pfls.begin();it!=_pfls.end();it++)
2733 oss << "\"" << (*it)->getName() << "\", ";
2734 throw INTERP_KERNEL::Exception(oss.str().c_str());
2739 const DataArrayInt *MEDFileFieldGlobs::getProfileFromId(int pflId) const throw(INTERP_KERNEL::Exception)
2741 if(pflId<0 || pflId>=(int)_pfls.size())
2742 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::getProfileFromId : Invalid profile id !");
2743 return _pfls[pflId];
2746 MEDFileFieldLoc& MEDFileFieldGlobs::getLocalizationFromId(int locId) throw(INTERP_KERNEL::Exception)
2748 if(locId<0 || locId>=(int)_locs.size())
2749 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::getLocalizationFromId : Invalid localization id !");
2750 return *_locs[locId];
2753 MEDFileFieldLoc& MEDFileFieldGlobs::getLocalization(const char *locName) throw(INTERP_KERNEL::Exception)
2755 return getLocalizationFromId(getLocalizationId(locName));
2759 * The returned value is never null.
2761 DataArrayInt *MEDFileFieldGlobs::getProfile(const char *pflName) throw(INTERP_KERNEL::Exception)
2763 std::string pflNameCpp(pflName);
2764 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::iterator it=std::find_if(_pfls.begin(),_pfls.end(),ParaMEDMEMImpl::PflFinder(pflNameCpp));
2767 std::ostringstream oss; oss << "MEDFileFieldGlobs::getProfile: no such profile name : \"" << pflNameCpp << "\" Possible profiles are : ";
2768 for(it=_pfls.begin();it!=_pfls.end();it++)
2769 oss << "\"" << (*it)->getName() << "\", ";
2770 throw INTERP_KERNEL::Exception(oss.str().c_str());
2775 DataArrayInt *MEDFileFieldGlobs::getProfileFromId(int pflId) throw(INTERP_KERNEL::Exception)
2777 if(pflId<0 || pflId>=(int)_pfls.size())
2778 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::getProfileFromId : Invalid profile id !");
2779 return _pfls[pflId];
2782 void MEDFileFieldGlobs::killProfileIds(const std::vector<int>& pflIds) throw(INTERP_KERNEL::Exception)
2784 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > newPfls;
2786 for(std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::const_iterator it=_pfls.begin();it!=_pfls.end();it++,i++)
2788 if(std::find(pflIds.begin(),pflIds.end(),i)==pflIds.end())
2789 newPfls.push_back(*it);
2794 void MEDFileFieldGlobs::killLocalizationIds(const std::vector<int>& locIds) throw(INTERP_KERNEL::Exception)
2796 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> > newLocs;
2798 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> >::const_iterator it=_locs.begin();it!=_locs.end();it++,i++)
2800 if(std::find(locIds.begin(),locIds.end(),i)==locIds.end())
2801 newLocs.push_back(*it);
2806 std::vector<std::string> MEDFileFieldGlobs::getPfls() const
2808 int sz=_pfls.size();
2809 std::vector<std::string> ret(sz);
2810 for(int i=0;i<sz;i++)
2811 ret[i]=_pfls[i]->getName();
2815 std::vector<std::string> MEDFileFieldGlobs::getLocs() const
2817 int sz=_locs.size();
2818 std::vector<std::string> ret(sz);
2819 for(int i=0;i<sz;i++)
2820 ret[i]=_locs[i]->getName();
2824 bool MEDFileFieldGlobs::existsPfl(const char *pflName) const
2826 std::vector<std::string> v=getPfls();
2827 std::string s(pflName);
2828 return std::find(v.begin(),v.end(),s)!=v.end();
2831 bool MEDFileFieldGlobs::existsLoc(const char *locName) const
2833 std::vector<std::string> v=getLocs();
2834 std::string s(locName);
2835 return std::find(v.begin(),v.end(),s)!=v.end();
2838 std::vector< std::vector<int> > MEDFileFieldGlobs::whichAreEqualProfiles() const
2840 std::map<int,std::vector<int> > m;
2842 for(std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::const_iterator it=_pfls.begin();it!=_pfls.end();it++,i++)
2844 const DataArrayInt *tmp=(*it);
2847 m[tmp->getHashCode()].push_back(i);
2850 std::vector< std::vector<int> > ret;
2851 for(std::map<int,std::vector<int> >::const_iterator it2=m.begin();it2!=m.end();it2++)
2853 if((*it2).second.size()>1)
2855 std::vector<int> ret0;
2856 bool equalityOrNot=false;
2857 for(std::vector<int>::const_iterator it3=(*it2).second.begin();it3!=(*it2).second.end();it3++)
2859 std::vector<int>::const_iterator it4=it3; it4++;
2860 for(;it4!=(*it2).second.end();it4++)
2862 if(_pfls[*it3]->isEqualWithoutConsideringStr(*_pfls[*it4]))
2865 ret0.push_back(*it3);
2866 ret0.push_back(*it4);
2872 ret.push_back(ret0);
2878 std::vector< std::vector<int> > MEDFileFieldGlobs::whichAreEqualLocs(double eps) const
2880 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::whichAreEqualLocs : no implemented yet ! Sorry !");
2883 void MEDFileFieldGlobs::appendProfile(DataArrayInt *pfl) throw(INTERP_KERNEL::Exception)
2885 std::string name(pfl->getName());
2887 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::appendProfile : unsupported profiles with no name !");
2888 for(std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> >::const_iterator it=_pfls.begin();it!=_pfls.end();it++)
2889 if(name==(*it)->getName())
2891 if(!pfl->isEqual(*(*it)))
2893 std::ostringstream oss; oss << "MEDFileFieldGlobs::appendProfile : profile \"" << name << "\" already exists and is different from existing !";
2894 throw INTERP_KERNEL::Exception(oss.str().c_str());
2898 _pfls.push_back(pfl);
2901 void MEDFileFieldGlobs::appendLoc(const char *locName, INTERP_KERNEL::NormalizedCellType geoType, const std::vector<double>& refCoo, const std::vector<double>& gsCoo, const std::vector<double>& w) throw(INTERP_KERNEL::Exception)
2903 std::string name(locName);
2905 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::appendLoc : unsupported localizations with no name !");
2906 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> obj=MEDFileFieldLoc::New(locName,geoType,refCoo,gsCoo,w);
2907 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileFieldLoc> >::const_iterator it=_locs.begin();it!=_locs.end();it++)
2908 if((*it)->isName(locName))
2910 if(!(*it)->isEqual(*obj,1e-12))
2912 std::ostringstream oss; oss << "MEDFileFieldGlobs::appendLoc : localization \"" << name << "\" already exists and is different from existing !";
2913 throw INTERP_KERNEL::Exception(oss.str().c_str());
2916 _locs.push_back(obj);
2919 std::string MEDFileFieldGlobs::createNewNameOfPfl() const throw(INTERP_KERNEL::Exception)
2921 std::vector<std::string> names=getPfls();
2922 return CreateNewNameNotIn("NewPfl_",names);
2925 std::string MEDFileFieldGlobs::createNewNameOfLoc() const throw(INTERP_KERNEL::Exception)
2927 std::vector<std::string> names=getLocs();
2928 return CreateNewNameNotIn("NewLoc_",names);
2931 std::string MEDFileFieldGlobs::CreateNewNameNotIn(const char *prefix, const std::vector<std::string>& namesToAvoid) throw(INTERP_KERNEL::Exception)
2933 for(std::size_t sz=0;sz<100000;sz++)
2935 std::ostringstream tryName;
2936 tryName << prefix << sz;
2937 if(std::find(namesToAvoid.begin(),namesToAvoid.end(),tryName.str())==namesToAvoid.end())
2938 return tryName.str();
2940 throw INTERP_KERNEL::Exception("MEDFileFieldGlobs::CreateNewNameNotIn : impossible to create an additional profile limit of 100000 profiles reached !");
2944 * Creates a MEDFileFieldGlobsReal on a given file name. Nothing is read here.
2945 * \param [in] fname - the file name.
2947 MEDFileFieldGlobsReal::MEDFileFieldGlobsReal(const char *fname):_globals(MEDFileFieldGlobs::New(fname))
2952 * Creates an empty MEDFileFieldGlobsReal.
2954 MEDFileFieldGlobsReal::MEDFileFieldGlobsReal():_globals(MEDFileFieldGlobs::New())
2958 std::size_t MEDFileFieldGlobsReal::getHeapMemorySize() const
2961 if((const MEDFileFieldGlobs *)_globals)
2962 ret+=_globals->getHeapMemorySize();
2967 * Returns a string describing profiles and Gauss points held in \a this.
2968 * \return std::string - the description string.
2970 void MEDFileFieldGlobsReal::simpleReprGlobs(std::ostream& oss) const
2972 const MEDFileFieldGlobs *glob=_globals;
2973 std::ostringstream oss2; oss2 << glob;
2974 std::string stars(oss2.str().length(),'*');
2975 oss << "Globals information on fields (at " << oss2.str() << "):" << "\n************************************" << stars << "\n\n";
2977 glob->simpleRepr(oss);
2979 oss << "NO GLOBAL INFORMATION !\n";
2982 void MEDFileFieldGlobsReal::resetContent()
2984 _globals=MEDFileFieldGlobs::New();
2987 MEDFileFieldGlobsReal::~MEDFileFieldGlobsReal()
2992 * Copies references to profiles and Gauss points from another MEDFileFieldGlobsReal.
2993 * \param [in] other - the other MEDFileFieldGlobsReal to copy data from.
2995 void MEDFileFieldGlobsReal::shallowCpyGlobs(const MEDFileFieldGlobsReal& other)
2997 _globals=other._globals;
3001 * Copies references to ** only used ** by \a this, profiles and Gauss points from another MEDFileFieldGlobsReal.
3002 * \param [in] other - the other MEDFileFieldGlobsReal to copy data from.
3004 void MEDFileFieldGlobsReal::shallowCpyOnlyUsedGlobs(const MEDFileFieldGlobsReal& other) throw(INTERP_KERNEL::Exception)
3006 const MEDFileFieldGlobs *otherg(other._globals);
3009 _globals=otherg->shallowCpyPart(getPflsReallyUsed(),getLocsReallyUsed());
3013 * Copies deeply to ** only used ** by \a this, profiles and Gauss points from another MEDFileFieldGlobsReal.
3014 * \param [in] other - the other MEDFileFieldGlobsReal to copy data from.
3016 void MEDFileFieldGlobsReal::deepCpyOnlyUsedGlobs(const MEDFileFieldGlobsReal& other) throw(INTERP_KERNEL::Exception)
3018 const MEDFileFieldGlobs *otherg(other._globals);
3021 _globals=otherg->deepCpyPart(getPflsReallyUsed(),getLocsReallyUsed());
3024 void MEDFileFieldGlobsReal::deepCpyGlobs(const MEDFileFieldGlobsReal& other)
3026 _globals=other._globals;
3027 if((const MEDFileFieldGlobs *)_globals)
3028 _globals=other._globals->deepCpy();
3032 * Adds profiles and Gauss points held by another MEDFileFieldGlobsReal to \a this one.
3033 * \param [in] other - the MEDFileFieldGlobsReal to copy data from.
3034 * \param [in] eps - a precision used to compare Gauss points with same name held by
3035 * \a this and \a other MEDFileFieldGlobsReal.
3036 * \throw If \a this and \a other hold profiles with equal names but different ids.
3037 * \throw If \a this and \a other hold different Gauss points with equal names.
3039 void MEDFileFieldGlobsReal::appendGlobs(const MEDFileFieldGlobsReal& other, double eps) throw(INTERP_KERNEL::Exception)
3041 const MEDFileFieldGlobs *thisGlobals(_globals),*otherGlobals(other._globals);
3042 if(thisGlobals==otherGlobals)
3046 _globals=other._globals;
3049 _globals->appendGlobs(*other._globals,eps);
3052 void MEDFileFieldGlobsReal::checkGlobsCoherency() const throw(INTERP_KERNEL::Exception)
3054 checkGlobsPflsPartCoherency();
3055 checkGlobsLocsPartCoherency();
3058 void MEDFileFieldGlobsReal::checkGlobsPflsPartCoherency() const throw(INTERP_KERNEL::Exception)
3060 contentNotNull()->checkGlobsPflsPartCoherency(getPflsReallyUsed());
3063 void MEDFileFieldGlobsReal::checkGlobsLocsPartCoherency() const throw(INTERP_KERNEL::Exception)
3065 contentNotNull()->checkGlobsLocsPartCoherency(getLocsReallyUsed());
3068 void MEDFileFieldGlobsReal::loadProfileInFile(med_idt fid, int id, const char *pflName) throw(INTERP_KERNEL::Exception)
3070 contentNotNull()->loadProfileInFile(fid,id,pflName);
3073 void MEDFileFieldGlobsReal::loadProfileInFile(med_idt fid, int id)
3075 contentNotNull()->loadProfileInFile(fid,id);
3078 void MEDFileFieldGlobsReal::loadGlobals(med_idt fid) throw(INTERP_KERNEL::Exception)
3080 contentNotNull()->loadGlobals(fid,*this);
3083 void MEDFileFieldGlobsReal::loadAllGlobals(med_idt fid) throw(INTERP_KERNEL::Exception)
3085 contentNotNull()->loadAllGlobals(fid);
3088 void MEDFileFieldGlobsReal::writeGlobals(med_idt fid, const MEDFileWritable& opt) const throw(INTERP_KERNEL::Exception)
3090 contentNotNull()->writeGlobals(fid,opt);
3094 * Returns names of all profiles. To get only used profiles call getPflsReallyUsed()
3095 * or getPflsReallyUsedMulti().
3096 * \return std::vector<std::string> - a sequence of names of all profiles.
3098 std::vector<std::string> MEDFileFieldGlobsReal::getPfls() const
3100 return contentNotNull()->getPfls();
3104 * Returns names of all localizations. To get only used localizations call getLocsReallyUsed()
3105 * or getLocsReallyUsedMulti().
3106 * \return std::vector<std::string> - a sequence of names of all localizations.
3108 std::vector<std::string> MEDFileFieldGlobsReal::getLocs() const
3110 return contentNotNull()->getLocs();
3114 * Checks if the profile with a given name exists.
3115 * \param [in] pflName - the profile name of interest.
3116 * \return bool - \c true if the profile named \a pflName exists.
3118 bool MEDFileFieldGlobsReal::existsPfl(const char *pflName) const
3120 return contentNotNull()->existsPfl(pflName);
3124 * Checks if the localization with a given name exists.
3125 * \param [in] locName - the localization name of interest.
3126 * \return bool - \c true if the localization named \a locName exists.
3128 bool MEDFileFieldGlobsReal::existsLoc(const char *locName) const
3130 return contentNotNull()->existsLoc(locName);
3133 std::string MEDFileFieldGlobsReal::createNewNameOfPfl() const throw(INTERP_KERNEL::Exception)
3135 return contentNotNull()->createNewNameOfPfl();
3138 std::string MEDFileFieldGlobsReal::createNewNameOfLoc() const throw(INTERP_KERNEL::Exception)
3140 return contentNotNull()->createNewNameOfLoc();
3144 * Sets the name of a MED file.
3145 * \param [inout] fileName - the file name.
3147 void MEDFileFieldGlobsReal::setFileName(const char *fileName)
3149 contentNotNull()->setFileName(fileName);
3153 * Finds equal profiles. Two profiles are considered equal if they contain the same ids
3154 * in the same order.
3155 * \return std::vector< std::vector<int> > - a sequence of groups of equal profiles.
3156 * Each item of this sequence is a vector containing ids of equal profiles.
3158 std::vector< std::vector<int> > MEDFileFieldGlobsReal::whichAreEqualProfiles() const
3160 return contentNotNull()->whichAreEqualProfiles();
3164 * Finds equal localizations.
3165 * \param [in] eps - a precision used to compare real values of the localizations.
3166 * \return std::vector< std::vector<int> > - a sequence of groups of equal localizations.
3167 * Each item of this sequence is a vector containing ids of equal localizations.
3169 std::vector< std::vector<int> > MEDFileFieldGlobsReal::whichAreEqualLocs(double eps) const
3171 return contentNotNull()->whichAreEqualLocs(eps);
3175 * Renames the profiles. References to profiles (a reference is a profile name) are not changed.
3176 * \param [in] mapOfModif - a sequence describing required renaming. Each element of
3177 * this sequence is a pair whose
3178 * - the first item is a vector of profile names to replace by the second item,
3179 * - the second item is a profile name to replace every profile name of the first item.
3181 void MEDFileFieldGlobsReal::changePflsNamesInStruct(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
3183 contentNotNull()->changePflsNamesInStruct(mapOfModif);
3187 * Renames the localizations. References to localizations (a reference is a localization name) are not changed.
3188 * \param [in] mapOfModif - a sequence describing required renaming. Each element of
3189 * this sequence is a pair whose
3190 * - the first item is a vector of localization names to replace by the second item,
3191 * - the second item is a localization name to replace every localization name of the first item.
3193 void MEDFileFieldGlobsReal::changeLocsNamesInStruct(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
3195 contentNotNull()->changeLocsNamesInStruct(mapOfModif);
3199 * Replaces references to some profiles (a reference is a profile name) by references
3200 * to other profiles and, contrary to changePflsRefsNamesGen(), renames the profiles
3201 * them-selves accordingly. <br>
3202 * This method is a generalization of changePflName().
3203 * \param [in] mapOfModif - a sequence describing required replacements. Each element of
3204 * this sequence is a pair whose
3205 * - the first item is a vector of profile names to replace by the second item,
3206 * - the second item is a profile name to replace every profile of the first item.
3207 * \sa changePflsRefsNamesGen()
3208 * \sa changePflName()
3210 void MEDFileFieldGlobsReal::changePflsNames(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
3212 changePflsRefsNamesGen(mapOfModif);
3213 changePflsNamesInStruct(mapOfModif);
3217 * Replaces references to some localizations (a reference is a localization name) by references
3218 * to other localizations and, contrary to changeLocsRefsNamesGen(), renames the localizations
3219 * them-selves accordingly. <br>
3220 * This method is a generalization of changeLocName().
3221 * \param [in] mapOfModif - a sequence describing required replacements. Each element of
3222 * this sequence is a pair whose
3223 * - the first item is a vector of localization names to replace by the second item,
3224 * - the second item is a localization name to replace every localization of the first item.
3225 * \sa changeLocsRefsNamesGen()
3226 * \sa changeLocName()
3228 void MEDFileFieldGlobsReal::changeLocsNames(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
3230 changeLocsRefsNamesGen(mapOfModif);
3231 changeLocsNamesInStruct(mapOfModif);
3235 * Renames the profile having a given name and updates references to this profile.
3236 * \param [in] oldName - the name of the profile to rename.
3237 * \param [in] newName - a new name of the profile.
3238 * \sa changePflsNames().
3240 void MEDFileFieldGlobsReal::changePflName(const char *oldName, const char *newName) throw(INTERP_KERNEL::Exception)
3242 std::vector< std::pair<std::vector<std::string>, std::string > > mapOfModif(1);
3243 std::pair<std::vector<std::string>, std::string > p(std::vector<std::string>(1,std::string(oldName)),std::string(newName));
3245 changePflsNames(mapOfModif);
3249 * Renames the localization having a given name and updates references to this localization.
3250 * \param [in] oldName - the name of the localization to rename.
3251 * \param [in] newName - a new name of the localization.
3252 * \sa changeLocsNames().
3254 void MEDFileFieldGlobsReal::changeLocName(const char *oldName, const char *newName) throw(INTERP_KERNEL::Exception)
3256 std::vector< std::pair<std::vector<std::string>, std::string > > mapOfModif(1);
3257 std::pair<std::vector<std::string>, std::string > p(std::vector<std::string>(1,std::string(oldName)),std::string(newName));
3259 changeLocsNames(mapOfModif);
3263 * Removes duplicated profiles. Returns a map used to update references to removed
3264 * profiles via changePflsRefsNamesGen().
3265 * Equal profiles are found using whichAreEqualProfiles().
3266 * \return std::vector< std::pair<std::vector<std::string>, std::string > > -
3267 * a sequence describing the performed replacements of profiles. Each element of
3268 * this sequence is a pair whose
3269 * - the first item is a vector of profile names replaced by the second item,
3270 * - the second item is a profile name replacing every profile of the first item.
3272 std::vector< std::pair<std::vector<std::string>, std::string > > MEDFileFieldGlobsReal::zipPflsNames() throw(INTERP_KERNEL::Exception)
3274 std::vector< std::vector<int> > pseudoRet=whichAreEqualProfiles();
3275 std::vector< std::pair<std::vector<std::string>, std::string > > ret(pseudoRet.size());
3277 for(std::vector< std::vector<int> >::const_iterator it=pseudoRet.begin();it!=pseudoRet.end();it++,i++)
3279 std::vector< std::string > tmp((*it).size());
3281 for(std::vector<int>::const_iterator it2=(*it).begin();it2!=(*it).end();it2++,j++)
3282 tmp[j]=std::string(getProfileFromId(*it2)->getName());
3283 std::pair<std::vector<std::string>, std::string > p(tmp,tmp.front());
3285 std::vector<int> tmp2((*it).begin()+1,(*it).end());
3286 killProfileIds(tmp2);
3288 changePflsRefsNamesGen(ret);
3293 * Removes duplicated localizations. Returns a map used to update references to removed
3294 * localizations via changeLocsRefsNamesGen().
3295 * Equal localizations are found using whichAreEqualLocs().
3296 * \param [in] eps - a precision used to compare real values of the localizations.
3297 * \return std::vector< std::pair<std::vector<std::string>, std::string > > -
3298 * a sequence describing the performed replacements of localizations. Each element of
3299 * this sequence is a pair whose
3300 * - the first item is a vector of localization names replaced by the second item,
3301 * - the second item is a localization name replacing every localization of the first item.
3303 std::vector< std::pair<std::vector<std::string>, std::string > > MEDFileFieldGlobsReal::zipLocsNames(double eps) throw(INTERP_KERNEL::Exception)
3305 std::vector< std::vector<int> > pseudoRet=whichAreEqualLocs(eps);
3306 std::vector< std::pair<std::vector<std::string>, std::string > > ret(pseudoRet.size());
3308 for(std::vector< std::vector<int> >::const_iterator it=pseudoRet.begin();it!=pseudoRet.end();it++,i++)
3310 std::vector< std::string > tmp((*it).size());
3312 for(std::vector<int>::const_iterator it2=(*it).begin();it2!=(*it).end();it2++,j++)
3313 tmp[j]=std::string(getLocalizationFromId(*it2).getName());
3314 std::pair<std::vector<std::string>, std::string > p(tmp,tmp.front());
3316 std::vector<int> tmp2((*it).begin()+1,(*it).end());
3317 killLocalizationIds(tmp2);
3319 changeLocsRefsNamesGen(ret);
3324 * Returns number of Gauss points per cell in a given localization.
3325 * \param [in] locId - an id of the localization of interest.
3326 * \return int - the number of the Gauss points per cell.
3328 int MEDFileFieldGlobsReal::getNbOfGaussPtPerCell(int locId) const throw(INTERP_KERNEL::Exception)
3330 return contentNotNull()->getNbOfGaussPtPerCell(locId);
3334 * Returns an id of a localization by its name.
3335 * \param [in] loc - the localization name of interest.
3336 * \return int - the id of the localization.
3337 * \throw If there is no a localization named \a loc.
3339 int MEDFileFieldGlobsReal::getLocalizationId(const char *loc) const throw(INTERP_KERNEL::Exception)
3341 return contentNotNull()->getLocalizationId(loc);
3345 * Returns the name of the MED file.
3346 * \return const char * - the MED file name.
3348 const char *MEDFileFieldGlobsReal::getFileName() const
3350 return contentNotNull()->getFileName();
3353 std::string MEDFileFieldGlobsReal::getFileName2() const
3355 return contentNotNull()->getFileName2();
3359 * Returns a localization object by its name.
3360 * \param [in] locName - the name of the localization of interest.
3361 * \return const MEDFileFieldLoc& - the localization object having the name \a locName.
3362 * \throw If there is no a localization named \a locName.
3364 const MEDFileFieldLoc& MEDFileFieldGlobsReal::getLocalization(const char *locName) const throw(INTERP_KERNEL::Exception)
3366 return contentNotNull()->getLocalization(locName);
3370 * Returns a localization object by its id.
3371 * \param [in] locId - the id of the localization of interest.
3372 * \return const MEDFileFieldLoc& - the localization object having the id \a locId.
3373 * \throw If there is no a localization with id \a locId.
3375 const MEDFileFieldLoc& MEDFileFieldGlobsReal::getLocalizationFromId(int locId) const throw(INTERP_KERNEL::Exception)
3377 return contentNotNull()->getLocalizationFromId(locId);
3381 * Returns a profile array by its name.
3382 * \param [in] pflName - the name of the profile of interest.
3383 * \return const DataArrayInt * - the profile array having the name \a pflName.
3384 * \throw If there is no a profile named \a pflName.
3386 const DataArrayInt *MEDFileFieldGlobsReal::getProfile(const char *pflName) const throw(INTERP_KERNEL::Exception)
3388 return contentNotNull()->getProfile(pflName);
3392 * Returns a profile array by its id.
3393 * \param [in] pflId - the id of the profile of interest.
3394 * \return const DataArrayInt * - the profile array having the id \a pflId.
3395 * \throw If there is no a profile with id \a pflId.
3397 const DataArrayInt *MEDFileFieldGlobsReal::getProfileFromId(int pflId) const throw(INTERP_KERNEL::Exception)
3399 return contentNotNull()->getProfileFromId(pflId);
3403 * Returns a localization object, apt for modification, by its id.
3404 * \param [in] locId - the id of the localization of interest.
3405 * \return MEDFileFieldLoc& - a non-const reference to the localization object
3406 * having the id \a locId.
3407 * \throw If there is no a localization with id \a locId.
3409 MEDFileFieldLoc& MEDFileFieldGlobsReal::getLocalizationFromId(int locId) throw(INTERP_KERNEL::Exception)
3411 return contentNotNull()->getLocalizationFromId(locId);
3415 * Returns a localization object, apt for modification, by its name.
3416 * \param [in] locName - the name of the localization of interest.
3417 * \return MEDFileFieldLoc& - a non-const reference to the localization object
3418 * having the name \a locName.
3419 * \throw If there is no a localization named \a locName.
3421 MEDFileFieldLoc& MEDFileFieldGlobsReal::getLocalization(const char *locName) throw(INTERP_KERNEL::Exception)
3423 return contentNotNull()->getLocalization(locName);
3427 * Returns a profile array, apt for modification, by its name.
3428 * \param [in] pflName - the name of the profile of interest.
3429 * \return DataArrayInt * - a non-const pointer to the profile array having the name \a pflName.
3430 * \throw If there is no a profile named \a pflName.
3432 DataArrayInt *MEDFileFieldGlobsReal::getProfile(const char *pflName) throw(INTERP_KERNEL::Exception)
3434 return contentNotNull()->getProfile(pflName);
3438 * Returns a profile array, apt for modification, by its id.
3439 * \param [in] pflId - the id of the profile of interest.
3440 * \return DataArrayInt * - a non-const pointer to the profile array having the id \a pflId.
3441 * \throw If there is no a profile with id \a pflId.
3443 DataArrayInt *MEDFileFieldGlobsReal::getProfileFromId(int pflId) throw(INTERP_KERNEL::Exception)
3445 return contentNotNull()->getProfileFromId(pflId);
3449 * Removes profiles given by their ids. No data is updated to track this removal.
3450 * \param [in] pflIds - a sequence of ids of the profiles to remove.
3452 void MEDFileFieldGlobsReal::killProfileIds(const std::vector<int>& pflIds) throw(INTERP_KERNEL::Exception)
3454 contentNotNull()->killProfileIds(pflIds);
3458 * Removes localizations given by their ids. No data is updated to track this removal.
3459 * \param [in] locIds - a sequence of ids of the localizations to remove.
3461 void MEDFileFieldGlobsReal::killLocalizationIds(const std::vector<int>& locIds) throw(INTERP_KERNEL::Exception)
3463 contentNotNull()->killLocalizationIds(locIds);
3467 * Stores a profile array.
3468 * \param [in] pfl - the profile array to store.
3469 * \throw If the name of \a pfl is empty.
3470 * \throw If a profile with the same name as that of \a pfl already exists but contains
3473 void MEDFileFieldGlobsReal::appendProfile(DataArrayInt *pfl) throw(INTERP_KERNEL::Exception)
3475 contentNotNull()->appendProfile(pfl);
3479 * Adds a new localization of Gauss points.
3480 * \param [in] locName - the name of the new localization.
3481 * \param [in] geoType - a geometrical type of the reference cell.
3482 * \param [in] refCoo - coordinates of points of the reference cell. Size of this vector
3483 * must be \c nbOfNodesPerCell * \c dimOfType.
3484 * \param [in] gsCoo - coordinates of Gauss points on the reference cell. Size of this vector
3485 * must be _wg_.size() * \c dimOfType.
3486 * \param [in] w - the weights of Gauss points.
3487 * \throw If \a locName is empty.
3488 * \throw If a localization with the name \a locName already exists but is
3489 * different form the new one.
3491 void MEDFileFieldGlobsReal::appendLoc(const char *locName, INTERP_KERNEL::NormalizedCellType geoType, const std::vector<double>& refCoo, const std::vector<double>& gsCoo, const std::vector<double>& w) throw(INTERP_KERNEL::Exception)
3493 contentNotNull()->appendLoc(locName,geoType,refCoo,gsCoo,w);
3496 MEDFileFieldGlobs *MEDFileFieldGlobsReal::contentNotNull() throw(INTERP_KERNEL::Exception)
3498 MEDFileFieldGlobs *g(_globals);
3500 throw INTERP_KERNEL::Exception("MEDFileFieldGlobsReal::contentNotNull : no content in not const !");
3504 const MEDFileFieldGlobs *MEDFileFieldGlobsReal::contentNotNull() const throw(INTERP_KERNEL::Exception)
3506 const MEDFileFieldGlobs *g(_globals);
3508 throw INTERP_KERNEL::Exception("MEDFileFieldGlobsReal::contentNotNull : no content in const !");
3512 //= MEDFileFieldNameScope
3514 MEDFileFieldNameScope::MEDFileFieldNameScope()
3518 MEDFileFieldNameScope::MEDFileFieldNameScope(const char *fieldName):_name(fieldName)
3523 * Returns the name of \a this field.
3524 * \return std::string - a string containing the field name.
3526 std::string MEDFileFieldNameScope::getName() const throw(INTERP_KERNEL::Exception)
3532 * Sets name of \a this field
3533 * \param [in] name - the new field name.
3535 void MEDFileFieldNameScope::setName(const char *fieldName) throw(INTERP_KERNEL::Exception)
3540 std::string MEDFileFieldNameScope::getDtUnit() const throw(INTERP_KERNEL::Exception)
3545 void MEDFileFieldNameScope::setDtUnit(const char *dtUnit) throw(INTERP_KERNEL::Exception)
3550 void MEDFileFieldNameScope::copyNameScope(const MEDFileFieldNameScope& other)
3553 _dt_unit=other._dt_unit;
3556 //= MEDFileAnyTypeField1TSWithoutSDA
3558 void MEDFileAnyTypeField1TSWithoutSDA::deepCpyLeavesFrom(const MEDFileAnyTypeField1TSWithoutSDA& other) throw(INTERP_KERNEL::Exception)
3560 _field_per_mesh.resize(other._field_per_mesh.size());
3562 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=other._field_per_mesh.begin();it!=other._field_per_mesh.end();it++,i++)
3564 if((const MEDFileFieldPerMesh *)*it)
3565 _field_per_mesh[i]=(*it)->deepCpy(this);
3570 * Prints a string describing \a this field into a stream. This string is outputted
3571 * by \c print Python command.
3572 * \param [in] bkOffset - number of white spaces printed at the beginning of each line.
3573 * \param [in,out] oss - the out stream.
3574 * \param [in] f1tsId - the field index within a MED file. If \a f1tsId < 0, the tiny
3575 * info id printed, else, not.
3577 void MEDFileAnyTypeField1TSWithoutSDA::simpleRepr(int bkOffset, std::ostream& oss, int f1tsId) const
3579 std::string startOfLine(bkOffset,' ');
3580 oss << startOfLine << "Field ";
3582 oss << "[Type=" << getTypeStr() << "] ";
3583 oss << "on One time Step ";
3585 oss << "(" << f1tsId << ") ";
3586 oss << "on iteration=" << _iteration << " order=" << _order << "." << std::endl;
3587 oss << startOfLine << "Time attached is : " << _dt << " [" << _dt_unit << "]." << std::endl;
3588 const DataArray *arr=getUndergroundDataArray();
3591 const std::vector<std::string> &comps=arr->getInfoOnComponents();
3594 oss << startOfLine << "Field Name : \"" << arr->getName() << "\"." << std::endl;
3595 oss << startOfLine << "Field has " << comps.size() << " components with the following infos :" << std::endl;
3596 for(std::vector<std::string>::const_iterator it=comps.begin();it!=comps.end();it++)
3597 oss << startOfLine << " - \"" << (*it) << "\"" << std::endl;
3599 if(arr->isAllocated())
3601 oss << startOfLine << "Whole field contains " << arr->getNumberOfTuples() << " tuples." << std::endl;
3604 oss << startOfLine << "The array of the current field has not allocated yet !" << std::endl;
3608 oss << startOfLine << "Field infos are empty ! Not defined yet !" << std::endl;
3610 oss << startOfLine << "----------------------" << std::endl;
3611 if(!_field_per_mesh.empty())
3614 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it2=_field_per_mesh.begin();it2!=_field_per_mesh.end();it2++,i++)
3616 const MEDFileFieldPerMesh *cur=(*it2);
3618 cur->simpleRepr(bkOffset,oss,i);
3620 oss << startOfLine << "Field per mesh #" << i << " is not defined !" << std::endl;
3625 oss << startOfLine << "Field is not defined on any meshes !" << std::endl;
3627 oss << startOfLine << "----------------------" << std::endl;
3630 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > MEDFileAnyTypeField1TSWithoutSDA::splitComponents() const throw(INTERP_KERNEL::Exception)
3632 const DataArray *arr(getUndergroundDataArray());
3634 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::splitComponents : no array defined !");
3635 int nbOfCompo=arr->getNumberOfComponents();
3636 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > ret(nbOfCompo);
3637 for(int i=0;i<nbOfCompo;i++)
3640 std::vector<int> v(1,i);
3641 MEDCouplingAutoRefCountObjectPtr<DataArray> arr2=arr->keepSelectedComponents(v);
3642 ret[i]->setArray(arr2);
3647 MEDFileAnyTypeField1TSWithoutSDA::MEDFileAnyTypeField1TSWithoutSDA(const char *fieldName, int csit, int iteration, int order):MEDFileFieldNameScope(fieldName),_iteration(iteration),_order(order),_csit(csit),_nb_of_tuples_to_be_allocated(-2)
3651 MEDFileAnyTypeField1TSWithoutSDA::MEDFileAnyTypeField1TSWithoutSDA():_iteration(-1),_order(-1),_dt(0.),_csit(-1),_nb_of_tuples_to_be_allocated(-1)
3656 * Returns the maximal dimension of supporting elements. Returns -2 if \a this is
3657 * empty. Returns -1 if this in on nodes.
3658 * \return int - the dimension of \a this.
3660 int MEDFileAnyTypeField1TSWithoutSDA::getDimension() const
3663 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3664 (*it)->getDimension(ret);
3669 * Returns the mesh name.
3670 * \return std::string - a string holding the mesh name.
3671 * \throw If \c _field_per_mesh.empty()
3673 std::string MEDFileAnyTypeField1TSWithoutSDA::getMeshName() const throw(INTERP_KERNEL::Exception)
3675 if(_field_per_mesh.empty())
3676 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::getMeshName : No field set !");
3677 return _field_per_mesh[0]->getMeshName();
3680 void MEDFileAnyTypeField1TSWithoutSDA::setMeshName(const char *newMeshName) throw(INTERP_KERNEL::Exception)
3682 std::string oldName(getMeshName());
3683 std::vector< std::pair<std::string,std::string> > v(1);
3684 v[0].first=oldName; v[0].second=newMeshName;
3688 bool MEDFileAnyTypeField1TSWithoutSDA::changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab) throw(INTERP_KERNEL::Exception)
3691 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3693 MEDFileFieldPerMesh *cur(*it);
3695 ret=cur->changeMeshNames(modifTab) || ret;
3701 * Returns the number of iteration of the state of underlying mesh.
3702 * \return int - the iteration number.
3703 * \throw If \c _field_per_mesh.empty()
3705 int MEDFileAnyTypeField1TSWithoutSDA::getMeshIteration() const throw(INTERP_KERNEL::Exception)
3707 if(_field_per_mesh.empty())
3708 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::getMeshIteration : No field set !");
3709 return _field_per_mesh[0]->getMeshIteration();
3713 * Returns the order number of iteration of the state of underlying mesh.
3714 * \return int - the order number.
3715 * \throw If \c _field_per_mesh.empty()
3717 int MEDFileAnyTypeField1TSWithoutSDA::getMeshOrder() const throw(INTERP_KERNEL::Exception)
3719 if(_field_per_mesh.empty())
3720 throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypePerDisc::getMeshOrder : No field set !");
3721 return _field_per_mesh[0]->getMeshOrder();
3725 * Checks if \a this field is tagged by a given iteration number and a given
3726 * iteration order number.
3727 * \param [in] iteration - the iteration number of interest.
3728 * \param [in] order - the iteration order number of interest.
3729 * \return bool - \c true if \a this->getIteration() == \a iteration &&
3730 * \a this->getOrder() == \a order.
3732 bool MEDFileAnyTypeField1TSWithoutSDA::isDealingTS(int iteration, int order) const
3734 return iteration==_iteration && order==_order;
3738 * Returns number of iteration and order number of iteration when
3739 * \a this field has been calculated.
3740 * \return std::pair<int,int> - a pair of the iteration number and the iteration
3743 std::pair<int,int> MEDFileAnyTypeField1TSWithoutSDA::getDtIt() const
3745 std::pair<int,int> p;
3751 * Returns number of iteration and order number of iteration when
3752 * \a this field has been calculated.
3753 * \param [in,out] p - a pair returning the iteration number and the iteration
3756 void MEDFileAnyTypeField1TSWithoutSDA::fillIteration(std::pair<int,int>& p) const
3763 * Returns all types of spatial discretization of \a this field.
3764 * \param [in,out] types - a sequence of types of \a this field.
3766 void MEDFileAnyTypeField1TSWithoutSDA::fillTypesOfFieldAvailable(std::vector<TypeOfField>& types) const throw(INTERP_KERNEL::Exception)
3768 std::set<TypeOfField> types2;
3769 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3771 (*it)->fillTypesOfFieldAvailable(types2);
3773 std::back_insert_iterator< std::vector<TypeOfField> > bi(types);
3774 std::copy(types2.begin(),types2.end(),bi);
3778 * Returns all types of spatial discretization of \a this field.
3779 * \return std::vector<TypeOfField> - a sequence of types of spatial discretization
3782 std::vector<TypeOfField> MEDFileAnyTypeField1TSWithoutSDA::getTypesOfFieldAvailable() const throw(INTERP_KERNEL::Exception)
3784 std::vector<TypeOfField> ret;
3785 fillTypesOfFieldAvailable(ret);
3789 std::vector<std::string> MEDFileAnyTypeField1TSWithoutSDA::getPflsReallyUsed2() const
3791 std::vector<std::string> ret;
3792 std::set<std::string> ret2;
3793 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3795 std::vector<std::string> tmp=(*it)->getPflsReallyUsed();
3796 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
3797 if(ret2.find(*it2)==ret2.end())
3799 ret.push_back(*it2);
3806 std::vector<std::string> MEDFileAnyTypeField1TSWithoutSDA::getLocsReallyUsed2() const
3808 std::vector<std::string> ret;
3809 std::set<std::string> ret2;
3810 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3812 std::vector<std::string> tmp=(*it)->getLocsReallyUsed();
3813 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
3814 if(ret2.find(*it2)==ret2.end())
3816 ret.push_back(*it2);
3823 std::vector<std::string> MEDFileAnyTypeField1TSWithoutSDA::getPflsReallyUsedMulti2() const
3825 std::vector<std::string> ret;
3826 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3828 std::vector<std::string> tmp=(*it)->getPflsReallyUsedMulti();
3829 ret.insert(ret.end(),tmp.begin(),tmp.end());
3834 std::vector<std::string> MEDFileAnyTypeField1TSWithoutSDA::getLocsReallyUsedMulti2() const
3836 std::vector<std::string> ret;
3837 std::set<std::string> ret2;
3838 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3840 std::vector<std::string> tmp=(*it)->getLocsReallyUsedMulti();
3841 ret.insert(ret.end(),tmp.begin(),tmp.end());
3846 void MEDFileAnyTypeField1TSWithoutSDA::changePflsRefsNamesGen2(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
3848 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3849 (*it)->changePflsRefsNamesGen(mapOfModif);
3852 void MEDFileAnyTypeField1TSWithoutSDA::changeLocsRefsNamesGen2(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
3854 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
3855 (*it)->changeLocsRefsNamesGen(mapOfModif);
3859 * Returns all attributes of parts of \a this field lying on a given mesh.
3860 * Each part differs from other ones by a type of supporting mesh entity. The _i_-th
3861 * item of every of returned sequences refers to the _i_-th part of \a this field.
3862 * Thus all sequences returned by this method are of the same length equal to number
3863 * of different types of supporting entities.<br>
3864 * A field part can include sub-parts with several different spatial discretizations,
3865 * \ref ParaMEDMEM::ON_CELLS "ON_CELLS" and \ref ParaMEDMEM::ON_GAUSS_PT "ON_GAUSS_PT"
3866 * for example. Hence, some of the returned sequences contains nested sequences, and an item
3867 * of a nested sequence corresponds to a type of spatial discretization.<br>
3868 * This method allows for iteration over MEDFile DataStructure without any overhead.
3869 * \param [in] mname - a name of a mesh of interest. It can be \c NULL, which is valid
3870 * for the case with only one underlying mesh. (Actually, the number of meshes is
3871 * not checked if \a mname == \c NULL).
3872 * \param [in,out] types - a sequence of types of underlying mesh entities. A type per
3873 * a field part is returned.
3874 * \param [in,out] typesF - a sequence of sequences of types of spatial discretizations.
3875 * This sequence is of the same length as \a types.
3876 * \param [in,out] pfls - a sequence returning a profile name per each type of spatial
3877 * discretization. A profile name can be empty.
3878 * Length of this and of nested sequences is the same as that of \a typesF.
3879 * \param [in,out] locs - a sequence returning a localization name per each type of spatial
3880 * discretization. A localization name can be empty.
3881 * Length of this and of nested sequences is the same as that of \a typesF.
3882 * \return std::vector< std::vector< std::pair<int,int> > > - a sequence holding a range
3883 * of ids of tuples within the data array, per each type of spatial
3884 * discretization within one mesh entity type.
3885 * Length of this and of nested sequences is the same as that of \a typesF.
3886 * \throw If no field is lying on \a mname.
3888 std::vector< std::vector< std::pair<int,int> > > MEDFileAnyTypeField1TSWithoutSDA::getFieldSplitedByType(const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
3892 meshId=getMeshIdFromMeshName(mname);
3894 if(_field_per_mesh.empty())
3895 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getFieldSplitedByType : This is empty !");
3896 return _field_per_mesh[meshId]->getFieldSplitedByType(types,typesF,pfls,locs);
3900 * Returns dimensions of mesh elements \a this field lies on. The returned value is a
3901 * maximal absolute dimension and values returned via the out parameter \a levs are
3902 * dimensions relative to the maximal absolute dimension. <br>
3903 * This method is designed for MEDFileField1TS instances that have a discretization
3904 * \ref ParaMEDMEM::ON_CELLS "ON_CELLS",
3905 * \ref ParaMEDMEM::ON_GAUSS_PT "ON_GAUSS_PT",
3906 * \ref ParaMEDMEM::ON_GAUSS_NE "ON_GAUSS_NE".
3907 * Only these 3 discretizations will be taken into account here. If \a this is
3908 * \ref ParaMEDMEM::ON_NODES "ON_NODES", -1 is returned and \a levs are empty.<br>
3909 * This method is useful to make the link between the dimension of the underlying mesh
3910 * and the levels of \a this, because it is possible that the highest dimension of \a this
3911 * field is not equal to the dimension of the underlying mesh.
3913 * Let's consider the following case:
3914 * - mesh \a m1 has a meshDimension 3 and has non empty levels [0,-1,-2] with elements
3915 * TETRA4, HEXA8, TRI3 and SEG2.
3916 * - field \a f1 lies on \a m1 and is defined on 3D and 1D elements TETRA4 and SEG2.
3917 * - field \a f2 lies on \a m1 and is defined on 2D and 1D elements TRI3 and SEG2.
3919 * In this case \a f1->getNonEmptyLevels() returns (3,[0,-2]) and \a
3920 * f2->getNonEmptyLevels() returns (2,[0,-1]). <br>
3921 * The returned values can be used for example to retrieve a MEDCouplingFieldDouble lying
3922 * on elements of a certain relative level by calling getFieldAtLevel(). \a meshDimRelToMax
3923 * parameter of getFieldAtLevel() is computed basing on the returned values as this:
3924 * <em> meshDimRelToMax = absDim - meshDim + relativeLev </em>.
3926 * to retrieve the highest level of
3927 * \a f1: <em>f1->getFieldAtLevel( ON_CELLS, 3-3+0 ); // absDim - meshDim + relativeLev</em><br>
3928 * to retrieve the lowest level of \a f1: <em>f1->getFieldAtLevel( ON_CELLS, 3-3+(-2) );</em><br>
3929 * to retrieve the highest level of \a f2: <em>f2->getFieldAtLevel( ON_CELLS, 2-3+0 );</em><br>
3930 * to retrieve the lowest level of \a f2: <em>f2->getFieldAtLevel( ON_CELLS, 2-3+(-1) )</em>.
3931 * \param [in] mname - a name of a mesh of interest. It can be \c NULL, which is valid
3932 * for the case with only one underlying mesh. (Actually, the number of meshes is
3933 * not checked if \a mname == \c NULL).
3934 * \param [in,out] levs - a sequence returning the dimensions relative to the maximal
3935 * absolute one. They are in decreasing order. This sequence is cleared before
3937 * \return int - the maximal absolute dimension of elements \a this fields lies on.
3938 * \throw If no field is lying on \a mname.
3940 int MEDFileAnyTypeField1TSWithoutSDA::getNonEmptyLevels(const char *mname, std::vector<int>& levs) const throw(INTERP_KERNEL::Exception)
3943 int meshId=getMeshIdFromMeshName(mname);
3944 std::vector<INTERP_KERNEL::NormalizedCellType> types;
3945 std::vector< std::vector<TypeOfField> > typesF;
3946 std::vector< std::vector<std::string> > pfls, locs;
3947 _field_per_mesh[meshId]->getFieldSplitedByType(types,typesF,pfls,locs);
3949 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getNonEmptyLevels : 'this' is empty !");
3950 std::set<INTERP_KERNEL::NormalizedCellType> st(types.begin(),types.end());
3951 if(st.size()==1 && (*st.begin())==INTERP_KERNEL::NORM_ERROR)
3953 st.erase(INTERP_KERNEL::NORM_ERROR);
3955 for(std::set<INTERP_KERNEL::NormalizedCellType>::const_iterator it=st.begin();it!=st.end();it++)
3957 const INTERP_KERNEL::CellModel& cm=INTERP_KERNEL::CellModel::GetCellModel(*it);
3958 ret1.insert((int)cm.getDimension());
3960 int ret=*std::max_element(ret1.begin(),ret1.end());
3961 std::copy(ret1.rbegin(),ret1.rend(),std::back_insert_iterator<std::vector<int> >(levs));
3962 std::transform(levs.begin(),levs.end(),levs.begin(),std::bind2nd(std::plus<int>(),-ret));
3967 * \param [in] mName specifies the underlying mesh name. This value can be pointer 0 for users that do not deal with fields on multi mesh.
3968 * \param [in] typ is for the geometric cell type (or INTERP_KERNEL::NORM_ERROR for node field) entry to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set.
3969 * \param [in] locId is the localization id to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set. It corresponds to the position of
3970 * \c pfls[std::distance(types.begin(),std::find(types.begin(),typ)] vector in MEDFileField1TSWithoutSDA::getFieldSplitedByType. For non gausspoints field users, the value is 0.
3972 MEDFileFieldPerMeshPerTypePerDisc *MEDFileAnyTypeField1TSWithoutSDA::getLeafGivenMeshAndTypeAndLocId(const char *mName, INTERP_KERNEL::NormalizedCellType typ, int locId) throw(INTERP_KERNEL::Exception)
3974 int mid=getMeshIdFromMeshName(mName);
3975 return _field_per_mesh[mid]->getLeafGivenTypeAndLocId(typ,locId);
3979 * \param [in] mName specifies the underlying mesh name. This value can be pointer 0 for users that do not deal with fields on multi mesh.
3980 * \param [in] typ is for the geometric cell type (or INTERP_KERNEL::NORM_ERROR for node field) entry to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set.
3981 * \param [in] locId is the localization id to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set. It corresponds to the position of
3982 * \c pfls[std::distance(types.begin(),std::find(types.begin(),typ)] vector in MEDFileField1TSWithoutSDA::getFieldSplitedByType. For non gausspoints field users, the value is 0.
3984 const MEDFileFieldPerMeshPerTypePerDisc *MEDFileAnyTypeField1TSWithoutSDA::getLeafGivenMeshAndTypeAndLocId(const char *mName, INTERP_KERNEL::NormalizedCellType typ, int locId) const throw(INTERP_KERNEL::Exception)
3986 int mid=getMeshIdFromMeshName(mName);
3987 return _field_per_mesh[mid]->getLeafGivenTypeAndLocId(typ,locId);
3991 * \param [in] mName specifies the underlying mesh name. This value can be pointer 0 for users that do not deal with fields on multi mesh.
3993 int MEDFileAnyTypeField1TSWithoutSDA::getMeshIdFromMeshName(const char *mName) const throw(INTERP_KERNEL::Exception)
3995 if(_field_per_mesh.empty())
3996 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getMeshIdFromMeshName : No field set !");
3999 std::string mName2(mName);
4001 std::vector<std::string> msg;
4002 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++,ret++)
4003 if(mName2==(*it)->getMeshName())
4006 msg.push_back((*it)->getMeshName());
4007 std::ostringstream oss; oss << "MEDFileField1TSWithoutSDA::getMeshIdFromMeshName : No such mesh \"" << mName2 << "\" as underlying mesh of field \"" << getName() << "\" !\n";
4008 oss << "Possible meshes are : ";
4009 for(std::vector<std::string>::const_iterator it2=msg.begin();it2!=msg.end();it2++)
4010 oss << "\"" << (*it2) << "\" ";
4011 throw INTERP_KERNEL::Exception(oss.str().c_str());
4014 int MEDFileAnyTypeField1TSWithoutSDA::addNewEntryIfNecessary(const MEDCouplingMesh *mesh) throw(INTERP_KERNEL::Exception)
4017 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::addNewEntryIfNecessary : input mesh is NULL !");
4018 std::string tmp(mesh->getName());
4020 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::addNewEntryIfNecessary : empty mesh name ! unsupported by MED file !");
4021 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();
4023 for(;it!=_field_per_mesh.end();it++,i++)
4025 if((*it)->getMeshName()==tmp)
4028 int sz=_field_per_mesh.size();
4029 _field_per_mesh.resize(sz+1);
4030 _field_per_mesh[sz]=MEDFileFieldPerMesh::New(this,mesh);
4034 bool MEDFileAnyTypeField1TSWithoutSDA::renumberEntitiesLyingOnMesh(const char *meshName, const std::vector<int>& oldCode, const std::vector<int>& newCode, const DataArrayInt *renumO2N,
4035 MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
4038 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
4040 MEDFileFieldPerMesh *fpm(*it);
4042 ret=fpm->renumberEntitiesLyingOnMesh(meshName,oldCode,newCode,renumO2N,glob) || ret;
4047 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > MEDFileAnyTypeField1TSWithoutSDA::splitDiscretizations() const throw(INTERP_KERNEL::Exception)
4049 std::vector<INTERP_KERNEL::NormalizedCellType> types;
4050 std::vector< std::vector<TypeOfField> > typesF;
4051 std::vector< std::vector<std::string> > pfls,locs;
4052 std::vector< std::vector<std::pair<int,int> > > bgEnd=getFieldSplitedByType(getMeshName().c_str(),types,typesF,pfls,locs);
4053 std::set<TypeOfField> allEnt;
4054 for(std::vector< std::vector<TypeOfField> >::const_iterator it1=typesF.begin();it1!=typesF.end();it1++)
4055 for(std::vector<TypeOfField>::const_iterator it2=(*it1).begin();it2!=(*it1).end();it2++)
4056 allEnt.insert(*it2);
4057 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > ret(allEnt.size());
4058 std::set<TypeOfField>::const_iterator it3(allEnt.begin());
4059 for(std::size_t i=0;i<allEnt.size();i++,it3++)
4061 std::vector< std::pair<int,int> > its;
4062 ret[i]=shallowCpy();
4063 int newLgth=ret[i]->keepOnlySpatialDiscretization(*it3,its);
4064 ret[i]->updateData(newLgth,its);
4069 int MEDFileAnyTypeField1TSWithoutSDA::keepOnlySpatialDiscretization(TypeOfField tof, std::vector< std::pair<int,int> >& its) throw(INTERP_KERNEL::Exception)
4071 int globalCounter=0;
4072 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
4073 (*it)->keepOnlySpatialDiscretization(tof,globalCounter,its);
4074 return globalCounter;
4077 void MEDFileAnyTypeField1TSWithoutSDA::updateData(int newLgth, const std::vector< std::pair<int,int> >& oldStartStops) throw(INTERP_KERNEL::Exception)
4079 if(_nb_of_tuples_to_be_allocated>=0)
4081 _nb_of_tuples_to_be_allocated=newLgth;
4084 if(_nb_of_tuples_to_be_allocated==-1)
4086 if(_nb_of_tuples_to_be_allocated==-2 || _nb_of_tuples_to_be_allocated==-3)
4088 const DataArray *oldArr=getUndergroundDataArray();
4089 if(!oldArr || !oldArr->isAllocated())
4090 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::updateData : internal error 1 !");
4091 MEDCouplingAutoRefCountObjectPtr<DataArray> newArr=createNewEmptyDataArrayInstance();
4092 newArr->alloc(newLgth,getNumberOfComponents());
4094 for(std::vector< std::pair<int,int> >::const_iterator it=oldStartStops.begin();it!=oldStartStops.end();it++)
4096 if((*it).second<(*it).first)
4097 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::updateData : the range in the leaves was invalid !");
4098 newArr->setContigPartOfSelectedValues2(pos,oldArr,(*it).first,(*it).second,1);
4099 pos+=(*it).second-(*it).first;
4104 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::updateData : internal error 2 !");
4107 void MEDFileAnyTypeField1TSWithoutSDA::writeLL(med_idt fid, const MEDFileWritable& opts, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
4109 if(_field_per_mesh.empty())
4110 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::writeLL : empty field !");
4111 if(_field_per_mesh.size()>1)
4112 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::writeLL : In MED3.0 mode in writting mode only ONE underlying mesh supported !");
4113 _field_per_mesh[0]->copyOptionsFrom(opts);
4114 _field_per_mesh[0]->writeLL(fid,nasc);
4118 * This methods returns true is the allocation has been needed leading to a modification of state in \a this->_nb_of_tuples_to_be_allocated.
4119 * If false is returned the memory allocation is not required.
4121 bool MEDFileAnyTypeField1TSWithoutSDA::allocIfNecessaryTheArrayToReceiveDataFromFile() throw(INTERP_KERNEL::Exception)
4123 if(_nb_of_tuples_to_be_allocated>=0)
4125 getOrCreateAndGetArray()->alloc(_nb_of_tuples_to_be_allocated,getNumberOfComponents());
4126 _nb_of_tuples_to_be_allocated=-2;
4129 if(_nb_of_tuples_to_be_allocated==-2 || _nb_of_tuples_to_be_allocated==-3)
4131 if(_nb_of_tuples_to_be_allocated==-1)
4132 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::allocIfNecessaryTheArrayToReceiveDataFromFile : trying to read from a file an empty instance ! Need to prepare the structure before !");
4133 if(_nb_of_tuples_to_be_allocated<-3)
4134 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::allocIfNecessaryTheArrayToReceiveDataFromFile : internal error !");
4138 void MEDFileAnyTypeField1TSWithoutSDA::loadOnlyStructureOfDataRecursively(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
4140 med_int numdt,numit;
4144 med_int meshnumdt,meshnumit;
4145 INTERP_KERNEL::AutoPtr<char> meshName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
4146 MEDfieldComputingStepInfo(fid,nasc.getName().c_str(),_csit,&numdt,&numit,&_dt);
4147 MEDfield23ComputingStepMeshInfo(fid,nasc.getName().c_str(),_csit,&numdt,&numit,&dt,&nmesh,meshName,&localMesh,&meshnumdt,&meshnumit);
4148 if(_iteration!=numdt || _order!=numit)
4149 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::loadBigArraysRecursively : unexpected exception internal error !");
4150 _field_per_mesh.resize(nmesh);
4151 for(int i=0;i<nmesh;i++)
4152 _field_per_mesh[i]=MEDFileFieldPerMesh::NewOnRead(fid,this,i+1,meshnumdt,meshnumit,nasc);//tony
4153 _nb_of_tuples_to_be_allocated=0;
4154 for(int i=0;i<nmesh;i++)
4155 _field_per_mesh[i]->loadOnlyStructureOfDataRecursively(fid,_nb_of_tuples_to_be_allocated,nasc);
4158 void MEDFileAnyTypeField1TSWithoutSDA::loadBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
4160 allocIfNecessaryTheArrayToReceiveDataFromFile();
4161 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
4162 (*it)->loadBigArraysRecursively(fid,nasc);
4165 void MEDFileAnyTypeField1TSWithoutSDA::loadBigArraysRecursivelyIfNecessary(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
4167 if(allocIfNecessaryTheArrayToReceiveDataFromFile())
4168 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
4169 (*it)->loadBigArraysRecursively(fid,nasc);
4172 void MEDFileAnyTypeField1TSWithoutSDA::loadStructureAndBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
4174 loadOnlyStructureOfDataRecursively(fid,nasc);
4175 loadBigArraysRecursively(fid,nasc);
4178 void MEDFileAnyTypeField1TSWithoutSDA::releaseArrays() throw(INTERP_KERNEL::Exception)
4180 DataArray *thisArr(getUndergroundDataArray());
4181 if(thisArr && thisArr->isAllocated())
4183 _nb_of_tuples_to_be_allocated=thisArr->getNumberOfTuples();
4184 thisArr->desallocate();
4188 std::size_t MEDFileAnyTypeField1TSWithoutSDA::getHeapMemorySize() const
4190 std::size_t ret=_dt_unit.capacity()+_field_per_mesh.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh >);
4191 if(getUndergroundDataArray())
4192 ret+=getUndergroundDataArray()->getHeapMemorySize();
4193 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileFieldPerMesh > >::const_iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
4194 ret+=(*it)->getHeapMemorySize();
4199 * Adds a MEDCouplingFieldDouble to \a this. The underlying mesh of the given field is
4200 * checked if its elements are sorted suitable for writing to MED file ("STB" stands for
4201 * "Sort By Type"), if not, an exception is thrown.
4202 * \param [in] field - the field to add to \a this. The array of field \a field is ignored
4203 * \param [in] arr - the array of values.
4204 * \param [in,out] glob - the global data where profiles and localization present in
4205 * \a field, if any, are added.
4206 * \throw If the name of \a field is empty.
4207 * \throw If the data array of \a field is not set.
4208 * \throw If \a this->_arr is already allocated but has different number of components
4210 * \throw If the underlying mesh of \a field has no name.
4211 * \throw If elements in the mesh are not in the order suitable for writing to the MED file.
4213 void MEDFileAnyTypeField1TSWithoutSDA::setFieldNoProfileSBT(const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
4215 const MEDCouplingMesh *mesh=field->getMesh();
4217 TypeOfField type=field->getTypeOfField();
4218 std::vector<DataArrayInt *> dummy;
4219 int start=copyTinyInfoFrom(field,arr);
4220 int pos=addNewEntryIfNecessary(mesh);
4223 std::vector<int> code=MEDFileField1TSWithoutSDA::CheckSBTMesh(mesh);
4224 _field_per_mesh[pos]->assignFieldNoProfileNoRenum(start,code,field,arr,glob,nasc);
4227 _field_per_mesh[pos]->assignNodeFieldNoProfile(start,field,arr,glob);
4231 * Adds a MEDCouplingFieldDouble to \a this. Specified entities of a given dimension
4232 * of a given mesh are used as the support of the given field (a real support is not used).
4233 * Elements of the given mesh must be sorted suitable for writing to MED file.
4234 * Order of underlying mesh entities of the given field specified by \a profile parameter
4235 * is not prescribed; this method permutes field values to have them sorted by element
4236 * type as required for writing to MED file. A new profile is added only if no equal
4237 * profile is missing.
4238 * \param [in] field - the field to add to \a this. The field double values are ignored.
4239 * \param [in] arrOfVals - the values of the field \a field used.
4240 * \param [in] mesh - the supporting mesh of \a field.
4241 * \param [in] meshDimRelToMax - a relative dimension of mesh entities \a field lies on.
4242 * \param [in] profile - ids of mesh entities on which corresponding field values lie.
4243 * \param [in,out] glob - the global data where profiles and localization present in
4244 * \a field, if any, are added.
4245 * \throw If either \a field or \a mesh or \a profile has an empty name.
4246 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
4247 * \throw If the data array of \a field is not set.
4248 * \throw If \a this->_arr is already allocated but has different number of components
4250 * \throw If elements in \a mesh are not in the order suitable for writing to the MED file.
4251 * \sa setFieldNoProfileSBT()
4253 void MEDFileAnyTypeField1TSWithoutSDA::setFieldProfile(const MEDCouplingFieldDouble *field, const DataArray *arrOfVals, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
4255 TypeOfField type=field->getTypeOfField();
4256 int start=copyTinyInfoFrom(field,arrOfVals);
4257 std::vector<DataArrayInt *> idsInPflPerType;
4258 std::vector<DataArrayInt *> idsPerType;
4259 std::vector<int> code,code2;
4260 MEDCouplingAutoRefCountObjectPtr<MEDCouplingMesh> m=mesh->getGenMeshAtLevel(meshDimRelToMax);
4263 m->splitProfilePerType(profile,code,idsInPflPerType,idsPerType);
4264 code2=m->getDistributionOfTypes();
4266 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > idsInPflPerType2(idsInPflPerType.size());
4267 for(std::size_t i=0;i<idsInPflPerType.size();i++)
4268 idsInPflPerType2[i]=idsInPflPerType[i];
4269 std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > idsPerType2(idsPerType.size());
4270 for(std::size_t i=0;i<idsPerType.size();i++)
4271 idsPerType2[i]=idsPerType[i];
4273 int pos=addNewEntryIfNecessary(m);
4274 _field_per_mesh[pos]->assignFieldProfile(start,profile,code,code2,idsInPflPerType,idsPerType,field,arrOfVals,m,glob,nasc);
4278 int pos=addNewEntryIfNecessary(m);
4279 _field_per_mesh[pos]->assignNodeFieldProfile(start,profile,field,arrOfVals,glob,nasc);
4284 * \param [in] newNbOfTuples - The new nb of tuples to be allocated.
4286 void MEDFileAnyTypeField1TSWithoutSDA::allocNotFromFile(int newNbOfTuples) throw(INTERP_KERNEL::Exception)
4288 if(_nb_of_tuples_to_be_allocated>=0)
4289 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::allocNotFromFile : the object is expected to be appended to a data coming from a file but not loaded ! Load before appending data !");
4290 DataArray *arr(getOrCreateAndGetArray());
4291 arr->alloc(newNbOfTuples,arr->getNumberOfComponents());
4292 _nb_of_tuples_to_be_allocated=-3;
4296 * Copies tiny info and allocates \a this->_arr instance of DataArrayDouble to
4297 * append data of a given MEDCouplingFieldDouble. So that the size of \a this->_arr becomes
4298 * larger by the size of \a field. Returns an id of the first not filled
4299 * tuple of \a this->_arr.
4300 * \param [in] field - the field to copy the info on components and the name from.
4301 * \return int - the id of first not initialized tuple of \a this->_arr.
4302 * \throw If the name of \a field is empty.
4303 * \throw If the data array of \a field is not set.
4304 * \throw If \a this->_arr is already allocated but has different number of components
4307 int MEDFileAnyTypeField1TSWithoutSDA::copyTinyInfoFrom(const MEDCouplingFieldDouble *field, const DataArray *arr) throw(INTERP_KERNEL::Exception)
4310 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::copyTinyInfoFrom : input field is NULL !");
4311 std::string name(field->getName());
4312 setName(name.c_str());
4313 setDtUnit(field->getTimeUnit());
4315 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::copyTinyInfoFrom : unsupported fields with no name in MED file !");
4317 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::copyTinyInfoFrom : no array set !");
4318 if(!arr->isAllocated())
4319 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::copyTinyInfoFrom : array is not allocated !");
4320 _dt=field->getTime(_iteration,_order);
4321 int nbOfComponents=arr->getNumberOfComponents();
4322 getOrCreateAndGetArray()->setInfoAndChangeNbOfCompo(arr->getInfoOnComponents());
4323 if(!getOrCreateAndGetArray()->isAllocated())
4325 allocNotFromFile(arr->getNumberOfTuples());
4330 int oldNbOfTuples=getOrCreateAndGetArray()->getNumberOfTuples();
4331 int newNbOfTuples=oldNbOfTuples+arr->getNumberOfTuples();
4332 getOrCreateAndGetArray()->reAlloc(newNbOfTuples);
4333 _nb_of_tuples_to_be_allocated=-3;
4334 return oldNbOfTuples;
4339 * Returns number of components in \a this field
4340 * \return int - the number of components.
4342 int MEDFileAnyTypeField1TSWithoutSDA::getNumberOfComponents() const
4344 return getOrCreateAndGetArray()->getNumberOfComponents();
4348 * Change info on components in \a this.
4349 * \throw If size of \a infos is not equal to the number of components already in \a this.
4351 void MEDFileAnyTypeField1TSWithoutSDA::setInfo(const std::vector<std::string>& infos) throw(INTERP_KERNEL::Exception)
4353 DataArray *arr=getOrCreateAndGetArray();
4354 arr->setInfoOnComponents(infos);//will throw an exception if number of components mimatches
4358 * Returns info on components of \a this field.
4359 * \return const std::vector<std::string>& - a sequence of strings each being an
4360 * information on _i_-th component.
4362 const std::vector<std::string>& MEDFileAnyTypeField1TSWithoutSDA::getInfo() const
4364 const DataArray *arr=getOrCreateAndGetArray();
4365 return arr->getInfoOnComponents();
4369 * Returns a mutable info on components of \a this field.
4370 * \return std::vector<std::string>& - a sequence of strings each being an
4371 * information on _i_-th component.
4373 std::vector<std::string>& MEDFileAnyTypeField1TSWithoutSDA::getInfo()
4375 DataArray *arr=getOrCreateAndGetArray();
4376 return arr->getInfoOnComponents();
4380 * Returns a new MEDCouplingFieldDouble of given type lying on a given support.
4381 * \param [in] type - a spatial discretization of the new field.
4382 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
4383 * \param [in] mName - a name of the supporting mesh.
4384 * \param [in] renumPol - specifies how to permute values of the result field according to
4385 * the optional numbers of cells and nodes, if any. The valid values are
4386 * - 0 - do not permute.
4387 * - 1 - permute cells.
4388 * - 2 - permute nodes.
4389 * - 3 - permute cells and nodes.
4391 * \param [in] glob - the global data storing profiles and localization.
4392 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
4393 * caller is to delete this field using decrRef() as it is no more needed.
4394 * \throw If the MED file is not readable.
4395 * \throw If there is no mesh named \a mName in the MED file.
4396 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
4397 * \throw If no field of \a this is lying on the mesh \a mName.
4398 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
4400 MEDCouplingFieldDouble *MEDFileAnyTypeField1TSWithoutSDA::getFieldAtLevel(TypeOfField type, int meshDimRelToMax, const char *mName, int renumPol, const MEDFileFieldGlobsReal *glob, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
4402 MEDCouplingAutoRefCountObjectPtr<MEDFileMesh> mm;
4404 mm=MEDFileMesh::New(glob->getFileName(),getMeshName().c_str(),getMeshIteration(),getMeshOrder());
4406 mm=MEDFileMesh::New(glob->getFileName(),mName,getMeshIteration(),getMeshOrder());
4407 return MEDFileAnyTypeField1TSWithoutSDA::getFieldOnMeshAtLevel(type,meshDimRelToMax,renumPol,glob,mm,arrOut,nasc);
4411 * Returns a new MEDCouplingFieldDouble of given type lying on a given support.
4412 * \param [in] type - a spatial discretization of the new field.
4413 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
4414 * \param [in] renumPol - specifies how to permute values of the result field according to
4415 * the optional numbers of cells and nodes, if any. The valid values are
4416 * - 0 - do not permute.
4417 * - 1 - permute cells.
4418 * - 2 - permute nodes.
4419 * - 3 - permute cells and nodes.
4421 * \param [in] glob - the global data storing profiles and localization.
4422 * \param [in] mesh - the supporting mesh.
4423 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
4424 * caller is to delete this field using decrRef() as it is no more needed.
4425 * \throw If the MED file is not readable.
4426 * \throw If no field of \a this is lying on \a mesh.
4427 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
4428 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
4430 MEDCouplingFieldDouble *MEDFileAnyTypeField1TSWithoutSDA::getFieldOnMeshAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol, const MEDFileFieldGlobsReal *glob, const MEDFileMesh *mesh, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
4432 MEDCouplingAutoRefCountObjectPtr<MEDCouplingMesh> m=mesh->getGenMeshAtLevel(meshDimRelToMax,false);
4433 const DataArrayInt *d=mesh->getNumberFieldAtLevel(meshDimRelToMax);
4434 const DataArrayInt *e=mesh->getNumberFieldAtLevel(1);
4435 if(meshDimRelToMax==1)
4436 (static_cast<MEDCouplingUMesh *>((MEDCouplingMesh *)m))->setMeshDimension(0);
4437 return MEDFileAnyTypeField1TSWithoutSDA::getFieldOnMeshAtLevel(type,renumPol,glob,m,d,e,arrOut,nasc);
4441 * Returns a new MEDCouplingFieldDouble of a given type lying on the top level cells of a
4443 * \param [in] type - a spatial discretization of the new field.
4444 * \param [in] mName - a name of the supporting mesh.
4445 * \param [in] renumPol - specifies how to permute values of the result field according to
4446 * the optional numbers of cells and nodes, if any. The valid values are
4447 * - 0 - do not permute.
4448 * - 1 - permute cells.
4449 * - 2 - permute nodes.
4450 * - 3 - permute cells and nodes.
4452 * \param [in] glob - the global data storing profiles and localization.
4453 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
4454 * caller is to delete this field using decrRef() as it is no more needed.
4455 * \throw If the MED file is not readable.
4456 * \throw If there is no mesh named \a mName in the MED file.
4457 * \throw If there are no mesh entities in the mesh.
4458 * \throw If no field values of the given \a type are available.
4460 MEDCouplingFieldDouble *MEDFileAnyTypeField1TSWithoutSDA::getFieldAtTopLevel(TypeOfField type, const char *mName, int renumPol, const MEDFileFieldGlobsReal *glob, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
4462 MEDCouplingAutoRefCountObjectPtr<MEDFileMesh> mm;
4464 mm=MEDFileMesh::New(glob->getFileName(),getMeshName().c_str(),getMeshIteration(),getMeshOrder());
4466 mm=MEDFileMesh::New(glob->getFileName(),mName,getMeshIteration(),getMeshOrder());
4467 int absDim=getDimension();
4468 int meshDimRelToMax=absDim-mm->getMeshDimension();
4469 return MEDFileAnyTypeField1TSWithoutSDA::getFieldOnMeshAtLevel(type,meshDimRelToMax,renumPol,glob,mm,arrOut,nasc);
4473 * Returns a new MEDCouplingFieldDouble of given type lying on a given support.
4474 * \param [in] type - a spatial discretization of the new field.
4475 * \param [in] renumPol - specifies how to permute values of the result field according to
4476 * the optional numbers of cells and nodes, if any. The valid values are
4477 * - 0 - do not permute.
4478 * - 1 - permute cells.
4479 * - 2 - permute nodes.
4480 * - 3 - permute cells and nodes.
4482 * \param [in] glob - the global data storing profiles and localization.
4483 * \param [in] mesh - the supporting mesh.
4484 * \param [in] cellRenum - the cell numbers array used for permutation of the result
4485 * field according to \a renumPol.
4486 * \param [in] nodeRenum - the node numbers array used for permutation of the result
4487 * field according to \a renumPol.
4488 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
4489 * caller is to delete this field using decrRef() as it is no more needed.
4490 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
4491 * \throw If no field of \a this is lying on \a mesh.
4492 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
4494 MEDCouplingFieldDouble *MEDFileAnyTypeField1TSWithoutSDA::getFieldOnMeshAtLevel(TypeOfField type, int renumPol, const MEDFileFieldGlobsReal *glob, const MEDCouplingMesh *mesh, const DataArrayInt *cellRenum, const DataArrayInt *nodeRenum, MEDCouplingAutoRefCountObjectPtr<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
4496 static const char msg1[]="MEDFileField1TSWithoutSDA::getFieldOnMeshAtLevel : request for a renumbered field following mesh numbering whereas it is a profile field !";
4497 int meshId=getMeshIdFromMeshName(mesh->getName());
4499 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=_field_per_mesh[meshId]->getFieldOnMeshAtLevel(type,glob,mesh,isPfl,arrOut,nasc);
4504 //no need to test _field_per_mesh.empty() because geMeshName has already done it
4511 throw INTERP_KERNEL::Exception(msg1);
4512 //no need to test _field_per_mesh.empty() because geMeshName has already done it
4515 if((int)cellRenum->getNbOfElems()!=mesh->getNumberOfCells())
4517 std::ostringstream oss; oss << "MEDFileField1TSWithoutSDA::getFieldOnMeshAtLevel : Request of simple renumbering but it seems that underlying mesh \"" << mesh->getName() << "\" of requested field ";
4518 oss << "\"" << getName() << "\" has partial renumbering (some geotype has no renumber) !";
4519 throw INTERP_KERNEL::Exception(oss.str().c_str());
4521 MEDCouplingFieldDiscretization *disc=ret->getDiscretization();
4522 if(!disc) throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::getFieldOnMeshAtLevel : internal error, no discretization on field !");
4523 std::vector<DataArray *> arrOut2(1,arrOut);
4524 // 2 following lines replace ret->renumberCells(cellRenum->getConstPointer()) if not DataArrayDouble
4525 disc->renumberArraysForCell(ret->getMesh(),arrOut2,cellRenum->getConstPointer(),true);
4526 (const_cast<MEDCouplingMesh*>(ret->getMesh()))->renumberCells(cellRenum->getConstPointer(),true);
4533 //no need to test _field_per_mesh.empty() because geMeshName has already done it
4535 throw INTERP_KERNEL::Exception(msg1);
4538 if((int)nodeRenum->getNbOfElems()!=mesh->getNumberOfNodes())
4540 std::ostringstream oss; oss << "MEDFileField1TSWithoutSDA::getFieldOnMeshAtLevel : Request of simple renumbering but it seems that underlying mesh \"" << mesh->getName() << "\" of requested field ";
4541 oss << "\"" << nasc.getName() << "\" not defined on all nodes !";
4542 throw INTERP_KERNEL::Exception(oss.str().c_str());
4544 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> nodeRenumSafe=nodeRenum->checkAndPreparePermutation();
4545 if(!dynamic_cast<DataArrayDouble *>((DataArray *)arrOut))
4546 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getFieldOnMeshAtLevel : node renumbering not implemented for not double DataArrays !");
4547 ret->renumberNodes(nodeRenumSafe->getConstPointer());
4552 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getFieldOnMeshAtLevel : unsupported renum policy ! Dealing with policy 0 1 2 and 3 !");
4557 * Returns values and a profile of the field of a given type lying on a given support.
4558 * \param [in] type - a spatial discretization of the field.
4559 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
4560 * \param [in] mesh - the supporting mesh.
4561 * \param [out] pfl - a new instance of DataArrayInt holding ids of mesh entities the
4562 * field of interest lies on. If the field lies on all entities of the given
4563 * dimension, all ids in \a pfl are zero. The caller is to delete this array
4564 * using decrRef() as it is no more needed.
4565 * \param [in] glob - the global data storing profiles and localization.
4566 * \return DataArrayDouble * - a new instance of DataArrayDouble holding values of the
4567 * field. The caller is to delete this array using decrRef() as it is no more needed.
4568 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
4569 * \throw If no field of \a this is lying on \a mesh.
4570 * \throw If no field values of the given \a type are available.
4572 DataArray *MEDFileAnyTypeField1TSWithoutSDA::getFieldWithProfile(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt *&pfl, const MEDFileFieldGlobsReal *glob, const MEDFileFieldNameScope& nasc) const throw(INTERP_KERNEL::Exception)
4574 MEDCouplingAutoRefCountObjectPtr<MEDCouplingMesh> m=mesh->getGenMeshAtLevel(meshDimRelToMax);
4575 int meshId=getMeshIdFromMeshName(mesh->getName());
4576 MEDCouplingAutoRefCountObjectPtr<DataArray> ret=_field_per_mesh[meshId]->getFieldOnMeshAtLevelWithPfl(type,m,pfl,glob,nasc);
4577 ret->setName(nasc.getName().c_str());
4581 //= MEDFileField1TSWithoutSDA
4584 * Throws if a given value is not a valid (non-extended) relative dimension.
4585 * \param [in] meshDimRelToMax - the relative dimension value.
4586 * \throw If \a meshDimRelToMax > 0.
4588 void MEDFileField1TSWithoutSDA::CheckMeshDimRel(int meshDimRelToMax) throw(INTERP_KERNEL::Exception)
4590 if(meshDimRelToMax>0)
4591 throw INTERP_KERNEL::Exception("CheckMeshDimRel : This is a meshDimRel not a meshDimRelExt ! So value should be <=0 !");
4595 * Checks if elements of a given mesh are in the order suitable for writing
4596 * to the MED file. If this is not so, an exception is thrown. In a case of success, returns a
4597 * vector describing types of elements and their number.
4598 * \param [in] mesh - the mesh to check.
4599 * \return std::vector<int> - a vector holding for each element type (1) item of
4600 * INTERP_KERNEL::NormalizedCellType, (2) number of elements, (3) -1.
4601 * These values are in full-interlace mode.
4602 * \throw If elements in \a mesh are not in the order suitable for writing to the MED file.
4604 std::vector<int> MEDFileField1TSWithoutSDA::CheckSBTMesh(const MEDCouplingMesh *mesh) throw(INTERP_KERNEL::Exception)
4607 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::CheckSBTMesh : input mesh is NULL !");
4608 std::set<INTERP_KERNEL::NormalizedCellType> geoTypes=mesh->getAllGeoTypes();
4609 int nbOfTypes=geoTypes.size();
4610 std::vector<int> code(3*nbOfTypes);
4611 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr1=DataArrayInt::New();
4612 arr1->alloc(nbOfTypes,1);
4613 int *arrPtr=arr1->getPointer();
4614 std::set<INTERP_KERNEL::NormalizedCellType>::const_iterator it=geoTypes.begin();
4615 for(int i=0;i<nbOfTypes;i++,it++)
4616 arrPtr[i]=std::distance(typmai2,std::find(typmai2,typmai2+MED_N_CELL_FIXED_GEO,*it));
4617 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr2=arr1->checkAndPreparePermutation();
4618 const int *arrPtr2=arr2->getConstPointer();
4620 for(it=geoTypes.begin();it!=geoTypes.end();it++,i++)
4623 int nbCells=mesh->getNumberOfCellsWithType(*it);
4624 code[3*pos]=(int)(*it);
4625 code[3*pos+1]=nbCells;
4626 code[3*pos+2]=-1;//no profiles
4628 std::vector<const DataArrayInt *> idsPerType;//no profiles
4629 DataArrayInt *da=mesh->checkTypeConsistencyAndContig(code,idsPerType);
4633 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::CheckSBTMesh : underlying mesh is not sorted by type as MED file expects !");
4638 MEDFileField1TSWithoutSDA *MEDFileField1TSWithoutSDA::New(const char *fieldName, int csit, int iteration, int order, const std::vector<std::string>& infos)
4640 return new MEDFileField1TSWithoutSDA(fieldName,csit,iteration,order,infos);
4644 * Returns all attributes and values of parts of \a this field lying on a given mesh.
4645 * Each part differs from other ones by a type of supporting mesh entity. The _i_-th
4646 * item of every of returned sequences refers to the _i_-th part of \a this field.
4647 * Thus all sequences returned by this method are of the same length equal to number
4648 * of different types of supporting entities.<br>
4649 * A field part can include sub-parts with several different spatial discretizations,
4650 * \ref ParaMEDMEM::ON_CELLS "ON_CELLS" and \ref ParaMEDMEM::ON_GAUSS_PT "ON_GAUSS_PT"
4651 * for example. Hence, some of the returned sequences contains nested sequences, and an item
4652 * of a nested sequence corresponds to a type of spatial discretization.<br>
4653 * This method allows for iteration over MEDFile DataStructure with a reduced overhead.
4654 * The overhead is due to selecting values into new instances of DataArrayDouble.
4655 * \param [in] mname - a name of a mesh of interest. It can be \c NULL, which is valid
4656 * for the case with only one underlying mesh. (Actually, the number of meshes is
4657 * not checked if \a mname == \c NULL).
4658 * \param [in,out] types - a sequence of types of underlying mesh entities. A type per
4659 * a field part is returned.
4660 * \param [in,out] typesF - a sequence of sequences of types of spatial discretizations.
4661 * A field part can include sub-parts with several different spatial discretizations,
4662 * \ref ParaMEDMEM::ON_CELLS "ON_CELLS" and
4663 * \ref ParaMEDMEM::ON_GAUSS_PT "ON_GAUSS_PT" for example.
4664 * This sequence is of the same length as \a types.
4665 * \param [in,out] pfls - a sequence returning a profile name per each type of spatial
4666 * discretization. A profile name can be empty.
4667 * Length of this and of nested sequences is the same as that of \a typesF.
4668 * \param [in,out] locs - a sequence returning a localization name per each type of spatial
4669 * discretization. A localization name can be empty.
4670 * Length of this and of nested sequences is the same as that of \a typesF.
4671 * \return std::vector< std::vector<DataArrayDouble *> > - a sequence holding arrays of values
4672 * per each type of spatial discretization within one mesh entity type.
4673 * The caller is to delete each DataArrayDouble using decrRef() as it is no more needed.
4674 * Length of this and of nested sequences is the same as that of \a typesF.
4675 * \throw If no field is lying on \a mname.
4677 std::vector< std::vector<DataArrayDouble *> > MEDFileField1TSWithoutSDA::getFieldSplitedByType2(const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
4681 meshId=getMeshIdFromMeshName(mname);
4683 if(_field_per_mesh.empty())
4684 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getFieldSplitedByType : This is empty !");
4685 std::vector< std::vector< std::pair<int,int> > > ret0=_field_per_mesh[meshId]->getFieldSplitedByType(types,typesF,pfls,locs);
4686 int nbOfRet=ret0.size();
4687 std::vector< std::vector<DataArrayDouble *> > ret(nbOfRet);
4688 for(int i=0;i<nbOfRet;i++)
4690 const std::vector< std::pair<int,int> >& p=ret0[i];
4691 int nbOfRet1=p.size();
4692 ret[i].resize(nbOfRet1);
4693 for(int j=0;j<nbOfRet1;j++)
4695 DataArrayDouble *tmp=_arr->selectByTupleId2(p[j].first,p[j].second,1);
4703 * Returns a pointer to the underground DataArrayDouble instance. So the
4704 * caller should not decrRef() it. This method allows for a direct access to the field
4705 * values. This method is quite unusable if there is more than a nodal field or a cell
4706 * field on single geometric cell type.
4707 * \return DataArrayDouble * - the pointer to the field values array.
4709 DataArrayDouble *MEDFileField1TSWithoutSDA::getUndergroundDataArrayDouble() const throw(INTERP_KERNEL::Exception)
4711 const DataArrayDouble *ret=_arr;
4713 return const_cast<DataArrayDouble *>(ret);
4718 const char *MEDFileField1TSWithoutSDA::getTypeStr() const throw(INTERP_KERNEL::Exception)
4723 MEDFileIntField1TSWithoutSDA *MEDFileField1TSWithoutSDA::convertToInt() const throw(INTERP_KERNEL::Exception)
4725 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TSWithoutSDA> ret(new MEDFileIntField1TSWithoutSDA);
4726 ret->MEDFileAnyTypeField1TSWithoutSDA::operator =(*this);
4727 ret->deepCpyLeavesFrom(*this);
4728 const DataArrayDouble *arr(_arr);
4731 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> arr2(arr->convertToIntArr());
4732 ret->setArray(arr2);
4738 * Returns a pointer to the underground DataArrayDouble instance. So the
4739 * caller should not decrRef() it. This method allows for a direct access to the field
4740 * values. This method is quite unusable if there is more than a nodal field or a cell
4741 * field on single geometric cell type.
4742 * \return DataArrayDouble * - the pointer to the field values array.
4744 DataArray *MEDFileField1TSWithoutSDA::getUndergroundDataArray() const throw(INTERP_KERNEL::Exception)
4746 return getUndergroundDataArrayDouble();
4750 * Returns a pointer to the underground DataArrayDouble instance and a
4751 * sequence describing parameters of a support of each part of \a this field. The
4752 * caller should not decrRef() the returned DataArrayDouble. This method allows for a
4753 * direct access to the field values. This method is intended for the field lying on one
4755 * \param [in,out] entries - the sequence describing parameters of a support of each
4756 * part of \a this field. Each item of this sequence consists of two parts. The
4757 * first part describes a type of mesh entity and an id of discretization of a
4758 * current field part. The second part describes a range of values [begin,end)
4759 * within the returned array relating to the current field part.
4760 * \return DataArrayDouble * - the pointer to the field values array.
4761 * \throw If the number of underlying meshes is not equal to 1.
4762 * \throw If no field values are available.
4763 * \sa getUndergroundDataArray()
4765 DataArrayDouble *MEDFileField1TSWithoutSDA::getUndergroundDataArrayDoubleExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
4767 if(_field_per_mesh.size()!=1)
4768 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt : field lies on several meshes, this method has no sense !");
4769 if(_field_per_mesh[0]==0)
4770 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt : no field specified !");
4771 _field_per_mesh[0]->getUndergroundDataArrayExt(entries);
4772 return getUndergroundDataArrayDouble();
4776 * Returns a pointer to the underground DataArrayDouble instance and a
4777 * sequence describing parameters of a support of each part of \a this field. The
4778 * caller should not decrRef() the returned DataArrayDouble. This method allows for a
4779 * direct access to the field values. This method is intended for the field lying on one
4781 * \param [in,out] entries - the sequence describing parameters of a support of each
4782 * part of \a this field. Each item of this sequence consists of two parts. The
4783 * first part describes a type of mesh entity and an id of discretization of a
4784 * current field part. The second part describes a range of values [begin,end)
4785 * within the returned array relating to the current field part.
4786 * \return DataArrayDouble * - the pointer to the field values array.
4787 * \throw If the number of underlying meshes is not equal to 1.
4788 * \throw If no field values are available.
4789 * \sa getUndergroundDataArray()
4791 DataArray *MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
4793 return getUndergroundDataArrayDoubleExt(entries);
4796 MEDFileField1TSWithoutSDA::MEDFileField1TSWithoutSDA(const char *fieldName, int csit, int iteration, int order,
4797 const std::vector<std::string>& infos):MEDFileAnyTypeField1TSWithoutSDA(fieldName,csit,iteration,order)
4799 DataArrayDouble *arr=getOrCreateAndGetArrayDouble();
4800 arr->setInfoAndChangeNbOfCompo(infos);
4803 MEDFileField1TSWithoutSDA::MEDFileField1TSWithoutSDA():MEDFileAnyTypeField1TSWithoutSDA()
4807 MEDFileAnyTypeField1TSWithoutSDA *MEDFileField1TSWithoutSDA::shallowCpy() const throw(INTERP_KERNEL::Exception)
4809 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TSWithoutSDA> ret(new MEDFileField1TSWithoutSDA(*this));
4810 ret->deepCpyLeavesFrom(*this);
4814 MEDFileAnyTypeField1TSWithoutSDA *MEDFileField1TSWithoutSDA::deepCpy() const throw(INTERP_KERNEL::Exception)
4816 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TSWithoutSDA> ret=static_cast<MEDFileField1TSWithoutSDA *>(shallowCpy());
4817 if((const DataArrayDouble *)_arr)
4818 ret->_arr=_arr->deepCpy();
4822 void MEDFileField1TSWithoutSDA::setArray(DataArray *arr) throw(INTERP_KERNEL::Exception)
4826 _nb_of_tuples_to_be_allocated=-1;
4830 DataArrayDouble *arrC=dynamic_cast<DataArrayDouble *>(arr);
4832 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::setArray : the input not null array is not of type DataArrayDouble !");
4834 _nb_of_tuples_to_be_allocated=-3;
4839 DataArray *MEDFileField1TSWithoutSDA::createNewEmptyDataArrayInstance() const
4841 return DataArrayDouble::New();
4844 DataArrayDouble *MEDFileField1TSWithoutSDA::getOrCreateAndGetArrayDouble()
4846 DataArrayDouble *ret=_arr;
4849 _arr=DataArrayDouble::New();
4853 DataArray *MEDFileField1TSWithoutSDA::getOrCreateAndGetArray()
4855 return getOrCreateAndGetArrayDouble();
4858 const DataArrayDouble *MEDFileField1TSWithoutSDA::getOrCreateAndGetArrayDouble() const
4860 const DataArrayDouble *ret=_arr;
4863 DataArrayDouble *ret2=DataArrayDouble::New();
4864 const_cast<MEDFileField1TSWithoutSDA *>(this)->_arr=DataArrayDouble::New();
4868 const DataArray *MEDFileField1TSWithoutSDA::getOrCreateAndGetArray() const
4870 return getOrCreateAndGetArrayDouble();
4873 //= MEDFileIntField1TSWithoutSDA
4875 MEDFileIntField1TSWithoutSDA *MEDFileIntField1TSWithoutSDA::New(const char *fieldName, int csit, int iteration, int order,
4876 const std::vector<std::string>& infos)
4878 return new MEDFileIntField1TSWithoutSDA(fieldName,csit,iteration,order,infos);
4881 MEDFileIntField1TSWithoutSDA::MEDFileIntField1TSWithoutSDA():MEDFileAnyTypeField1TSWithoutSDA()
4885 MEDFileIntField1TSWithoutSDA::MEDFileIntField1TSWithoutSDA(const char *fieldName, int csit, int iteration, int order,
4886 const std::vector<std::string>& infos):MEDFileAnyTypeField1TSWithoutSDA(fieldName,csit,iteration,order)
4888 DataArrayInt *arr=getOrCreateAndGetArrayInt();
4889 arr->setInfoAndChangeNbOfCompo(infos);
4892 const char *MEDFileIntField1TSWithoutSDA::getTypeStr() const throw(INTERP_KERNEL::Exception)
4897 MEDFileField1TSWithoutSDA *MEDFileIntField1TSWithoutSDA::convertToDouble() const throw(INTERP_KERNEL::Exception)
4899 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TSWithoutSDA> ret(new MEDFileField1TSWithoutSDA);
4900 ret->MEDFileAnyTypeField1TSWithoutSDA::operator =(*this);
4901 ret->deepCpyLeavesFrom(*this);
4902 const DataArrayInt *arr(_arr);
4905 MEDCouplingAutoRefCountObjectPtr<DataArrayDouble> arr2(arr->convertToDblArr());
4906 ret->setArray(arr2);
4912 * Returns a pointer to the underground DataArrayInt instance. So the
4913 * caller should not decrRef() it. This method allows for a direct access to the field
4914 * values. This method is quite unusable if there is more than a nodal field or a cell
4915 * field on single geometric cell type.
4916 * \return DataArrayInt * - the pointer to the field values array.
4918 DataArray *MEDFileIntField1TSWithoutSDA::getUndergroundDataArray() const throw(INTERP_KERNEL::Exception)
4920 return getUndergroundDataArrayInt();
4924 * Returns a pointer to the underground DataArrayInt instance. So the
4925 * caller should not decrRef() it. This method allows for a direct access to the field
4926 * values. This method is quite unusable if there is more than a nodal field or a cell
4927 * field on single geometric cell type.
4928 * \return DataArrayInt * - the pointer to the field values array.
4930 DataArrayInt *MEDFileIntField1TSWithoutSDA::getUndergroundDataArrayInt() const throw(INTERP_KERNEL::Exception)
4932 const DataArrayInt *ret=_arr;
4934 return const_cast<DataArrayInt *>(ret);
4940 * Returns a pointer to the underground DataArrayInt instance and a
4941 * sequence describing parameters of a support of each part of \a this field. The
4942 * caller should not decrRef() the returned DataArrayInt. This method allows for a
4943 * direct access to the field values. This method is intended for the field lying on one
4945 * \param [in,out] entries - the sequence describing parameters of a support of each
4946 * part of \a this field. Each item of this sequence consists of two parts. The
4947 * first part describes a type of mesh entity and an id of discretization of a
4948 * current field part. The second part describes a range of values [begin,end)
4949 * within the returned array relating to the current field part.
4950 * \return DataArrayInt * - the pointer to the field values array.
4951 * \throw If the number of underlying meshes is not equal to 1.
4952 * \throw If no field values are available.
4953 * \sa getUndergroundDataArray()
4955 DataArray *MEDFileIntField1TSWithoutSDA::getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
4957 return getUndergroundDataArrayIntExt(entries);
4961 * Returns a pointer to the underground DataArrayInt instance and a
4962 * sequence describing parameters of a support of each part of \a this field. The
4963 * caller should not decrRef() the returned DataArrayInt. This method allows for a
4964 * direct access to the field values. This method is intended for the field lying on one
4966 * \param [in,out] entries - the sequence describing parameters of a support of each
4967 * part of \a this field. Each item of this sequence consists of two parts. The
4968 * first part describes a type of mesh entity and an id of discretization of a
4969 * current field part. The second part describes a range of values [begin,end)
4970 * within the returned array relating to the current field part.
4971 * \return DataArrayInt * - the pointer to the field values array.
4972 * \throw If the number of underlying meshes is not equal to 1.
4973 * \throw If no field values are available.
4974 * \sa getUndergroundDataArray()
4976 DataArrayInt *MEDFileIntField1TSWithoutSDA::getUndergroundDataArrayIntExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
4978 if(_field_per_mesh.size()!=1)
4979 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt : field lies on several meshes, this method has no sense !");
4980 if(_field_per_mesh[0]==0)
4981 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt : no field specified !");
4982 _field_per_mesh[0]->getUndergroundDataArrayExt(entries);
4983 return getUndergroundDataArrayInt();
4986 MEDFileAnyTypeField1TSWithoutSDA *MEDFileIntField1TSWithoutSDA::shallowCpy() const throw(INTERP_KERNEL::Exception)
4988 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TSWithoutSDA> ret(new MEDFileIntField1TSWithoutSDA(*this));
4989 ret->deepCpyLeavesFrom(*this);
4993 MEDFileAnyTypeField1TSWithoutSDA *MEDFileIntField1TSWithoutSDA::deepCpy() const throw(INTERP_KERNEL::Exception)
4995 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TSWithoutSDA> ret=static_cast<MEDFileIntField1TSWithoutSDA *>(shallowCpy());
4996 if((const DataArrayInt *)_arr)
4997 ret->_arr=_arr->deepCpy();
5001 void MEDFileIntField1TSWithoutSDA::setArray(DataArray *arr) throw(INTERP_KERNEL::Exception)
5005 _nb_of_tuples_to_be_allocated=-1;
5009 DataArrayInt *arrC=dynamic_cast<DataArrayInt *>(arr);
5011 throw INTERP_KERNEL::Exception("MEDFileIntField1TSWithoutSDA::setArray : the input not null array is not of type DataArrayInt !");
5013 _nb_of_tuples_to_be_allocated=-3;
5018 DataArray *MEDFileIntField1TSWithoutSDA::createNewEmptyDataArrayInstance() const
5020 return DataArrayInt::New();
5023 DataArrayInt *MEDFileIntField1TSWithoutSDA::getOrCreateAndGetArrayInt()
5025 DataArrayInt *ret=_arr;
5028 _arr=DataArrayInt::New();
5032 DataArray *MEDFileIntField1TSWithoutSDA::getOrCreateAndGetArray()
5034 return getOrCreateAndGetArrayInt();
5037 const DataArrayInt *MEDFileIntField1TSWithoutSDA::getOrCreateAndGetArrayInt() const
5039 const DataArrayInt *ret=_arr;
5042 DataArrayInt *ret2=DataArrayInt::New();
5043 const_cast<MEDFileIntField1TSWithoutSDA *>(this)->_arr=DataArrayInt::New();
5047 const DataArray *MEDFileIntField1TSWithoutSDA::getOrCreateAndGetArray() const
5049 return getOrCreateAndGetArrayInt();
5052 MEDFileAnyTypeField1TS::MEDFileAnyTypeField1TS()
5056 //= MEDFileAnyTypeField1TS
5058 MEDFileAnyTypeField1TSWithoutSDA *MEDFileAnyTypeField1TS::BuildContentFrom(med_idt fid, const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
5060 med_field_type typcha;
5062 std::vector<std::string> infos;
5063 std::string dtunit,fieldName;
5064 LocateField2(fid,fileName,0,true,fieldName,typcha,infos,dtunit);
5065 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> ret;
5070 ret=MEDFileField1TSWithoutSDA::New(fieldName.c_str(),-1,-1/*iteration*/,-1/*order*/,std::vector<std::string>());
5075 ret=MEDFileIntField1TSWithoutSDA::New(fieldName.c_str(),-1,-1/*iteration*/,-1/*order*/,std::vector<std::string>());
5080 std::ostringstream oss; oss << "MEDFileAnyTypeField1TS::BuildContentFrom(fileName) : file \'" << fileName << "\' contains field with name \'" << fieldName << "\' but the type of the first field is not in [MED_FLOAT64, MED_INT32] !";
5081 throw INTERP_KERNEL::Exception(oss.str().c_str());
5084 ret->setDtUnit(dtunit.c_str());
5085 ret->getOrCreateAndGetArray()->setInfoAndChangeNbOfCompo(infos);
5087 med_int numdt,numit;
5089 MEDfieldComputingStepInfo(fid,fieldName.c_str(),1,&numdt,&numit,&dt);
5090 ret->setTime(numdt,numit,dt);
5093 ret->loadStructureAndBigArraysRecursively(fid,*((const MEDFileAnyTypeField1TSWithoutSDA*)ret));
5095 ret->loadOnlyStructureOfDataRecursively(fid,*((const MEDFileAnyTypeField1TSWithoutSDA*)ret));
5099 MEDFileAnyTypeField1TS::MEDFileAnyTypeField1TS(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
5100 try:MEDFileFieldGlobsReal(fileName)
5102 MEDFileUtilities::CheckFileForRead(fileName);
5103 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
5104 _content=BuildContentFrom(fid,fileName,loadAll);
5107 catch(INTERP_KERNEL::Exception& e)
5112 MEDFileAnyTypeField1TSWithoutSDA *MEDFileAnyTypeField1TS::BuildContentFrom(med_idt fid, const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
5114 med_field_type typcha;
5115 std::vector<std::string> infos;
5118 int nbSteps=LocateField(fid,fileName,fieldName,iii,typcha,infos,dtunit);
5119 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> ret;
5124 ret=MEDFileField1TSWithoutSDA::New(fieldName,-1,-1/*iteration*/,-1/*order*/,std::vector<std::string>());
5129 ret=MEDFileIntField1TSWithoutSDA::New(fieldName,-1,-1/*iteration*/,-1/*order*/,std::vector<std::string>());
5134 std::ostringstream oss; oss << "MEDFileAnyTypeField1TS::BuildContentFrom(fileName,fieldName) : file \'" << fileName << "\' contains field with name \'" << fieldName << "\' but the type of field is not in [MED_FLOAT64, MED_INT32] !";
5135 throw INTERP_KERNEL::Exception(oss.str().c_str());
5138 ret->setDtUnit(dtunit.c_str());
5139 ret->getOrCreateAndGetArray()->setInfoAndChangeNbOfCompo(infos);
5143 std::ostringstream oss; oss << "MEDFileField1TS(fileName,fieldName) : file \'" << fileName << "\' contains field with name \'" << fieldName << "\' but there is no time steps on it !";
5144 throw INTERP_KERNEL::Exception(oss.str().c_str());
5147 med_int numdt,numit;
5149 MEDfieldComputingStepInfo(fid,fieldName,1,&numdt,&numit,&dt);
5150 ret->setTime(numdt,numit,dt);
5153 ret->loadStructureAndBigArraysRecursively(fid,*((const MEDFileAnyTypeField1TSWithoutSDA*)ret));
5155 ret->loadOnlyStructureOfDataRecursively(fid,*((const MEDFileAnyTypeField1TSWithoutSDA*)ret));
5159 MEDFileAnyTypeField1TS::MEDFileAnyTypeField1TS(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
5160 try:MEDFileFieldGlobsReal(fileName)
5162 MEDFileUtilities::CheckFileForRead(fileName);
5163 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
5164 _content=BuildContentFrom(fid,fileName,fieldName,loadAll);
5167 catch(INTERP_KERNEL::Exception& e)
5172 MEDFileAnyTypeField1TS *MEDFileAnyTypeField1TS::BuildNewInstanceFromContent(MEDFileAnyTypeField1TSWithoutSDA *c, const char *fileName) throw(INTERP_KERNEL::Exception)
5175 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TS::BuildNewInstanceFromContent : empty content in input : unable to build a new instance !");
5176 if(dynamic_cast<const MEDFileField1TSWithoutSDA *>(c))
5178 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret=MEDFileField1TS::New();
5179 ret->setFileName(fileName);
5180 ret->_content=c; c->incrRef();
5183 if(dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(c))
5185 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret=MEDFileIntField1TS::New();
5186 ret->setFileName(fileName);
5187 ret->_content=c; c->incrRef();
5190 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TS::BuildNewInstanceFromContent : internal error ! a content of type different from FLOAT64 and INT32 has been built but not intercepted !");
5193 MEDFileAnyTypeField1TS *MEDFileAnyTypeField1TS::New(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
5195 MEDFileUtilities::CheckFileForRead(fileName);
5196 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
5197 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> c=BuildContentFrom(fid,fileName,loadAll);
5198 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TS> ret=BuildNewInstanceFromContent(c,fileName);
5199 ret->loadGlobals(fid);
5203 MEDFileAnyTypeField1TS *MEDFileAnyTypeField1TS::New(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
5205 MEDFileUtilities::CheckFileForRead(fileName);
5206 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
5207 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> c=BuildContentFrom(fid,fileName,fieldName,loadAll);
5208 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TS> ret=BuildNewInstanceFromContent(c,fileName);
5209 ret->loadGlobals(fid);
5213 MEDFileAnyTypeField1TS *MEDFileAnyTypeField1TS::New(const char *fileName, const char *fieldName, int iteration, int order, bool loadAll) throw(INTERP_KERNEL::Exception)
5215 MEDFileUtilities::CheckFileForRead(fileName);
5216 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
5217 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> c=BuildContentFrom(fid,fileName,fieldName,iteration,order,loadAll);
5218 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TS> ret=BuildNewInstanceFromContent(c,fileName);
5219 ret->loadGlobals(fid);
5223 MEDFileAnyTypeField1TSWithoutSDA *MEDFileAnyTypeField1TS::BuildContentFrom(med_idt fid, const char *fileName, const char *fieldName, int iteration, int order, bool loadAll) throw(INTERP_KERNEL::Exception)
5225 med_field_type typcha;
5226 std::vector<std::string> infos;
5229 int nbOfStep2=LocateField(fid,fileName,fieldName,iii,typcha,infos,dtunit);
5230 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> ret;
5235 ret=MEDFileField1TSWithoutSDA::New(fieldName,-1,iteration,order,std::vector<std::string>());
5240 ret=MEDFileIntField1TSWithoutSDA::New(fieldName,-1,iteration,order,std::vector<std::string>());
5245 std::ostringstream oss; oss << "MEDFileAnyTypeField1TS::BuildContentFrom(fileName,fieldName,iteration,order) : file \'" << fileName << "\' contains field with name \'" << fieldName << "\' but the type of field is not in [MED_FLOAT64, MED_INT32] !";
5246 throw INTERP_KERNEL::Exception(oss.str().c_str());
5249 ret->setDtUnit(dtunit.c_str());
5250 ret->getOrCreateAndGetArray()->setInfoAndChangeNbOfCompo(infos);
5253 std::vector< std::pair<int,int> > dtits(nbOfStep2);
5254 for(int i=0;i<nbOfStep2 && !found;i++)
5256 med_int numdt,numit;
5258 MEDfieldComputingStepInfo(fid,fieldName,i+1,&numdt,&numit,&dt);
5259 if(numdt==iteration && numit==order)
5265 dtits[i]=std::pair<int,int>(numdt,numit);
5269 std::ostringstream oss; oss << "No such iteration (" << iteration << "," << order << ") in existing field '" << fieldName << "' in file '" << fileName << "' ! Available iterations are : ";
5270 for(std::vector< std::pair<int,int> >::const_iterator iter=dtits.begin();iter!=dtits.end();iter++)
5271 oss << "(" << (*iter).first << "," << (*iter).second << "), ";
5272 throw INTERP_KERNEL::Exception(oss.str().c_str());
5275 ret->loadStructureAndBigArraysRecursively(fid,*((const MEDFileAnyTypeField1TSWithoutSDA*)ret));
5277 ret->loadOnlyStructureOfDataRecursively(fid,*((const MEDFileAnyTypeField1TSWithoutSDA*)ret));
5281 MEDFileAnyTypeField1TS::MEDFileAnyTypeField1TS(const char *fileName, const char *fieldName, int iteration, int order, bool loadAll) throw(INTERP_KERNEL::Exception)
5282 try:MEDFileFieldGlobsReal(fileName)
5284 MEDFileUtilities::CheckFileForRead(fileName);
5285 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
5286 _content=BuildContentFrom(fid,fileName,fieldName,iteration,order,loadAll);
5289 catch(INTERP_KERNEL::Exception& e)
5295 * This constructor is a shallow copy constructor. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
5296 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
5298 * \warning this is a shallow copy constructor
5300 MEDFileAnyTypeField1TS::MEDFileAnyTypeField1TS(const MEDFileAnyTypeField1TSWithoutSDA& other, bool shallowCopyOfContent)
5302 if(!shallowCopyOfContent)
5304 const MEDFileAnyTypeField1TSWithoutSDA *otherPtr(&other);
5305 otherPtr->incrRef();
5306 _content=const_cast<MEDFileAnyTypeField1TSWithoutSDA *>(otherPtr);
5310 _content=other.shallowCpy();
5314 int MEDFileAnyTypeField1TS::LocateField2(med_idt fid, const char *fileName, int fieldIdCFormat, bool checkFieldId, std::string& fieldName, med_field_type& typcha, std::vector<std::string>& infos, std::string& dtunitOut) throw(INTERP_KERNEL::Exception)
5318 int nbFields=MEDnField(fid);
5319 if(fieldIdCFormat>=nbFields)
5321 std::ostringstream oss; oss << "MEDFileAnyTypeField1TS::LocateField2(fileName) : in file \'" << fileName << "\' number of fields is " << nbFields << " ! Trying to request for id " << fieldIdCFormat << " !";
5322 throw INTERP_KERNEL::Exception(oss.str().c_str());
5325 int ncomp=MEDfieldnComponent(fid,fieldIdCFormat+1);
5326 INTERP_KERNEL::AutoPtr<char> comp=MEDLoaderBase::buildEmptyString(ncomp*MED_SNAME_SIZE);
5327 INTERP_KERNEL::AutoPtr<char> unit=MEDLoaderBase::buildEmptyString(ncomp*MED_SNAME_SIZE);
5328 INTERP_KERNEL::AutoPtr<char> dtunit=MEDLoaderBase::buildEmptyString(MED_LNAME_SIZE);
5329 INTERP_KERNEL::AutoPtr<char> nomcha=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
5330 INTERP_KERNEL::AutoPtr<char> nomMaa=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
5333 MEDfieldInfo(fid,fieldIdCFormat+1,nomcha,nomMaa,&localMesh,&typcha,comp,unit,dtunit,&nbOfStep);
5334 fieldName=MEDLoaderBase::buildStringFromFortran(nomcha,MED_NAME_SIZE);
5335 dtunitOut=MEDLoaderBase::buildStringFromFortran(dtunit,MED_LNAME_SIZE);
5336 infos.clear(); infos.resize(ncomp);
5337 for(int j=0;j<ncomp;j++)
5338 infos[j]=MEDLoaderBase::buildUnionUnit((char *)comp+j*MED_SNAME_SIZE,MED_SNAME_SIZE,(char *)unit+j*MED_SNAME_SIZE,MED_SNAME_SIZE);
5343 * This method throws an INTERP_KERNEL::Exception if \a fieldName field is not in file pointed by \a fid and with name \a fileName.
5346 * \return in case of success the number of time steps available for the field with name \a fieldName.
5348 int MEDFileAnyTypeField1TS::LocateField(med_idt fid, const char *fileName, const char *fieldName, int& posCFormat, med_field_type& typcha, std::vector<std::string>& infos, std::string& dtunitOut) throw(INTERP_KERNEL::Exception)
5350 int nbFields=MEDnField(fid);
5352 std::vector<std::string> fns(nbFields);
5354 for(int i=0;i<nbFields && !found;i++)
5357 nbOfStep2=LocateField2(fid,fileName,i,false,tmp,typcha,infos,dtunitOut);
5359 found=(tmp==fieldName);
5365 std::ostringstream oss; oss << "No such field '" << fieldName << "' in file '" << fileName << "' ! Available fields are : ";
5366 for(std::vector<std::string>::const_iterator it=fns.begin();it!=fns.end();it++)
5367 oss << "\"" << *it << "\" ";
5368 throw INTERP_KERNEL::Exception(oss.str().c_str());
5374 * This method as MEDFileField1TSW::setLocNameOnLeaf, is dedicated for advanced user that a want a very fine control on their data structure
5375 * without overhead. This method can be called only regarding information returned by MEDFileField1TSWithoutSDA::getFieldSplitedByType or MEDFileField1TSWithoutSDA::getFieldSplitedByType2.
5376 * This method changes the attribute (here it's profile name) of the leaf datastructure (MEDFileFieldPerMeshPerTypePerDisc instance).
5377 * It is the responsability of the caller to invoke MEDFileFieldGlobs::appendProfile or MEDFileFieldGlobs::getProfile
5378 * to keep a valid instance.
5379 * If \b this do not have any leaf that correspond to the request of the input parameter (\b mName, \b typ, \b locId) an INTERP_KERNEL::Exception will be thrown.
5380 * If \b newPflName profile name does not already exist the profile with old name will be renamed with name \b newPflName.
5381 * If \b newPflName already exists and that \b forceRenameOnGlob is false (the default) an INTERP_KERNEL::Exception will be thrown to avoid big confusion. In this case the called should rename before the profile name with name \b newPflName.
5383 * \param [in] mName specifies the underlying mesh name. This value can be pointer 0 for users that do not deal with fields on multi mesh.
5384 * \param [in] typ is for the geometric cell type (or INTERP_KERNEL::NORM_ERROR for node field) entry to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set.
5385 * \param [in] locId is the localization id to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set. It corresponds to the position of
5386 * \c pfls[std::distance(types.begin(),std::find(types.begin(),typ)] vector in MEDFileField1TSWithoutSDA::getFieldSplitedByType. For non gausspoints field users, the value is 0.
5387 * \param [in] newLocName is the new localization name.
5388 * \param [in] forceRenameOnGlob specifies the behaviour in case of profile \b newPflName already exists. If true, the renaming is done without check. It can lead to major bug.
5389 * If false, an exception will be thrown to force user to change previously the name of the profile with name \b newPflName
5391 void MEDFileAnyTypeField1TS::setProfileNameOnLeaf(const char *mName, INTERP_KERNEL::NormalizedCellType typ, int locId, const char *newPflName, bool forceRenameOnGlob) throw(INTERP_KERNEL::Exception)
5393 MEDFileFieldPerMeshPerTypePerDisc *disc=getLeafGivenMeshAndTypeAndLocId(mName,typ,locId);
5394 std::string oldPflName=disc->getProfile();
5395 std::vector<std::string> vv=getPflsReallyUsedMulti();
5396 int nbOfOcc=std::count(vv.begin(),vv.end(),oldPflName);
5397 if(forceRenameOnGlob || (!existsPfl(newPflName) && nbOfOcc==1))
5399 disc->setProfile(newPflName);
5400 DataArrayInt *pfl=getProfile(oldPflName.c_str());
5401 pfl->setName(newPflName);
5405 std::ostringstream oss; oss << "MEDFileField1TS::setProfileNameOnLeaf : Profile \"" << newPflName << "\" already exists or referenced more than one !";
5406 throw INTERP_KERNEL::Exception(oss.str().c_str());
5411 * This method as MEDFileField1TSW::setProfileNameOnLeaf, is dedicated for advanced user that a want a very fine control on their data structure
5412 * without overhead. This method can be called only regarding information returned by MEDFileField1TSWithoutSDA::getFieldSplitedByType or MEDFileField1TSWithoutSDA::getFieldSplitedByType2.
5413 * This method changes the attribute (here it's localization name) of the leaf datastructure (MEDFileFieldPerMeshPerTypePerDisc instance).
5414 * It is the responsability of the caller to invoke MEDFileFieldGlobs::appendProfile or MEDFileFieldGlobs::getProfile
5415 * to keep a valid instance.
5416 * If \b this do not have any leaf that correspond to the request of the input parameter (\b mName, \b typ, \b locId) an INTERP_KERNEL::Exception will be thrown.
5417 * This method is an extension of MEDFileField1TSWithoutSDA::setProfileNameOnLeafExt method because it performs a modification of global info.
5418 * If \b newLocName profile name does not already exist the localization with old name will be renamed with name \b newLocName.
5419 * If \b newLocName already exists an INTERP_KERNEL::Exception will be thrown to avoid big confusion. In this case the called should rename before the profile name with name \b newLocName.
5421 * \param [in] mName specifies the underlying mesh name. This value can be pointer 0 for users that do not deal with fields on multi mesh.
5422 * \param [in] typ is for the geometric cell type (or INTERP_KERNEL::NORM_ERROR for node field) entry to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set.
5423 * \param [in] locId is the localization id to find the right MEDFileFieldPerMeshPerTypePerDisc instance to set. It corresponds to the position of
5424 * \c pfls[std::distance(types.begin(),std::find(types.begin(),typ)] vector in MEDFileField1TSWithoutSDA::getFieldSplitedByType. For non gausspoints field users, the value is 0.
5425 * \param [in] newLocName is the new localization name.
5426 * \param [in] forceRenameOnGlob specifies the behaviour in case of profile \b newLocName already exists. If true, the renaming is done without check. It can lead to major bug.
5427 * If false, an exception will be thrown to force user to change previously the name of the profile with name \b newLocName
5429 void MEDFileAnyTypeField1TS::setLocNameOnLeaf(const char *mName, INTERP_KERNEL::NormalizedCellType typ, int locId, const char *newLocName, bool forceRenameOnGlob) throw(INTERP_KERNEL::Exception)
5431 MEDFileFieldPerMeshPerTypePerDisc *disc=getLeafGivenMeshAndTypeAndLocId(mName,typ,locId);
5432 std::string oldLocName=disc->getLocalization();
5433 std::vector<std::string> vv=getLocsReallyUsedMulti();
5434 int nbOfOcc=std::count(vv.begin(),vv.end(),oldLocName);
5435 if(forceRenameOnGlob || (!existsLoc(newLocName) && nbOfOcc==1))
5437 disc->setLocalization(newLocName);
5438 MEDFileFieldLoc& loc=getLocalization(oldLocName.c_str());
5439 loc.setName(newLocName);
5443 std::ostringstream oss; oss << "MEDFileField1TS::setLocNameOnLeaf : Localization \"" << newLocName << "\" already exists or referenced more than one !";
5444 throw INTERP_KERNEL::Exception(oss.str().c_str());
5448 MEDFileAnyTypeField1TSWithoutSDA *MEDFileAnyTypeField1TS::contentNotNullBase() throw(INTERP_KERNEL::Exception)
5450 MEDFileAnyTypeField1TSWithoutSDA *ret=_content;
5452 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TS : content is expected to be not null !");
5456 const MEDFileAnyTypeField1TSWithoutSDA *MEDFileAnyTypeField1TS::contentNotNullBase() const throw(INTERP_KERNEL::Exception)
5458 const MEDFileAnyTypeField1TSWithoutSDA *ret=_content;
5460 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TS : const content is expected to be not null !");
5465 * Writes \a this field into a MED file specified by its name.
5466 * \param [in] fileName - the MED file name.
5467 * \param [in] mode - the writing mode. For more on \a mode, see \ref AdvMEDLoaderBasics.
5468 * - 2 - erase; an existing file is removed.
5469 * - 1 - append; same data should not be present in an existing file.
5470 * - 0 - overwrite; same data present in an existing file is overwritten.
5471 * \throw If the field name is not set.
5472 * \throw If no field data is set.
5473 * \throw If \a mode == 1 and the same data is present in an existing file.
5475 void MEDFileAnyTypeField1TS::write(const char *fileName, int mode) const throw(INTERP_KERNEL::Exception)
5477 med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
5478 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,medmod);
5483 * This method alloc the arrays and load potentially huge arrays contained in this field.
5484 * This method should be called when a MEDFileAnyTypeField1TS::New constructor has been with false as the last parameter.
5485 * This method can be also called to refresh or reinit values from a file.
5487 * \throw If the fileName is not set or points to a non readable MED file.
5488 * \sa MEDFileAnyTypeField1TS::loadArraysIfNecessary
5490 void MEDFileAnyTypeField1TS::loadArrays() throw(INTERP_KERNEL::Exception)
5492 MEDFileUtilities::AutoFid fid=MEDfileOpen(getFileName(),MED_ACC_RDONLY);
5493 contentNotNullBase()->loadBigArraysRecursively(fid,*contentNotNullBase());
5497 * This method behaves as MEDFileAnyTypeField1TS::loadArrays does, the first call, if \a this was built using a file without loading big arrays.
5498 * But once data loaded once, this method does nothing.
5500 * \throw If the fileName is not set or points to a non readable MED file.
5501 * \sa MEDFileAnyTypeField1TS::loadArrays, MEDFileAnyTypeField1TS::releaseArrays
5503 void MEDFileAnyTypeField1TS::loadArraysIfNecessary() throw(INTERP_KERNEL::Exception)
5505 MEDFileUtilities::AutoFid fid=MEDfileOpen(getFileName(),MED_ACC_RDONLY);
5506 contentNotNullBase()->loadBigArraysRecursivelyIfNecessary(fid,*contentNotNullBase());
5510 * This method releases potentially big data arrays and so returns to the same heap memory than status loaded with 'loadAll' parameter set to false.
5511 * This method does not release arrays set outside the context of a MED file.
5513 * \sa MEDFileAnyTypeField1TS::loadArrays, MEDFileAnyTypeField1TS::loadArraysIfNecessary
5515 void MEDFileAnyTypeField1TS::releaseArrays() throw(INTERP_KERNEL::Exception)
5517 contentNotNullBase()->releaseArrays();
5520 void MEDFileAnyTypeField1TS::writeLL(med_idt fid) const throw(INTERP_KERNEL::Exception)
5522 int nbComp=getNumberOfComponents();
5523 INTERP_KERNEL::AutoPtr<char> comp=MEDLoaderBase::buildEmptyString(nbComp*MED_SNAME_SIZE);
5524 INTERP_KERNEL::AutoPtr<char> unit=MEDLoaderBase::buildEmptyString(nbComp*MED_SNAME_SIZE);
5525 for(int i=0;i<nbComp;i++)
5527 std::string info=getInfo()[i];
5529 MEDLoaderBase::splitIntoNameAndUnit(info,c,u);
5530 MEDLoaderBase::safeStrCpy2(c.c_str(),MED_SNAME_SIZE,comp+i*MED_SNAME_SIZE,_too_long_str);
5531 MEDLoaderBase::safeStrCpy2(u.c_str(),MED_SNAME_SIZE,unit+i*MED_SNAME_SIZE,_too_long_str);
5533 if(getName().empty())
5534 throw INTERP_KERNEL::Exception("MEDFileField1TS::write : MED file does not accept field with empty name !");
5535 MEDfieldCr(fid,getName().c_str(),getMEDFileFieldType(),nbComp,comp,unit,getDtUnit().c_str(),getMeshName().c_str());
5536 writeGlobals(fid,*this);
5537 contentNotNullBase()->writeLL(fid,*this,*contentNotNullBase());
5540 std::size_t MEDFileAnyTypeField1TS::getHeapMemorySize() const
5543 if((const MEDFileAnyTypeField1TSWithoutSDA *)_content)
5544 ret+=_content->getHeapMemorySize();
5545 return ret+MEDFileFieldGlobsReal::getHeapMemorySize();
5549 * Returns a string describing \a this field. This string is outputted
5550 * by \c print Python command.
5552 std::string MEDFileAnyTypeField1TS::simpleRepr() const
5554 std::ostringstream oss;
5555 contentNotNullBase()->simpleRepr(0,oss,-1);
5556 simpleReprGlobs(oss);
5561 * This method returns all profiles whose name is non empty used.
5562 * \b WARNING If profile is used several times it will be reported \b only \b once.
5563 * To get non empty name profiles as time as they appear in \b this call MEDFileField1TS::getPflsReallyUsedMulti instead.
5565 std::vector<std::string> MEDFileAnyTypeField1TS::getPflsReallyUsed() const
5567 return contentNotNullBase()->getPflsReallyUsed2();
5571 * This method returns all localizations whose name is non empty used.
5572 * \b WARNING If localization is used several times it will be reported \b only \b once.
5574 std::vector<std::string> MEDFileAnyTypeField1TS::getLocsReallyUsed() const
5576 return contentNotNullBase()->getLocsReallyUsed2();
5580 * This method returns all profiles whose name is non empty used.
5581 * \b WARNING contrary to MEDFileField1TS::getPflsReallyUsed, if profile is used several times it will be reported as time as it appears.
5583 std::vector<std::string> MEDFileAnyTypeField1TS::getPflsReallyUsedMulti() const
5585 return contentNotNullBase()->getPflsReallyUsedMulti2();
5589 * This method returns all localizations whose name is non empty used.
5590 * \b WARNING contrary to MEDFileField1TS::getLocsReallyUsed if localization is used several times it will be reported as time as it appears.
5592 std::vector<std::string> MEDFileAnyTypeField1TS::getLocsReallyUsedMulti() const
5594 return contentNotNullBase()->getLocsReallyUsedMulti2();
5597 void MEDFileAnyTypeField1TS::changePflsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
5599 contentNotNullBase()->changePflsRefsNamesGen2(mapOfModif);
5602 void MEDFileAnyTypeField1TS::changeLocsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
5604 contentNotNullBase()->changeLocsRefsNamesGen2(mapOfModif);
5607 int MEDFileAnyTypeField1TS::getDimension() const
5609 return contentNotNullBase()->getDimension();
5612 int MEDFileAnyTypeField1TS::getIteration() const
5614 return contentNotNullBase()->getIteration();
5617 int MEDFileAnyTypeField1TS::getOrder() const
5619 return contentNotNullBase()->getOrder();
5622 double MEDFileAnyTypeField1TS::getTime(int& iteration, int& order) const
5624 return contentNotNullBase()->getTime(iteration,order);
5627 void MEDFileAnyTypeField1TS::setTime(int iteration, int order, double val)
5629 contentNotNullBase()->setTime(iteration,order,val);
5632 std::string MEDFileAnyTypeField1TS::getName() const
5634 return contentNotNullBase()->getName();
5637 void MEDFileAnyTypeField1TS::setName(const char *name)
5639 contentNotNullBase()->setName(name);
5642 void MEDFileAnyTypeField1TS::simpleRepr(int bkOffset, std::ostream& oss, int f1tsId) const
5644 contentNotNullBase()->simpleRepr(bkOffset,oss,f1tsId);
5647 std::string MEDFileAnyTypeField1TS::getDtUnit() const throw(INTERP_KERNEL::Exception)
5649 return contentNotNullBase()->getDtUnit();
5652 void MEDFileAnyTypeField1TS::setDtUnit(const char *dtUnit) throw(INTERP_KERNEL::Exception)
5654 contentNotNullBase()->setDtUnit(dtUnit);
5657 std::string MEDFileAnyTypeField1TS::getMeshName() const throw(INTERP_KERNEL::Exception)
5659 return contentNotNullBase()->getMeshName();
5662 void MEDFileAnyTypeField1TS::setMeshName(const char *newMeshName) throw(INTERP_KERNEL::Exception)
5664 contentNotNullBase()->setMeshName(newMeshName);
5667 bool MEDFileAnyTypeField1TS::changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab) throw(INTERP_KERNEL::Exception)
5669 return contentNotNullBase()->changeMeshNames(modifTab);
5672 int MEDFileAnyTypeField1TS::getMeshIteration() const throw(INTERP_KERNEL::Exception)
5674 return contentNotNullBase()->getMeshIteration();
5677 int MEDFileAnyTypeField1TS::getMeshOrder() const throw(INTERP_KERNEL::Exception)
5679 return contentNotNullBase()->getMeshOrder();
5682 int MEDFileAnyTypeField1TS::getNumberOfComponents() const
5684 return contentNotNullBase()->getNumberOfComponents();
5687 bool MEDFileAnyTypeField1TS::isDealingTS(int iteration, int order) const
5689 return contentNotNullBase()->isDealingTS(iteration,order);
5692 std::pair<int,int> MEDFileAnyTypeField1TS::getDtIt() const
5694 return contentNotNullBase()->getDtIt();
5697 void MEDFileAnyTypeField1TS::fillIteration(std::pair<int,int>& p) const
5699 contentNotNullBase()->fillIteration(p);
5702 void MEDFileAnyTypeField1TS::fillTypesOfFieldAvailable(std::vector<TypeOfField>& types) const throw(INTERP_KERNEL::Exception)
5704 contentNotNullBase()->fillTypesOfFieldAvailable(types);
5707 void MEDFileAnyTypeField1TS::setInfo(const std::vector<std::string>& infos) throw(INTERP_KERNEL::Exception)
5709 contentNotNullBase()->setInfo(infos);
5712 const std::vector<std::string>& MEDFileAnyTypeField1TS::getInfo() const
5714 return contentNotNullBase()->getInfo();
5716 std::vector<std::string>& MEDFileAnyTypeField1TS::getInfo()
5718 return contentNotNullBase()->getInfo();
5721 MEDFileFieldPerMeshPerTypePerDisc *MEDFileAnyTypeField1TS::getLeafGivenMeshAndTypeAndLocId(const char *mName, INTERP_KERNEL::NormalizedCellType typ, int locId) throw(INTERP_KERNEL::Exception)
5723 return contentNotNullBase()->getLeafGivenMeshAndTypeAndLocId(mName,typ,locId);
5726 const MEDFileFieldPerMeshPerTypePerDisc *MEDFileAnyTypeField1TS::getLeafGivenMeshAndTypeAndLocId(const char *mName, INTERP_KERNEL::NormalizedCellType typ, int locId) const throw(INTERP_KERNEL::Exception)
5728 return contentNotNullBase()->getLeafGivenMeshAndTypeAndLocId(mName,typ,locId);
5731 int MEDFileAnyTypeField1TS::getNonEmptyLevels(const char *mname, std::vector<int>& levs) const throw(INTERP_KERNEL::Exception)
5733 return contentNotNullBase()->getNonEmptyLevels(mname,levs);
5736 std::vector<TypeOfField> MEDFileAnyTypeField1TS::getTypesOfFieldAvailable() const throw(INTERP_KERNEL::Exception)
5738 return contentNotNullBase()->getTypesOfFieldAvailable();
5741 std::vector< std::vector<std::pair<int,int> > > MEDFileAnyTypeField1TS::getFieldSplitedByType(const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF,
5742 std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
5744 return contentNotNullBase()->getFieldSplitedByType(mname,types,typesF,pfls,locs);
5748 * This method returns as MEDFileAnyTypeField1TS new instances as number of components in \a this.
5749 * The returned instances are deep copy of \a this except that for globals that are share with those contained in \a this.
5750 * ** WARNING ** do no forget to rename the ouput instances to avoid to write n-times in the same MED file field !
5752 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TS > > MEDFileAnyTypeField1TS::splitComponents() const throw(INTERP_KERNEL::Exception)
5754 const MEDFileAnyTypeField1TSWithoutSDA *content(_content);
5756 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TS::splitComponents : no content in this ! Unable to split components !");
5757 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > contentsSplit=content->splitComponents();
5758 std::size_t sz(contentsSplit.size());
5759 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TS > > ret(sz);
5760 for(std::size_t i=0;i<sz;i++)
5762 ret[i]=shallowCpy();
5763 ret[i]->_content=contentsSplit[i];
5769 * This method returns as MEDFileAnyTypeField1TS new instances as number of spatial discretizations in \a this.
5770 * The returned instances are deep copy of \a this except that for globals that are share with those contained in \a this.
5772 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TS > > MEDFileAnyTypeField1TS::splitDiscretizations() const throw(INTERP_KERNEL::Exception)
5774 const MEDFileAnyTypeField1TSWithoutSDA *content(_content);
5776 throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TS::splitDiscretizations : no content in this ! Unable to split discretization !");
5777 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > contentsSplit=content->splitDiscretizations();
5778 std::size_t sz(contentsSplit.size());
5779 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TS > > ret(sz);
5780 for(std::size_t i=0;i<sz;i++)
5782 ret[i]=shallowCpy();
5783 ret[i]->_content=contentsSplit[i];
5788 MEDFileAnyTypeField1TS *MEDFileAnyTypeField1TS::deepCpy() const throw(INTERP_KERNEL::Exception)
5790 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TS> ret=shallowCpy();
5791 if((const MEDFileAnyTypeField1TSWithoutSDA *)_content)
5792 ret->_content=_content->deepCpy();
5793 ret->deepCpyGlobs(*this);
5797 int MEDFileAnyTypeField1TS::copyTinyInfoFrom(const MEDCouplingFieldDouble *field, const DataArray *arr) throw(INTERP_KERNEL::Exception)
5799 return contentNotNullBase()->copyTinyInfoFrom(field,arr);
5805 * Returns a new instance of MEDFileField1TS holding data of the first time step of
5806 * the first field that has been read from a specified MED file.
5807 * \param [in] fileName - the name of the MED file to read.
5808 * \return MEDFileField1TS * - a new instance of MEDFileFieldMultiTS. The caller
5809 * is to delete this field using decrRef() as it is no more needed.
5810 * \throw If reading the file fails.
5812 MEDFileField1TS *MEDFileField1TS::New(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
5814 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret=new MEDFileField1TS(fileName,loadAll);
5815 ret->contentNotNull();
5820 * Returns a new instance of MEDFileField1TS holding data of the first time step of
5821 * a given field that has been read from a specified MED file.
5822 * \param [in] fileName - the name of the MED file to read.
5823 * \param [in] fieldName - the name of the field to read.
5824 * \return MEDFileField1TS * - a new instance of MEDFileFieldMultiTS. The caller
5825 * is to delete this field using decrRef() as it is no more needed.
5826 * \throw If reading the file fails.
5827 * \throw If there is no field named \a fieldName in the file.
5829 MEDFileField1TS *MEDFileField1TS::New(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
5831 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret=new MEDFileField1TS(fileName,fieldName,loadAll);
5832 ret->contentNotNull();
5837 * Returns a new instance of MEDFileField1TS holding data of a given time step of
5838 * a given field that has been read from a specified MED file.
5839 * \param [in] fileName - the name of the MED file to read.
5840 * \param [in] fieldName - the name of the field to read.
5841 * \param [in] iteration - the iteration number of a required time step.
5842 * \param [in] order - the iteration order number of required time step.
5843 * \return MEDFileField1TS * - a new instance of MEDFileFieldMultiTS. The caller
5844 * is to delete this field using decrRef() as it is no more needed.
5845 * \throw If reading the file fails.
5846 * \throw If there is no field named \a fieldName in the file.
5847 * \throw If the required time step is missing from the file.
5849 MEDFileField1TS *MEDFileField1TS::New(const char *fileName, const char *fieldName, int iteration, int order, bool loadAll) throw(INTERP_KERNEL::Exception)
5851 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret=new MEDFileField1TS(fileName,fieldName,iteration,order,loadAll);
5852 ret->contentNotNull();
5857 * Returns a new instance of MEDFileField1TS. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
5858 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
5860 * Returns a new instance of MEDFileField1TS holding either a shallow copy
5861 * of a given MEDFileField1TSWithoutSDA ( \a other ) or \a other itself.
5862 * \warning this is a shallow copy constructor
5863 * \param [in] other - a MEDFileField1TSWithoutSDA to copy.
5864 * \param [in] shallowCopyOfContent - if \c true, a shallow copy of \a other is created.
5865 * \return MEDFileField1TS * - a new instance of MEDFileField1TS. The caller
5866 * is to delete this field using decrRef() as it is no more needed.
5868 MEDFileField1TS *MEDFileField1TS::New(const MEDFileField1TSWithoutSDA& other, bool shallowCopyOfContent)
5870 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret=new MEDFileField1TS(other,shallowCopyOfContent);
5871 ret->contentNotNull();
5876 * Returns a new empty instance of MEDFileField1TS.
5877 * \return MEDFileField1TS * - a new instance of MEDFileField1TS. The caller
5878 * is to delete this field using decrRef() as it is no more needed.
5880 MEDFileField1TS *MEDFileField1TS::New()
5882 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret=new MEDFileField1TS;
5883 ret->contentNotNull();
5888 * This method performs a copy with datatype modification ( float64->int32 ) of \a this. The globals information are copied
5889 * following the given input policy.
5891 * \param [in] deepCpyGlobs - a boolean that indicates the behaviour concerning globals (profiles and localizations)
5892 * By default (true) the globals are deeply copied.
5893 * \return MEDFileIntField1TS * - a new object that is the result of the conversion of \a this to int32 field.
5895 MEDFileIntField1TS *MEDFileField1TS::convertToInt(bool deepCpyGlobs) const throw(INTERP_KERNEL::Exception)
5897 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret;
5898 const MEDFileAnyTypeField1TSWithoutSDA *content(_content);
5901 const MEDFileField1TSWithoutSDA *contc=dynamic_cast<const MEDFileField1TSWithoutSDA *>(content);
5903 throw INTERP_KERNEL::Exception("MEDFileField1TS::convertToInt : the content inside this is not FLOAT64 ! This is incoherent !");
5904 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TSWithoutSDA> newc(contc->convertToInt());
5905 ret=static_cast<MEDFileIntField1TS *>(MEDFileAnyTypeField1TS::BuildNewInstanceFromContent((MEDFileIntField1TSWithoutSDA *)newc,getFileName()));
5908 ret=MEDFileIntField1TS::New();
5910 ret->deepCpyGlobs(*this);
5912 ret->shallowCpyGlobs(*this);
5916 const MEDFileField1TSWithoutSDA *MEDFileField1TS::contentNotNull() const throw(INTERP_KERNEL::Exception)
5918 const MEDFileAnyTypeField1TSWithoutSDA *pt(_content);
5920 throw INTERP_KERNEL::Exception("MEDFileField1TS::contentNotNull : the content pointer is null !");
5921 const MEDFileField1TSWithoutSDA *ret=dynamic_cast<const MEDFileField1TSWithoutSDA *>(pt);
5923 throw INTERP_KERNEL::Exception("MEDFileField1TS::contentNotNull : the content pointer is not null but it is not of type double ! Reason is maybe that the read field has not the type FLOAT64 !");
5927 MEDFileField1TSWithoutSDA *MEDFileField1TS::contentNotNull() throw(INTERP_KERNEL::Exception)
5929 MEDFileAnyTypeField1TSWithoutSDA *pt(_content);
5931 throw INTERP_KERNEL::Exception("MEDFileField1TS::contentNotNull : the non const content pointer is null !");
5932 MEDFileField1TSWithoutSDA *ret=dynamic_cast<MEDFileField1TSWithoutSDA *>(pt);
5934 throw INTERP_KERNEL::Exception("MEDFileField1TS::contentNotNull : the non const content pointer is not null but it is not of type double ! Reason is maybe that the read field has not the type FLOAT64 !");
5938 void MEDFileField1TS::SetDataArrayDoubleInField(MEDCouplingFieldDouble *f, MEDCouplingAutoRefCountObjectPtr<DataArray>& arr) throw(INTERP_KERNEL::Exception)
5941 throw INTERP_KERNEL::Exception("MEDFileField1TS::SetDataArrayDoubleInField : input field is NULL !");
5942 if(!((DataArray*)arr))
5943 throw INTERP_KERNEL::Exception("MEDFileField1TS::SetDataArrayDoubleInField : no array !");
5944 DataArrayDouble *arrOutC=dynamic_cast<DataArrayDouble *>((DataArray*)arr);
5946 throw INTERP_KERNEL::Exception("MEDFileField1TS::SetDataArrayDoubleInField : mismatch between dataArrays type and MEDFileField1TS ! Expected double !");
5947 f->setArray(arrOutC);
5950 DataArrayDouble *MEDFileField1TS::ReturnSafelyDataArrayDouble(MEDCouplingAutoRefCountObjectPtr<DataArray>& arr) throw(INTERP_KERNEL::Exception)
5952 if(!((DataArray*)arr))
5953 throw INTERP_KERNEL::Exception("MEDFileField1TS::ReturnSafelyDataArrayDouble : no array !");
5954 DataArrayDouble *arrOutC=dynamic_cast<DataArrayDouble *>((DataArray*)arr);
5956 throw INTERP_KERNEL::Exception("MEDFileField1TS::ReturnSafelyDataArrayDouble : mismatch between dataArrays type and MEDFileField1TS ! Expected double !");
5961 MEDFileField1TS::MEDFileField1TS(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
5962 try:MEDFileAnyTypeField1TS(fileName,loadAll)
5965 catch(INTERP_KERNEL::Exception& e)
5968 MEDFileField1TS::MEDFileField1TS(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
5969 try:MEDFileAnyTypeField1TS(fileName,fieldName,loadAll)
5972 catch(INTERP_KERNEL::Exception& e)
5975 MEDFileField1TS::MEDFileField1TS(const char *fileName, const char *fieldName, int iteration, int order, bool loadAll) throw(INTERP_KERNEL::Exception)
5976 try:MEDFileAnyTypeField1TS(fileName,fieldName,iteration,order,loadAll)
5979 catch(INTERP_KERNEL::Exception& e)
5983 * This constructor is a shallow copy constructor. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
5984 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
5986 * \warning this is a shallow copy constructor
5988 MEDFileField1TS::MEDFileField1TS(const MEDFileField1TSWithoutSDA& other, bool shallowCopyOfContent)
5989 try:MEDFileAnyTypeField1TS(other,shallowCopyOfContent)
5992 catch(INTERP_KERNEL::Exception& e)
5995 MEDFileField1TS::MEDFileField1TS()
5997 _content=new MEDFileField1TSWithoutSDA;
6001 * Returns a new MEDCouplingFieldDouble of a given type lying on
6002 * mesh entities of a given dimension of the first mesh in MED file. If \a this field
6003 * has not been constructed via file reading, an exception is thrown.
6004 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6005 * \param [in] type - a spatial discretization of interest.
6006 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
6007 * \param [in] renumPol - specifies how to permute values of the result field according to
6008 * the optional numbers of cells and nodes, if any. The valid values are
6009 * - 0 - do not permute.
6010 * - 1 - permute cells.
6011 * - 2 - permute nodes.
6012 * - 3 - permute cells and nodes.
6014 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6015 * caller is to delete this field using decrRef() as it is no more needed.
6016 * \throw If \a this field has not been constructed via file reading.
6017 * \throw If the MED file is not readable.
6018 * \throw If there is no mesh in the MED file.
6019 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
6020 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
6021 * \sa getFieldOnMeshAtLevel()
6023 MEDCouplingFieldDouble *MEDFileField1TS::getFieldAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol) const throw(INTERP_KERNEL::Exception)
6025 if(getFileName2().empty())
6026 throw INTERP_KERNEL::Exception("MEDFileField1TS::getFieldAtLevel : Request for a method that can be used for instances coming from file loading ! Use getFieldOnMeshAtLevel method instead !");
6027 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
6028 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldAtLevel(type,meshDimRelToMax,0,renumPol,this,arrOut,*contentNotNull());
6029 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
6034 * Returns a new MEDCouplingFieldDouble of a given type lying on
6035 * the top level cells of the first mesh in MED file. If \a this field
6036 * has not been constructed via file reading, an exception is thrown.
6037 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6038 * \param [in] type - a spatial discretization of interest.
6039 * \param [in] renumPol - specifies how to permute values of the result field according to
6040 * the optional numbers of cells and nodes, if any. The valid values are
6041 * - 0 - do not permute.
6042 * - 1 - permute cells.
6043 * - 2 - permute nodes.
6044 * - 3 - permute cells and nodes.
6046 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6047 * caller is to delete this field using decrRef() as it is no more needed.
6048 * \throw If \a this field has not been constructed via file reading.
6049 * \throw If the MED file is not readable.
6050 * \throw If there is no mesh in the MED file.
6051 * \throw If no field values of the given \a type.
6052 * \throw If no field values lying on the top level support.
6053 * \sa getFieldAtLevel()
6055 MEDCouplingFieldDouble *MEDFileField1TS::getFieldAtTopLevel(TypeOfField type, int renumPol) const throw(INTERP_KERNEL::Exception)
6057 if(getFileName2().empty())
6058 throw INTERP_KERNEL::Exception("MEDFileField1TS::getFieldAtTopLevel : Request for a method that can be used for instances coming from file loading ! Use getFieldOnMeshAtTopLevel method instead !");
6059 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
6060 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldAtTopLevel(type,0,renumPol,this,arrOut,*contentNotNull());
6061 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
6066 * Returns a new MEDCouplingFieldDouble of given type lying on a given mesh.
6067 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6068 * \param [in] type - a spatial discretization of the new field.
6069 * \param [in] mesh - the supporting mesh.
6070 * \param [in] renumPol - specifies how to permute values of the result field according to
6071 * the optional numbers of cells and nodes, if any. The valid values are
6072 * - 0 - do not permute.
6073 * - 1 - permute cells.
6074 * - 2 - permute nodes.
6075 * - 3 - permute cells and nodes.
6077 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6078 * caller is to delete this field using decrRef() as it is no more needed.
6079 * \throw If no field of \a this is lying on \a mesh.
6080 * \throw If the mesh is empty.
6081 * \throw If no field values of the given \a type are available.
6082 * \sa getFieldAtLevel()
6083 * \sa getFieldOnMeshAtLevel()
6085 MEDCouplingFieldDouble *MEDFileField1TS::getFieldOnMeshAtLevel(TypeOfField type, const MEDCouplingMesh *mesh, int renumPol) const throw(INTERP_KERNEL::Exception)
6087 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
6088 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldOnMeshAtLevel(type,renumPol,this,mesh,0,0,arrOut,*contentNotNull());
6089 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
6094 * Returns a new MEDCouplingFieldDouble of a given type lying on a given support.
6095 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6096 * \param [in] type - a spatial discretization of interest.
6097 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
6098 * \param [in] mesh - the supporting mesh.
6099 * \param [in] renumPol - specifies how to permute values of the result field according to
6100 * the optional numbers of cells and nodes, if any. The valid values are
6101 * - 0 - do not permute.
6102 * - 1 - permute cells.
6103 * - 2 - permute nodes.
6104 * - 3 - permute cells and nodes.
6106 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6107 * caller is to delete this field using decrRef() as it is no more needed.
6108 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
6109 * \throw If no field of \a this is lying on \a mesh.
6110 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
6111 * \sa getFieldAtLevel()
6112 * \sa getFieldOnMeshAtLevel()
6114 MEDCouplingFieldDouble *MEDFileField1TS::getFieldOnMeshAtLevel(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, int renumPol) const throw(INTERP_KERNEL::Exception)
6116 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
6117 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldOnMeshAtLevel(type,meshDimRelToMax,renumPol,this,mesh,arrOut,*contentNotNull());
6118 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
6123 * Returns a new MEDCouplingFieldDouble of a given type lying on a given support.
6124 * This method is called "Old" because in MED3 norm a field has only one meshName
6125 * attached, so this method is for readers of MED2 files. If \a this field
6126 * has not been constructed via file reading, an exception is thrown.
6127 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6128 * \param [in] type - a spatial discretization of interest.
6129 * \param [in] mName - a name of the supporting mesh.
6130 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
6131 * \param [in] renumPol - specifies how to permute values of the result field according to
6132 * the optional numbers of cells and nodes, if any. The valid values are
6133 * - 0 - do not permute.
6134 * - 1 - permute cells.
6135 * - 2 - permute nodes.
6136 * - 3 - permute cells and nodes.
6138 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6139 * caller is to delete this field using decrRef() as it is no more needed.
6140 * \throw If the MED file is not readable.
6141 * \throw If there is no mesh named \a mName in the MED file.
6142 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
6143 * \throw If \a this field has not been constructed via file reading.
6144 * \throw If no field of \a this is lying on the mesh named \a mName.
6145 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
6146 * \sa getFieldAtLevel()
6148 MEDCouplingFieldDouble *MEDFileField1TS::getFieldAtLevelOld(TypeOfField type, const char *mname, int meshDimRelToMax, int renumPol) const throw(INTERP_KERNEL::Exception)
6150 if(getFileName2().empty())
6151 throw INTERP_KERNEL::Exception("MEDFileField1TS::getFieldAtLevelOld : Request for a method that can be used for instances coming from file loading ! Use getFieldOnMeshAtLevel method instead !");
6152 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
6153 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldAtLevel(type,meshDimRelToMax,mname,renumPol,this,arrOut,*contentNotNull());
6154 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
6159 * Returns values and a profile of the field of a given type lying on a given support.
6160 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6161 * \param [in] type - a spatial discretization of the field.
6162 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
6163 * \param [in] mesh - the supporting mesh.
6164 * \param [out] pfl - a new instance of DataArrayInt holding ids of mesh entities the
6165 * field of interest lies on. If the field lies on all entities of the given
6166 * dimension, all ids in \a pfl are zero. The caller is to delete this array
6167 * using decrRef() as it is no more needed.
6168 * \return DataArrayDouble * - a new instance of DataArrayDouble holding values of the
6169 * field. The caller is to delete this array using decrRef() as it is no more needed.
6170 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
6171 * \throw If no field of \a this is lying on \a mesh.
6172 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
6174 DataArrayDouble *MEDFileField1TS::getFieldWithProfile(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt *&pfl) const throw(INTERP_KERNEL::Exception)
6176 MEDCouplingAutoRefCountObjectPtr<DataArray> ret=contentNotNull()->getFieldWithProfile(type,meshDimRelToMax,mesh,pfl,this,*contentNotNull());
6177 return MEDFileField1TS::ReturnSafelyDataArrayDouble(ret);
6181 * Adds a MEDCouplingFieldDouble to \a this. The underlying mesh of the given field is
6182 * checked if its elements are sorted suitable for writing to MED file ("STB" stands for
6183 * "Sort By Type"), if not, an exception is thrown.
6184 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6185 * \param [in] field - the field to add to \a this.
6186 * \throw If the name of \a field is empty.
6187 * \throw If the data array of \a field is not set.
6188 * \throw If the data array is already allocated but has different number of components
6190 * \throw If the underlying mesh of \a field has no name.
6191 * \throw If elements in the mesh are not in the order suitable for writing to the MED file.
6193 void MEDFileField1TS::setFieldNoProfileSBT(const MEDCouplingFieldDouble *field) throw(INTERP_KERNEL::Exception)
6196 contentNotNull()->setFieldNoProfileSBT(field,field->getArray(),*this,*contentNotNull());
6200 * Adds a MEDCouplingFieldDouble to \a this. Specified entities of a given dimension
6201 * of a given mesh are used as the support of the given field (a real support is not used).
6202 * Elements of the given mesh must be sorted suitable for writing to MED file.
6203 * Order of underlying mesh entities of the given field specified by \a profile parameter
6204 * is not prescribed; this method permutes field values to have them sorted by element
6205 * type as required for writing to MED file. A new profile is added only if no equal
6206 * profile is missing.
6207 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6208 * \param [in] field - the field to add to \a this.
6209 * \param [in] mesh - the supporting mesh of \a field.
6210 * \param [in] meshDimRelToMax - a relative dimension of mesh entities \a field lies on.
6211 * \param [in] profile - ids of mesh entities on which corresponding field values lie.
6212 * \throw If either \a field or \a mesh or \a profile has an empty name.
6213 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
6214 * \throw If the data array of \a field is not set.
6215 * \throw If the data array of \a this is already allocated but has different number of
6216 * components than \a field.
6217 * \throw If elements in \a mesh are not in the order suitable for writing to the MED file.
6218 * \sa setFieldNoProfileSBT()
6220 void MEDFileField1TS::setFieldProfile(const MEDCouplingFieldDouble *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile) throw(INTERP_KERNEL::Exception)
6223 contentNotNull()->setFieldProfile(field,field->getArray(),mesh,meshDimRelToMax,profile,*this,*contentNotNull());
6226 MEDFileAnyTypeField1TS *MEDFileField1TS::shallowCpy() const throw(INTERP_KERNEL::Exception)
6228 return new MEDFileField1TS(*this);
6231 DataArrayDouble *MEDFileField1TS::getUndergroundDataArray() const throw(INTERP_KERNEL::Exception)
6233 return contentNotNull()->getUndergroundDataArrayDouble();
6236 DataArrayDouble *MEDFileField1TS::getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
6238 return contentNotNull()->getUndergroundDataArrayDoubleExt(entries);
6241 std::vector< std::vector<DataArrayDouble *> > MEDFileField1TS::getFieldSplitedByType2(const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF,
6242 std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
6244 return contentNotNull()->getFieldSplitedByType2(mname,types,typesF,pfls,locs);
6247 //= MEDFileIntField1TS
6249 MEDFileIntField1TS *MEDFileIntField1TS::New()
6251 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret=new MEDFileIntField1TS;
6252 ret->contentNotNull();
6256 MEDFileIntField1TS *MEDFileIntField1TS::New(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
6258 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret=new MEDFileIntField1TS(fileName,loadAll);
6259 ret->contentNotNull();
6263 MEDFileIntField1TS *MEDFileIntField1TS::New(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
6265 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret=new MEDFileIntField1TS(fileName,fieldName,loadAll);
6266 ret->contentNotNull();
6270 MEDFileIntField1TS *MEDFileIntField1TS::New(const char *fileName, const char *fieldName, int iteration, int order, bool loadAll) throw(INTERP_KERNEL::Exception)
6272 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret=new MEDFileIntField1TS(fileName,fieldName,iteration,order,loadAll);
6273 ret->contentNotNull();
6277 MEDFileIntField1TS *MEDFileIntField1TS::New(const MEDFileIntField1TSWithoutSDA& other, bool shallowCopyOfContent)
6279 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret=new MEDFileIntField1TS(other,shallowCopyOfContent);
6280 ret->contentNotNull();
6284 MEDFileIntField1TS::MEDFileIntField1TS()
6286 _content=new MEDFileIntField1TSWithoutSDA;
6289 MEDFileIntField1TS::MEDFileIntField1TS(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
6290 try:MEDFileAnyTypeField1TS(fileName,loadAll)
6293 catch(INTERP_KERNEL::Exception& e)
6296 MEDFileIntField1TS::MEDFileIntField1TS(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
6297 try:MEDFileAnyTypeField1TS(fileName,fieldName,loadAll)
6300 catch(INTERP_KERNEL::Exception& e)
6303 MEDFileIntField1TS::MEDFileIntField1TS(const char *fileName, const char *fieldName, int iteration, int order, bool loadAll) throw(INTERP_KERNEL::Exception)
6304 try:MEDFileAnyTypeField1TS(fileName,fieldName,iteration,order,loadAll)
6307 catch(INTERP_KERNEL::Exception& e)
6311 * This constructor is a shallow copy constructor. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
6312 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
6314 * \warning this is a shallow copy constructor
6316 MEDFileIntField1TS::MEDFileIntField1TS(const MEDFileIntField1TSWithoutSDA& other, bool shallowCopyOfContent):MEDFileAnyTypeField1TS(other,shallowCopyOfContent)
6320 MEDFileAnyTypeField1TS *MEDFileIntField1TS::shallowCpy() const throw(INTERP_KERNEL::Exception)
6322 return new MEDFileIntField1TS(*this);
6326 * This method performs a copy with datatype modification ( int32->float64 ) of \a this. The globals information are copied
6327 * following the given input policy.
6329 * \param [in] deepCpyGlobs - a boolean that indicates the behaviour concerning globals (profiles and localizations)
6330 * By default (true) the globals are deeply copied.
6331 * \return MEDFileField1TS * - a new object that is the result of the conversion of \a this to float64 field.
6333 MEDFileField1TS *MEDFileIntField1TS::convertToDouble(bool deepCpyGlobs) const throw(INTERP_KERNEL::Exception)
6335 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret;
6336 const MEDFileAnyTypeField1TSWithoutSDA *content(_content);
6339 const MEDFileIntField1TSWithoutSDA *contc=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(content);
6341 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::convertToInt : the content inside this is not INT32 ! This is incoherent !");
6342 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TSWithoutSDA> newc(contc->convertToDouble());
6343 ret=static_cast<MEDFileField1TS *>(MEDFileAnyTypeField1TS::BuildNewInstanceFromContent((MEDFileField1TSWithoutSDA *)newc,getFileName()));
6346 ret=MEDFileField1TS::New();
6348 ret->deepCpyGlobs(*this);
6350 ret->shallowCpyGlobs(*this);
6355 * Adds a MEDCouplingFieldDouble to \a this. The underlying mesh of the given field is
6356 * checked if its elements are sorted suitable for writing to MED file ("STB" stands for
6357 * "Sort By Type"), if not, an exception is thrown.
6358 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6359 * \param [in] field - the field to add to \a this. The field double values are ignored.
6360 * \param [in] arrOfVals - the values of the field \a field used.
6361 * \throw If the name of \a field is empty.
6362 * \throw If the data array of \a field is not set.
6363 * \throw If the data array is already allocated but has different number of components
6365 * \throw If the underlying mesh of \a field has no name.
6366 * \throw If elements in the mesh are not in the order suitable for writing to the MED file.
6368 void MEDFileIntField1TS::setFieldNoProfileSBT(const MEDCouplingFieldDouble *field, const DataArrayInt *arrOfVals) throw(INTERP_KERNEL::Exception)
6371 contentNotNull()->setFieldNoProfileSBT(field,arrOfVals,*this,*contentNotNull());
6375 * Adds a MEDCouplingFieldDouble to \a this. Specified entities of a given dimension
6376 * of a given mesh are used as the support of the given field (a real support is not used).
6377 * Elements of the given mesh must be sorted suitable for writing to MED file.
6378 * Order of underlying mesh entities of the given field specified by \a profile parameter
6379 * is not prescribed; this method permutes field values to have them sorted by element
6380 * type as required for writing to MED file. A new profile is added only if no equal
6381 * profile is missing.
6382 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6383 * \param [in] field - the field to add to \a this. The field double values are ignored.
6384 * \param [in] arrOfVals - the values of the field \a field used.
6385 * \param [in] mesh - the supporting mesh of \a field.
6386 * \param [in] meshDimRelToMax - a relative dimension of mesh entities \a field lies on.
6387 * \param [in] profile - ids of mesh entities on which corresponding field values lie.
6388 * \throw If either \a field or \a mesh or \a profile has an empty name.
6389 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
6390 * \throw If the data array of \a field is not set.
6391 * \throw If the data array of \a this is already allocated but has different number of
6392 * components than \a field.
6393 * \throw If elements in \a mesh are not in the order suitable for writing to the MED file.
6394 * \sa setFieldNoProfileSBT()
6396 void MEDFileIntField1TS::setFieldProfile(const MEDCouplingFieldDouble *field, const DataArrayInt *arrOfVals, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile) throw(INTERP_KERNEL::Exception)
6399 contentNotNull()->setFieldProfile(field,arrOfVals,mesh,meshDimRelToMax,profile,*this,*contentNotNull());
6402 const MEDFileIntField1TSWithoutSDA *MEDFileIntField1TS::contentNotNull() const throw(INTERP_KERNEL::Exception)
6404 const MEDFileAnyTypeField1TSWithoutSDA *pt(_content);
6406 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::contentNotNull : the content pointer is null !");
6407 const MEDFileIntField1TSWithoutSDA *ret=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(pt);
6409 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::contentNotNull : the content pointer is not null but it is not of type int32 ! Reason is maybe that the read field has not the type INT32 !");
6413 MEDCouplingFieldDouble *MEDFileIntField1TS::getFieldAtLevel(TypeOfField type, int meshDimRelToMax, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
6415 if(getFileName2().empty())
6416 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::getFieldAtLevel : Request for a method that can be used for instances coming from file loading ! Use getFieldOnMeshAtLevel method instead !");
6417 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut2;
6418 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldAtLevel(type,meshDimRelToMax,0,renumPol,this,arrOut2,*contentNotNull());
6419 DataArrayInt *arrOutC=dynamic_cast<DataArrayInt *>((DataArray *)arrOut2);
6421 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::getFieldAtLevelOld : mismatch between dataArrays type and MEDFileIntField1TS ! Expected int32 !");
6426 DataArrayInt *MEDFileIntField1TS::ReturnSafelyDataArrayInt(MEDCouplingAutoRefCountObjectPtr<DataArray>& arr) throw(INTERP_KERNEL::Exception)
6428 if(!((DataArray *)arr))
6429 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::ReturnSafelyDataArrayInt : input DataArray is NULL !");
6430 DataArrayInt *arrC=dynamic_cast<DataArrayInt *>((DataArray *)arr);
6432 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::ReturnSafelyDataArrayInt : input DataArray is not of type INT32 !");
6438 * Returns a new MEDCouplingFieldDouble of a given type lying on
6439 * the top level cells of the first mesh in MED file. If \a this field
6440 * has not been constructed via file reading, an exception is thrown.
6441 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6442 * \param [in] type - a spatial discretization of interest.
6443 * \param [out] arrOut - the DataArrayInt containing values of field.
6444 * \param [in] renumPol - specifies how to permute values of the result field according to
6445 * the optional numbers of cells and nodes, if any. The valid values are
6446 * - 0 - do not permute.
6447 * - 1 - permute cells.
6448 * - 2 - permute nodes.
6449 * - 3 - permute cells and nodes.
6451 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6452 * caller is to delete this field using decrRef() as it is no more needed.
6453 * \throw If \a this field has not been constructed via file reading.
6454 * \throw If the MED file is not readable.
6455 * \throw If there is no mesh in the MED file.
6456 * \throw If no field values of the given \a type.
6457 * \throw If no field values lying on the top level support.
6458 * \sa getFieldAtLevel()
6460 MEDCouplingFieldDouble *MEDFileIntField1TS::getFieldAtTopLevel(TypeOfField type, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
6462 if(getFileName2().empty())
6463 throw INTERP_KERNEL::Exception("MEDFileField1TS::getFieldAtTopLevel : Request for a method that can be used for instances coming from file loading ! Use getFieldOnMeshAtTopLevel method instead !");
6464 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
6465 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldAtTopLevel(type,0,renumPol,this,arr,*contentNotNull());
6466 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
6471 * Returns a new MEDCouplingFieldDouble of given type lying on a given mesh.
6472 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6473 * \param [in] type - a spatial discretization of the new field.
6474 * \param [in] mesh - the supporting mesh.
6475 * \param [out] arrOut - the DataArrayInt containing values of field.
6476 * \param [in] renumPol - specifies how to permute values of the result field according to
6477 * the optional numbers of cells and nodes, if any. The valid values are
6478 * - 0 - do not permute.
6479 * - 1 - permute cells.
6480 * - 2 - permute nodes.
6481 * - 3 - permute cells and nodes.
6483 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6484 * caller is to delete this field using decrRef() as it is no more needed.
6485 * \throw If no field of \a this is lying on \a mesh.
6486 * \throw If the mesh is empty.
6487 * \throw If no field values of the given \a type are available.
6488 * \sa getFieldAtLevel()
6489 * \sa getFieldOnMeshAtLevel()
6491 MEDCouplingFieldDouble *MEDFileIntField1TS::getFieldOnMeshAtLevel(TypeOfField type, const MEDCouplingMesh *mesh, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
6493 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
6494 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldOnMeshAtLevel(type,renumPol,this,mesh,0,0,arr,*contentNotNull());
6495 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
6500 * Returns a new MEDCouplingFieldDouble of a given type lying on a given support.
6501 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6502 * \param [in] type - a spatial discretization of interest.
6503 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
6504 * \param [out] arrOut - the DataArrayInt containing values of field.
6505 * \param [in] mesh - the supporting mesh.
6506 * \param [in] renumPol - specifies how to permute values of the result field according to
6507 * the optional numbers of cells and nodes, if any. The valid values are
6508 * - 0 - do not permute.
6509 * - 1 - permute cells.
6510 * - 2 - permute nodes.
6511 * - 3 - permute cells and nodes.
6513 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6514 * caller is to delete this field using decrRef() as it is no more needed.
6515 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
6516 * \throw If no field of \a this is lying on \a mesh.
6517 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
6518 * \sa getFieldAtLevel()
6519 * \sa getFieldOnMeshAtLevel()
6521 MEDCouplingFieldDouble *MEDFileIntField1TS::getFieldOnMeshAtLevel(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
6523 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
6524 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldOnMeshAtLevel(type,meshDimRelToMax,renumPol,this,mesh,arr,*contentNotNull());
6525 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
6530 * Returns a new MEDCouplingFieldDouble of a given type lying on a given support.
6531 * This method is called "Old" because in MED3 norm a field has only one meshName
6532 * attached, so this method is for readers of MED2 files. If \a this field
6533 * has not been constructed via file reading, an exception is thrown.
6534 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6535 * \param [in] type - a spatial discretization of interest.
6536 * \param [in] mName - a name of the supporting mesh.
6537 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
6538 * \param [out] arrOut - the DataArrayInt containing values of field.
6539 * \param [in] renumPol - specifies how to permute values of the result field according to
6540 * the optional numbers of cells and nodes, if any. The valid values are
6541 * - 0 - do not permute.
6542 * - 1 - permute cells.
6543 * - 2 - permute nodes.
6544 * - 3 - permute cells and nodes.
6546 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
6547 * caller is to delete this field using decrRef() as it is no more needed.
6548 * \throw If the MED file is not readable.
6549 * \throw If there is no mesh named \a mName in the MED file.
6550 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
6551 * \throw If \a this field has not been constructed via file reading.
6552 * \throw If no field of \a this is lying on the mesh named \a mName.
6553 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
6554 * \sa getFieldAtLevel()
6556 MEDCouplingFieldDouble *MEDFileIntField1TS::getFieldAtLevelOld(TypeOfField type, const char *mname, int meshDimRelToMax, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
6558 if(getFileName2().empty())
6559 throw INTERP_KERNEL::Exception("MEDFileField1TS::getFieldAtLevelOld : Request for a method that can be used for instances coming from file loading ! Use getFieldOnMeshAtLevel method instead !");
6560 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
6561 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=contentNotNull()->getFieldAtLevel(type,meshDimRelToMax,mname,renumPol,this,arr,*contentNotNull());
6562 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
6567 * Returns values and a profile of the field of a given type lying on a given support.
6568 * For more info, see \ref AdvMEDLoaderAPIFieldRW
6569 * \param [in] type - a spatial discretization of the field.
6570 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
6571 * \param [in] mesh - the supporting mesh.
6572 * \param [out] pfl - a new instance of DataArrayInt holding ids of mesh entities the
6573 * field of interest lies on. If the field lies on all entities of the given
6574 * dimension, all ids in \a pfl are zero. The caller is to delete this array
6575 * using decrRef() as it is no more needed.
6576 * \return DataArrayInt * - a new instance of DataArrayInt holding values of the
6577 * field. The caller is to delete this array using decrRef() as it is no more needed.
6578 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
6579 * \throw If no field of \a this is lying on \a mesh.
6580 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
6582 DataArrayInt *MEDFileIntField1TS::getFieldWithProfile(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt *&pfl) const throw(INTERP_KERNEL::Exception)
6584 MEDCouplingAutoRefCountObjectPtr<DataArray> arr=contentNotNull()->getFieldWithProfile(type,meshDimRelToMax,mesh,pfl,this,*contentNotNull());
6585 return MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
6588 MEDFileIntField1TSWithoutSDA *MEDFileIntField1TS::contentNotNull() throw(INTERP_KERNEL::Exception)
6590 MEDFileAnyTypeField1TSWithoutSDA *pt(_content);
6592 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::contentNotNull : the non const content pointer is null !");
6593 MEDFileIntField1TSWithoutSDA *ret=dynamic_cast<MEDFileIntField1TSWithoutSDA *>(pt);
6595 throw INTERP_KERNEL::Exception("MEDFileIntField1TS::contentNotNull : the non const content pointer is not null but it is not of type int32 ! Reason is maybe that the read field has not the type INT32 !");
6599 DataArrayInt *MEDFileIntField1TS::getUndergroundDataArray() const throw(INTERP_KERNEL::Exception)
6601 return contentNotNull()->getUndergroundDataArrayInt();
6604 //= MEDFileAnyTypeFieldMultiTSWithoutSDA
6606 MEDFileAnyTypeFieldMultiTSWithoutSDA::MEDFileAnyTypeFieldMultiTSWithoutSDA()
6610 MEDFileAnyTypeFieldMultiTSWithoutSDA::MEDFileAnyTypeFieldMultiTSWithoutSDA(const char *fieldName):MEDFileFieldNameScope(fieldName)
6615 * \param [in] fieldId field id in C mode
6617 MEDFileAnyTypeFieldMultiTSWithoutSDA::MEDFileAnyTypeFieldMultiTSWithoutSDA(med_idt fid, int fieldId, bool loadAll) throw(INTERP_KERNEL::Exception)
6619 med_field_type typcha;
6620 std::string dtunitOut;
6621 int nbOfStep=MEDFileAnyTypeField1TS::LocateField2(fid,"",fieldId,false,_name,typcha,_infos,dtunitOut);
6622 setDtUnit(dtunitOut.c_str());
6623 loadStructureOrStructureAndBigArraysRecursively(fid,nbOfStep,typcha,loadAll);
6626 MEDFileAnyTypeFieldMultiTSWithoutSDA::MEDFileAnyTypeFieldMultiTSWithoutSDA(med_idt fid, const char *fieldName, med_field_type fieldTyp, const std::vector<std::string>& infos, int nbOfStep, const std::string& dtunit, bool loadAll) throw(INTERP_KERNEL::Exception)
6627 try:MEDFileFieldNameScope(fieldName),_infos(infos)
6629 setDtUnit(dtunit.c_str());
6630 loadStructureOrStructureAndBigArraysRecursively(fid,nbOfStep,fieldTyp,loadAll);
6632 catch(INTERP_KERNEL::Exception& e)
6637 std::size_t MEDFileAnyTypeFieldMultiTSWithoutSDA::getHeapMemorySize() const
6639 std::size_t ret=_name.capacity()+_infos.capacity()*sizeof(std::string)+_time_steps.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr<MEDFileField1TSWithoutSDA>);
6640 for(std::vector<std::string>::const_iterator it=_infos.begin();it!=_infos.end();it++)
6641 ret+=(*it).capacity();
6642 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++)
6643 if((const MEDFileAnyTypeField1TSWithoutSDA *)(*it))
6644 ret+=(*it)->getHeapMemorySize();
6649 * If one of the id in [ \a startIds , \a endIds ) points to a null element, there is not throw. Simply, this empty element is added as if it were not
6652 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTSWithoutSDA::buildFromTimeStepIds(const int *startIds, const int *endIds) const throw(INTERP_KERNEL::Exception)
6654 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> ret=createNew();
6655 ret->setInfo(_infos);
6656 int sz=(int)_time_steps.size();
6657 for(const int *id=startIds;id!=endIds;id++)
6659 if(*id>=0 && *id<sz)
6661 const MEDFileAnyTypeField1TSWithoutSDA *tse=_time_steps[*id];
6662 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> tse2;
6666 tse2=(const_cast<MEDFileAnyTypeField1TSWithoutSDA *>(tse));
6668 ret->pushBackTimeStep(tse2);
6672 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::buildFromTimeStepIds : At pos #" << std::distance(startIds,id) << " value is " << *id;
6673 oss << " ! Should be in [0," << sz << ") !";
6674 throw INTERP_KERNEL::Exception(oss.str().c_str());
6677 if(ret->getNumberOfTS()>0)
6678 ret->synchronizeNameScope();
6679 ret->copyNameScope(*this);
6684 * If one of the id in the input range points to a null element, there is not throw. Simply, this empty element is added as if it were not
6687 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTSWithoutSDA::buildFromTimeStepIds2(int bg, int end, int step) const throw(INTERP_KERNEL::Exception)
6689 static const char msg[]="MEDFileAnyTypeFieldMultiTSWithoutSDA::buildFromTimeStepIds2";
6690 int nbOfEntriesToKeep=DataArrayInt::GetNumberOfItemGivenBESRelative(bg,end,step,msg);
6691 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> ret=createNew();
6692 ret->setInfo(_infos);
6693 int sz=(int)_time_steps.size();
6695 for(int i=0;i<nbOfEntriesToKeep;i++,j+=step)
6699 const MEDFileAnyTypeField1TSWithoutSDA *tse=_time_steps[j];
6700 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> tse2;
6704 tse2=(const_cast<MEDFileAnyTypeField1TSWithoutSDA *>(tse));
6706 ret->pushBackTimeStep(tse2);
6710 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::buildFromTimeStepIds : At pos #" << i << " value is " << j;
6711 oss << " ! Should be in [0," << sz << ") !";
6712 throw INTERP_KERNEL::Exception(oss.str().c_str());
6715 if(ret->getNumberOfTS()>0)
6716 ret->synchronizeNameScope();
6717 ret->copyNameScope(*this);
6721 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTSWithoutSDA::partOfThisLyingOnSpecifiedTimeSteps(const std::vector< std::pair<int,int> >& timeSteps) const throw(INTERP_KERNEL::Exception)
6724 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ids=DataArrayInt::New(); ids->alloc(0,1);
6725 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,id++)
6727 const MEDFileAnyTypeField1TSWithoutSDA *cur(*it);
6730 std::pair<int,int> p(cur->getIteration(),cur->getOrder());
6731 if(std::find(timeSteps.begin(),timeSteps.end(),p)!=timeSteps.end())
6732 ids->pushBackSilent(id);
6734 return buildFromTimeStepIds(ids->begin(),ids->end());
6737 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTSWithoutSDA::partOfThisNotLyingOnSpecifiedTimeSteps(const std::vector< std::pair<int,int> >& timeSteps) const throw(INTERP_KERNEL::Exception)
6740 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ids=DataArrayInt::New(); ids->alloc(0,1);
6741 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,id++)
6743 const MEDFileAnyTypeField1TSWithoutSDA *cur(*it);
6746 std::pair<int,int> p(cur->getIteration(),cur->getOrder());
6747 if(std::find(timeSteps.begin(),timeSteps.end(),p)==timeSteps.end())
6748 ids->pushBackSilent(id);
6750 return buildFromTimeStepIds(ids->begin(),ids->end());
6753 const std::vector<std::string>& MEDFileAnyTypeFieldMultiTSWithoutSDA::getInfo() const throw(INTERP_KERNEL::Exception)
6758 void MEDFileAnyTypeFieldMultiTSWithoutSDA::setInfo(const std::vector<std::string>& info) throw(INTERP_KERNEL::Exception)
6763 int MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepPos(int iteration, int order) const throw(INTERP_KERNEL::Exception)
6766 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,ret++)
6768 const MEDFileAnyTypeField1TSWithoutSDA *pt(*it);
6769 if(pt->isDealingTS(iteration,order))
6772 std::ostringstream oss; oss << "MEDFileFieldMultiTS::getTimeStepPos : Muli timestep field on time (" << iteration << "," << order << ") does not exist ! Available (iteration,order) are :\n";
6773 std::vector< std::pair<int,int> > vp=getIterations();
6774 for(std::vector< std::pair<int,int> >::const_iterator it2=vp.begin();it2!=vp.end();it2++)
6775 oss << "(" << (*it2).first << "," << (*it2).second << ") ";
6776 throw INTERP_KERNEL::Exception(oss.str().c_str());
6779 const MEDFileAnyTypeField1TSWithoutSDA& MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepEntry(int iteration, int order) const throw(INTERP_KERNEL::Exception)
6781 return *_time_steps[getTimeStepPos(iteration,order)];
6784 MEDFileAnyTypeField1TSWithoutSDA& MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepEntry(int iteration, int order) throw(INTERP_KERNEL::Exception)
6786 return *_time_steps[getTimeStepPos(iteration,order)];
6789 std::string MEDFileAnyTypeFieldMultiTSWithoutSDA::getMeshName() const throw(INTERP_KERNEL::Exception)
6791 if(_time_steps.empty())
6792 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::getMeshName : not time steps !");
6793 return _time_steps[0]->getMeshName();
6796 void MEDFileAnyTypeFieldMultiTSWithoutSDA::setMeshName(const char *newMeshName) throw(INTERP_KERNEL::Exception)
6798 std::string oldName(getMeshName());
6799 std::vector< std::pair<std::string,std::string> > v(1);
6800 v[0].first=oldName; v[0].second=newMeshName;
6804 bool MEDFileAnyTypeFieldMultiTSWithoutSDA::changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab) throw(INTERP_KERNEL::Exception)
6807 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
6809 MEDFileAnyTypeField1TSWithoutSDA *cur(*it);
6811 ret=cur->changeMeshNames(modifTab) || ret;
6817 * See doc at MEDFileField1TSWithoutSDA::getUndergroundDataArray
6819 DataArray *MEDFileAnyTypeFieldMultiTSWithoutSDA::getUndergroundDataArray(int iteration, int order) const throw(INTERP_KERNEL::Exception)
6821 return getTimeStepEntry(iteration,order).getUndergroundDataArray();
6825 * See doc at MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt
6827 DataArray *MEDFileAnyTypeFieldMultiTSWithoutSDA::getUndergroundDataArrayExt(int iteration, int order, std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
6829 return getTimeStepEntry(iteration,order).getUndergroundDataArrayExt(entries);
6832 bool MEDFileAnyTypeFieldMultiTSWithoutSDA::renumberEntitiesLyingOnMesh(const char *meshName, const std::vector<int>& oldCode, const std::vector<int>& newCode, const DataArrayInt *renumO2N,
6833 MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
6836 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
6838 MEDFileAnyTypeField1TSWithoutSDA *f1ts(*it);
6840 ret=f1ts->renumberEntitiesLyingOnMesh(meshName,oldCode,newCode,renumO2N,glob) || ret;
6845 void MEDFileAnyTypeFieldMultiTSWithoutSDA::simpleRepr(int bkOffset, std::ostream& oss, int fmtsId) const
6847 std::string startLine(bkOffset,' ');
6848 oss << startLine << "Field multi time steps [Type=" << getTypeStr() << "]";
6850 oss << " (" << fmtsId << ")";
6851 oss << " has the following name: \"" << _name << "\"." << std::endl;
6852 oss << startLine << "Field multi time steps has " << _infos.size() << " components with the following infos :" << std::endl;
6853 for(std::vector<std::string>::const_iterator it=_infos.begin();it!=_infos.end();it++)
6855 oss << startLine << " - \"" << *it << "\"" << std::endl;
6858 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,i++)
6860 std::string chapter(17,'0'+i);
6861 oss << startLine << chapter << std::endl;
6862 const MEDFileAnyTypeField1TSWithoutSDA *cur=(*it);
6864 cur->simpleRepr(bkOffset+2,oss,i);
6866 oss << startLine << " Field on one time step #" << i << " is not defined !" << std::endl;
6867 oss << startLine << chapter << std::endl;
6871 std::vector< std::pair<int,int> > MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeSteps(std::vector<double>& ret1) const throw(INTERP_KERNEL::Exception)
6873 std::size_t sz=_time_steps.size();
6874 std::vector< std::pair<int,int> > ret(sz);
6876 for(std::size_t i=0;i<sz;i++)
6878 const MEDFileAnyTypeField1TSWithoutSDA *f1ts=_time_steps[i];
6881 ret1[i]=f1ts->getTime(ret[i].first,ret[i].second);
6885 std::ostringstream oss; oss << "MEDFileFieldMultiTSWithoutSDA::getTimeSteps : At rank #" << i << " time step is not defined. Invoke eraseEmptyTS method !";
6886 throw INTERP_KERNEL::Exception(oss.str().c_str());
6892 void MEDFileAnyTypeFieldMultiTSWithoutSDA::pushBackTimeStep(MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA>& tse) throw(INTERP_KERNEL::Exception)
6894 MEDFileAnyTypeField1TSWithoutSDA *tse2(tse);
6896 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTSWithoutSDA::pushBackTimeStep : input content object is null !");
6897 checkCoherencyOfType(tse2);
6898 if(_time_steps.empty())
6900 setName(tse2->getName().c_str());
6901 setInfo(tse2->getInfo());
6903 checkThatComponentsMatch(tse2->getInfo());
6904 _time_steps.push_back(tse);
6907 void MEDFileAnyTypeFieldMultiTSWithoutSDA::synchronizeNameScope() throw(INTERP_KERNEL::Exception)
6909 std::size_t nbOfCompo=_infos.size();
6910 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
6912 MEDFileAnyTypeField1TSWithoutSDA *cur=(*it);
6915 if((cur->getInfo()).size()!=nbOfCompo)
6917 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::synchronizeNameScope : Mismatch in the number of components of parts ! Should be " << nbOfCompo;
6918 oss << " ! but the field at iteration=" << cur->getIteration() << " order=" << cur->getOrder() << " has " << (cur->getInfo()).size() << " components !";
6919 throw INTERP_KERNEL::Exception(oss.str().c_str());
6921 cur->copyNameScope(*this);
6926 void MEDFileAnyTypeFieldMultiTSWithoutSDA::loadStructureOrStructureAndBigArraysRecursively(med_idt fid, int nbPdt, med_field_type fieldTyp, bool loadAll) throw(INTERP_KERNEL::Exception)
6928 _time_steps.resize(nbPdt);
6929 for(int i=0;i<nbPdt;i++)
6931 std::vector< std::pair<int,int> > ts;
6932 med_int numdt=0,numo=0;
6933 med_int meshIt=0,meshOrder=0;
6935 MEDfieldComputingStepMeshInfo(fid,_name.c_str(),i+1,&numdt,&numo,&dt,&meshIt,&meshOrder);
6940 _time_steps[i]=MEDFileField1TSWithoutSDA::New(_name.c_str(),i+1,numdt,numo,_infos);
6945 _time_steps[i]=MEDFileIntField1TSWithoutSDA::New(_name.c_str(),i+1,numdt,numo,_infos);
6949 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTSWithoutSDA::loadStructureOrStructureAndBigArraysRecursively : managed field type are : FLOAT64, INT32 !");
6952 _time_steps[i]->loadStructureAndBigArraysRecursively(fid,*this);
6954 _time_steps[i]->loadOnlyStructureOfDataRecursively(fid,*this);
6958 void MEDFileAnyTypeFieldMultiTSWithoutSDA::writeLL(med_idt fid, const MEDFileWritable& opts) const throw(INTERP_KERNEL::Exception)
6960 if(_time_steps.empty())
6961 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::writeLL : no time steps set !");
6962 checkThatNbOfCompoOfTSMatchThis();
6963 std::vector<std::string> infos(getInfo());
6964 int nbComp=infos.size();
6965 INTERP_KERNEL::AutoPtr<char> comp=MEDLoaderBase::buildEmptyString(nbComp*MED_SNAME_SIZE);
6966 INTERP_KERNEL::AutoPtr<char> unit=MEDLoaderBase::buildEmptyString(nbComp*MED_SNAME_SIZE);
6967 for(int i=0;i<nbComp;i++)
6969 std::string info=infos[i];
6971 MEDLoaderBase::splitIntoNameAndUnit(info,c,u);
6972 MEDLoaderBase::safeStrCpy2(c.c_str(),MED_SNAME_SIZE,comp+i*MED_SNAME_SIZE,opts.getTooLongStrPolicy());
6973 MEDLoaderBase::safeStrCpy2(u.c_str(),MED_SNAME_SIZE,unit+i*MED_SNAME_SIZE,opts.getTooLongStrPolicy());
6976 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::write : MED file does not accept field with empty name !");
6977 MEDfieldCr(fid,_name.c_str(),getMEDFileFieldType(),nbComp,comp,unit,getDtUnit().c_str(),getMeshName().c_str());
6978 int nbOfTS=_time_steps.size();
6979 for(int i=0;i<nbOfTS;i++)
6980 _time_steps[i]->writeLL(fid,opts,*this);
6983 void MEDFileAnyTypeFieldMultiTSWithoutSDA::loadBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
6985 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
6987 MEDFileAnyTypeField1TSWithoutSDA *elt(*it);
6989 elt->loadBigArraysRecursively(fid,nasc);
6993 void MEDFileAnyTypeFieldMultiTSWithoutSDA::loadBigArraysRecursivelyIfNecessary(med_idt fid, const MEDFileFieldNameScope& nasc) throw(INTERP_KERNEL::Exception)
6995 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
6997 MEDFileAnyTypeField1TSWithoutSDA *elt(*it);
6999 elt->loadBigArraysRecursivelyIfNecessary(fid,nasc);
7003 void MEDFileAnyTypeFieldMultiTSWithoutSDA::releaseArrays() throw(INTERP_KERNEL::Exception)
7005 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7007 MEDFileAnyTypeField1TSWithoutSDA *elt(*it);
7009 elt->releaseArrays();
7013 int MEDFileAnyTypeFieldMultiTSWithoutSDA::getNumberOfTS() const
7015 return _time_steps.size();
7018 void MEDFileAnyTypeFieldMultiTSWithoutSDA::eraseEmptyTS() throw(INTERP_KERNEL::Exception)
7020 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > newTS;
7021 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7023 const MEDFileAnyTypeField1TSWithoutSDA *tmp=(*it);
7025 newTS.push_back(*it);
7030 void MEDFileAnyTypeFieldMultiTSWithoutSDA::eraseTimeStepIds(const int *startIds, const int *endIds) throw(INTERP_KERNEL::Exception)
7032 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > newTS;
7033 int maxId=(int)_time_steps.size();
7035 std::set<int> idsToDel;
7036 for(const int *id=startIds;id!=endIds;id++,ii++)
7038 if(*id>=0 && *id<maxId)
7040 idsToDel.insert(*id);
7044 std::ostringstream oss; oss << "MEDFileFieldMultiTSWithoutSDA::eraseTimeStepIds : At pos #" << ii << " request for id=" << *id << " not in [0," << maxId << ") !";
7045 throw INTERP_KERNEL::Exception(oss.str().c_str());
7048 for(int iii=0;iii<maxId;iii++)
7049 if(idsToDel.find(iii)==idsToDel.end())
7050 newTS.push_back(_time_steps[iii]);
7054 void MEDFileAnyTypeFieldMultiTSWithoutSDA::eraseTimeStepIds2(int bg, int end, int step) throw(INTERP_KERNEL::Exception)
7056 static const char msg[]="MEDFileAnyTypeFieldMultiTSWithoutSDA::eraseTimeStepIds2";
7057 int nbOfEntriesToKill=DataArrayInt::GetNumberOfItemGivenBESRelative(bg,end,step,msg);
7058 if(nbOfEntriesToKill==0)
7060 std::size_t sz=_time_steps.size();
7061 std::vector<bool> b(sz,true);
7063 for(int i=0;i<nbOfEntriesToKill;i++,j+=step)
7065 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > newTS;
7066 for(std::size_t i=0;i<sz;i++)
7068 newTS.push_back(_time_steps[i]);
7072 int MEDFileAnyTypeFieldMultiTSWithoutSDA::getPosOfTimeStep(int iteration, int order) const throw(INTERP_KERNEL::Exception)
7075 std::ostringstream oss; oss << "MEDFileFieldMultiTSWithoutSDA::getPosOfTimeStep : No such time step (" << iteration << "," << order << ") !\nPossibilities are : ";
7076 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,ret++)
7078 const MEDFileAnyTypeField1TSWithoutSDA *tmp(*it);
7082 tmp->getTime(it2,ord);
7083 if(it2==iteration && order==ord)
7086 oss << "(" << it2 << "," << ord << "), ";
7089 throw INTERP_KERNEL::Exception(oss.str().c_str());
7092 int MEDFileAnyTypeFieldMultiTSWithoutSDA::getPosGivenTime(double time, double eps) const throw(INTERP_KERNEL::Exception)
7095 std::ostringstream oss; oss << "MEDFileFieldMultiTSWithoutSDA::getPosGivenTime : No such time step " << time << "! \nPossibilities are : ";
7097 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,ret++)
7099 const MEDFileAnyTypeField1TSWithoutSDA *tmp(*it);
7103 double ti=tmp->getTime(it2,ord);
7104 if(fabs(time-ti)<eps)
7110 throw INTERP_KERNEL::Exception(oss.str().c_str());
7113 std::vector< std::pair<int,int> > MEDFileAnyTypeFieldMultiTSWithoutSDA::getIterations() const
7115 int lgth=_time_steps.size();
7116 std::vector< std::pair<int,int> > ret(lgth);
7117 for(int i=0;i<lgth;i++)
7118 _time_steps[i]->fillIteration(ret[i]);
7123 * This method has 3 inputs 'iteration' 'order' 'mname'. 'mname' can be null if the user is the general case where there is only one meshName lying on 'this'
7124 * This method returns two things.
7125 * - The absolute dimension of 'this' in first parameter.
7126 * - The available ext levels relative to the absolute dimension returned in first parameter. These relative levels are relative
7127 * to the first output parameter. The values in 'levs' will be returned in decreasing order.
7129 * This method is designed for MEDFileFieldMultiTS instances that have a discritization ON_CELLS, ON_GAUSS_NE and ON_GAUSS.
7130 * Only these 3 discretizations will be taken into account here.
7132 * If 'this' is empty this method will throw an INTERP_KERNEL::Exception.
7133 * If there is \b only node fields defined in 'this' -1 is returned and 'levs' output parameter will be empty. In this
7134 * case the caller has to know the underlying mesh it refers to. By defaut it is the level 0 of the corresponding mesh.
7136 * This method is usefull to make the link between meshDimension of the underlying mesh in 'this' and the levels on 'this'.
7137 * It is possible (even if it is not common) that the highest level in 'this' were not equal to the meshDimension of the underlying mesh in 'this'.
7139 * Let's consider the typical following case :
7140 * - a mesh 'm1' has a meshDimension 3 and has the following non empty levels
7141 * [0,-1,-2] for example 'm1' lies on TETRA4, HEXA8 TRI3 and SEG2
7142 * - 'f1' lies on 'm1' and is defined on 3D and 1D cells for example
7144 * - 'f2' lies on 'm1' too and is defined on 2D and 1D cells for example TRI3 and SEG2
7146 * In this case f1->getNonEmptyLevelsExt will return (3,[0,-2]) and f2->getNonEmptyLevelsExt will return (2,[0,-1])
7148 * To retrieve the highest level of f1 it should be done, f1->getFieldAtLevel(ON_CELLS,3-3+0);//absDim-meshDim+relativeLev
7149 * To retrieve the lowest level of f1 it should be done, f1->getFieldAtLevel(ON_CELLS,3-3+(-2));//absDim-meshDim+relativeLev
7150 * To retrieve the highest level of f2 it should be done, f1->getFieldAtLevel(ON_CELLS,2-3+0);//absDim-meshDim+relativeLev
7151 * To retrieve the lowest level of f2 it should be done, f1->getFieldAtLevel(ON_CELLS,2-3+(-1));//absDim-meshDim+relativeLev
7153 int MEDFileAnyTypeFieldMultiTSWithoutSDA::getNonEmptyLevels(int iteration, int order, const char *mname, std::vector<int>& levs) const throw(INTERP_KERNEL::Exception)
7155 return getTimeStepEntry(iteration,order).getNonEmptyLevels(mname,levs);
7158 const MEDFileAnyTypeField1TSWithoutSDA *MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepAtPos2(int pos) const throw(INTERP_KERNEL::Exception)
7160 if(pos<0 || pos>=(int)_time_steps.size())
7162 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepAtPos2 : request for pos #" << pos << " whereas should be in [0," << _time_steps.size() << ") !";
7163 throw INTERP_KERNEL::Exception(oss.str().c_str());
7165 const MEDFileAnyTypeField1TSWithoutSDA *item=_time_steps[pos];
7168 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepAtPos2 : request for pos #" << pos << ", this pos id exists but the underlying Field1TS is null !";
7169 oss << "\nTry to use following method eraseEmptyTS !";
7170 throw INTERP_KERNEL::Exception(oss.str().c_str());
7175 MEDFileAnyTypeField1TSWithoutSDA *MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepAtPos2(int pos) throw(INTERP_KERNEL::Exception)
7177 if(pos<0 || pos>=(int)_time_steps.size())
7179 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepAtPos2 : request for pos #" << pos << " whereas should be in [0," << _time_steps.size() << ") !";
7180 throw INTERP_KERNEL::Exception(oss.str().c_str());
7182 MEDFileAnyTypeField1TSWithoutSDA *item=_time_steps[pos];
7185 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::getTimeStepAtPos2 : request for pos #" << pos << ", this pos id exists but the underlying Field1TS is null !";
7186 oss << "\nTry to use following method eraseEmptyTS !";
7187 throw INTERP_KERNEL::Exception(oss.str().c_str());
7192 std::vector<std::string> MEDFileAnyTypeFieldMultiTSWithoutSDA::getPflsReallyUsed2() const
7194 std::vector<std::string> ret;
7195 std::set<std::string> ret2;
7196 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TSWithoutSDA > >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7198 std::vector<std::string> tmp=(*it)->getPflsReallyUsed2();
7199 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
7200 if(ret2.find(*it2)==ret2.end())
7202 ret.push_back(*it2);
7209 std::vector<std::string> MEDFileAnyTypeFieldMultiTSWithoutSDA::getLocsReallyUsed2() const
7211 std::vector<std::string> ret;
7212 std::set<std::string> ret2;
7213 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TSWithoutSDA > >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7215 std::vector<std::string> tmp=(*it)->getLocsReallyUsed2();
7216 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
7217 if(ret2.find(*it2)==ret2.end())
7219 ret.push_back(*it2);
7226 std::vector<std::string> MEDFileAnyTypeFieldMultiTSWithoutSDA::getPflsReallyUsedMulti2() const
7228 std::vector<std::string> ret;
7229 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TSWithoutSDA > >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7231 std::vector<std::string> tmp=(*it)->getPflsReallyUsedMulti2();
7232 ret.insert(ret.end(),tmp.begin(),tmp.end());
7237 std::vector<std::string> MEDFileAnyTypeFieldMultiTSWithoutSDA::getLocsReallyUsedMulti2() const
7239 std::vector<std::string> ret;
7240 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TSWithoutSDA > >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7242 std::vector<std::string> tmp=(*it)->getLocsReallyUsedMulti2();
7243 ret.insert(ret.end(),tmp.begin(),tmp.end());
7248 void MEDFileAnyTypeFieldMultiTSWithoutSDA::changePflsRefsNamesGen2(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
7250 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TSWithoutSDA > >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7251 (*it)->changePflsRefsNamesGen2(mapOfModif);
7254 void MEDFileAnyTypeFieldMultiTSWithoutSDA::changeLocsRefsNamesGen2(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
7256 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeField1TSWithoutSDA > >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
7257 (*it)->changeLocsRefsNamesGen2(mapOfModif);
7260 std::vector< std::vector<TypeOfField> > MEDFileAnyTypeFieldMultiTSWithoutSDA::getTypesOfFieldAvailable() const throw(INTERP_KERNEL::Exception)
7262 int lgth=_time_steps.size();
7263 std::vector< std::vector<TypeOfField> > ret(lgth);
7264 for(int i=0;i<lgth;i++)
7265 _time_steps[i]->fillTypesOfFieldAvailable(ret[i]);
7270 * entry point for users that want to iterate into MEDFile DataStructure without any overhead.
7272 std::vector< std::vector< std::pair<int,int> > > MEDFileAnyTypeFieldMultiTSWithoutSDA::getFieldSplitedByType(int iteration, int order, const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
7274 return getTimeStepEntry(iteration,order).getFieldSplitedByType(mname,types,typesF,pfls,locs);
7277 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTSWithoutSDA::deepCpy() const throw(INTERP_KERNEL::Exception)
7279 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> ret=shallowCpy();
7281 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,i++)
7283 if((const MEDFileAnyTypeField1TSWithoutSDA *)*it)
7284 ret->_time_steps[i]=(*it)->deepCpy();
7289 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > MEDFileAnyTypeFieldMultiTSWithoutSDA::splitComponents() const throw(INTERP_KERNEL::Exception)
7291 std::size_t sz(_infos.size()),sz2(_time_steps.size());
7292 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > ret(sz);
7293 std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > > ts(sz2);
7294 for(std::size_t i=0;i<sz;i++)
7296 ret[i]=shallowCpy();
7297 ret[i]->_infos.resize(1); ret[i]->_infos[0]=_infos[i];
7299 for(std::size_t i=0;i<sz2;i++)
7301 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > ret1=_time_steps[i]->splitComponents();
7304 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::splitComponents : At rank #" << i << " number of components is " << ret1.size() << " whereas it should be for all time steps " << sz << " !";
7305 throw INTERP_KERNEL::Exception(oss.str().c_str());
7309 for(std::size_t i=0;i<sz;i++)
7310 for(std::size_t j=0;j<sz2;j++)
7311 ret[i]->_time_steps[j]=ts[j][i];
7316 * This method splits into discretization each time steps in \a this.
7317 * ** WARNING ** the returned instances are not compulsary defined on the same time steps series !
7319 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > MEDFileAnyTypeFieldMultiTSWithoutSDA::splitDiscretizations() const throw(INTERP_KERNEL::Exception)
7321 std::size_t sz(_time_steps.size());
7322 std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > > items(sz);
7323 for(std::size_t i=0;i<sz;i++)
7325 const MEDFileAnyTypeField1TSWithoutSDA *timeStep(_time_steps[i]);
7328 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::splitDiscretizations : time step #" << i << " is null !";
7329 throw INTERP_KERNEL::Exception(oss.str().c_str());
7331 items[i]=timeStep->splitDiscretizations();
7334 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > ret;
7335 std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > > ret2;
7336 std::vector< TypeOfField > types;
7337 for(std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > >::const_iterator it0=items.begin();it0!=items.end();it0++)
7338 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++)
7340 std::vector<TypeOfField> ts=(*it1)->getTypesOfFieldAvailable();
7342 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTSWithoutSDA::splitDiscretizations : it appears that the splitting of MEDFileAnyTypeField1TSWithoutSDA::splitDiscretizations has returned invalid result !");
7343 std::vector< TypeOfField >::iterator it2=std::find(types.begin(),types.end(),ts[0]);
7344 if(it2==types.end())
7345 types.push_back(ts[0]);
7347 ret.resize(types.size()); ret2.resize(types.size());
7348 for(std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> > >::const_iterator it0=items.begin();it0!=items.end();it0++)
7349 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++)
7351 TypeOfField typ=(*it1)->getTypesOfFieldAvailable()[0];
7352 std::size_t pos=std::distance(types.begin(),std::find(types.begin(),types.end(),typ));
7353 ret2[pos].push_back(*it1);
7355 for(std::size_t i=0;i<types.size();i++)
7357 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> elt=createNew();
7358 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it1=ret2[i].begin();it1!=ret2[i].end();it1++)
7359 elt->pushBackTimeStep(*it1);//also updates infos in elt
7361 elt->MEDFileFieldNameScope::operator=(*this);
7366 void MEDFileAnyTypeFieldMultiTSWithoutSDA::copyTinyInfoFrom(const MEDCouplingFieldDouble *field, const DataArray *arr) throw(INTERP_KERNEL::Exception)
7368 _name=field->getName();
7370 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::copyTinyInfoFrom : unsupported fields with no name in MED file !");
7372 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::copyTinyInfoFrom : no array set !");
7373 _infos=arr->getInfoOnComponents();
7376 void MEDFileAnyTypeFieldMultiTSWithoutSDA::checkCoherencyOfTinyInfo(const MEDCouplingFieldDouble *field, const DataArray *arr) const throw(INTERP_KERNEL::Exception)
7378 static const char MSG[]="MEDFileFieldMultiTSWithoutSDA::checkCoherencyOfTinyInfo : invalid ";
7379 if(_name!=field->getName())
7381 std::ostringstream oss; oss << MSG << "name ! should be \"" << _name;
7382 oss << "\" and it is set in input field to \"" << field->getName() << "\" !";
7383 throw INTERP_KERNEL::Exception(oss.str().c_str());
7386 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::checkCoherencyOfTinyInfo : no array set !");
7387 checkThatComponentsMatch(arr->getInfoOnComponents());
7390 void MEDFileAnyTypeFieldMultiTSWithoutSDA::checkThatComponentsMatch(const std::vector<std::string>& compos) const throw(INTERP_KERNEL::Exception)
7392 static const char MSG[]="MEDFileFieldMultiTSWithoutSDA::checkThatComponentsMatch : ";
7393 if(getInfo().size()!=compos.size())
7395 std::ostringstream oss; oss << MSG << "mismatch of number of components between this (" << getInfo().size() << ") and ";
7396 oss << " number of components of element to append (" << compos.size() << ") !";
7397 throw INTERP_KERNEL::Exception(oss.str().c_str());
7401 std::ostringstream oss; oss << MSG << "components have same size but are different ! should be \"";
7402 std::copy(_infos.begin(),_infos.end(),std::ostream_iterator<std::string>(oss,", "));
7403 oss << " But compo in input fields are : ";
7404 std::copy(compos.begin(),compos.end(),std::ostream_iterator<std::string>(oss,", "));
7406 throw INTERP_KERNEL::Exception(oss.str().c_str());
7410 void MEDFileAnyTypeFieldMultiTSWithoutSDA::checkThatNbOfCompoOfTSMatchThis() const throw(INTERP_KERNEL::Exception)
7412 std::size_t sz=_infos.size();
7414 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,j++)
7416 const MEDFileAnyTypeField1TSWithoutSDA *elt(*it);
7418 if(elt->getInfo().size()!=sz)
7420 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::checkThatNbOfCompoOfTSMatchThis : At pos #" << j << " the number of components is equal to ";
7421 oss << elt->getInfo().size() << " whereas it is expected to be equal to " << sz << " !";
7422 throw INTERP_KERNEL::Exception(oss.str().c_str());
7427 void MEDFileAnyTypeFieldMultiTSWithoutSDA::appendFieldNoProfileSBT(const MEDCouplingFieldDouble *field, const DataArray *arr, MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
7430 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTSWithoutSDA::appendFieldNoProfileSBT : input field is NULL !");
7431 if(!_time_steps.empty())
7432 checkCoherencyOfTinyInfo(field,arr);
7433 MEDFileAnyTypeField1TSWithoutSDA *objC=createNew1TSWithoutSDAEmptyInstance();
7434 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> obj(objC);
7435 objC->setFieldNoProfileSBT(field,arr,glob,*this);
7436 copyTinyInfoFrom(field,arr);
7437 _time_steps.push_back(obj);
7440 void MEDFileAnyTypeFieldMultiTSWithoutSDA::appendFieldProfile(const MEDCouplingFieldDouble *field, const DataArray *arr, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile, MEDFileFieldGlobsReal& glob) throw(INTERP_KERNEL::Exception)
7443 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTSWithoutSDA::appendFieldNoProfileSBT : input field is NULL !");
7444 if(!_time_steps.empty())
7445 checkCoherencyOfTinyInfo(field,arr);
7446 MEDFileField1TSWithoutSDA *objC=new MEDFileField1TSWithoutSDA;
7447 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> obj(objC);
7448 objC->setFieldProfile(field,arr,mesh,meshDimRelToMax,profile,glob,*this);
7449 copyTinyInfoFrom(field,arr);
7450 _time_steps.push_back(obj);
7453 void MEDFileAnyTypeFieldMultiTSWithoutSDA::setIteration(int i, MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> ts) throw(INTERP_KERNEL::Exception)
7455 int sz=(int)_time_steps.size();
7458 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::setIteration : trying to set element at place #" << i << " should be in [0," << sz << ") !";
7459 throw INTERP_KERNEL::Exception(oss.str().c_str());
7461 const MEDFileAnyTypeField1TSWithoutSDA *tsPtr(ts);
7464 if(tsPtr->getNumberOfComponents()!=(int)_infos.size())
7466 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTSWithoutSDA::setIteration : trying to set element with " << tsPtr->getNumberOfComponents() << " components ! Should be " << _infos.size() << " !";
7467 throw INTERP_KERNEL::Exception(oss.str().c_str());
7473 //= MEDFileFieldMultiTSWithoutSDA
7475 MEDFileFieldMultiTSWithoutSDA *MEDFileFieldMultiTSWithoutSDA::New(med_idt fid, const char *fieldName, med_field_type fieldTyp, const std::vector<std::string>& infos, int nbOfStep, const std::string& dtunit, bool loadAll) throw(INTERP_KERNEL::Exception)
7477 return new MEDFileFieldMultiTSWithoutSDA(fid,fieldName,fieldTyp,infos,nbOfStep,dtunit,loadAll);
7480 MEDFileFieldMultiTSWithoutSDA::MEDFileFieldMultiTSWithoutSDA()
7484 MEDFileFieldMultiTSWithoutSDA::MEDFileFieldMultiTSWithoutSDA(const char *fieldName):MEDFileAnyTypeFieldMultiTSWithoutSDA(fieldName)
7489 * \param [in] fieldId field id in C mode
7491 MEDFileFieldMultiTSWithoutSDA::MEDFileFieldMultiTSWithoutSDA(med_idt fid, int fieldId, bool loadAll) throw(INTERP_KERNEL::Exception)
7492 try:MEDFileAnyTypeFieldMultiTSWithoutSDA(fid,fieldId,loadAll)
7495 catch(INTERP_KERNEL::Exception& e)
7498 MEDFileFieldMultiTSWithoutSDA::MEDFileFieldMultiTSWithoutSDA(med_idt fid, const char *fieldName, med_field_type fieldTyp, const std::vector<std::string>& infos, int nbOfStep, const std::string& dtunit, bool loadAll) throw(INTERP_KERNEL::Exception)
7499 try:MEDFileAnyTypeFieldMultiTSWithoutSDA(fid,fieldName,fieldTyp,infos,nbOfStep,dtunit,loadAll)
7502 catch(INTERP_KERNEL::Exception& e)
7505 MEDFileAnyTypeField1TSWithoutSDA *MEDFileFieldMultiTSWithoutSDA::createNew1TSWithoutSDAEmptyInstance() const throw(INTERP_KERNEL::Exception)
7507 return new MEDFileField1TSWithoutSDA;
7510 void MEDFileFieldMultiTSWithoutSDA::checkCoherencyOfType(const MEDFileAnyTypeField1TSWithoutSDA *f1ts) const throw(INTERP_KERNEL::Exception)
7513 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::checkCoherencyOfType : input field1TS is NULL ! Impossible to check !");
7514 const MEDFileField1TSWithoutSDA *f1tsC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(f1ts);
7516 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::checkCoherencyOfType : the input field1TS is not a FLOAT64 type !");
7519 const char *MEDFileFieldMultiTSWithoutSDA::getTypeStr() const throw(INTERP_KERNEL::Exception)
7521 return MEDFileField1TSWithoutSDA::TYPE_STR;
7524 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileFieldMultiTSWithoutSDA::shallowCpy() const throw(INTERP_KERNEL::Exception)
7526 return new MEDFileFieldMultiTSWithoutSDA(*this);
7529 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileFieldMultiTSWithoutSDA::createNew() const throw(INTERP_KERNEL::Exception)
7531 return new MEDFileFieldMultiTSWithoutSDA;
7535 * entry point for users that want to iterate into MEDFile DataStructure with a reduced overhead because output arrays are extracted (created) specially
7536 * for the call of this method. That's why the DataArrayDouble instance in returned vector of vector should be dealed by the caller.
7538 std::vector< std::vector<DataArrayDouble *> > MEDFileFieldMultiTSWithoutSDA::getFieldSplitedByType2(int iteration, int order, const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
7540 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=getTimeStepEntry(iteration,order);
7541 const MEDFileField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(&myF1TS);
7543 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::getFieldSplitedByType2 : mismatch of type of field expecting FLOAT64 !");
7544 return myF1TSC->getFieldSplitedByType2(mname,types,typesF,pfls,locs);
7547 MEDFileIntFieldMultiTSWithoutSDA *MEDFileFieldMultiTSWithoutSDA::convertToInt() const throw(INTERP_KERNEL::Exception)
7549 MEDCouplingAutoRefCountObjectPtr<MEDFileIntFieldMultiTSWithoutSDA> ret(new MEDFileIntFieldMultiTSWithoutSDA);
7550 ret->MEDFileAnyTypeFieldMultiTSWithoutSDA::operator =(*this);
7552 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,i++)
7554 const MEDFileAnyTypeField1TSWithoutSDA *eltToConv(*it);
7557 const MEDFileField1TSWithoutSDA *eltToConvC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(eltToConv);
7559 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTSWithoutSDA::convertToInt : presence of an invalid 1TS type ! Should be of type FLOAT64 !");
7560 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> elt=eltToConvC->convertToInt();
7561 ret->setIteration(i,elt);
7567 //= MEDFileAnyTypeFieldMultiTS
7569 MEDFileAnyTypeFieldMultiTS::MEDFileAnyTypeFieldMultiTS()
7573 MEDFileAnyTypeFieldMultiTS::MEDFileAnyTypeFieldMultiTS(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
7574 try:MEDFileFieldGlobsReal(fileName)
7576 MEDFileUtilities::CheckFileForRead(fileName);
7577 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
7578 _content=BuildContentFrom(fid,fileName,loadAll);
7581 catch(INTERP_KERNEL::Exception& e)
7586 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTS::BuildContentFrom(med_idt fid, const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
7588 med_field_type typcha;
7589 std::vector<std::string> infos;
7592 MEDFileAnyTypeField1TS::LocateField(fid,fileName,fieldName,i,typcha,infos,dtunit);
7593 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> ret;
7598 ret=new MEDFileFieldMultiTSWithoutSDA(fid,i,loadAll);
7603 ret=new MEDFileIntFieldMultiTSWithoutSDA(fid,i,loadAll);
7608 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTS::BuildContentFrom(fileName,fieldName) : file \'" << fileName << "\' contains field with name \'" << fieldName << "\' but the type of field is not in [MED_FLOAT64, MED_INT32] !";
7609 throw INTERP_KERNEL::Exception(oss.str().c_str());
7612 ret->setDtUnit(dtunit.c_str());
7616 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTS::BuildContentFrom(med_idt fid, const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
7618 med_field_type typcha;
7620 std::vector<std::string> infos;
7621 std::string dtunit,fieldName;
7622 MEDFileAnyTypeField1TS::LocateField2(fid,fileName,0,true,fieldName,typcha,infos,dtunit);
7623 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> ret;
7628 ret=new MEDFileFieldMultiTSWithoutSDA(fid,0,loadAll);
7633 ret=new MEDFileIntFieldMultiTSWithoutSDA(fid,0,loadAll);
7638 std::ostringstream oss; oss << "MEDFileAnyTypeFieldMultiTS::BuildContentFrom(fileName) : file \'" << fileName << "\' contains field with name \'" << fieldName << "\' but the type of the first field is not in [MED_FLOAT64, MED_INT32] !";
7639 throw INTERP_KERNEL::Exception(oss.str().c_str());
7642 ret->setDtUnit(dtunit.c_str());
7646 MEDFileAnyTypeFieldMultiTS *MEDFileAnyTypeFieldMultiTS::BuildNewInstanceFromContent(MEDFileAnyTypeFieldMultiTSWithoutSDA *c, const char *fileName) throw(INTERP_KERNEL::Exception)
7649 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTS::BuildNewInstanceFromContent : empty content in input : unable to build a new instance !");
7650 if(dynamic_cast<const MEDFileFieldMultiTSWithoutSDA *>(c))
7652 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldMultiTS> ret=MEDFileFieldMultiTS::New();
7653 ret->setFileName(fileName);
7654 ret->_content=c; c->incrRef();
7657 if(dynamic_cast<const MEDFileIntFieldMultiTSWithoutSDA *>(c))
7659 MEDCouplingAutoRefCountObjectPtr<MEDFileIntFieldMultiTS> ret=MEDFileIntFieldMultiTS::New();
7660 ret->setFileName(fileName);
7661 ret->_content=c; c->incrRef();
7664 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTS::BuildNewInstanceFromContent : internal error ! a content of type different from FLOAT64 and INT32 has been built but not intercepted !");
7667 MEDFileAnyTypeFieldMultiTS::MEDFileAnyTypeFieldMultiTS(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
7668 try:MEDFileFieldGlobsReal(fileName)
7670 MEDFileUtilities::CheckFileForRead(fileName);
7671 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
7672 _content=BuildContentFrom(fid,fileName,fieldName,loadAll);
7675 catch(INTERP_KERNEL::Exception& e)
7680 //= MEDFileIntFieldMultiTSWithoutSDA
7682 MEDFileIntFieldMultiTSWithoutSDA *MEDFileIntFieldMultiTSWithoutSDA::New(med_idt fid, const char *fieldName, med_field_type fieldTyp, const std::vector<std::string>& infos, int nbOfStep, const std::string& dtunit, bool loadAll) throw(INTERP_KERNEL::Exception)
7684 return new MEDFileIntFieldMultiTSWithoutSDA(fid,fieldName,fieldTyp,infos,nbOfStep,dtunit,loadAll);
7687 MEDFileIntFieldMultiTSWithoutSDA::MEDFileIntFieldMultiTSWithoutSDA()
7691 MEDFileIntFieldMultiTSWithoutSDA::MEDFileIntFieldMultiTSWithoutSDA(const char *fieldName):MEDFileAnyTypeFieldMultiTSWithoutSDA(fieldName)
7695 MEDFileIntFieldMultiTSWithoutSDA::MEDFileIntFieldMultiTSWithoutSDA(med_idt fid, const char *fieldName, med_field_type fieldTyp, const std::vector<std::string>& infos, int nbOfStep, const std::string& dtunit, bool loadAll) throw(INTERP_KERNEL::Exception)
7696 try:MEDFileAnyTypeFieldMultiTSWithoutSDA(fid,fieldName,fieldTyp,infos,nbOfStep,dtunit,loadAll)
7699 catch(INTERP_KERNEL::Exception& e)
7703 * \param [in] fieldId field id in C mode
7705 MEDFileIntFieldMultiTSWithoutSDA::MEDFileIntFieldMultiTSWithoutSDA(med_idt fid, int fieldId, bool loadAll) throw(INTERP_KERNEL::Exception)
7706 try:MEDFileAnyTypeFieldMultiTSWithoutSDA(fid,fieldId,loadAll)
7709 catch(INTERP_KERNEL::Exception& e)
7712 MEDFileAnyTypeField1TSWithoutSDA *MEDFileIntFieldMultiTSWithoutSDA::createNew1TSWithoutSDAEmptyInstance() const throw(INTERP_KERNEL::Exception)
7714 return new MEDFileIntField1TSWithoutSDA;
7717 void MEDFileIntFieldMultiTSWithoutSDA::checkCoherencyOfType(const MEDFileAnyTypeField1TSWithoutSDA *f1ts) const throw(INTERP_KERNEL::Exception)
7720 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTSWithoutSDA::checkCoherencyOfType : input field1TS is NULL ! Impossible to check !");
7721 const MEDFileIntField1TSWithoutSDA *f1tsC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(f1ts);
7723 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTSWithoutSDA::checkCoherencyOfType : the input field1TS is not a INT32 type !");
7726 const char *MEDFileIntFieldMultiTSWithoutSDA::getTypeStr() const throw(INTERP_KERNEL::Exception)
7728 return MEDFileIntField1TSWithoutSDA::TYPE_STR;
7731 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileIntFieldMultiTSWithoutSDA::shallowCpy() const throw(INTERP_KERNEL::Exception)
7733 return new MEDFileIntFieldMultiTSWithoutSDA(*this);
7736 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileIntFieldMultiTSWithoutSDA::createNew() const throw(INTERP_KERNEL::Exception)
7738 return new MEDFileIntFieldMultiTSWithoutSDA;
7741 MEDFileFieldMultiTSWithoutSDA *MEDFileIntFieldMultiTSWithoutSDA::convertToDouble() const throw(INTERP_KERNEL::Exception)
7743 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldMultiTSWithoutSDA> ret(new MEDFileFieldMultiTSWithoutSDA);
7744 ret->MEDFileAnyTypeFieldMultiTSWithoutSDA::operator =(*this);
7746 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> >::const_iterator it=_time_steps.begin();it!=_time_steps.end();it++,i++)
7748 const MEDFileAnyTypeField1TSWithoutSDA *eltToConv(*it);
7751 const MEDFileIntField1TSWithoutSDA *eltToConvC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(eltToConv);
7753 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTSWithoutSDA::convertToInt : presence of an invalid 1TS type ! Should be of type INT32 !");
7754 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> elt=eltToConvC->convertToDouble();
7755 ret->setIteration(i,elt);
7761 //= MEDFileAnyTypeFieldMultiTS
7764 * Returns a new instance of MEDFileFieldMultiTS or MEDFileIntFieldMultiTS holding data of the first field
7765 * that has been read from a specified MED file.
7766 * \param [in] fileName - the name of the MED file to read.
7767 * \return MEDFileFieldMultiTS * - a new instance of MEDFileFieldMultiTS or MEDFileIntFieldMultiTS. The caller
7768 * is to delete this field using decrRef() as it is no more needed.
7769 * \throw If reading the file fails.
7771 MEDFileAnyTypeFieldMultiTS *MEDFileAnyTypeFieldMultiTS::New(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
7773 MEDFileUtilities::CheckFileForRead(fileName);
7774 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
7775 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> c=BuildContentFrom(fid,fileName,loadAll);
7776 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTS> ret=BuildNewInstanceFromContent(c,fileName);
7777 ret->loadGlobals(fid);
7782 * Returns a new instance of MEDFileFieldMultiTS or MEDFileIntFieldMultiTS holding data of a given field
7783 * that has been read from a specified MED file.
7784 * \param [in] fileName - the name of the MED file to read.
7785 * \param [in] fieldName - the name of the field to read.
7786 * \return MEDFileFieldMultiTS * - a new instance of MEDFileFieldMultiTS or MEDFileIntFieldMultiTS. The caller
7787 * is to delete this field using decrRef() as it is no more needed.
7788 * \throw If reading the file fails.
7789 * \throw If there is no field named \a fieldName in the file.
7791 MEDFileAnyTypeFieldMultiTS *MEDFileAnyTypeFieldMultiTS::New(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
7793 MEDFileUtilities::CheckFileForRead(fileName);
7794 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
7795 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> c=BuildContentFrom(fid,fileName,fieldName,loadAll);
7796 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTS> ret=BuildNewInstanceFromContent(c,fileName);
7797 ret->loadGlobals(fid);
7802 * This constructor is a shallow copy constructor. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
7803 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
7805 * \warning this is a shallow copy constructor
7807 MEDFileAnyTypeFieldMultiTS::MEDFileAnyTypeFieldMultiTS(const MEDFileAnyTypeFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent)
7809 if(!shallowCopyOfContent)
7811 const MEDFileAnyTypeFieldMultiTSWithoutSDA *otherPtr(&other);
7812 otherPtr->incrRef();
7813 _content=const_cast<MEDFileAnyTypeFieldMultiTSWithoutSDA *>(otherPtr);
7817 _content=other.shallowCpy();
7821 MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTS::contentNotNullBase() throw(INTERP_KERNEL::Exception)
7823 MEDFileAnyTypeFieldMultiTSWithoutSDA *ret=_content;
7825 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTS : content is expected to be not null !");
7829 const MEDFileAnyTypeFieldMultiTSWithoutSDA *MEDFileAnyTypeFieldMultiTS::contentNotNullBase() const throw(INTERP_KERNEL::Exception)
7831 const MEDFileAnyTypeFieldMultiTSWithoutSDA *ret=_content;
7833 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTS : const content is expected to be not null !");
7837 std::vector<std::string> MEDFileAnyTypeFieldMultiTS::getPflsReallyUsed() const
7839 return contentNotNullBase()->getPflsReallyUsed2();
7842 std::vector<std::string> MEDFileAnyTypeFieldMultiTS::getLocsReallyUsed() const
7844 return contentNotNullBase()->getLocsReallyUsed2();
7847 std::vector<std::string> MEDFileAnyTypeFieldMultiTS::getPflsReallyUsedMulti() const
7849 return contentNotNullBase()->getPflsReallyUsedMulti2();
7852 std::vector<std::string> MEDFileAnyTypeFieldMultiTS::getLocsReallyUsedMulti() const
7854 return contentNotNullBase()->getLocsReallyUsedMulti2();
7857 void MEDFileAnyTypeFieldMultiTS::changePflsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
7859 contentNotNullBase()->changePflsRefsNamesGen2(mapOfModif);
7862 void MEDFileAnyTypeFieldMultiTS::changeLocsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
7864 contentNotNullBase()->changeLocsRefsNamesGen2(mapOfModif);
7867 int MEDFileAnyTypeFieldMultiTS::getNumberOfTS() const
7869 return contentNotNullBase()->getNumberOfTS();
7872 void MEDFileAnyTypeFieldMultiTS::eraseEmptyTS() throw(INTERP_KERNEL::Exception)
7874 contentNotNullBase()->eraseEmptyTS();
7877 void MEDFileAnyTypeFieldMultiTS::eraseTimeStepIds(const int *startIds, const int *endIds) throw(INTERP_KERNEL::Exception)
7879 contentNotNullBase()->eraseTimeStepIds(startIds,endIds);
7882 void MEDFileAnyTypeFieldMultiTS::eraseTimeStepIds2(int bg, int end, int step) throw(INTERP_KERNEL::Exception)
7884 contentNotNullBase()->eraseTimeStepIds2(bg,end,step);
7887 MEDFileAnyTypeFieldMultiTS *MEDFileAnyTypeFieldMultiTS::buildSubPart(const int *startIds, const int *endIds) const throw(INTERP_KERNEL::Exception)
7889 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> c=contentNotNullBase()->buildFromTimeStepIds(startIds,endIds);
7890 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTS> ret=shallowCpy();
7895 MEDFileAnyTypeFieldMultiTS *MEDFileAnyTypeFieldMultiTS::buildSubPartSlice(int bg, int end, int step) const throw(INTERP_KERNEL::Exception)
7897 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> c=contentNotNullBase()->buildFromTimeStepIds2(bg,end,step);
7898 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTS> ret=shallowCpy();
7903 std::vector< std::pair<int,int> > MEDFileAnyTypeFieldMultiTS::getIterations() const
7905 return contentNotNullBase()->getIterations();
7908 void MEDFileAnyTypeFieldMultiTS::pushBackTimeSteps(const std::vector<MEDFileAnyTypeField1TS *>& f1ts) throw(INTERP_KERNEL::Exception)
7910 for(std::vector<MEDFileAnyTypeField1TS *>::const_iterator it=f1ts.begin();it!=f1ts.end();it++)
7911 pushBackTimeStep(*it);
7914 void MEDFileAnyTypeFieldMultiTS::pushBackTimeStep(MEDFileAnyTypeField1TS *f1ts) throw(INTERP_KERNEL::Exception)
7917 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTSWithoutSDA::pushBackTimeStep : input pointer is NULL !");
7918 checkCoherencyOfType(f1ts);
7920 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TS> f1tsSafe(f1ts);
7921 MEDFileAnyTypeField1TSWithoutSDA *c=f1ts->contentNotNullBase();
7923 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeField1TSWithoutSDA> cSafe(c);
7924 if(!((MEDFileAnyTypeFieldMultiTSWithoutSDA *)_content))
7925 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTSWithoutSDA::pushBackTimeStep : no content in this !");
7926 _content->pushBackTimeStep(cSafe);
7927 appendGlobs(*f1ts,1e-12);
7930 void MEDFileAnyTypeFieldMultiTS::synchronizeNameScope() throw(INTERP_KERNEL::Exception)
7932 contentNotNullBase()->synchronizeNameScope();
7935 int MEDFileAnyTypeFieldMultiTS::getPosOfTimeStep(int iteration, int order) const throw(INTERP_KERNEL::Exception)
7937 return contentNotNullBase()->getPosOfTimeStep(iteration,order);
7940 int MEDFileAnyTypeFieldMultiTS::getPosGivenTime(double time, double eps) const throw(INTERP_KERNEL::Exception)
7942 return contentNotNullBase()->getPosGivenTime(time,eps);
7945 int MEDFileAnyTypeFieldMultiTS::getNonEmptyLevels(int iteration, int order, const char *mname, std::vector<int>& levs) const throw(INTERP_KERNEL::Exception)
7947 return contentNotNullBase()->getNonEmptyLevels(iteration,order,mname,levs);
7950 std::vector< std::vector<TypeOfField> > MEDFileAnyTypeFieldMultiTS::getTypesOfFieldAvailable() const throw(INTERP_KERNEL::Exception)
7952 return contentNotNullBase()->getTypesOfFieldAvailable();
7955 std::vector< std::vector< std::pair<int,int> > > MEDFileAnyTypeFieldMultiTS::getFieldSplitedByType(int iteration, int order, const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
7957 return contentNotNullBase()->getFieldSplitedByType(iteration,order,mname,types,typesF,pfls,locs);
7960 std::string MEDFileAnyTypeFieldMultiTS::getName() const
7962 return contentNotNullBase()->getName();
7965 void MEDFileAnyTypeFieldMultiTS::setName(const char *name)
7967 contentNotNullBase()->setName(name);
7970 std::string MEDFileAnyTypeFieldMultiTS::getDtUnit() const throw(INTERP_KERNEL::Exception)
7972 return contentNotNullBase()->getDtUnit();
7975 void MEDFileAnyTypeFieldMultiTS::setDtUnit(const char *dtUnit) throw(INTERP_KERNEL::Exception)
7977 contentNotNullBase()->setDtUnit(dtUnit);
7980 void MEDFileAnyTypeFieldMultiTS::simpleRepr(int bkOffset, std::ostream& oss, int fmtsId) const
7982 contentNotNullBase()->simpleRepr(bkOffset,oss,fmtsId);
7985 std::vector< std::pair<int,int> > MEDFileAnyTypeFieldMultiTS::getTimeSteps(std::vector<double>& ret1) const throw(INTERP_KERNEL::Exception)
7987 return contentNotNullBase()->getTimeSteps(ret1);
7990 std::string MEDFileAnyTypeFieldMultiTS::getMeshName() const throw(INTERP_KERNEL::Exception)
7992 return contentNotNullBase()->getMeshName();
7995 void MEDFileAnyTypeFieldMultiTS::setMeshName(const char *newMeshName) throw(INTERP_KERNEL::Exception)
7997 contentNotNullBase()->setMeshName(newMeshName);
8000 bool MEDFileAnyTypeFieldMultiTS::changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab) throw(INTERP_KERNEL::Exception)
8002 return contentNotNullBase()->changeMeshNames(modifTab);
8005 const std::vector<std::string>& MEDFileAnyTypeFieldMultiTS::getInfo() const throw(INTERP_KERNEL::Exception)
8007 return contentNotNullBase()->getInfo();
8010 void MEDFileAnyTypeFieldMultiTS::setInfo(const std::vector<std::string>& info) throw(INTERP_KERNEL::Exception)
8012 return contentNotNullBase()->setInfo(info);
8015 int MEDFileAnyTypeFieldMultiTS::getNumberOfComponents() const throw(INTERP_KERNEL::Exception)
8017 const std::vector<std::string> ret=getInfo();
8018 return (int)ret.size();
8021 void MEDFileAnyTypeFieldMultiTS::writeLL(med_idt fid) const throw(INTERP_KERNEL::Exception)
8023 writeGlobals(fid,*this);
8024 contentNotNullBase()->writeLL(fid,*this);
8028 * Writes \a this field into a MED file specified by its name.
8029 * \param [in] fileName - the MED file name.
8030 * \param [in] mode - the writing mode. For more on \a mode, see \ref AdvMEDLoaderBasics.
8031 * - 2 - erase; an existing file is removed.
8032 * - 1 - append; same data should not be present in an existing file.
8033 * - 0 - overwrite; same data present in an existing file is overwritten.
8034 * \throw If the field name is not set.
8035 * \throw If no field data is set.
8036 * \throw If \a mode == 1 and the same data is present in an existing file.
8038 void MEDFileAnyTypeFieldMultiTS::write(const char *fileName, int mode) const throw(INTERP_KERNEL::Exception)
8040 med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
8041 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,medmod);
8046 * This method alloc the arrays and load potentially huge arrays contained in this field.
8047 * This method should be called when a MEDFileAnyTypeFieldMultiTS::New constructor has been with false as the last parameter.
8048 * This method can be also called to refresh or reinit values from a file.
8050 * \throw If the fileName is not set or points to a non readable MED file.
8052 void MEDFileAnyTypeFieldMultiTS::loadArrays() throw(INTERP_KERNEL::Exception)
8054 MEDFileUtilities::AutoFid fid=MEDfileOpen(getFileName(),MED_ACC_RDONLY);
8055 contentNotNullBase()->loadBigArraysRecursively(fid,*contentNotNullBase());
8059 * This method behaves as MEDFileAnyTypeFieldMultiTS::loadArrays does, the first call, if \a this was built using a file without loading big arrays.
8060 * But once data loaded once, this method does nothing.
8062 * \throw If the fileName is not set or points to a non readable MED file.
8063 * \sa MEDFileAnyTypeFieldMultiTS::loadArrays, MEDFileAnyTypeFieldMultiTS::releaseArrays
8065 void MEDFileAnyTypeFieldMultiTS::loadArraysIfNecessary() throw(INTERP_KERNEL::Exception)
8067 MEDFileUtilities::AutoFid fid=MEDfileOpen(getFileName(),MED_ACC_RDONLY);
8068 contentNotNullBase()->loadBigArraysRecursivelyIfNecessary(fid,*contentNotNullBase());
8072 * This method releases potentially big data arrays and so returns to the same heap memory than status loaded with 'loadAll' parameter set to false.
8073 * This method does not release arrays set outside the context of a MED file.
8075 * \sa MEDFileAnyTypeFieldMultiTS::loadArrays, MEDFileAnyTypeFieldMultiTS::loadArraysIfNecessary
8077 void MEDFileAnyTypeFieldMultiTS::releaseArrays() throw(INTERP_KERNEL::Exception)
8079 contentNotNullBase()->releaseArrays();
8082 std::string MEDFileAnyTypeFieldMultiTS::simpleRepr() const
8084 std::ostringstream oss;
8085 contentNotNullBase()->simpleRepr(0,oss,-1);
8086 simpleReprGlobs(oss);
8090 std::size_t MEDFileAnyTypeFieldMultiTS::getHeapMemorySize() const
8093 if((const MEDFileAnyTypeFieldMultiTSWithoutSDA*)_content)
8094 ret+=_content->getHeapMemorySize();
8095 return ret+MEDFileFieldGlobsReal::getHeapMemorySize();
8099 * This method returns as MEDFileAnyTypeFieldMultiTS new instances as number of components in \a this.
8100 * The returned instances are deep copy of \a this except that for globals that are share with those contained in \a this.
8101 * ** WARNING ** do no forget to rename the ouput instances to avoid to write n-times in the same MED file field !
8103 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTS > > MEDFileAnyTypeFieldMultiTS::splitComponents() const throw(INTERP_KERNEL::Exception)
8105 const MEDFileAnyTypeFieldMultiTSWithoutSDA *content(_content);
8107 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTS::splitComponents : no content in this ! Unable to split components !");
8108 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > contentsSplit=content->splitComponents();
8109 std::size_t sz(contentsSplit.size());
8110 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTS > > ret(sz);
8111 for(std::size_t i=0;i<sz;i++)
8113 ret[i]=shallowCpy();
8114 ret[i]->_content=contentsSplit[i];
8120 * This method returns as MEDFileAnyTypeFieldMultiTS new instances as number of discretizations over time steps in \a this.
8121 * The returned instances are deep copy of \a this except that for globals that are share with those contained in \a this.
8123 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTS > > MEDFileAnyTypeFieldMultiTS::splitDiscretizations() const throw(INTERP_KERNEL::Exception)
8125 const MEDFileAnyTypeFieldMultiTSWithoutSDA *content(_content);
8127 throw INTERP_KERNEL::Exception("MEDFileAnyTypeFieldMultiTS::splitDiscretizations : no content in this ! Unable to split discretizations !");
8128 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > contentsSplit=content->splitDiscretizations();
8129 std::size_t sz(contentsSplit.size());
8130 std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTS > > ret(sz);
8131 for(std::size_t i=0;i<sz;i++)
8133 ret[i]=shallowCpy();
8134 ret[i]->_content=contentsSplit[i];
8139 MEDFileAnyTypeFieldMultiTS *MEDFileAnyTypeFieldMultiTS::deepCpy() const throw(INTERP_KERNEL::Exception)
8141 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTS> ret=shallowCpy();
8142 if((const MEDFileAnyTypeFieldMultiTSWithoutSDA *)_content)
8143 ret->_content=_content->deepCpy();
8144 ret->deepCpyGlobs(*this);
8148 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> MEDFileAnyTypeFieldMultiTS::getContent()
8154 * Returns a new MEDFileField1TS or MEDFileIntField1TS holding data of a given time step of \a this field.
8155 * \param [in] iteration - the iteration number of a required time step.
8156 * \param [in] order - the iteration order number of required time step.
8157 * \return MEDFileField1TS * or MEDFileIntField1TS *- a new instance of MEDFileField1TS or MEDFileIntField1TS. The caller is to
8158 * delete this field using decrRef() as it is no more needed.
8159 * \throw If there is no required time step in \a this field.
8161 MEDFileAnyTypeField1TS *MEDFileAnyTypeFieldMultiTS::getTimeStep(int iteration, int order) const throw(INTERP_KERNEL::Exception)
8163 int pos=getPosOfTimeStep(iteration,order);
8164 return getTimeStepAtPos(pos);
8168 * Returns a new MEDFileField1TS or MEDFileIntField1TS holding data of a given time step of \a this field.
8169 * \param [in] time - the time of the time step of interest.
8170 * \param [in] eps - a precision used to compare time values.
8171 * \return MEDFileField1TS * - a new instance of MEDFileField1TS. The caller is to
8172 * delete this field using decrRef() as it is no more needed.
8173 * \throw If there is no required time step in \a this field.
8175 MEDFileAnyTypeField1TS *MEDFileAnyTypeFieldMultiTS::getTimeStepGivenTime(double time, double eps) const throw(INTERP_KERNEL::Exception)
8177 int pos=getPosGivenTime(time,eps);
8178 return getTimeStepAtPos(pos);
8181 MEDFileAnyTypeFieldMultiTSIterator *MEDFileAnyTypeFieldMultiTS::iterator() throw(INTERP_KERNEL::Exception)
8183 return new MEDFileAnyTypeFieldMultiTSIterator(this);
8186 //= MEDFileFieldMultiTS
8189 * Returns a new empty instance of MEDFileFieldMultiTS.
8190 * \return MEDFileFieldMultiTS * - a new instance of MEDFileFieldMultiTS. The caller
8191 * is to delete this field using decrRef() as it is no more needed.
8193 MEDFileFieldMultiTS *MEDFileFieldMultiTS::New()
8195 return new MEDFileFieldMultiTS;
8199 * Returns a new instance of MEDFileFieldMultiTS holding data of the first field
8200 * that has been read from a specified MED file.
8201 * \param [in] fileName - the name of the MED file to read.
8202 * \return MEDFileFieldMultiTS * - a new instance of MEDFileFieldMultiTS. The caller
8203 * is to delete this field using decrRef() as it is no more needed.
8204 * \throw If reading the file fails.
8206 MEDFileFieldMultiTS *MEDFileFieldMultiTS::New(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
8208 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldMultiTS> ret=new MEDFileFieldMultiTS(fileName,loadAll);
8209 ret->contentNotNull();//to check that content type matches with \a this type.
8214 * Returns a new instance of MEDFileFieldMultiTS holding data of a given field
8215 * that has been read from a specified MED file.
8216 * \param [in] fileName - the name of the MED file to read.
8217 * \param [in] fieldName - the name of the field to read.
8218 * \return MEDFileFieldMultiTS * - a new instance of MEDFileFieldMultiTS. The caller
8219 * is to delete this field using decrRef() as it is no more needed.
8220 * \throw If reading the file fails.
8221 * \throw If there is no field named \a fieldName in the file.
8223 MEDFileFieldMultiTS *MEDFileFieldMultiTS::New(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
8225 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldMultiTS> ret=new MEDFileFieldMultiTS(fileName,fieldName,loadAll);
8226 ret->contentNotNull();//to check that content type matches with \a this type.
8231 * Returns a new instance of MEDFileFieldMultiTS. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
8232 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
8234 * Returns a new instance of MEDFileFieldMultiTS holding either a shallow copy
8235 * of a given MEDFileFieldMultiTSWithoutSDA ( \a other ) or \a other itself.
8236 * \warning this is a shallow copy constructor
8237 * \param [in] other - a MEDFileField1TSWithoutSDA to copy.
8238 * \param [in] shallowCopyOfContent - if \c true, a shallow copy of \a other is created.
8239 * \return MEDFileFieldMultiTS * - a new instance of MEDFileFieldMultiTS. The caller
8240 * is to delete this field using decrRef() as it is no more needed.
8242 MEDFileFieldMultiTS *MEDFileFieldMultiTS::New(const MEDFileFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent)
8244 return new MEDFileFieldMultiTS(other,shallowCopyOfContent);
8247 MEDFileAnyTypeFieldMultiTS *MEDFileFieldMultiTS::shallowCpy() const throw(INTERP_KERNEL::Exception)
8249 return new MEDFileFieldMultiTS(*this);
8252 void MEDFileFieldMultiTS::checkCoherencyOfType(const MEDFileAnyTypeField1TS *f1ts) const throw(INTERP_KERNEL::Exception)
8255 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::checkCoherencyOfType : input field1TS is NULL ! Impossible to check !");
8256 const MEDFileField1TS *f1tsC=dynamic_cast<const MEDFileField1TS *>(f1ts);
8258 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::checkCoherencyOfType : the input field1TS is not a FLOAT64 type !");
8262 * This method performs a copy with datatype modification ( float64->int32 ) of \a this. The globals information are copied
8263 * following the given input policy.
8265 * \param [in] deepCpyGlobs - a boolean that indicates the behaviour concerning globals (profiles and localizations)
8266 * By default (true) the globals are deeply copied.
8267 * \return MEDFileIntFieldMultiTS * - a new object that is the result of the conversion of \a this to int32 field.
8269 MEDFileIntFieldMultiTS *MEDFileFieldMultiTS::convertToInt(bool deepCpyGlobs) const throw(INTERP_KERNEL::Exception)
8271 MEDCouplingAutoRefCountObjectPtr<MEDFileIntFieldMultiTS> ret;
8272 const MEDFileAnyTypeFieldMultiTSWithoutSDA *content(_content);
8275 const MEDFileFieldMultiTSWithoutSDA *contc=dynamic_cast<const MEDFileFieldMultiTSWithoutSDA *>(content);
8277 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::convertToInt : the content inside this is not FLOAT64 ! This is incoherent !");
8278 MEDCouplingAutoRefCountObjectPtr<MEDFileIntFieldMultiTSWithoutSDA> newc(contc->convertToInt());
8279 ret=static_cast<MEDFileIntFieldMultiTS *>(MEDFileAnyTypeFieldMultiTS::BuildNewInstanceFromContent((MEDFileIntFieldMultiTSWithoutSDA *)newc,getFileName()));
8282 ret=MEDFileIntFieldMultiTS::New();
8284 ret->deepCpyGlobs(*this);
8286 ret->shallowCpyGlobs(*this);
8291 * Returns a new MEDFileField1TS holding data of a given time step of \a this field.
8292 * \param [in] pos - a time step id.
8293 * \return MEDFileField1TS * - a new instance of MEDFileField1TS. The caller is to
8294 * delete this field using decrRef() as it is no more needed.
8295 * \throw If \a pos is not a valid time step id.
8297 MEDFileAnyTypeField1TS *MEDFileFieldMultiTS::getTimeStepAtPos(int pos) const throw(INTERP_KERNEL::Exception)
8299 const MEDFileAnyTypeField1TSWithoutSDA *item=contentNotNullBase()->getTimeStepAtPos2(pos);
8302 std::ostringstream oss; oss << "MEDFileFieldMultiTS::getTimeStepAtPos : field at pos #" << pos << " is null !";
8303 throw INTERP_KERNEL::Exception(oss.str().c_str());
8305 const MEDFileField1TSWithoutSDA *itemC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(item);
8308 MEDCouplingAutoRefCountObjectPtr<MEDFileField1TS> ret=MEDFileField1TS::New(*itemC,false);
8309 ret->shallowCpyGlobs(*this);
8312 std::ostringstream oss; oss << "MEDFileFieldMultiTS::getTimeStepAtPos : type of field at pos #" << pos << " is not FLOAT64 !";
8313 throw INTERP_KERNEL::Exception(oss.str().c_str());
8317 * Returns a new MEDCouplingFieldDouble of a given type, of a given time step, lying on
8318 * mesh entities of a given dimension of the first mesh in MED file.
8319 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8320 * \param [in] type - a spatial discretization of interest.
8321 * \param [in] iteration - the iteration number of a required time step.
8322 * \param [in] order - the iteration order number of required time step.
8323 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
8324 * \param [in] renumPol - specifies how to permute values of the result field according to
8325 * the optional numbers of cells and nodes, if any. The valid values are
8326 * - 0 - do not permute.
8327 * - 1 - permute cells.
8328 * - 2 - permute nodes.
8329 * - 3 - permute cells and nodes.
8331 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8332 * caller is to delete this field using decrRef() as it is no more needed.
8333 * \throw If the MED file is not readable.
8334 * \throw If there is no mesh in the MED file.
8335 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
8336 * \throw If no field values of the required parameters are available.
8338 MEDCouplingFieldDouble *MEDFileFieldMultiTS::getFieldAtLevel(TypeOfField type, int iteration, int order, int meshDimRelToMax, int renumPol) const throw(INTERP_KERNEL::Exception)
8340 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8341 const MEDFileField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(&myF1TS);
8343 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldAtLevel : mismatch of type of field expecting FLOAT64 !");
8344 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
8345 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldAtLevel(type,meshDimRelToMax,0,renumPol,this,arrOut,*contentNotNullBase());
8346 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
8351 * Returns a new MEDCouplingFieldDouble of a given type, of a given time step, lying on
8352 * the top level cells of the first mesh in MED file.
8353 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8354 * \param [in] type - a spatial discretization of interest.
8355 * \param [in] iteration - the iteration number of a required time step.
8356 * \param [in] order - the iteration order number of required time step.
8357 * \param [in] renumPol - specifies how to permute values of the result field according to
8358 * the optional numbers of cells and nodes, if any. The valid values are
8359 * - 0 - do not permute.
8360 * - 1 - permute cells.
8361 * - 2 - permute nodes.
8362 * - 3 - permute cells and nodes.
8364 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8365 * caller is to delete this field using decrRef() as it is no more needed.
8366 * \throw If the MED file is not readable.
8367 * \throw If there is no mesh in the MED file.
8368 * \throw If no field values of the required parameters are available.
8370 MEDCouplingFieldDouble *MEDFileFieldMultiTS::getFieldAtTopLevel(TypeOfField type, int iteration, int order, int renumPol) const throw(INTERP_KERNEL::Exception)
8372 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8373 const MEDFileField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(&myF1TS);
8375 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldAtTopLevel : mismatch of type of field !");
8376 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
8377 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldAtTopLevel(type,0,renumPol,this,arrOut,*contentNotNullBase());
8378 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
8383 * Returns a new MEDCouplingFieldDouble of a given type, of a given time step, lying on
8385 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8386 * \param [in] type - a spatial discretization of interest.
8387 * \param [in] iteration - the iteration number of a required time step.
8388 * \param [in] order - the iteration order number of required time step.
8389 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
8390 * \param [in] mesh - the supporting mesh.
8391 * \param [in] renumPol - specifies how to permute values of the result field according to
8392 * the optional numbers of cells and nodes, if any. The valid values are
8393 * - 0 - do not permute.
8394 * - 1 - permute cells.
8395 * - 2 - permute nodes.
8396 * - 3 - permute cells and nodes.
8398 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8399 * caller is to delete this field using decrRef() as it is no more needed.
8400 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
8401 * \throw If no field of \a this is lying on \a mesh.
8402 * \throw If no field values of the required parameters are available.
8404 MEDCouplingFieldDouble *MEDFileFieldMultiTS::getFieldOnMeshAtLevel(TypeOfField type, int iteration, int order, int meshDimRelToMax, const MEDFileMesh *mesh, int renumPol) const throw(INTERP_KERNEL::Exception)
8406 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8407 const MEDFileField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(&myF1TS);
8409 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldOnMeshAtLevel : mismatch of type of field !");
8410 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
8411 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldOnMeshAtLevel(type,meshDimRelToMax,renumPol,this,mesh,arrOut,*contentNotNullBase());
8412 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
8417 * Returns a new MEDCouplingFieldDouble of given type, of a given time step, lying on a
8419 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8420 * \param [in] type - a spatial discretization of the new field.
8421 * \param [in] iteration - the iteration number of a required time step.
8422 * \param [in] order - the iteration order number of required time step.
8423 * \param [in] mesh - the supporting mesh.
8424 * \param [in] renumPol - specifies how to permute values of the result field according to
8425 * the optional numbers of cells and nodes, if any. The valid values are
8426 * - 0 - do not permute.
8427 * - 1 - permute cells.
8428 * - 2 - permute nodes.
8429 * - 3 - permute cells and nodes.
8431 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8432 * caller is to delete this field using decrRef() as it is no more needed.
8433 * \throw If no field of \a this is lying on \a mesh.
8434 * \throw If no field values of the required parameters are available.
8436 MEDCouplingFieldDouble *MEDFileFieldMultiTS::getFieldOnMeshAtLevel(TypeOfField type, int iteration, int order, const MEDCouplingMesh *mesh, int renumPol) const throw(INTERP_KERNEL::Exception)
8438 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8439 const MEDFileField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(&myF1TS);
8441 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldOnMeshAtLevel : mismatch of type of field !");
8442 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
8443 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldOnMeshAtLevel(type,renumPol,this,mesh,0,0,arrOut,*contentNotNullBase());
8444 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
8449 * This method has a close behaviour than MEDFileFieldMultiTS::getFieldAtLevel.
8450 * This method is called 'old' because the user should give the mesh name he wants to use for it's field.
8451 * This method is useful for MED2 file format when field on different mesh was autorized.
8453 MEDCouplingFieldDouble *MEDFileFieldMultiTS::getFieldAtLevelOld(TypeOfField type, const char *mname, int iteration, int order, int meshDimRelToMax, int renumPol) const throw(INTERP_KERNEL::Exception)
8455 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8456 const MEDFileField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(&myF1TS);
8458 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldAtLevelOld : mismatch of type of field !");
8459 MEDCouplingAutoRefCountObjectPtr<DataArray> arrOut;
8460 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldAtLevel(type,meshDimRelToMax,mname,renumPol,this,arrOut,*contentNotNullBase());
8461 MEDFileField1TS::SetDataArrayDoubleInField(ret,arrOut);
8466 * Returns values and a profile of the field of a given type, of a given time step,
8467 * lying on a given support.
8468 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8469 * \param [in] type - a spatial discretization of the field.
8470 * \param [in] iteration - the iteration number of a required time step.
8471 * \param [in] order - the iteration order number of required time step.
8472 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
8473 * \param [in] mesh - the supporting mesh.
8474 * \param [out] pfl - a new instance of DataArrayInt holding ids of mesh entities the
8475 * field of interest lies on. If the field lies on all entities of the given
8476 * dimension, all ids in \a pfl are zero. The caller is to delete this array
8477 * using decrRef() as it is no more needed.
8478 * \param [in] glob - the global data storing profiles and localization.
8479 * \return DataArrayDouble * - a new instance of DataArrayDouble holding values of the
8480 * field. The caller is to delete this array using decrRef() as it is no more needed.
8481 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
8482 * \throw If no field of \a this is lying on \a mesh.
8483 * \throw If no field values of the required parameters are available.
8485 DataArrayDouble *MEDFileFieldMultiTS::getFieldWithProfile(TypeOfField type, int iteration, int order, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt *&pfl) const throw(INTERP_KERNEL::Exception)
8487 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8488 const MEDFileField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileField1TSWithoutSDA *>(&myF1TS);
8490 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldWithProfile : mismatch of type of field !");
8491 MEDCouplingAutoRefCountObjectPtr<DataArray> ret=myF1TSC->getFieldWithProfile(type,meshDimRelToMax,mesh,pfl,this,*contentNotNullBase());
8492 return MEDFileField1TS::ReturnSafelyDataArrayDouble(ret);
8495 const MEDFileFieldMultiTSWithoutSDA *MEDFileFieldMultiTS::contentNotNull() const throw(INTERP_KERNEL::Exception)
8497 const MEDFileAnyTypeFieldMultiTSWithoutSDA *pt(_content);
8499 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::contentNotNull : the content pointer is null !");
8500 const MEDFileFieldMultiTSWithoutSDA *ret=dynamic_cast<const MEDFileFieldMultiTSWithoutSDA *>(pt);
8502 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::contentNotNull : the content pointer is not null but it is not of type double ! Reason is maybe that the read field has not the type FLOAT64 !");
8506 MEDFileFieldMultiTSWithoutSDA *MEDFileFieldMultiTS::contentNotNull() throw(INTERP_KERNEL::Exception)
8508 MEDFileAnyTypeFieldMultiTSWithoutSDA *pt(_content);
8510 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::contentNotNull : the non const content pointer is null !");
8511 MEDFileFieldMultiTSWithoutSDA *ret=dynamic_cast<MEDFileFieldMultiTSWithoutSDA *>(pt);
8513 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::contentNotNull : the non const content pointer is not null but it is not of type double ! Reason is maybe that the read field has not the type FLOAT64 !");
8518 * Adds a MEDCouplingFieldDouble to \a this as another time step. The underlying mesh of
8519 * the given field is checked if its elements are sorted suitable for writing to MED file
8520 * ("STB" stands for "Sort By Type"), if not, an exception is thrown.
8521 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8522 * \param [in] field - the field to add to \a this.
8523 * \throw If the name of \a field is empty.
8524 * \throw If the data array of \a field is not set.
8525 * \throw If existing time steps have different name or number of components than \a field.
8526 * \throw If the underlying mesh of \a field has no name.
8527 * \throw If elements in the mesh are not in the order suitable for writing to the MED file.
8529 void MEDFileFieldMultiTS::appendFieldNoProfileSBT(const MEDCouplingFieldDouble *field) throw(INTERP_KERNEL::Exception)
8531 const DataArrayDouble *arr=0;
8533 arr=field->getArray();
8534 contentNotNull()->appendFieldNoProfileSBT(field,arr,*this);
8538 * Adds a MEDCouplingFieldDouble to \a this as another time step. Specified entities of
8539 * a given dimension of a given mesh are used as the support of the given field.
8540 * Elements of the given mesh must be sorted suitable for writing to MED file.
8541 * Order of underlying mesh entities of the given field specified by \a profile parameter
8542 * is not prescribed; this method permutes field values to have them sorted by element
8543 * type as required for writing to MED file.
8544 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8545 * \param [in] field - the field to add to \a this.
8546 * \param [in] mesh - the supporting mesh of \a field.
8547 * \param [in] meshDimRelToMax - a relative dimension of mesh entities \a field lies on.
8548 * \param [in] profile - ids of mesh entities on which corresponding field values lie.
8549 * \throw If either \a field or \a mesh or \a profile has an empty name.
8550 * \throw If existing time steps have different name or number of components than \a field.
8551 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
8552 * \throw If the data array of \a field is not set.
8553 * \throw If elements in \a mesh are not in the order suitable for writing to the MED file.
8555 void MEDFileFieldMultiTS::appendFieldProfile(const MEDCouplingFieldDouble *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile) throw(INTERP_KERNEL::Exception)
8557 const DataArrayDouble *arr=0;
8559 arr=field->getArray();
8560 contentNotNull()->appendFieldProfile(field,arr,mesh,meshDimRelToMax,profile,*this);
8563 MEDFileFieldMultiTS::MEDFileFieldMultiTS()
8565 _content=new MEDFileFieldMultiTSWithoutSDA;
8568 MEDFileFieldMultiTS::MEDFileFieldMultiTS(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
8569 try:MEDFileAnyTypeFieldMultiTS(fileName,loadAll)
8572 catch(INTERP_KERNEL::Exception& e)
8575 MEDFileFieldMultiTS::MEDFileFieldMultiTS(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
8576 try:MEDFileAnyTypeFieldMultiTS(fileName,fieldName,loadAll)
8579 catch(INTERP_KERNEL::Exception& e)
8582 MEDFileFieldMultiTS::MEDFileFieldMultiTS(const MEDFileFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent):MEDFileAnyTypeFieldMultiTS(other,shallowCopyOfContent)
8586 std::vector< std::vector<DataArrayDouble *> > MEDFileFieldMultiTS::getFieldSplitedByType2(int iteration, int order, const char *mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const throw(INTERP_KERNEL::Exception)
8588 return contentNotNull()->getFieldSplitedByType2(iteration,order,mname,types,typesF,pfls,locs);
8591 DataArrayDouble *MEDFileFieldMultiTS::getUndergroundDataArray(int iteration, int order) const throw(INTERP_KERNEL::Exception)
8593 return static_cast<DataArrayDouble *>(contentNotNull()->getUndergroundDataArray(iteration,order));
8596 DataArrayDouble *MEDFileFieldMultiTS::getUndergroundDataArrayExt(int iteration, int order, std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const throw(INTERP_KERNEL::Exception)
8598 return static_cast<DataArrayDouble *>(contentNotNull()->getUndergroundDataArrayExt(iteration,order,entries));
8601 //= MEDFileAnyTypeFieldMultiTSIterator
8603 MEDFileAnyTypeFieldMultiTSIterator::MEDFileAnyTypeFieldMultiTSIterator(MEDFileAnyTypeFieldMultiTS *fmts):_fmts(fmts),_iter_id(0),_nb_iter(0)
8608 _nb_iter=fmts->getNumberOfTS();
8612 MEDFileAnyTypeFieldMultiTSIterator::~MEDFileAnyTypeFieldMultiTSIterator()
8616 MEDFileAnyTypeField1TS *MEDFileAnyTypeFieldMultiTSIterator::nextt() throw(INTERP_KERNEL::Exception)
8618 if(_iter_id<_nb_iter)
8620 MEDFileAnyTypeFieldMultiTS *fmts(_fmts);
8622 return fmts->getTimeStepAtPos(_iter_id++);
8630 //= MEDFileIntFieldMultiTS
8633 * Returns a new empty instance of MEDFileFieldMultiTS.
8634 * \return MEDFileIntFieldMultiTS * - a new instance of MEDFileIntFieldMultiTS. The caller
8635 * is to delete this field using decrRef() as it is no more needed.
8637 MEDFileIntFieldMultiTS *MEDFileIntFieldMultiTS::New()
8639 return new MEDFileIntFieldMultiTS;
8643 * Returns a new instance of MEDFileIntFieldMultiTS holding data of the first field
8644 * that has been read from a specified MED file.
8645 * \param [in] fileName - the name of the MED file to read.
8646 * \return MEDFileFieldMultiTS * - a new instance of MEDFileIntFieldMultiTS. The caller
8647 * is to delete this field using decrRef() as it is no more needed.
8648 * \throw If reading the file fails.
8650 MEDFileIntFieldMultiTS *MEDFileIntFieldMultiTS::New(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
8652 MEDCouplingAutoRefCountObjectPtr<MEDFileIntFieldMultiTS> ret=new MEDFileIntFieldMultiTS(fileName,loadAll);
8653 ret->contentNotNull();//to check that content type matches with \a this type.
8658 * Returns a new instance of MEDFileIntFieldMultiTS holding data of a given field
8659 * that has been read from a specified MED file.
8660 * \param [in] fileName - the name of the MED file to read.
8661 * \param [in] fieldName - the name of the field to read.
8662 * \return MEDFileFieldMultiTS * - a new instance of MEDFileIntFieldMultiTS. The caller
8663 * is to delete this field using decrRef() as it is no more needed.
8664 * \throw If reading the file fails.
8665 * \throw If there is no field named \a fieldName in the file.
8667 MEDFileIntFieldMultiTS *MEDFileIntFieldMultiTS::New(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
8669 MEDCouplingAutoRefCountObjectPtr<MEDFileIntFieldMultiTS> ret=new MEDFileIntFieldMultiTS(fileName,fieldName,loadAll);
8670 ret->contentNotNull();//to check that content type matches with \a this type.
8675 * Returns a new instance of MEDFileIntFieldMultiTS. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
8676 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
8678 * Returns a new instance of MEDFileIntFieldMultiTS holding either a shallow copy
8679 * of a given MEDFileIntFieldMultiTSWithoutSDA ( \a other ) or \a other itself.
8680 * \warning this is a shallow copy constructor
8681 * \param [in] other - a MEDFileIntField1TSWithoutSDA to copy.
8682 * \param [in] shallowCopyOfContent - if \c true, a shallow copy of \a other is created.
8683 * \return MEDFileIntFieldMultiTS * - a new instance of MEDFileIntFieldMultiTS. The caller
8684 * is to delete this field using decrRef() as it is no more needed.
8686 MEDFileIntFieldMultiTS *MEDFileIntFieldMultiTS::New(const MEDFileIntFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent)
8688 return new MEDFileIntFieldMultiTS(other,shallowCopyOfContent);
8692 * This method performs a copy with datatype modification ( int32->float64 ) of \a this. The globals information are copied
8693 * following the given input policy.
8695 * \param [in] deepCpyGlobs - a boolean that indicates the behaviour concerning globals (profiles and localizations)
8696 * By default (true) the globals are deeply copied.
8697 * \return MEDFileFieldMultiTS * - a new object that is the result of the conversion of \a this to float64 field.
8699 MEDFileFieldMultiTS *MEDFileIntFieldMultiTS::convertToDouble(bool deepCpyGlobs) const throw(INTERP_KERNEL::Exception)
8701 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldMultiTS> ret;
8702 const MEDFileAnyTypeFieldMultiTSWithoutSDA *content(_content);
8705 const MEDFileIntFieldMultiTSWithoutSDA *contc=dynamic_cast<const MEDFileIntFieldMultiTSWithoutSDA *>(content);
8707 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::convertToInt : the content inside this is not INT32 ! This is incoherent !");
8708 MEDCouplingAutoRefCountObjectPtr<MEDFileFieldMultiTSWithoutSDA> newc(contc->convertToDouble());
8709 ret=static_cast<MEDFileFieldMultiTS *>(MEDFileAnyTypeFieldMultiTS::BuildNewInstanceFromContent((MEDFileFieldMultiTSWithoutSDA *)newc,getFileName()));
8712 ret=MEDFileFieldMultiTS::New();
8714 ret->deepCpyGlobs(*this);
8716 ret->shallowCpyGlobs(*this);
8720 MEDFileAnyTypeFieldMultiTS *MEDFileIntFieldMultiTS::shallowCpy() const throw(INTERP_KERNEL::Exception)
8722 return new MEDFileIntFieldMultiTS(*this);
8725 void MEDFileIntFieldMultiTS::checkCoherencyOfType(const MEDFileAnyTypeField1TS *f1ts) const throw(INTERP_KERNEL::Exception)
8728 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::checkCoherencyOfType : input field1TS is NULL ! Impossible to check !");
8729 const MEDFileIntField1TS *f1tsC=dynamic_cast<const MEDFileIntField1TS *>(f1ts);
8731 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::checkCoherencyOfType : the input field1TS is not a INT32 type !");
8735 * Returns a new MEDCouplingFieldDouble of a given type, of a given time step, lying on
8736 * mesh entities of a given dimension of the first mesh in MED file.
8737 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8738 * \param [in] type - a spatial discretization of interest.
8739 * \param [in] iteration - the iteration number of a required time step.
8740 * \param [in] order - the iteration order number of required time step.
8741 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
8742 * \param [out] arrOut - the DataArrayInt containing values of field.
8743 * \param [in] renumPol - specifies how to permute values of the result field according to
8744 * the optional numbers of cells and nodes, if any. The valid values are
8745 * - 0 - do not permute.
8746 * - 1 - permute cells.
8747 * - 2 - permute nodes.
8748 * - 3 - permute cells and nodes.
8750 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8751 * caller is to delete this field using decrRef() as it is no more needed.
8752 * \throw If the MED file is not readable.
8753 * \throw If there is no mesh in the MED file.
8754 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
8755 * \throw If no field values of the required parameters are available.
8757 MEDCouplingFieldDouble *MEDFileIntFieldMultiTS::getFieldAtLevel(TypeOfField type, int iteration, int order, int meshDimRelToMax, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
8759 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8760 const MEDFileIntField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(&myF1TS);
8762 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::getFieldAtLevel : mismatch of type of field expecting INT32 !");
8763 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
8764 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldAtLevel(type,meshDimRelToMax,0,renumPol,this,arr,*contentNotNullBase());
8765 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
8770 * Returns a new MEDCouplingFieldDouble of a given type, of a given time step, lying on
8771 * the top level cells of the first mesh in MED file.
8772 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8773 * \param [in] type - a spatial discretization of interest.
8774 * \param [in] iteration - the iteration number of a required time step.
8775 * \param [in] order - the iteration order number of required time step.
8776 * \param [out] arrOut - the DataArrayInt containing values of field.
8777 * \param [in] renumPol - specifies how to permute values of the result field according to
8778 * the optional numbers of cells and nodes, if any. The valid values are
8779 * - 0 - do not permute.
8780 * - 1 - permute cells.
8781 * - 2 - permute nodes.
8782 * - 3 - permute cells and nodes.
8784 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8785 * caller is to delete this field using decrRef() as it is no more needed.
8786 * \throw If the MED file is not readable.
8787 * \throw If there is no mesh in the MED file.
8788 * \throw If no field values of the required parameters are available.
8790 MEDCouplingFieldDouble *MEDFileIntFieldMultiTS::getFieldAtTopLevel(TypeOfField type, int iteration, int order, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
8792 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8793 const MEDFileIntField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(&myF1TS);
8795 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::getFieldAtTopLevel : mismatch of type of field ! INT32 expected !");
8796 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
8797 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldAtTopLevel(type,0,renumPol,this,arr,*contentNotNullBase());
8798 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
8803 * Returns a new MEDCouplingFieldDouble of a given type, of a given time step, lying on
8805 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8806 * \param [in] type - a spatial discretization of interest.
8807 * \param [in] iteration - the iteration number of a required time step.
8808 * \param [in] order - the iteration order number of required time step.
8809 * \param [out] arrOut - the DataArrayInt containing values of field.
8810 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
8811 * \param [in] mesh - the supporting mesh.
8812 * \param [in] renumPol - specifies how to permute values of the result field according to
8813 * the optional numbers of cells and nodes, if any. The valid values are
8814 * - 0 - do not permute.
8815 * - 1 - permute cells.
8816 * - 2 - permute nodes.
8817 * - 3 - permute cells and nodes.
8819 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8820 * caller is to delete this field using decrRef() as it is no more needed.
8821 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in the mesh.
8822 * \throw If no field of \a this is lying on \a mesh.
8823 * \throw If no field values of the required parameters are available.
8825 MEDCouplingFieldDouble *MEDFileIntFieldMultiTS::getFieldOnMeshAtLevel(TypeOfField type, int iteration, int order, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
8827 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8828 const MEDFileIntField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(&myF1TS);
8830 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldOnMeshAtLevel : mismatch of type of field ! INT32 expected !");
8831 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
8832 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldOnMeshAtLevel(type,meshDimRelToMax,renumPol,this,mesh,arr,*contentNotNullBase());
8833 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
8838 * Returns a new MEDCouplingFieldDouble of given type, of a given time step, lying on a
8840 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8841 * \param [in] type - a spatial discretization of the new field.
8842 * \param [in] iteration - the iteration number of a required time step.
8843 * \param [in] order - the iteration order number of required time step.
8844 * \param [in] mesh - the supporting mesh.
8845 * \param [out] arrOut - the DataArrayInt containing values of field.
8846 * \param [in] renumPol - specifies how to permute values of the result field according to
8847 * the optional numbers of cells and nodes, if any. The valid values are
8848 * - 0 - do not permute.
8849 * - 1 - permute cells.
8850 * - 2 - permute nodes.
8851 * - 3 - permute cells and nodes.
8853 * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The
8854 * caller is to delete this field using decrRef() as it is no more needed.
8855 * \throw If no field of \a this is lying on \a mesh.
8856 * \throw If no field values of the required parameters are available.
8858 MEDCouplingFieldDouble *MEDFileIntFieldMultiTS::getFieldOnMeshAtLevel(TypeOfField type, int iteration, int order, const MEDCouplingMesh *mesh, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
8860 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8861 const MEDFileIntField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(&myF1TS);
8863 throw INTERP_KERNEL::Exception("MEDFileFieldIntMultiTS::getFieldOnMeshAtLevel : mismatch of type of field ! INT32 expected !");
8864 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
8865 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldOnMeshAtLevel(type,renumPol,this,mesh,0,0,arr,*contentNotNullBase());
8866 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
8871 * This method has a close behaviour than MEDFileIntFieldMultiTS::getFieldAtLevel.
8872 * This method is called 'old' because the user should give the mesh name he wants to use for it's field.
8873 * This method is useful for MED2 file format when field on different mesh was autorized.
8875 MEDCouplingFieldDouble *MEDFileIntFieldMultiTS::getFieldAtLevelOld(TypeOfField type, int iteration, int order, const char *mname, int meshDimRelToMax, DataArrayInt* &arrOut, int renumPol) const throw(INTERP_KERNEL::Exception)
8877 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8878 const MEDFileIntField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(&myF1TS);
8880 throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::getFieldOnMeshAtLevel : mismatch of type of field ! INT32 expected !");
8881 MEDCouplingAutoRefCountObjectPtr<DataArray> arr;
8882 MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> ret=myF1TSC->getFieldAtLevel(type,meshDimRelToMax,mname,renumPol,this,arr,*contentNotNullBase());
8883 arrOut=MEDFileIntField1TS::ReturnSafelyDataArrayInt(arr);
8888 * Returns values and a profile of the field of a given type, of a given time step,
8889 * lying on a given support.
8890 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8891 * \param [in] type - a spatial discretization of the field.
8892 * \param [in] iteration - the iteration number of a required time step.
8893 * \param [in] order - the iteration order number of required time step.
8894 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
8895 * \param [in] mesh - the supporting mesh.
8896 * \param [out] pfl - a new instance of DataArrayInt holding ids of mesh entities the
8897 * field of interest lies on. If the field lies on all entities of the given
8898 * dimension, all ids in \a pfl are zero. The caller is to delete this array
8899 * using decrRef() as it is no more needed.
8900 * \param [in] glob - the global data storing profiles and localization.
8901 * \return DataArrayInt * - a new instance of DataArrayInt holding values of the
8902 * field. The caller is to delete this array using decrRef() as it is no more needed.
8903 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
8904 * \throw If no field of \a this is lying on \a mesh.
8905 * \throw If no field values of the required parameters are available.
8907 DataArrayInt *MEDFileIntFieldMultiTS::getFieldWithProfile(TypeOfField type, int iteration, int order, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt *&pfl) const throw(INTERP_KERNEL::Exception)
8909 const MEDFileAnyTypeField1TSWithoutSDA& myF1TS=contentNotNullBase()->getTimeStepEntry(iteration,order);
8910 const MEDFileIntField1TSWithoutSDA *myF1TSC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(&myF1TS);
8912 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::getFieldWithProfile : mismatch of type of field ! INT32 expected !");
8913 MEDCouplingAutoRefCountObjectPtr<DataArray> ret=myF1TSC->getFieldWithProfile(type,meshDimRelToMax,mesh,pfl,this,*contentNotNullBase());
8914 return MEDFileIntField1TS::ReturnSafelyDataArrayInt(ret);
8918 * Returns a new MEDFileIntField1TS holding data of a given time step of \a this field.
8919 * \param [in] pos - a time step id.
8920 * \return MEDFileIntField1TS * - a new instance of MEDFileIntField1TS. The caller is to
8921 * delete this field using decrRef() as it is no more needed.
8922 * \throw If \a pos is not a valid time step id.
8924 MEDFileAnyTypeField1TS *MEDFileIntFieldMultiTS::getTimeStepAtPos(int pos) const throw(INTERP_KERNEL::Exception)
8926 const MEDFileAnyTypeField1TSWithoutSDA *item=contentNotNullBase()->getTimeStepAtPos2(pos);
8929 std::ostringstream oss; oss << "MEDFileIntFieldMultiTS::getTimeStepAtPos : field at pos #" << pos << " is null !";
8930 throw INTERP_KERNEL::Exception(oss.str().c_str());
8932 const MEDFileIntField1TSWithoutSDA *itemC=dynamic_cast<const MEDFileIntField1TSWithoutSDA *>(item);
8935 MEDCouplingAutoRefCountObjectPtr<MEDFileIntField1TS> ret=MEDFileIntField1TS::New(*itemC,false);
8936 ret->shallowCpyGlobs(*this);
8939 std::ostringstream oss; oss << "MEDFileIntFieldMultiTS::getTimeStepAtPos : type of field at pos #" << pos << " is not INT32 !";
8940 throw INTERP_KERNEL::Exception(oss.str().c_str());
8944 * Adds a MEDCouplingFieldDouble to \a this as another time step. The underlying mesh of
8945 * the given field is checked if its elements are sorted suitable for writing to MED file
8946 * ("STB" stands for "Sort By Type"), if not, an exception is thrown.
8947 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8948 * \param [in] field - the field to add to \a this.
8949 * \throw If the name of \a field is empty.
8950 * \throw If the data array of \a field is not set.
8951 * \throw If existing time steps have different name or number of components than \a field.
8952 * \throw If the underlying mesh of \a field has no name.
8953 * \throw If elements in the mesh are not in the order suitable for writing to the MED file.
8955 void MEDFileIntFieldMultiTS::appendFieldNoProfileSBT(const MEDCouplingFieldDouble *field, const DataArrayInt *arrOfVals) throw(INTERP_KERNEL::Exception)
8957 contentNotNull()->appendFieldNoProfileSBT(field,arrOfVals,*this);
8961 * Adds a MEDCouplingFieldDouble to \a this as another time step. Specified entities of
8962 * a given dimension of a given mesh are used as the support of the given field.
8963 * Elements of the given mesh must be sorted suitable for writing to MED file.
8964 * Order of underlying mesh entities of the given field specified by \a profile parameter
8965 * is not prescribed; this method permutes field values to have them sorted by element
8966 * type as required for writing to MED file.
8967 * For more info, see \ref AdvMEDLoaderAPIFieldRW
8968 * \param [in] field - the field to add to \a this.
8969 * \param [in] mesh - the supporting mesh of \a field.
8970 * \param [in] meshDimRelToMax - a relative dimension of mesh entities \a field lies on.
8971 * \param [in] profile - ids of mesh entities on which corresponding field values lie.
8972 * \throw If either \a field or \a mesh or \a profile has an empty name.
8973 * \throw If existing time steps have different name or number of components than \a field.
8974 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
8975 * \throw If the data array of \a field is not set.
8976 * \throw If elements in \a mesh are not in the order suitable for writing to the MED file.
8978 void MEDFileIntFieldMultiTS::appendFieldProfile(const MEDCouplingFieldDouble *field, const DataArrayInt *arrOfVals, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile) throw(INTERP_KERNEL::Exception)
8980 contentNotNull()->appendFieldProfile(field,arrOfVals,mesh,meshDimRelToMax,profile,*this);
8983 const MEDFileIntFieldMultiTSWithoutSDA *MEDFileIntFieldMultiTS::contentNotNull() const throw(INTERP_KERNEL::Exception)
8985 const MEDFileAnyTypeFieldMultiTSWithoutSDA *pt(_content);
8987 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::contentNotNull : the content pointer is null !");
8988 const MEDFileIntFieldMultiTSWithoutSDA *ret=dynamic_cast<const MEDFileIntFieldMultiTSWithoutSDA *>(pt);
8990 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::contentNotNull : the content pointer is not null but it is not of type int ! Reason is maybe that the read field has not the type INT32 !");
8994 MEDFileIntFieldMultiTSWithoutSDA *MEDFileIntFieldMultiTS::contentNotNull() throw(INTERP_KERNEL::Exception)
8996 MEDFileAnyTypeFieldMultiTSWithoutSDA *pt(_content);
8998 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::contentNotNull : the non const content pointer is null !");
8999 MEDFileIntFieldMultiTSWithoutSDA *ret=dynamic_cast<MEDFileIntFieldMultiTSWithoutSDA *>(pt);
9001 throw INTERP_KERNEL::Exception("MEDFileIntFieldMultiTS::contentNotNull : the non const content pointer is not null but it is not of type int ! Reason is maybe that the read field has not the type INT32 !");
9005 MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS()
9007 _content=new MEDFileIntFieldMultiTSWithoutSDA;
9010 MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS(const MEDFileIntFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent):MEDFileAnyTypeFieldMultiTS(other,shallowCopyOfContent)
9014 MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
9015 try:MEDFileAnyTypeFieldMultiTS(fileName,loadAll)
9018 catch(INTERP_KERNEL::Exception& e)
9021 MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS(const char *fileName, const char *fieldName, bool loadAll) throw(INTERP_KERNEL::Exception)
9022 try:MEDFileAnyTypeFieldMultiTS(fileName,fieldName,loadAll)
9025 catch(INTERP_KERNEL::Exception& e)
9028 DataArrayInt *MEDFileIntFieldMultiTS::getUndergroundDataArray(int iteration, int order) const throw(INTERP_KERNEL::Exception)
9030 return static_cast<DataArrayInt *>(contentNotNull()->getUndergroundDataArray(iteration,order));
9035 MEDFileFields *MEDFileFields::New()
9037 return new MEDFileFields;
9040 MEDFileFields *MEDFileFields::New(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
9042 return new MEDFileFields(fileName,loadAll);
9045 std::size_t MEDFileFields::getHeapMemorySize() const
9047 std::size_t ret=_fields.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA>);
9048 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9049 if((const MEDFileAnyTypeFieldMultiTSWithoutSDA *)*it)
9050 ret+=(*it)->getHeapMemorySize();
9051 return ret+MEDFileFieldGlobsReal::getHeapMemorySize();
9054 MEDFileFields *MEDFileFields::deepCpy() const throw(INTERP_KERNEL::Exception)
9056 MEDCouplingAutoRefCountObjectPtr<MEDFileFields> ret=shallowCpy();
9058 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++,i++)
9060 if((const MEDFileAnyTypeFieldMultiTSWithoutSDA*)*it)
9061 ret->_fields[i]=(*it)->deepCpy();
9063 ret->deepCpyGlobs(*this);
9067 MEDFileFields *MEDFileFields::shallowCpy() const throw(INTERP_KERNEL::Exception)
9069 return new MEDFileFields(*this);
9073 * This method scans for all fields in \a this which time steps ids are common. Time step are discriminated by the pair of integer (iteration,order) whatever
9074 * the double time value. If all returned time steps are \b exactly those for all fields in \a this output parameter \a areThereSomeForgottenTS will be set to false.
9075 * If \a areThereSomeForgottenTS is set to true, only the sorted intersection of time steps present for all fields in \a this will be returned.
9077 * \param [out] areThereSomeForgottenTS - indicates to the caller if there is some time steps in \a this that are not present for all fields in \a this.
9078 * \return the sorted list of time steps (specified with a pair of integer iteration first and order second) present for all fields in \a this.
9080 * \sa MEDFileFields::partOfThisLyingOnSpecifiedTimeSteps, MEDFileFields::partOfThisNotLyingOnSpecifiedTimeSteps
9082 std::vector< std::pair<int,int> > MEDFileFields::getCommonIterations(bool& areThereSomeForgottenTS) const throw(INTERP_KERNEL::Exception)
9084 std::set< std::pair<int,int> > s;
9085 bool firstShot=true;
9086 areThereSomeForgottenTS=false;
9087 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9089 if(!(const MEDFileAnyTypeFieldMultiTSWithoutSDA*)*it)
9091 std::vector< std::pair<int,int> > v=(*it)->getIterations();
9092 std::set< std::pair<int,int> > s1; std::copy(v.begin(),v.end(),std::inserter(s1,s1.end()));
9094 { s=s1; firstShot=false; }
9097 std::set< std::pair<int,int> > s2; std::set_intersection(s.begin(),s.end(),s1.begin(),s1.end(),std::inserter(s2,s2.end()));
9099 areThereSomeForgottenTS=true;
9103 std::vector< std::pair<int,int> > ret;
9104 std::copy(s.begin(),s.end(),std::back_insert_iterator< std::vector< std::pair<int,int> > >(ret));
9108 int MEDFileFields::getNumberOfFields() const
9110 return _fields.size();
9113 std::vector<std::string> MEDFileFields::getFieldsNames() const throw(INTERP_KERNEL::Exception)
9115 std::vector<std::string> ret(_fields.size());
9117 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++,i++)
9119 const MEDFileAnyTypeFieldMultiTSWithoutSDA *f=(*it);
9122 ret[i]=f->getName();
9126 std::ostringstream oss; oss << "MEDFileFields::getFieldsNames : At rank #" << i << " field is not defined !";
9127 throw INTERP_KERNEL::Exception(oss.str().c_str());
9133 std::vector<std::string> MEDFileFields::getMeshesNames() const throw(INTERP_KERNEL::Exception)
9135 std::vector<std::string> ret;
9136 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9138 const MEDFileAnyTypeFieldMultiTSWithoutSDA *cur(*it);
9140 ret.push_back(cur->getMeshName());
9145 std::string MEDFileFields::simpleRepr() const
9147 std::ostringstream oss;
9148 oss << "(*****************)\n(* MEDFileFields *)\n(*****************)\n\n";
9153 void MEDFileFields::simpleRepr(int bkOffset, std::ostream& oss) const
9155 int nbOfFields=getNumberOfFields();
9156 std::string startLine(bkOffset,' ');
9157 oss << startLine << "There are " << nbOfFields << " fields in this :" << std::endl;
9159 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++,i++)
9161 const MEDFileAnyTypeFieldMultiTSWithoutSDA *cur=(*it);
9164 oss << startLine << " - # "<< i << " has the following name : \"" << cur->getName() << "\"." << std::endl;
9168 oss << startLine << " - not defined !" << std::endl;
9172 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++,i++)
9174 const MEDFileAnyTypeFieldMultiTSWithoutSDA *cur=(*it);
9175 std::string chapter(17,'0'+i);
9176 oss << startLine << chapter << std::endl;
9179 cur->simpleRepr(bkOffset+2,oss,i);
9183 oss << startLine << " - not defined !" << std::endl;
9185 oss << startLine << chapter << std::endl;
9187 simpleReprGlobs(oss);
9190 MEDFileFields::MEDFileFields()
9194 MEDFileFields::MEDFileFields(const char *fileName, bool loadAll) throw(INTERP_KERNEL::Exception)
9195 try:MEDFileFieldGlobsReal(fileName)
9197 MEDFileUtilities::CheckFileForRead(fileName);
9198 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,MED_ACC_RDONLY);
9199 int nbFields=MEDnField(fid);
9200 _fields.resize(nbFields);
9201 med_field_type typcha;
9202 for(int i=0;i<nbFields;i++)
9204 std::vector<std::string> infos;
9205 std::string fieldName,dtunit;
9206 int nbOfStep=MEDFileAnyTypeField1TS::LocateField2(fid,fileName,i,false,fieldName,typcha,infos,dtunit);
9211 _fields[i]=MEDFileFieldMultiTSWithoutSDA::New(fid,fieldName.c_str(),typcha,infos,nbOfStep,dtunit,loadAll);
9216 _fields[i]=MEDFileIntFieldMultiTSWithoutSDA::New(fid,fieldName.c_str(),typcha,infos,nbOfStep,dtunit,loadAll);
9221 std::ostringstream oss; oss << "constructor MEDFileFields(fileName) : file \'" << fileName << "\' at pos #" << i << " field has name \'" << fieldName << "\' but the type of field is not in [MED_FLOAT64, MED_INT32] !";
9222 throw INTERP_KERNEL::Exception(oss.str().c_str());
9226 loadAllGlobals(fid);
9228 catch(INTERP_KERNEL::Exception& e)
9233 void MEDFileFields::writeLL(med_idt fid) const throw(INTERP_KERNEL::Exception)
9236 writeGlobals(fid,*this);
9237 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++,i++)
9239 const MEDFileAnyTypeFieldMultiTSWithoutSDA *elt=*it;
9242 std::ostringstream oss; oss << "MEDFileFields::write : at rank #" << i << "/" << _fields.size() << " field is empty !";
9243 throw INTERP_KERNEL::Exception(oss.str().c_str());
9245 elt->writeLL(fid,*this);
9249 void MEDFileFields::write(const char *fileName, int mode) const throw(INTERP_KERNEL::Exception)
9251 med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
9252 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName,medmod);
9257 * This method alloc the arrays and load potentially huge arrays contained in this field.
9258 * This method should be called when a MEDFileAnyTypeFieldMultiTS::New constructor has been with false as the last parameter.
9259 * This method can be also called to refresh or reinit values from a file.
9261 * \throw If the fileName is not set or points to a non readable MED file.
9263 void MEDFileFields::loadArrays() throw(INTERP_KERNEL::Exception)
9265 MEDFileUtilities::AutoFid fid=MEDfileOpen(getFileName(),MED_ACC_RDONLY);
9266 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::iterator it=_fields.begin();it!=_fields.end();it++)
9268 MEDFileAnyTypeFieldMultiTSWithoutSDA *elt(*it);
9270 elt->loadBigArraysRecursively(fid,*elt);
9275 * This method behaves as MEDFileFields::loadArrays does, the first call, if \a this was built using a file without loading big arrays.
9276 * But once data loaded once, this method does nothing.
9278 * \throw If the fileName is not set or points to a non readable MED file.
9279 * \sa MEDFileFields::loadArrays, MEDFileFields::releaseArrays
9281 void MEDFileFields::loadArraysIfNecessary() throw(INTERP_KERNEL::Exception)
9283 MEDFileUtilities::AutoFid fid=MEDfileOpen(getFileName(),MED_ACC_RDONLY);
9284 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::iterator it=_fields.begin();it!=_fields.end();it++)
9286 MEDFileAnyTypeFieldMultiTSWithoutSDA *elt(*it);
9288 elt->loadBigArraysRecursivelyIfNecessary(fid,*elt);
9293 * This method releases potentially big data arrays and so returns to the same heap memory than status loaded with 'loadAll' parameter set to false.
9294 * This method does not release arrays set outside the context of a MED file.
9296 * \sa MEDFileFields::loadArrays, MEDFileFields::loadArraysIfNecessary
9298 void MEDFileFields::releaseArrays() throw(INTERP_KERNEL::Exception)
9300 MEDFileUtilities::AutoFid fid=MEDfileOpen(getFileName(),MED_ACC_RDONLY);
9301 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::iterator it=_fields.begin();it!=_fields.end();it++)
9303 MEDFileAnyTypeFieldMultiTSWithoutSDA *elt(*it);
9305 elt->releaseArrays();
9309 std::vector<std::string> MEDFileFields::getPflsReallyUsed() const
9311 std::vector<std::string> ret;
9312 std::set<std::string> ret2;
9313 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTSWithoutSDA > >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9315 std::vector<std::string> tmp=(*it)->getPflsReallyUsed2();
9316 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
9317 if(ret2.find(*it2)==ret2.end())
9319 ret.push_back(*it2);
9326 std::vector<std::string> MEDFileFields::getLocsReallyUsed() const
9328 std::vector<std::string> ret;
9329 std::set<std::string> ret2;
9330 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTSWithoutSDA > >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9332 std::vector<std::string> tmp=(*it)->getLocsReallyUsed2();
9333 for(std::vector<std::string>::const_iterator it2=tmp.begin();it2!=tmp.end();it2++)
9334 if(ret2.find(*it2)==ret2.end())
9336 ret.push_back(*it2);
9343 std::vector<std::string> MEDFileFields::getPflsReallyUsedMulti() const
9345 std::vector<std::string> ret;
9346 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTSWithoutSDA > >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9348 std::vector<std::string> tmp=(*it)->getPflsReallyUsedMulti2();
9349 ret.insert(ret.end(),tmp.begin(),tmp.end());
9354 std::vector<std::string> MEDFileFields::getLocsReallyUsedMulti() const
9356 std::vector<std::string> ret;
9357 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTSWithoutSDA > >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9359 std::vector<std::string> tmp=(*it)->getLocsReallyUsed2();
9360 ret.insert(ret.end(),tmp.begin(),tmp.end());
9365 void MEDFileFields::changePflsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
9367 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTSWithoutSDA > >::iterator it=_fields.begin();it!=_fields.end();it++)
9368 (*it)->changePflsRefsNamesGen2(mapOfModif);
9371 void MEDFileFields::changeLocsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif) throw(INTERP_KERNEL::Exception)
9373 for(std::vector< MEDCouplingAutoRefCountObjectPtr< MEDFileAnyTypeFieldMultiTSWithoutSDA > >::iterator it=_fields.begin();it!=_fields.end();it++)
9374 (*it)->changeLocsRefsNamesGen2(mapOfModif);
9377 void MEDFileFields::resize(int newSize) throw(INTERP_KERNEL::Exception)
9379 _fields.resize(newSize);
9382 void MEDFileFields::pushFields(const std::vector<MEDFileAnyTypeFieldMultiTS *>& fields) throw(INTERP_KERNEL::Exception)
9384 for(std::vector<MEDFileAnyTypeFieldMultiTS *>::const_iterator it=fields.begin();it!=fields.end();it++)
9388 void MEDFileFields::pushField(MEDFileAnyTypeFieldMultiTS *field) throw(INTERP_KERNEL::Exception)
9391 throw INTERP_KERNEL::Exception("MEDFileFields::pushMesh : invalid input pointer ! should be different from 0 !");
9392 _fields.push_back(field->getContent());
9393 appendGlobs(*field,1e-12);
9396 void MEDFileFields::setFieldAtPos(int i, MEDFileAnyTypeFieldMultiTS *field) throw(INTERP_KERNEL::Exception)
9399 throw INTERP_KERNEL::Exception("MEDFileFields::setFieldAtPos : invalid input pointer ! should be different from 0 !");
9400 if(i>=(int)_fields.size())
9401 _fields.resize(i+1);
9402 _fields[i]=field->getContent();
9403 appendGlobs(*field,1e-12);
9406 void MEDFileFields::destroyFieldAtPos(int i) throw(INTERP_KERNEL::Exception)
9408 destroyFieldsAtPos(&i,&i+1);
9411 void MEDFileFields::destroyFieldsAtPos(const int *startIds, const int *endIds) throw(INTERP_KERNEL::Exception)
9413 std::vector<bool> b(_fields.size(),true);
9414 for(const int *i=startIds;i!=endIds;i++)
9416 if(*i<0 || *i>=(int)_fields.size())
9418 std::ostringstream oss; oss << "MEDFileFields::destroyFieldsAtPos : Invalid given id in input (" << *i << ") should be in [0," << _fields.size() << ") !";
9419 throw INTERP_KERNEL::Exception(oss.str().c_str());
9423 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > fields(std::count(b.begin(),b.end(),true));
9425 for(std::size_t i=0;i<_fields.size();i++)
9427 fields[j++]=_fields[i];
9431 void MEDFileFields::destroyFieldsAtPos2(int bg, int end, int step) throw(INTERP_KERNEL::Exception)
9433 static const char msg[]="MEDFileFields::destroyFieldsAtPos2";
9434 int nbOfEntriesToKill=DataArrayInt::GetNumberOfItemGivenBESRelative(bg,end,step,msg);
9435 std::vector<bool> b(_fields.size(),true);
9437 for(int i=0;i<nbOfEntriesToKill;i++,k+=step)
9439 if(k<0 || k>=(int)_fields.size())
9441 std::ostringstream oss; oss << "MEDFileFields::destroyFieldsAtPos2 : Invalid given id in input (" << k << ") should be in [0," << _fields.size() << ") !";
9442 throw INTERP_KERNEL::Exception(oss.str().c_str());
9446 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > fields(std::count(b.begin(),b.end(),true));
9448 for(std::size_t i=0;i<_fields.size();i++)
9450 fields[j++]=_fields[i];
9454 bool MEDFileFields::changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab) throw(INTERP_KERNEL::Exception)
9457 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::iterator it=_fields.begin();it!=_fields.end();it++)
9459 MEDFileAnyTypeFieldMultiTSWithoutSDA *cur(*it);
9461 ret=cur->changeMeshNames(modifTab) || ret;
9467 * \param [in] meshName the name of the mesh that will be renumbered.
9468 * \param [in] oldCode is of format returned by MEDCouplingUMesh::getDistributionOfTypes. And for each *i* oldCode[3*i+2] gives the position (MEDFileUMesh::PutInThirdComponentOfCodeOffset).
9469 * This code corresponds to the distribution of types in the corresponding mesh.
9470 * \param [in] newCode idem to param \a oldCode except that here the new distribution is given.
9471 * \param [in] renumO2N the old to new renumber array.
9472 * \return If true a renumbering has been performed. The structure in \a this has been modified. If false, nothing has been done: it is typically the case if \a meshName is not refered by any
9475 bool MEDFileFields::renumberEntitiesLyingOnMesh(const char *meshName, const std::vector<int>& oldCode, const std::vector<int>& newCode, const DataArrayInt *renumO2N) throw(INTERP_KERNEL::Exception)
9478 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::iterator it=_fields.begin();it!=_fields.end();it++)
9480 MEDFileAnyTypeFieldMultiTSWithoutSDA *fmts(*it);
9483 ret=fmts->renumberEntitiesLyingOnMesh(meshName,oldCode,newCode,renumO2N,*this) || ret;
9489 MEDFileAnyTypeFieldMultiTS *MEDFileFields::getFieldAtPos(int i) const throw(INTERP_KERNEL::Exception)
9491 if(i<0 || i>=(int)_fields.size())
9493 std::ostringstream oss; oss << "MEDFileFields::getFieldAtPos : Invalid given id in input (" << i << ") should be in [0," << _fields.size() << ") !";
9494 throw INTERP_KERNEL::Exception(oss.str().c_str());
9496 const MEDFileAnyTypeFieldMultiTSWithoutSDA *fmts=_fields[i];
9499 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTS> ret;
9500 const MEDFileFieldMultiTSWithoutSDA *fmtsC=dynamic_cast<const MEDFileFieldMultiTSWithoutSDA *>(fmts);
9501 const MEDFileIntFieldMultiTSWithoutSDA *fmtsC2=dynamic_cast<const MEDFileIntFieldMultiTSWithoutSDA *>(fmts);
9503 ret=MEDFileFieldMultiTS::New(*fmtsC,false);
9505 ret=MEDFileIntFieldMultiTS::New(*fmtsC2,false);
9508 std::ostringstream oss; oss << "MEDFileFields::getFieldAtPos : At pos #" << i << " field is neither double (FLOAT64) nor integer (INT32) !";
9509 throw INTERP_KERNEL::Exception(oss.str().c_str());
9511 ret->shallowCpyGlobs(*this);
9516 * Return a shallow copy of \a this reduced to the fields ids defined in [ \a startIds , endIds ).
9517 * This method is accessible in python using __getitem__ with a list in input.
9518 * \return a new object that the caller should deal with.
9520 MEDFileFields *MEDFileFields::buildSubPart(const int *startIds, const int *endIds) const throw(INTERP_KERNEL::Exception)
9522 MEDCouplingAutoRefCountObjectPtr<MEDFileFields> ret=shallowCpy();
9523 std::size_t sz=std::distance(startIds,endIds);
9524 std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> > fields(sz);
9526 for(const int *i=startIds;i!=endIds;i++,j++)
9528 if(*i<0 || *i>=(int)_fields.size())
9530 std::ostringstream oss; oss << "MEDFileFields::buildSubPart : Invalid given id in input (" << *i << ") should be in [0," << _fields.size() << ") !";
9531 throw INTERP_KERNEL::Exception(oss.str().c_str());
9533 fields[j]=_fields[*i];
9535 ret->_fields=fields;
9539 MEDFileAnyTypeFieldMultiTS *MEDFileFields::getFieldWithName(const char *fieldName) const throw(INTERP_KERNEL::Exception)
9541 return getFieldAtPos(getPosFromFieldName(fieldName));
9545 * This method returns a new object containing part of \a this fields lying on mesh name specified by the input parameter \a meshName.
9546 * This method can be seen as a filter applied on \a this, that returns an object containing
9547 * reduced the list of fields compared to those in \a this. The returned object is a new object but the object on which it lies are only
9548 * shallow copied from \a this.
9550 * \param [in] meshName - the name of the mesh on w
9551 * \return a new object that the caller should deal with.
9553 MEDFileFields *MEDFileFields::partOfThisLyingOnSpecifiedMeshName(const char *meshName) const throw(INTERP_KERNEL::Exception)
9555 MEDCouplingAutoRefCountObjectPtr<MEDFileFields> ret=MEDFileFields::New();
9556 ret->shallowCpyOnlyUsedGlobs(*this);
9557 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9559 const MEDFileAnyTypeFieldMultiTSWithoutSDA *cur=(*it);
9562 if(cur->getMeshName()==meshName)
9565 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> cur2(const_cast<MEDFileAnyTypeFieldMultiTSWithoutSDA *>(cur));
9566 ret->_fields.push_back(cur2);
9573 * This method returns a new object containing part of \a this fields lying ** exactly ** on the time steps specified by input parameter \a timeSteps.
9574 * Input time steps are specified using a pair of integer (iteration, order).
9575 * This method can be seen as a filter applied on \a this, that returns an object containing the same number of fields than those in \a this,
9576 * but for each multitimestep only the time steps in \a timeSteps are kept.
9577 * Typically the input parameter \a timeSteps comes from the call of MEDFileFields::getCommonIterations.
9579 * The returned object points to shallow copy of elements in \a this.
9581 * \param [in] timeSteps - the time steps given by a vector of pair of integers (iteration,order)
9582 * \throw If there is a field in \a this that is \b not defined on a time step in the input \a timeSteps.
9583 * \sa MEDFileFields::getCommonIterations, MEDFileFields::partOfThisNotLyingOnSpecifiedTimeSteps
9585 MEDFileFields *MEDFileFields::partOfThisLyingOnSpecifiedTimeSteps(const std::vector< std::pair<int,int> >& timeSteps) const throw(INTERP_KERNEL::Exception)
9587 MEDCouplingAutoRefCountObjectPtr<MEDFileFields> ret=MEDFileFields::New();
9588 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9590 const MEDFileAnyTypeFieldMultiTSWithoutSDA *cur=(*it);
9593 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> elt=cur->partOfThisLyingOnSpecifiedTimeSteps(timeSteps);
9594 ret->_fields.push_back(elt);
9596 ret->shallowCpyOnlyUsedGlobs(*this);
9601 * \sa MEDFileFields::getCommonIterations, MEDFileFields::partOfThisLyingOnSpecifiedTimeSteps
9603 MEDFileFields *MEDFileFields::partOfThisNotLyingOnSpecifiedTimeSteps(const std::vector< std::pair<int,int> >& timeSteps) const throw(INTERP_KERNEL::Exception)
9605 MEDCouplingAutoRefCountObjectPtr<MEDFileFields> ret=MEDFileFields::New();
9606 for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::const_iterator it=_fields.begin();it!=_fields.end();it++)
9608 const MEDFileAnyTypeFieldMultiTSWithoutSDA *cur=(*it);
9611 MEDCouplingAutoRefCountObjectPtr<MEDFileAnyTypeFieldMultiTSWithoutSDA> elt=cur->partOfThisNotLyingOnSpecifiedTimeSteps(timeSteps);
9612 if(elt->getNumberOfTS()!=0)
9613 ret->_fields.push_back(elt);
9615 ret->shallowCpyOnlyUsedGlobs(*this);
9619 MEDFileFieldsIterator *MEDFileFields::iterator() throw(INTERP_KERNEL::Exception)
9621 return new MEDFileFieldsIterator(this);
9624 int MEDFileFields::getPosFromFieldName(const char *fieldName) const throw(INTERP_KERNEL::Exception)
9626 std::string tmp(fieldName);
9627 std::vector<std::string> poss;
9628 for(std::size_t i=0;i<_fields.size();i++)
9630 const MEDFileAnyTypeFieldMultiTSWithoutSDA *f=_fields[i];
9633 std::string fname(f->getName());
9637 poss.push_back(fname);
9640 std::ostringstream oss; oss << "MEDFileFields::getPosFromFieldName : impossible to find field '" << tmp << "' in this ! Possibilities are : ";
9641 std::copy(poss.begin(),poss.end(),std::ostream_iterator<std::string>(oss,", "));
9643 throw INTERP_KERNEL::Exception(oss.str().c_str());
9646 MEDFileFieldsIterator::MEDFileFieldsIterator(MEDFileFields *fs):_fs(fs),_iter_id(0),_nb_iter(0)
9651 _nb_iter=fs->getNumberOfFields();
9655 MEDFileFieldsIterator::~MEDFileFieldsIterator()
9659 MEDFileAnyTypeFieldMultiTS *MEDFileFieldsIterator::nextt()
9661 if(_iter_id<_nb_iter)
9663 MEDFileFields *fs(_fs);
9665 return fs->getFieldAtPos(_iter_id++);