Salome HOME
5784c02aad43191e64648e4d3dfc78abe5c8c932
[tools/medcoupling.git] / src / MEDLoader / MEDFileField1TS.hxx
1 // Copyright (C) 2007-2020  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 (EDF R&D)
20
21 #ifndef __MEDFILEFIELD1TS_HXX__
22 #define __MEDFILEFIELD1TS_HXX__
23
24 #include "MEDLoaderDefines.hxx"
25 #include "MEDFileFieldGlobs.hxx"
26 #include "MEDFileFieldInternal.hxx"
27 #include "MEDLoaderTraits.hxx"
28
29 #include "med.h"
30
31 namespace MEDCoupling
32 {
33   class TimeHolder;
34   class MEDFileMeshes;
35   
36   /*!
37    * SDA is for Shared Data Arrays such as profiles.
38    */
39   class MEDFileAnyTypeField1TSWithoutSDA : public RefCountObject, public MEDFileFieldNameScope
40   {
41   public:
42     MEDLOADER_EXPORT MEDFileAnyTypeField1TSWithoutSDA();
43     MEDLOADER_EXPORT MEDFileAnyTypeField1TSWithoutSDA(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order);
44     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileAnyTypeField1TSWithoutSDA"); }
45     MEDLOADER_EXPORT int getIteration() const { return _iteration; }
46     MEDLOADER_EXPORT int getOrder() const { return _order; }
47     MEDLOADER_EXPORT double getTime(int& iteration, int& order) const { iteration=_iteration; order=_order; return _dt; }
48     MEDLOADER_EXPORT void setTime(int iteration, int order, double val) { _dt=val; _iteration=iteration; _order=order; }
49     MEDLOADER_EXPORT int getDimension() const;
50     MEDLOADER_EXPORT bool changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab);
51     MEDLOADER_EXPORT int getMeshIteration() const;
52     MEDLOADER_EXPORT int getMeshOrder() const;
53     MEDLOADER_EXPORT bool isDealingTS(int iteration, int order) const;
54     MEDLOADER_EXPORT std::pair<int,int> getDtIt() const;
55     MEDLOADER_EXPORT void fillIteration(std::pair<int,int>& p) const;
56     MEDLOADER_EXPORT void fillTypesOfFieldAvailable(std::vector<TypeOfField>& types) const;
57     MEDLOADER_EXPORT std::vector<TypeOfField> getTypesOfFieldAvailable() const;
58     //
59     MEDLOADER_EXPORT std::vector<std::string> getPflsReallyUsed2() const;
60     MEDLOADER_EXPORT std::vector<std::string> getLocsReallyUsed2() const;
61     MEDLOADER_EXPORT std::vector<std::string> getPflsReallyUsedMulti2() const;
62     MEDLOADER_EXPORT std::vector<std::string> getLocsReallyUsedMulti2() const;
63     MEDLOADER_EXPORT void changePflsRefsNamesGen2(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif);
64     MEDLOADER_EXPORT void changeLocsRefsNamesGen2(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif);
65     //
66     MEDLOADER_EXPORT int getNonEmptyLevels(const std::string& mname, std::vector<int>& levs) const;
67     MEDLOADER_EXPORT void convertMedBallIntoClassic();
68     MEDLOADER_EXPORT void makeReduction(INTERP_KERNEL::NormalizedCellType ct, TypeOfField tof, const DataArrayIdType *pfl);
69     MEDLOADER_EXPORT std::vector< std::vector<std::pair<mcIdType,mcIdType> > > getFieldSplitedByType(const std::string& mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const;
70     //
71     MEDLOADER_EXPORT MEDFileFieldPerMeshPerTypePerDisc *getLeafGivenMeshAndTypeAndLocId(const std::string& mName, INTERP_KERNEL::NormalizedCellType typ, int locId);
72     MEDLOADER_EXPORT const MEDFileFieldPerMeshPerTypePerDisc *getLeafGivenMeshAndTypeAndLocId(const std::string& mName, INTERP_KERNEL::NormalizedCellType typ, int locId) const;
73     MEDLOADER_EXPORT void deepCpyLeavesFrom(const MEDFileAnyTypeField1TSWithoutSDA& other);
74     MEDLOADER_EXPORT void accept(MEDFileFieldVisitor& visitor) const;
75   public:
76     MEDLOADER_EXPORT std::size_t getNumberOfComponents() const;
77     MEDLOADER_EXPORT const std::vector<std::string>& getInfo() const;
78     MEDLOADER_EXPORT std::vector<std::string>& getInfo();
79     MEDLOADER_EXPORT bool presenceOfMultiDiscPerGeoType() const;
80     MEDLOADER_EXPORT bool presenceOfStructureElements() const;
81     MEDLOADER_EXPORT bool onlyStructureElements() const;
82     MEDLOADER_EXPORT void killStructureElements();
83     MEDLOADER_EXPORT void keepOnlyStructureElements();
84     MEDLOADER_EXPORT void keepOnlyOnSE(const std::string& seName);
85     MEDLOADER_EXPORT void getMeshSENames(std::vector< std::pair<std::string,std::string> >& ps) const;
86     MEDLOADER_EXPORT void setInfo(const std::vector<std::string>& infos);
87     MEDLOADER_EXPORT std::size_t getHeapMemorySizeWithoutChildren() const;
88     MEDLOADER_EXPORT std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
89     MEDLOADER_EXPORT mcIdType copyTinyInfoFrom(const TimeHolder *th, const MEDCouplingFieldTemplate *field, const DataArray *arr);
90     MEDLOADER_EXPORT void setFieldNoProfileSBT(const TimeHolder *th, const MEDCouplingFieldTemplate *field, const DataArray *arr, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc);
91     MEDLOADER_EXPORT void setFieldProfile(const TimeHolder *th, const MEDCouplingFieldTemplate *field, const DataArray *arrOfVals, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayIdType *profile, MEDFileFieldGlobsReal& glob, const MEDFileFieldNameScope& nasc, bool smartPflKiller=true);
92     MEDLOADER_EXPORT virtual void simpleRepr(int bkOffset, std::ostream& oss, int f1tsId) const;
93     MEDLOADER_EXPORT virtual MEDFileAnyTypeField1TSWithoutSDA *deepCopy() const = 0;
94     MEDLOADER_EXPORT virtual MEDFileAnyTypeField1TSWithoutSDA *shallowCpy() const = 0;
95     MEDLOADER_EXPORT virtual std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> > splitComponents() const;
96     MEDLOADER_EXPORT virtual const char *getTypeStr() const = 0;
97     MEDLOADER_EXPORT virtual DataArray *getUndergroundDataArray() const = 0;
98     MEDLOADER_EXPORT virtual DataArray *getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const = 0;
99     MEDLOADER_EXPORT virtual void setArray(DataArray *arr) = 0;
100     MEDLOADER_EXPORT virtual DataArray *createNewEmptyDataArrayInstance() const = 0;
101     MEDLOADER_EXPORT virtual DataArray *getOrCreateAndGetArray() = 0;
102     MEDLOADER_EXPORT virtual const DataArray *getOrCreateAndGetArray() const = 0;
103   public:
104     MEDLOADER_EXPORT MEDCouplingFieldDouble *fieldOnMesh(const MEDFileFieldGlobsReal *glob, const MEDFileMesh *mesh, MCAuto<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const;
105     MEDLOADER_EXPORT MEDCouplingFieldDouble *getFieldAtLevel(TypeOfField type, int meshDimRelToMax, const std::string& mName, int renumPol, const MEDFileFieldGlobsReal *glob, MCAuto<DataArray> &arrOut, const MEDFileFieldNameScope& nasc) const;
106     MEDLOADER_EXPORT MEDCouplingFieldDouble *getFieldOnMeshAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol, const MEDFileFieldGlobsReal *glob, const MEDFileMesh *mesh, MCAuto<DataArray> &arrOut, const MEDFileFieldNameScope& nasc) const;
107     MEDLOADER_EXPORT MEDCouplingFieldDouble *getFieldAtTopLevel(TypeOfField type, const std::string& mName, int renumPol, const MEDFileFieldGlobsReal *glob, MCAuto<DataArray> &arrOut, const MEDFileFieldNameScope& nasc) const;
108     MEDLOADER_EXPORT MEDCouplingFieldDouble *getFieldOnMeshAtLevel(TypeOfField type, int renumPol, const MEDFileFieldGlobsReal *glob, const MEDCouplingMesh *mesh, const DataArrayIdType *cellRenum, const DataArrayIdType *nodeRenum, MCAuto<DataArray> &arrOut, const MEDFileFieldNameScope& nasc) const;
109     DataArray *getFieldWithProfile(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayIdType *&pfl, const MEDFileFieldGlobsReal *glob, const MEDFileFieldNameScope& nasc) const;
110   public:
111     MEDLOADER_EXPORT bool renumberEntitiesLyingOnMesh(const std::string& meshName, const std::vector<mcIdType>& oldCode, const std::vector<mcIdType>& newCode, const DataArrayIdType *renumO2N, MEDFileFieldGlobsReal& glob);
112     MEDLOADER_EXPORT std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> > splitDiscretizations() const;
113     MEDLOADER_EXPORT std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> > splitMultiDiscrPerGeoTypes() const;
114     MEDLOADER_EXPORT mcIdType keepOnlySpatialDiscretization(TypeOfField tof, std::vector< std::pair<mcIdType,mcIdType> >& its);
115     MEDLOADER_EXPORT mcIdType keepOnlyGaussDiscretization(std::size_t idOfDisc, std::vector< std::pair<mcIdType,mcIdType> >& its);
116   public:
117     MEDLOADER_EXPORT void allocNotFromFile(mcIdType newNbOfTuples);
118     MEDLOADER_EXPORT bool allocIfNecessaryTheArrayToReceiveDataFromFile();
119     MEDLOADER_EXPORT void loadOnlyStructureOfDataRecursively(med_idt fid, const MEDFileFieldNameScope& nasc, const MEDFileMeshes *ms, const MEDFileEntities *entities, const MEDFileCapability *capability = nullptr);
120     MEDLOADER_EXPORT void loadBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc);
121     MEDLOADER_EXPORT void loadBigArraysRecursivelyIfNecessary(med_idt fid, const MEDFileFieldNameScope& nasc);
122     MEDLOADER_EXPORT void loadStructureAndBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc, const MEDFileMeshes *ms, const MEDFileEntities *entities);
123     MEDLOADER_EXPORT void unloadArrays();
124     MEDLOADER_EXPORT void writeLL(med_idt fid, const MEDFileWritable& opts, const MEDFileFieldNameScope& nasc) const;
125     MEDLOADER_EXPORT static std::string FieldNameToMEDFileConvention(const std::string& nonCorrectFieldName);
126   protected:
127     int getMeshIdFromMeshName(const std::string& mName) const;
128     int addNewEntryIfNecessary(const MEDCouplingMesh *mesh);
129     void updateData(mcIdType newLgth, const std::vector< std::pair<mcIdType,mcIdType> >& oldStartStops);
130   protected:
131     std::vector< MCAuto< MEDFileFieldPerMesh > > _field_per_mesh;
132     int _iteration;
133     int _order;
134     double _dt;
135   public:
136     //! only useable on reading
137     mutable int _csit;
138     // -3 means allocated and build from scratch
139     // -2 means allocated and read from a file
140     // -1 means not allocated and build from scratch
141     // >=0 means not allocated and read from a file
142     mutable mcIdType _nb_of_tuples_to_be_allocated;
143   };
144
145   class MEDFileIntField1TSWithoutSDA;
146
147   template<class T>
148   class MEDFileField1TSTemplateWithoutSDA : public MEDFileAnyTypeField1TSWithoutSDA
149   {
150   protected:
151     MEDFileField1TSTemplateWithoutSDA(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order):MEDFileAnyTypeField1TSWithoutSDA(fieldName,meshName,csit,iteration,order) { }
152     MEDFileField1TSTemplateWithoutSDA() { }
153   public:
154     MEDLOADER_EXPORT void setArray(DataArray *arr);
155     MEDLOADER_EXPORT DataArray *createNewEmptyDataArrayInstance() const;
156     MEDLOADER_EXPORT typename Traits<T>::ArrayType *getOrCreateAndGetArrayTemplate();
157     MEDLOADER_EXPORT typename Traits<T>::ArrayType const *getOrCreateAndGetArrayTemplate() const;
158     MEDLOADER_EXPORT typename Traits<T>::ArrayType *getUndergroundDataArrayTemplate() const;
159     MEDLOADER_EXPORT typename Traits<T>::ArrayType *getUndergroundDataArrayTemplateExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const;
160     MEDLOADER_EXPORT DataArray *getOrCreateAndGetArray();
161     MEDLOADER_EXPORT const DataArray *getOrCreateAndGetArray() const;
162     MEDLOADER_EXPORT DataArray *getUndergroundDataArray() const;
163     MEDLOADER_EXPORT void aggregate(const typename std::vector< typename MLFieldTraits<T>::F1TSWSDAType const * >& f1tss, const std::vector< std::vector< std::pair<int,mcIdType> > >& dts);
164     MEDLOADER_EXPORT void copyTimeInfoFrom(const typename Traits<T>::FieldType *mcf);
165   protected:
166     MCAuto< typename Traits<T>::ArrayType > _arr;
167   };
168
169   /*!
170    * SDA is for Shared Data Arrays such as profiles.
171    */
172   class MEDFileField1TSWithoutSDA : public MEDFileField1TSTemplateWithoutSDA<double>
173   {
174   public:
175     MEDLOADER_EXPORT const char *getTypeStr() const;
176     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileField1TSWithoutSDA"); }
177     MEDLOADER_EXPORT DataArray *getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const;
178     MEDLOADER_EXPORT std::vector< std::vector<DataArrayDouble *> > getFieldSplitedByType2(const std::string& mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF, std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const;
179     MEDLOADER_EXPORT static void CheckMeshDimRel(int meshDimRelToMax);
180     MEDLOADER_EXPORT static std::vector<mcIdType> CheckSBTMesh(const MEDCouplingMesh *mesh);
181     MEDLOADER_EXPORT static MEDFileField1TSWithoutSDA *New(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order, const std::vector<std::string>& infos);
182   public:
183     MEDLOADER_EXPORT MEDFileField1TSWithoutSDA();
184     MEDLOADER_EXPORT MEDFileField1TSWithoutSDA(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order, const std::vector<std::string>& infos);
185     MEDLOADER_EXPORT MEDFileField1TSWithoutSDA *shallowCpy() const;
186     MEDLOADER_EXPORT MEDFileField1TSWithoutSDA *deepCopy() const;
187     MEDLOADER_EXPORT MEDFileIntField1TSWithoutSDA *convertToInt() const;
188   public:
189     static const char TYPE_STR[];
190   };
191
192   template<class T>
193   class MEDFileField1TSNDTemplateWithoutSDA : public MEDFileField1TSTemplateWithoutSDA<T>
194   {
195   public:
196     MEDLOADER_EXPORT MEDFileField1TSWithoutSDA *convertToDouble() const;
197   protected:
198     MEDFileField1TSNDTemplateWithoutSDA() { }
199     MEDFileField1TSNDTemplateWithoutSDA(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order, const std::vector<std::string>& infos):MEDFileField1TSTemplateWithoutSDA<T>(fieldName,meshName,csit,iteration,order) { }
200   };
201   
202   /*!
203    * SDA is for Shared Data Arrays such as profiles.
204    */
205   class MEDFileIntField1TSWithoutSDA : public MEDFileField1TSNDTemplateWithoutSDA<int>
206   {
207   public:
208     MEDLOADER_EXPORT MEDFileIntField1TSWithoutSDA();
209     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileIntField1TSWithoutSDA"); }
210     MEDLOADER_EXPORT static MEDFileIntField1TSWithoutSDA *New(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order, const std::vector<std::string>& infos);
211     MEDLOADER_EXPORT MEDFileIntField1TSWithoutSDA *deepCopy() const;
212     MEDLOADER_EXPORT MEDFileIntField1TSWithoutSDA *shallowCpy() const;
213     MEDLOADER_EXPORT const char *getTypeStr() const;
214     MEDLOADER_EXPORT DataArray *getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const;
215     MEDLOADER_EXPORT DataArrayInt *getUndergroundDataArrayIntExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const;
216   protected:
217     MEDFileIntField1TSWithoutSDA(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order, const std::vector<std::string>& infos);
218   public:
219     MEDLOADER_EXPORT static const char TYPE_STR[];
220   };
221
222   /*!
223    * SDA is for Shared Data Arrays such as profiles.
224    */
225   class MEDFileFloatField1TSWithoutSDA : public MEDFileField1TSNDTemplateWithoutSDA<float>
226   {
227   public:
228     MEDLOADER_EXPORT MEDFileFloatField1TSWithoutSDA();
229     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileFloatField1TSWithoutSDA"); }
230     MEDLOADER_EXPORT static MEDFileFloatField1TSWithoutSDA *New(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order, const std::vector<std::string>& infos);
231     MEDLOADER_EXPORT MEDFileFloatField1TSWithoutSDA *deepCopy() const;
232     MEDLOADER_EXPORT MEDFileFloatField1TSWithoutSDA *shallowCpy() const;
233     MEDLOADER_EXPORT const char *getTypeStr() const;
234     MEDLOADER_EXPORT DataArray *getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const;
235     MEDLOADER_EXPORT DataArrayFloat *getUndergroundDataArrayFloatExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const;
236   protected:
237     MEDFileFloatField1TSWithoutSDA(const std::string& fieldName, const std::string& meshName, int csit, int iteration, int order, const std::vector<std::string>& infos);
238   public:
239     MEDLOADER_EXPORT static const char TYPE_STR[];
240   };
241
242   /*!
243    * User class.
244    */
245   class MEDFileAnyTypeField1TS : public RefCountObject, public MEDFileWritableStandAlone, public MEDFileFieldGlobsReal
246   {
247   protected:
248     MEDLOADER_EXPORT MEDFileAnyTypeField1TS();
249     MEDLOADER_EXPORT MEDFileAnyTypeField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities=0);
250     MEDLOADER_EXPORT MEDFileAnyTypeField1TS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities=0);
251     MEDLOADER_EXPORT MEDFileAnyTypeField1TS(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities=0);
252     MEDLOADER_EXPORT MEDFileAnyTypeField1TS(const MEDFileAnyTypeField1TSWithoutSDA& other, bool shallowCopyOfContent);
253     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileAnyTypeField1TS"); }
254     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *BuildNewInstanceFromContent(MEDFileAnyTypeField1TSWithoutSDA *c);
255     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *BuildNewInstanceFromContent(MEDFileAnyTypeField1TSWithoutSDA *c, med_idt fid);
256     MEDLOADER_EXPORT static MEDFileAnyTypeField1TSWithoutSDA *BuildContentFrom(med_idt fid, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities);
257     MEDLOADER_EXPORT static MEDFileAnyTypeField1TSWithoutSDA *BuildContentFrom(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities);
258     MEDLOADER_EXPORT static MEDFileAnyTypeField1TSWithoutSDA *BuildContentFrom(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileMeshes *ms, const MEDFileEntities *entities);
259     MEDLOADER_EXPORT void writeLL(med_idt fid) const;
260     // direct forwarding to MEDFileAnyTypeField1TSWithoutSDA instance _content
261   public:
262     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *New(const std::string& fileName, bool loadAll=true);
263     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *New(med_idt fid, bool loadAll=true);
264     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *New(const std::string& fileName, const std::string& fieldName, bool loadAll=true);
265     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *New(med_idt fid, const std::string& fieldName, bool loadAll=true);
266     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *New(const std::string& fileName, const std::string& fieldName, int iteration, int order, bool loadAll=true);
267     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *New(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll=true);
268     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *NewAdv(const std::string& fileName, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileEntities *entities);
269     MEDLOADER_EXPORT static MEDFileAnyTypeField1TS *NewAdv(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileEntities *entities);
270     MEDLOADER_EXPORT int getDimension() const;
271     MEDLOADER_EXPORT int getIteration() const;
272     MEDLOADER_EXPORT int getOrder() const;
273     MEDLOADER_EXPORT double getTime(int& iteration, int& order) const;
274     MEDLOADER_EXPORT void setTime(int iteration, int order, double val);
275     MEDLOADER_EXPORT std::string getName() const;
276     MEDLOADER_EXPORT void setName(const std::string& name);
277     MEDLOADER_EXPORT std::string simpleRepr() const;
278     MEDLOADER_EXPORT void simpleRepr(int bkOffset, std::ostream& oss, int f1tsId) const;
279     MEDLOADER_EXPORT std::string getDtUnit() const;
280     MEDLOADER_EXPORT void setDtUnit(const std::string& dtUnit);
281     MEDLOADER_EXPORT std::string getMeshName() const;
282     MEDLOADER_EXPORT void setMeshName(const std::string& newMeshName);
283     MEDLOADER_EXPORT bool changeMeshNames(const std::vector< std::pair<std::string,std::string> >& modifTab);
284     MEDLOADER_EXPORT int getMeshIteration() const;
285     MEDLOADER_EXPORT int getMeshOrder() const;
286     MEDLOADER_EXPORT std::size_t getNumberOfComponents() const;
287     MEDLOADER_EXPORT bool isDealingTS(int iteration, int order) const;
288     MEDLOADER_EXPORT std::pair<int,int> getDtIt() const;
289     MEDLOADER_EXPORT void fillIteration(std::pair<int,int>& p) const;
290     MEDLOADER_EXPORT void fillTypesOfFieldAvailable(std::vector<TypeOfField>& types) const;
291     MEDLOADER_EXPORT void setInfo(const std::vector<std::string>& infos);
292     MEDLOADER_EXPORT const std::vector<std::string>& getInfo() const;
293     MEDLOADER_EXPORT std::vector<std::string>& getInfo();
294     MEDLOADER_EXPORT bool presenceOfMultiDiscPerGeoType() const;
295     MEDLOADER_EXPORT std::vector<TypeOfField> getTypesOfFieldAvailable() const;
296     MEDLOADER_EXPORT std::vector< std::vector<std::pair<mcIdType,mcIdType> > > getFieldSplitedByType(const std::string& mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF,
297         std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const;
298     MEDLOADER_EXPORT MEDFileFieldPerMeshPerTypePerDisc *getLeafGivenMeshAndTypeAndLocId(const std::string& mName, INTERP_KERNEL::NormalizedCellType typ, int locId);
299     MEDLOADER_EXPORT const MEDFileFieldPerMeshPerTypePerDisc *getLeafGivenMeshAndTypeAndLocId(const std::string& mName, INTERP_KERNEL::NormalizedCellType typ, int locId) const;
300     MEDLOADER_EXPORT int getNonEmptyLevels(const std::string& mname, std::vector<int>& levs) const;
301     MEDLOADER_EXPORT void convertMedBallIntoClassic();
302     MEDLOADER_EXPORT void makeReduction(INTERP_KERNEL::NormalizedCellType ct, TypeOfField tof, const DataArrayIdType *pfl);
303     MEDLOADER_EXPORT virtual MEDFileAnyTypeField1TS *extractPart(const std::map<int, MCAuto<DataArrayIdType> >& extractDef, MEDFileMesh *mm) const = 0;
304     MEDLOADER_EXPORT virtual MEDFileAnyTypeField1TS *shallowCpy() const = 0;
305   public:
306     MEDLOADER_EXPORT void loadArrays();
307     MEDLOADER_EXPORT void loadArraysIfNecessary();
308     MEDLOADER_EXPORT void unloadArrays();
309     MEDLOADER_EXPORT void unloadArraysWithoutDataLoss();
310     MEDLOADER_EXPORT std::vector< MCAuto< MEDFileAnyTypeField1TS > > splitComponents() const;
311     MEDLOADER_EXPORT std::vector< MCAuto< MEDFileAnyTypeField1TS > > splitDiscretizations() const;
312     MEDLOADER_EXPORT std::vector< MCAuto< MEDFileAnyTypeField1TS > > splitMultiDiscrPerGeoTypes() const;
313     MEDLOADER_EXPORT MEDFileAnyTypeField1TS *deepCopy() const;
314     MEDLOADER_EXPORT mcIdType copyTinyInfoFrom(const MEDCouplingFieldDouble *field, const DataArray *arr);
315     MEDLOADER_EXPORT mcIdType copyTinyInfoFrom(const TimeHolder *th, const MEDCouplingFieldTemplate *field, const DataArray *arr);
316   public:
317     //! underground method see MEDFileField1TSWithoutSDA::setProfileNameOnLeaf
318     MEDLOADER_EXPORT void setProfileNameOnLeaf(const std::string& mName, INTERP_KERNEL::NormalizedCellType typ, int locId, const std::string& newPflName, bool forceRenameOnGlob=false);
319     //! underground method see MEDFileField1TSWithoutSDA::setLocNameOnLeaf
320     MEDLOADER_EXPORT void setLocNameOnLeaf(const std::string& mName, INTERP_KERNEL::NormalizedCellType typ, int locId, const std::string& newLocName, bool forceRenameOnGlob=false);
321     MEDLOADER_EXPORT std::size_t getHeapMemorySizeWithoutChildren() const;
322     MEDLOADER_EXPORT std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
323     MEDLOADER_EXPORT std::vector<std::string> getPflsReallyUsed() const;
324     MEDLOADER_EXPORT std::vector<std::string> getLocsReallyUsed() const;
325     MEDLOADER_EXPORT std::vector<std::string> getPflsReallyUsedMulti() const;
326     MEDLOADER_EXPORT std::vector<std::string> getLocsReallyUsedMulti() const;
327     MEDLOADER_EXPORT void changePflsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif);
328     MEDLOADER_EXPORT void changeLocsRefsNamesGen(const std::vector< std::pair<std::vector<std::string>, std::string > >& mapOfModif);
329   public:
330     MEDLOADER_EXPORT static int LocateField2(med_idt fid, int fieldIdCFormat, bool checkFieldId, std::string& fieldName, med_field_type& typcha, std::vector<std::string>& infos, std::string& dtunitOut, std::string& meshName);
331     MEDLOADER_EXPORT static int LocateField(med_idt fid, const std::string& fieldName, int& posCFormat, med_field_type& typcha, std::vector<std::string>& infos, std::string& dtunitOut, std::string& meshName);
332   public:
333     MEDLOADER_EXPORT virtual med_field_type getMEDFileFieldType() const = 0;
334     MEDLOADER_EXPORT MEDFileAnyTypeField1TSWithoutSDA *contentNotNullBase();
335     MEDLOADER_EXPORT const MEDFileAnyTypeField1TSWithoutSDA *contentNotNullBase() const;
336   protected:
337     MCAuto<MEDFileAnyTypeField1TSWithoutSDA> _content;
338   };
339
340   class MEDFileIntField1TS;
341
342   template<class T>
343   class MEDFileTemplateField1TS : public MEDFileAnyTypeField1TS
344   {
345   public:
346     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New();
347     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(const std::string& fileName, bool loadAll=true);
348     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(med_idt fid, bool loadAll=true);
349     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(DataArrayByte *db) { return BuildFromMemoryChunk<typename MLFieldTraits<T>::F1TSType>(db); }
350     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(const std::string& fileName, const std::string& fieldName, bool loadAll=true);
351     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(med_idt fid, const std::string& fieldName, bool loadAll=true);
352     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(const std::string& fileName, const std::string& fieldName, int iteration, int order, bool loadAll=true);
353     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll=true);
354     MEDLOADER_EXPORT static typename MLFieldTraits<T>::F1TSType *New(const typename MLFieldTraits<T>::F1TSWSDAType& other, bool shallowCopyOfContent);
355   public:
356     MEDLOADER_EXPORT static typename Traits<T>::ArrayType *ReturnSafelyTypedDataArray(MCAuto<DataArray>& arr);
357     MEDLOADER_EXPORT typename Traits<T>::ArrayType *getFieldWithProfile(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayIdType *&pfl) const;
358     MEDLOADER_EXPORT void setArray(DataArray *arr);
359     MEDLOADER_EXPORT typename Traits<T>::ArrayType *getUndergroundDataArray() const;
360     MEDLOADER_EXPORT typename Traits<T>::ArrayType *getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<mcIdType,mcIdType> > >& entries) const;
361     MEDLOADER_EXPORT static MCAuto<typename Traits<T>::FieldType> SetDataArrayInField(MEDCouplingFieldDouble *f, MCAuto<DataArray>& arr);
362     MEDLOADER_EXPORT static MCAuto<MEDCouplingFieldDouble> ToFieldTemplateWithTime(const typename Traits<T>::FieldType *f);
363   public:
364     MEDLOADER_EXPORT void copyTimeInfoFrom(const typename Traits<T>::FieldType *mcf);
365     MEDLOADER_EXPORT typename Traits<T>::FieldType *field(const MEDFileMesh *mesh) const;
366     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldAtLevel(TypeOfField type, int meshDimRelToMax, int renumPol=0) const;
367     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldAtTopLevel(TypeOfField type, int renumPol=0) const;
368     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldOnMeshAtLevel(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, int renumPol=0) const;
369     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldOnMeshAtLevel(TypeOfField type, const MEDCouplingMesh *mesh, int renumPol=0) const;
370     MEDLOADER_EXPORT typename Traits<T>::FieldType *getFieldAtLevelOld(TypeOfField type, const std::string& mname, int meshDimRelToMax, int renumPol=0) const;
371     MEDLOADER_EXPORT void setFieldNoProfileSBT(const typename Traits<T>::FieldType *field);
372     MEDLOADER_EXPORT void setFieldProfile(const typename Traits<T>::FieldType *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayIdType *profile);
373     MEDLOADER_EXPORT void setFieldProfileFlatly(const typename Traits<T>::FieldType *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayIdType *profile);
374     MEDLOADER_EXPORT typename MLFieldTraits<T>::F1TSType *extractPartImpl(const std::map<int, MCAuto<DataArrayIdType> >& extractDef, MEDFileMesh *mm) const;
375     MEDLOADER_EXPORT MEDFileAnyTypeField1TS *extractPart(const std::map<int, MCAuto<DataArrayIdType> >& extractDef, MEDFileMesh *mm) const { return this->extractPartImpl(extractDef,mm); }
376   protected:
377     ~MEDFileTemplateField1TS() { }
378     MEDFileTemplateField1TS();
379     MEDFileTemplateField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms):MEDFileAnyTypeField1TS(fid,loadAll,ms) { }
380     MEDFileTemplateField1TS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms):MEDFileAnyTypeField1TS(fid,fieldName,loadAll,ms) { }
381     MEDFileTemplateField1TS(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileMeshes *ms):MEDFileAnyTypeField1TS(fid,fieldName,iteration,order,loadAll,ms) { }
382     MEDFileTemplateField1TS(const typename MLFieldTraits<T>::F1TSWSDAType& other, bool shallowCopyOfContent):MEDFileAnyTypeField1TS(other,shallowCopyOfContent) { }
383     const typename MLFieldTraits<T>::F1TSWSDAType *contentNotNull() const;
384     typename MLFieldTraits<T>::F1TSWSDAType *contentNotNull();
385     void setFieldProfileGeneral(const typename Traits<T>::FieldType *field, const MEDFileMesh *mesh, int meshDimRelToMax, const DataArrayIdType *profile, bool smartPflKiller);
386   };
387
388   /*!
389    * User class.
390    */
391   class MEDFileField1TS : public MEDFileTemplateField1TS<double>
392   {
393     friend class MEDFileTemplateField1TS<double>;
394   public:
395     MEDLOADER_EXPORT MEDFileIntField1TS *convertToInt(bool isDeepCpyGlobs=true) const;
396   public:
397     MEDLOADER_EXPORT MEDFileField1TS *shallowCpy() const;
398     MEDLOADER_EXPORT std::vector< std::vector<DataArrayDouble *> > getFieldSplitedByType2(const std::string& mname, std::vector<INTERP_KERNEL::NormalizedCellType>& types, std::vector< std::vector<TypeOfField> >& typesF,
399                                                                                           std::vector< std::vector<std::string> >& pfls, std::vector< std::vector<std::string> >& locs) const;
400     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileField1TS"); }
401   public:
402   private:
403     med_field_type getMEDFileFieldType() const { return MED_FLOAT64; }
404   private:
405     ~MEDFileField1TS() { }
406     MEDFileField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms);
407     MEDFileField1TS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms);
408     MEDFileField1TS(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileMeshes *ms);
409     MEDFileField1TS(const MEDFileField1TSWithoutSDA& other, bool shallowCopyOfContent);
410     MEDFileField1TS() { }
411   };
412
413   template<class T>
414   class MEDFileNDTemplateField1TS : public MEDFileTemplateField1TS<T>
415   {
416   public:
417     MEDLOADER_EXPORT MEDFileField1TS *convertToDouble(bool isDeepCpyGlobs=true) const;
418   protected:
419     ~MEDFileNDTemplateField1TS() { }
420     MEDFileNDTemplateField1TS() { }
421     MEDFileNDTemplateField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms):MEDFileTemplateField1TS<T>(fid,loadAll,ms) { }
422     MEDFileNDTemplateField1TS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms):MEDFileTemplateField1TS<T>(fid,fieldName,loadAll,ms) { }
423     MEDFileNDTemplateField1TS(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileMeshes *ms):MEDFileTemplateField1TS<T>(fid,fieldName,iteration,order,loadAll,ms) { }
424     MEDFileNDTemplateField1TS(const typename MLFieldTraits<T>::F1TSWSDAType& other, bool shallowCopyOfContent):MEDFileTemplateField1TS<T>(other,shallowCopyOfContent) { }
425   };
426
427   class MEDFileIntField1TS : public MEDFileNDTemplateField1TS<int>
428   {
429     friend class MEDFileTemplateField1TS<int>;
430   public:
431     MEDLOADER_EXPORT MEDFileIntField1TS *shallowCpy() const { return new MEDFileIntField1TS(*this); }
432     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileIntField1TS"); }
433   public:
434     MEDLOADER_EXPORT static MCAuto<MEDCouplingFieldDouble> ConvertFieldIntToFieldDouble(const MEDCouplingFieldInt *f);
435   private:
436     med_field_type getMEDFileFieldType() const { return MED_INT32; }
437   private:
438     ~MEDFileIntField1TS() { }
439     MEDFileIntField1TS() { }
440     MEDFileIntField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms):MEDFileNDTemplateField1TS<int>(fid,loadAll,ms) { }
441     MEDFileIntField1TS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms):MEDFileNDTemplateField1TS<int>(fid,fieldName,loadAll,ms) { }
442     MEDFileIntField1TS(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileMeshes *ms):MEDFileNDTemplateField1TS<int>(fid,fieldName,iteration,order,loadAll,ms) { }
443     /*!
444      * This constructor is a shallow copy constructor. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
445      * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
446      *
447      * \warning this is a shallow copy constructor
448      */
449     MEDFileIntField1TS(const MEDFileIntField1TSWithoutSDA& other, bool shallowCopyOfContent):MEDFileNDTemplateField1TS<int>(other,shallowCopyOfContent) { }
450   };
451
452   class MEDFileFloatField1TS : public MEDFileNDTemplateField1TS<float>
453   {
454     friend class MEDFileTemplateField1TS<float>;
455   private:
456     med_field_type getMEDFileFieldType() const { return MED_FLOAT32; }
457     MEDLOADER_EXPORT MEDFileFloatField1TS *shallowCpy() const { return new MEDFileFloatField1TS(*this); }
458     MEDLOADER_EXPORT std::string getClassName() const override { return std::string("MEDFileFloatField1TS"); }
459   private:
460     ~MEDFileFloatField1TS() { }
461     MEDFileFloatField1TS() { }
462     MEDFileFloatField1TS(med_idt fid, bool loadAll, const MEDFileMeshes *ms):MEDFileNDTemplateField1TS<float>(fid,loadAll,ms) { }
463     MEDFileFloatField1TS(med_idt fid, const std::string& fieldName, bool loadAll, const MEDFileMeshes *ms):MEDFileNDTemplateField1TS<float>(fid,fieldName,loadAll,ms) { }
464     MEDFileFloatField1TS(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll, const MEDFileMeshes *ms):MEDFileNDTemplateField1TS<float>(fid,fieldName,iteration,order,loadAll,ms) { }
465     /*!
466      * This constructor is a shallow copy constructor. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
467      * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
468      *
469      * \warning this is a shallow copy constructor
470      */
471     MEDFileFloatField1TS(const MEDFileFloatField1TSWithoutSDA& other, bool shallowCopyOfContent):MEDFileNDTemplateField1TS<float>(other,shallowCopyOfContent) { }
472   };
473 }
474
475 #endif