1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (EDF R&D)
21 #ifndef __MEDFILEFIELD_TXX__
22 #define __MEDFILEFIELD_TXX__
24 #include "MEDFileField.hxx"
25 #include "MEDCouplingTraits.hxx"
30 void MEDFileField1TSTemplateWithoutSDA<T>::setArray(DataArray *arr)
34 _nb_of_tuples_to_be_allocated=-1;
38 typename Traits<T>::ArrayType *arrC=dynamic_cast<typename Traits<T>::ArrayType *>(arr);
40 throw INTERP_KERNEL::Exception("MEDFileField1TSTemplateWithoutSDA::setArray : the input not null array is not of type DataArrayDouble !");
42 _nb_of_tuples_to_be_allocated=-3;
48 * Returns a pointer to the underground DataArrayTemplate<T> instance. So the
49 * caller should not decrRef() it. This method allows for a direct access to the field
50 * values. This method is quite unusable if there is more than a nodal field or a cell
51 * field on single geometric cell type.
52 * \return DataArrayTemplate<T> * - the pointer to the field values array.
55 DataArray *MEDFileField1TSTemplateWithoutSDA<T>::getOrCreateAndGetArray()
57 return getOrCreateAndGetArrayTemplate();
61 const DataArray *MEDFileField1TSTemplateWithoutSDA<T>::getOrCreateAndGetArray() const
63 return getOrCreateAndGetArrayTemplate();
67 DataArray *MEDFileField1TSTemplateWithoutSDA<T>::createNewEmptyDataArrayInstance() const
69 return Traits<T>::ArrayType::New();
73 typename Traits<T>::ArrayType const *MEDFileField1TSTemplateWithoutSDA<T>::getOrCreateAndGetArrayTemplate() const
75 typename Traits<T>::ArrayType const *ret(_arr);
78 (const_cast< MEDFileField1TSTemplateWithoutSDA<T> *>(this))->_arr=Traits<T>::ArrayType::New();
83 typename Traits<T>::ArrayType *MEDFileField1TSTemplateWithoutSDA<T>::getOrCreateAndGetArrayTemplate()
85 typename Traits<T>::ArrayType *ret(_arr);
88 _arr=Traits<T>::ArrayType::New();
93 * Returns a pointer to the underground DataArrayTemplate<T> instance. So the
94 * caller should not decrRef() it. This method allows for a direct access to the field
95 * values. This method is quite unusable if there is more than a nodal field or a cell
96 * field on single geometric cell type.
97 * \return DataArrayTemplate<T> * - the pointer to the field values array.
100 typename Traits<T>::ArrayType *MEDFileField1TSTemplateWithoutSDA<T>::getUndergroundDataArrayTemplate() const
102 typename Traits<T>::ArrayType const *ret(_arr);
104 return const_cast<typename Traits<T>::ArrayType *>(ret);
110 * Returns a pointer to the underground DataArrayDouble instance and a
111 * sequence describing parameters of a support of each part of \a this field. The
112 * caller should not decrRef() the returned DataArrayDouble. This method allows for a
113 * direct access to the field values. This method is intended for the field lying on one
115 * \param [in,out] entries - the sequence describing parameters of a support of each
116 * part of \a this field. Each item of this sequence consists of two parts. The
117 * first part describes a type of mesh entity and an id of discretization of a
118 * current field part. The second part describes a range of values [begin,end)
119 * within the returned array relating to the current field part.
120 * \return DataArrayDouble * - the pointer to the field values array.
121 * \throw If the number of underlying meshes is not equal to 1.
122 * \throw If no field values are available.
123 * \sa getUndergroundDataArrayTemplate()
126 typename Traits<T>::ArrayType *MEDFileField1TSTemplateWithoutSDA<T>::getUndergroundDataArrayTemplateExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const
128 if(this->_field_per_mesh.size()!=1)
129 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt : field lies on several meshes, this method has no sense !");
130 if(this->_field_per_mesh[0]==0)
131 throw INTERP_KERNEL::Exception("MEDFileField1TSWithoutSDA::getUndergroundDataArrayExt : no field specified !");
132 this->_field_per_mesh[0]->getUndergroundDataArrayExt(entries);
133 return getUndergroundDataArrayTemplate();
137 * Returns a pointer to the underground DataArrayDouble instance. So the
138 * caller should not decrRef() it. This method allows for a direct access to the field
139 * values. This method is quite unusable if there is more than a nodal field or a cell
140 * field on single geometric cell type.
141 * \return DataArrayDouble * - the pointer to the field values array.
144 DataArray *MEDFileField1TSTemplateWithoutSDA<T>::getUndergroundDataArray() const
146 return getUndergroundDataArrayTemplate();
150 void MEDFileField1TSTemplateWithoutSDA<T>::aggregate(const std::vector<typename MLFieldTraits<T>::F1TSWSDAType const *>& f1tss, const std::vector< std::vector< std::pair<int,int> > >& dts)
153 throw INTERP_KERNEL::Exception("MEDFileField1TSTemplateWithoutSDA::aggregate : empty vector !");
154 std::size_t sz(f1tss.size()),ii(0);
155 std::vector<const MEDFileFieldPerMesh *> pms;
156 std::vector<const DataArray *> das(sz);
157 for(typename std::vector<typename MLFieldTraits<T>::F1TSWSDAType const *>::const_iterator it=f1tss.begin();it!=f1tss.end();it++,ii++)
160 throw INTERP_KERNEL::Exception("MEDFileField1TSTemplateWithoutSDA::aggregate : presence of null pointer in input vector !");
161 if((*it)->_field_per_mesh.empty())
162 throw INTERP_KERNEL::Exception("MEDFileField1TSTemplateWithoutSDA::aggregate : no info !");
163 const typename Traits<T>::ArrayType *arr((*it)->getUndergroundDataArrayTemplate());
165 throw INTERP_KERNEL::Exception("MEDFileField1TSTemplateWithoutSDA::aggregate : presence of null array !");
167 pms.push_back((*it)->_field_per_mesh[0]);
169 typename MLFieldTraits<T>::F1TSWSDAType const *refPt(f1tss[0]);
170 setName(refPt->getName());
172 const DataArray *arr(refPt->getUndergroundDataArray());
173 int nbCompo(arr->getNumberOfComponents());
174 for(typename std::vector<typename MLFieldTraits<T>::F1TSWSDAType const *>::const_iterator it=f1tss.begin();it!=f1tss.end();it++)
176 const typename Traits<T>::ArrayType *myArr((*it)->getUndergroundDataArrayTemplate());
177 if(myArr->getNumberOfComponents()!=nbCompo)
178 throw INTERP_KERNEL::Exception("MEDFileField1TSTemplateWithoutSDA::aggregate : arrays must have same number of components !");
180 std::vector<std::pair< int, std::pair<int,int> > > extractInfo;
182 MCAuto<MEDFileFieldPerMesh> fpm(MEDFileFieldPerMesh::Aggregate(start,pms,dts,this,extractInfo));
183 _field_per_mesh.push_back(fpm);
185 double tv(f1tss[0]->getTime(iteration,order));
186 _iteration=iteration; _order=order; _dt=tv;
187 _arr=Traits<T>::ArrayType::New();
188 _arr->alloc(start,nbCompo); _arr->copyStringInfoFrom(*arr);
190 for(std::vector<std::pair< int, std::pair<int,int> > >::const_iterator it=extractInfo.begin();it!=extractInfo.end();it++)
192 const DataArray *zeArr(das[(*it).first]);
193 _arr->setContigPartOfSelectedValuesSlice(start,zeArr,(*it).second.first,(*it).second.second,1);
194 start+=(*it).second.second-(*it).second.first;
199 MEDFileTemplateField1TS<T>::MEDFileTemplateField1TS()
201 _content=new typename MLFieldTraits<T>::F1TSWSDAType;
205 * Returns a new empty instance of MEDFileField1TS.
206 * \return MEDFileField1TS * - a new instance of MEDFileField1TS. The caller
207 * is to delete this field using decrRef() as it is no more needed.
210 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New()
212 MCAuto<typename MLFieldTraits<T>::F1TSType> ret(new typename MLFieldTraits<T>::F1TSType);
213 ret->contentNotNull();
218 * Returns a new instance of MEDFileField1TS holding data of the first time step of
219 * the first field that has been read from a specified MED file.
220 * \param [in] fileName - the name of the MED file to read.
221 * \return MEDFileField1TS * - a new instance of MEDFileFieldMultiTS. The caller
222 * is to delete this field using decrRef() as it is no more needed.
223 * \throw If reading the file fails.
226 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New(const std::string& fileName, bool loadAll)
228 MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
229 return New(fid,loadAll);
233 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New(med_idt fid, bool loadAll)
235 MCAuto<typename MLFieldTraits<T>::F1TSType> ret(new typename MLFieldTraits<T>::F1TSType(fid,loadAll,0));
236 ret->contentNotNull();
241 * Returns a new instance of MEDFileField1TS holding data of the first time step of
242 * a given field that has been read from a specified MED file.
243 * \param [in] fileName - the name of the MED file to read.
244 * \param [in] fieldName - the name of the field to read.
245 * \return MEDFileField1TS * - a new instance of MEDFileFieldMultiTS. The caller
246 * is to delete this field using decrRef() as it is no more needed.
247 * \throw If reading the file fails.
248 * \throw If there is no field named \a fieldName in the file.
251 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New(const std::string& fileName, const std::string& fieldName, bool loadAll)
253 MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
254 return New(fid,fieldName,loadAll);
258 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New(med_idt fid, const std::string& fieldName, bool loadAll)
260 MCAuto<typename MLFieldTraits<T>::F1TSType> ret(new typename MLFieldTraits<T>::F1TSType(fid,fieldName,loadAll,0));
261 ret->contentNotNull();
266 * Returns a new instance of MEDFileField1TS holding data of a given time step of
267 * a given field that has been read from a specified MED file.
268 * \param [in] fileName - the name of the MED file to read.
269 * \param [in] fieldName - the name of the field to read.
270 * \param [in] iteration - the iteration number of a required time step.
271 * \param [in] order - the iteration order number of required time step.
272 * \return MEDFileField1TS * - a new instance of MEDFileFieldMultiTS. The caller
273 * is to delete this field using decrRef() as it is no more needed.
274 * \throw If reading the file fails.
275 * \throw If there is no field named \a fieldName in the file.
276 * \throw If the required time step is missing from the file.
279 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New(const std::string& fileName, const std::string& fieldName, int iteration, int order, bool loadAll)
281 MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
282 return New(fid,fieldName,iteration,order,loadAll);
286 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New(med_idt fid, const std::string& fieldName, int iteration, int order, bool loadAll)
288 MCAuto<typename MLFieldTraits<T>::F1TSType> ret(new typename MLFieldTraits<T>::F1TSType(fid,fieldName,iteration,order,loadAll,0));
289 ret->contentNotNull();
294 * Returns a new instance of MEDFileField1TS. If \a shallowCopyOfContent is true the content of \a other is shallow copied.
295 * If \a shallowCopyOfContent is false, \a other is taken to be the content of \a this.
297 * Returns a new instance of MEDFileField1TS holding either a shallow copy
298 * of a given MEDFileField1TSWithoutSDA ( \a other ) or \a other itself.
299 * \warning this is a shallow copy constructor
300 * \param [in] other - a MEDFileField1TSWithoutSDA to copy.
301 * \param [in] shallowCopyOfContent - if \c true, a shallow copy of \a other is created.
302 * \return MEDFileField1TS * - a new instance of MEDFileField1TS. The caller
303 * is to delete this field using decrRef() as it is no more needed.
306 typename MLFieldTraits<T>::F1TSType *MEDFileTemplateField1TS<T>::New(const typename MLFieldTraits<T>::F1TSWSDAType& other, bool shallowCopyOfContent)
308 MCAuto<typename MLFieldTraits<T>::F1TSType> ret(new typename MLFieldTraits<T>::F1TSType(other,shallowCopyOfContent));
309 ret->contentNotNull();
314 const typename MLFieldTraits<T>::F1TSWSDAType *MEDFileTemplateField1TS<T>::contentNotNull() const
316 const MEDFileAnyTypeField1TSWithoutSDA *pt(_content);
318 throw INTERP_KERNEL::Exception("MEDFileTemplateField1TS<T>::contentNotNull : the content pointer is null !");
319 const typename MLFieldTraits<T>::F1TSWSDAType *ret(dynamic_cast<const typename MLFieldTraits<T>::F1TSWSDAType *>(pt));
322 std::ostringstream oss; oss << "MEDFileTemplateField1TS<T>::contentNotNull : the content pointer is not null but it is not of type double ! Reason is maybe that the read field has not the type " << MLFieldTraits<T>::F1TSWSDAType::TYPE_STR;
323 throw INTERP_KERNEL::Exception(oss.str());
329 typename MLFieldTraits<T>::F1TSWSDAType *MEDFileTemplateField1TS<T>::contentNotNull()
331 MEDFileAnyTypeField1TSWithoutSDA *pt(_content);
333 throw INTERP_KERNEL::Exception("MEDFileTemplateField1TS<T>::contentNotNull : the non const content pointer is null !");
334 typename MLFieldTraits<T>::F1TSWSDAType *ret(dynamic_cast<typename MLFieldTraits<T>::F1TSWSDAType *>(pt));
337 std::ostringstream oss; oss << "MEDFileTemplateField1TS<T>::contentNotNull : the non const content pointer is not null but it is not of type double ! Reason is maybe that the read field has not the type " << MLFieldTraits<T>::F1TSWSDAType::TYPE_STR;
338 throw INTERP_KERNEL::Exception(oss.str());
344 typename Traits<T>::ArrayType *MEDFileTemplateField1TS<T>::ReturnSafelyTypedDataArray(MCAuto<DataArray>& arr)
347 throw INTERP_KERNEL::Exception("MEDFileField1TS::ReturnSafelyTypedDataArray : no array !");
348 typename Traits<T>::ArrayType *arrOutC(dynamic_cast<typename Traits<T>::ArrayType *>((DataArray*)arr));
350 throw INTERP_KERNEL::Exception("MEDFileField1TS::ReturnSafelyTypedDataArray : mismatch between dataArrays type and MEDFileField1TS ! Expected double !");
356 * Returns values and a profile of the field of a given type lying on a given support.
357 * For more info, see \ref AdvMEDLoaderAPIFieldRW
358 * \param [in] type - a spatial discretization of the field.
359 * \param [in] meshDimRelToMax - a relative dimension of the supporting mesh entities.
360 * \param [in] mesh - the supporting mesh.
361 * \param [out] pfl - a new instance of DataArrayInt holding ids of mesh entities the
362 * field of interest lies on. If the field lies on all entities of the given
363 * dimension, all ids in \a pfl are zero. The caller is to delete this array
364 * using decrRef() as it is no more needed.
365 * \return DataArrayInt * - a new instance of DataArrayInt holding values of the
366 * field. The caller is to delete this array using decrRef() as it is no more needed.
367 * \throw If there are no mesh entities of \a meshDimRelToMax dimension in \a mesh.
368 * \throw If no field of \a this is lying on \a mesh.
369 * \throw If no field values of the given \a type or given \a meshDimRelToMax are available.
372 typename Traits<T>::ArrayType *MEDFileTemplateField1TS<T>::getFieldWithProfile(TypeOfField type, int meshDimRelToMax, const MEDFileMesh *mesh, DataArrayInt *&pfl) const
374 MCAuto<DataArray> arr(contentNotNull()->getFieldWithProfile(type,meshDimRelToMax,mesh,pfl,this,*contentNotNull()));
375 return ReturnSafelyTypedDataArray(arr);
379 typename Traits<T>::ArrayType *MEDFileTemplateField1TS<T>::getUndergroundDataArray() const
381 return contentNotNull()->getUndergroundDataArrayTemplate();
385 typename Traits<T>::ArrayType *MEDFileTemplateField1TS<T>::getUndergroundDataArrayExt(std::vector< std::pair<std::pair<INTERP_KERNEL::NormalizedCellType,int>,std::pair<int,int> > >& entries) const
387 return contentNotNull()->getUndergroundDataArrayTemplateExt(entries);