Salome HOME
fix: replace unordered_set/map with set/map
[tools/medcoupling.git] / src / MEDCoupling / MEDCouplingTimeDiscretization.hxx
1 // Copyright (C) 2007-2024  CEA, EDF
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, or (at your option) any later version.
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 __MEDCOUPLINGTIMEDISCRETIZATION_HXX__
22 #define __MEDCOUPLINGTIMEDISCRETIZATION_HXX__
23
24 #include "MEDCoupling.hxx"
25 #include "MEDCouplingTimeLabel.hxx"
26 #include "MEDCouplingRefCountObject.hxx"
27 #include "InterpKernelException.hxx"
28 #include "MEDCouplingTraits.hxx"
29
30 #include <vector>
31
32 namespace MEDCoupling
33 {
34   class MEDCouplingMesh;
35   class DataArrayDouble;
36   class TimeLabel;
37
38   class TimeHolder
39   {
40   public:
41     MEDCOUPLING_EXPORT std::string getTimeUnit() const { return _time_unit; }
42     MEDCOUPLING_EXPORT void setTimeUnit(const std::string& unit) { _time_unit=unit; }
43     MEDCOUPLING_EXPORT double getTime(int& iteration, int& order) const { return getStartTime(iteration,order); }
44     MEDCOUPLING_EXPORT virtual double getStartTime(int& iteration, int& order) const = 0;
45     void copyTinyAttrFrom(const TimeHolder& other) { _time_unit=other._time_unit; }
46   protected:
47     TimeHolder() { }
48     TimeHolder(const TimeHolder& other):_time_unit(other._time_unit) { }
49     virtual ~TimeHolder() { }
50   private:
51     std::string _time_unit;
52   };
53
54   template<class T>
55   class MEDCouplingTimeDiscretizationTemplate : public TimeLabel, public BigMemoryObject, public TimeHolder
56   {
57   public:
58     MEDCOUPLING_EXPORT void updateTime() const;
59     MEDCOUPLING_EXPORT virtual void setArray(typename Traits<T>::ArrayType *array, TimeLabel *owner);
60     MEDCOUPLING_EXPORT typename Traits<T>::ArrayType *getArray() { return _array; }
61     MEDCOUPLING_EXPORT const typename Traits<T>::ArrayType *getArray() const { return _array; }
62     MEDCOUPLING_EXPORT void setTimeTolerance(double val) { _time_tolerance=val; }
63     MEDCOUPLING_EXPORT double getTimeTolerance() const { return _time_tolerance; }
64     MEDCOUPLING_EXPORT void setTime(double time, int iteration, int order) { setStartTime(time,iteration,order); }
65     MEDCOUPLING_EXPORT void setIteration(int it) { setStartIteration(it); }
66     MEDCOUPLING_EXPORT void setOrder(int order) { setStartOrder(order); }
67     MEDCOUPLING_EXPORT void setTimeValue(double val) { setStartTimeValue(val); }
68     MEDCOUPLING_EXPORT virtual void setStartIteration(int it) = 0;
69     MEDCOUPLING_EXPORT virtual void setStartOrder(int order) = 0;
70     MEDCOUPLING_EXPORT virtual void setStartTime(double time, int iteration, int order) = 0;
71     MEDCOUPLING_EXPORT virtual void setStartTimeValue(double time) = 0;
72     MEDCOUPLING_EXPORT virtual double getEndTime(int& iteration, int& order) const = 0;
73     MEDCOUPLING_EXPORT virtual void setEndIteration(int it) = 0;
74     MEDCOUPLING_EXPORT virtual void setEndOrder(int order) = 0;
75     MEDCOUPLING_EXPORT virtual void setEndTimeValue(double time) = 0;
76     MEDCOUPLING_EXPORT virtual void setEndTime(double time, int iteration, int order) = 0;
77     
78     MEDCOUPLING_EXPORT virtual void setEndArray(typename Traits<T>::ArrayType *array, TimeLabel *owner);
79     MEDCOUPLING_EXPORT virtual void setArrays(const std::vector< typename Traits<T>::ArrayType *>& arrays, TimeLabel *owner);
80     MEDCOUPLING_EXPORT virtual const typename Traits<T>::ArrayType *getEndArray() const;
81     MEDCOUPLING_EXPORT virtual typename Traits<T>::ArrayType *getEndArray();
82     MEDCOUPLING_EXPORT virtual void getArrays(std::vector<typename Traits<T>::ArrayType *>& arrays) const;
83     
84     MEDCOUPLING_EXPORT virtual std::string getStringRepr() const = 0;
85     MEDCOUPLING_EXPORT virtual TypeOfTimeDiscretization getEnum() const = 0;
86     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretizationTemplate<T> *performCopyOrIncrRef(bool deepCopy) const = 0;
87     //
88     MEDCOUPLING_EXPORT virtual void copyTinyAttrFrom(const MEDCouplingTimeDiscretizationTemplate<T>& other);
89     MEDCOUPLING_EXPORT virtual void copyTinyStringsFrom(const MEDCouplingTimeDiscretizationTemplate<T>& other);
90     MEDCOUPLING_EXPORT virtual void checkConsistencyLight() const;
91     MEDCOUPLING_EXPORT virtual std::size_t getHeapMemorySizeWithoutChildren() const;
92     MEDCOUPLING_EXPORT virtual std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
93     //
94     MEDCOUPLING_EXPORT virtual bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<T> *other, T prec, std::string& reason) const = 0;
95     MEDCOUPLING_EXPORT virtual bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<T> *other, T prec) const = 0;
96     //
97     MEDCOUPLING_EXPORT virtual bool areStrictlyCompatible(const MEDCouplingTimeDiscretizationTemplate<T> *other, std::string& reason) const;
98     MEDCOUPLING_EXPORT virtual bool areCompatible(const MEDCouplingTimeDiscretizationTemplate<T> *other) const;
99     MEDCOUPLING_EXPORT virtual bool areStrictlyCompatibleForMul(const MEDCouplingTimeDiscretizationTemplate<T> *other) const;
100     MEDCOUPLING_EXPORT virtual bool areStrictlyCompatibleForDiv(const MEDCouplingTimeDiscretizationTemplate<T> *other) const;
101     MEDCOUPLING_EXPORT virtual ~MEDCouplingTimeDiscretizationTemplate();
102     MEDCOUPLING_EXPORT virtual void getTinySerializationIntInformation(std::vector<mcIdType>& tinyInfo) const;
103     MEDCOUPLING_EXPORT virtual void getTinySerializationDbleInformation(std::vector<double>& tinyInfo) const;
104     MEDCOUPLING_EXPORT virtual void getTinySerializationStrInformation(std::vector<std::string>& tinyInfo) const;
105     MEDCOUPLING_EXPORT virtual void resizeForUnserialization(const std::vector<mcIdType>& tinyInfoI, std::vector<typename Traits<T>::ArrayType *>& arrays);
106     MEDCOUPLING_EXPORT virtual void checkForUnserialization(const std::vector<mcIdType>& tinyInfoI, const std::vector<typename Traits<T>::ArrayType *>& arrays);
107     MEDCOUPLING_EXPORT virtual void finishUnserialization(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD, const std::vector<std::string>& tinyInfoS);
108   protected:
109     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretizationTemplate();
110     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretizationTemplate(const MEDCouplingTimeDiscretizationTemplate<T>& other, bool deepCopy);
111   protected:
112     double _time_tolerance;
113     typename Traits<T>::ArrayType *_array;
114   protected:
115     static const double TIME_TOLERANCE_DFT;
116   };
117
118   class MEDCouplingTimeKeeper
119   {
120   public:
121     MEDCOUPLING_EXPORT MEDCouplingTimeKeeper():_time(0.),_iteration(-1),_order(-1) { }
122     MEDCOUPLING_EXPORT double getAllInfo(int& iteration, int& order) const { iteration=_iteration; order=_order; return _time; }
123     MEDCOUPLING_EXPORT void setAllInfo(double time, int iteration, int order) { _time=time; _iteration=iteration; _order=order; }
124     MEDCOUPLING_EXPORT int getIteration() const { return _iteration; }
125     MEDCOUPLING_EXPORT void setIteration(int it) { _iteration=it; }
126     MEDCOUPLING_EXPORT int getOrder() const { return _order; }
127     MEDCOUPLING_EXPORT void setOrder(int order) { _order=order; }
128     MEDCOUPLING_EXPORT double getTimeValue() const { return _time; }
129     MEDCOUPLING_EXPORT void setTimeValue(double time) { _time=time; }
130     MEDCOUPLING_EXPORT bool isEqualIfNotWhy(const MEDCouplingTimeKeeper& other, double prec, std::string& reason) const;
131     MEDCOUPLING_EXPORT bool isEqual(const MEDCouplingTimeKeeper& other, double prec) const;
132     MEDCOUPLING_EXPORT void copyFrom(const MEDCouplingTimeKeeper& other);
133     MEDCOUPLING_EXPORT void checkTimePresence(double time, double eps) const;
134   private:
135     double _time;
136     int _iteration;
137     int _order;
138   };
139
140   class MEDCouplingTimeDiscretization : public MEDCouplingTimeDiscretizationTemplate<double>
141   {
142   protected:
143     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization() { }
144     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization(const MEDCouplingTimeDiscretization& other, bool deepCopy):MEDCouplingTimeDiscretizationTemplate<double>(other,deepCopy) { }
145   public:
146     MEDCOUPLING_EXPORT static MEDCouplingTimeDiscretization *New(TypeOfTimeDiscretization type);
147     MEDCOUPLING_EXPORT virtual bool areCompatibleForMeld(const MEDCouplingTimeDiscretization *other) const;
148     MEDCOUPLING_EXPORT virtual bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec) const;
149     MEDCOUPLING_EXPORT virtual bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec, std::string& reason) const;
150     MEDCOUPLING_EXPORT virtual bool isEqual(const MEDCouplingTimeDiscretization *other, double prec) const;
151     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *buildNewTimeReprFromThis(TypeOfTimeDiscretization type, bool deepCopy) const;
152     MEDCOUPLING_EXPORT virtual void synchronizeTimeWith(const MEDCouplingMesh *mesh) = 0;
153     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *aggregate(const MEDCouplingTimeDiscretization *other) const = 0;
154     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *aggregate(const std::vector<const MEDCouplingTimeDiscretization *>& other) const = 0;
155     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *meld(const MEDCouplingTimeDiscretization *other) const = 0;
156     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *dot(const MEDCouplingTimeDiscretization *other) const = 0;
157     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *crossProduct(const MEDCouplingTimeDiscretization *other) const = 0;
158     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *max(const MEDCouplingTimeDiscretization *other) const = 0;
159     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *min(const MEDCouplingTimeDiscretization *other) const = 0;
160     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *add(const MEDCouplingTimeDiscretization *other) const = 0;
161     MEDCOUPLING_EXPORT virtual void addEqual(const MEDCouplingTimeDiscretization *other) = 0;
162     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *substract(const MEDCouplingTimeDiscretization *other) const = 0;
163     MEDCOUPLING_EXPORT virtual void substractEqual(const MEDCouplingTimeDiscretization *other) = 0;
164     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *multiply(const MEDCouplingTimeDiscretization *other) const = 0;
165     MEDCOUPLING_EXPORT virtual void multiplyEqual(const MEDCouplingTimeDiscretization *other) = 0;
166     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *divide(const MEDCouplingTimeDiscretization *other) const = 0;
167     MEDCOUPLING_EXPORT virtual void divideEqual(const MEDCouplingTimeDiscretization *other) = 0;
168     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *pow(const MEDCouplingTimeDiscretization *other) const = 0;
169     MEDCOUPLING_EXPORT virtual void powEqual(const MEDCouplingTimeDiscretization *other) = 0;
170     MEDCOUPLING_EXPORT virtual void getTinySerializationIntInformation2(std::vector<mcIdType>& tinyInfo) const = 0;
171     MEDCOUPLING_EXPORT virtual void getTinySerializationDbleInformation2(std::vector<double>& tinyInfo) const = 0;
172     MEDCOUPLING_EXPORT virtual void finishUnserialization2(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD) = 0;
173     MEDCOUPLING_EXPORT virtual void checkNoTimePresence() const = 0;
174     MEDCOUPLING_EXPORT virtual void checkTimePresence(double time) const = 0;
175     MEDCOUPLING_EXPORT virtual std::vector< const DataArrayDouble *> getArraysForTime(double time) const = 0;
176     MEDCOUPLING_EXPORT virtual void getValueForTime(double time, const std::vector<double>& vals, double *res) const = 0;
177     MEDCOUPLING_EXPORT virtual bool isBefore(const MEDCouplingTimeDiscretization *other) const;
178     MEDCOUPLING_EXPORT virtual bool isStrictlyBefore(const MEDCouplingTimeDiscretization *other) const;
179     MEDCOUPLING_EXPORT virtual void getValueOnTime(mcIdType eltId, double time, double *value) const = 0;
180     MEDCOUPLING_EXPORT virtual void getValueOnDiscTime(mcIdType eltId, int iteration, int order, double *value) const = 0;
181     //
182     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *computeVectorFieldCyl(const DataArrayDouble *coords, const double center[3], const double vect[3]) const;
183     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *doublyContractedProduct() const;
184     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *determinant() const;
185     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *eigenValues() const;
186     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *eigenVectors() const;
187     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *inverse() const;
188     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *trace() const;
189     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *deviator() const;
190     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *magnitude() const;
191     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *negate() const;
192     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *maxPerTuple() const;
193     MEDCOUPLING_EXPORT virtual MEDCouplingTimeDiscretization *keepSelectedComponents(const std::vector<std::size_t>& compoIds) const;
194     MEDCOUPLING_EXPORT virtual void setSelectedComponents(const MEDCouplingTimeDiscretization *other, const std::vector<std::size_t>& compoIds);
195     MEDCOUPLING_EXPORT virtual void changeNbOfComponents(std::size_t newNbOfComp, double dftValue);
196     MEDCOUPLING_EXPORT virtual void sortPerTuple(bool asc);
197     MEDCOUPLING_EXPORT virtual void setUniformValue(mcIdType nbOfTuple, int nbOfCompo, double value);
198     MEDCOUPLING_EXPORT virtual void setOrCreateUniformValueOnAllComponents(mcIdType nbOfTuple, double value);
199     MEDCOUPLING_EXPORT virtual void applyLin(double a, double b, int compoId);
200     MEDCOUPLING_EXPORT virtual void applyLin(double a, double b);
201     MEDCOUPLING_EXPORT virtual void applyFunc(int nbOfComp, FunctionToEvaluate func);
202     MEDCOUPLING_EXPORT virtual void applyFunc(int nbOfComp, const std::string& func);
203     MEDCOUPLING_EXPORT virtual void applyFuncCompo(int nbOfComp, const std::string& func);
204     MEDCOUPLING_EXPORT virtual void applyFuncNamedCompo(int nbOfComp, const std::vector<std::string>& varsOrder, const std::string& func);
205     MEDCOUPLING_EXPORT virtual void applyFunc(const std::string& func);
206     MEDCOUPLING_EXPORT virtual void applyFuncFast32(const std::string& func);
207     MEDCOUPLING_EXPORT virtual void applyFuncFast64(const std::string& func);
208     MEDCOUPLING_EXPORT virtual void fillFromAnalytic(const DataArrayDouble *loc, int nbOfComp, FunctionToEvaluate func);
209     MEDCOUPLING_EXPORT virtual void fillFromAnalytic(const DataArrayDouble *loc, int nbOfComp, const std::string& func);
210     MEDCOUPLING_EXPORT virtual void fillFromAnalyticCompo(const DataArrayDouble *loc, int nbOfComp, const std::string& func);
211     MEDCOUPLING_EXPORT virtual void fillFromAnalyticNamedCompo(const DataArrayDouble *loc, int nbOfComp, const std::vector<std::string>& varsOrder, const std::string& func);
212   };
213
214   template<class T>
215   class MEDCouplingTimeDiscretizationSimple : public MEDCouplingTimeDiscretizationTemplate<T>
216   {
217   public:
218     std::string getStringRepr() const;
219     double getStartTime(int& iteration, int& order) const { return _tk.getAllInfo(iteration,order); }
220     void setStartIteration(int it) { _tk.setIteration(it); }
221     void setStartOrder(int order) { _tk.setOrder(order); }
222     void setStartTimeValue(double time) { _tk.setTimeValue(time); } 
223     void setStartTime(double time, int iteration, int order) { _tk.setAllInfo(time,iteration,order); }
224     double getEndTime(int& iteration, int& order) const;
225     void setEndIteration(int it);
226     void setEndOrder(int order);
227     void setEndTimeValue(double time);
228     void setEndTime(double time, int iteration, int order);
229     TypeOfTimeDiscretization getEnum() const { return DISCRETIZATION; }
230   protected:
231     MEDCouplingTimeDiscretizationSimple(const MEDCouplingTimeDiscretizationSimple<T>& other, bool deepCopy);
232     MEDCouplingTimeDiscretizationSimple() { }
233   protected:
234     MEDCouplingTimeKeeper _tk;
235   private:
236     MEDCOUPLING_EXPORT static const char REPR[];
237   protected:
238     static const TypeOfTimeDiscretization DISCRETIZATION=ONE_TIME;
239   };
240   
241   class MEDCouplingTimeDiscretizationInt32 : public MEDCouplingTimeDiscretizationSimple<Int32>
242   {
243   public:
244     MEDCouplingTimeDiscretizationInt32() { }
245     std::string getClassName() const override { return std::string("MEDCouplingTimeDiscretizationInt32"); }
246     MEDCouplingTimeDiscretizationInt32(const MEDCouplingTimeDiscretizationInt32& other, bool deepCopy);
247     static MEDCouplingTimeDiscretizationInt32 *New(TypeOfTimeDiscretization type);
248     MEDCouplingTimeDiscretizationInt32 *performCopyOrIncrRef(bool deepCopy) const;
249     bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<Int32> *other, Int32 prec, std::string& reason) const;
250     bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<Int32> *other, Int32 prec) const;
251   };
252
253   class MEDCouplingTimeDiscretizationInt64 : public MEDCouplingTimeDiscretizationSimple<Int64>
254   {
255   public:
256     MEDCouplingTimeDiscretizationInt64() { }
257     std::string getClassName() const override { return std::string("MEDCouplingTimeDiscretizationInt64"); }
258     MEDCouplingTimeDiscretizationInt64(const MEDCouplingTimeDiscretizationInt64& other, bool deepCopy);
259     static MEDCouplingTimeDiscretizationInt64 *New(TypeOfTimeDiscretization type);
260     MEDCouplingTimeDiscretizationInt64 *performCopyOrIncrRef(bool deepCopy) const;
261     bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<Int64> *other, Int64 prec, std::string& reason) const override;
262     bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<Int64> *other, Int64 prec) const override;
263   };
264
265   class MEDCouplingTimeDiscretizationFloat : public MEDCouplingTimeDiscretizationSimple<float>
266   {
267   public:
268     MEDCouplingTimeDiscretizationFloat() { }
269     std::string getClassName() const override { return std::string("MEDCouplingTimeDiscretizationFloat"); }
270     MEDCouplingTimeDiscretizationFloat(const MEDCouplingTimeDiscretizationFloat& other, bool deepCopy);
271     static MEDCouplingTimeDiscretizationFloat *New(TypeOfTimeDiscretization type);
272     MEDCouplingTimeDiscretizationFloat *performCopyOrIncrRef(bool deepCopy) const;
273     bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<float> *other, float prec, std::string& reason) const;
274     bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<float> *other, float prec) const;
275   private:
276     static const TypeOfTimeDiscretization DISCRETIZATION=ONE_TIME;
277   };
278   
279   class MEDCouplingNoTimeLabel : public MEDCouplingTimeDiscretization
280   {
281   public:
282     MEDCOUPLING_EXPORT MEDCouplingNoTimeLabel();
283     MEDCOUPLING_EXPORT MEDCouplingNoTimeLabel(const MEDCouplingTimeDiscretization& other, bool deepCopy);
284     MEDCOUPLING_EXPORT std::string getStringRepr() const;
285     MEDCOUPLING_EXPORT std::string getClassName() const override { return std::string("MEDCouplingNoTimeLabel"); }
286     MEDCOUPLING_EXPORT TypeOfTimeDiscretization getEnum() const { return DISCRETIZATION; }
287     MEDCOUPLING_EXPORT void synchronizeTimeWith(const MEDCouplingMesh *mesh);
288     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const MEDCouplingTimeDiscretization *other) const;
289     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const std::vector<const MEDCouplingTimeDiscretization *>& other) const;
290     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *meld(const MEDCouplingTimeDiscretization *other) const;
291     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *dot(const MEDCouplingTimeDiscretization *other) const;
292     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *crossProduct(const MEDCouplingTimeDiscretization *other) const;
293     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *max(const MEDCouplingTimeDiscretization *other) const;
294     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *min(const MEDCouplingTimeDiscretization *other) const;
295     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *add(const MEDCouplingTimeDiscretization *other) const;
296     MEDCOUPLING_EXPORT void addEqual(const MEDCouplingTimeDiscretization *other);
297     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *substract(const MEDCouplingTimeDiscretization *other) const;
298     MEDCOUPLING_EXPORT void substractEqual(const MEDCouplingTimeDiscretization *other);
299     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *multiply(const MEDCouplingTimeDiscretization *other) const;
300     MEDCOUPLING_EXPORT void multiplyEqual(const MEDCouplingTimeDiscretization *other);
301     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *divide(const MEDCouplingTimeDiscretization *other) const;
302     MEDCOUPLING_EXPORT void divideEqual(const MEDCouplingTimeDiscretization *other);
303     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *pow(const MEDCouplingTimeDiscretization *other) const;
304     MEDCOUPLING_EXPORT void powEqual(const MEDCouplingTimeDiscretization *other);
305     MEDCOUPLING_EXPORT bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec, std::string& reason) const;
306     MEDCOUPLING_EXPORT bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec) const;
307     MEDCOUPLING_EXPORT bool areCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
308     MEDCOUPLING_EXPORT bool areStrictlyCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other, std::string& reason) const;
309     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForMul(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
310     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForDiv(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
311     MEDCOUPLING_EXPORT bool areCompatibleForMeld(const MEDCouplingTimeDiscretization *other) const;
312     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *performCopyOrIncrRef(bool deepCopy) const;
313     MEDCOUPLING_EXPORT void checkNoTimePresence() const { }
314     MEDCOUPLING_EXPORT void checkTimePresence(double time) const;
315     MEDCOUPLING_EXPORT std::vector< const DataArrayDouble *> getArraysForTime(double time) const;
316     MEDCOUPLING_EXPORT void getValueForTime(double time, const std::vector<double>& vals, double *res) const;
317     MEDCOUPLING_EXPORT bool isBefore(const MEDCouplingTimeDiscretization *other) const;
318     MEDCOUPLING_EXPORT bool isStrictlyBefore(const MEDCouplingTimeDiscretization *other) const;
319     MEDCOUPLING_EXPORT double getStartTime(int& iteration, int& order) const;
320     MEDCOUPLING_EXPORT double getEndTime(int& iteration, int& order) const;
321     MEDCOUPLING_EXPORT void setStartIteration(int it);
322     MEDCOUPLING_EXPORT void setEndIteration(int it);
323     MEDCOUPLING_EXPORT void setStartOrder(int order);
324     MEDCOUPLING_EXPORT void setEndOrder(int order);
325     MEDCOUPLING_EXPORT void setStartTimeValue(double time);
326     MEDCOUPLING_EXPORT void setEndTimeValue(double time);
327     MEDCOUPLING_EXPORT void setStartTime(double time, int iteration, int order);
328     MEDCOUPLING_EXPORT void setEndTime(double time, int iteration, int order);
329     MEDCOUPLING_EXPORT void getValueOnTime(mcIdType eltId, double time, double *value) const;
330     MEDCOUPLING_EXPORT void getValueOnDiscTime(mcIdType eltId, int iteration, int order, double *value) const;
331     MEDCOUPLING_EXPORT void getTinySerializationIntInformation2(std::vector<mcIdType>& tinyInfo) const;
332     MEDCOUPLING_EXPORT void getTinySerializationDbleInformation2(std::vector<double>& tinyInfo) const;
333     MEDCOUPLING_EXPORT void finishUnserialization2(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD);
334   public:
335     static const TypeOfTimeDiscretization DISCRETIZATION=NO_TIME;
336     MEDCOUPLING_EXPORT static const char REPR[];
337   private:
338     static const char EXCEPTION_MSG[];
339   };
340
341   class MEDCouplingWithTimeStep : public MEDCouplingTimeDiscretization
342   {
343   protected:
344     MEDCOUPLING_EXPORT MEDCouplingWithTimeStep(const MEDCouplingWithTimeStep& other, bool deepCopy);
345   public:
346     MEDCOUPLING_EXPORT MEDCouplingWithTimeStep();
347     MEDCOUPLING_EXPORT std::string getClassName() const override { return std::string("MEDCouplingWithTimeLabel"); }
348     MEDCOUPLING_EXPORT std::string getStringRepr() const;
349     MEDCOUPLING_EXPORT void copyTinyAttrFrom(const MEDCouplingTimeDiscretizationTemplate<double>& other);
350     MEDCOUPLING_EXPORT TypeOfTimeDiscretization getEnum() const { return DISCRETIZATION; }
351     MEDCOUPLING_EXPORT void synchronizeTimeWith(const MEDCouplingMesh *mesh);
352     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const MEDCouplingTimeDiscretization *other) const;
353     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const std::vector<const MEDCouplingTimeDiscretization *>& other) const;
354     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *meld(const MEDCouplingTimeDiscretization *other) const;
355     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *dot(const MEDCouplingTimeDiscretization *other) const;
356     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *crossProduct(const MEDCouplingTimeDiscretization *other) const;
357     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *max(const MEDCouplingTimeDiscretization *other) const;
358     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *min(const MEDCouplingTimeDiscretization *other) const;
359     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *add(const MEDCouplingTimeDiscretization *other) const;
360     MEDCOUPLING_EXPORT void addEqual(const MEDCouplingTimeDiscretization *other);
361     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *substract(const MEDCouplingTimeDiscretization *other) const;
362     MEDCOUPLING_EXPORT void substractEqual(const MEDCouplingTimeDiscretization *other);
363     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *multiply(const MEDCouplingTimeDiscretization *other) const;
364     MEDCOUPLING_EXPORT void multiplyEqual(const MEDCouplingTimeDiscretization *other);
365     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *divide(const MEDCouplingTimeDiscretization *other) const;
366     MEDCOUPLING_EXPORT void divideEqual(const MEDCouplingTimeDiscretization *other);
367     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *pow(const MEDCouplingTimeDiscretization *other) const;
368     MEDCOUPLING_EXPORT void powEqual(const MEDCouplingTimeDiscretization *other);
369     MEDCOUPLING_EXPORT bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec, std::string& reason) const;
370     MEDCOUPLING_EXPORT bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec) const;
371     MEDCOUPLING_EXPORT bool areCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
372     MEDCOUPLING_EXPORT bool areStrictlyCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other, std::string& reason) const;
373     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForMul(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
374     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForDiv(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
375     MEDCOUPLING_EXPORT bool areCompatibleForMeld(const MEDCouplingTimeDiscretization *other) const;
376     MEDCOUPLING_EXPORT void getTinySerializationIntInformation(std::vector<mcIdType>& tinyInfo) const;
377     MEDCOUPLING_EXPORT void getTinySerializationDbleInformation(std::vector<double>& tinyInfo) const;
378     MEDCOUPLING_EXPORT void finishUnserialization(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD, const std::vector<std::string>& tinyInfoS);
379     MEDCOUPLING_EXPORT void getTinySerializationIntInformation2(std::vector<mcIdType>& tinyInfo) const;
380     MEDCOUPLING_EXPORT void getTinySerializationDbleInformation2(std::vector<double>& tinyInfo) const;
381     MEDCOUPLING_EXPORT void finishUnserialization2(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD);
382     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *performCopyOrIncrRef(bool deepCopy) const;
383     MEDCOUPLING_EXPORT void checkNoTimePresence() const;
384     MEDCOUPLING_EXPORT void checkTimePresence(double time) const;
385     MEDCOUPLING_EXPORT void setStartTime(double time, int iteration, int order) { _tk.setAllInfo(time,iteration,order); }
386     MEDCOUPLING_EXPORT void setEndTime(double time, int iteration, int order) { _tk.setAllInfo(time,iteration,order); }
387     MEDCOUPLING_EXPORT double getStartTime(int& iteration, int& order) const { return _tk.getAllInfo(iteration,order); }
388     MEDCOUPLING_EXPORT double getEndTime(int& iteration, int& order) const { return _tk.getAllInfo(iteration,order); }
389     MEDCOUPLING_EXPORT void setStartIteration(int it) { _tk.setIteration(it); }
390     MEDCOUPLING_EXPORT void setEndIteration(int it) { _tk.setIteration(it); }
391     MEDCOUPLING_EXPORT void setStartOrder(int order) { _tk.setOrder(order); }
392     MEDCOUPLING_EXPORT void setEndOrder(int order) { _tk.setOrder(order); }
393     MEDCOUPLING_EXPORT void setStartTimeValue(double time) { _tk.setTimeValue(time); }
394     MEDCOUPLING_EXPORT void setEndTimeValue(double time) { _tk.setTimeValue(time); }
395     MEDCOUPLING_EXPORT std::vector< const DataArrayDouble *> getArraysForTime(double time) const;
396     MEDCOUPLING_EXPORT void getValueForTime(double time, const std::vector<double>& vals, double *res) const;
397     MEDCOUPLING_EXPORT void getValueOnTime(mcIdType eltId, double time, double *value) const;
398     MEDCOUPLING_EXPORT void getValueOnDiscTime(mcIdType eltId, int iteration, int order, double *value) const;
399   public:
400     static const TypeOfTimeDiscretization DISCRETIZATION=ONE_TIME;
401     MEDCOUPLING_EXPORT static const char REPR[];
402   private:
403     static const char EXCEPTION_MSG[];
404   protected:
405     MEDCouplingTimeKeeper _tk;
406   };
407
408   class MEDCouplingConstOnTimeInterval : public MEDCouplingTimeDiscretization
409   {
410   protected:
411     MEDCOUPLING_EXPORT MEDCouplingConstOnTimeInterval(const MEDCouplingConstOnTimeInterval& other, bool deepCopy);
412   public:
413     MEDCOUPLING_EXPORT MEDCouplingConstOnTimeInterval();
414     MEDCOUPLING_EXPORT std::string getClassName() const override { return std::string("MEDCouplingConstOnTimeInterval"); }
415     MEDCOUPLING_EXPORT void copyTinyAttrFrom(const MEDCouplingTimeDiscretizationTemplate<double>& other);
416     MEDCOUPLING_EXPORT void getTinySerializationIntInformation(std::vector<mcIdType>& tinyInfo) const;
417     MEDCOUPLING_EXPORT void getTinySerializationDbleInformation(std::vector<double>& tinyInfo) const;
418     MEDCOUPLING_EXPORT void finishUnserialization(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD, const std::vector<std::string>& tinyInfoS);
419     MEDCOUPLING_EXPORT void getTinySerializationIntInformation2(std::vector<mcIdType>& tinyInfo) const;
420     MEDCOUPLING_EXPORT void getTinySerializationDbleInformation2(std::vector<double>& tinyInfo) const;
421     MEDCOUPLING_EXPORT void finishUnserialization2(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD);
422     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *performCopyOrIncrRef(bool deepCopy) const;
423     MEDCOUPLING_EXPORT bool areCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
424     MEDCOUPLING_EXPORT bool areStrictlyCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other, std::string& reason) const;
425     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForMul(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
426     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForDiv(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
427     MEDCOUPLING_EXPORT bool areCompatibleForMeld(const MEDCouplingTimeDiscretization *other) const;
428     MEDCOUPLING_EXPORT bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec, std::string& reason) const;
429     MEDCOUPLING_EXPORT bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec) const;
430     MEDCOUPLING_EXPORT std::vector< const DataArrayDouble *> getArraysForTime(double time) const;
431     MEDCOUPLING_EXPORT void getValueForTime(double time, const std::vector<double>& vals, double *res) const;
432     MEDCOUPLING_EXPORT void getValueOnTime(mcIdType eltId, double time, double *value) const;
433     MEDCOUPLING_EXPORT void getValueOnDiscTime(mcIdType eltId, int iteration, int order, double *value) const;
434     MEDCOUPLING_EXPORT TypeOfTimeDiscretization getEnum() const { return DISCRETIZATION; }
435     MEDCOUPLING_EXPORT void synchronizeTimeWith(const MEDCouplingMesh *mesh);
436     MEDCOUPLING_EXPORT std::string getStringRepr() const;
437     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const MEDCouplingTimeDiscretization *other) const;
438     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const std::vector<const MEDCouplingTimeDiscretization *>& other) const;
439     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *meld(const MEDCouplingTimeDiscretization *other) const;
440     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *dot(const MEDCouplingTimeDiscretization *other) const;
441     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *crossProduct(const MEDCouplingTimeDiscretization *other) const;
442     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *max(const MEDCouplingTimeDiscretization *other) const;
443     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *min(const MEDCouplingTimeDiscretization *other) const;
444     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *add(const MEDCouplingTimeDiscretization *other) const;
445     MEDCOUPLING_EXPORT void addEqual(const MEDCouplingTimeDiscretization *other);
446     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *substract(const MEDCouplingTimeDiscretization *other) const;
447     MEDCOUPLING_EXPORT void substractEqual(const MEDCouplingTimeDiscretization *other);
448     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *multiply(const MEDCouplingTimeDiscretization *other) const;
449     MEDCOUPLING_EXPORT void multiplyEqual(const MEDCouplingTimeDiscretization *other);
450     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *divide(const MEDCouplingTimeDiscretization *other) const;
451     MEDCOUPLING_EXPORT void divideEqual(const MEDCouplingTimeDiscretization *other);
452     MEDCouplingTimeDiscretization *pow(const MEDCouplingTimeDiscretization *other) const;
453     MEDCOUPLING_EXPORT void powEqual(const MEDCouplingTimeDiscretization *other);
454     MEDCOUPLING_EXPORT void setStartTime(double time, int iteration, int order) { _start.setAllInfo(time,iteration,order); }
455     MEDCOUPLING_EXPORT void setEndTime(double time, int iteration, int order) { _end.setAllInfo(time,iteration,order); }
456     MEDCOUPLING_EXPORT double getStartTime(int& iteration, int& order) const { return _start.getAllInfo(iteration,order); }
457     MEDCOUPLING_EXPORT double getEndTime(int& iteration, int& order) const { return _end.getAllInfo(iteration,order); }
458     MEDCOUPLING_EXPORT void setStartIteration(int it) { _start.setIteration(it); }
459     MEDCOUPLING_EXPORT void setEndIteration(int it) { _end.setIteration(it); }
460     MEDCOUPLING_EXPORT void setStartOrder(int order) { _start.setOrder(order); }
461     MEDCOUPLING_EXPORT void setEndOrder(int order) { _end.setOrder(order); }
462     MEDCOUPLING_EXPORT void setStartTimeValue(double time) { _start.setTimeValue(time); }
463     MEDCOUPLING_EXPORT void setEndTimeValue(double time) { _end.setTimeValue(time); }
464     MEDCOUPLING_EXPORT void checkNoTimePresence() const;
465     MEDCOUPLING_EXPORT void checkTimePresence(double time) const;
466   public:
467     static const TypeOfTimeDiscretization DISCRETIZATION=CONST_ON_TIME_INTERVAL;
468     MEDCOUPLING_EXPORT static const char REPR[];
469   private:
470     static const char EXCEPTION_MSG[];
471   protected:
472     MEDCouplingTimeKeeper _start;
473     MEDCouplingTimeKeeper _end;
474   };
475
476   class MEDCouplingTwoTimeSteps : public MEDCouplingTimeDiscretization
477   {
478   protected:
479     MEDCOUPLING_EXPORT MEDCouplingTwoTimeSteps(const MEDCouplingTwoTimeSteps& other, bool deepCopy);
480     MEDCOUPLING_EXPORT MEDCouplingTwoTimeSteps();
481     MEDCOUPLING_EXPORT ~MEDCouplingTwoTimeSteps();
482   public:
483     MEDCOUPLING_EXPORT std::string getClassName() const override { return std::string("MEDCouplingTwoTimeSteps"); }
484     MEDCOUPLING_EXPORT void updateTime() const;
485     MEDCOUPLING_EXPORT void synchronizeTimeWith(const MEDCouplingMesh *mesh);
486     MEDCOUPLING_EXPORT std::size_t getHeapMemorySizeWithoutChildren() const;
487     MEDCOUPLING_EXPORT std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
488     MEDCOUPLING_EXPORT void copyTinyAttrFrom(const MEDCouplingTimeDiscretizationTemplate<double>& other);
489     MEDCOUPLING_EXPORT void copyTinyStringsFrom(const MEDCouplingTimeDiscretizationTemplate<double>& other);
490     MEDCOUPLING_EXPORT const DataArrayDouble *getEndArray() const;
491     MEDCOUPLING_EXPORT DataArrayDouble *getEndArray();
492     MEDCOUPLING_EXPORT void checkConsistencyLight() const;
493     MEDCOUPLING_EXPORT bool isEqualIfNotWhy(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec, std::string& reason) const;
494     MEDCOUPLING_EXPORT bool isEqualWithoutConsideringStr(const MEDCouplingTimeDiscretizationTemplate<double> *other, double prec) const;
495     MEDCOUPLING_EXPORT void checkNoTimePresence() const;
496     MEDCOUPLING_EXPORT void checkTimePresence(double time) const;
497     MEDCOUPLING_EXPORT void getArrays(std::vector<DataArrayDouble *>& arrays) const;
498     MEDCOUPLING_EXPORT void setEndArray(DataArrayDouble *array, TimeLabel *owner);
499     MEDCOUPLING_EXPORT void setStartTime(double time, int iteration, int order) { _start.setAllInfo(time,iteration,order); }
500     MEDCOUPLING_EXPORT void setEndTime(double time, int iteration, int order) { _end.setAllInfo(time,iteration,order); }
501     MEDCOUPLING_EXPORT double getStartTime(int& iteration, int& order) const { return _start.getAllInfo(iteration,order); }
502     MEDCOUPLING_EXPORT double getEndTime(int& iteration, int& order) const { return _end.getAllInfo(iteration,order); }
503     MEDCOUPLING_EXPORT void setStartIteration(int it) { _start.setIteration(it); }
504     MEDCOUPLING_EXPORT void setEndIteration(int it) { _end.setIteration(it); }
505     MEDCOUPLING_EXPORT void setStartOrder(int order) { _start.setOrder(order); }
506     MEDCOUPLING_EXPORT void setEndOrder(int order) { _end.setOrder(order); }
507     MEDCOUPLING_EXPORT void setStartTimeValue(double time) { _start.setTimeValue(time); }
508     MEDCOUPLING_EXPORT void setEndTimeValue(double time) { _end.setTimeValue(time); }
509     MEDCOUPLING_EXPORT void getTinySerializationIntInformation(std::vector<mcIdType>& tinyInfo) const;
510     MEDCOUPLING_EXPORT void getTinySerializationDbleInformation(std::vector<double>& tinyInfo) const;
511     MEDCOUPLING_EXPORT void getTinySerializationStrInformation(std::vector<std::string>& tinyInfo) const;
512     MEDCOUPLING_EXPORT void resizeForUnserialization(const std::vector<mcIdType>& tinyInfoI, std::vector<DataArrayDouble *>& arrays);
513     MEDCOUPLING_EXPORT void checkForUnserialization(const std::vector<mcIdType>& tinyInfoI, const std::vector<DataArrayDouble *>& arrays);
514     MEDCOUPLING_EXPORT void finishUnserialization(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD, const std::vector<std::string>& tinyInfoS);
515     MEDCOUPLING_EXPORT void getTinySerializationIntInformation2(std::vector<mcIdType>& tinyInfo) const;
516     MEDCOUPLING_EXPORT void getTinySerializationDbleInformation2(std::vector<double>& tinyInfo) const;
517     MEDCOUPLING_EXPORT void finishUnserialization2(const std::vector<mcIdType>& tinyInfoI, const std::vector<double>& tinyInfoD);
518     MEDCOUPLING_EXPORT std::vector< const DataArrayDouble *> getArraysForTime(double time) const;
519     MEDCOUPLING_EXPORT void setArrays(const std::vector<DataArrayDouble *>& arrays, TimeLabel *owner);
520   protected:
521     static const char EXCEPTION_MSG[];
522   protected:
523     MEDCouplingTimeKeeper _start;
524     MEDCouplingTimeKeeper _end;
525     DataArrayDouble *_end_array;
526   };
527
528   class MEDCouplingLinearTime : public MEDCouplingTwoTimeSteps
529   {
530   protected:
531     MEDCOUPLING_EXPORT MEDCouplingLinearTime(const MEDCouplingLinearTime& other, bool deepCopy);
532   public:
533     MEDCOUPLING_EXPORT MEDCouplingLinearTime();
534     MEDCOUPLING_EXPORT std::string getStringRepr() const;
535     MEDCOUPLING_EXPORT TypeOfTimeDiscretization getEnum() const { return DISCRETIZATION; }
536     MEDCOUPLING_EXPORT void checkConsistencyLight() const;
537     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *performCopyOrIncrRef(bool deepCopy) const;
538     MEDCOUPLING_EXPORT bool areCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
539     MEDCOUPLING_EXPORT bool areStrictlyCompatible(const MEDCouplingTimeDiscretizationTemplate<double> *other, std::string& reason) const;
540     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForMul(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
541     MEDCOUPLING_EXPORT bool areStrictlyCompatibleForDiv(const MEDCouplingTimeDiscretizationTemplate<double> *other) const;
542     MEDCOUPLING_EXPORT bool areCompatibleForMeld(const MEDCouplingTimeDiscretization *other) const;
543     MEDCOUPLING_EXPORT void getValueForTime(double time, const std::vector<double>& vals, double *res) const;
544     MEDCOUPLING_EXPORT void getValueOnTime(mcIdType eltId, double time, double *value) const;
545     MEDCOUPLING_EXPORT void getValueOnDiscTime(mcIdType eltId, int iteration, int order, double *value) const;
546     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const MEDCouplingTimeDiscretization *other) const;
547     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *aggregate(const std::vector<const MEDCouplingTimeDiscretization *>& other) const;
548     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *meld(const MEDCouplingTimeDiscretization *other) const;
549     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *dot(const MEDCouplingTimeDiscretization *other) const;
550     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *crossProduct(const MEDCouplingTimeDiscretization *other) const;
551     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *max(const MEDCouplingTimeDiscretization *other) const;
552     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *min(const MEDCouplingTimeDiscretization *other) const;
553     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *add(const MEDCouplingTimeDiscretization *other) const;
554     MEDCOUPLING_EXPORT void addEqual(const MEDCouplingTimeDiscretization *other);
555     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *substract(const MEDCouplingTimeDiscretization *other) const;
556     MEDCOUPLING_EXPORT void substractEqual(const MEDCouplingTimeDiscretization *other);
557     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *multiply(const MEDCouplingTimeDiscretization *other) const;
558     MEDCOUPLING_EXPORT void multiplyEqual(const MEDCouplingTimeDiscretization *other);
559     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *divide(const MEDCouplingTimeDiscretization *other) const;
560     MEDCOUPLING_EXPORT void divideEqual(const MEDCouplingTimeDiscretization *other);
561     MEDCOUPLING_EXPORT MEDCouplingTimeDiscretization *pow(const MEDCouplingTimeDiscretization *other) const;
562     MEDCOUPLING_EXPORT void powEqual(const MEDCouplingTimeDiscretization *other);
563   public:
564     static const TypeOfTimeDiscretization DISCRETIZATION=LINEAR_TIME;
565     MEDCOUPLING_EXPORT static const char REPR[];
566   };
567 }
568
569 #endif