X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FMEDFileFieldOverView.hxx;h=b3b0436c56ab47cbe65ac2148fe6217402756053;hb=f13ce72017fd205546293a53f7b041824cb50eec;hp=ff4ce6c418c86bf30dbaaa3149e5dc2f74527c20;hpb=abd86904c3b7a6f8979e0ca951febc2690e0ebda;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/MEDFileFieldOverView.hxx b/src/MEDLoader/MEDFileFieldOverView.hxx index ff4ce6c41..b3b0436c5 100644 --- a/src/MEDLoader/MEDFileFieldOverView.hxx +++ b/src/MEDLoader/MEDFileFieldOverView.hxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D +// Copyright (C) 2007-2014 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 // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -39,6 +39,7 @@ namespace ParaMEDMEM class MEDFileMesh; class MEDFileUMesh; class MEDFileCMesh; + class MEDFileStructuredMesh; class MEDFileCurveLinearMesh; class MEDFileFieldGlobs; class MEDFileFieldGlobsReal; @@ -53,10 +54,13 @@ namespace ParaMEDMEM std::vector getDirectChildren() const; const MEDFileMesh *getTheMesh() const { return _mesh; } int getNumberOfNodes() const { return _nb_nodes; } + bool doesManageGeoType(INTERP_KERNEL::NormalizedCellType t) const; int getNumberOfElemsOfGeoType(INTERP_KERNEL::NormalizedCellType t) const; int getLevelOfGeoType(INTERP_KERNEL::NormalizedCellType t) const; int getNumberOfLevs() const; int getNumberOfGeoTypesInLev(int relativeLev) const; + // non const methods + void appendIfImplicitType(INTERP_KERNEL::NormalizedCellType t); private: MEDFileMeshStruct(const MEDFileMesh *mesh); private: @@ -65,9 +69,9 @@ namespace ParaMEDMEM int _nb_nodes; std::vector< std::vector > _geo_types_distrib; }; - + class MEDFileField1TSStructItem; - + class MEDMeshMultiLev : public RefCountObject { public: @@ -78,8 +82,18 @@ namespace ParaMEDMEM static MEDMeshMultiLev *New(const MEDFileMesh *m, const std::vector& levs); static MEDMeshMultiLev *NewOnlyOnNode(const MEDFileMesh *m, const DataArrayInt *pflOnNode); void setNodeReduction(const DataArrayInt *nr); + void setCellReduction(const DataArrayInt *cr); bool isFastlyTheSameStruct(const MEDFileField1TSStructItem& fst, const MEDFileFieldGlobsReal *globs) const; MEDLOADER_EXPORT DataArray *buildDataArray(const MEDFileField1TSStructItem& fst, const MEDFileFieldGlobsReal *globs, const DataArray *vals) const; + MEDLOADER_EXPORT void retrieveFamilyIdsOnCells(DataArrayInt *& famIds, bool& isWithoutCopy) const; + MEDLOADER_EXPORT void retrieveNumberIdsOnCells(DataArrayInt *& numIds, bool& isWithoutCopy) const; + MEDLOADER_EXPORT void retrieveFamilyIdsOnNodes(DataArrayInt *& famIds, bool& isWithoutCopy) const; + MEDLOADER_EXPORT void retrieveNumberIdsOnNodes(DataArrayInt *& numIds, bool& isWithoutCopy) const; + MEDLOADER_EXPORT std::vector< INTERP_KERNEL::NormalizedCellType > getGeoTypes() const; + void setFamilyIdsOnCells(DataArrayInt *famIds, bool isNoCopy); + void setNumberIdsOnCells(DataArrayInt *numIds, bool isNoCopy); + void setFamilyIdsOnNodes(DataArrayInt *famIds, bool isNoCopy); + void setNumberIdsOnNodes(DataArrayInt *numIds, bool isNoCopy); virtual void selectPartOfNodes(const DataArrayInt *pflNodes) = 0; virtual MEDMeshMultiLev *prepare() const = 0; int getNumberOfCells(INTERP_KERNEL::NormalizedCellType t) const; @@ -87,23 +101,35 @@ namespace ParaMEDMEM protected: std::string getPflNameOfId(int id) const; DataArray *constructDataArray(const MEDFileField1TSStructItem& fst, const MEDFileFieldGlobsReal *globs, const DataArray *vals) const; + virtual void appendVertices(const DataArrayInt *verticesToAdd, DataArrayInt *nr); protected: - MEDMeshMultiLev(); + MEDMeshMultiLev(const MEDFileMesh *mesh); MEDMeshMultiLev(const MEDMeshMultiLev& other); - MEDMeshMultiLev(int nbNodes, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities); + MEDMeshMultiLev(const MEDFileMesh *mesh, int nbNodes, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities); protected: + const MEDFileMesh *_mesh; std::vector< MEDCouplingAutoRefCountObjectPtr > _pfls; std::vector< INTERP_KERNEL::NormalizedCellType > _geo_types; std::vector _nb_entities; MEDCouplingAutoRefCountObjectPtr _node_reduction; int _nb_nodes; + // + MEDCouplingAutoRefCountObjectPtr _cell_fam_ids; + bool _cell_fam_ids_nocpy; + MEDCouplingAutoRefCountObjectPtr _cell_num_ids; + bool _cell_num_ids_nocpy; + MEDCouplingAutoRefCountObjectPtr _node_fam_ids; + bool _node_fam_ids_nocpy; + MEDCouplingAutoRefCountObjectPtr _node_num_ids; + bool _node_num_ids_nocpy; public: - static const int PARAMEDMEM_2_VTKTYPE_LGTH=34; - static const unsigned char PARAMEDMEM_2_VTKTYPE[PARAMEDMEM_2_VTKTYPE_LGTH]; + MEDLOADER_EXPORT static const int PARAMEDMEM_2_VTKTYPE_LGTH=34; + MEDLOADER_EXPORT static const unsigned char PARAMEDMEM_2_VTKTYPE[PARAMEDMEM_2_VTKTYPE_LGTH]; + MEDLOADER_EXPORT static const unsigned char HEXA27_PERM_ARRAY[27]; }; - + class MEDStructuredMeshMultiLev; - + class MEDUMeshMultiLev : public MEDMeshMultiLev { public: @@ -113,6 +139,8 @@ namespace ParaMEDMEM MEDMeshMultiLev *prepare() const; MEDUMeshMultiLev(const MEDStructuredMeshMultiLev& other, const MEDCouplingAutoRefCountObjectPtr& part); MEDLOADER_EXPORT bool buildVTUArrays(DataArrayDouble *& coords, DataArrayByte *&types, DataArrayInt *&cellLocations, DataArrayInt *& cells, DataArrayInt *&faceLocations, DataArrayInt *&faces) const; + protected: + void appendVertices(const DataArrayInt *verticesToAdd, DataArrayInt *nr); private: void reorderNodesIfNecessary(MEDCouplingAutoRefCountObjectPtr& coords, DataArrayInt *nodalConnVTK, DataArrayInt *polyhedNodalConnVTK) const; private: @@ -121,6 +149,8 @@ namespace ParaMEDMEM MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities); private: std::vector< MEDCouplingAutoRefCountObjectPtr > _parts; + //! this attribute is used only for mesh with no cells but having coordinates. For classical umeshes those pointer is equal to pointer of coordinates of instances in this->_parts. + MEDCouplingAutoRefCountObjectPtr _coords; }; class MEDStructuredMeshMultiLev : public MEDMeshMultiLev @@ -129,11 +159,23 @@ namespace ParaMEDMEM void selectPartOfNodes(const DataArrayInt *pflNodes); virtual std::vector getNodeGridStructure() const = 0; protected: - MEDStructuredMeshMultiLev(); MEDStructuredMeshMultiLev(const MEDStructuredMeshMultiLev& other); - MEDStructuredMeshMultiLev(int nbOfNodes, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities); + MEDStructuredMeshMultiLev(const MEDFileStructuredMesh *m, const std::vector& lev); + MEDStructuredMeshMultiLev(const MEDFileStructuredMesh *m, int nbOfNodes, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities); + void dealWithImplicitUnstructuredMesh(const MEDFileMesh *m); + protected: + void moveFaceToCell() const; + bool prepareForImplicitUnstructuredMeshCase(MEDMeshMultiLev *&ret) const; + private: + void initStdFieldOfIntegers(const MEDFileStructuredMesh *m); + protected: + bool _is_internal; + MEDCouplingAutoRefCountObjectPtr _face_fam_ids; + bool _face_fam_ids_nocpy; + MEDCouplingAutoRefCountObjectPtr _face_num_ids; + bool _face_num_ids_nocpy; }; - + class MEDCMeshMultiLev : public MEDStructuredMeshMultiLev { public: @@ -141,7 +183,7 @@ namespace ParaMEDMEM static MEDCMeshMultiLev *New(const MEDFileCMesh *m, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities); std::vector getNodeGridStructure() const; MEDMeshMultiLev *prepare() const; - MEDLOADER_EXPORT std::vector< DataArrayDouble * > buildVTUArrays() const; + MEDLOADER_EXPORT std::vector< DataArrayDouble * > buildVTUArrays(bool& isInternal) const; private: MEDCMeshMultiLev(const MEDCMeshMultiLev& other); MEDCMeshMultiLev(const MEDFileCMesh *m, const std::vector& levs); @@ -157,7 +199,7 @@ namespace ParaMEDMEM static MEDCurveLinearMeshMultiLev *New(const MEDFileCurveLinearMesh *m, const std::vector& gts, const std::vector& pfls , const std::vector& nbEntities); std::vector getNodeGridStructure() const; MEDMeshMultiLev *prepare() const; - MEDLOADER_EXPORT void buildVTUArrays(DataArrayDouble *&coords, std::vector& nodeStrct) const; + MEDLOADER_EXPORT void buildVTUArrays(DataArrayDouble *&coords, std::vector& nodeStrct, bool& isInternal) const; private: MEDCurveLinearMeshMultiLev(const MEDCurveLinearMeshMultiLev& other); MEDCurveLinearMeshMultiLev(const MEDFileCurveLinearMesh *m, const std::vector& levs); @@ -187,8 +229,8 @@ namespace ParaMEDMEM int getNbOfIntegrationPts(const MEDFileFieldGlobsReal *globs) const; //! warning this method also set _nb_of_entity attribute ! void checkInRange(int nbOfEntity, int nip, const MEDFileFieldGlobsReal *globs); - bool isFastlyEqual(int& startExp, INTERP_KERNEL::NormalizedCellType gt, const char *pflName) const; - bool operator==(const MEDFileField1TSStructItem2& other) const throw(INTERP_KERNEL::Exception); + bool isFastlyEqual(int& startExp, INTERP_KERNEL::NormalizedCellType gt, const std::string& pflName) const; + bool operator==(const MEDFileField1TSStructItem2& other) const; bool isCellSupportEqual(const MEDFileField1TSStructItem2& other, const MEDFileFieldGlobsReal *globs) const; bool isNodeSupportEqual(const MEDFileField1TSStructItem2& other, const MEDFileFieldGlobsReal *globs) const; static MEDFileField1TSStructItem2 BuildAggregationOf(const std::vector& objs, const MEDFileFieldGlobsReal *globs); @@ -208,20 +250,21 @@ namespace ParaMEDMEM MEDFileField1TSStructItem() { } MEDFileField1TSStructItem(TypeOfField a, const std::vector< MEDFileField1TSStructItem2 >& b); void checkWithMeshStruct(const MEDFileMeshStruct *mst, const MEDFileFieldGlobsReal *globs); - bool operator==(const MEDFileField1TSStructItem& other) const throw(INTERP_KERNEL::Exception); + bool operator==(const MEDFileField1TSStructItem& other) const; MEDLOADER_EXPORT std::size_t getHeapMemorySizeWithoutChildren() const; MEDLOADER_EXPORT std::vector getDirectChildren() const; bool isEntityCell() const; bool isComputed() const { return _computed; } TypeOfField getType() const { return _type; } std::size_t getNumberOfItems() const { return _items.size(); } - const MEDFileField1TSStructItem2& operator[](std::size_t i) const throw(INTERP_KERNEL::Exception); + const MEDFileField1TSStructItem2& operator[](std::size_t i) const; // bool isCellSupportEqual(const MEDFileField1TSStructItem& other, const MEDFileFieldGlobsReal *globs) const; bool isNodeSupportEqual(const MEDFileField1TSStructItem& other, const MEDFileFieldGlobsReal *globs) const; MEDFileField1TSStructItem simplifyMeOnCellEntity(const MEDFileFieldGlobsReal *globs) const; bool isCompatibleWithNodesDiscr(const MEDFileField1TSStructItem& other, const MEDFileMeshStruct *meshSt, const MEDFileFieldGlobsReal *globs) const; bool isFullyOnOneLev(const MEDFileMeshStruct *meshSt, int& theFirstLevFull) const; + std::vector getGeoTypes(const MEDFileMesh *m) const; MEDLOADER_EXPORT MEDMeshMultiLev *buildFromScratchDataSetSupportOnCells(const MEDFileMeshStruct *mst, const MEDFileFieldGlobsReal *globs) const; MEDLOADER_EXPORT static MEDFileField1TSStructItem BuildItemFrom(const MEDFileAnyTypeField1TS *ref, const MEDFileMeshStruct *meshSt); private: @@ -242,6 +285,7 @@ namespace ParaMEDMEM bool isCompatibleWithNodesDiscr(const MEDFileAnyTypeField1TS *other, const MEDFileMeshStruct *meshSt); MEDLOADER_EXPORT MEDMeshMultiLev *buildFromScratchDataSetSupport(const MEDFileMeshStruct *mst, const MEDFileFieldGlobsReal *globs) const; bool isDataSetSupportFastlyEqualTo(const MEDFileField1TSStruct& other, const MEDFileFieldGlobsReal *globs) const; + std::vector getGeoTypes(const MEDFileMesh *m) const; private: MEDFileField1TSStruct(const MEDFileAnyTypeField1TS *ref, MEDFileMeshStruct *mst); bool presenceOfCellDiscr(int& pos) const; @@ -256,6 +300,8 @@ namespace ParaMEDMEM MEDLOADER_EXPORT static MEDFileFastCellSupportComparator *New(const MEDFileMeshStruct *m, const MEDFileAnyTypeFieldMultiTS *ref); MEDLOADER_EXPORT MEDMeshMultiLev *buildFromScratchDataSetSupport(int timeStepId, const MEDFileFieldGlobsReal *globs) const; MEDLOADER_EXPORT bool isDataSetSupportEqualToThePreviousOne(int timeStepId, const MEDFileFieldGlobsReal *globs) const; + MEDLOADER_EXPORT int getNumberOfTS() const; + MEDLOADER_EXPORT std::vector getGeoTypesAt(int timeStepId, const MEDFileMesh *m) const; bool isEqual(const MEDFileAnyTypeFieldMultiTS *other); bool isCompatibleWithNodesDiscr(const MEDFileAnyTypeFieldMultiTS *other); std::size_t getHeapMemorySizeWithoutChildren() const;