1 // Copyright (C) 2007-2023 CEA, EDF
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
21 #include "MEDFileParameter.hxx"
22 #include "MEDFileSafeCaller.txx"
23 #include "MEDLoaderBase.hxx"
24 #include "MEDFileBasis.hxx"
26 #include "InterpKernelAutoPtr.hxx"
30 using namespace MEDCoupling;
32 MEDFileParameter1TS::MEDFileParameter1TS(int iteration, int order, double time):_iteration(iteration),_order(order),_time(time)
36 MEDFileParameter1TS::MEDFileParameter1TS():_iteration(-1),_order(-1),_time(0.)
40 bool MEDFileParameter1TS::isEqual(const MEDFileParameter1TS *other, double eps, std::string& what) const
42 std::ostringstream oss;
44 { what="Other is null"; return false; }
45 if(_iteration!=other->_iteration)
46 { oss << "iteration number mismatches " << _iteration << " != " << other->_iteration; what=oss.str(); return false; }
47 if(_order!=other->_order)
48 { oss << "order number mismatches " << _iteration << " != " << other->_iteration; what=oss.str(); return false; }
49 if(fabs(_time-other->_time)>eps)
50 { oss << "time mismatches " << _time << " != " << other->_time << " eps=" << eps; what=oss.str(); return false; }
54 MEDFileParameter1TS *MEDFileParameterDouble1TSWTI::deepCopy() const
56 return new MEDFileParameterDouble1TSWTI(*this);
59 bool MEDFileParameterDouble1TSWTI::isEqual(const MEDFileParameter1TS *other, double eps, std::string& what) const
61 if(!MEDFileParameter1TS::isEqual(other,eps,what))
63 const MEDFileParameterDouble1TSWTI *otherC=dynamic_cast<const MEDFileParameterDouble1TSWTI *>(other);
65 { what="IsEqual fails because this is double parameter other no !"; return false; }
66 if(fabs(_arr-otherC->_arr)>eps)
67 { std::ostringstream oss; oss << "value differ " << _arr << " != " << otherC->_arr << " (eps=" << eps << ")"; return false; }
71 std::size_t MEDFileParameterDouble1TSWTI::getHeapMemorySizeWithoutChildren() const
73 return sizeof(MEDFileParameterDouble1TSWTI);
76 std::vector<const BigMemoryObject *> MEDFileParameterDouble1TSWTI::getDirectChildrenWithNull() const
78 return std::vector<const BigMemoryObject *>();
81 std::string MEDFileParameterDouble1TSWTI::simpleRepr() const
83 std::ostringstream oss;
88 void MEDFileParameterDouble1TSWTI::simpleRepr2(int bkOffset, std::ostream& oss) const
90 std::string startOfLine(bkOffset,' ');
91 oss << startOfLine << "ParameterDoubleItem with (iteration,order) = (" << _iteration << "," << _order << ")" << std::endl;
92 oss << startOfLine << "Time associacited = " << _time << std::endl;
93 oss << startOfLine << "The value is ***** " << _arr << " *****" << std::endl;
96 MEDFileParameterDouble1TSWTI *MEDFileParameterDouble1TSWTI::New(int iteration, int order, double time)
98 return new MEDFileParameterDouble1TSWTI(iteration,order,time);
101 MEDFileParameterDouble1TSWTI::MEDFileParameterDouble1TSWTI():_arr(std::numeric_limits<double>::max())
105 MEDFileParameterDouble1TSWTI::MEDFileParameterDouble1TSWTI(int iteration, int order, double time):MEDFileParameter1TS(iteration,order,time)
109 void MEDFileParameterDouble1TSWTI::finishLoading(med_idt fid, const std::string& name, int dt, int it, int nbOfSteps)
111 std::ostringstream oss; oss << "MEDFileParameterDouble1TS::finishLoading : no specified time step (" << dt << "," << it << ") ! Time steps available : ";
112 for(int i=0;i<nbOfSteps;i++)
116 MEDFILESAFECALLERRD0(MEDparameterComputationStepInfo,(fid,name.c_str(),i+1,&locDt,&locIt,&tim));
117 if(dt==locDt && it==locIt)
119 _iteration=FromMedInt<int>(locDt); _order=FromMedInt<int>(locIt); _time=tim;
120 MEDFILESAFECALLERRD0(MEDparameterValueRd,(fid,name.c_str(),_iteration,_order,reinterpret_cast<unsigned char *const>(&_arr)));
125 oss << "(" << locDt << "," << locIt << ")";
130 throw INTERP_KERNEL::Exception(oss.str().c_str());
133 void MEDFileParameterDouble1TSWTI::readValue(med_idt fid, const std::string& name)
135 MEDFILESAFECALLERRD0(MEDparameterValueRd,(fid,name.c_str(),_iteration,_order,reinterpret_cast<unsigned char *const>(&_arr)));
138 void MEDFileParameterDouble1TSWTI::finishLoading(med_idt fid, const std::string& name, int timeStepId)
142 MEDFILESAFECALLERRD0(MEDparameterComputationStepInfo,(fid,name.c_str(),timeStepId+1,&locDt,&locIt,&dt));
143 _iteration=FromMedInt<int>(locDt); _order=FromMedInt<int>(locIt); _time=dt;
144 MEDFILESAFECALLERRD0(MEDparameterValueRd,(fid,name.c_str(),_iteration,_order,reinterpret_cast<unsigned char *const>(&_arr)));
147 void MEDFileParameterDouble1TSWTI::writeAdvanced(med_idt fid, const std::string& name, const MEDFileWritable& mw) const
149 char nameW[MED_NAME_SIZE+1];
150 MEDLoaderBase::safeStrCpy(name.c_str(),MED_NAME_SIZE,nameW,mw.getTooLongStrPolicy());
151 MEDFILESAFECALLERWR0(MEDparameterValueWr,(fid,nameW,_iteration,_order,_time,reinterpret_cast<const unsigned char *>(&_arr)));
154 std::size_t MEDFileParameterTinyInfo::getHeapMemSizeOfStrings() const
156 return _dt_unit.capacity()+_name.capacity()+_desc_name.capacity();
159 bool MEDFileParameterTinyInfo::isEqualStrings(const MEDFileParameterTinyInfo& other, std::string& what) const
161 std::ostringstream oss;
162 if(_name!=other._name)
163 { oss << "name differ ! this=" << _name << " and other=" << other._name; what=oss.str(); return false; }
164 if(_desc_name!=other._desc_name)
165 { oss << "name differ ! this=" << _desc_name << " and other=" << other._desc_name; what=oss.str(); return false; }
166 if(_dt_unit!=other._dt_unit)
167 { oss << "unit of time differ ! this=" << _dt_unit << " and other=" << other._dt_unit; what=oss.str(); return false; }
171 void MEDFileParameterTinyInfo::writeLLHeader(med_idt fid, med_parameter_type typ) const
173 char nameW[MED_NAME_SIZE+1],descW[MED_COMMENT_SIZE+1],dtunitW[MED_SNAME_SIZE+1];
174 MEDLoaderBase::safeStrCpy(_name.c_str(),MED_NAME_SIZE,nameW,getTooLongStrPolicy());
175 MEDLoaderBase::safeStrCpy(_desc_name.c_str(),MED_COMMENT_SIZE,descW,getTooLongStrPolicy());
176 MEDLoaderBase::safeStrCpy(_dt_unit.c_str(),MED_SNAME_SIZE,dtunitW,getTooLongStrPolicy());
177 MEDFILESAFECALLERWR0(MEDparameterCr,(fid,nameW,typ,descW,dtunitW));
180 void MEDFileParameterTinyInfo::mainRepr(int bkOffset, std::ostream& oss) const
182 std::string startOfLine(bkOffset,' ');
183 oss << startOfLine << "Parameter with name \"" << _name << "\"" << std::endl;
184 oss << startOfLine << "Parameter with description \"" << _desc_name << "\"" << std::endl;
185 oss << startOfLine << "Parameter with unit name \"" << _dt_unit << "\"" << std::endl;
188 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New()
190 return new MEDFileParameterDouble1TS;
193 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New(const std::string& fileName)
195 return new MEDFileParameterDouble1TS(fileName);
198 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New(const std::string& fileName, const std::string& paramName)
200 return new MEDFileParameterDouble1TS(fileName,paramName);
203 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New(const std::string& fileName, const std::string& paramName, int dt, int it)
205 return new MEDFileParameterDouble1TS(fileName,paramName,dt,it);
208 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS()
212 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS(const std::string& fileName, const std::string& paramName, int dt, int it)
214 MEDFileUtilities::CheckFileForRead(fileName);
215 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),MED_ACC_RDONLY);
216 med_int nbPar=MEDnParameter(fid);
217 std::ostringstream oss; oss << "MEDFileParameterDouble1TS : no double param name \"" << paramName << "\" ! Double Parameters available are : ";
218 INTERP_KERNEL::AutoPtr<char> pName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
219 INTERP_KERNEL::AutoPtr<char> descName=MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE);
220 INTERP_KERNEL::AutoPtr<char> unitName=MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE);
221 med_parameter_type paramType;
222 for(int i=0;i<nbPar;i++)
225 MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,¶mType,descName,unitName,&nbOfSteps));
226 std::string paramNameCpp=MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE);
227 if(paramNameCpp==paramName && paramType==MED_FLOAT64)
229 _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
231 _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
232 finishLoading(fid,_name,dt,it,FromMedInt<int>(nbOfSteps));
238 if(i!=nbPar-1) oss << ", ";
241 throw INTERP_KERNEL::Exception(oss.str().c_str());
244 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS(const std::string& fileName, const std::string& paramName)
246 MEDFileUtilities::CheckFileForRead(fileName);
247 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),MED_ACC_RDONLY);
248 med_int nbPar=MEDnParameter(fid);
249 std::ostringstream oss; oss << "MEDFileParameterDouble1TS : no double param name \"" << paramName << "\" ! Double Parameters available are : ";
250 INTERP_KERNEL::AutoPtr<char> pName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
251 INTERP_KERNEL::AutoPtr<char> descName=MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE);
252 INTERP_KERNEL::AutoPtr<char> unitName=MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE);
253 med_parameter_type paramType;
254 for(int i=0;i<nbPar;i++)
257 MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,¶mType,descName,unitName,&nbOfSteps));
258 std::string paramNameCpp=MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE);
259 if(paramNameCpp==paramName && paramType==MED_FLOAT64)
263 _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
265 _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
266 finishLoading(fid,_name,0);
271 std::ostringstream oss2; oss2 << "Param name \"" << paramName << "\" exists but no time steps on it !";
272 throw INTERP_KERNEL::Exception(oss2.str().c_str());
278 if(i!=nbPar-1) oss << ", ";
281 throw INTERP_KERNEL::Exception(oss.str().c_str());
284 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS(const std::string& fileName)
286 MEDFileUtilities::CheckFileForRead(fileName);
287 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),MED_ACC_RDONLY);
288 med_int nbPar=MEDnParameter(fid);
291 std::ostringstream oss2; oss2 << "No parameter in file \"" << fileName << "\" !";
292 throw INTERP_KERNEL::Exception(oss2.str().c_str());
294 INTERP_KERNEL::AutoPtr<char> pName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
295 INTERP_KERNEL::AutoPtr<char> descName=MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE);
296 INTERP_KERNEL::AutoPtr<char> unitName=MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE);
297 med_parameter_type paramType;
299 MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,1,pName,¶mType,descName,unitName,&nbOfSteps));
300 std::string paramNameCpp=MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE);
301 if(paramType==MED_FLOAT64)
305 _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
307 _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
308 finishLoading(fid,_name,0);
313 std::ostringstream oss2; oss2 << "Double param name \"" << paramNameCpp << "\" exists in file \""<< fileName << "\"but no time steps on it !";
314 throw INTERP_KERNEL::Exception(oss2.str().c_str());
319 std::ostringstream oss2; oss2 << "First parameter in file \"" << fileName << "\" is not double !";
320 throw INTERP_KERNEL::Exception(oss2.str().c_str());
324 bool MEDFileParameterDouble1TS::isEqual(const MEDFileParameter1TS *other, double eps, std::string& what) const
326 if(!MEDFileParameterDouble1TSWTI::isEqual(other,eps,what))
328 const MEDFileParameterDouble1TS *otherC=dynamic_cast<const MEDFileParameterDouble1TS *>(other);
330 { what="Other is not of type MEDFileParameterDouble1TS as this"; return false; }
331 if(!isEqualStrings(*otherC,what))
336 MEDFileParameter1TS *MEDFileParameterDouble1TS::deepCopy() const
338 return new MEDFileParameterDouble1TS(*this);
341 std::string MEDFileParameterDouble1TS::simpleRepr() const
343 std::ostringstream oss;
344 MEDFileParameterTinyInfo::mainRepr(0,oss);
345 MEDFileParameterDouble1TSWTI::simpleRepr2(0,oss);
349 std::size_t MEDFileParameterDouble1TS::getHeapMemorySizeWithoutChildren() const
351 return getHeapMemSizeOfStrings()+sizeof(MEDFileParameterDouble1TS);
354 std::vector<const BigMemoryObject *> MEDFileParameterDouble1TS::getDirectChildrenWithNull() const
356 return std::vector<const BigMemoryObject *>();
359 void MEDFileParameterDouble1TS::write(const std::string& fileName, int mode) const
361 med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
362 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),medmod);
363 MEDFileParameterTinyInfo::writeLLHeader(fid,MED_FLOAT64);
364 MEDFileParameterDouble1TSWTI::writeAdvanced(fid,_name,*this);
367 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New()
369 return new MEDFileParameterMultiTS;
372 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(const std::string& fileName)
374 MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
378 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(med_idt fid)
380 return new MEDFileParameterMultiTS(fid);
383 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(const std::string& fileName, const std::string& paramName)
385 MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
386 return New(fid,paramName);
389 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(med_idt fid, const std::string& paramName)
391 return new MEDFileParameterMultiTS(fid,paramName);
394 MEDFileParameterMultiTS::MEDFileParameterMultiTS()
398 MEDFileParameterMultiTS::MEDFileParameterMultiTS(const MEDFileParameterMultiTS& other, bool deepCopy):MEDFileParameterTinyInfo(other),_param_per_ts(other._param_per_ts)
401 for(std::size_t i=0;i<_param_per_ts.size();i++)
403 const MEDFileParameter1TS *elt=_param_per_ts[i];
405 _param_per_ts[i]=elt->deepCopy();
409 MEDFileParameterMultiTS::MEDFileParameterMultiTS(med_idt fid)
411 med_int nbPar(MEDnParameter(fid));
414 std::ostringstream oss; oss << "MEDFileParameterMultiTS : no parameter in file \"" << FileNameFromFID(fid) << "\" !" ;
415 throw INTERP_KERNEL::Exception(oss.str().c_str());
417 INTERP_KERNEL::AutoPtr<char> pName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
418 INTERP_KERNEL::AutoPtr<char> descName(MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE));
419 INTERP_KERNEL::AutoPtr<char> unitName(MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE));
420 med_parameter_type paramType;
422 MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,1,pName,¶mType,descName,unitName,&nbOfSteps));
423 std::string paramNameCpp(MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE));
424 _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
426 _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
427 finishLoading(fid,paramType,FromMedInt<int>(nbOfSteps));
430 MEDFileParameterMultiTS::MEDFileParameterMultiTS(med_idt fid, const std::string& paramName)
432 med_int nbPar(MEDnParameter(fid));
433 std::ostringstream oss; oss << "MEDFileParameterDouble1TS : no double param name \"" << paramName << "\" ! Double Parameters available are : ";
434 INTERP_KERNEL::AutoPtr<char> pName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
435 INTERP_KERNEL::AutoPtr<char> descName(MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE));
436 INTERP_KERNEL::AutoPtr<char> unitName(MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE));
437 med_parameter_type paramType;
438 for(int i=0;i<nbPar;i++)
441 MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,¶mType,descName,unitName,&nbOfSteps));
442 std::string paramNameCpp(MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE));
443 if(paramNameCpp==paramName)
447 _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
449 _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
450 finishLoading(fid,paramType,FromMedInt<int>(nbOfSteps));
455 std::ostringstream oss2; oss2 << "Param name \"" << paramName << "\" exists but no time steps on it !";
456 throw INTERP_KERNEL::Exception(oss2.str().c_str());
462 if(i!=nbPar-1) oss << ", ";
465 throw INTERP_KERNEL::Exception(oss.str().c_str());
468 void MEDFileParameterMultiTS::finishLoading(med_idt fid, med_parameter_type typ, int nbOfSteps)
470 _param_per_ts.resize(nbOfSteps);
471 for(int i=0;i<nbOfSteps;i++)
475 MEDFILESAFECALLERRD0(MEDparameterComputationStepInfo,(fid,_name.c_str(),i+1,&dt,&it,&tim));
479 _param_per_ts[i]=MEDFileParameterDouble1TSWTI::New(FromMedInt<int>(dt),FromMedInt<int>(it),tim);
480 _param_per_ts[i]->readValue(fid,_name.c_str());
486 throw INTERP_KERNEL::Exception("MEDFileParameterMultiTS::finishLoading : supporting only FLOAT64 !");
491 std::size_t MEDFileParameterMultiTS::getHeapMemorySizeWithoutChildren() const
493 std::size_t ret(sizeof(MEDFileParameterMultiTS));
494 ret+=sizeof(MCAuto<MEDFileParameter1TS>)*_param_per_ts.capacity();
498 std::vector<const BigMemoryObject *> MEDFileParameterMultiTS::getDirectChildrenWithNull() const
500 std::vector<const BigMemoryObject *> ret;
501 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
502 ret.push_back((const MEDFileParameter1TS *)*it);
506 MEDFileParameterMultiTS *MEDFileParameterMultiTS::deepCopy() const
508 return new MEDFileParameterMultiTS(*this,true);
511 bool MEDFileParameterMultiTS::isEqual(const MEDFileParameterMultiTS *other, double eps, std::string& what) const
514 { what="other is null !"; return false; }
515 if(_param_per_ts.size()!=other->_param_per_ts.size())
516 { what="number of time steps differs !"; return false; }
517 std::ostringstream oss;
518 for(std::size_t i=0;i<_param_per_ts.size();i++)
520 const MEDFileParameter1TS *a(_param_per_ts[i]),*b(other->_param_per_ts[i]);
521 if((a && !b) || (!a && b))
522 { oss << "At time step id #" << i << " pointer is defined on one side not in the other !"; what=oss.str(); return false; }
524 if(!a->isEqual(b,eps,what))
525 { oss << " At time step id #" << i << " non equality !"; what+=oss.str(); return false; }
530 void MEDFileParameterMultiTS::write(const std::string& fileName, int mode) const
532 med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
533 MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),medmod);
534 writeAdvanced(fid,*this);
537 void MEDFileParameterMultiTS::writeAdvanced(med_idt fid, const MEDFileWritable& mw) const
539 std::set<med_parameter_type> diffType;
540 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
542 const MEDFileParameter1TS *elt(*it);
543 if(dynamic_cast<const MEDFileParameterDouble1TSWTI *>(elt))
544 diffType.insert(MED_FLOAT64);
546 if(diffType.size()>1)
547 throw INTERP_KERNEL::Exception("MEDFileParameterMultiTS::writeAdvanced : impossible to mix type of data in parameters in MED file ! Only float64 or only int32 ...");
550 med_parameter_type typ(*diffType.begin());
551 MEDFileParameterTinyInfo::writeLLHeader(fid,typ);
552 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
554 const MEDFileParameter1TS *elt(*it);
556 elt->writeAdvanced(fid,_name,mw);
560 std::string MEDFileParameterMultiTS::simpleRepr() const
562 std::ostringstream oss;
567 void MEDFileParameterMultiTS::simpleRepr2(int bkOffset, std::ostream& oss) const
569 MEDFileParameterTinyInfo::mainRepr(bkOffset,oss);
570 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
572 const MEDFileParameter1TS *elt(*it);
574 elt->simpleRepr2(bkOffset+2,oss);
578 void MEDFileParameterMultiTS::appendValue(int dt, int it, double time, double val)
580 MCAuto<MEDFileParameterDouble1TSWTI> elt=MEDFileParameterDouble1TSWTI::New(dt,it,time);
582 MCAuto<MEDFileParameter1TS> elt2((MEDFileParameterDouble1TSWTI*)elt); elt2->incrRef();
583 _param_per_ts.push_back(elt2);
586 double MEDFileParameterMultiTS::getDoubleValue(int iteration, int order) const
588 int pos=getPosOfTimeStep(iteration,order);
589 const MEDFileParameter1TS *elt=_param_per_ts[pos];
592 std::ostringstream oss; oss << "MEDFileParameterMultiTS::getDoubleValue : time iteration it=" << iteration << " order=" << order;
593 oss << " exists but elt is empty !";
594 throw INTERP_KERNEL::Exception(oss.str().c_str());
596 const MEDFileParameterDouble1TSWTI *eltC=dynamic_cast<const MEDFileParameterDouble1TSWTI *>(elt);
599 std::ostringstream oss; oss << "MEDFileParameterMultiTS::getDoubleValue : time iteration it=" << iteration << " order=" << order;
600 oss << " exists but not double !";
602 return eltC->getValue();
605 int MEDFileParameterMultiTS::getPosOfTimeStep(int iteration, int order) const
608 std::ostringstream oss; oss << "MEDFileParameterMultiTS::getPosOfTimeStep : no such iteration=" << iteration << " order=" << order << " ! Possibilities are :";
609 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++,ret++)
611 const MEDFileParameter1TS *elt(*it);
614 if(elt->getIteration()==iteration && elt->getOrder()==order)
617 oss << "(" << elt->getIteration() << "," << elt->getOrder() << "), ";
620 throw INTERP_KERNEL::Exception(oss.str().c_str());
623 int MEDFileParameterMultiTS::getPosGivenTime(double time, double eps) const
626 std::ostringstream oss; oss << "MEDFileParameterMultiTS::getPosGivenTime : no such time=" << time << " ! Possibilities are :";
627 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++,ret++)
629 const MEDFileParameter1TS *elt(*it);
632 if(fabs(elt->getTimeValue()-time)<=eps)
635 oss << elt->getTimeValue() << ", ";
638 throw INTERP_KERNEL::Exception(oss.str().c_str());
642 * \return an internal pointer that can be null. Warning the caller is \b not responsible of the returned pointer.
644 MEDFileParameter1TS *MEDFileParameterMultiTS::getTimeStepAtPos(int posId) const
646 if(posId<0 || posId>=(int)_param_per_ts.size())
648 std::ostringstream oss; oss << "MEDFileParameterMultiTS::getTimeStepAtPos : invalid pos ! Should be in [0," << _param_per_ts.size() << ") !";
649 throw INTERP_KERNEL::Exception(oss.str().c_str());
651 return const_cast<MEDFileParameter1TS *>(static_cast<const MEDFileParameter1TS *>(_param_per_ts[posId]));
654 void MEDFileParameterMultiTS::eraseTimeStepIds(const int *startIds, const int *endIds)
656 std::vector<bool> b(_param_per_ts.size(),true);
657 int len=(int)_param_per_ts.size();
658 for(const int *w=startIds;w!=endIds;w++)
663 std::ostringstream oss; oss << "MEDFileParameterMultiTS::eraseTimeStepIds : At pos #" << std::distance(startIds,w) << " value is " << *w << " should be in [0," << len << ") !"; throw INTERP_KERNEL::Exception(oss.str().c_str());
665 std::size_t newNb=std::count(b.begin(),b.end(),true);
666 std::vector< MCAuto<MEDFileParameter1TS> > paramPerTs(newNb);
668 for(std::size_t i=0;i<_param_per_ts.size();i++)
670 paramPerTs[j++]=_param_per_ts[i];
671 _param_per_ts=paramPerTs;
674 int MEDFileParameterMultiTS::getNumberOfTS() const
676 return (int) getIterations().size();
679 std::vector< std::pair<int,int> > MEDFileParameterMultiTS::getIterations() const
681 std::vector< std::pair<int,int> > ret;
682 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
684 const MEDFileParameter1TS *elt(*it);
686 ret.push_back(std::pair<int,int>(elt->getIteration(),elt->getOrder()));
692 * \param [out] ret1 - list of available timesteps
694 std::vector< std::pair<int,int> > MEDFileParameterMultiTS::getTimeSteps(std::vector<double>& ret1) const
696 std::vector< std::pair<int,int> > ret0;
698 for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
700 const MEDFileParameter1TS *elt(*it);
703 ret0.push_back(std::pair<int,int>(elt->getIteration(),elt->getOrder()));
704 ret1.push_back(elt->getTimeValue());
710 MEDFileParameters *MEDFileParameters::New()
712 return new MEDFileParameters;
715 MEDFileParameters *MEDFileParameters::New(const std::string& fileName)
717 MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
721 MEDFileParameters *MEDFileParameters::New(med_idt fid)
723 return new MEDFileParameters(fid);
726 MEDFileParameters::MEDFileParameters(med_idt fid)
728 med_int nbPar=MEDnParameter(fid);
729 _params.resize(nbPar);
730 INTERP_KERNEL::AutoPtr<char> pName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
731 INTERP_KERNEL::AutoPtr<char> descName(MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE));
732 INTERP_KERNEL::AutoPtr<char> unitName(MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE));
733 med_parameter_type paramType;
734 for(int i=0;i<nbPar;i++)
737 MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,¶mType,descName,unitName,&nbOfSteps));
738 std::string paramNameCpp(MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE));
739 _params[i]=MEDFileParameterMultiTS::New(fid,paramNameCpp);
743 MEDFileParameters::MEDFileParameters()
747 std::size_t MEDFileParameters::getHeapMemorySizeWithoutChildren() const
749 std::size_t ret(sizeof(MEDFileParameters));
750 ret+=sizeof(MCAuto<MEDFileParameterMultiTS>)*_params.capacity();
754 std::vector<const BigMemoryObject *> MEDFileParameters::getDirectChildrenWithNull() const
756 std::vector<const BigMemoryObject *> ret;
757 for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++)
758 ret.push_back((const MEDFileParameterMultiTS *)*it);
762 MEDFileParameters *MEDFileParameters::deepCopy() const
764 return new MEDFileParameters(*this,true);
767 bool MEDFileParameters::isEqual(const MEDFileParameters *other, double eps, std::string& what) const
770 { what="other is null !"; return false; }
771 if(_params.size()!=other->_params.size())
772 { what="number of parameters differs !"; return false; }
773 std::ostringstream oss;
774 for(std::size_t i=0;i<_params.size();i++)
776 const MEDFileParameterMultiTS *a(_params[i]),*b(other->_params[i]);
777 if((a && !b) || (!a && b))
778 { oss << "At param with id #" << i << " pointer is defined on one side not in the other !"; what=oss.str(); return false; }
780 if(!a->isEqual(b,eps,what))
781 { oss << " At param with id #" << i << " non equality !"; what+=oss.str(); return false; }
786 MEDFileParameters::MEDFileParameters(const MEDFileParameters& other, bool deepCopy):MEDFileWritableStandAlone(other),_params(other._params)
789 for(std::size_t i=0;i<_params.size();i++)
791 const MEDFileParameterMultiTS *elt=_params[i];
793 _params[i]=elt->deepCopy();
797 void MEDFileParameters::writeLL(med_idt fid) const
799 for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++)
801 const MEDFileParameterMultiTS *elt(*it);
803 elt->writeAdvanced(fid,*this);
807 std::vector<std::string> MEDFileParameters::getParamsNames() const
809 std::vector<std::string> ret(_params.size());
811 for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++,i++)
813 const MEDFileParameterMultiTS *p=(*it);
820 std::ostringstream oss; oss << "MEDFileParameters::getParamsNames : At rank #" << i << " param is not defined !";
821 throw INTERP_KERNEL::Exception(oss.str().c_str());
827 std::string MEDFileParameters::simpleRepr() const
829 std::ostringstream oss;
830 simpleReprWithoutHeader(oss);
834 void MEDFileParameters::simpleReprWithoutHeader(std::ostream& oss) const
836 for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++)
838 const MEDFileParameterMultiTS *elt(*it);
840 elt->simpleRepr2(2,oss);
844 void MEDFileParameters::resize(int newSize)
847 throw INTERP_KERNEL::Exception("MEDFileParameters::resize : should be positive !");
848 _params.resize(newSize);
851 void MEDFileParameters::pushParam(MEDFileParameterMultiTS *param)
855 MCAuto<MEDFileParameterMultiTS> elt(param);
856 _params.push_back(elt);
859 void MEDFileParameters::setParamAtPos(int i, MEDFileParameterMultiTS *param)
862 throw INTERP_KERNEL::Exception("MEDFileParameters::setParamAtPos : should be positive !");
863 if(i>=(int)_params.size())
867 MCAuto<MEDFileParameterMultiTS> elt(param);
872 * \return an internal pointer that can be null. Warning the caller is \b not responsible of the returned pointer.
874 MEDFileParameterMultiTS *MEDFileParameters::getParamAtPos(int i) const
876 if(i<0 || i>=(int)_params.size())
878 std::ostringstream oss; oss << "MEDFileParameters::getParamAtPos : should be in [0," << _params.size() << ") !";
879 throw INTERP_KERNEL::Exception(oss.str().c_str());
881 const MEDFileParameterMultiTS *elt=_params[i];
882 return const_cast<MEDFileParameterMultiTS *>(elt);
886 * \return an internal pointer that can be null. Warning the caller is \b not responsible of the returned pointer.
888 MEDFileParameterMultiTS *MEDFileParameters::getParamWithName(const std::string& paramName) const
890 int pos=getPosFromParamName(paramName);
891 return getParamAtPos(pos);
894 void MEDFileParameters::destroyParamAtPos(int i)
896 if(i<0 || i>=(int)_params.size())
898 std::ostringstream oss; oss << "MEDFileParameters::destroyParamAtPos : should be in [0," << _params.size() << ") !";
899 throw INTERP_KERNEL::Exception(oss.str().c_str());
901 _params[i]=MCAuto<MEDFileParameterMultiTS>(0);
904 int MEDFileParameters::getPosFromParamName(const std::string& paramName) const
906 std::ostringstream oss; oss << "MEDFileParameters::getPosFromParamName : no such name=" << paramName << " ! Possibilities are :";
908 for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++,ret++)
910 const MEDFileParameterMultiTS *elt(*it);
913 if(std::string(elt->getName())==paramName)
916 oss << elt->getName() << ", ";
919 throw INTERP_KERNEL::Exception(oss.str().c_str());
922 int MEDFileParameters::getNumberOfParams() const
924 return (int)_params.size();