]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Ready for fields. OK with UsesCase_MEDstructElement_1.med
authorAnthony Geay <anthony.geay@edf.fr>
Thu, 19 Jan 2017 16:13:32 +0000 (17:13 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Thu, 19 Jan 2017 16:13:32 +0000 (17:13 +0100)
src/MEDLoader/MEDFileData.cxx
src/MEDLoader/MEDFileMeshSupport.cxx
src/MEDLoader/MEDFileMeshSupport.hxx
src/MEDLoader/MEDFileStructureElement.cxx
src/MEDLoader/MEDFileStructureElement.hxx

index 95db854ad4d7ad3c753cc966beb882df751f0ade..2a722d0d6700f16fc7d5e3627ba3e42e2c2d2df9 100644 (file)
@@ -307,11 +307,11 @@ MEDFileData::MEDFileData(med_idt fid)
 try
 {
   readHeader(fid);
+  _mesh_supports=MEDFileMeshSupports::New(fid);
+  _struct_elems=MEDFileStructureElements::New(fid,_mesh_supports);
   _fields=MEDFileFields::New(fid);
   _meshes=MEDFileMeshes::New(fid);
   _params=MEDFileParameters::New(fid);
-  _mesh_supports=MEDFileMeshSupports::New(fid);
-  _struct_elems=MEDFileStructureElements::New(fid);
 }
 catch(INTERP_KERNEL::Exception& e)
 {
index 15dcaadc77765d674793f25eb90253f4d033c865..2d6d0443bb8ff1f64cf786fd6444490d73685254 100644 (file)
@@ -83,3 +83,24 @@ void MEDFileMeshSupports::writeLL(med_idt fid) const
     if((*it).isNotNull())
       (*it)->writeLL(fid);
 }
+
+const MEDFileUMesh *MEDFileMeshSupports::getSupMeshWithName(const std::string& name) const
+{
+  std::vector<std::string> mns;
+  for(std::vector< MCAuto<MEDFileUMesh> >::const_iterator it=_supports.begin();it!=_supports.end();it++)
+    {
+      if((*it).isNotNull())
+        {
+          std::string na((*it)->getName());
+          if(na==name)
+            return *it;
+          else
+            mns.push_back(na);
+        }
+    }
+  std::ostringstream oss;
+  oss << "MEDFileMeshSupports::getSupMeshWithName : no such name \"" << name << "\". Possibilitities are :";
+  std::copy(mns.begin(),mns.end(),std::ostream_iterator<std::string>(oss,","));
+  oss << " !";
+  throw INTERP_KERNEL::Exception(oss.str());
+}
index 868426a45b50bc58d7b1787de6c3debc8863990e..cf2b394c364b3a0ac215a9f11cd14cd31d003268 100644 (file)
@@ -38,6 +38,7 @@ namespace MEDCoupling
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
     std::size_t getHeapMemorySizeWithoutChildren() const;
     void writeLL(med_idt fid) const;
+    const MEDFileUMesh *getSupMeshWithName(const std::string& name) const;
   private:
     MEDFileMeshSupports(med_idt fid);
     MEDFileMeshSupports();
index 417d9d7f0df491c98f7b34f5b25d99ae38bc045f..4ef945d155ea954eef73fff399af99df15a3483d 100644 (file)
@@ -19,6 +19,7 @@
 // Author : Anthony Geay (EDF R&D)
 
 #include "MEDFileStructureElement.hxx"
+#include "MEDFileMeshSupport.hxx"
 #include "MEDLoaderBase.hxx"
 #include "MEDFileMeshLL.hxx"
 #include "MEDFileSafeCaller.txx"
@@ -45,12 +46,12 @@ std::size_t MEDFileSEHolder::getHeapMemorySizeLoc() const
 
 ////////////////////
 
-MEDFileSEConstAtt *MEDFileSEConstAtt::New(med_idt fid, MEDFileStructureElement *father, int idCstAtt)
+MEDFileSEConstAtt *MEDFileSEConstAtt::New(med_idt fid, MEDFileStructureElement *father, int idCstAtt, const MEDFileUMesh *mesh)
 {
-  return new MEDFileSEConstAtt(fid,father,idCstAtt);
+  return new MEDFileSEConstAtt(fid,father,idCstAtt,mesh);
 }
 
-MEDFileSEConstAtt::MEDFileSEConstAtt(med_idt fid, MEDFileStructureElement *father, int idCstAtt):MEDFileSEHolder(father)
+MEDFileSEConstAtt::MEDFileSEConstAtt(med_idt fid, MEDFileStructureElement *father, int idCstAtt, const MEDFileUMesh *mesh):MEDFileSEHolder(father)
 {
   std::string modelName(getModelName());
   INTERP_KERNEL::AutoPtr<char> constattname(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE)),profilename(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
@@ -67,7 +68,26 @@ MEDFileSEConstAtt::MEDFileSEConstAtt(med_idt fid, MEDFileStructureElement *fathe
   _val=MEDFileStructureElement::BuildFrom(constatttype);
   nbCompo=MEDFileStructureElement::EffectiveNbCompo(constatttype,nbCompo);
   if(pflSz==0 && getProfile().empty())
-    pflSz=1;
+    {
+      switch(met)
+        {
+        case MED_CELL:
+          {
+            std::vector<INTERP_KERNEL::NormalizedCellType> gt(mesh->getAllGeoTypes());
+            if(gt.size()!=1)
+              throw INTERP_KERNEL::Exception("MEDFileSEConstAtt constr : only one cell type expected !");
+            pflSz=mesh->getNumberOfCellsWithType(gt[0]);
+            break;
+          }
+        case MED_NODE:
+          {
+            pflSz=mesh->getNumberOfNodes();
+            break;
+          }
+        default:
+          throw INTERP_KERNEL::Exception("MEDFileSEConstAtt cstr : not recognized entity type !");
+        }
+    }
   if(constatttype==MED_ATT_NAME)
     pflSz++;
   std::cerr << "******* " << pflSz << std::endl;
@@ -140,12 +160,12 @@ void MEDFileSEVarAtt::writeLL(med_idt fid) const
 
 ////////////////////
 
-MEDFileStructureElement *MEDFileStructureElement::New(med_idt fid, int idSE)
+MEDFileStructureElement *MEDFileStructureElement::New(med_idt fid, int idSE, const MEDFileMeshSupports *ms)
 {
-  return new MEDFileStructureElement(fid,idSE);
+  return new MEDFileStructureElement(fid,idSE,ms);
 }
 
-MEDFileStructureElement::MEDFileStructureElement(med_idt fid, int idSE)
+MEDFileStructureElement::MEDFileStructureElement(med_idt fid, int idSE, const MEDFileMeshSupports *ms)
 {
   INTERP_KERNEL::AutoPtr<char> modelName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE)),supportMeshName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
   med_geometry_type sgeoType;
@@ -157,10 +177,11 @@ MEDFileStructureElement::MEDFileStructureElement(med_idt fid, int idSE)
     MEDFILESAFECALLERRD0(MEDstructElementInfo,(fid,idSE+1,modelName,&_id_type,&_dim,supportMeshName,&entiyType,&nnode,&ncell,&sgeoType,&nConsAttr,&anyPfl,&nVarAttr));
   }
   _name=MEDLoaderBase::buildStringFromFortran(modelName,MED_NAME_SIZE);
+  _sup_mesh_name=MEDLoaderBase::buildStringFromFortran(supportMeshName,MED_NAME_SIZE);
   _geo_type=MEDFileMesh::ConvertFromMEDFileGeoType(sgeoType);
   _cst_att.resize(nConsAttr);
   for(int i=0;i<nConsAttr;i++)
-    _cst_att[i]=MEDFileSEConstAtt::New(fid,this,i);
+    _cst_att[i]=MEDFileSEConstAtt::New(fid,this,i,ms->getSupMeshWithName(_sup_mesh_name));
   _var_att.resize(nVarAttr);
   for(int i=0;i<nVarAttr;i++)
     _var_att[i]=MEDFileSEVarAtt::New(fid,this,i);
@@ -232,9 +253,9 @@ int MEDFileStructureElement::EffectiveNbCompo(med_attribute_type mat, int nbComp
 
 ////////////////////
 
-MEDFileStructureElements *MEDFileStructureElements::New(med_idt fid)
+MEDFileStructureElements *MEDFileStructureElements::New(med_idt fid, const MEDFileMeshSupports *ms)
 {
-  return new MEDFileStructureElements(fid);
+  return new MEDFileStructureElements(fid,ms);
 }
 
 MEDFileStructureElements *MEDFileStructureElements::New()
@@ -259,12 +280,12 @@ void MEDFileStructureElements::writeLL(med_idt fid) const
 {
 }
 
-MEDFileStructureElements::MEDFileStructureElements(med_idt fid)
+MEDFileStructureElements::MEDFileStructureElements(med_idt fid, const MEDFileMeshSupports *ms)
 {
   int nbSE(MEDnStructElement(fid));
   _elems.resize(nbSE);
   for(int i=0;i<nbSE;i++)
-    _elems[i]=MEDFileStructureElement::New(fid,i);
+    _elems[i]=MEDFileStructureElement::New(fid,i,ms);
 }
 
 MEDFileStructureElements::MEDFileStructureElements()
index 5d9b2ea020c80dbb08ade2c107419ab7eeaf1709..766c1129f8a3c22ac8fabd95095b43b372fe43a5 100644 (file)
@@ -30,6 +30,8 @@
 namespace MEDCoupling
 {
   class MEDFileStructureElement;
+  class MEDFileMeshSupports;
+  class MEDFileUMesh;
   
   class MEDFileSEHolder
   {
@@ -46,7 +48,7 @@ namespace MEDCoupling
 class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlone, public MEDFileSEHolder
   {
   public:
-    static MEDFileSEConstAtt *New(med_idt fid, MEDFileStructureElement *father, int idCstAtt);
+    static MEDFileSEConstAtt *New(med_idt fid, MEDFileStructureElement *father, int idCstAtt, const MEDFileUMesh *mesh);
   public:
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
     std::size_t getHeapMemorySizeWithoutChildren() const;
@@ -54,7 +56,7 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
     void setProfile(const std::string& name);
     std::string getProfile() const;
   private:
-    MEDFileSEConstAtt(med_idt fid, MEDFileStructureElement *father, int idCstAtt);
+    MEDFileSEConstAtt(med_idt fid, MEDFileStructureElement *father, int idCstAtt, const MEDFileUMesh *mesh);
   private:
     std::string _pfl;
     TypeOfField _tof;
@@ -79,7 +81,7 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
   class MEDFileStructureElement : public RefCountObject, public MEDFileWritableStandAlone
   {
   public:
-    MEDLOADER_EXPORT static MEDFileStructureElement *New(med_idt fid, int idSE);
+    MEDLOADER_EXPORT static MEDFileStructureElement *New(med_idt fid, int idSE, const MEDFileMeshSupports *ms);
     MEDLOADER_EXPORT std::string getName() const;
   public:
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
@@ -89,10 +91,11 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
     static MCAuto<DataArray> BuildFrom(med_attribute_type mat);
     static int EffectiveNbCompo(med_attribute_type mat, int nbCompo);
   private:
-    MEDFileStructureElement(med_idt fid, int idSE);
+    MEDFileStructureElement(med_idt fid, int idSE, const MEDFileMeshSupports *ms);
   private:
     int _id_type;
     std::string _name;
+    std::string _sup_mesh_name;
     INTERP_KERNEL::NormalizedCellType _geo_type;
     int _dim;
     std::vector< MCAuto<MEDFileSEConstAtt> > _cst_att;
@@ -102,14 +105,14 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
   class MEDFileStructureElements : public RefCountObject, public MEDFileWritableStandAlone
   {
   public:
-    MEDLOADER_EXPORT static MEDFileStructureElements *New(med_idt fid);
+    MEDLOADER_EXPORT static MEDFileStructureElements *New(med_idt fid, const MEDFileMeshSupports *ms);
     MEDLOADER_EXPORT static MEDFileStructureElements *New();
   public:
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
     std::size_t getHeapMemorySizeWithoutChildren() const;
     void writeLL(med_idt fid) const;
   private:
-    MEDFileStructureElements(med_idt fid);
+    MEDFileStructureElements(med_idt fid, const MEDFileMeshSupports *ms);
     MEDFileStructureElements();
     ~MEDFileStructureElements();
   private: