Salome HOME
Useful ConvertMEDFileTo30 tool to change version of a file.
[tools/medcoupling.git] / src / MEDLoader / MEDFileParameter.cxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay (CEA/DEN)
20
21 #include "MEDFileParameter.hxx"
22 #include "MEDFileSafeCaller.txx"
23 #include "MEDLoaderBase.hxx"
24
25 #include "InterpKernelAutoPtr.hxx"
26
27 #include <set>
28
29 using namespace MEDCoupling;
30
31 MEDFileParameter1TS::MEDFileParameter1TS(int iteration, int order, double time):_iteration(iteration),_order(order),_time(time)
32 {
33 }
34
35 MEDFileParameter1TS::MEDFileParameter1TS():_iteration(-1),_order(-1),_time(0.)
36 {
37 }
38
39 bool MEDFileParameter1TS::isEqual(const MEDFileParameter1TS *other, double eps, std::string& what) const
40 {
41   std::ostringstream oss;
42   if(!other)
43     { what="Other is null"; return false; }
44   if(_iteration!=other->_iteration)
45     { oss << "iteration number mismatches " << _iteration << " != " << other->_iteration; what=oss.str(); return false; }
46   if(_order!=other->_order)
47     { oss << "order number mismatches " << _iteration << " != " << other->_iteration; what=oss.str(); return false; }
48   if(fabs(_time-other->_time)>eps)
49     { oss << "time mismatches " << _time << " != " << other->_time << " eps=" << eps; what=oss.str(); return false; }
50   return true;
51 }
52
53 MEDFileParameter1TS *MEDFileParameterDouble1TSWTI::deepCopy() const
54 {
55   return new MEDFileParameterDouble1TSWTI(*this);
56 }
57
58 bool MEDFileParameterDouble1TSWTI::isEqual(const MEDFileParameter1TS *other, double eps, std::string& what) const
59 {
60   if(!MEDFileParameter1TS::isEqual(other,eps,what))
61     return false;
62   const MEDFileParameterDouble1TSWTI *otherC=dynamic_cast<const MEDFileParameterDouble1TSWTI *>(other);
63   if(!otherC)
64     { what="IsEqual fails because this is double parameter other no !"; return false; }
65   if(fabs(_arr-otherC->_arr)>eps)
66     { std::ostringstream oss; oss << "value differ " << _arr << " != " << otherC->_arr << " (eps=" << eps << ")"; return false; }
67   return true;
68 }
69
70 std::size_t MEDFileParameterDouble1TSWTI::getHeapMemorySizeWithoutChildren() const
71 {
72   return sizeof(MEDFileParameterDouble1TSWTI);
73 }
74
75 std::vector<const BigMemoryObject *> MEDFileParameterDouble1TSWTI::getDirectChildrenWithNull() const
76 {
77   return std::vector<const BigMemoryObject *>();
78 }
79
80 std::string MEDFileParameterDouble1TSWTI::simpleRepr() const
81 {
82   std::ostringstream oss;
83   simpleRepr2(0,oss);
84   return oss.str();
85 }
86
87 void MEDFileParameterDouble1TSWTI::simpleRepr2(int bkOffset, std::ostream& oss) const
88 {
89   std::string startOfLine(bkOffset,' ');
90   oss << startOfLine << "ParameterDoubleItem with (iteration,order) = (" << _iteration << "," << _order << ")" << std::endl;
91   oss << startOfLine << "Time associacited = " << _time << std::endl;
92   oss << startOfLine << "The value is ***** " << _arr <<  " *****" << std::endl;
93 }
94
95 MEDFileParameterDouble1TSWTI *MEDFileParameterDouble1TSWTI::New(int iteration, int order, double time)
96 {
97   return new MEDFileParameterDouble1TSWTI(iteration,order,time);
98 }
99
100 MEDFileParameterDouble1TSWTI::MEDFileParameterDouble1TSWTI():_arr(std::numeric_limits<double>::max())
101 {
102 }
103
104 MEDFileParameterDouble1TSWTI::MEDFileParameterDouble1TSWTI(int iteration, int order, double time):MEDFileParameter1TS(iteration,order,time)
105 {
106 }
107
108 void MEDFileParameterDouble1TSWTI::finishLoading(med_idt fid, const std::string& name, int dt, int it, int nbOfSteps)
109 {
110   std::ostringstream oss; oss << "MEDFileParameterDouble1TS::finishLoading : no specified time step (" << dt << "," << it << ") ! Time steps available : ";
111   for(int i=0;i<nbOfSteps;i++)
112     {
113       int locDt,locIt;
114       double tim;
115       MEDFILESAFECALLERRD0(MEDparameterComputationStepInfo,(fid,name.c_str(),i+1,&locDt,&locIt,&tim));
116       if(dt==locDt && it==locIt)
117         {
118           _iteration=locDt; _order=locIt; _time=tim;
119           MEDFILESAFECALLERRD0(MEDparameterValueRd,(fid,name.c_str(),_iteration,_order,reinterpret_cast<unsigned char *const>(&_arr)));
120           return ;
121         }
122       else
123         {
124           oss << "(" << locDt << "," << locIt << ")";
125           if(i!=nbOfSteps-1)
126             oss << ", ";
127         }
128     }
129   throw INTERP_KERNEL::Exception(oss.str().c_str());
130 }
131
132 void MEDFileParameterDouble1TSWTI::readValue(med_idt fid, const std::string& name)
133 {
134   MEDFILESAFECALLERRD0(MEDparameterValueRd,(fid,name.c_str(),_iteration,_order,reinterpret_cast<unsigned char *const>(&_arr)));
135 }
136
137 void MEDFileParameterDouble1TSWTI::finishLoading(med_idt fid, const std::string& name, int timeStepId)
138 {
139   int locDt,locIt;
140   double dt;
141   MEDFILESAFECALLERRD0(MEDparameterComputationStepInfo,(fid,name.c_str(),timeStepId+1,&locDt,&locIt,&dt));
142   _iteration=locDt; _order=locIt; _time=dt;
143   MEDFILESAFECALLERRD0(MEDparameterValueRd,(fid,name.c_str(),_iteration,_order,reinterpret_cast<unsigned char *const>(&_arr)));
144 }
145
146 void MEDFileParameterDouble1TSWTI::writeAdvanced(med_idt fid, const std::string& name, const MEDFileWritable& mw) const
147 {
148   char nameW[MED_NAME_SIZE+1];
149   MEDLoaderBase::safeStrCpy(name.c_str(),MED_NAME_SIZE,nameW,mw.getTooLongStrPolicy());
150   MEDFILESAFECALLERWR0(MEDparameterValueWr,(fid,nameW,_iteration,_order,_time,reinterpret_cast<const unsigned char *>(&_arr)));
151 }
152
153 std::size_t MEDFileParameterTinyInfo::getHeapMemSizeOfStrings() const
154 {
155   return _dt_unit.capacity()+_name.capacity()+_desc_name.capacity();
156 }
157
158 bool MEDFileParameterTinyInfo::isEqualStrings(const MEDFileParameterTinyInfo& other, std::string& what) const
159 {
160   std::ostringstream oss;
161   if(_name!=other._name)
162     { oss << "name differ ! this=" << _name << " and other=" << other._name; what=oss.str(); return false; }
163   if(_desc_name!=other._desc_name)
164     { oss << "name differ ! this=" << _desc_name << " and other=" << other._desc_name; what=oss.str(); return false; }
165   if(_dt_unit!=other._dt_unit)
166     { oss << "unit of time differ ! this=" << _dt_unit << " and other=" << other._dt_unit; what=oss.str(); return false; }
167   return true;
168 }
169
170 void MEDFileParameterTinyInfo::writeLLHeader(med_idt fid, med_parameter_type typ) const
171 {
172   char nameW[MED_NAME_SIZE+1],descW[MED_COMMENT_SIZE+1],dtunitW[MED_SNAME_SIZE+1];
173   MEDLoaderBase::safeStrCpy(_name.c_str(),MED_NAME_SIZE,nameW,getTooLongStrPolicy());
174   MEDLoaderBase::safeStrCpy(_desc_name.c_str(),MED_COMMENT_SIZE,descW,getTooLongStrPolicy());
175   MEDLoaderBase::safeStrCpy(_dt_unit.c_str(),MED_SNAME_SIZE,dtunitW,getTooLongStrPolicy());
176   MEDFILESAFECALLERWR0(MEDparameterCr,(fid,nameW,typ,descW,dtunitW));
177 }
178
179 void MEDFileParameterTinyInfo::mainRepr(int bkOffset, std::ostream& oss) const
180 {
181   std::string startOfLine(bkOffset,' ');
182   oss << startOfLine << "Parameter with name \"" << _name << "\"" << std::endl;
183   oss << startOfLine << "Parameter with description \"" << _desc_name << "\"" << std::endl;
184   oss << startOfLine << "Parameter with unit name \"" << _dt_unit << "\"" << std::endl;
185 }
186
187 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New()
188 {
189   return new MEDFileParameterDouble1TS;
190 }
191
192 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New(const std::string& fileName)
193 {
194   return new MEDFileParameterDouble1TS(fileName);
195 }
196
197 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New(const std::string& fileName, const std::string& paramName)
198 {
199   return new MEDFileParameterDouble1TS(fileName,paramName);
200 }
201
202 MEDFileParameterDouble1TS *MEDFileParameterDouble1TS::New(const std::string& fileName, const std::string& paramName, int dt, int it)
203 {
204   return new MEDFileParameterDouble1TS(fileName,paramName,dt,it);
205 }
206
207 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS()
208 {
209 }
210
211 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS(const std::string& fileName, const std::string& paramName, int dt, int it)
212 {
213   MEDFileUtilities::CheckFileForRead(fileName);
214   MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),MED_ACC_RDONLY);
215   int nbPar=MEDnParameter(fid);
216   std::ostringstream oss; oss << "MEDFileParameterDouble1TS : no double param name \"" << paramName << "\" ! Double Parameters available are : ";
217   INTERP_KERNEL::AutoPtr<char> pName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
218   INTERP_KERNEL::AutoPtr<char> descName=MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE);
219   INTERP_KERNEL::AutoPtr<char> unitName=MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE);
220   med_parameter_type paramType;
221   for(int i=0;i<nbPar;i++)
222     {
223       int nbOfSteps;
224       MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,&paramType,descName,unitName,&nbOfSteps));
225       std::string paramNameCpp=MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE);
226       if(paramNameCpp==paramName && paramType==MED_FLOAT64)
227         {
228           _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
229           _name=paramNameCpp;
230           _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
231           finishLoading(fid,_name,dt,it,nbOfSteps);
232           return ;
233         }
234       else
235         {
236           oss << paramNameCpp;
237           if(i!=nbPar-1) oss << ", ";
238         }
239     }
240   throw INTERP_KERNEL::Exception(oss.str().c_str());
241 }
242
243 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS(const std::string& fileName, const std::string& paramName)
244 {
245   MEDFileUtilities::CheckFileForRead(fileName);
246   MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),MED_ACC_RDONLY);
247   int nbPar=MEDnParameter(fid);
248   std::ostringstream oss; oss << "MEDFileParameterDouble1TS : no double param name \"" << paramName << "\" ! Double Parameters available are : ";
249   INTERP_KERNEL::AutoPtr<char> pName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
250   INTERP_KERNEL::AutoPtr<char> descName=MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE);
251   INTERP_KERNEL::AutoPtr<char> unitName=MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE);
252   med_parameter_type paramType;
253   for(int i=0;i<nbPar;i++)
254     {
255       int nbOfSteps;
256       MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,&paramType,descName,unitName,&nbOfSteps));
257       std::string paramNameCpp=MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE);
258       if(paramNameCpp==paramName && paramType==MED_FLOAT64)
259         {
260           if(nbOfSteps>0)
261             {
262               _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
263               _name=paramNameCpp;
264               _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
265               finishLoading(fid,_name,0);
266               return ;
267             }
268           else
269             {
270               std::ostringstream oss2; oss2 << "Param name \"" << paramName << "\" exists but no time steps on it !";
271               throw INTERP_KERNEL::Exception(oss2.str().c_str());
272             }
273         }
274       else
275         {
276           oss << paramNameCpp;
277           if(i!=nbPar-1) oss << ", ";
278         }
279     }
280   throw INTERP_KERNEL::Exception(oss.str().c_str());
281 }
282
283 MEDFileParameterDouble1TS::MEDFileParameterDouble1TS(const std::string& fileName)
284 {
285   MEDFileUtilities::CheckFileForRead(fileName);
286   MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),MED_ACC_RDONLY);
287   int nbPar=MEDnParameter(fid);
288   if(nbPar<1)
289     {
290       std::ostringstream oss2; oss2 << "No parameter in file \"" << fileName << "\" !";  
291       throw INTERP_KERNEL::Exception(oss2.str().c_str());
292     }
293   INTERP_KERNEL::AutoPtr<char> pName=MEDLoaderBase::buildEmptyString(MED_NAME_SIZE);
294   INTERP_KERNEL::AutoPtr<char> descName=MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE);
295   INTERP_KERNEL::AutoPtr<char> unitName=MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE);
296   med_parameter_type paramType;
297   int nbOfSteps;
298   MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,1,pName,&paramType,descName,unitName,&nbOfSteps));
299   std::string paramNameCpp=MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE);
300   if(paramType==MED_FLOAT64)
301     {
302       if(nbOfSteps>0)
303         {
304           _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
305           _name=paramNameCpp;
306           _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
307           finishLoading(fid,_name,0);
308           return ;
309         }
310       else
311         {
312           std::ostringstream oss2; oss2 << "Double param name \"" << paramNameCpp << "\" exists in file \""<< fileName << "\"but no time steps on it !";
313           throw INTERP_KERNEL::Exception(oss2.str().c_str());
314         }
315     }
316   else
317     {
318       std::ostringstream oss2; oss2 << "First parameter in file \"" << fileName << "\" is not double !";  
319       throw INTERP_KERNEL::Exception(oss2.str().c_str());
320     }
321 }
322
323 bool MEDFileParameterDouble1TS::isEqual(const MEDFileParameter1TS *other, double eps, std::string& what) const
324 {
325   if(!MEDFileParameterDouble1TSWTI::isEqual(other,eps,what))
326     return false;
327   const MEDFileParameterDouble1TS *otherC=dynamic_cast<const MEDFileParameterDouble1TS *>(other);
328   if(!otherC)
329     { what="Other is not of type MEDFileParameterDouble1TS as this"; return false; }
330   if(!isEqualStrings(*otherC,what))
331     return false;
332   return true;
333 }
334
335 MEDFileParameter1TS *MEDFileParameterDouble1TS::deepCopy() const
336 {
337   return new MEDFileParameterDouble1TS(*this);
338 }
339
340 std::string MEDFileParameterDouble1TS::simpleRepr() const
341 {
342   std::ostringstream oss;
343   MEDFileParameterTinyInfo::mainRepr(0,oss);
344   MEDFileParameterDouble1TSWTI::simpleRepr2(0,oss);
345   return oss.str();
346 }
347
348 std::size_t MEDFileParameterDouble1TS::getHeapMemorySizeWithoutChildren() const
349 {
350   return getHeapMemSizeOfStrings()+sizeof(MEDFileParameterDouble1TS);
351 }
352
353 std::vector<const BigMemoryObject *> MEDFileParameterDouble1TS::getDirectChildrenWithNull() const
354 {
355   return std::vector<const BigMemoryObject *>();
356 }
357
358 void MEDFileParameterDouble1TS::write(const std::string& fileName, int mode) const
359 {
360   med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
361   MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),medmod);
362   MEDFileParameterTinyInfo::writeLLHeader(fid,MED_FLOAT64);
363   MEDFileParameterDouble1TSWTI::writeAdvanced(fid,_name,*this);
364 }
365
366 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New()
367 {
368   return new MEDFileParameterMultiTS;
369 }
370
371 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(const std::string& fileName)
372 {
373   MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
374   return New(fid);
375 }
376
377 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(med_idt fid)
378 {
379   return new MEDFileParameterMultiTS(fid);
380 }
381
382 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(const std::string& fileName, const std::string& paramName)
383 {
384   MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
385   return New(fid,paramName);
386 }
387
388 MEDFileParameterMultiTS *MEDFileParameterMultiTS::New(med_idt fid, const std::string& paramName)
389 {
390   return new MEDFileParameterMultiTS(fid,paramName);
391 }
392
393 MEDFileParameterMultiTS::MEDFileParameterMultiTS()
394 {
395 }
396
397 MEDFileParameterMultiTS::MEDFileParameterMultiTS(const MEDFileParameterMultiTS& other, bool deepCopy):MEDFileParameterTinyInfo(other),_param_per_ts(other._param_per_ts)
398 {
399   if(deepCopy)
400     for(std::size_t i=0;i<_param_per_ts.size();i++)
401       {
402         const MEDFileParameter1TS *elt=_param_per_ts[i];
403         if(elt)
404           _param_per_ts[i]=elt->deepCopy();
405       }
406 }
407
408 MEDFileParameterMultiTS::MEDFileParameterMultiTS(med_idt fid)
409 {
410   int nbPar(MEDnParameter(fid));
411   if(nbPar<1)
412     {
413       std::ostringstream oss; oss << "MEDFileParameterMultiTS : no parameter in file \"" << FileNameFromFID(fid) << "\" !" ;
414       throw INTERP_KERNEL::Exception(oss.str().c_str());
415     }
416   INTERP_KERNEL::AutoPtr<char> pName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
417   INTERP_KERNEL::AutoPtr<char> descName(MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE));
418   INTERP_KERNEL::AutoPtr<char> unitName(MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE));
419   med_parameter_type paramType;
420   int nbOfSteps;
421   MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,1,pName,&paramType,descName,unitName,&nbOfSteps));
422   std::string paramNameCpp(MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE));
423   _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
424   _name=paramNameCpp;
425   _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
426   finishLoading(fid,paramType,nbOfSteps);
427 }
428
429 MEDFileParameterMultiTS::MEDFileParameterMultiTS(med_idt fid, const std::string& paramName)
430 {
431   int nbPar(MEDnParameter(fid));
432   std::ostringstream oss; oss << "MEDFileParameterDouble1TS : no double param name \"" << paramName << "\" ! Double Parameters available are : ";
433   INTERP_KERNEL::AutoPtr<char> pName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
434   INTERP_KERNEL::AutoPtr<char> descName(MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE));
435   INTERP_KERNEL::AutoPtr<char> unitName(MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE));
436   med_parameter_type paramType;
437   for(int i=0;i<nbPar;i++)
438     {
439       int nbOfSteps;
440       MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,&paramType,descName,unitName,&nbOfSteps));
441       std::string paramNameCpp(MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE));
442       if(paramNameCpp==paramName)
443         {
444           if(nbOfSteps>0)
445             {
446               _dt_unit=MEDLoaderBase::buildStringFromFortran(unitName,MED_SNAME_SIZE);
447               _name=paramNameCpp;
448               _desc_name=MEDLoaderBase::buildStringFromFortran(descName,MED_COMMENT_SIZE);
449               finishLoading(fid,paramType,nbOfSteps);
450               return ;
451             }
452           else
453             {
454               std::ostringstream oss2; oss2 << "Param name \"" << paramName << "\" exists but no time steps on it !";
455               throw INTERP_KERNEL::Exception(oss2.str().c_str());
456             }
457         }
458       else
459         {
460           oss << paramNameCpp;
461           if(i!=nbPar-1) oss << ", ";
462         }
463     }
464   throw INTERP_KERNEL::Exception(oss.str().c_str());
465 }
466
467 void MEDFileParameterMultiTS::finishLoading(med_idt fid, med_parameter_type typ, int nbOfSteps)
468 {
469   _param_per_ts.resize(nbOfSteps);
470   for(int i=0;i<nbOfSteps;i++)
471     {
472       int dt,it;
473       double tim;
474       MEDFILESAFECALLERRD0(MEDparameterComputationStepInfo,(fid,_name.c_str(),i+1,&dt,&it,&tim));
475       switch(typ)
476       {
477         case MED_FLOAT64:
478           _param_per_ts[i]=MEDFileParameterDouble1TSWTI::New(dt,it,tim);
479           _param_per_ts[i]->readValue(fid,_name.c_str());
480           break;
481           /*case MED_INT32;
482          _param_per_ts[i]=;
483          break;*/
484         default:
485           throw INTERP_KERNEL::Exception("MEDFileParameterMultiTS::finishLoading : supporting only FLOAT64 !");
486       }
487     }
488 }
489
490 std::size_t MEDFileParameterMultiTS::getHeapMemorySizeWithoutChildren() const
491 {
492   std::size_t ret(sizeof(MEDFileParameterMultiTS));
493   ret+=sizeof(MCAuto<MEDFileParameter1TS>)*_param_per_ts.capacity();
494   return ret;
495 }
496
497 std::vector<const BigMemoryObject *> MEDFileParameterMultiTS::getDirectChildrenWithNull() const
498 {
499   std::vector<const BigMemoryObject *> ret;
500   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
501     ret.push_back((const MEDFileParameter1TS *)*it);
502   return ret;
503 }
504
505 MEDFileParameterMultiTS *MEDFileParameterMultiTS::deepCopy() const
506 {
507   return new MEDFileParameterMultiTS(*this,true);
508 }
509
510 bool MEDFileParameterMultiTS::isEqual(const MEDFileParameterMultiTS *other, double eps, std::string& what) const
511 {
512   if(!other)
513     { what="other is null !"; return false; }
514   if(_param_per_ts.size()!=other->_param_per_ts.size())
515     { what="number of time steps differs !"; return false; }
516   std::ostringstream oss;
517   for(std::size_t i=0;i<_param_per_ts.size();i++)
518     {
519       const MEDFileParameter1TS *a(_param_per_ts[i]),*b(other->_param_per_ts[i]);
520       if((a && !b) || (!a && b))
521         { oss << "At time step id #" << i << " pointer is defined on one side not in the other !"; what=oss.str(); return false; }
522       if(a)
523         if(!a->isEqual(b,eps,what))
524           { oss << " At time step id #" << i << " non equality !"; what+=oss.str(); return false; }
525     }
526   return true;
527 }
528
529 void MEDFileParameterMultiTS::write(const std::string& fileName, int mode) const
530 {
531   med_access_mode medmod=MEDFileUtilities::TraduceWriteMode(mode);
532   MEDFileUtilities::AutoFid fid=MEDfileOpen(fileName.c_str(),medmod);
533   writeAdvanced(fid,*this);
534 }
535
536 void MEDFileParameterMultiTS::writeAdvanced(med_idt fid, const MEDFileWritable& mw) const
537 {
538   std::set<med_parameter_type> diffType;
539   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
540     {
541       const MEDFileParameter1TS *elt(*it);
542       if(dynamic_cast<const MEDFileParameterDouble1TSWTI *>(elt))
543         diffType.insert(MED_FLOAT64);
544     }
545   if(diffType.size()>1)
546     throw INTERP_KERNEL::Exception("MEDFileParameterMultiTS::writeAdvanced : impossible to mix type of data in parameters in MED file ! Only float64 or only int32 ...");
547   if(diffType.empty())
548     return;
549   med_parameter_type typ(*diffType.begin());
550   MEDFileParameterTinyInfo::writeLLHeader(fid,typ);
551   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
552     {
553       const MEDFileParameter1TS *elt(*it);
554       if(elt)
555         elt->writeAdvanced(fid,_name,mw);
556     }
557 }
558
559 std::string MEDFileParameterMultiTS::simpleRepr() const
560 {
561   std::ostringstream oss;
562   simpleRepr2(0,oss);
563   return oss.str();
564 }
565
566 void MEDFileParameterMultiTS::simpleRepr2(int bkOffset, std::ostream& oss) const
567 {
568   MEDFileParameterTinyInfo::mainRepr(bkOffset,oss);
569   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
570     {
571       const MEDFileParameter1TS *elt(*it);
572       if(elt)
573         elt->simpleRepr2(bkOffset+2,oss);
574     }
575 }
576
577 void MEDFileParameterMultiTS::appendValue(int dt, int it, double time, double val)
578 {
579   MCAuto<MEDFileParameterDouble1TSWTI> elt=MEDFileParameterDouble1TSWTI::New(dt,it,time);
580   elt->setValue(val);
581   MCAuto<MEDFileParameter1TS> elt2((MEDFileParameterDouble1TSWTI*)elt); elt2->incrRef();
582   _param_per_ts.push_back(elt2);
583 }
584
585 double MEDFileParameterMultiTS::getDoubleValue(int iteration, int order) const
586 {
587   int pos=getPosOfTimeStep(iteration,order);
588   const MEDFileParameter1TS *elt=_param_per_ts[pos];
589   if(!elt)
590     {
591       std::ostringstream oss; oss << "MEDFileParameterMultiTS::getDoubleValue : time iteration it=" << iteration << " order=" << order;
592       oss << " exists but elt is empty !"; 
593       throw INTERP_KERNEL::Exception(oss.str().c_str());
594     }
595   const MEDFileParameterDouble1TSWTI *eltC=dynamic_cast<const MEDFileParameterDouble1TSWTI *>(elt);
596   if(!eltC)
597     {
598       std::ostringstream oss; oss << "MEDFileParameterMultiTS::getDoubleValue : time iteration it=" << iteration << " order=" << order;
599       oss << " exists but not double !"; 
600     }
601   return eltC->getValue();
602 }
603
604 int MEDFileParameterMultiTS::getPosOfTimeStep(int iteration, int order) const
605 {
606   int ret=0;
607   std::ostringstream oss; oss << "MEDFileParameterMultiTS::getPosOfTimeStep : no such iteration=" << iteration << " order=" << order << " ! Possibilities are :";
608   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++,ret++)
609     {
610       const MEDFileParameter1TS *elt(*it);
611       if(elt)
612         {
613           if(elt->getIteration()==iteration && elt->getOrder()==order)
614             return ret;
615           else
616             oss << "(" << elt->getIteration() << "," << elt->getOrder() << "), ";
617         }
618     }
619   throw INTERP_KERNEL::Exception(oss.str().c_str());
620 }
621
622 int MEDFileParameterMultiTS::getPosGivenTime(double time, double eps) const
623 {
624   int ret=0;
625   std::ostringstream oss; oss << "MEDFileParameterMultiTS::getPosGivenTime : no such time=" << time << " ! Possibilities are :";
626   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++,ret++)
627     {
628       const MEDFileParameter1TS *elt(*it);
629       if(elt)
630         {
631           if(fabs(elt->getTimeValue()-time)<=eps)
632             return ret;
633           else
634             oss << elt->getTimeValue() << ", ";
635         }
636     }
637   throw INTERP_KERNEL::Exception(oss.str().c_str());
638 }
639
640 /*!
641  * \return an internal pointer that can be null. Warning the caller is \b not responsible of the returned pointer.
642  */
643 MEDFileParameter1TS *MEDFileParameterMultiTS::getTimeStepAtPos(int posId) const
644 {
645   if(posId<0 || posId>=(int)_param_per_ts.size())
646     {
647       std::ostringstream oss; oss << "MEDFileParameterMultiTS::getTimeStepAtPos : invalid pos ! Should be in [0," << _param_per_ts.size() << ") !";
648       throw INTERP_KERNEL::Exception(oss.str().c_str());
649     }
650   return const_cast<MEDFileParameter1TS *>(static_cast<const MEDFileParameter1TS *>(_param_per_ts[posId]));
651 }
652
653 void MEDFileParameterMultiTS::eraseTimeStepIds(const int *startIds, const int *endIds)
654 {
655   std::vector<bool> b(_param_per_ts.size(),true);
656   int len=(int)_param_per_ts.size();
657   for(const int *w=startIds;w!=endIds;w++)
658     if(*w>=0 && *w<len)
659       b[*w]=false;
660     else
661       {
662         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());
663       }
664   std::size_t newNb=std::count(b.begin(),b.end(),true);
665   std::vector< MCAuto<MEDFileParameter1TS> > paramPerTs(newNb);
666   std::size_t j=0;
667   for(std::size_t i=0;i<_param_per_ts.size();i++)
668     if(b[i])
669       paramPerTs[j++]=_param_per_ts[i];
670   _param_per_ts=paramPerTs;
671 }
672
673 int MEDFileParameterMultiTS::getNumberOfTS() const
674 {
675   return (int) getIterations().size();
676 }
677
678 std::vector< std::pair<int,int> > MEDFileParameterMultiTS::getIterations() const
679 {
680   std::vector< std::pair<int,int> > ret;
681   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
682     {
683       const MEDFileParameter1TS *elt(*it);
684       if(elt)
685         ret.push_back(std::pair<int,int>(elt->getIteration(),elt->getOrder()));
686     }
687   return ret;
688 }
689
690 /*!
691  * \param [out] ret1
692  */
693 std::vector< std::pair<int,int> > MEDFileParameterMultiTS::getTimeSteps(std::vector<double>& ret1) const
694 {
695   std::vector< std::pair<int,int> > ret0;
696   ret1.clear();
697   for(std::vector< MCAuto<MEDFileParameter1TS> >::const_iterator it=_param_per_ts.begin();it!=_param_per_ts.end();it++)
698     {
699       const MEDFileParameter1TS *elt(*it);
700       if(elt)
701         {
702           ret0.push_back(std::pair<int,int>(elt->getIteration(),elt->getOrder()));
703           ret1.push_back(elt->getTimeValue());
704         }
705     }
706   return ret0;
707 }
708
709 MEDFileParameters *MEDFileParameters::New()
710 {
711   return new MEDFileParameters;
712 }
713
714 MEDFileParameters *MEDFileParameters::New(const std::string& fileName)
715 {
716   MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
717   return New(fid);
718 }
719
720 MEDFileParameters *MEDFileParameters::New(med_idt fid)
721 {
722   return new MEDFileParameters(fid);
723 }
724
725 MEDFileParameters::MEDFileParameters(med_idt fid)
726 {
727   int nbPar=MEDnParameter(fid);
728   _params.resize(nbPar);
729   INTERP_KERNEL::AutoPtr<char> pName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
730   INTERP_KERNEL::AutoPtr<char> descName(MEDLoaderBase::buildEmptyString(MED_COMMENT_SIZE));
731   INTERP_KERNEL::AutoPtr<char> unitName(MEDLoaderBase::buildEmptyString(MED_SNAME_SIZE));
732   med_parameter_type paramType;
733   for(int i=0;i<nbPar;i++)
734     {
735       int nbOfSteps;
736       MEDFILESAFECALLERRD0(MEDparameterInfo,(fid,i+1,pName,&paramType,descName,unitName,&nbOfSteps));
737       std::string paramNameCpp(MEDLoaderBase::buildStringFromFortran(pName,MED_NAME_SIZE));
738       _params[i]=MEDFileParameterMultiTS::New(fid,paramNameCpp);
739     }
740 }
741
742 MEDFileParameters::MEDFileParameters()
743 {
744 }
745
746 std::size_t MEDFileParameters::getHeapMemorySizeWithoutChildren() const
747 {
748   std::size_t ret(sizeof(MEDFileParameters));
749   ret+=sizeof(MCAuto<MEDFileParameterMultiTS>)*_params.capacity();
750   return ret;
751 }
752
753 std::vector<const BigMemoryObject *> MEDFileParameters::getDirectChildrenWithNull() const
754 {
755   std::vector<const BigMemoryObject *> ret;
756   for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++)
757     ret.push_back((const MEDFileParameterMultiTS *)*it);
758   return ret;
759 }
760
761 MEDFileParameters *MEDFileParameters::deepCopy() const
762 {
763   return new MEDFileParameters(*this,true);
764 }
765
766 bool MEDFileParameters::isEqual(const MEDFileParameters *other, double eps, std::string& what) const
767 {
768   if(!other)
769     { what="other is null !"; return false; }
770   if(_params.size()!=other->_params.size())
771     { what="number of parameters differs !"; return false; }
772   std::ostringstream oss;
773   for(std::size_t i=0;i<_params.size();i++)
774     {
775       const MEDFileParameterMultiTS *a(_params[i]),*b(other->_params[i]);
776       if((a && !b) || (!a && b))
777         { oss << "At param with id #" << i << " pointer is defined on one side not in the other !"; what=oss.str(); return false; }
778       if(a)
779         if(!a->isEqual(b,eps,what))
780           { oss << " At param with id #" << i << " non equality !"; what+=oss.str(); return false; }
781     }
782   return true;
783 }
784
785 MEDFileParameters::MEDFileParameters(const MEDFileParameters& other, bool deepCopy):MEDFileWritableStandAlone(other),_params(other._params)
786 {
787   if(deepCopy)
788     for(std::size_t i=0;i<_params.size();i++)
789       {
790         const MEDFileParameterMultiTS *elt=_params[i];
791         if(elt)
792           _params[i]=elt->deepCopy();
793       }
794 }
795
796 void MEDFileParameters::writeLL(med_idt fid) const
797 {
798   for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++)
799     {
800       const MEDFileParameterMultiTS *elt(*it);
801       if(elt)
802         elt->writeAdvanced(fid,*this);
803     }
804 }
805
806 std::vector<std::string> MEDFileParameters::getParamsNames() const
807 {
808   std::vector<std::string> ret(_params.size());
809   int i=0;
810   for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++,i++)
811     {
812       const MEDFileParameterMultiTS *p=(*it);
813       if(p)
814         {
815           ret[i]=p->getName();
816         }
817       else
818         {
819           std::ostringstream oss; oss << "MEDFileParameters::getParamsNames : At rank #" << i << " param is not defined !";
820           throw INTERP_KERNEL::Exception(oss.str().c_str());
821         }
822     }
823   return ret;
824 }
825
826 std::string MEDFileParameters::simpleRepr() const
827 {
828   std::ostringstream oss;
829   simpleReprWithoutHeader(oss);
830   return oss.str();
831 }
832
833 void MEDFileParameters::simpleReprWithoutHeader(std::ostream& oss) const
834 {
835   for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++)
836     {
837       const MEDFileParameterMultiTS *elt(*it);
838       if(elt)
839         elt->simpleRepr2(2,oss);
840     }
841 }
842
843 void MEDFileParameters::resize(int newSize)
844 {
845   if(newSize<0)
846     throw INTERP_KERNEL::Exception("MEDFileParameters::resize : should be positive !");
847   _params.resize(newSize);
848 }
849
850 void MEDFileParameters::pushParam(MEDFileParameterMultiTS *param)
851 {
852   if(param)
853     param->incrRef();
854   MCAuto<MEDFileParameterMultiTS> elt(param);
855   _params.push_back(elt);
856 }
857
858 void MEDFileParameters::setParamAtPos(int i, MEDFileParameterMultiTS *param)
859 {
860   if(i<0)
861     throw INTERP_KERNEL::Exception("MEDFileParameters::setParamAtPos : should be positive !");
862   if(i>=(int)_params.size())
863     _params.resize(i+1);
864   if(param)
865     param->incrRef();
866   MCAuto<MEDFileParameterMultiTS> elt(param);
867   _params[i]=elt;
868 }
869
870 /*!
871  * \return an internal pointer that can be null. Warning the caller is \b not responsible of the returned pointer.
872  */
873 MEDFileParameterMultiTS *MEDFileParameters::getParamAtPos(int i) const
874 {
875   if(i<0 || i>=(int)_params.size())
876     {
877       std::ostringstream oss; oss << "MEDFileParameters::getParamAtPos : should be in [0," << _params.size() << ") !";
878       throw INTERP_KERNEL::Exception(oss.str().c_str());
879     }
880   const MEDFileParameterMultiTS *elt=_params[i];
881   return const_cast<MEDFileParameterMultiTS *>(elt);
882 }
883
884 /*!
885  * \return an internal pointer that can be null. Warning the caller is \b not responsible of the returned pointer.
886  */
887 MEDFileParameterMultiTS *MEDFileParameters::getParamWithName(const std::string& paramName) const
888 {
889   int pos=getPosFromParamName(paramName);
890   return getParamAtPos(pos);
891 }
892
893 void MEDFileParameters::destroyParamAtPos(int i)
894 {
895   if(i<0 || i>=(int)_params.size())
896     {
897       std::ostringstream oss; oss << "MEDFileParameters::destroyParamAtPos : should be in [0," << _params.size() << ") !";
898       throw INTERP_KERNEL::Exception(oss.str().c_str());
899     }
900   _params[i]=MCAuto<MEDFileParameterMultiTS>(0);
901 }
902
903 int MEDFileParameters::getPosFromParamName(const std::string& paramName) const
904 {
905   std::ostringstream oss; oss << "MEDFileParameters::getPosFromParamName : no such name=" << paramName << " ! Possibilities are :";
906   int ret=0;
907   for(std::vector< MCAuto<MEDFileParameterMultiTS> >::const_iterator it=_params.begin();it!=_params.end();it++,ret++)
908     {
909       const MEDFileParameterMultiTS *elt(*it);
910       if(elt)
911         {
912           if(std::string(elt->getName())==paramName)
913             return ret;
914           else
915             oss << elt->getName() << ", ";
916         }
917     }
918   throw INTERP_KERNEL::Exception(oss.str().c_str());
919 }
920
921 int MEDFileParameters::getNumberOfParams() const
922 {
923   return (int)_params.size();
924 }