]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Factorization finished for 1TS. MultiTS remaining
authorAnthony Geay <anthony.geay@edf.fr>
Wed, 17 May 2017 10:22:52 +0000 (12:22 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Wed, 17 May 2017 10:22:52 +0000 (12:22 +0200)
src/MEDLoader/MEDFileField.cxx
src/MEDLoader/MEDFileField.hxx
src/MEDLoader/MEDFileField.txx
src/MEDLoader/MEDLoaderTraits.hxx

index 365a879a7e28b109fc94599dba889c9117a41351..f8b9a4e9e27b1a60f346e3abdca8a324e3ab8d9c 100644 (file)
@@ -47,6 +47,8 @@ template class MEDCoupling::MEDFileField1TSTemplateWithoutSDA<float>;
 template class MEDCoupling::MEDFileField1TSTemplateWithoutSDA<double>;
 template class MEDCoupling::MEDFileTemplateField1TS<int>;
 template class MEDCoupling::MEDFileTemplateField1TS<double>;
+template class MEDCoupling::MEDFileTemplateFieldMultiTS<int>;
+template class MEDCoupling::MEDFileTemplateFieldMultiTS<double>;
 
 const char MEDFileField1TSWithoutSDA::TYPE_STR[]="FLOAT64";
 const char MEDFileIntField1TSWithoutSDA::TYPE_STR[]="INT32";
@@ -6831,58 +6833,6 @@ MEDFileIntField1TS *MEDFileField1TS::convertToInt(bool isDeepCpyGlobs) const
   return ret.retn();
 }
 
-/*!
- * Return an extraction of \a this using \a extractDef map to specify the extraction.
- * The keys of \a extractDef is level relative to max ext of \a mm mesh.
- *
- * \return A new object that the caller is responsible to deallocate.
- * \sa MEDFileUMesh::deduceNodeSubPartFromCellSubPart , MEDFileUMesh::extractPart
- */
-MEDFileField1TS *MEDFileField1TS::extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const
-{
-  if(!mm)
-    throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : input mesh is NULL !");
-  MCAuto<MEDFileField1TS> ret(MEDFileField1TS::New());
-  std::vector<TypeOfField> tof(getTypesOfFieldAvailable());
-  for(std::vector<TypeOfField>::const_iterator it0=tof.begin();it0!=tof.end();it0++)
-    {
-      if((*it0)!=ON_NODES)
-        {
-          std::vector<int> levs;
-          getNonEmptyLevels(mm->getName(),levs);
-          for(std::vector<int>::const_iterator lev=levs.begin();lev!=levs.end();lev++)
-            {
-              std::map<int, MCAuto<DataArrayInt> >::const_iterator it2(extractDef.find(*lev));
-              if(it2!=extractDef.end())
-                {
-                  MCAuto<DataArrayInt> t((*it2).second);
-                  if(t.isNull())
-                    throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : presence of a value with null pointer 1 !");
-                  MCAuto<MEDCouplingFieldDouble> f(getFieldOnMeshAtLevel(ON_CELLS,(*lev),mm));
-                  MCAuto<MEDCouplingFieldDouble> fOut(f->buildSubPart(t));
-                  ret->setFieldNoProfileSBT(fOut);
-                }
-            }
-        }
-      else
-        {
-          std::map<int, MCAuto<DataArrayInt> >::const_iterator it2(extractDef.find(1));
-          if(it2==extractDef.end())
-            throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : presence of a NODE field and no extract array available for NODE !");
-          MCAuto<DataArrayInt> t((*it2).second);
-          if(t.isNull())
-            throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : presence of a value with null pointer 1 !");
-          MCAuto<MEDCouplingFieldDouble> f(getFieldOnMeshAtLevel(ON_NODES,0,mm));
-          MCAuto<MEDCouplingFieldDouble> fOut(f->deepCopy());
-          DataArrayDouble *arr(f->getArray());
-          MCAuto<DataArrayDouble> newArr(arr->selectByTupleIdSafe(t->begin(),t->end()));
-          fOut->setArray(newArr);
-          ret->setFieldNoProfileSBT(fOut);
-        }
-    }
-  return ret.retn();
-}
-
 MEDFileField1TS::MEDFileField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms)
 try:MEDFileTemplateField1TS<double>(fid,loadAll,ms)
 {
@@ -7007,11 +6957,6 @@ MCAuto<MEDCouplingFieldDouble> MEDFileIntField1TS::ConvertFieldIntToFieldDouble(
   return ret;
 }
 
-MEDFileIntField1TS *MEDFileIntField1TS::extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const
-{
-  throw INTERP_KERNEL::Exception("MEDFileIntField1TS::extractPart : not implemented yet !");
-}
-
 //= MEDFileFloatField1TS
 
 MEDFileFloatField1TS::MEDFileFloatField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms)
@@ -7035,6 +6980,11 @@ try:MEDFileTemplateField1TS<float>(fid,fieldName,iteration,order,loadAll,ms)
 catch(INTERP_KERNEL::Exception& e)
 { throw e; }
 
+MEDFileFloatField1TS *MEDFileFloatField1TS::shallowCpy() const
+{
+  return new MEDFileFloatField1TS(*this);
+}
+
 //= MEDFileFloatField1TS
 
 //= MEDFileAnyTypeFieldMultiTSWithoutSDA
@@ -9042,27 +8992,6 @@ int MEDFileAnyTypeFieldMultiTS::CheckSupportAcrossTime(MEDFileAnyTypeFieldMultiT
   return nts;
 }
 
-/*!
- * Return an extraction of \a this using \a extractDef map to specify the extraction.
- * The keys of \a extractDef is level relative to max ext of \a mm mesh.
- *
- * \return A new object that the caller is responsible to deallocate.
- */
-MEDFileAnyTypeFieldMultiTS *MEDFileAnyTypeFieldMultiTS::extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const
-{
-  if(!mm)
-    throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::extractPart : mesh is null !");
-  MCAuto<MEDFileAnyTypeFieldMultiTS> fmtsOut(buildNewEmpty());
-  int nbTS(getNumberOfTS());
-  for(int i=0;i<nbTS;i++)
-    {
-      MCAuto<MEDFileAnyTypeField1TS> f1ts(getTimeStepAtPos(i));
-      MCAuto<MEDFileAnyTypeField1TS> f1tsOut(f1ts->extractPart(extractDef,mm));
-      fmtsOut->pushBackTimeStep(f1tsOut);
-    }
-  return fmtsOut.retn();
-}
-
 template<class T>
 MCAuto<MEDFileAnyTypeField1TS> AggregateHelperF1TS(const std::vector< typename MLFieldTraits<T>::F1TSType const *>& f1tss, const std::vector< std::vector< std::pair<int,int> > >& dts)
 {
@@ -9580,26 +9509,21 @@ void MEDFileFieldMultiTS::appendFieldProfile(const MEDCouplingFieldDouble *field
   contentNotNull()->appendFieldProfile(field,arr,mesh,meshDimRelToMax,profile,*this);
 }
 
-MEDFileFieldMultiTS::MEDFileFieldMultiTS()
-{
-  _content=new MEDFileFieldMultiTSWithoutSDA;
-}
-
 MEDFileFieldMultiTS::MEDFileFieldMultiTS(med_idt fid, bool loadAll, const MEDFileMeshes *ms)
-try:MEDFileAnyTypeFieldMultiTS(fid,loadAll,ms)
+try:MEDFileTemplateFieldMultiTS<double>(fid,loadAll,ms)
 {
 }
 catch(INTERP_KERNEL::Exception& e)
 { throw e; }
 
 MEDFileFieldMultiTS::MEDFileFieldMultiTS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities)
-try:MEDFileAnyTypeFieldMultiTS(fid,fieldName,loadAll,ms,entities)
+try:MEDFileTemplateFieldMultiTS<double>(fid,fieldName,loadAll,ms,entities)
 {
 }
 catch(INTERP_KERNEL::Exception& e)
 { throw e; }
 
-MEDFileFieldMultiTS::MEDFileFieldMultiTS(const MEDFileFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent):MEDFileAnyTypeFieldMultiTS(other,shallowCopyOfContent)
+MEDFileFieldMultiTS::MEDFileFieldMultiTS(const MEDFileFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent):MEDFileTemplateFieldMultiTS<double>(other,shallowCopyOfContent)
 {
 }
 
@@ -10074,24 +9998,19 @@ MEDFileIntFieldMultiTSWithoutSDA *MEDFileIntFieldMultiTS::contentNotNull()
   return ret;
 }
 
-MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS()
-{
-  _content=new MEDFileIntFieldMultiTSWithoutSDA;
-}
-
-MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS(const MEDFileIntFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent):MEDFileAnyTypeFieldMultiTS(other,shallowCopyOfContent)
+MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS(const MEDFileIntFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent):MEDFileTemplateFieldMultiTS<int>(other,shallowCopyOfContent)
 {
 }
 
 MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS(med_idt fid, bool loadAll, const MEDFileMeshes *ms)
-try:MEDFileAnyTypeFieldMultiTS(fid,loadAll,ms)
+try:MEDFileTemplateFieldMultiTS<int>(fid,loadAll,ms)
 {
 }
 catch(INTERP_KERNEL::Exception& e)
 { throw e; }
 
 MEDFileIntFieldMultiTS::MEDFileIntFieldMultiTS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities)
-try:MEDFileAnyTypeFieldMultiTS(fid,fieldName,loadAll,ms,entities)
+try:MEDFileTemplateFieldMultiTS<int>(fid,fieldName,loadAll,ms,entities)
 {
 }
 catch(INTERP_KERNEL::Exception& e)
index b13080d06aa3ebf3c3ba0255d74701db301f8ad8..1d450e943189cc97d8e1d69a534c055630f8a2dc 100644 (file)
@@ -826,6 +826,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT int getNonEmptyLevels(const std::string& mname, std::vector<int>& levs) const;
     MEDLOADER_EXPORT void convertMedBallIntoClassic();
     MEDLOADER_EXPORT void makeReduction(INTERP_KERNEL::NormalizedCellType ct, TypeOfField tof, const DataArrayInt *pfl);
+    MEDLOADER_EXPORT virtual MEDFileAnyTypeField1TS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const = 0;
   public:
     MEDLOADER_EXPORT void loadArrays();
     MEDLOADER_EXPORT void loadArraysIfNecessary();
@@ -854,8 +855,6 @@ namespace MEDCoupling
   public:
     MEDLOADER_EXPORT static int LocateField2(med_idt fid, int fieldIdCFormat, bool checkFieldId, std::string& fieldName, med_field_type& typcha, std::vector<std::string>& infos, std::string& dtunitOut, std::string& meshName);
     MEDLOADER_EXPORT static int LocateField(med_idt fid, const std::string& fieldName, int& posCFormat, med_field_type& typcha, std::vector<std::string>& infos, std::string& dtunitOut, std::string& meshName);
-  public:
-    MEDLOADER_EXPORT virtual MEDFileAnyTypeField1TS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const = 0;
   public:
     MEDLOADER_EXPORT virtual med_field_type getMEDFileFieldType() const = 0;
     MEDLOADER_EXPORT MEDFileAnyTypeField1TSWithoutSDA *contentNotNullBase();
@@ -892,8 +891,10 @@ namespace MEDCoupling
     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldOnMeshAtLevel(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, int renumPol=0) const;
     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldOnMeshAtLevel(TypeOfField type, const MEDCouplingMesh *mesh, int renumPol=0) const;
     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldAtLevelOld(TypeOfField type, const std::string& mname, int meshDimRelToMax, int renumPol=0) const;
