Salome HOME
22dc26e2d695f8d377e14c6e930f5cccac722b88
[tools/medcoupling.git] / src / MEDCoupling / MEDCouplingDefinitionTime.hxx
1 // Copyright (C) 2007-2019  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, 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 __PARAMEDMEM_MEDCOUPLINGDEFINITIONTIME_HXX__
22 #define __PARAMEDMEM_MEDCOUPLINGDEFINITIONTIME_HXX__
23
24 #include "MEDCouplingRefCountObject.hxx"
25 #include "MCAuto.hxx"
26
27 #include "InterpKernelException.hxx"
28
29 #include <vector>
30 #include <sstream>
31
32 namespace MEDCoupling
33 {
34   class MEDCouplingFieldDouble;
35
36   class MEDCouplingDefinitionTimeSlice : public RefCountObject
37   {
38   public:
39     MEDCOUPLING_EXPORT static MEDCouplingDefinitionTimeSlice *New(const MEDCouplingFieldDouble *f, int meshId, const std::vector<int>& arrId, int fieldId);
40     MEDCOUPLING_EXPORT static MEDCouplingDefinitionTimeSlice *New(TypeOfTimeDiscretization type, const std::vector<int>& tiI, const std::vector<double>& tiD);
41     MEDCOUPLING_EXPORT int getArrayId() const { return _array_id; }
42     MEDCOUPLING_EXPORT virtual MEDCouplingDefinitionTimeSlice *copy() const = 0;
43     MEDCOUPLING_EXPORT virtual bool isEqual(const MEDCouplingDefinitionTimeSlice& other, double eps) const;
44     MEDCOUPLING_EXPORT virtual void getHotSpotsTime(std::vector<double>& ret) const = 0;
45     MEDCOUPLING_EXPORT virtual void getIdsOnTime(double tm, double eps, int& meshId, int& arrId, int& arrIdInField, int& fieldId) const = 0;
46     MEDCOUPLING_EXPORT virtual bool isContaining(double tmp, double eps) const = 0;
47     MEDCOUPLING_EXPORT virtual int getStartId() const;
48     MEDCOUPLING_EXPORT virtual int getEndId() const;
49     MEDCOUPLING_EXPORT virtual void appendRepr(std::ostream& stream) const;
50     MEDCOUPLING_EXPORT virtual double getStartTime() const = 0;
51     MEDCOUPLING_EXPORT virtual double getEndTime() const = 0;
52     MEDCOUPLING_EXPORT virtual void getTinySerializationInformation(std::vector<int>& tiI, std::vector<double>& tiD) const = 0;
53     MEDCOUPLING_EXPORT virtual TypeOfTimeDiscretization getTimeType() const = 0;
54     MEDCOUPLING_EXPORT std::size_t getHeapMemorySizeWithoutChildren() const;
55     MEDCOUPLING_EXPORT std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
56     MEDCOUPLING_EXPORT bool isFullyIncludedInMe(const MEDCouplingDefinitionTimeSlice *other, double eps) const;
57     MEDCOUPLING_EXPORT bool isOverllapingWithMe(const MEDCouplingDefinitionTimeSlice *other, double eps) const;
58     MEDCOUPLING_EXPORT bool isAfterMe(const MEDCouplingDefinitionTimeSlice *other, double eps) const;
59     MEDCOUPLING_EXPORT bool isBeforeMe(const MEDCouplingDefinitionTimeSlice *other, double eps) const;
60   protected:
61     MEDCOUPLING_EXPORT MEDCouplingDefinitionTimeSlice() { }
62     MEDCOUPLING_EXPORT MEDCouplingDefinitionTimeSlice(const MEDCouplingFieldDouble *f, int meshId, int arrId, int fieldId);
63   protected:
64     int _mesh_id;
65     int _array_id;
66     int _field_id;
67   };
68
69   class MEDCouplingDefinitionTimeSliceInst : public MEDCouplingDefinitionTimeSlice
70   {
71   public:
72     static MEDCouplingDefinitionTimeSliceInst *New(const std::vector<int>& tiI, const std::vector<double>& tiD);
73     MEDCOUPLING_EXPORT std::string getClassName() const override { return std::string("MEDCouplingDefinitionTimeSliceInst"); }
74     MEDCouplingDefinitionTimeSlice *copy() const;
75     bool isEqual(const MEDCouplingDefinitionTimeSlice& other, double eps) const;
76     void getHotSpotsTime(std::vector<double>& ret) const;
77     void getIdsOnTime(double tm, double eps, int& meshId, int& arrId, int& arrIdInField, int& fieldId) const;
78     bool isContaining(double tmp, double eps) const;
79     void appendRepr(std::ostream& stream) const;
80     double getStartTime() const;
81     double getEndTime() const;
82     void getTinySerializationInformation(std::vector<int>& tiI, std::vector<double>& tiD) const;
83     void unserialize(const std::vector<int>& tiI, const std::vector<double>& tiD);
84     TypeOfTimeDiscretization getTimeType() const;
85   public:
86     MEDCouplingDefinitionTimeSliceInst(const MEDCouplingFieldDouble *f, int meshId, int arrId, int fieldId);
87   protected:
88     MEDCouplingDefinitionTimeSliceInst() { }
89   protected:
90     double _instant;
91   };
92
93   class MEDCouplingDefinitionTimeSliceCstOnTI : public  MEDCouplingDefinitionTimeSlice
94   {
95   public:
96     static MEDCouplingDefinitionTimeSliceCstOnTI *New(const std::vector<int>& tiI, const std::vector<double>& tiD);
97     MEDCOUPLING_EXPORT std::string getClassName() const override { return std::string("MEDCouplingDefinitionTimeSliceCstOnTI"); }
98     MEDCouplingDefinitionTimeSlice *copy() const;
99     bool isEqual(const MEDCouplingDefinitionTimeSlice& other, double eps) const;
100     void getHotSpotsTime(std::vector<double>& ret) const;
101     void getIdsOnTime(double tm, double eps, int& meshId, int& arrId, int& arrIdInField, int& fieldId) const;
102     bool isContaining(double tmp, double eps) const;
103     void appendRepr(std::ostream& stream) const;
104     double getStartTime() const;
105     double getEndTime() const;
106     void getTinySerializationInformation(std::vector<int>& tiI, std::vector<double>& tiD) const;
107     void unserialize(const std::vector<int>& tiI, const std::vector<double>& tiD);
108     TypeOfTimeDiscretization getTimeType() const;
109   public:
110     MEDCouplingDefinitionTimeSliceCstOnTI(const MEDCouplingFieldDouble *f, int meshId, int arrId, int fieldId);
111   protected:
112     MEDCouplingDefinitionTimeSliceCstOnTI() { }
113   protected:
114     double _start;
115     double _end;
116   };
117
118   class MEDCouplingDefinitionTimeSliceLT : public MEDCouplingDefinitionTimeSlice
119   {
120   public:
121     static MEDCouplingDefinitionTimeSliceLT *New(const std::vector<int>& tiI, const std::vector<double>& tiD);
122     std::string getClassName() const override { return std::string("MEDCouplingDefinitionTimeSliceLT"); }
123     MEDCouplingDefinitionTimeSlice *copy() const;
124     bool isEqual(const MEDCouplingDefinitionTimeSlice& other, double eps) const;
125     void getHotSpotsTime(std::vector<double>& ret) const;
126     void getIdsOnTime(double tm, double eps, int& meshId, int& arrId, int& arrIdInField, int& fieldId) const;
127     bool isContaining(double tmp, double eps) const;
128     void appendRepr(std::ostream& stream) const;
129     double getStartTime() const;
130     double getEndTime() const;
131     int getEndId() const;
132     void getTinySerializationInformation(std::vector<int>& tiI, std::vector<double>& tiD) const;
133     void unserialize(const std::vector<int>& tiI, const std::vector<double>& tiD);
134     TypeOfTimeDiscretization getTimeType() const;
135   public:
136     MEDCouplingDefinitionTimeSliceLT(const MEDCouplingFieldDouble *f, int meshId, int arrId, int arr2Id, int fieldId);
137   protected:
138     MEDCouplingDefinitionTimeSliceLT() { }
139   protected:
140     int _array_id_end;
141     double _start;
142     double _end;
143   };
144
145   class MEDCouplingDefinitionTime
146   {
147   public:
148     MEDCOUPLING_EXPORT MEDCouplingDefinitionTime();
149     MEDCOUPLING_EXPORT MEDCouplingDefinitionTime(const std::vector<const MEDCouplingFieldDouble *>& fs, const std::vector<int>& meshRefs, const std::vector<std::vector<int> >& arrRefs);
150     MEDCOUPLING_EXPORT std::size_t getHeapMemorySizeWithoutChildren() const;
151     MEDCOUPLING_EXPORT std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
152     MEDCOUPLING_EXPORT void assign(const MEDCouplingDefinitionTime& other);
153     MEDCOUPLING_EXPORT bool isEqual(const MEDCouplingDefinitionTime& other) const;
154     MEDCOUPLING_EXPORT double getTimeResolution() const { return _eps; }
155     MEDCOUPLING_EXPORT void getIdsOnTimeRight(double tm, int& meshId, int& arrId, int& arrIdInField, int& fieldId) const;
156     MEDCOUPLING_EXPORT void getIdsOnTimeLeft(double tm, int& meshId, int& arrId, int& arrIdInField, int& fieldId) const;
157     MEDCOUPLING_EXPORT void getIdsOnTime(double tm, std::vector<int>& meshIds, std::vector<int>& arrIds, std::vector<int>& arrIdsInField, std::vector<int>& fieldIds) const;
158     MEDCOUPLING_EXPORT std::vector<double> getHotSpotsTime() const;
159     MEDCOUPLING_EXPORT void appendRepr(std::ostream& stream) const;
160   public:
161     MEDCOUPLING_EXPORT void getTinySerializationInformation(std::vector<int>& tinyInfoI, std::vector<double>& tinyInfoD) const;
162     MEDCOUPLING_EXPORT void unserialize(const std::vector<int>& tinyInfoI, const std::vector<double>& tinyInfoD);
163   private:
164     double _eps;
165     std::vector< MCAuto<MEDCouplingDefinitionTimeSlice> > _slices;
166     static const double EPS_DFT;
167   };
168 }
169
170 #endif