]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
[EDF26362] : Check at write time of MEDFileUMesh instance consitency between DataArra...
authorAnthony Geay <anthony.geay@edf.fr>
Mon, 28 Nov 2022 16:34:34 +0000 (17:34 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Mon, 28 Nov 2022 16:34:34 +0000 (17:34 +0100)
src/MEDLoader/MEDFileMesh.cxx
src/MEDLoader/MEDFileMeshLL.cxx
src/MEDLoader/MEDFileMeshLL.hxx
src/MEDLoader/Swig/MEDLoaderTest4.py

index 9a2e20afef10a52fb9500d140a75beedbed98e0c..425c183d0873f4a10b884fac147b1225e40bfaa0 100644 (file)
@@ -3091,8 +3091,11 @@ void MEDFileUMesh::writeMeshLL(med_idt fid) const
   std::string meshName(MEDLoaderBase::buildStringFromFortran(maa,MED_NAME_SIZE));
   MEDFileUMeshL2::WriteCoords(fid,meshName,_iteration,_order,_time,_coords,_fam_coords,_num_coords,_name_coords,_global_num_coords);
   for(std::vector< MCAuto<MEDFileUMeshSplitL1> >::const_iterator it=_ms.begin();it!=_ms.end();it++)
-    if((const MEDFileUMeshSplitL1 *)(*it)!=0)
+    if(it->isNotNull())
+    {
+      (*it)->checkCoordsConsistency(coo);
       (*it)->write(fid,meshName,mdim);
+    }
   MEDFileUMeshL2::WriteFamiliesAndGrps(fid,meshName,_families,_groups,_too_long_str);
 }
 
index 8419e4099df16c0cf8daaadb8b41521bf7dcb0e9..656955a1c153ef01249fc0824ef4918bbfd33550 100644 (file)
@@ -1417,6 +1417,17 @@ void MEDFileUMeshSplitL1::setGroupsFromScratch(const std::vector<const MEDCoupli
     *w=famIdTrad[*w];
 }
 
+void MEDFileUMeshSplitL1::checkCoordsConsistency(const DataArrayDouble *coords) const
+{
+  std::vector<MEDCoupling1GTUMesh *> ms(_m_by_types.getParts());
+  for(auto mesh : ms)
+  {
+    if(mesh)
+      if(mesh->getCoords() != coords)
+        mesh->getCoords()->checkNbOfTuplesAndComp(*coords,"MEDFileUMeshSplitL1::checkCoordsConsistency : mismatch between coordinates instance in MEDFileUMesh and instance in subparts");
+  }
+}
+
 void MEDFileUMeshSplitL1::write(med_idt fid, const std::string& mName, int mdim) const
 {
   std::vector<MEDCoupling1GTUMesh *> ms(_m_by_types.getParts());
index 7fa00c5e7b092ef229fa53277671cf8ff96d5968..c79c371c8cc9c015e34b26557d2b0496db81bb01 100644 (file)
@@ -303,6 +303,7 @@ MCAuto<DataArrayDouble>& _coords, MCAuto<DataArrayIdType>& _fam_coords, MCAuto<D
     void eraseFamilyField();
     void setGroupsFromScratch(const std::vector<const MEDCouplingUMesh *>& ms, std::map<std::string,mcIdType>& familyIds,
                               std::map<std::string, std::vector<std::string> >& groups);
+    void checkCoordsConsistency(const DataArrayDouble *coords) const;
     void write(med_idt fid, const std::string& mName, int mdim) const;
     //
     void setFamilyArr(DataArrayIdType *famArr);
index c33c092d6c659fb2524364b7a0a623245ea827c6..aed4f3b51bba8a395db19692e9be2707b903a658 100644 (file)
@@ -5703,6 +5703,19 @@ class MEDLoaderTest4(unittest.TestCase):
         self.assertTrue( cas1.getGroupArr(0,"GCELL2").isEqual(gcell2) )
         self.assertTrue( cas1.getGroupArr(0,"GCELL3").isEqual(gcell3) )
 
+    @WriteInTmpDir
+    def test46(self):
+        """
+        EDF26362 : unconsistency between DataArrayDouble instance in MEDFileUMesh and those of MEDCouplingUMesh or MEDCoupling1GTUMesh used at write time
+        """
+        fname = "test46.med"
+        arr=DataArrayDouble([0,1,1,2,3])
+        m = MEDCouplingUMesh.Build1DMeshFromCoords(arr)
+        mm = MEDFileUMesh()
+        mm[0] = m
+        m.mergeNodes(1e-5) # coords into m has been modified so coords of mm and m mismatches
+        self.assertRaises(InterpKernelException,mm.write,fname,2) # write fails due to mismatch of number of tuples of coords of mm and those of m
+
     pass
 
 if __name__ == "__main__":