X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FMEDFileMeshLL.hxx;h=8a8d31b85a0ab9a24919a4f38288a85cff73615e;hb=b3e28553eab4c76446ec4214ad4a8d71528905ab;hp=569131ea8a08f9f624ed1ba2a531d38fa6b6fe25;hpb=56fddf07c0b7170f79791d38e2b909a8a5b0b872;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/MEDFileMeshLL.hxx b/src/MEDLoader/MEDFileMeshLL.hxx index 569131ea8..8a8d31b85 100644 --- a/src/MEDLoader/MEDFileMeshLL.hxx +++ b/src/MEDLoader/MEDFileMeshLL.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -29,16 +29,46 @@ #include "MEDCoupling1GTUMesh.hxx" #include "MEDCouplingPartDefinition.hxx" #include "MEDCouplingCurveLinearMesh.hxx" -#include "MEDCouplingAutoRefCountObjectPtr.hxx" +#include "MCAuto.hxx" + +#include "InterpKernelAutoPtr.hxx" #include "med.h" #include -namespace ParaMEDMEM +namespace MEDCoupling { class MEDFileMeshReadSelector; + class MeshOrStructMeshCls + { + protected: + MeshOrStructMeshCls(int mid):_mid(mid) { } + public: + int getID() const { return _mid; } + virtual std::vector getAxisInfoOnMesh(med_idt fid, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& nstep, int& Mdim, MEDFileString& description, MEDFileString& dtunit, MEDFileString& univName) const = 0; + virtual double checkMeshTimeStep(med_idt fid, const std::string& mName, int nstep, int dt, int it) const = 0; + private: + int _mid; + }; + + class MeshCls : public MeshOrStructMeshCls + { + public: + MeshCls(int mid):MeshOrStructMeshCls(mid) { } + std::vector getAxisInfoOnMesh(med_idt fid, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& nstep, int& Mdim, MEDFileString& description, MEDFileString& dtunit, MEDFileString& univName) const; + double checkMeshTimeStep(med_idt fid, const std::string& mName, int nstep, int dt, int it) const; + }; + + class StructMeshCls : public MeshOrStructMeshCls + { + public: + StructMeshCls(int mid):MeshOrStructMeshCls(mid) { } + std::vector getAxisInfoOnMesh(med_idt fid, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& nstep, int& Mdim, MEDFileString& description, MEDFileString& dtunit, MEDFileString& univName) const; + double checkMeshTimeStep(med_idt fid, const std::string& mName, int nstep, int dt, int it) const; + }; + class MEDFileMeshL2 : public RefCountObject { public: @@ -52,12 +82,25 @@ namespace ParaMEDMEM int getIteration() const { return _iteration; } int getOrder() const { return _order; } double getTime() const { return _time; } - MEDCouplingAutoRefCountObjectPtr getPartDefOfCoo() const { return _part_coords; } - std::vector getAxisInfoOnMesh(med_idt fid, int mId, const std::string& mName, ParaMEDMEM::MEDCouplingMeshType& meshType, int& nstep, int& Mdim); - static int GetMeshIdFromName(med_idt fid, const std::string& mName, ParaMEDMEM::MEDCouplingMeshType& meshType, int& dt, int& it, std::string& dtunit1); - static double CheckMeshTimeStep(med_idt fid, const std::string& mname, int nstep, int dt, int it); + MCAuto getPartDefOfCoo() const { return _part_coords; } + std::vector getAxisInfoOnMesh(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& nstep, int& Mdim); + static INTERP_KERNEL::AutoCppPtr GetMeshIdFromName(med_idt fid, const std::string& mName, MEDCoupling::MEDCouplingMeshType& meshType, MEDCoupling::MEDCouplingAxisType& axType, int& dt, int& it, std::string& dtunit1); static void ReadFamiliesAndGrps(med_idt fid, const std::string& mname, std::map& fams, std::map >& grps, MEDFileMeshReadSelector *mrs); static void WriteFamiliesAndGrps(med_idt fid, const std::string& mname, const std::map& fams, const std::map >& grps, int tooLongStrPol); + static bool RenameFamiliesFromFileToMem(std::vector< std::string >& famNames); + static bool RenameFamiliesFromMemToFile(std::vector< std::string >& famNames); + static MEDCoupling::MEDCouplingAxisType TraduceAxisType(med_axis_type at); + static MEDCoupling::MEDCouplingAxisType TraduceAxisTypeStruct(med_grid_type gt); + static med_axis_type TraduceAxisTypeRev(MEDCoupling::MEDCouplingAxisType at); + static med_grid_type TraduceAxisTypeRevStruct(MEDCoupling::MEDCouplingAxisType at); + private: + typedef bool (*RenameFamiliesPatternFunc)(std::vector< std::string >&); + static void RenameFamiliesPatternInternal(std::vector< std::pair > > >& crudeFams, RenameFamiliesPatternFunc func); + static void RenameFamiliesFromFileToMemInternal(std::vector< std::pair > > >& crudeFams); + static void RenameFamiliesFromMemToFileInternal(std::vector< std::pair > > >& crudeFams); + public: + static const char ZE_SEP_FOR_FAMILY_KILLERS[]; + static int ZE_SEP2_FOR_FAMILY_KILLERS; protected: MEDFileString _name; MEDFileString _description; @@ -66,39 +109,39 @@ namespace ParaMEDMEM int _iteration; int _order; double _time; - MEDCouplingAutoRefCountObjectPtr _part_coords; + MCAuto _part_coords; }; class MEDFileUMeshL2 : public MEDFileMeshL2 { public: MEDFileUMeshL2(); - std::vector loadCommonPart(med_idt fid, int mId, const std::string& mName, int dt, int it, int& Mdim); - void loadAll(med_idt fid, int mId, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs); - void loadPart(med_idt fid, int mId, const std::string& mName, const std::vector& types, const std::vector& slicPerTyp, int dt, int it, MEDFileMeshReadSelector *mrs); + std::vector loadCommonPart(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it, int& Mdim); + void loadAll(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs); + void loadPart(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, const std::vector& types, const std::vector& slicPerTyp, int dt, int it, MEDFileMeshReadSelector *mrs); void loadConnectivity(med_idt fid, int mdim, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs); void loadPartOfConnectivity(med_idt fid, int mdim, const std::string& mName, const std::vector& types, const std::vector& slicPerTyp, int dt, int it, MEDFileMeshReadSelector *mrs); - void loadCoords(med_idt fid, int mId, const std::vector& infosOnComp, const std::string& mName, int dt, int it); - void loadPartCoords(med_idt fid, int mId, const std::vector& infosOnComp, const std::string& mName, int dt, int it, int nMin, int nMax); + void loadCoords(med_idt fid, const std::vector& infosOnComp, const std::string& mName, int dt, int it); + void loadPartCoords(med_idt fid, const std::vector& infosOnComp, const std::string& mName, int dt, int it, int nMin, int nMax); int getNumberOfLevels() const { return _per_type_mesh.size(); } bool emptyLev(int levId) const { return _per_type_mesh[levId].empty(); } - const std::vector< MEDCouplingAutoRefCountObjectPtr >& getLev(int levId) const { return _per_type_mesh[levId]; } + const std::vector< MCAuto >& getLev(int levId) const { return _per_type_mesh[levId]; } bool isFamDefinedOnLev(int levId) const; bool isNumDefinedOnLev(int levId) const; bool isNamesDefinedOnLev(int levId) const; - MEDCouplingAutoRefCountObjectPtr getCoords() const { return _coords; } - MEDCouplingAutoRefCountObjectPtr getCoordsFamily() const { return _fam_coords; } - MEDCouplingAutoRefCountObjectPtr getCoordsNum() const { return _num_coords; } - MEDCouplingAutoRefCountObjectPtr getCoordsName() const { return _name_coords; } + MCAuto getCoords() const { return _coords; } + MCAuto getCoordsFamily() const { return _fam_coords; } + MCAuto getCoordsNum() const { return _num_coords; } + MCAuto getCoordsName() const { return _name_coords; } static void WriteCoords(med_idt fid, const std::string& mname, int dt, int it, double time, const DataArrayDouble *coords, const DataArrayInt *famCoords, const DataArrayInt *numCoords, const DataArrayAsciiChar *nameCoords); private: void sortTypes(); private: - std::vector< std::vector< MEDCouplingAutoRefCountObjectPtr > > _per_type_mesh; - MEDCouplingAutoRefCountObjectPtr _coords; - MEDCouplingAutoRefCountObjectPtr _fam_coords; - MEDCouplingAutoRefCountObjectPtr _num_coords; - MEDCouplingAutoRefCountObjectPtr _name_coords; + std::vector< std::vector< MCAuto > > _per_type_mesh; + MCAuto _coords; + MCAuto _fam_coords; + MCAuto _num_coords; + MCAuto _name_coords; }; class MEDFileStrMeshL2 : public MEDFileMeshL2 @@ -109,22 +152,24 @@ namespace ParaMEDMEM { public: MEDFileCMeshL2(); - void loadAll(med_idt fid, int mId, const std::string& mName, int dt, int it); + void loadAll(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it); MEDCouplingCMesh *getMesh() { return _cmesh; } + MEDCoupling::MEDCouplingAxisType getAxisType() const { return _ax_type; } private: static med_data_type GetDataTypeCorrespondingToSpaceId(int id); private: - MEDCouplingAutoRefCountObjectPtr _cmesh; + MCAuto _cmesh; + MEDCoupling::MEDCouplingAxisType _ax_type; }; class MEDFileCLMeshL2 : public MEDFileStrMeshL2 { public: MEDFileCLMeshL2(); - void loadAll(med_idt fid, int mId, const std::string& mName, int dt, int it); + void loadAll(med_idt fid, const MeshOrStructMeshCls *mId, const std::string& mName, int dt, int it); MEDCouplingCurveLinearMesh *getMesh() { return _clmesh; } private: - MEDCouplingAutoRefCountObjectPtr _clmesh; + MCAuto _clmesh; }; class MEDFileMesh; @@ -143,7 +188,7 @@ namespace ParaMEDMEM const MEDFileUMeshSplitL1 *_st; mutable std::size_t _mpt_time; mutable std::size_t _num_time; - mutable MEDCouplingAutoRefCountObjectPtr _m; + mutable MCAuto _m; }; class MEDFileUMeshAggregateCompute : public BigMemoryObject @@ -155,8 +200,10 @@ namespace ParaMEDMEM void assignDefParts(const std::vector& partDefs); void assignUMesh(MEDCouplingUMesh *m); MEDCouplingUMesh *getUmesh() const; + int getNumberOfCells() const; std::vector getParts() const; std::vector getGeoTypes() const; + int getNumberOfCellsWithType(INTERP_KERNEL::NormalizedCellType ct) const; std::vector retrievePartsWithoutComputation() const; MEDCoupling1GTUMesh *retrievePartWithoutComputation(INTERP_KERNEL::NormalizedCellType gt) const; void getStartStopOfGeoTypeWithoutComputation(INTERP_KERNEL::NormalizedCellType gt, int& start, int& stop) const; @@ -165,8 +212,10 @@ namespace ParaMEDMEM std::size_t getTimeOfThis() const; std::size_t getHeapMemorySizeWithoutChildren() const; std::vector getDirectChildrenWithNull() const; - MEDFileUMeshAggregateCompute deepCpy(DataArrayDouble *coords) const; + MEDFileUMeshAggregateCompute deepCopy(DataArrayDouble *coords) const; + void shallowCpyMeshes(); bool isEqual(const MEDFileUMeshAggregateCompute& other, double eps, std::string& what) const; + void checkConsistency() const; void clearNonDiscrAttributes() const; void synchronizeTinyInfo(const MEDFileMesh& master) const; bool empty() const; @@ -176,20 +225,23 @@ namespace ParaMEDMEM void setCoords(DataArrayDouble *coords); void forceComputationOfPartsFromUMesh() const; const PartDefinition *getPartDefOfWithoutComputation(INTERP_KERNEL::NormalizedCellType gt) const; + void serialize(std::vector& tinyInt, std::vector< MCAuto >& bigArraysI) const; + void unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MCAuto >& bigArraysI); private: std::size_t getTimeOfParts() const; std::size_t getTimeOfUMesh() const; private: - mutable std::vector< MEDCouplingAutoRefCountObjectPtr > _m_parts; + mutable std::vector< MCAuto > _m_parts; mutable std::size_t _mp_time; mutable std::size_t _m_time; - mutable MEDCouplingAutoRefCountObjectPtr _m; - mutable std::vector< MEDCouplingAutoRefCountObjectPtr > _part_def; + mutable MCAuto _m; + mutable std::vector< MCAuto > _part_def; }; class MEDFileUMeshSplitL1 : public RefCountObject { friend class MEDFileUMeshPermCompute; + friend class MEDFileUMesh; public: MEDFileUMeshSplitL1(const MEDFileUMeshSplitL1& other); MEDFileUMeshSplitL1(const MEDFileUMeshL2& l2, const std::string& mName, int id); @@ -199,7 +251,9 @@ namespace ParaMEDMEM void setName(const std::string& name); std::size_t getHeapMemorySizeWithoutChildren() const; std::vector getDirectChildrenWithNull() const; - MEDFileUMeshSplitL1 *deepCpy(DataArrayDouble *coords) const; + MEDFileUMeshSplitL1 *shallowCpyUsingCoords(DataArrayDouble *coords) const; + MEDFileUMeshSplitL1 *deepCopy(DataArrayDouble *coords) const; + void checkConsistency() const; void setCoords(DataArrayDouble *coords); bool isEqual(const MEDFileUMeshSplitL1 *other, double eps, std::string& what) const; void clearNonDiscrAttributes() const; @@ -215,8 +269,10 @@ namespace ParaMEDMEM MEDCouplingUMesh *getFamilyPart(const int *idsBg, const int *idsEnd, bool renum) const; DataArrayInt *getFamilyPartArr(const int *idsBg, const int *idsEnd, bool renum) const; MEDCouplingUMesh *getWholeMesh(bool renum) const; + int getNumberOfCells() const; bool isMeshStoredSplitByType() const { return _m_by_types.isStoredSplitByType(); } std::vector getGeoTypes() const; + int getNumberOfCellsWithType(INTERP_KERNEL::NormalizedCellType ct) const; std::vector getDirectUndergroundSingleGeoTypeMeshes() const { return _m_by_types.retrievePartsWithoutComputation(); } MEDCoupling1GTUMesh *getDirectUndergroundSingleGeoTypeMesh(INTERP_KERNEL::NormalizedCellType gt) const { return _m_by_types.retrievePartWithoutComputation(gt); } DataArrayInt *extractFamilyFieldOnGeoType(INTERP_KERNEL::NormalizedCellType gt) const; @@ -234,31 +290,56 @@ namespace ParaMEDMEM void write(med_idt fid, const std::string& mName, int mdim) const; // void setFamilyArr(DataArrayInt *famArr); + DataArrayInt *getFamilyField(); void setRenumArr(DataArrayInt *renumArr); void setNameArr(DataArrayAsciiChar *nameArr); void changeFamilyIdArr(int oldId, int newId); // void renumberNodesInConn(const int *newNodeNumbersO2N); // + void serialize(std::vector& tinyInt, std::vector< MCAuto >& bigArraysI) const; + void unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MCAuto >& bigArraysI); + // static void ClearNonDiscrAttributes(const MEDCouplingMesh *tmp); static std::vector GetNewFamiliesNumber(int nb, const std::map& families); static void TraduceFamilyNumber(const std::vector< std::vector >& fidsGrps, std::map& familyIds, std::map& famIdTrad, std::map& newfams); static DataArrayInt *Renumber(const DataArrayInt *renum, const DataArrayInt *da); static MEDCouplingUMesh *Renumber2(const DataArrayInt *renum, MEDCouplingUMesh *m, const int *cellIds); + static MEDFileUMeshSplitL1 *Unserialize(const std::string& name, DataArrayDouble *coo, std::vector& tinyInt, std::vector< MCAuto >& bigArraysI); private: + MEDFileUMeshSplitL1(); void assignCommonPart(); MEDCouplingUMesh *renumIfNeeded(MEDCouplingUMesh *m, const int *cellIds) const; DataArrayInt *renumIfNeededArr(const DataArrayInt *da) const; void computeRevNum() const; private: MEDFileUMeshAggregateCompute _m_by_types; - MEDCouplingAutoRefCountObjectPtr _fam; - MEDCouplingAutoRefCountObjectPtr _num; - MEDCouplingAutoRefCountObjectPtr _names; - mutable MEDCouplingAutoRefCountObjectPtr _rev_num; + MCAuto _fam; + MCAuto _num; + MCAuto _names; + mutable MCAuto _rev_num; MEDFileUMeshPermCompute _m; }; + + class MEDFileEltStruct4Mesh : public RefCountObject + { + public: + static MEDFileEltStruct4Mesh *New(med_idt fid, const std::string& mName, int dt, int it, int iterOnStEltOfMesh, MEDFileMeshReadSelector *mrs); + private: + std::size_t getHeapMemorySizeWithoutChildren() const; + std::vector getDirectChildrenWithNull() const; + private: + ~MEDFileEltStruct4Mesh() { } + private: + MEDFileEltStruct4Mesh(med_idt fid, const std::string& mName, int dt, int it, int iterOnStEltOfMesh, MEDFileMeshReadSelector *mrs); + private: + std::string _geo_type_name; + int _geo_type; + MCAuto _conn; + MCAuto _common; + std::vector< MCAuto > _vars; + }; } #endif