]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
useful copyTimeInfoFrom
authorAnthony Geay <anthony.geay@edf.fr>
Thu, 4 Jan 2018 12:32:32 +0000 (13:32 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Thu, 4 Jan 2018 12:32:32 +0000 (13:32 +0100)
src/MEDLoader/MEDFileField.cxx
src/MEDLoader/MEDFileField.txx
src/MEDLoader/MEDFileField1TS.hxx
src/MEDLoader/MEDFileFieldInternal.cxx
src/MEDLoader/MEDFileFieldInternal.hxx
src/MEDLoader/Swig/MEDLoaderCommon.i
src/MEDLoader/Swig/MEDLoaderTest3.py
src/PyWrapping/TestPyWrapGathered_medcoupling.py
src/PyWrapping/medcoupling_pycode

index 18d7b263af041fd8de6a4eb47dedca659c5b4251..c310994f7a32e8965e87d3300b3f6dcc25d3d6a6 100644 (file)
@@ -650,9 +650,10 @@ void MEDFileFieldLin2QuadVisitor::newPerMeshPerTypePerDisc(const MEDFileFieldPer
     throw INTERP_KERNEL::Exception("Not managed yet for ON_CELLS ON_GAUSS_NE and ON_GAUSS_PT");
   _1ts_update_requested=true;
   MEDFileAnyTypeField1TSWithoutSDA *ct(_cur_f1ts->contentNotNullBase());
-  MEDFileFieldPerMeshPerTypePerDisc *pmtdToModify(ct->getLeafGivenMeshAndTypeAndLocId(_lin->getName(),_gt,pmptpd->getLocId()));
+  int locId(pmptpd->getFather()->locIdOfLeaf(pmptpd));
+  MEDFileFieldPerMeshPerTypePerDisc *pmtdToModify(ct->getLeafGivenMeshAndTypeAndLocId(_lin->getName(),_gt,locId));
   std::string pflName(pmptpd->getProfile());
-  if(pflName==_pfl)
+  if(pflName==_pfl && _matrix.isNotNull())
     {
       updateData(pmtdToModify);
       return ;
@@ -689,14 +690,14 @@ void MEDFileFieldLin2QuadVisitor::newPerMeshPerTypePerDisc(const MEDFileFieldPer
        DataArrayInt *nodeConn(allSeg3->getNodalConnectivity());
        nodeConn->rearrange(3);
        {
-         std::vector<int> v(1,1);
+         std::vector<int> v(1,2);
          midPts=nodeConn->keepSelectedComponents(v);
        }
        cellSeg3Ids=DataArrayInt::FindPermutationFromFirstToSecond(midPts,_new_pts_ids);
        {
          std::vector<int> v(2); v[0]=0; v[1]=1;
          MCAuto<DataArrayInt> tmp(nodeConn->keepSelectedComponents(v));
-         _matrix=tmp->selectByTupleId(tmp->begin(),tmp->end());
+         _matrix=tmp->selectByTupleId(cellSeg3Ids->begin(),cellSeg3Ids->end());
        }
        nodeConn->rearrange(1);
      }
@@ -735,7 +736,7 @@ void MEDFileFieldLin2QuadVisitor::newTimeStepEntry(const MEDFileAnyTypeField1TSW
     return ;
   MCAuto<MEDFileAnyTypeField1TSWithoutSDA> contentCpy(ts->deepCopy());
   MCAuto<MEDFileField1TSWithoutSDA> contentCpy2(DynamicCastSafe<MEDFileAnyTypeField1TSWithoutSDA,MEDFileField1TSWithoutSDA>(contentCpy));
-  if(contentCpy2.isNotNull())
+  if(contentCpy2.isNull())
     return;
   _cur_f1ts=MEDFileField1TS::New(*contentCpy2,true);
   _cur_f1ts->shallowCpyGlobs(*_lin_globs);
@@ -773,7 +774,7 @@ void MEDFileFieldLin2QuadVisitor::endTimeStepEntry(const MEDFileAnyTypeField1TSW
         MCAuto<DataArrayDouble> part0(arr->selectByTupleId(*pts0));
         MCAuto<DataArrayDouble> part1(arr->selectByTupleId(*pts1));
         res=DataArrayDouble::Add(part0,part1);
-        res->applyLin(1.,0.);
+        res->applyLin(0.5,0.);
       }
       res=DataArrayDouble::Aggregate(arr,res);
       _cur_f1ts->setArray(res);
index dfa83a3404e811d4955594b04dcec8b88b6578c6..ab4a0d17826d548c9790faf0ebd143e7cb155967 100644 (file)
@@ -199,6 +199,16 @@ namespace MEDCoupling
       }
   }
 
+  template<class T>
+  void MEDFileField1TSTemplateWithoutSDA<T>::copyTimeInfoFrom(const typename Traits<T>::FieldType *mcf)
+  {
+    if(!mcf)
+      throw INTERP_KERNEL::Exception("MEDFileField1TSTemplateWithoutSDA<T>::copyTimeInfoFrom : input field is nullptr !");
+    int b(0),c(0);
+    double a(mcf->getTime(b,c));
+    setTime(b,c,a);
+  }
+
   ///////////////////////////////////////////////////////
 
   template<class T>
@@ -444,6 +454,12 @@ namespace MEDCoupling
     return ret.retn();
   }
 
+  template<class T>
+  void MEDFileTemplateField1TS<T>::copyTimeInfoFrom(const typename Traits<T>::FieldType *mcf)
+  {
+    contentNotNull()->copyTimeInfoFrom(mcf);
+  }
+
   /*!
    * This is the simplest version to fetch a field for MED structure. One drawback : if \a this is a complex field (multi spatial discretization inside a same field) this method will throw exception and more advance
    * method should be called (getFieldOnMeshAtLevel for example).
index 55d681f3a21830f584ddb9fbff2c7caefb385509..54f75f887312c9e8cc78c4385d8a4310e5cd85e6 100644 (file)
@@ -160,6 +160,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT const DataArray *getOrCreateAndGetArray() const;
     MEDLOADER_EXPORT DataArray *getUndergroundDataArray() const;
     MEDLOADER_EXPORT void aggregate(const typename std::vector< typename MLFieldTraits<T>::F1TSWSDAType const * >& f1tss, const std::vector< std::vector< std::pair<int,int> > >& dts);
+    MEDLOADER_EXPORT void copyTimeInfoFrom(const typename Traits<T>::FieldType *mcf);
   protected:
     MCAuto< typename Traits<T>::ArrayType > _arr;
   };
@@ -355,6 +356,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT static MCAuto<typename Traits<T>::FieldType> SetDataArrayInField(MEDCouplingFieldDouble *f, MCAuto<DataArray>& arr);
     MEDLOADER_EXPORT static MCAuto<MEDCouplingFieldDouble> ToFieldTemplateWithTime(const typename Traits<T>::FieldType *f);
   public:
+    MEDLOADER_EXPORT void copyTimeInfoFrom(const typename Traits<T>::FieldType *mcf);
     MEDLOADER_EXPORT typename Traits<T>::FieldType *field(const MEDFileMesh *mesh) const;
     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol=0) const;
     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldAtTopLevel(TypeOfField type, int renumPol=0) const;
index 2660a5a7633d02e66fcb800460c11a925460f7ae..2a138059bf61b80ead5e4880aa494ede61c3e1e1 100644 (file)
@@ -1612,6 +1612,18 @@ const MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerTypeCommon::getLe
   return static_cast<const MEDFileFieldPerMeshPerTypePerDisc*>(0);
 }
 
+int MEDFileFieldPerMeshPerTypeCommon::locIdOfLeaf(const MEDFileFieldPerMeshPerTypePerDisc *leaf) const
+{
+  int ret(0);
+  for(std::vector< MCAuto<MEDFileFieldPerMeshPerTypePerDisc> >::const_iterator it=_field_pm_pt_pd.begin();it!=_field_pm_pt_pd.end();it++,ret++)
+    {
+      const MEDFileFieldPerMeshPerTypePerDisc *cand(*it);
+      if(cand==leaf)
+        return ret;
+    }
+  throw INTERP_KERNEL::Exception("MEDFileFieldPerMeshPerTypeCommon::locIdOfLeaf : not found such a leaf in this !");
+}
+
 void MEDFileFieldPerMeshPerTypeCommon::fillValues(int& startEntryId, std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const
 {
   int i=0;
index 2335038c9bbee27d6e81f7d4903f920e294a431d..8c2e4790399e508888447ffc5c887ad14d4bd434 100644 (file)
@@ -253,6 +253,7 @@ namespace MEDCoupling
     MEDFileFieldPerMeshPerTypePerDisc *getLeafGivenLocId(int locId);
     const MEDFileFieldPerMeshPerTypePerDisc *getLeafGivenLocId(int locId) const;
     int getNumberOfLoc() const { return _field_pm_pt_pd.size(); }
+    int locIdOfLeaf(const MEDFileFieldPerMeshPerTypePerDisc *leaf) const;
     void fillValues(int& startEntryId, std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const;
     void setLeaves(const std::vector< MCAuto< MEDFileFieldPerMeshPerTypePerDisc > >& leaves);
     bool keepOnlySpatialDiscretization(TypeOfField tof, int &globalNum, std::vector< std::pair<int,int> >& its);
index 78147f4a0ec0bd97a966fe6de9b6fb7e2f4c6989..014eade6eeda7ddd943fdb07d6ac28070f6be2cb 100644 (file)
@@ -2222,6 +2222,7 @@ namespace MEDCoupling
     static MEDFileField1TS *New(DataArrayByte *db) throw(INTERP_KERNEL::Exception);
     static MEDFileField1TS *New();
     MEDCoupling::MEDFileIntField1TS *convertToInt(bool isDeepCpyGlobs=true) const throw(INTERP_KERNEL::Exception);
+    void copyTimeInfoFrom(MEDCouplingFieldDouble *mcf) throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldDouble *field(const MEDFileMesh *mesh) const throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldDouble *getFieldAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol=0) const throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldDouble *getFieldAtTopLevel(TypeOfField type, int renumPol=0) const throw(INTERP_KERNEL::Exception);
@@ -2339,6 +2340,7 @@ namespace MEDCoupling
     //
     void setFieldNoProfileSBT(const MEDCouplingFieldInt *field) throw(INTERP_KERNEL::Exception);
     void setFieldProfile(const MEDCouplingFieldInt *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile) throw(INTERP_KERNEL::Exception);
+    void copyTimeInfoFrom(MEDCouplingFieldInt *mcf) throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldInt *field(const MEDFileMesh *mesh) const throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldInt *getFieldAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol=0) const throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldInt *getFieldAtTopLevel(TypeOfField type, int renumPol=0) const throw(INTERP_KERNEL::Exception);
@@ -2409,6 +2411,7 @@ namespace MEDCoupling
     //
     void setFieldNoProfileSBT(const MEDCouplingFieldFloat *field) throw(INTERP_KERNEL::Exception);
     void setFieldProfile(const MEDCouplingFieldFloat *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayInt *profile) throw(INTERP_KERNEL::Exception);
+    void copyTimeInfoFrom(MEDCouplingFieldFloat *mcf) throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldFloat *field(const MEDFileMesh *mesh) const throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldFloat *getFieldAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol=0) const throw(INTERP_KERNEL::Exception);
     MEDCouplingFieldFloat *getFieldAtTopLevel(TypeOfField type, int renumPol=0) const throw(INTERP_KERNEL::Exception);
index e61c9028a04718769eb39b492000a4794c19907d..dde857ea1e7332737349c35b88ce069b3f559eb6 100644 (file)
@@ -576,6 +576,10 @@ class MEDLoaderTest3(unittest.TestCase):
         ff1.setTime(3,4,2.3)
         itt,orr,ti=ff1.getTime()
         self.assertEqual(3,itt); self.assertEqual(4,orr); self.assertAlmostEqual(2.3,ti,14);
+        f1.setTime(5.5,7,8)
+        ff1.copyTimeInfoFrom(f1)
+        itt,orr,ti=ff1.getTime()
+        self.assertEqual(7,itt); self.assertEqual(8,orr); self.assertAlmostEqual(5.5,ti,14);
         da,infos=ff1.getUndergroundDataArrayExt()
         f2.getArray().setName(da.getName())#da has the same name than f2
         self.assertTrue(da.isEqual(f2.getArray(),1e-12))
index dd39f8dae1ed16fef1e7744a80fc6bb92077b0e5..4c91bab5b7659d7150a41dedabfddcd6c39123d4 100644 (file)
@@ -98,6 +98,27 @@ class medcouplingTest(unittest.TestCase):
         interface=CommInterface()
         pass
 
+    def test5(self):
+        f=MEDCouplingFieldDouble(ON_NODES)
+        f.setTime(1.25,3,6)
+        a,b,c=f.getTime()
+        self.assertEqual(b,3) ; self.assertEqual(c,6) ; self.assertAlmostEqual(a,1.25,14);
+        f1ts=MEDFileField1TS()
+        f1ts.setTime(10,13,10.75)
+        f.copyTimeInfoFrom(f1ts)
+        a,b,c=f.getTime()
+        self.assertEqual(b,10) ; self.assertEqual(c,13) ; self.assertAlmostEqual(a,10.75,14);
+        f2=MEDCouplingFieldInt(ON_NODES)
+        f2.copyTimeInfoFrom(f1ts)
+        a,b,c=f2.getTime()
+        self.assertEqual(b,10) ; self.assertEqual(c,13) ; self.assertAlmostEqual(a,10.75,14);
+        f3=MEDCouplingFieldFloat(ON_NODES)
+        f3.copyTimeInfoFrom(f1ts)
+        a,b,c=f3.getTime()
+        self.assertEqual(b,10) ; self.assertEqual(c,13) ; self.assertAlmostEqual(a,10.75,14);
+        pass
+        
+
     def partitionerTesterHelper(self,algoSelected):
         arr=DataArrayDouble(10) ; arr.iota()
         m=MEDCouplingCMesh() ; m.setCoords(arr,arr)
index a3dfe1a20cdd8546aa4fb08706a91041c50df741..a286b9116d2d59c61126e449dd12186a705ed24a 100644 (file)
@@ -82,10 +82,19 @@ def MEDCouplingMesh_write(self,fileName):
 
 def MEDCouplingField_write(self,fileName):
     MEDCouplingWriterHelper(self,fileName,WriteField)
+    
+def MEDCouplingFieldT_copyTimeInfoFrom(self,mlf1ts):
+    assert(isinstance(mlf1ts,MEDFileAnyTypeField1TS))
+    a,b,c=mlf1ts.getTime()
+    self.setTime(c,a,b)
+    pass
         
 MEDCouplingMesh.write=MEDCouplingMesh_write
 del MEDCouplingMesh_write
 MEDCouplingField.write=MEDCouplingField_write
 del MEDCouplingField_write
-
+MEDCouplingFieldDouble.copyTimeInfoFrom=MEDCouplingFieldT_copyTimeInfoFrom
+MEDCouplingFieldInt.copyTimeInfoFrom=MEDCouplingFieldT_copyTimeInfoFrom
+MEDCouplingFieldFloat.copyTimeInfoFrom=MEDCouplingFieldT_copyTimeInfoFrom
+del MEDCouplingFieldT_copyTimeInfoFrom
 %}