Salome HOME
0bd0034616d45333825eca05e2c21c0dfe242d89
[modules/med.git] / src / MEDCoupling / MEDCouplingFieldDiscretization.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
20 #ifndef __PARAMEDMEM_MEDCOUPLINGFIELDDISCRETIZATION_HXX__
21 #define __PARAMEDMEM_MEDCOUPLINGFIELDDISCRETIZATION_HXX__
22
23 #include "MEDCoupling.hxx"
24 #include "MEDCouplingRefCountObject.hxx"
25 #include "InterpKernelException.hxx"
26 #include "MEDCouplingTimeLabel.hxx"
27 #include "MEDCouplingNatureOfField.hxx"
28 #include "MEDCouplingGaussLocalization.hxx"
29 #include "MEDCouplingAutoRefCountObjectPtr.hxx"
30
31 #include <vector>
32
33 namespace ParaMEDMEM
34 {
35   class DataArrayInt;
36   class MEDCouplingMesh;
37   class DataArrayDouble;
38   class MEDCouplingFieldDouble;
39
40   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretization : public RefCountObject, public TimeLabel
41   {
42   public:
43     static MEDCouplingFieldDiscretization *New(TypeOfField type);
44     double getPrecision() const { return _precision; }
45     void setPrecision(double val) { _precision=val; }
46     void updateTime() const;
47     static TypeOfField getTypeOfFieldFromStringRepr(const char *repr) throw(INTERP_KERNEL::Exception);
48     virtual TypeOfField getEnum() const = 0;
49     virtual bool isEqual(const MEDCouplingFieldDiscretization *other, double eps) const;
50     virtual bool isEqualIfNotWhy(const MEDCouplingFieldDiscretization *other, double eps, std::string& reason) const = 0;
51     virtual bool isEqualWithoutConsideringStr(const MEDCouplingFieldDiscretization *other, double eps) const;
52     virtual MEDCouplingFieldDiscretization *clone() const = 0;
53     virtual std::string getStringRepr() const = 0;
54     virtual const char *getRepr() const = 0;
55     virtual int getNumberOfTuples(const MEDCouplingMesh *mesh) const = 0;
56     virtual int getNumberOfMeshPlaces(const MEDCouplingMesh *mesh) const = 0;
57     virtual DataArrayInt *getOffsetArr(const MEDCouplingMesh *mesh) const = 0;
58     virtual void normL1(const MEDCouplingMesh *mesh, const DataArrayDouble *arr, double *res) const throw(INTERP_KERNEL::Exception);
59     virtual void normL2(const MEDCouplingMesh *mesh, const DataArrayDouble *arr, double *res) const throw(INTERP_KERNEL::Exception);
60     virtual void integral(const MEDCouplingMesh *mesh, const DataArrayDouble *arr, bool isWAbs, double *res) const throw(INTERP_KERNEL::Exception);
61     virtual DataArrayDouble *getLocalizationOfDiscValues(const MEDCouplingMesh *mesh) const = 0;
62     virtual void computeMeshRestrictionFromTupleIds(const MEDCouplingMesh *mesh, const int *partBg, const int *partEnd,
63                                                     DataArrayInt *&cellRest) = 0;
64     virtual void checkCompatibilityWithNature(NatureOfField nat) const throw(INTERP_KERNEL::Exception) = 0;
65     virtual void renumberCells(const int *old2NewBg, bool check=true) throw(INTERP_KERNEL::Exception);
66     virtual void renumberArraysForCell(const MEDCouplingMesh *mesh, const std::vector<DataArrayDouble *>& arrays,
67                                        const int *old2NewBg, bool check) throw(INTERP_KERNEL::Exception) = 0;
68     virtual double getIJK(const MEDCouplingMesh *mesh, const DataArrayDouble *da, int cellId, int nodeIdInCell, int compoId) const throw(INTERP_KERNEL::Exception);
69     virtual void checkCoherencyBetween(const MEDCouplingMesh *mesh, const DataArrayDouble *da) const throw(INTERP_KERNEL::Exception) = 0;
70     virtual MEDCouplingFieldDouble *getMeasureField(const MEDCouplingMesh *mesh, bool isAbs) const = 0;
71     virtual void getValueOn(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, double *res) const = 0;
72     virtual void getValueOnPos(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, int i, int j, int k, double *res) const = 0;
73     virtual DataArrayDouble *getValueOnMulti(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, int nbOfPoints) const = 0;
74     virtual DataArrayInt *computeTupleIdsToSelectFromCellIds(const MEDCouplingMesh *mesh, const int *startCellIds, const int *endCellIds) const = 0;
75     virtual MEDCouplingMesh *buildSubMeshData(const MEDCouplingMesh *mesh, const int *start, const int *end, DataArrayInt *&di) const = 0;
76     virtual void renumberValuesOnNodes(double epsOnVals, const int *old2New, DataArrayDouble *arr) const = 0;
77     virtual void renumberValuesOnCells(double epsOnVals, const MEDCouplingMesh *mesh, const int *old2New, DataArrayDouble *arr) const = 0;
78     virtual void renumberValuesOnCellsR(const MEDCouplingMesh *mesh, const int *new2old, int newSz, DataArrayDouble *arr) const = 0;
79     virtual void getSerializationIntArray(DataArrayInt *& arr) const;
80     virtual void getTinySerializationIntInformation(std::vector<int>& tinyInfo) const;
81     virtual void getTinySerializationDbleInformation(std::vector<double>& tinyInfo) const;
82     virtual void finishUnserialization(const std::vector<double>& tinyInfo);
83     virtual void resizeForUnserialization(const std::vector<int>& tinyInfo, DataArrayInt *& arr);
84     virtual void setGaussLocalizationOnType(const MEDCouplingMesh *m, INTERP_KERNEL::NormalizedCellType type, const std::vector<double>& refCoo,
85                                             const std::vector<double>& gsCoo, const std::vector<double>& wg) throw(INTERP_KERNEL::Exception);
86     virtual void setGaussLocalizationOnCells(const MEDCouplingMesh *m, const int *begin, const int *end, const std::vector<double>& refCoo,
87                                              const std::vector<double>& gsCoo, const std::vector<double>& wg) throw(INTERP_KERNEL::Exception);
88     virtual void clearGaussLocalizations() throw(INTERP_KERNEL::Exception);
89     virtual MEDCouplingGaussLocalization& getGaussLocalization(int locId) throw(INTERP_KERNEL::Exception);
90     virtual int getNbOfGaussLocalization() const throw(INTERP_KERNEL::Exception);
91     virtual int getGaussLocalizationIdOfOneCell(int cellId) const throw(INTERP_KERNEL::Exception);
92     virtual int getGaussLocalizationIdOfOneType(INTERP_KERNEL::NormalizedCellType type) const throw(INTERP_KERNEL::Exception);
93     virtual void getCellIdsHavingGaussLocalization(int locId, std::vector<int>& cellIds) const throw(INTERP_KERNEL::Exception);
94     virtual const MEDCouplingGaussLocalization& getGaussLocalization(int locId) const throw(INTERP_KERNEL::Exception);
95     virtual ~MEDCouplingFieldDiscretization();
96   protected:
97     MEDCouplingFieldDiscretization();
98     static void renumberEntitiesFromO2NArr(double epsOnVals, const int *old2NewPtr, DataArrayDouble *arr, const char *msg);
99     static void renumberEntitiesFromN2OArr(const int *new2OldPtr, int new2OldSz, DataArrayDouble *arr, const char *msg);
100   protected:
101     double _precision;
102     static const double DFLT_PRECISION;
103   };
104
105   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretizationP0 : public MEDCouplingFieldDiscretization
106   {
107   public:
108     TypeOfField getEnum() const;
109     MEDCouplingFieldDiscretization *clone() const;
110     std::string getStringRepr() const;
111     const char *getRepr() const;
112     bool isEqualIfNotWhy(const MEDCouplingFieldDiscretization *other, double eps, std::string& reason) const;
113     int getNumberOfTuples(const MEDCouplingMesh *mesh) const;
114     int getNumberOfMeshPlaces(const MEDCouplingMesh *mesh) const;
115     DataArrayInt *getOffsetArr(const MEDCouplingMesh *mesh) const;
116     void renumberArraysForCell(const MEDCouplingMesh *mesh, const std::vector<DataArrayDouble *>& arrays,
117                                const int *old2NewBg, bool check) throw(INTERP_KERNEL::Exception);
118     DataArrayDouble *getLocalizationOfDiscValues(const MEDCouplingMesh *mesh) const;
119     void checkCompatibilityWithNature(NatureOfField nat) const throw(INTERP_KERNEL::Exception);
120     void computeMeshRestrictionFromTupleIds(const MEDCouplingMesh *mesh, const int *partBg, const int *partEnd,
121                                             DataArrayInt *&cellRest);
122     void checkCoherencyBetween(const MEDCouplingMesh *mesh, const DataArrayDouble *da) const throw(INTERP_KERNEL::Exception);
123     MEDCouplingFieldDouble *getMeasureField(const MEDCouplingMesh *mesh, bool isAbs) const;
124     void getValueOn(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, double *res) const;
125     void getValueOnPos(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, int i, int j, int k, double *res) const;
126     DataArrayDouble *getValueOnMulti(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, int nbOfPoints) const;
127     void renumberValuesOnNodes(double epsOnVals, const int *old2New, DataArrayDouble *arr) const;
128     void renumberValuesOnCells(double epsOnVals, const MEDCouplingMesh *mesh, const int *old2New, DataArrayDouble *arr) const;
129     void renumberValuesOnCellsR(const MEDCouplingMesh *mesh, const int *new2old, int newSz, DataArrayDouble *arr) const;
130     MEDCouplingMesh *buildSubMeshData(const MEDCouplingMesh *mesh, const int *start, const int *end, DataArrayInt *&di) const;
131     DataArrayInt *computeTupleIdsToSelectFromCellIds(const MEDCouplingMesh *mesh, const int *startCellIds, const int *endCellIds) const;
132   public:
133     static const char REPR[];
134     static const TypeOfField TYPE;
135   };
136
137   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretizationOnNodes : public MEDCouplingFieldDiscretization
138   {
139   public:
140     int getNumberOfTuples(const MEDCouplingMesh *mesh) const;
141     int getNumberOfMeshPlaces(const MEDCouplingMesh *mesh) const;
142     DataArrayInt *getOffsetArr(const MEDCouplingMesh *mesh) const;
143     void renumberArraysForCell(const MEDCouplingMesh *mesh, const std::vector<DataArrayDouble *>& arrays,
144                                const int *old2NewBg, bool check) throw(INTERP_KERNEL::Exception);
145     DataArrayDouble *getLocalizationOfDiscValues(const MEDCouplingMesh *mesh) const;
146     void computeMeshRestrictionFromTupleIds(const MEDCouplingMesh *mesh, const int *partBg, const int *partEnd,
147                                             DataArrayInt *&cellRest);
148     void checkCoherencyBetween(const MEDCouplingMesh *mesh, const DataArrayDouble *da) const throw(INTERP_KERNEL::Exception);
149     MEDCouplingMesh *buildSubMeshData(const MEDCouplingMesh *mesh, const int *start, const int *end, DataArrayInt *&di) const;
150     DataArrayInt *computeTupleIdsToSelectFromCellIds(const MEDCouplingMesh *mesh, const int *startCellIds, const int *endCellIds) const;
151     void renumberValuesOnNodes(double epsOnVals, const int *old2New, DataArrayDouble *arr) const;
152     void renumberValuesOnCells(double epsOnVals, const MEDCouplingMesh *mesh, const int *old2New, DataArrayDouble *arr) const;
153     void renumberValuesOnCellsR(const MEDCouplingMesh *mesh, const int *new2old, int newSz, DataArrayDouble *arr) const;
154   public:
155     void getValueOnPos(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, int i, int j, int k, double *res) const;
156   };
157
158   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretizationP1 : public MEDCouplingFieldDiscretizationOnNodes
159   {
160   public:
161     TypeOfField getEnum() const;
162     MEDCouplingFieldDiscretization *clone() const;
163     std::string getStringRepr() const;
164     const char *getRepr() const;
165     void checkCompatibilityWithNature(NatureOfField nat) const throw(INTERP_KERNEL::Exception);
166     bool isEqualIfNotWhy(const MEDCouplingFieldDiscretization *other, double eps, std::string& reason) const;
167     MEDCouplingFieldDouble *getMeasureField(const MEDCouplingMesh *mesh, bool isAbs) const;
168     void getValueOn(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, double *res) const;
169     DataArrayDouble *getValueOnMulti(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, int nbOfPoints) const;
170   public:
171     static const char REPR[];
172     static const TypeOfField TYPE;
173   protected:
174     void getValueInCell(const MEDCouplingMesh *mesh, int cellId, const DataArrayDouble *arr, const double *loc, double *res) const;
175   };
176
177   /*!
178    * This class abstracts MEDCouplingFieldDiscretization that needs an information on each cell to perform their job.
179    * All classes that inherits from this are more linked to mesh.
180    */
181   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretizationPerCell : public MEDCouplingFieldDiscretization
182   {
183   public:
184     const DataArrayInt *getArrayOfDiscIds() const;
185   protected:
186     MEDCouplingFieldDiscretizationPerCell();
187     MEDCouplingFieldDiscretizationPerCell(const MEDCouplingFieldDiscretizationPerCell& other);
188     ~MEDCouplingFieldDiscretizationPerCell();
189     void updateTime() const;
190     void checkCoherencyBetween(const MEDCouplingMesh *mesh, const DataArrayDouble *da) const throw(INTERP_KERNEL::Exception);
191     bool isEqualIfNotWhy(const MEDCouplingFieldDiscretization *other, double eps, std::string& reason) const;
192     bool isEqualWithoutConsideringStr(const MEDCouplingFieldDiscretization *other, double eps) const;
193     void renumberCells(const int *old2NewBg, bool check) throw(INTERP_KERNEL::Exception);
194     void checkNoOrphanCells() const throw(INTERP_KERNEL::Exception);
195   protected:
196     void buildDiscrPerCellIfNecessary(const MEDCouplingMesh *m);
197   protected:
198     DataArrayInt *_discr_per_cell;
199     static const int DFT_INVALID_LOCID_VALUE;
200   };
201
202   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretizationGauss : public MEDCouplingFieldDiscretizationPerCell
203   {
204   public:
205     MEDCouplingFieldDiscretizationGauss();
206     TypeOfField getEnum() const;
207     bool isEqualIfNotWhy(const MEDCouplingFieldDiscretization *other, double eps, std::string& reason) const;
208     bool isEqualWithoutConsideringStr(const MEDCouplingFieldDiscretization *other, double eps) const;
209     MEDCouplingFieldDiscretization *clone() const;
210     std::string getStringRepr() const;
211     const char *getRepr() const;
212     int getNumberOfTuples(const MEDCouplingMesh *mesh) const;
213     int getNumberOfMeshPlaces(const MEDCouplingMesh *mesh) const;
214     DataArrayInt *getOffsetArr(const MEDCouplingMesh *mesh) const;
215     void renumberArraysForCell(const MEDCouplingMesh *mesh, const std::vector<DataArrayDouble *>& arrays,
216                                const int *old2NewBg, bool check) throw(INTERP_KERNEL::Exception);
217     DataArrayDouble *getLocalizationOfDiscValues(const MEDCouplingMesh *mesh) const;
218     void computeMeshRestrictionFromTupleIds(const MEDCouplingMesh *mesh, const int *partBg, const int *partEnd,
219                                             DataArrayInt *&cellRest);
220     void checkCompatibilityWithNature(NatureOfField nat) const throw(INTERP_KERNEL::Exception);
221     void getTinySerializationIntInformation(std::vector<int>& tinyInfo) const;
222     void getTinySerializationDbleInformation(std::vector<double>& tinyInfo) const;
223     void finishUnserialization(const std::vector<double>& tinyInfo);
224     void getSerializationIntArray(DataArrayInt *& arr) const;
225     void resizeForUnserialization(const std::vector<int>& tinyInfo, DataArrayInt *& arr);
226     double getIJK(const MEDCouplingMesh *mesh, const DataArrayDouble *da, int cellId, int nodeIdInCell, int compoId) const throw(INTERP_KERNEL::Exception);
227     void checkCoherencyBetween(const MEDCouplingMesh *mesh, const DataArrayDouble *da) const throw(INTERP_KERNEL::Exception);
228     MEDCouplingFieldDouble *getMeasureField(const MEDCouplingMesh *mesh, bool isAbs) const;
229     void getValueOn(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, double *res) const;
230     void getValueOnPos(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, int i, int j, int k, double *res) const;
231     DataArrayDouble *getValueOnMulti(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, int nbOfPoints) const;
232     MEDCouplingMesh *buildSubMeshData(const MEDCouplingMesh *mesh, const int *start, const int *end, DataArrayInt *&di) const;
233     DataArrayInt *computeTupleIdsToSelectFromCellIds(const MEDCouplingMesh *mesh, const int *startCellIds, const int *endCellIds) const;
234     void renumberValuesOnNodes(double epsOnVals, const int *old2New, DataArrayDouble *arr) const;
235     void renumberValuesOnCells(double epsOnVals, const MEDCouplingMesh *mesh, const int *old2New, DataArrayDouble *arr) const;
236     void renumberValuesOnCellsR(const MEDCouplingMesh *mesh, const int *new2old, int newSz, DataArrayDouble *arr) const;
237     void setGaussLocalizationOnType(const MEDCouplingMesh *m, INTERP_KERNEL::NormalizedCellType type, const std::vector<double>& refCoo,
238                                     const std::vector<double>& gsCoo, const std::vector<double>& wg) throw(INTERP_KERNEL::Exception);
239     void setGaussLocalizationOnCells(const MEDCouplingMesh *m, const int *begin, const int *end, const std::vector<double>& refCoo,
240                                      const std::vector<double>& gsCoo, const std::vector<double>& wg) throw(INTERP_KERNEL::Exception);
241     void clearGaussLocalizations() throw(INTERP_KERNEL::Exception);
242     MEDCouplingGaussLocalization& getGaussLocalization(int locId) throw(INTERP_KERNEL::Exception);
243     int getNbOfGaussLocalization() const throw(INTERP_KERNEL::Exception);
244     int getGaussLocalizationIdOfOneCell(int cellId) const throw(INTERP_KERNEL::Exception);
245     int getGaussLocalizationIdOfOneType(INTERP_KERNEL::NormalizedCellType type) const throw(INTERP_KERNEL::Exception);
246     void getCellIdsHavingGaussLocalization(int locId, std::vector<int>& cellIds) const throw(INTERP_KERNEL::Exception);
247     const MEDCouplingGaussLocalization& getGaussLocalization(int locId) const throw(INTERP_KERNEL::Exception);
248     std::vector<DataArrayInt *> splitIntoSingleGaussDicrPerCellType(std::vector< std::vector<int> >& locIds) const throw(INTERP_KERNEL::Exception);
249     DataArrayInt *buildNbOfGaussPointPerCellField() const throw(INTERP_KERNEL::Exception);
250   protected:
251     MEDCouplingFieldDiscretizationGauss(const MEDCouplingFieldDiscretizationGauss& other);
252     void zipGaussLocalizations();
253     int getOffsetOfCell(int cellId) const throw(INTERP_KERNEL::Exception);
254     void checkLocalizationId(int locId) const throw(INTERP_KERNEL::Exception);
255   public:
256     static const char REPR[];
257     static const TypeOfField TYPE;
258   private:
259     std::vector<MEDCouplingGaussLocalization> _loc;
260   };
261
262   /*!
263    * Gauss with points of values located on nodes of element. This is a specialization of MEDCouplingFieldDiscretizationGauss.
264    */
265   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretizationGaussNE : public MEDCouplingFieldDiscretization
266   {
267   public:
268     MEDCouplingFieldDiscretizationGaussNE();
269     TypeOfField getEnum() const;
270     MEDCouplingFieldDiscretization *clone() const;
271     std::string getStringRepr() const;
272     const char *getRepr() const;
273     bool isEqualIfNotWhy(const MEDCouplingFieldDiscretization *other, double eps, std::string& reason) const;
274     int getNumberOfTuples(const MEDCouplingMesh *mesh) const;
275     int getNumberOfMeshPlaces(const MEDCouplingMesh *mesh) const;
276     DataArrayInt *getOffsetArr(const MEDCouplingMesh *mesh) const;
277     void renumberArraysForCell(const MEDCouplingMesh *mesh, const std::vector<DataArrayDouble *>& arrays,
278                                const int *old2NewBg, bool check) throw(INTERP_KERNEL::Exception);
279     DataArrayDouble *getLocalizationOfDiscValues(const MEDCouplingMesh *mesh) const;
280     void computeMeshRestrictionFromTupleIds(const MEDCouplingMesh *mesh, const int *partBg, const int *partEnd,
281                                             DataArrayInt *&cellRest);
282     void checkCompatibilityWithNature(NatureOfField nat) const throw(INTERP_KERNEL::Exception);
283     double getIJK(const MEDCouplingMesh *mesh, const DataArrayDouble *da, int cellId, int nodeIdInCell, int compoId) const throw(INTERP_KERNEL::Exception);
284     void checkCoherencyBetween(const MEDCouplingMesh *mesh, const DataArrayDouble *da) const throw(INTERP_KERNEL::Exception);
285     MEDCouplingFieldDouble *getMeasureField(const MEDCouplingMesh *mesh, bool isAbs) const;
286     void getValueOn(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, double *res) const;
287     void getValueOnPos(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, int i, int j, int k, double *res) const;
288     DataArrayDouble *getValueOnMulti(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, int nbOfPoints) const;
289     MEDCouplingMesh *buildSubMeshData(const MEDCouplingMesh *mesh, const int *start, const int *end, DataArrayInt *&di) const;
290     DataArrayInt *computeTupleIdsToSelectFromCellIds(const MEDCouplingMesh *mesh, const int *startCellIds, const int *endCellIds) const;
291     void renumberValuesOnNodes(double epsOnVals, const int *old2New, DataArrayDouble *arr) const;
292     void renumberValuesOnCells(double epsOnVals, const MEDCouplingMesh *mesh, const int *old2New, DataArrayDouble *arr) const;
293     void renumberValuesOnCellsR(const MEDCouplingMesh *mesh, const int *new2old, int newSz, DataArrayDouble *arr) const;
294   protected:
295     MEDCouplingFieldDiscretizationGaussNE(const MEDCouplingFieldDiscretizationGaussNE& other);
296   public:
297     static const char REPR[];
298     static const TypeOfField TYPE;
299   };
300
301   class MEDCOUPLING_EXPORT MEDCouplingFieldDiscretizationKriging : public MEDCouplingFieldDiscretizationOnNodes
302   {
303   public:
304     TypeOfField getEnum() const;
305     const char *getRepr() const;
306     MEDCouplingFieldDiscretization *clone() const;
307     std::string getStringRepr() const;
308     void checkCompatibilityWithNature(NatureOfField nat) const throw(INTERP_KERNEL::Exception);
309     bool isEqualIfNotWhy(const MEDCouplingFieldDiscretization *other, double eps, std::string& reason) const;
310     MEDCouplingFieldDouble *getMeasureField(const MEDCouplingMesh *mesh, bool isAbs) const;
311     void getValueOn(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, double *res) const;
312     DataArrayDouble *getValueOnMulti(const DataArrayDouble *arr, const MEDCouplingMesh *mesh, const double *loc, int nbOfPoints) const;
313   public://specific part
314     DataArrayDouble *computeVectorOfCoefficients(const MEDCouplingMesh *mesh, const DataArrayDouble *arr, int& isDrift) const;
315   protected:
316     void operateOnDenseMatrix(int spaceDimension, int nbOfElems, double *matrixPtr) const;
317     DataArrayDouble *performDrift(const DataArrayDouble *matr, const DataArrayDouble *arr, int& delta) const;
318   public:
319     static const char REPR[];
320     static const TypeOfField TYPE;
321   };
322 }
323
324 #endif