Salome HOME
Merge from V6_main 11/02/2013
[modules/med.git] / src / MEDCoupling / MEDCouplingPointSet.hxx
1 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay (CEA/DEN)
20
21 #ifndef __PARAMEDMEM_MEDCOUPLINGPOINTSET_HXX__
22 #define __PARAMEDMEM_MEDCOUPLINGPOINTSET_HXX__
23
24 #include "MEDCoupling.hxx"
25 #include "MEDCouplingMesh.hxx"
26
27 #include <vector>
28
29 namespace INTERP_KERNEL
30 {
31   class DirectedBoundingBox;
32 }
33
34 namespace ParaMEDMEM
35 {
36   class DataArrayInt;
37   class DataArrayDouble;
38   
39   /*!
40    * This class is abstract and not instanciable.
41    * ParaMEDMEM::MEDCouplingUMesh class inherits from this class.
42    * This class aggregates an array '_coords' containing nodes coordinates.
43    * So all operations on coordinates are managed by this class.
44    * This is the case for example for following methods :
45    * rotation, translation, scaling, getNodeIdsNearPoint, boundingbox...
46    */
47   class MEDCOUPLING_EXPORT MEDCouplingPointSet : public MEDCouplingMesh
48   {
49   protected:
50     MEDCouplingPointSet();
51     MEDCouplingPointSet(const MEDCouplingPointSet& other, bool deepCopy);
52     ~MEDCouplingPointSet();
53   public:
54     void updateTime() const;
55     std::size_t getHeapMemorySize() const;
56     int getNumberOfNodes() const;
57     int getSpaceDimension() const;
58     void setCoords(const DataArrayDouble *coords);
59     //! This method returns directly the array in 'this' \b without incrementing ref counter. The pointer is dealed by the mesh. The caller should not deal (decrRef) with this pointer
60     const DataArrayDouble *getCoords() const { return _coords; }
61     //! This method returns directly the array in 'this' \b without incrementing ref counter. The pointer is dealed by the mesh. The caller should not deal (decrRef) with this pointer
62     DataArrayDouble *getCoords() { return _coords; }
63     DataArrayDouble *getCoordinatesAndOwner() const;
64     void copyTinyStringsFrom(const MEDCouplingMesh *other) throw(INTERP_KERNEL::Exception);
65     bool isEqualIfNotWhy(const MEDCouplingMesh *other, double prec, std::string& reason) const throw(INTERP_KERNEL::Exception);
66     bool isEqualWithoutConsideringStr(const MEDCouplingMesh *other, double prec) const;
67     bool areCoordsEqualIfNotWhy(const MEDCouplingPointSet& other, double prec, std::string& reason) const;
68     bool areCoordsEqual(const MEDCouplingPointSet& other, double prec) const;
69     bool areCoordsEqualWithoutConsideringStr(const MEDCouplingPointSet& other, double prec) const;
70     virtual DataArrayInt *mergeNodes(double precision, bool& areNodesMerged, int& newNbOfNodes) = 0;
71     virtual DataArrayInt *mergeNodes2(double precision, bool& areNodesMerged, int& newNbOfNodes) = 0;
72     void getCoordinatesOfNode(int nodeId, std::vector<double>& coo) const throw(INTERP_KERNEL::Exception);
73     DataArrayInt *buildPermArrayForMergeNode(double precision, int limitNodeId, bool& areNodesMerged, int& newNbOfNodes) const;
74     DataArrayInt *getNodeIdsNearPoint(const double *pos, double eps) const throw(INTERP_KERNEL::Exception);
75     void getNodeIdsNearPoints(const double *pos, int nbOfNodes, double eps, DataArrayInt *& c, DataArrayInt *& cI) const throw(INTERP_KERNEL::Exception);
76     void findCommonNodes(double prec, int limitNodeId, DataArrayInt *&comm, DataArrayInt *&commIndex) const;
77     DataArrayInt *buildNewNumberingFromCommonNodesFormat(const DataArrayInt *comm, const DataArrayInt *commIndex,
78                                                          int& newNbOfNodes) const;
79     void getBoundingBox(double *bbox) const throw(INTERP_KERNEL::Exception);
80     void zipCoords();
81     double getCaracteristicDimension() const;
82     void recenterForMaxPrecision(double eps) throw(INTERP_KERNEL::Exception);
83     void rotate(const double *center, const double *vector, double angle);
84     void translate(const double *vector);
85     void scale(const double *point, double factor);
86     void changeSpaceDimension(int newSpaceDim, double dftVal=0.) throw(INTERP_KERNEL::Exception);
87     void tryToShareSameCoords(const MEDCouplingPointSet& other, double epsilon) throw(INTERP_KERNEL::Exception);
88     void duplicateNodesInCoords(const int *nodeIdsToDuplicateBg, const int *nodeIdsToDuplicateEnd) throw(INTERP_KERNEL::Exception);
89     virtual void tryToShareSameCoordsPermute(const MEDCouplingPointSet& other, double epsilon) throw(INTERP_KERNEL::Exception) = 0;
90     void findNodesOnPlane(const double *pt, const double *vec, double eps, std::vector<int>& nodes) const throw(INTERP_KERNEL::Exception);
91     void findNodesOnLine(const double *pt, const double *vec, double eps, std::vector<int>& nodes) const throw(INTERP_KERNEL::Exception);
92     static DataArrayDouble *MergeNodesArray(const MEDCouplingPointSet *m1, const MEDCouplingPointSet *m2) throw(INTERP_KERNEL::Exception);
93     static DataArrayDouble *MergeNodesArray(const std::vector<const MEDCouplingPointSet *>& ms) throw(INTERP_KERNEL::Exception);
94     static MEDCouplingPointSet *BuildInstanceFromMeshType(MEDCouplingMeshType type);
95     static void Rotate2DAlg(const double *center, double angle, int nbNodes, double *coords);
96     static void Rotate3DAlg(const double *center, const double *vect, double angle, int nbNodes, double *coords);
97     MEDCouplingMesh *buildPart(const int *start, const int *end) const;
98     MEDCouplingMesh *buildPartAndReduceNodes(const int *start, const int *end, DataArrayInt*& arr) const;
99     virtual MEDCouplingPointSet *buildPartOfMySelf(const int *start, const int *end, bool keepCoords=true) const = 0;
100     virtual MEDCouplingPointSet *buildPartOfMySelf2(int start, int end, int step, bool keepCoords=true) const throw(INTERP_KERNEL::Exception) = 0;
101     virtual MEDCouplingPointSet *buildPartOfMySelfNode(const int *start, const int *end, bool fullyIn) const = 0;
102     virtual MEDCouplingPointSet *buildFacePartOfMySelfNode(const int *start, const int *end, bool fullyIn) const = 0;
103     virtual DataArrayInt *findBoundaryNodes() const = 0;
104     virtual MEDCouplingPointSet *buildBoundaryMesh(bool keepCoords) const = 0;
105     virtual void renumberNodes(const int *newNodeNumbers, int newNbOfNodes);
106     virtual void renumberNodes2(const int *newNodeNumbers, int newNbOfNodes);
107     virtual bool isEmptyMesh(const std::vector<int>& tinyInfo) const = 0;
108     //! size of returned tinyInfo must be always the same.
109     void getTinySerializationInformation(std::vector<double>& tinyInfoD, std::vector<int>& tinyInfo, std::vector<std::string>& littleStrings) const;
110     void resizeForUnserialization(const std::vector<int>& tinyInfo, DataArrayInt *a1, DataArrayDouble *a2, std::vector<std::string>& littleStrings) const;
111     void serialize(DataArrayInt *&a1, DataArrayDouble *&a2) const;
112     void unserialization(const std::vector<double>& tinyInfoD, const std::vector<int>& tinyInfo, const DataArrayInt *a1, DataArrayDouble *a2,
113                          const std::vector<std::string>& littleStrings);
114     virtual DataArrayInt *getCellsInBoundingBox(const double *bbox, double eps) const = 0;
115     virtual DataArrayInt *getCellsInBoundingBox(const INTERP_KERNEL::DirectedBoundingBox& bbox, double eps) = 0;
116     virtual DataArrayInt *zipCoordsTraducer() = 0;
117   protected:
118     void checkCoherency() const throw(INTERP_KERNEL::Exception);
119     virtual void checkFullyDefined() const throw(INTERP_KERNEL::Exception) = 0;
120     static bool intersectsBoundingBox(const double* bb1, const double* bb2, int dim, double eps);
121     static bool intersectsBoundingBox(const INTERP_KERNEL::DirectedBoundingBox& bb1, const double* bb2, int dim, double eps);
122     void rotate2D(const double *center, double angle);
123     void rotate3D(const double *center, const double *vect, double angle);
124     void project2DCellOnXY(const int *startConn, const int *endConn, std::vector<double>& res) const;
125     static bool isButterfly2DCell(const std::vector<double>& res, bool isQuad, double eps);
126   protected:
127     DataArrayDouble *_coords;
128   };
129 }
130
131 #endif