-    void setFieldNoProfileSBT(const typename Traits<T>::FieldType *field);
-    void setFieldProfile(const typename Traits<T>::FieldType *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile);
+    MEDLOADER_EXPORT void setFieldNoProfileSBT(const typename Traits<T>::FieldType *field);
+    MEDLOADER_EXPORT void setFieldProfile(const typename Traits<T>::FieldType *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile);
+    MEDLOADER_EXPORT typename MLFieldTraits<T>::F1TSType *extractPartImpl(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const;
+    MEDLOADER_EXPORT MEDFileAnyTypeField1TS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const { return this->extractPartImpl(extractDef,mm); }
   protected:
     ~MEDFileTemplateField1TS() { }
     MEDFileTemplateField1TS();
@@ -918,7 +919,6 @@ namespace MEDCoupling
     MEDLOADER_EXPORT std::vector< std::vector<DataArrayDouble *> > getFieldSplitedByType2(const std::string& 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;
   public:
-    MEDLOADER_EXPORT MEDFileField1TS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const;
   private:
     med_field_type getMEDFileFieldType() const { return MED_FLOAT64; }
   private:
@@ -938,8 +938,6 @@ namespace MEDCoupling
     MEDLOADER_EXPORT MEDFileIntField1TS *shallowCpy() const;
   public:
     MEDLOADER_EXPORT static MCAuto<MEDCouplingFieldDouble> ConvertFieldIntToFieldDouble(const MEDCouplingFieldInt *f);
-  public:
-    MEDLOADER_EXPORT MEDFileIntField1TS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const;
   private:
     med_field_type getMEDFileFieldType() const { return MED_INT32; }
   private:
@@ -954,6 +952,9 @@ namespace MEDCoupling
   class MEDFileFloatField1TS : public MEDFileTemplateField1TS<float>
   {
     friend class MEDFileTemplateField1TS<float>;
+  private:
+    med_field_type getMEDFileFieldType() const { return MED_INT32; }//6432
+    MEDLOADER_EXPORT MEDFileFloatField1TS *shallowCpy() const;
   private:
     ~MEDFileFloatField1TS() { }
     MEDFileFloatField1TS() { }
@@ -1162,7 +1163,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT MCAuto<MEDFileAnyTypeFieldMultiTSWithoutSDA> getContent();
   public:
     MEDLOADER_EXPORT virtual MEDFileAnyTypeFieldMultiTS *buildNewEmpty() const = 0;
-    MEDLOADER_EXPORT MEDFileAnyTypeFieldMultiTS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const;
+    MEDLOADER_EXPORT virtual MEDFileAnyTypeFieldMultiTS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const = 0;
     MEDLOADER_EXPORT static MCAuto<MEDFileAnyTypeFieldMultiTS> Aggregate(const std::vector<const MEDFileAnyTypeFieldMultiTS *>& fmtss, const std::vector< std::vector< std::pair<int,int> > >& dts);
   public:
     MEDLOADER_EXPORT std::vector<std::string> getPflsReallyUsed() const;
@@ -1180,12 +1181,26 @@ namespace MEDCoupling
     MCAuto<MEDFileAnyTypeFieldMultiTSWithoutSDA> _content;
   };
 
+  template<class T>
+  class MEDFileTemplateFieldMultiTS : public MEDFileAnyTypeFieldMultiTS
+  {
+  public:
+    MEDLOADER_EXPORT typename MLFieldTraits<T>::FMTSType *extractPartImpl(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const;
+    MEDLOADER_EXPORT MEDFileAnyTypeFieldMultiTS *extractPart(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const { return this->extractPartImpl(extractDef,mm); }
+  protected:
+    ~MEDFileTemplateFieldMultiTS() { }
+    MEDFileTemplateFieldMultiTS();
+    MEDFileTemplateFieldMultiTS(const typename MLFieldTraits<T>::FMTSWSDAType& other, bool shallowCopyOfContent);
+    MEDFileTemplateFieldMultiTS(med_idt fid, bool loadAll, const MEDFileMeshes *ms);
+    MEDFileTemplateFieldMultiTS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities=0);
+  };
+  
   class MEDFileIntFieldMultiTS;
 
   /*!
    * User class.
    */
-  class MEDFileFieldMultiTS : public MEDFileAnyTypeFieldMultiTS
+  class MEDFileFieldMultiTS : public MEDFileTemplateFieldMultiTS<double>
   {
   public:
     MEDLOADER_EXPORT static MEDFileFieldMultiTS *New();
@@ -1224,7 +1239,7 @@ namespace MEDCoupling
     MEDFileFieldMultiTSWithoutSDA *contentNotNull();
   private:
     ~MEDFileFieldMultiTS() { }
-    MEDFileFieldMultiTS();
+    MEDFileFieldMultiTS() { }
     MEDFileFieldMultiTS(const MEDFileFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent);
     MEDFileFieldMultiTS(med_idt fid, bool loadAll, const MEDFileMeshes *ms);
     MEDFileFieldMultiTS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities=0);
@@ -1233,7 +1248,7 @@ namespace MEDCoupling
   /*!
    * User class.
    */
-  class MEDFileIntFieldMultiTS : public MEDFileAnyTypeFieldMultiTS
+  class MEDFileIntFieldMultiTS : public MEDFileTemplateFieldMultiTS<int>
   {
   public:
     MEDLOADER_EXPORT static MEDFileIntFieldMultiTS *New();
@@ -1268,7 +1283,7 @@ namespace MEDCoupling
     MEDFileIntFieldMultiTSWithoutSDA *contentNotNull();
   private:
     ~MEDFileIntFieldMultiTS() { }
-    MEDFileIntFieldMultiTS();
+    MEDFileIntFieldMultiTS() { }
     MEDFileIntFieldMultiTS(const MEDFileIntFieldMultiTSWithoutSDA& other, bool shallowCopyOfContent);
     MEDFileIntFieldMultiTS(med_idt fid, bool loadAll, const MEDFileMeshes *ms);
     MEDFileIntFieldMultiTS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities=0);
index 57721bed1d545891a729ae83e8118e7f9bf67d8c..d68b0e86f37b927529c4f2e5ff5bf908abc5a27d 100644 (file)
@@ -23,6 +23,8 @@
 
 #include "MEDFileField.hxx"
 #include "MEDCouplingTraits.hxx"
+#include "MEDCouplingFieldInt.hxx"
+#include "MEDCouplingFieldFloat.hxx"
 #include "MEDCouplingFieldDouble.hxx"
 #include "MEDCouplingFieldTemplate.hxx"
 
@@ -637,6 +639,105 @@ namespace MEDCoupling
     MCAuto<MEDCouplingFieldTemplate> ft(MEDCouplingFieldTemplate::NewWithoutCheck(*field));
     contentNotNull()->setFieldProfile(field->timeDiscrSafe(),ft,field->getArray(),mesh,meshDimRelToMax,profile,*this,*contentNotNull());
   }
+
+  /*!
+   * Return an extraction of \a this using \a extractDef map to specify the extraction.
+   * The keys of \a extractDef is level relative to max ext of \a mm mesh.
+   *
+   * \return A new object that the caller is responsible to deallocate.
+   * \sa MEDFileUMesh::deduceNodeSubPartFromCellSubPart , MEDFileUMesh::extractPart
+   */
+  template<class T>
+  typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::extractPartImpl(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const
+  {
+    if(!mm)
+      throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : input mesh is NULL !");
+    MCAuto<typename MLFieldTraits<T>::F1TSType> ret(MLFieldTraits<T>::F1TSType::New());
+    std::vector<TypeOfField> tof(getTypesOfFieldAvailable());
+    for(std::vector<TypeOfField>::const_iterator it0=tof.begin();it0!=tof.end();it0++)
+      {
+        if((*it0)!=ON_NODES)
+          {
+            std::vector<int> levs;
+            getNonEmptyLevels(mm->getName(),levs);
+            for(std::vector<int>::const_iterator lev=levs.begin();lev!=levs.end();lev++)
+              {
+                std::map<int, MCAuto<DataArrayInt> >::const_iterator it2(extractDef.find(*lev));
+                if(it2!=extractDef.end())
+                  {
+                    MCAuto<DataArrayInt> t((*it2).second);
+                    if(t.isNull())
+                      throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : presence of a value with null pointer 1 !");
+                    MCAuto<typename Traits<T>::FieldType> f(getFieldOnMeshAtLevel(ON_CELLS,(*lev),mm));
+                    MCAuto<typename Traits<T>::FieldType> fOut(f->buildSubPart(t));
+                    ret->setFieldNoProfileSBT(fOut);
+                  }
+              }
+          }
+        else
+          {
+            std::map<int, MCAuto<DataArrayInt> >::const_iterator it2(extractDef.find(1));
+            if(it2==extractDef.end())
+              throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : presence of a NODE field and no extract array available for NODE !");
+            MCAuto<DataArrayInt> t((*it2).second);
+            if(t.isNull())
+              throw INTERP_KERNEL::Exception("MEDFileField1TS::extractPart : presence of a value with null pointer 1 !");
+            MCAuto<typename Traits<T>::FieldType> f(getFieldOnMeshAtLevel(ON_NODES,0,mm));
+            MCAuto<typename Traits<T>::FieldType> fOut(f->deepCopy());
+            typename Traits<T>::ArrayType *arr(f->getArray());
+            MCAuto<typename Traits<T>::ArrayType> newArr(arr->selectByTupleIdSafe(t->begin(),t->end()));
+            fOut->setArray(newArr);
+            ret->setFieldNoProfileSBT(fOut);
+          }
+      }
+    return ret.retn();
+  }
+  
+  //////////////////////////
+  
+  template<class T>
+  MEDFileTemplateFieldMultiTS<T>::MEDFileTemplateFieldMultiTS()
+  {
+    _content=new MEDFileFieldMultiTSWithoutSDA;
+  }
+
+  template<class T>
+  MEDFileTemplateFieldMultiTS<T>::MEDFileTemplateFieldMultiTS(med_idt fid, bool loadAll, const MEDFileMeshes *ms):MEDFileAnyTypeFieldMultiTS(fid,loadAll,ms)
+  {
+  }
+  
+  template<class T>
+  MEDFileTemplateFieldMultiTS<T>::MEDFileTemplateFieldMultiTS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities):MEDFileAnyTypeFieldMultiTS(fid,fieldName,loadAll,ms,entities)
+  {
+  }
+  
+  template<class T>
+  MEDFileTemplateFieldMultiTS<T>::MEDFileTemplateFieldMultiTS(const typename MLFieldTraits<T>::FMTSWSDAType& other, bool shallowCopyOfContent):MEDFileAnyTypeFieldMultiTS(other,shallowCopyOfContent)
+  {
+  }
+
+  /*!
+   * Return an extraction of \a this using \a extractDef map to specify the extraction.
+   * The keys of \a extractDef is level relative to max ext of \a mm mesh.
+   *
+   * \return A new object that the caller is responsible to deallocate.
+   */
+  template<class T>
+  typename MLFieldTraits<T>::FMTSType *MEDFileTemplateFieldMultiTS<T>::extractPartImpl(const std::map<int, MCAuto<DataArrayInt> >& extractDef, MEDFileMesh *mm) const
+  {
+    if(!mm)
+      throw INTERP_KERNEL::Exception("MEDFileFieldMultiTS::extractPart : mesh is null !");
+    MCAuto<typename MLFieldTraits<T>::FMTSType> fmtsOut(MLFieldTraits<T>::FMTSType::New());
+    int nbTS(getNumberOfTS());
+    for(int i=0;i<nbTS;i++)
+      {
+        MCAuto<MEDFileAnyTypeField1TS> f1ts(getTimeStepAtPos(i));
+        MCAuto<typename MLFieldTraits<T>::F1TSType> f1ts2(DynamicCastSafe<MEDFileAnyTypeField1TS,typename MLFieldTraits<T>::F1TSType>(f1ts));
+        MCAuto<typename MLFieldTraits<T>::F1TSType> f1tsOut(f1ts2->extractPartImpl(extractDef,mm));
+        fmtsOut->pushBackTimeStep(f1tsOut);
+      }
+    return fmtsOut.retn();
+  }
 }
 
 #endif
index 60617cd473c44b736fc57e73eccb8eab24654ba5..f62d881febc44520aa3d3f20961cd7cd2218c650 100644 (file)
@@ -39,10 +39,13 @@ namespace MEDCoupling
   class MEDFileField1TSWithoutSDA;
   class MEDFileIntField1TSWithoutSDA;
   class MEDFileFloatField1TSWithoutSDA;
+  class MEDFileFieldMultiTSWithoutSDA;
+  class MEDFileIntFieldMultiTSWithoutSDA;
   
   template<>
   struct MEDLOADER_EXPORT MLFieldTraits<double>
   {
+    typedef MEDFileFieldMultiTSWithoutSDA FMTSWSDAType;
     typedef MEDFileFieldMultiTS FMTSType;
     typedef MEDFileField1TS F1TSType;
     typedef MEDFileField1TSWithoutSDA F1TSWSDAType;
@@ -51,6 +54,7 @@ namespace MEDCoupling
   template<>
   struct MEDLOADER_EXPORT MLFieldTraits<float>
   {
+    //typedef MEDFileFloatFieldMultiTSWithoutSDA FMTSWSDAType;
     //typedef MEDFileFloatFieldMultiTS FMTSType;
     typedef MEDFileFloatField1TS F1TSType;
     typedef MEDFileFloatField1TSWithoutSDA F1TSWSDAType;
@@ -59,6 +63,7 @@ namespace MEDCoupling
   template<>
   struct MEDLOADER_EXPORT MLFieldTraits<int>
   {
+    typedef MEDFileIntFieldMultiTSWithoutSDA FMTSWSDAType;
     typedef MEDFileIntFieldMultiTS FMTSType;
     typedef MEDFileIntField1TS F1TSType;
     typedef MEDFileIntField1TSWithoutSDA F1TSWSDAType;