]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Step 8 : meshes have been managed, fields still remaining.
authorAnthony Geay <anthony.geay@edf.fr>
Tue, 24 Jan 2017 11:10:22 +0000 (12:10 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Tue, 24 Jan 2017 11:10:22 +0000 (12:10 +0100)
src/MEDLoader/MEDFileBlowStrEltUp.cxx
src/MEDLoader/MEDFileBlowStrEltUp.hxx
src/MEDLoader/MEDFileField.cxx
src/MEDLoader/MEDFileField.hxx
src/MEDLoader/MEDFileMesh.hxx
src/MEDLoader/MEDFileMeshElt.hxx
src/MEDLoader/MEDFileMeshLL.hxx
src/MEDLoader/Swig/MEDLoaderCommon.i

index 9d10247df6e9d871ae8812bd5d8a1dca40428bf1..0ee8ec16fea0b050a398a7294fce0696acbec836 100644 (file)
 // Author : Anthony Geay (EDF R&D)
 
 #include "MEDFileBlowStrEltUp.hxx"
+#include "MEDCouplingFieldDouble.hxx"
 
 using namespace MEDCoupling;
 
+const char MEDFileBlowStrEltUp::MED_BALL_STR[]="MED_BALL";
+
 MEDFileBlowStrEltUp::MEDFileBlowStrEltUp(const MEDFileFields *fsOnlyOnSE, const MEDFileMeshes *ms, const MEDFileStructureElements *ses)
 {
   if(!fsOnlyOnSE || !ms || !ses)
@@ -37,4 +40,182 @@ MEDFileBlowStrEltUp::MEDFileBlowStrEltUp(const MEDFileFields *fsOnlyOnSE, const
       MCAuto<MEDFileFields> f(fsOnlyOnSE->partOfThisLyingOnSpecifiedMeshSEName(p.first,p.second));
       _elts[i]=f;
     }
+  for(std::size_t i=0;i<sz;i++)
+    {
+      const std::pair<std::string,std::string>& p(ps[i]);
+      MEDFileMesh *mesh(_ms->getMeshWithName(p.first));
+      if(!mesh)
+        throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp : NULL mesh !");
+      MEDFileUMesh *umesh(dynamic_cast<MEDFileUMesh *>(mesh));
+      if(!umesh)
+        throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp : Blow up of Stru Elt not managed yet for unstructured meshes !");
+    }
+}
+
+/*!
+ * \param [in] mesh - The mesh containing structure element called \a seName. After the call of this method the Structure elements parts will be removed.
+ * \param [out] mOut - the physical mesh of the structure element \a seName in mesh \a mesh
+ * \param [out] fsOut - the list of var attribute of structure element \a seName - \b WARNING no time steps here
+ */
+MCAuto<MEDFileEltStruct4Mesh> MEDFileBlowStrEltUp::dealWithSEInMesh(const std::string& seName, MEDFileUMesh *mesh, MCAuto<MEDFileUMesh>& mOut, MCAuto<MEDFileFields>& fsOut) const
+{
+  if(!mesh)
+    throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::dealWithSEInMesh : null pointer !");
+  if(seName==MED_BALL_STR)
+    {
+      MCAuto<MEDFileEltStruct4Mesh> ret(dealWithMEDBALLInMesh(mesh,mOut,fsOut));
+      mesh->killStructureElements();
+      return ret;
+    }
+  throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::dealWithSEInMesh : only MED_BALL is managed for the moment, but if you are interested please send spec to anthony.geay@edf.fr !");
+}
+
+MCAuto<MEDFileEltStruct4Mesh> MEDFileBlowStrEltUp::dealWithMEDBALLInMesh(const MEDFileUMesh *mesh, MCAuto<MEDFileUMesh>& mOut, MCAuto<MEDFileFields>& fsOut) const
+{
+  mOut=MEDFileUMesh::New(); fsOut=MEDFileFields::New();
+  const std::vector< MCAuto<MEDFileEltStruct4Mesh> >& strs(mesh->getAccessOfUndergroundEltStrs());
+  MCAuto<MEDFileEltStruct4Mesh> zeStr;
+  for(std::vector< MCAuto<MEDFileEltStruct4Mesh> >::const_iterator it=strs.begin();it!=strs.end();it++)
+    {
+      if((*it)->getGeoTypeName()==MED_BALL_STR)
+        {
+          zeStr=*it;
+          break;
+        }
+    }
+  if(zeStr.isNull())
+    {
+      std::ostringstream oss; oss << "MEDFileBlowStrEltUp::dealWithMEDBALLInMesh : no geo type with name " <<  MED_BALL_STR << " in " << mesh->getName() << " !";
+      throw INTERP_KERNEL::Exception(oss.str());
+    }
+  const DataArrayDouble *coo(mesh->getCoords());
+  if(!coo)
+    throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::dealWithMEDBALLInMesh : null coords !");
+  MCAuto<DataArrayInt> conn(zeStr->getConn());
+  if(conn.isNull())
+    throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::dealWithMEDBALLInMesh : null connectivity !");
+  conn->checkAllocated();
+  if(conn->getNumberOfComponents()!=1)
+    throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::dealWithMEDBALLInMesh : excepted to be single compo !");
+  int nbCells(conn->getNumberOfTuples());
+  MCAuto<DataArrayDouble> connOut(coo->selectByTupleIdSafe(conn->begin(),conn->end()));
+  MCAuto<MEDCouplingUMesh> mcOut(MEDCouplingUMesh::Build0DMeshFromCoords(connOut));
+  mcOut->setName(BuildNewMeshName(mesh->getName(),MED_BALL_STR));
+  mOut->setMeshAtLevel(0,mcOut);
+  const DataArrayInt *ff1(mesh->getFamilyFieldAtLevel(1));
+  if(ff1)
+    {
+      MCAuto<DataArrayInt> ff1o(ff1->selectByTupleIdSafe(conn->begin(),conn->end()));
+      mOut->setFamilyFieldArr(1,ff1o);
+    }
+  const DataArrayInt *nf1(mesh->getNumberFieldAtLevel(1));
+  if(nf1)
+    {
+      MCAuto<DataArrayInt> nf1o(nf1->selectByTupleIdSafe(conn->begin(),conn->end()));
+      mOut->setRenumFieldArr(1,nf1o);
+    }
+  MCAuto<MEDFileUMeshPerTypeCommon> md(zeStr->getMeshDef());
+  const DataArrayInt *ff0(md->getFam());
+  if(ff0)
+    {
+      MCAuto<DataArrayInt> ff0o(ff0->duplicateEachTupleNTimes(nbCells));
+      mOut->setFamilyFieldArr(0,ff0o);
+    }
+  const DataArrayInt *nf0(md->getNum());
+  if(nf0)
+    {
+      MCAuto<DataArrayInt> nf0o(ff0->duplicateEachTupleNTimes(nbCells));
+      mOut->setRenumFieldArr(0,nf0o);
+    }
+  mOut->copyFamGrpMapsFrom(*mesh);
+  const std::vector< MCAuto<DataArray> >& vars(zeStr->getVars());
+  for(std::vector< MCAuto<DataArray> >::const_iterator it=vars.begin();it!=vars.end();it++)
+    {
+      const DataArray *elt(*it);
+      if(!elt)
+        continue;
+      {
+        const DataArrayDouble *eltC(dynamic_cast<const DataArrayDouble *>(elt));
+        if(eltC)
+          {
+            MCAuto<MEDFileFieldMultiTS> fmts(MEDFileFieldMultiTS::New());
+            MCAuto<MEDFileField1TS> f1ts(MEDFileField1TS::New());
+            MCAuto<MEDCouplingFieldDouble> f(MEDCouplingFieldDouble::New(ON_NODES));
+            f->setMesh(mcOut);
+            f->setArray(const_cast<DataArrayDouble *>(eltC));
+            f->setName(eltC->getName());
+            f1ts->setFieldNoProfileSBT(f);
+            fmts->pushBackTimeStep(f1ts);
+            fsOut->pushField(fmts);
+          }
+      }
+    }
+  return zeStr;
+}
+
+/*!
+ * \param [in] fs - fields lying all on same mesh and on same structure element
+ * \param [in] zeStr - ze structure of current structure element
+ * \param [in] varAtt - fields containing var att of current structure element. WARNING at this stage the number of iteration are equal to one for each field in \a varAtt
+ * \param [out] zeOutputs - ze fields that are the concatenation of fields in \a fs transformed and those in \a varAtt normalized in time space
+ */
+void MEDFileBlowStrEltUp::dealWithSEInFields(const std::string& seName, const MEDFileFields *fs, const MEDFileEltStruct4Mesh *zeStr, const MEDFileFields *varAtt, MCAuto<MEDFileFields>& zeOutputs) const
+{
+  if(!fs)
+    throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::dealWithSEInFields : null pointer !");
+  if(seName==MED_BALL_STR)
+    {
+      dealWithMEDBALLSInFields(fs,zeStr,varAtt,zeOutputs);
+      return ;
+    }
+  throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::dealWithSEInFields : only MED_BALL is managed for the moment, but if you are interested please send spec to anthony.geay@edf.fr !");
+}
+
+void MEDFileBlowStrEltUp::dealWithMEDBALLSInFields(const MEDFileFields *fs, const MEDFileEltStruct4Mesh *zeStr, const MEDFileFields *varAtt, MCAuto<MEDFileFields>& zeOutputs) const
+{
+  
+}
+
+void MEDFileBlowStrEltUp::generate(MCAuto<MEDFileMeshes>& msOut, MCAuto<MEDFileFields>& allZeOutFields)
+{
+  msOut=MEDFileMeshes::New();
+  allZeOutFields=MEDFileFields::New();
+  for(std::vector< MCAuto<MEDFileFields> >::iterator elt=_elts.begin();elt!=_elts.end();elt++)
+    {
+      std::vector< std::pair<std::string,std::string> > ps;
+      (*elt)->getMeshSENames(ps);
+      if(ps.size()!=1)
+        throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::generateMeshes : internal error !");
+      MEDFileMesh *mesh(_ms->getMeshWithName(ps[0].first));
+      if(!mesh)
+        throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::generateMeshes : NULL mesh !");
+      MEDFileUMesh *umesh(dynamic_cast<MEDFileUMesh *>(mesh));
+      if(!umesh)
+        throw INTERP_KERNEL::Exception("MEDFileBlowStrEltUp::generateMeshes : Blow up of Stru Elt not managed yet for unstructured meshes !");
+      MCAuto<MEDFileUMesh> mOut;
+      MCAuto<MEDFileFields> fsOut1;
+      MCAuto<MEDFileEltStruct4Mesh> zeStr(dealWithSEInMesh(ps[0].second,umesh,mOut,fsOut1));
+      msOut->pushMesh(umesh);
+      MCAuto<MEDFileFields> fsOut2;
+      dealWithSEInFields(ps[0].second,*elt,zeStr,fsOut1,fsOut2);
+      allZeOutFields->aggregate(*fsOut2);
+    }
+}
+
+std::string MEDFileBlowStrEltUp::BuildNewMeshName(const std::string& meshName, const std::string& seName)
+{
+  std::ostringstream mNameOut;
+  mNameOut << meshName << "_" << seName;
+  return mNameOut.str();
+}
+
+void MEDFileBlowStrEltUp::DealWithSE(MEDFileFields *fs, const MEDFileMeshes *ms, const MEDFileStructureElements *ses, MCAuto<MEDFileFields>& fsOut, MCAuto<MEDFileMeshes>& msOut)
+{
+  MCAuto<MEDFileFields> fsSEOnly(fs->partOfThisOnStructureElements());
+  fs->killStructureElements();
+  MEDFileBlowStrEltUp bu(fsSEOnly,ms,ses);
+  MCAuto<MEDFileMeshes> msOut1;
+  MCAuto<MEDFileFields> allZeOutFields1;
+  bu.generate(msOut1,allZeOutFields1);
+  
 }
index 6930f352c17e86091d0a0a3d58a59e2886fbacd8..49743a1d7c95b4b97d07e0b1c3c2e36ea89b5fe8 100644 (file)
@@ -35,8 +35,18 @@ namespace MEDCoupling
   {
   public:
     MEDFileBlowStrEltUp(const MEDFileFields *fsOnlyOnSE, const MEDFileMeshes *ms, const MEDFileStructureElements *ses);
+    static void DealWithSE(MEDFileFields *fs, const MEDFileMeshes *ms, const MEDFileStructureElements *ses, MCAuto<MEDFileFields>& fsOut, MCAuto<MEDFileMeshes>& msOut);
   private:
-    std::vector< MCAuto<MEDFileFields> > _elts;
+    void generate(MCAuto<MEDFileMeshes>& msOut, MCAuto<MEDFileFields>& allZeOutFields);
+    MCAuto<MEDFileEltStruct4Mesh> dealWithSEInMesh(const std::string& seName, MEDFileUMesh *mesh, MCAuto<MEDFileUMesh>& mOut, MCAuto<MEDFileFields>& fsOut) const;
+    MCAuto<MEDFileEltStruct4Mesh> dealWithMEDBALLInMesh(const MEDFileUMesh *mesh, MCAuto<MEDFileUMesh>& mOut, MCAuto<MEDFileFields>& fsOut) const;
+    void dealWithSEInFields(const std::string& seName, const MEDFileFields *fs, const MEDFileEltStruct4Mesh *zeStr, const MEDFileFields *varAtt, MCAuto<MEDFileFields>& zeOutputs) const;
+    void dealWithMEDBALLSInFields(const MEDFileFields *fs, const MEDFileEltStruct4Mesh *zeStr, const MEDFileFields *varAtt, MCAuto<MEDFileFields>& zeOutputs) const;
+    static std::string BuildNewMeshName(const std::string& meshName, const std::string& seName);
+  public:
+    static const char MED_BALL_STR[];
+  private:
+    std::vector< MCAuto<MEDFileFields> > _elts;// split by pair(meshName,SEName)
     MCConstAuto<MEDFileMeshes> _ms;
     MCConstAuto<MEDFileStructureElements> _ses;
   };
index c6c13a44b339edde835ff0faeb31a16683ffa742..ded7e99dd4468ba3b7c14b05aca2b2965782a7b2 100644 (file)
@@ -11223,6 +11223,23 @@ MCAuto<MEDFileFields> MEDFileFields::partOfThisLyingOnSpecifiedMeshSEName(const
   return ret;
 }
 
+void MEDFileFields::aggregate(const MEDFileFields& other)
+{
+  int nbFieldsToAdd(other.getNumberOfFields());
+  std::vector<std::string> fsn(getFieldsNames());
+  for(int i=0;i<nbFieldsToAdd;i++)
+    {
+      MCAuto<MEDFileAnyTypeFieldMultiTS> elt(other.getFieldAtPos(i));
+      std::string name(elt->getName());
+      if(std::find(fsn.begin(),fsn.end(),name)!=fsn.end())
+        {
+          std::ostringstream oss; oss << "MEDFileFields::aggregate : name \"" << name << "\" already appears !";
+          throw INTERP_KERNEL::Exception(oss.str());
+        }
+      pushField(elt);
+    }
+}
+
 MEDFileFieldsIterator *MEDFileFields::iterator()
 {
   return new MEDFileFieldsIterator(this);
index 1be649510e7c4704c77bbdfad886270a950df26f..8b49d1dacd012e7d061acab39952385ee652b2ab 100644 (file)
@@ -1260,6 +1260,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT void getMeshSENames(std::vector< std::pair<std::string,std::string> >& ps) const;
     MEDLOADER_EXPORT MCAuto<MEDFileFields> partOfThisOnStructureElements() const;
     MEDLOADER_EXPORT MCAuto<MEDFileFields> partOfThisLyingOnSpecifiedMeshSEName(const std::string& meshName, const std::string& seName) const;
+    MEDLOADER_EXPORT void aggregate(const MEDFileFields& other);
     MEDLOADER_EXPORT MEDFileFieldsIterator *iterator();
     MEDLOADER_EXPORT void destroyFieldAtPos(int i);
     MEDLOADER_EXPORT void destroyFieldsAtPos(const int *startIds, const int *endIds);
index 5cca36ee76940240964f46d1504a1852d38a467e..ba5c8fe401b5fd48b4c6aea5269b6c644a582ee4 100644 (file)
@@ -274,6 +274,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT void clearNodeAndCellNumbers();
     MEDLOADER_EXPORT void clearNonDiscrAttributes() const;
     MEDLOADER_EXPORT void setName(const std::string& name);
+    MEDLOADER_EXPORT const std::vector< MCAuto<MEDFileEltStruct4Mesh> >& getAccessOfUndergroundEltStrs() const { return _elt_str; }
     //
     MEDLOADER_EXPORT int getMaxAbsFamilyIdInArrays() const;
     MEDLOADER_EXPORT int getMaxFamilyIdInArrays() const;
index a093fb69d632b6e328a981dbfc3e551a1bde2b8e..57e50f55883ce94665957385f0daf5b93f9f8245 100644 (file)
@@ -43,6 +43,9 @@ namespace MEDCoupling
                         med_entity_type entity, MEDFileMeshReadSelector *mrs);
     std::size_t getHeapMemorySizeWithoutChildren() const;
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
+    const DataArrayInt *getFam() const { return _fam; }
+    const DataArrayInt *getNum() const { return _num; }
+    const DataArrayAsciiChar *getNames() const { return _names; }
   protected:
     MCAuto<DataArrayInt> _num;
     MCAuto<DataArrayInt> _fam;
@@ -59,9 +62,6 @@ namespace MEDCoupling
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
     int getDim() const;
     MEDCoupling1GTUMesh *getMesh() const { return const_cast<MEDCoupling1GTUMesh *>((const MEDCoupling1GTUMesh *)_m); }
-    const DataArrayInt *getFam() const { return _fam; }
-    const DataArrayInt *getNum() const { return _num; }
-    const DataArrayAsciiChar *getNames() const { return _names; }
     const PartDefinition *getPartDef() const { return _pd; }
     static void Write(med_idt fid, const std::string& mname, int mdim, const MEDCoupling1GTUMesh *m, const DataArrayInt *fam, const DataArrayInt *num, const DataArrayAsciiChar *names);
   private:
index 8a8d31b85a0ab9a24919a4f38288a85cff73615e..0113a22bff302baacbb94464e610175603f26191 100644 (file)
@@ -326,6 +326,10 @@ namespace MEDCoupling
   {
   public:
     static MEDFileEltStruct4Mesh *New(med_idt fid, const std::string& mName, int dt, int it, int iterOnStEltOfMesh, MEDFileMeshReadSelector *mrs);
+    std::string getGeoTypeName() const { return _geo_type_name; }
+    MCAuto<DataArrayInt> getConn() const { return _conn; }
+    MCAuto<MEDFileUMeshPerTypeCommon> getMeshDef() const { return _common; }
+    const std::vector< MCAuto<DataArray> >& getVars() const { return _vars; }
   private:
     std::size_t getHeapMemorySizeWithoutChildren() const;
     std::vector<const MEDCoupling::BigMemoryObject*> getDirectChildrenWithNull() const;
index abd8b7b33549b37be0d27941c49f73ce557b4d6d..63061304c885156d9bc5493a61bf797be5d40e6b 100644 (file)
@@ -3022,6 +3022,7 @@ namespace MEDCoupling
     MEDFileAnyTypeFieldMultiTS *getFieldWithName(const std::string& fieldName) const throw(INTERP_KERNEL::Exception);
     MEDFileFields *partOfThisLyingOnSpecifiedMeshName(const std::string& meshName) const throw(INTERP_KERNEL::Exception);
     bool presenceOfStructureElements() const throw(INTERP_KERNEL::Exception);
+    void aggregate(const MEDFileFields& other) throw(INTERP_KERNEL::Exception);
     void killStructureElements() throw(INTERP_KERNEL::Exception);
     void keepOnlyStructureElements() throw(INTERP_KERNEL::Exception);
     void keepOnlyOnMeshSE(const std::string& meshName, const std::string& seName) throw(INTERP_KERNEL::Exception);