]> SALOME platform Git repositories - tools/medcoupling.git/blob - src/MEDCoupling/MEDCouplingFieldDouble.hxx
Salome HOME
4d86fd3f8f19636eb896cb25ea19693ed7608c8d
[tools/medcoupling.git] / src / MEDCoupling / MEDCouplingFieldDouble.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_MEDCOUPLINGFIELDDOUBLE_HXX__
21 #define __PARAMEDMEM_MEDCOUPLINGFIELDDOUBLE_HXX__
22
23 #include "MEDCoupling.hxx"
24 #include "MEDCouplingField.hxx"
25 #include "MEDCouplingTimeDiscretization.hxx"
26 #include "MEDCouplingMemArray.hxx"
27
28 namespace ParaMEDMEM
29 {
30   class MEDCouplingFieldTemplate;
31
32   class MEDCOUPLING_EXPORT MEDCouplingFieldDouble : public MEDCouplingField
33   {
34   public:
35     static MEDCouplingFieldDouble *New(TypeOfField type, TypeOfTimeDiscretization td=NO_TIME);
36     static MEDCouplingFieldDouble *New(const MEDCouplingFieldTemplate *ft, TypeOfTimeDiscretization td=NO_TIME);
37     void setTimeUnit(const char *unit);
38     const char *getTimeUnit() const;
39     void copyTinyStringsFrom(const MEDCouplingFieldDouble *other) throw(INTERP_KERNEL::Exception);
40     void copyTinyAttrFrom(const MEDCouplingFieldDouble *other) throw(INTERP_KERNEL::Exception);
41     std::string simpleRepr() const;
42     std::string advancedRepr() const;
43     bool isEqualIfNotWhy(const MEDCouplingField *other, double meshPrec, double valsPrec, std::string& reason) const throw(INTERP_KERNEL::Exception);
44     bool isEqualWithoutConsideringStr(const MEDCouplingField *other, double meshPrec, double valsPrec) const;
45     bool areCompatibleForMerge(const MEDCouplingField *other) const;
46     bool areStrictlyCompatible(const MEDCouplingField *other) const;
47     bool areCompatibleForMul(const MEDCouplingField *other) const;
48     bool areCompatibleForDiv(const MEDCouplingField *other) const;
49     bool areCompatibleForMeld(const MEDCouplingFieldDouble *other) const;
50     void renumberCells(const int *old2NewBg, bool check=true) throw(INTERP_KERNEL::Exception);
51     void renumberCellsWithoutMesh(const int *old2NewBg, bool check=true) throw(INTERP_KERNEL::Exception);
52     void renumberNodes(const int *old2NewBg) throw(INTERP_KERNEL::Exception);
53     void renumberNodesWithoutMesh(const int *old2NewBg, double eps=1e-15) throw(INTERP_KERNEL::Exception);
54     DataArrayInt *getIdsInRange(double vmin, double vmax) const throw(INTERP_KERNEL::Exception);
55     MEDCouplingFieldDouble *buildSubPart(const DataArrayInt *part) const throw(INTERP_KERNEL::Exception);
56     MEDCouplingFieldDouble *buildSubPart(const int *partBg, const int *partEnd) const throw(INTERP_KERNEL::Exception);
57     MEDCouplingFieldDouble *deepCpy() const;
58     MEDCouplingFieldDouble *clone(bool recDeepCpy) const;
59     MEDCouplingFieldDouble *cloneWithMesh(bool recDeepCpy) const;
60     MEDCouplingFieldDouble *buildNewTimeReprFromThis(TypeOfTimeDiscretization td, bool deepCopy) const;
61     TypeOfTimeDiscretization getTimeDiscretization() const;
62     void checkCoherency() const throw(INTERP_KERNEL::Exception);
63     void setNature(NatureOfField nat) throw(INTERP_KERNEL::Exception);
64     void setTimeTolerance(double val) { _time_discr->setTimeTolerance(val); }
65     double getTimeTolerance() const { return _time_discr->getTimeTolerance(); }
66     void setIteration(int it) throw(INTERP_KERNEL::Exception) { _time_discr->setIteration(it); }
67     void setEndIteration(int it) throw(INTERP_KERNEL::Exception) { _time_discr->setEndIteration(it); }
68     void setOrder(int order) throw(INTERP_KERNEL::Exception) { _time_discr->setOrder(order); }
69     void setEndOrder(int order) throw(INTERP_KERNEL::Exception) { _time_discr->setEndOrder(order); }
70     void setTimeValue(double val) throw(INTERP_KERNEL::Exception) { _time_discr->setTimeValue(val); }
71     void setEndTimeValue(double val) throw(INTERP_KERNEL::Exception) { _time_discr->setEndTimeValue(val); }
72     void setTime(double val, int iteration, int order) { _time_discr->setTime(val,iteration,order); }
73     void setStartTime(double val, int iteration, int order) { _time_discr->setStartTime(val,iteration,order); }
74     void setEndTime(double val, int iteration, int order) { _time_discr->setEndTime(val,iteration,order); }
75     double getTime(int& iteration, int& order) const { return _time_discr->getTime(iteration,order); }
76     double getStartTime(int& iteration, int& order) const { return _time_discr->getStartTime(iteration,order); }
77     double getEndTime(int& iteration, int& order) const { return _time_discr->getEndTime(iteration,order); }
78     double getIJ(int tupleId, int compoId) const { return getArray()->getIJ(tupleId,compoId); }
79     double getIJK(int cellId, int nodeIdInCell, int compoId) const;
80     void setArray(DataArrayDouble *array);
81     void setEndArray(DataArrayDouble *array);
82     void setArrays(const std::vector<DataArrayDouble *>& arrs) throw(INTERP_KERNEL::Exception);
83     const DataArrayDouble *getArray() const { return _time_discr->getArray(); }
84     DataArrayDouble *getArray() { return _time_discr->getArray(); }
85     const DataArrayDouble *getEndArray() const { return _time_discr->getEndArray(); }
86     DataArrayDouble *getEndArray() { return _time_discr->getEndArray(); }
87     std::vector<DataArrayDouble *> getArrays() const { std::vector<DataArrayDouble *> ret; _time_discr->getArrays(ret); return ret; }
88     double accumulate(int compId) const;
89     void accumulate(double *res) const;
90     double getMaxValue() const throw(INTERP_KERNEL::Exception);
91     double getMaxValue2(DataArrayInt*& tupleIds) const throw(INTERP_KERNEL::Exception);
92     double getMinValue() const throw(INTERP_KERNEL::Exception);
93     double getMinValue2(DataArrayInt*& tupleIds) const throw(INTERP_KERNEL::Exception);
94     double getAverageValue() const throw(INTERP_KERNEL::Exception);
95     double norm2() const throw(INTERP_KERNEL::Exception);
96     double normMax() const throw(INTERP_KERNEL::Exception);
97     double getWeightedAverageValue() const throw(INTERP_KERNEL::Exception);
98     double normL1(int compId) const throw(INTERP_KERNEL::Exception);
99     void normL1(double *res) const throw(INTERP_KERNEL::Exception);
100     double normL2(int compId) const throw(INTERP_KERNEL::Exception);
101     void normL2(double *res) const throw(INTERP_KERNEL::Exception);
102     double integral(int compId, bool isWAbs) const throw(INTERP_KERNEL::Exception);
103     void integral(bool isWAbs, double *res) const throw(INTERP_KERNEL::Exception);
104     void getValueOnPos(int i, int j, int k, double *res) const throw(INTERP_KERNEL::Exception);
105     void getValueOn(const double *spaceLoc, double *res) const throw(INTERP_KERNEL::Exception);
106     void getValueOn(const double *spaceLoc, double time, double *res) const throw(INTERP_KERNEL::Exception);
107     DataArrayDouble *getValueOnMulti(const double *spaceLoc, int nbOfPoints) const throw(INTERP_KERNEL::Exception);
108     //! \b temporary
109     void applyLin(double a, double b, int compoId);
110     MEDCouplingFieldDouble &operator=(double value) throw(INTERP_KERNEL::Exception);
111     void fillFromAnalytic(int nbOfComp, FunctionToEvaluate func) throw(INTERP_KERNEL::Exception);
112     void fillFromAnalytic(int nbOfComp, const char *func) throw(INTERP_KERNEL::Exception);
113     void fillFromAnalytic2(int nbOfComp, const char *func) throw(INTERP_KERNEL::Exception);
114     void fillFromAnalytic3(int nbOfComp, const std::vector<std::string>& varsOrder, const char *func) throw(INTERP_KERNEL::Exception);
115     void applyFunc(int nbOfComp, FunctionToEvaluate func);
116     void applyFunc(int nbOfComp, double val);
117     void applyFunc(int nbOfComp, const char *func) throw(INTERP_KERNEL::Exception);
118     void applyFunc2(int nbOfComp, const char *func) throw(INTERP_KERNEL::Exception);
119     void applyFunc3(int nbOfComp, const std::vector<std::string>& varsOrder, const char *func) throw(INTERP_KERNEL::Exception);
120     void applyFunc(const char *func) throw(INTERP_KERNEL::Exception);
121     void applyFuncFast32(const char *func) throw(INTERP_KERNEL::Exception);
122     void applyFuncFast64(const char *func) throw(INTERP_KERNEL::Exception);
123     int getNumberOfComponents() const throw(INTERP_KERNEL::Exception);
124     int getNumberOfTuples() const throw(INTERP_KERNEL::Exception);
125     int getNumberOfValues() const throw(INTERP_KERNEL::Exception);
126     void updateTime() const;
127     //
128     void getTinySerializationIntInformation(std::vector<int>& tinyInfo) const;
129     void getTinySerializationDbleInformation(std::vector<double>& tinyInfo) const;
130     void getTinySerializationStrInformation(std::vector<std::string>& tinyInfo) const;
131     void resizeForUnserialization(const std::vector<int>& tinyInfoI, DataArrayInt *&dataInt, std::vector<DataArrayDouble *>& arrays);
132     void finishUnserialization(const std::vector<int>& tinyInfoI, const std::vector<double>& tinyInfoD, const std::vector<std::string>& tinyInfoS);
133     void serialize(DataArrayInt *&dataInt, std::vector<DataArrayDouble *>& arrays) const;
134     //
135     void changeUnderlyingMesh(const MEDCouplingMesh *other, int levOfCheck, double prec) throw(INTERP_KERNEL::Exception);
136     void substractInPlaceDM(const MEDCouplingFieldDouble *f, int levOfCheck, double prec) throw(INTERP_KERNEL::Exception);
137     bool mergeNodes(double eps, double epsOnVals=1e-15) throw(INTERP_KERNEL::Exception);
138     bool mergeNodes2(double eps, double epsOnVals=1e-15) throw(INTERP_KERNEL::Exception);
139     bool zipCoords(double epsOnVals=1e-15) throw(INTERP_KERNEL::Exception);
140     bool zipConnectivity(int compType, double epsOnVals=1e-15) throw(INTERP_KERNEL::Exception);
141     MEDCouplingFieldDouble *extractSlice3D(const double *origin, const double *vec, double eps) const throw(INTERP_KERNEL::Exception);
142     bool simplexize(int policy) throw(INTERP_KERNEL::Exception);
143     MEDCouplingFieldDouble *doublyContractedProduct() const throw(INTERP_KERNEL::Exception);
144     MEDCouplingFieldDouble *determinant() const throw(INTERP_KERNEL::Exception);
145     MEDCouplingFieldDouble *eigenValues() const throw(INTERP_KERNEL::Exception);
146     MEDCouplingFieldDouble *eigenVectors() const throw(INTERP_KERNEL::Exception);
147     MEDCouplingFieldDouble *inverse() const throw(INTERP_KERNEL::Exception);
148     MEDCouplingFieldDouble *trace() const throw(INTERP_KERNEL::Exception);
149     MEDCouplingFieldDouble *deviator() const throw(INTERP_KERNEL::Exception);
150     MEDCouplingFieldDouble *magnitude() const throw(INTERP_KERNEL::Exception);
151     MEDCouplingFieldDouble *maxPerTuple() const throw(INTERP_KERNEL::Exception);
152     void changeNbOfComponents(int newNbOfComp, double dftValue=0.) throw(INTERP_KERNEL::Exception);
153     MEDCouplingFieldDouble *keepSelectedComponents(const std::vector<int>& compoIds) const throw(INTERP_KERNEL::Exception);
154     void setSelectedComponents(const MEDCouplingFieldDouble *f, const std::vector<int>& compoIds) throw(INTERP_KERNEL::Exception);
155     void sortPerTuple(bool asc) throw(INTERP_KERNEL::Exception);
156     static MEDCouplingFieldDouble *MergeFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
157     static MEDCouplingFieldDouble *MergeFields(const std::vector<const MEDCouplingFieldDouble *>& a) throw(INTERP_KERNEL::Exception);
158     static MEDCouplingFieldDouble *MeldFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
159     static MEDCouplingFieldDouble *DotFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
160     MEDCouplingFieldDouble *dot(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return DotFields(this,&other); }
161     static MEDCouplingFieldDouble *CrossProductFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
162     MEDCouplingFieldDouble *crossProduct(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return CrossProductFields(this,&other); }
163     static MEDCouplingFieldDouble *MaxFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
164     MEDCouplingFieldDouble *max(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return MaxFields(this,&other); }
165     static MEDCouplingFieldDouble *MinFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
166     MEDCouplingFieldDouble *min(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return MinFields(this,&other); }
167     MEDCouplingFieldDouble *operator+(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return AddFields(this,&other); }
168     const MEDCouplingFieldDouble &operator+=(const MEDCouplingFieldDouble& other) throw(INTERP_KERNEL::Exception);
169     static MEDCouplingFieldDouble *AddFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
170     MEDCouplingFieldDouble *operator-(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return SubstractFields(this,&other); }
171     const MEDCouplingFieldDouble &operator-=(const MEDCouplingFieldDouble& other) throw(INTERP_KERNEL::Exception);
172     static MEDCouplingFieldDouble *SubstractFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
173     MEDCouplingFieldDouble *operator*(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return MultiplyFields(this,&other); }
174     const MEDCouplingFieldDouble &operator*=(const MEDCouplingFieldDouble& other) throw(INTERP_KERNEL::Exception);
175     static MEDCouplingFieldDouble *MultiplyFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
176     MEDCouplingFieldDouble *operator/(const MEDCouplingFieldDouble& other) const throw(INTERP_KERNEL::Exception) { return DivideFields(this,&other); }
177     const MEDCouplingFieldDouble &operator/=(const MEDCouplingFieldDouble& other) throw(INTERP_KERNEL::Exception);
178     static MEDCouplingFieldDouble *DivideFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) throw(INTERP_KERNEL::Exception);
179     static void WriteVTK(const char *fileName, const std::vector<const MEDCouplingFieldDouble *>& fs) throw(INTERP_KERNEL::Exception);
180   public:
181     const MEDCouplingTimeDiscretization *getTimeDiscretizationUnderGround() const { return _time_discr; }
182     MEDCouplingTimeDiscretization *getTimeDiscretizationUnderGround() { return _time_discr; }
183   private:
184     MEDCouplingFieldDouble(TypeOfField type, TypeOfTimeDiscretization td);
185     MEDCouplingFieldDouble(const MEDCouplingFieldTemplate *ft, TypeOfTimeDiscretization td);
186     MEDCouplingFieldDouble(const MEDCouplingFieldDouble& other, bool deepCopy);
187     MEDCouplingFieldDouble(NatureOfField n, MEDCouplingTimeDiscretization *td, MEDCouplingFieldDiscretization *type);
188     ~MEDCouplingFieldDouble();
189   private:
190     MEDCouplingTimeDiscretization *_time_discr;
191   };
192 }
193
194 #endif