X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling%2FMEDCouplingFieldDouble.cxx;h=a60ff309f35fbb35f891e229c4f1a3de57fc2a45;hb=2ae2dc6fcedbf241c7637284b3c7bde12aded04a;hp=3fef0349a7904199a877d96b4e33c9b96ec2c7c1;hpb=bd4f33e4cfd6d33555eeb1ebe6680a168c122246;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingFieldDouble.cxx b/src/MEDCoupling/MEDCouplingFieldDouble.cxx old mode 100644 new mode 100755 index 3fef0349a..a60ff309f --- a/src/MEDCoupling/MEDCouplingFieldDouble.cxx +++ b/src/MEDCoupling/MEDCouplingFieldDouble.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -16,18 +16,20 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// Author : Anthony Geay (CEA/DEN) +// Author : Anthony Geay (EDF R&D) #include "MEDCouplingFieldDouble.hxx" #include "MEDCouplingFieldTemplate.hxx" #include "MEDCouplingFieldT.txx" -#include "MEDCouplingFieldInt.hxx" +#include "MEDCouplingFieldInt32.hxx" +#include "MEDCouplingFieldFloat.hxx" #include "MEDCouplingUMesh.hxx" #include "MEDCouplingTimeDiscretization.hxx" #include "MEDCouplingFieldDiscretization.hxx" #include "MCAuto.txx" #include "MEDCouplingVoronoi.hxx" #include "MEDCouplingNatureOfField.hxx" +#include "MEDCouplingMemArray.txx" #include "InterpKernelAutoPtr.hxx" #include "InterpKernelGaussCoords.hxx" @@ -163,7 +165,7 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::deepCopy() const * \ref MEDCoupling::ONE_TIME "ONE_TIME", * \ref MEDCoupling::LINEAR_TIME "LINEAR_TIME", * \ref MEDCoupling::CONST_ON_TIME_INTERVAL "CONST_ON_TIME_INTERVAL"). - * \param [in] deepCopy - if \c true, the copy of the underlying data arrays is + * \param [in] deepCpy - if \c true, the copy of the underlying data arrays is * deep, else all data arrays of \a this field are shared by the new field. * \return MEDCouplingFieldDouble* - a new instance of MEDCouplingFieldDouble. The * caller is to delete this field using decrRef() as it is no more needed. @@ -174,9 +176,9 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::deepCopy() const * \endif * \sa clone() */ -MEDCouplingFieldDouble *MEDCouplingFieldDouble::buildNewTimeReprFromThis(TypeOfTimeDiscretization td, bool deepCopy) const +MEDCouplingFieldDouble *MEDCouplingFieldDouble::buildNewTimeReprFromThis(TypeOfTimeDiscretization td, bool deepCpy) const { - MEDCouplingTimeDiscretization *tdo=timeDiscr()->buildNewTimeReprFromThis(td,deepCopy); + MEDCouplingTimeDiscretization *tdo=timeDiscr()->buildNewTimeReprFromThis(td,deepCpy); MCAuto disc; if(_type) disc=_type->clone(); @@ -188,8 +190,8 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::buildNewTimeReprFromThis(TypeOfT } /*! - * This method converts a field on nodes (\a this) to a cell field (returned field). The convertion is a \b non \b conservative remapping ! - * This method is useful only for users that need a fast convertion from node to cell spatial discretization. The algorithm applied is simply to attach + * This method converts a field on nodes (\a this) to a cell field (returned field). The conversion is a \b non \b conservative remapping ! + * This method is useful only for users that need a fast conversion from node to cell spatial discretization. The algorithm applied is simply to attach * to each cell the average of values on nodes constituting this cell. * * \return MEDCouplingFieldDouble* - a new instance of MEDCouplingFieldDouble. The @@ -210,28 +212,28 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::nodeToCellDiscretization() const MCAuto nsp(new MEDCouplingFieldDiscretizationP0); ret->setDiscretization(nsp); const MEDCouplingMesh *m(getMesh());//m is non empty thanks to checkConsistencyLight call - int nbCells(m->getNumberOfCells()); + mcIdType nbCells=ToIdType(m->getNumberOfCells()); std::vector arrs(getArrays()); std::size_t sz(arrs.size()); std::vector< MCAuto > outArrsSafe(sz); std::vector outArrs(sz); for(std::size_t j=0;jgetNumberOfComponents()); + std::size_t nbCompo(arrs[j]->getNumberOfComponents()); outArrsSafe[j]=DataArrayDouble::New(); outArrsSafe[j]->alloc(nbCells,nbCompo); outArrsSafe[j]->copyStringInfoFrom(*arrs[j]); outArrs[j]=outArrsSafe[j]; double *pt(outArrsSafe[j]->getPointer()); const double *srcPt(arrs[j]->begin()); - for(int i=0;i nodeIds; + std::vector nodeIds; m->getNodeIdsOfCell(i,nodeIds); std::fill(pt,pt+nbCompo,0.); std::size_t nbNodesInCell(nodeIds.size()); for(std::size_t k=0;k()); if(nbNodesInCell!=0) - std::transform(pt,pt+nbCompo,pt,std::bind2nd(std::multiplies(),1./((double)nbNodesInCell))); + std::transform(pt,pt+nbCompo,pt,std::bind(std::multiplies(),std::placeholders::_1,1./((double)nbNodesInCell))); else { std::ostringstream oss; oss << "MEDCouplingFieldDouble::nodeToCellDiscretization : Cell id #" << i << " has been detected to have no nodes !"; @@ -244,8 +246,8 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::nodeToCellDiscretization() const } /*! - * This method converts a field on cell (\a this) to a node field (returned field). The convertion is a \b non \b conservative remapping ! - * This method is useful only for users that need a fast convertion from cell to node spatial discretization. The algorithm applied is simply to attach + * This method converts a field on cell (\a this) to a node field (returned field). The conversion is a \b non \b conservative remapping ! + * This method is useful only for users that need a fast conversion from cell to node spatial discretization. The algorithm applied is simply to attach * to each node the average of values on cell sharing this node. If \a this lies on a mesh having orphan nodes the values applied on them will be NaN (division by 0.). * * \return MEDCouplingFieldDouble* - a new instance of MEDCouplingFieldDouble. The @@ -266,9 +268,9 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::cellToNodeDiscretization() const MCAuto nsp(new MEDCouplingFieldDiscretizationP1); ret->setDiscretization(nsp); const MEDCouplingMesh *m(getMesh());//m is non empty thanks to checkConsistencyLight call - MCAuto rn(DataArrayInt::New()),rni(DataArrayInt::New()); + MCAuto rn(DataArrayIdType::New()),rni(DataArrayIdType::New()); m->getReverseNodalConnectivity(rn,rni); - MCAuto rni2(rni->deltaShiftIndex()); + MCAuto rni2(rni->deltaShiftIndex()); MCAuto rni3(rni2->convertToDblArr()); rni2=0; std::vector arrs(getArrays()); std::size_t sz(arrs.size()); @@ -367,76 +369,6 @@ bool MEDCouplingFieldDouble::areCompatibleForMeld(const MEDCouplingFieldDouble * return true; } -/*! - * Permutes values of \a this field according to a given permutation array for cells - * renumbering. The underlying mesh is deeply copied and its cells are also permuted. - * The number of cells remains the same; for that the permutation array \a old2NewBg - * should not contain equal ids. - * ** Warning, this method modifies the mesh aggreagated by \a this (by performing a deep copy ) **. - * - * \param [in] old2NewBg - the permutation array in "Old to New" mode. Its length is - * to be equal to \a this->getMesh()->getNumberOfCells(). - * \param [in] check - if \c true, \a old2NewBg is transformed to a new permutation - * array, so that its maximal cell id to correspond to (be less than) the number - * of cells in mesh. This new array is then used for the renumbering. If \a - * check == \c false, \a old2NewBg is used as is, that is less secure as validity - * of ids in \a old2NewBg is not checked. - * \throw If the mesh is not set. - * \throw If the spatial discretization of \a this field is NULL. - * \throw If \a check == \c true and \a old2NewBg contains equal ids. - * \throw If mesh nature does not allow renumbering (e.g. structured mesh). - * - * \if ENABLE_EXAMPLES - * \ref cpp_mcfielddouble_renumberCells "Here is a C++ example".
- * \ref py_mcfielddouble_renumberCells "Here is a Python example". - * \endif - */ -void MEDCouplingFieldDouble::renumberCells(const int *old2NewBg, bool check) -{ - renumberCellsWithoutMesh(old2NewBg,check); - MCAuto m=_mesh->deepCopy(); - m->renumberCells(old2NewBg,check); - setMesh(m); - updateTime(); -} - -/*! - * Permutes values of \a this field according to a given permutation array for cells - * renumbering. The underlying mesh is \b not permuted. - * The number of cells remains the same; for that the permutation array \a old2NewBg - * should not contain equal ids. - * This method performs a part of job of renumberCells(). The reasonable use of this - * method is only for multi-field instances lying on the same mesh to avoid a - * systematic duplication and renumbering of _mesh attribute. - * \warning Use this method with a lot of care! - * \param [in] old2NewBg - the permutation array in "Old to New" mode. Its length is - * to be equal to \a this->getMesh()->getNumberOfCells(). - * \param [in] check - if \c true, \a old2NewBg is transformed to a new permutation - * array, so that its maximal cell id to correspond to (be less than) the number - * of cells in mesh. This new array is then used for the renumbering. If \a - * check == \c false, \a old2NewBg is used as is, that is less secure as validity - * of ids in \a old2NewBg is not checked. - * \throw If the mesh is not set. - * \throw If the spatial discretization of \a this field is NULL. - * \throw If \a check == \c true and \a old2NewBg contains equal ids. - * \throw If mesh nature does not allow renumbering (e.g. structured mesh). - */ -void MEDCouplingFieldDouble::renumberCellsWithoutMesh(const int *old2NewBg, bool check) -{ - if(!_mesh) - throw INTERP_KERNEL::Exception("Expecting a defined mesh to be able to operate a renumbering !"); - if(_type.isNull()) - throw INTERP_KERNEL::Exception("Expecting a spatial discretization to be able to operate a renumbering !"); - // - _type->renumberCells(old2NewBg,check); - std::vector arrays; - timeDiscr()->getArrays(arrays); - std::vector arrays2(arrays.size()); std::copy(arrays.begin(),arrays.end(),arrays2.begin()); - _type->renumberArraysForCell(_mesh,arrays2,old2NewBg,check); - // - updateTime(); -} - /*! * Permutes values of \a this field according to a given permutation array for node * renumbering. The underlying mesh is deeply copied and its nodes are also permuted. @@ -449,21 +381,21 @@ void MEDCouplingFieldDouble::renumberCellsWithoutMesh(const int *old2NewBg, bool * \throw If the spatial discretization of \a this field is NULL. * \throw If \a check == \c true and \a old2NewBg contains equal ids. * \throw If mesh nature does not allow renumbering (e.g. structured mesh). - * \throw If values at merged nodes deffer more than \a eps. + * \throw If values at merged nodes differ more than \a eps. * * \if ENABLE_EXAMPLES * \ref cpp_mcfielddouble_renumberNodes "Here is a C++ example".
* \ref py_mcfielddouble_renumberNodes "Here is a Python example". * \endif */ -void MEDCouplingFieldDouble::renumberNodes(const int *old2NewBg, double eps) +void MEDCouplingFieldDouble::renumberNodes(const mcIdType *old2NewBg, double eps) { const MEDCouplingPointSet *meshC=dynamic_cast(_mesh); if(!meshC) throw INTERP_KERNEL::Exception("Invalid mesh to apply renumberNodes on it !"); - int nbOfNodes=meshC->getNumberOfNodes(); + mcIdType nbOfNodes=meshC->getNumberOfNodes(); MCAuto meshC2((MEDCouplingPointSet *)meshC->deepCopy()); - int newNbOfNodes=*std::max_element(old2NewBg,old2NewBg+nbOfNodes)+1; + mcIdType newNbOfNodes=*std::max_element(old2NewBg,old2NewBg+nbOfNodes)+1; renumberNodesWithoutMesh(old2NewBg,newNbOfNodes,eps); meshC2->renumberNodes(old2NewBg,newNbOfNodes); setMesh(meshC2); @@ -489,9 +421,9 @@ void MEDCouplingFieldDouble::renumberNodes(const int *old2NewBg, double eps) * the values differ more than \a eps, an exception is thrown. * \throw If the mesh is not set. * \throw If the spatial discretization of \a this field is NULL. - * \throw If values at merged nodes deffer more than \a eps. + * \throw If values at merged nodes differ more than \a eps. */ -void MEDCouplingFieldDouble::renumberNodesWithoutMesh(const int *old2NewBg, int newNbOfNodes, double eps) +void MEDCouplingFieldDouble::renumberNodesWithoutMesh(const mcIdType *old2NewBg, mcIdType newNbOfNodes, double eps) { if(_type.isNull()) throw INTERP_KERNEL::Exception("Expecting a spatial discretization to be able to operate a renumbering !"); @@ -509,175 +441,43 @@ void MEDCouplingFieldDouble::renumberNodesWithoutMesh(const int *old2NewBg, int * vmin are not included in the result array. * \param [in] vmax - an upper boundary of the range. Tuples with values more than \a * vmax are not included in the result array. - * \return DataArrayInt * - a new instance of DataArrayInt holding ids of selected + * \return DataArrayIdType * - a new instance of DataArrayIdType holding ids of selected * tuples. The caller is to delete this array using decrRef() as it is no * more needed. * \throw If the data array is not set. * \throw If \a this->getNumberOfComponents() != 1. */ -DataArrayInt *MEDCouplingFieldDouble::findIdsInRange(double vmin, double vmax) const +DataArrayIdType *MEDCouplingFieldDouble::findIdsInRange(double vmin, double vmax) const { if(getArray()==0) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::findIdsInRange : no default array set !"); return getArray()->findIdsInRange(vmin,vmax); } -/*! - * Builds a newly created field, that the caller will have the responsability to deal with (decrRef()). - * This method makes the assumption that the field is correctly defined when this method is called, no check of this will be done. - * This method returns a restriction of \a this so that only tuples with ids specified in \a part will be contained in the returned field. - * Parameter \a part specifies **cell ids whatever the spatial discretization of this** ( - * \ref MEDCoupling::ON_CELLS "ON_CELLS", - * \ref MEDCoupling::ON_NODES "ON_NODES", - * \ref MEDCoupling::ON_GAUSS_PT "ON_GAUSS_PT", - * \ref MEDCoupling::ON_GAUSS_NE "ON_GAUSS_NE", - * \ref MEDCoupling::ON_NODES_KR "ON_NODES_KR"). - * - * For example, \a this is a field on cells lying on a mesh that have 10 cells, \a part contains following cell ids [3,7,6]. - * Then the returned field will lie on mesh having 3 cells and the returned field will contain 3 tuples.
- * Tuple #0 of the result field will refer to the cell #0 of returned mesh. The cell #0 of returned mesh will be equal to the cell #3 of \a this->getMesh().
- * Tuple #1 of the result field will refer to the cell #1 of returned mesh. The cell #1 of returned mesh will be equal to the cell #7 of \a this->getMesh().
- * Tuple #2 of the result field will refer to the cell #2 of returned mesh. The cell #2 of returned mesh will be equal to the cell #6 of \a this->getMesh(). - * - * Let, for example, \a this be a field on nodes lying on a mesh that have 10 cells and 11 nodes, and \a part contains following cellIds [3,7,6]. - * Thus \a this currently contains 11 tuples. If the restriction of mesh to 3 cells leads to a mesh with 6 nodes, then the returned field - * will contain 6 tuples and \a this field will lie on this restricted mesh. - * - * \param [in] part - an array of cell ids to include to the result field. - * \return MEDCouplingFieldDouble * - a new instance of MEDCouplingFieldDouble. The caller is to delete this field using decrRef() as it is no more needed. - * - * \if ENABLE_EXAMPLES - * \ref cpp_mcfielddouble_subpart1 "Here is a C++ example".
- * \ref py_mcfielddouble_subpart1 "Here is a Python example". - * \endif - * \sa MEDCouplingFieldDouble::buildSubPartRange - */ - -MEDCouplingFieldDouble *MEDCouplingFieldDouble::buildSubPart(const DataArrayInt *part) const -{ - if(part==0) - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::buildSubPart : not empty array must be passed to this method !"); - return buildSubPart(part->begin(),part->end()); -} - -/*! - * Builds a newly created field, that the caller will have the responsability to deal with. - * \n This method makes the assumption that \a this field is correctly defined when this method is called (\a this->checkConsistencyLight() returns without any exception thrown), **no check of this will be done**. - * \n This method returns a restriction of \a this so that only tuple ids specified in [ \a partBg , \a partEnd ) will be contained in the returned field. - * \n Parameter [\a partBg, \a partEnd ) specifies **cell ids whatever the spatial discretization** of \a this ( - * \ref MEDCoupling::ON_CELLS "ON_CELLS", - * \ref MEDCoupling::ON_NODES "ON_NODES", - * \ref MEDCoupling::ON_GAUSS_PT "ON_GAUSS_PT", - * \ref MEDCoupling::ON_GAUSS_NE "ON_GAUSS_NE", - * \ref MEDCoupling::ON_NODES_KR "ON_NODES_KR"). - * - * For example, \a this is a field on cells lying on a mesh that have 10 cells, \a partBg contains the following cell ids [3,7,6]. - * Then the returned field will lie on mesh having 3 cells and will contain 3 tuples. - *- Tuple #0 of the result field will refer to the cell #0 of returned mesh. The cell #0 of returned mesh will be equal to the cell #3 of \a this->getMesh(). - *- Tuple #1 of the result field will refer to the cell #1 of returned mesh. The cell #1 of returned mesh will be equal to the cell #7 of \a this->getMesh(). - *- Tuple #2 of the result field will refer to the cell #2 of returned mesh. The cell #2 of returned mesh will be equal to the cell #6 of \a this->getMesh(). - * - * Let, for example, \a this be a field on nodes lying on a mesh that have 10 cells and 11 nodes, and \a partBg contains following cellIds [3,7,6]. - * Thus \a this currently contains 11 tuples. If the restriction of mesh to 3 cells leads to a mesh with 6 nodes, then the returned field - * will contain 6 tuples and \a this field will lie on this restricted mesh. - * - * \param [in] partBg - start (included) of input range of cell ids to select [ \a partBg, \a partEnd ) - * \param [in] partEnd - end (not included) of input range of cell ids to select [ \a partBg, \a partEnd ) - * \return a newly allocated field the caller should deal with. - * - * \throw if there is presence of an invalid cell id in [ \a partBg, \a partEnd ) regarding the number of cells of \a this->getMesh(). - * - * \if ENABLE_EXAMPLES - * \ref cpp_mcfielddouble_subpart1 "Here a C++ example."
- * \ref py_mcfielddouble_subpart1 "Here a Python example." - * \endif - * \sa MEDCoupling::MEDCouplingFieldDouble::buildSubPart(const DataArrayInt *) const, MEDCouplingFieldDouble::buildSubPartRange - */ -MEDCouplingFieldDouble *MEDCouplingFieldDouble::buildSubPart(const int *partBg, const int *partEnd) const +template +typename Traits::FieldType *ConvertToUField(const MEDCouplingFieldDouble *self) { - if(_type.isNull()) - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::buildSubPart : Expecting a not NULL spatial discretization !"); - DataArrayInt *arrSelect; - MCAuto m=_type->buildSubMeshData(_mesh,partBg,partEnd,arrSelect); - MCAuto arrSelect2(arrSelect); - MCAuto ret(clone(false));//quick shallow copy. - const MEDCouplingFieldDiscretization *disc=getDiscretization(); - if(disc) - ret->setDiscretization(MCAuto(disc->clonePart(partBg,partEnd))); - ret->setMesh(m); - std::vector arrays; - timeDiscr()->getArrays(arrays); - std::vector arrs; - std::vector< MCAuto > arrsSafe; - const int *arrSelBg=arrSelect->begin(); - const int *arrSelEnd=arrSelect->end(); - for(std::vector::const_iterator iter=arrays.begin();iter!=arrays.end();iter++) + MCAuto tmp(MEDCouplingFieldTemplate::New(*self)); + int t1,t2; + double t0(self->getTime(t1,t2)); + MCAuto::FieldType > ret(Traits::FieldType::New(*tmp,self->getTimeDiscretization())); + ret->setTime(t0,t1,t2); + if(self->getArray()) { - DataArrayDouble *arr=0; - if(*iter) - arr=(*iter)->selectByTupleIdSafe(arrSelBg,arrSelEnd); - arrs.push_back(arr); arrsSafe.push_back(arr); + MCAuto::ArrayType> arr(self->getArray()->convertToOtherTypeOfArr()); + ret->setArray(arr); } - ret->timeDiscr()->setArrays(arrs,0); return ret.retn(); } -/*! - * This method is equivalent to MEDCouplingFieldDouble::buildSubPart, the only difference is that the input range of cell ids is - * given using a range given \a begin, \a end and \a step to optimize the part computation. - * - * \sa MEDCouplingFieldDouble::buildSubPart - */ -MEDCouplingFieldDouble *MEDCouplingFieldDouble::buildSubPartRange(int begin, int end, int step) const +MEDCouplingFieldInt32 *MEDCouplingFieldDouble::convertToIntField() const { - if(_type.isNull()) - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::buildSubPart : Expecting a not NULL spatial discretization !"); - DataArrayInt *arrSelect; - int beginOut,endOut,stepOut; - MCAuto m(_type->buildSubMeshDataRange(_mesh,begin,end,step,beginOut,endOut,stepOut,arrSelect)); - MCAuto arrSelect2(arrSelect); - MCAuto ret(clone(false));//quick shallow copy. - const MEDCouplingFieldDiscretization *disc=getDiscretization(); - if(disc) - ret->setDiscretization(MCAuto(disc->clonePartRange(begin,end,step))); - ret->setMesh(m); - std::vector arrays; - timeDiscr()->getArrays(arrays); - std::vector arrs; - std::vector< MCAuto > arrsSafe; - for(std::vector::const_iterator iter=arrays.begin();iter!=arrays.end();iter++) - { - DataArrayDouble *arr=0; - if(*iter) - { - if(arrSelect) - { - const int *arrSelBg=arrSelect->begin(); - const int *arrSelEnd=arrSelect->end(); - arr=(*iter)->selectByTupleIdSafe(arrSelBg,arrSelEnd); - } - else - arr=(*iter)->selectByTupleIdSafeSlice(beginOut,endOut,stepOut); - } - arrs.push_back(arr); arrsSafe.push_back(arr); - } - ret->timeDiscr()->setArrays(arrs,0); - return ret.retn(); + return ConvertToUField(this); } -MEDCouplingFieldInt *MEDCouplingFieldDouble::convertToIntField() const +MEDCouplingFieldFloat *MEDCouplingFieldDouble::convertToFloatField() const { - MCAuto tmp(MEDCouplingFieldTemplate::New(*this)); - int t1,t2; - double t0(getTime(t1,t2)); - MCAuto ret(MEDCouplingFieldInt::New(*tmp,getTimeDiscretization())); - ret->setTime(t0,t1,t2); - if(getArray()) - { - MCAuto arr(getArray()->convertToIntArr()); - ret->setArray(arr); - } - return ret.retn(); + return ConvertToUField(this); } MEDCouplingFieldDouble::MEDCouplingFieldDouble(TypeOfField type, TypeOfTimeDiscretization td):MEDCouplingFieldT(type,MEDCouplingTimeDiscretization::New(td)) @@ -691,7 +491,7 @@ MEDCouplingFieldDouble::MEDCouplingFieldDouble(const MEDCouplingFieldTemplate& f { } -MEDCouplingFieldDouble::MEDCouplingFieldDouble(const MEDCouplingFieldDouble& other, bool deepCopy):MEDCouplingFieldT(other,deepCopy) +MEDCouplingFieldDouble::MEDCouplingFieldDouble(const MEDCouplingFieldDouble& other, bool deepCpy):MEDCouplingFieldT(other,deepCpy) { } @@ -747,7 +547,7 @@ double MEDCouplingFieldDouble::getMaxValue() const if(*iter) { isExistingArr=true; - int loc; + mcIdType loc; ret=std::max(ret,(*iter)->getMaxValue(loc)); } } @@ -759,30 +559,30 @@ double MEDCouplingFieldDouble::getMaxValue() const /*! * Returns the maximal value and all its locations within \a this scalar field. * Only the first of available data arrays is checked. - * \param [out] tupleIds - a new instance of DataArrayInt containg indices of + * \param [out] tupleIds - a new instance of DataArrayIdType containing indices of * tuples holding the maximal value. The caller is to delete it using * decrRef() as it is no more needed. * \return double - the maximal value among all values of the first array of \a this filed. * \throw If \a this->getNumberOfComponents() != 1. * \throw If there is an empty data array in \a this field. */ -double MEDCouplingFieldDouble::getMaxValue2(DataArrayInt*& tupleIds) const +double MEDCouplingFieldDouble::getMaxValue2(DataArrayIdType*& tupleIds) const { std::vector arrays; timeDiscr()->getArrays(arrays); double ret(-std::numeric_limits::max()); bool isExistingArr=false; tupleIds=0; - MCAuto ret1; + MCAuto ret1; for(std::vector::const_iterator iter=arrays.begin();iter!=arrays.end();iter++) { if(*iter) { isExistingArr=true; - DataArrayInt *tmp; + DataArrayIdType *tmp; ret=std::max(ret,(*iter)->getMaxValue2(tmp)); - MCAuto tmpSafe(tmp); - if(!((const DataArrayInt *)ret1)) + MCAuto tmpSafe(tmp); + if(!((const DataArrayIdType *)ret1)) ret1=tmpSafe; } } @@ -811,7 +611,7 @@ double MEDCouplingFieldDouble::getMinValue() const if(*iter) { isExistingArr=true; - int loc; + mcIdType loc; ret=std::min(ret,(*iter)->getMinValue(loc)); } } @@ -823,30 +623,30 @@ double MEDCouplingFieldDouble::getMinValue() const /*! * Returns the minimal value and all its locations within \a this scalar field. * Only the first of available data arrays is checked. - * \param [out] tupleIds - a new instance of DataArrayInt containg indices of + * \param [out] tupleIds - a new instance of DataArrayIdType containing indices of * tuples holding the minimal value. The caller is to delete it using * decrRef() as it is no more needed. * \return double - the minimal value among all values of the first array of \a this filed. * \throw If \a this->getNumberOfComponents() != 1. * \throw If there is an empty data array in \a this field. */ -double MEDCouplingFieldDouble::getMinValue2(DataArrayInt*& tupleIds) const +double MEDCouplingFieldDouble::getMinValue2(DataArrayIdType*& tupleIds) const { std::vector arrays; timeDiscr()->getArrays(arrays); double ret(-std::numeric_limits::max()); bool isExistingArr=false; tupleIds=0; - MCAuto ret1; + MCAuto ret1; for(std::vector::const_iterator iter=arrays.begin();iter!=arrays.end();iter++) { if(*iter) { isExistingArr=true; - DataArrayInt *tmp; + DataArrayIdType *tmp; ret=std::max(ret,(*iter)->getMinValue2(tmp)); - MCAuto tmpSafe(tmp); - if(!((const DataArrayInt *)ret1)) + MCAuto tmpSafe(tmp); + if(!((const DataArrayIdType *)ret1)) ret1=tmpSafe; } } @@ -883,19 +683,6 @@ double MEDCouplingFieldDouble::norm2() const return getArray()->norm2(); } -/*! - * This method returns the max norm of \a this field. - * \f[ - * \max_{0 \leq i < nbOfEntity}{abs(val[i])} - * \f] - * \throw If the data array is not set. - */ -double MEDCouplingFieldDouble::normMax() const -{ - if(getArray()==0) - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::normMax : no default array defined !"); - return getArray()->normMax(); -} /*! * Computes the weighted average of values of each component of \a this field, the weights being the @@ -914,12 +701,12 @@ void MEDCouplingFieldDouble::getWeightedAverageValue(double *res, bool isWAbs) c if(getArray()==0) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::getWeightedAverageValue : no default array defined !"); MCAuto w=buildMeasureField(isWAbs); - double deno=w->getArray()->accumulate(0); + double deno=w->getArray()->accumulate((std::size_t)0); MCAuto arr=getArray()->deepCopy(); arr->multiplyEqual(w->getArray()); arr->accumulate(res); - int nCompo = getArray()->getNumberOfComponents(); - std::transform(res,res+nCompo,res,std::bind2nd(std::multiplies(),1./deno)); + std::size_t nCompo = getArray()->getNumberOfComponents(); + std::transform(res,res+nCompo,res,std::bind(std::multiplies(),std::placeholders::_1,1./deno)); } /*! @@ -937,8 +724,8 @@ void MEDCouplingFieldDouble::getWeightedAverageValue(double *res, bool isWAbs) c */ double MEDCouplingFieldDouble::getWeightedAverageValue(int compId, bool isWAbs) const { - int nbComps=getArray()->getNumberOfComponents(); - if(compId<0 || compId>=nbComps) + std::size_t nbComps=getArray()->getNumberOfComponents(); + if(compId<0 || compId>=ToIdType(nbComps)) { std::ostringstream oss; oss << "MEDCouplingFieldDouble::getWeightedAverageValue : Invalid compId specified : No such nb of components ! Should be in [0," << nbComps << ") !"; throw INTERP_KERNEL::Exception(oss.str()); @@ -965,8 +752,8 @@ double MEDCouplingFieldDouble::normL1(int compId) const throw INTERP_KERNEL::Exception("No mesh underlying this field to perform normL1 !"); if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform normL1 !"); - int nbComps=getArray()->getNumberOfComponents(); - if(compId<0 || compId>=nbComps) + std::size_t nbComps=getArray()->getNumberOfComponents(); + if(compId<0 || compId>=ToIdType(nbComps)) { std::ostringstream oss; oss << "MEDCouplingFieldDouble::normL1 : Invalid compId specified : No such nb of components ! Should be in [0," << nbComps << ") !"; throw INTERP_KERNEL::Exception(oss.str()); @@ -1012,8 +799,8 @@ double MEDCouplingFieldDouble::normL2(int compId) const throw INTERP_KERNEL::Exception("No mesh underlying this field to perform normL2"); if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform normL2 !"); - int nbComps=getArray()->getNumberOfComponents(); - if(compId<0 || compId>=nbComps) + std::size_t nbComps=getArray()->getNumberOfComponents(); + if(compId<0 || compId>=ToIdType(nbComps)) { std::ostringstream oss; oss << "MEDCouplingFieldDouble::normL2 : Invalid compId specified : No such nb of components ! Should be in [0," << nbComps << ") !"; throw INTERP_KERNEL::Exception(oss.str()); @@ -1042,6 +829,48 @@ void MEDCouplingFieldDouble::normL2(double *res) const _type->normL2(_mesh,getArray(),res); } +/*! + * Returns the \c infinite norm of values of a given component of \a this field: +* \f[ + * \max_{0 \leq i < nbOfEntity}{abs(val[i])} + * \f] + * \param [in] compId - an index of the component of interest. + * \throw If \a compId is not valid. + A valid range is ( 0 <= \a compId < \a this->getNumberOfComponents() ). + * \throw If the data array is not set. + */ +double MEDCouplingFieldDouble::normMax(int compId) const +{ + if(getArray()==0) + throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::normMax : no default array defined !"); + std::size_t nbComps=getArray()->getNumberOfComponents(); + if(compId<0 || compId>=ToIdType(nbComps)) + { + std::ostringstream oss; oss << "MEDCouplingFieldDouble::normMax : Invalid compId specified : No such nb of components ! Should be in [0," << nbComps << ") !"; + throw INTERP_KERNEL::Exception(oss.str()); + } + INTERP_KERNEL::AutoPtr res=new double[nbComps]; + getArray()->normMaxPerComponent(res); + return res[compId]; +} + +/*! + * Returns the \c infinite norm of values of each component of \a this field: + * \f[ + * \max_{0 \leq i < nbOfEntity}{abs(val[i])} + * \f] + * \param [out] res - pointer to an array of result values, of size at least \a + * this->getNumberOfComponents(), that is to be allocated by the caller. + * \throw If the data array is not set. + * + */ +void MEDCouplingFieldDouble::normMax(double *res) const +{ + if(getArray()==0) + throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::normMax : no default array defined !"); + getArray()->normMaxPerComponent(res); +} + /*! * Computes a sum of values of a given component of \a this field multiplied by * values returned by buildMeasureField(). @@ -1062,8 +891,8 @@ double MEDCouplingFieldDouble::integral(int compId, bool isWAbs) const throw INTERP_KERNEL::Exception("No mesh underlying this field to perform integral"); if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform integral !"); - int nbComps=getArray()->getNumberOfComponents(); - if(compId<0 || compId>=nbComps) + std::size_t nbComps=getArray()->getNumberOfComponents(); + if(compId<0 || compId>=ToIdType(nbComps)) { std::ostringstream oss; oss << "MEDCouplingFieldDouble::integral : Invalid compId specified : No such nb of components ! Should be in [0," << nbComps << ") !"; throw INTERP_KERNEL::Exception(oss.str()); @@ -1116,7 +945,7 @@ void MEDCouplingFieldDouble::integral(bool isWAbs, double *res) const * \ref py_mcfielddouble_getValueOnPos "Here is a Python example". * \endif */ -void MEDCouplingFieldDouble::getValueOnPos(int i, int j, int k, double *res) const +void MEDCouplingFieldDouble::getValueOnPos(mcIdType i, mcIdType j, mcIdType k, double *res) const { const DataArrayDouble *arr=timeDiscr()->getArray(); if(!_mesh) @@ -1168,7 +997,7 @@ void MEDCouplingFieldDouble::getValueOn(const double *spaceLoc, double *res) con * \ref py_mcfielddouble_getValueOnMulti "Here is a Python example". * \endif */ -DataArrayDouble *MEDCouplingFieldDouble::getValueOnMulti(const double *spaceLoc, int nbOfPoints) const +DataArrayDouble *MEDCouplingFieldDouble::getValueOnMulti(const double *spaceLoc, mcIdType nbOfPoints) const { const DataArrayDouble *arr=timeDiscr()->getArray(); if(!_mesh) @@ -1205,7 +1034,7 @@ void MEDCouplingFieldDouble::getValueOn(const double *spaceLoc, double time, dou std::vector res2; for(std::vector< const DataArrayDouble *>::const_iterator iter=arrs.begin();iter!=arrs.end();iter++) { - int sz=(int)res2.size(); + std::size_t sz=res2.size(); res2.resize(sz+(*iter)->getNumberOfComponents()); _type->getValueOn(*iter,_mesh,spaceLoc,&res2[sz]); } @@ -1248,7 +1077,7 @@ MEDCouplingFieldDouble &MEDCouplingFieldDouble::operator=(double value) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::operator= : no mesh defined !"); if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform operator = !"); - int nbOfTuple=_type->getNumberOfTuples(_mesh); + mcIdType nbOfTuple=_type->getNumberOfTuples(_mesh); timeDiscr()->setOrCreateUniformValueOnAllComponents(nbOfTuple,value); return *this; } @@ -1459,7 +1288,7 @@ void MEDCouplingFieldDouble::applyFunc(int nbOfComp, double val) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::applyFunc : no mesh defined !"); if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform applyFunc !"); - int nbOfTuple=_type->getNumberOfTuples(_mesh); + mcIdType nbOfTuple=_type->getNumberOfTuples(_mesh); timeDiscr()->setUniformValue(nbOfTuple,nbOfComp,val); } @@ -1483,7 +1312,7 @@ void MEDCouplingFieldDouble::applyFunc(int nbOfComp, double val) * - "2*x + z" produces (5.,5.,5.,5.) * - "2*x + 0*y + z" produces (9.,9.,9.,9.) * - "2*x*IVec + (x+z)*LVec" produces (2.,0.,0.,4.) - * - "2*y*IVec + z*KVec + x" produces (7.,1.,1.,4.) + * - "2*y*IVec + z*KVec + x" produces (7.,1.,8.,1.) * * \param [in] nbOfComp - the number of components for \a this field to have. * \param [in] func - the function used to compute values of \a this field. @@ -1523,7 +1352,7 @@ void MEDCouplingFieldDouble::applyFunc(int nbOfComp, const std::string& func) * - "2*x + z" produces (5.,5.,5.,5.) * - "2*x + 0*y + z" produces (9.,9.,9.,9.) * - "2*x*IVec + (x+z)*LVec" produces (2.,0.,0.,4.) - * - "2*y*IVec + z*KVec + x" produces (7.,1.,1.,4.) + * - "2*y*IVec + z*KVec + x" produces (7.,1.,8.,1.) * * \param [in] nbOfComp - the number of components for \a this field to have. * \param [in] func - the function used to compute values of \a this field. @@ -1668,7 +1497,7 @@ std::size_t MEDCouplingFieldDouble::getNumberOfComponents() const * \throw If the spatial discretization is not fully defined. * \sa MEDCouplingField::getNumberOfTuplesExpected */ -std::size_t MEDCouplingFieldDouble::getNumberOfTuples() const +mcIdType MEDCouplingFieldDouble::getNumberOfTuples() const { if(!_mesh) throw INTERP_KERNEL::Exception("Impossible to retrieve number of tuples because no mesh specified !"); @@ -1684,7 +1513,7 @@ std::size_t MEDCouplingFieldDouble::getNumberOfTuples() const * data array. * \throw If the data array is not set. */ -std::size_t MEDCouplingFieldDouble::getNumberOfValues() const +mcIdType MEDCouplingFieldDouble::getNumberOfValues() const { if(getArray()==0) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::getNumberOfValues : No array specified !"); @@ -1732,7 +1561,7 @@ std::vector MEDCouplingFieldDouble::getDirectChildrenWi * \ref MEDCoupling::ON_GAUSS_PT "ON_GAUSS_PT" or * \ref MEDCoupling::ON_GAUSS_NE "ON_GAUSS_NE". */ -double MEDCouplingFieldDouble::getIJK(int cellId, int nodeIdInCell, int compoId) const +double MEDCouplingFieldDouble::getIJK(mcIdType cellId, int nodeIdInCell, int compoId) const { if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform getIJK !"); @@ -1769,126 +1598,6 @@ double MEDCouplingFieldDouble::getIJK(int cellId, int nodeIdInCell, int compoId) */ //void MEDCouplingFieldDouble::setArrays(const std::vector& arrs) -void MEDCouplingFieldDouble::getTinySerializationStrInformation(std::vector& tinyInfo) const -{ - tinyInfo.clear(); - timeDiscr()->getTinySerializationStrInformation(tinyInfo); - tinyInfo.push_back(_name); - tinyInfo.push_back(_desc); - tinyInfo.push_back(getTimeUnit()); -} - -/*! - * This method retrieves some critical values to resize and prepare remote instance. - * The first two elements returned in tinyInfo correspond to the parameters to give in constructor. - * @param tinyInfo out parameter resized correctly after the call. The length of this vector is tiny. - */ -void MEDCouplingFieldDouble::getTinySerializationIntInformation(std::vector& tinyInfo) const -{ - if(_type.isNull()) - throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform getTinySerializationIntInformation !"); - tinyInfo.clear(); - tinyInfo.push_back((int)_type->getEnum()); - tinyInfo.push_back((int)timeDiscr()->getEnum()); - tinyInfo.push_back((int)_nature); - timeDiscr()->getTinySerializationIntInformation(tinyInfo); - std::vector tinyInfo2; - _type->getTinySerializationIntInformation(tinyInfo2); - tinyInfo.insert(tinyInfo.end(),tinyInfo2.begin(),tinyInfo2.end()); - tinyInfo.push_back((int)tinyInfo2.size()); -} - -/*! - * This method retrieves some critical values to resize and prepare remote instance. - * @param tinyInfo out parameter resized correctly after the call. The length of this vector is tiny. - */ -void MEDCouplingFieldDouble::getTinySerializationDbleInformation(std::vector& tinyInfo) const -{ - if(_type.isNull()) - throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform getTinySerializationDbleInformation !"); - tinyInfo.clear(); - timeDiscr()->getTinySerializationDbleInformation(tinyInfo); - std::vector tinyInfo2; - _type->getTinySerializationDbleInformation(tinyInfo2); - tinyInfo.insert(tinyInfo.end(),tinyInfo2.begin(),tinyInfo2.end()); - tinyInfo.push_back((int)tinyInfo2.size());//very bad, lack of time to improve it -} - -/*! - * This method has to be called to the new instance filled by CORBA, MPI, File... - * @param tinyInfoI is the value retrieves from distant result of getTinySerializationIntInformation on source instance to be copied. - * @param dataInt out parameter. If not null the pointer is already owned by \a this after the call of this method. In this case no decrRef must be applied. - * @param arrays out parameter is a vector resized to the right size. The pointers in the vector is already owned by \a this after the call of this method. - * No decrRef must be applied to every instances in returned vector. - * \sa checkForUnserialization - */ -void MEDCouplingFieldDouble::resizeForUnserialization(const std::vector& tinyInfoI, DataArrayInt *&dataInt, std::vector& arrays) -{ - if(_type.isNull()) - throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform resizeForUnserialization !"); - dataInt=0; - std::vector tinyInfoITmp(tinyInfoI); - int sz=tinyInfoITmp.back(); - tinyInfoITmp.pop_back(); - std::vector tinyInfoITmp2(tinyInfoITmp.begin(),tinyInfoITmp.end()-sz); - std::vector tinyInfoI2(tinyInfoITmp2.begin()+3,tinyInfoITmp2.end()); - timeDiscr()->resizeForUnserialization(tinyInfoI2,arrays); - std::vector tinyInfoITmp3(tinyInfoITmp.end()-sz,tinyInfoITmp.end()); - _type->resizeForUnserialization(tinyInfoITmp3,dataInt); -} - -/*! - * This method is extremely close to resizeForUnserialization except that here the arrays in \a dataInt and in \a arrays are attached in \a this - * after having checked that size is correct. This method is used in python pickeling context to avoid copy of data. - * \sa resizeForUnserialization - */ -void MEDCouplingFieldDouble::checkForUnserialization(const std::vector& tinyInfoI, const DataArrayInt *dataInt, const std::vector& arrays) -{ - if(_type.isNull()) - throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform resizeForUnserialization !"); - std::vector tinyInfoITmp(tinyInfoI); - int sz=tinyInfoITmp.back(); - tinyInfoITmp.pop_back(); - std::vector tinyInfoITmp2(tinyInfoITmp.begin(),tinyInfoITmp.end()-sz); - std::vector tinyInfoI2(tinyInfoITmp2.begin()+3,tinyInfoITmp2.end()); - timeDiscr()->checkForUnserialization(tinyInfoI2,arrays); - std::vector tinyInfoITmp3(tinyInfoITmp.end()-sz,tinyInfoITmp.end()); - _type->checkForUnserialization(tinyInfoITmp3,dataInt); -} - -void MEDCouplingFieldDouble::finishUnserialization(const std::vector& tinyInfoI, const std::vector& tinyInfoD, const std::vector& tinyInfoS) -{ - if(_type.isNull()) - throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform finishUnserialization !"); - std::vector tinyInfoI2(tinyInfoI.begin()+3,tinyInfoI.end()); - // - std::vector tmp(tinyInfoD); - int sz=(int)tinyInfoD.back();//very bad, lack of time to improve it - tmp.pop_back(); - std::vector tmp1(tmp.begin(),tmp.end()-sz); - std::vector tmp2(tmp.end()-sz,tmp.end()); - // - timeDiscr()->finishUnserialization(tinyInfoI2,tmp1,tinyInfoS); - _nature=(NatureOfField)tinyInfoI[2]; - _type->finishUnserialization(tmp2); - int nbOfElemS=(int)tinyInfoS.size(); - _name=tinyInfoS[nbOfElemS-3]; - _desc=tinyInfoS[nbOfElemS-2]; - setTimeUnit(tinyInfoS[nbOfElemS-1]); -} - -/*! - * Contrary to MEDCouplingPointSet class the returned arrays are \b not the responsabilities of the caller. - * The values returned must be consulted only in readonly mode. - */ -void MEDCouplingFieldDouble::serialize(DataArrayInt *&dataInt, std::vector& arrays) const -{ - if(_type.isNull()) - throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform serialize !"); - timeDiscr()->getArrays(arrays); - _type->getSerializationIntArray(dataInt); -} - /*! * Tries to set an \a other mesh as the support of \a this field. An attempt fails, if * a current and the \a other meshes are different with use of specified equality @@ -1907,7 +1616,7 @@ void MEDCouplingFieldDouble::serialize(DataArrayInt *&dataInt, std::vector @@ -1918,9 +1627,9 @@ void MEDCouplingFieldDouble::changeUnderlyingMesh(const MEDCouplingMesh *other, { if(_mesh==0 || other==0) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::changeUnderlyingMesh : is expected to operate on not null meshes !"); - DataArrayInt *cellCor=0,*nodeCor=0; + DataArrayIdType *cellCor=0,*nodeCor=0; other->checkGeoEquivalWith(_mesh,levOfCheck,precOnMesh,cellCor,nodeCor); - MCAuto cellCor2(cellCor),nodeCor2(nodeCor); + MCAuto cellCor2(cellCor),nodeCor2(nodeCor); if(cellCor) renumberCellsWithoutMesh(cellCor->getConstPointer(),false); if(nodeCor) @@ -1955,7 +1664,7 @@ void MEDCouplingFieldDouble::changeUnderlyingMesh(const MEDCouplingMesh *other, * \throw If any of the meshes is not set or is not well defined. * \throw If the two meshes do not match. * \throw If the two fields are not coherent for merge. - * \throw If field values at merged nodes (if any) deffer more than \a eps. + * \throw If field values at merged nodes (if any) differ more than \a eps. * * \if ENABLE_EXAMPLES * \ref cpp_mcfielddouble_substractInPlaceDM "Here is a C++ example".
@@ -1988,7 +1697,7 @@ void MEDCouplingFieldDouble::substractInPlaceDM(const MEDCouplingFieldDouble *f, * \throw If the mesh is not well defined. * \throw If the spatial discretization of \a this field is NULL. * \throw If the data array is not set. - * \throw If field values at merged nodes (if any) deffer more than \a epsOnVals. + * \throw If field values at merged nodes (if any) differ more than \a epsOnVals. */ bool MEDCouplingFieldDouble::mergeNodes(double eps, double epsOnVals) { @@ -1999,8 +1708,8 @@ bool MEDCouplingFieldDouble::mergeNodes(double eps, double epsOnVals) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform mergeNodes !"); MCAuto meshC2((MEDCouplingPointSet *)meshC->deepCopy()); bool ret; - int ret2; - MCAuto arr=meshC2->mergeNodes(eps,ret,ret2); + mcIdType ret2; + MCAuto arr=meshC2->mergeNodes(eps,ret,ret2); if(!ret)//no nodes have been merged. return ret; std::vector arrays; @@ -2027,7 +1736,7 @@ bool MEDCouplingFieldDouble::mergeNodes(double eps, double epsOnVals) * \throw If the mesh is not well defined. * \throw If the spatial discretization of \a this field is NULL. * \throw If the data array is not set. - * \throw If field values at merged nodes (if any) deffer more than \a epsOnVals. + * \throw If field values at merged nodes (if any) differ more than \a epsOnVals. */ bool MEDCouplingFieldDouble::mergeNodesCenter(double eps, double epsOnVals) { @@ -2038,8 +1747,8 @@ bool MEDCouplingFieldDouble::mergeNodesCenter(double eps, double epsOnVals) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform mergeNodesCenter !"); MCAuto meshC2((MEDCouplingPointSet *)meshC->deepCopy()); bool ret; - int ret2; - MCAuto arr=meshC2->mergeNodesCenter(eps,ret,ret2); + mcIdType ret2; + MCAuto arr=meshC2->mergeNodesCenter(eps,ret,ret2); if(!ret)//no nodes have been merged. return ret; std::vector arrays; @@ -2064,7 +1773,7 @@ bool MEDCouplingFieldDouble::mergeNodesCenter(double eps, double epsOnVals) * \throw If the mesh is not well defined. * \throw If the spatial discretization of \a this field is NULL. * \throw If the data array is not set. - * \throw If field values at merged nodes (if any) deffer more than \a epsOnVals. + * \throw If field values at merged nodes (if any) differ more than \a epsOnVals. */ bool MEDCouplingFieldDouble::zipCoords(double epsOnVals) { @@ -2074,8 +1783,8 @@ bool MEDCouplingFieldDouble::zipCoords(double epsOnVals) if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform zipCoords !"); MCAuto meshC2((MEDCouplingPointSet *)meshC->deepCopy()); - int oldNbOfNodes=meshC2->getNumberOfNodes(); - MCAuto arr=meshC2->zipCoordsTraducer(); + mcIdType oldNbOfNodes=meshC2->getNumberOfNodes(); + MCAuto arr=meshC2->zipCoordsTraducer(); if(meshC2->getNumberOfNodes()!=oldNbOfNodes) { std::vector arrays; @@ -2105,7 +1814,7 @@ bool MEDCouplingFieldDouble::zipCoords(double epsOnVals) * \throw If the mesh is not well defined. * \throw If the spatial discretization of \a this field is NULL. * \throw If the data array is not set. - * \throw If field values at merged cells (if any) deffer more than \a epsOnVals. + * \throw If field values at merged cells (if any) differ more than \a epsOnVals. */ bool MEDCouplingFieldDouble::zipConnectivity(int compType, double epsOnVals) { @@ -2115,15 +1824,15 @@ bool MEDCouplingFieldDouble::zipConnectivity(int compType, double epsOnVals) if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform zipConnectivity !"); MCAuto meshC2((MEDCouplingUMesh *)meshC->deepCopy()); - int oldNbOfCells=meshC2->getNumberOfCells(); - MCAuto arr=meshC2->zipConnectivityTraducer(compType); + mcIdType oldNbOfCells(meshC2->getNumberOfCells()); + MCAuto arr=meshC2->zipConnectivityTraducer(compType); if(meshC2->getNumberOfCells()!=oldNbOfCells) { std::vector arrays; timeDiscr()->getArrays(arrays); for(std::vector::const_iterator iter=arrays.begin();iter!=arrays.end();iter++) if(*iter) - _type->renumberValuesOnCells(epsOnVals,meshC,arr->getConstPointer(),meshC2->getNumberOfCells(),*iter); + _type->renumberValuesOnCells(epsOnVals,meshC,arr->getConstPointer(),ToIdType(meshC2->getNumberOfCells()),*iter); setMesh(meshC2); return true; } @@ -2146,11 +1855,11 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::extractSlice3D(const double *ori const MCAuto umesh(mesh->buildUnstructured()); MCAuto ret(clone(false)); ret->setMesh(umesh); - DataArrayInt *cellIds=0; + DataArrayIdType *cellIds=0; MCAuto mesh2=umesh->buildSlice3D(origin,vec,eps,cellIds); - MCAuto cellIds2=cellIds; + MCAuto cellIds2=cellIds; ret->setMesh(mesh2); - MCAuto tupleIds=computeTupleIdsToSelectFromCellIds(cellIds->begin(),cellIds->end()); + MCAuto tupleIds=computeTupleIdsToSelectFromCellIds(cellIds->begin(),cellIds->end()); std::vector arrays; timeDiscr()->getArrays(arrays); int i=0; @@ -2189,17 +1898,17 @@ bool MEDCouplingFieldDouble::simplexize(int policy) throw INTERP_KERNEL::Exception("No underlying mesh on this field to perform simplexize !"); if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform simplexize !"); - int oldNbOfCells=_mesh->getNumberOfCells(); + std::size_t oldNbOfCells=_mesh->getNumberOfCells(); MCAuto meshC2(_mesh->deepCopy()); - MCAuto arr=meshC2->simplexize(policy); - int newNbOfCells=meshC2->getNumberOfCells(); + MCAuto arr=meshC2->simplexize(policy); + std::size_t newNbOfCells=meshC2->getNumberOfCells(); if(oldNbOfCells==newNbOfCells) return false; std::vector arrays; timeDiscr()->getArrays(arrays); for(std::vector::const_iterator iter=arrays.begin();iter!=arrays.end();iter++) if(*iter) - _type->renumberValuesOnCellsR(_mesh,arr->getConstPointer(),arr->getNbOfElems(),*iter); + _type->renumberValuesOnCellsR(_mesh,arr->getConstPointer(),ToIdType(arr->getNbOfElems()),*iter); setMesh(meshC2); return true; } @@ -2213,7 +1922,7 @@ MCAuto MEDCouplingFieldDouble::voronoize(double eps) con checkConsistencyLight(); const MEDCouplingMesh *mesh(getMesh()); INTERP_KERNEL::AutoCppPtr vor; - int meshDim(mesh->getMeshDimension()),spaceDim(mesh->getSpaceDimension()); + std::size_t meshDim(mesh->getMeshDimension()),spaceDim(mesh->getSpaceDimension()); if(meshDim==1 && (spaceDim==1 || spaceDim==2 || spaceDim==3)) vor=new Voronizer1D; else if(meshDim==2 && (spaceDim==2 || spaceDim==3)) @@ -2241,8 +1950,8 @@ MCAuto MEDCouplingFieldDouble::convertQuadraticCellsToLi MCAuto umesh(mesh->buildUnstructured()); umesh=umesh->clone(false); umesh->convertQuadraticCellsToLinear(); - MCAuto o2n(umesh->zipCoordsTraducer()); - MCAuto n2o(o2n->invertArrayO2N2N2O(umesh->getNumberOfNodes())); + MCAuto o2n(umesh->zipCoordsTraducer()); + MCAuto n2o(o2n->invertArrayO2N2N2O(umesh->getNumberOfNodes())); MCAuto arr(getArray()->selectByTupleIdSafe(n2o->begin(),n2o->end())); MCAuto ret(MEDCouplingFieldDouble::New(ON_NODES)); ret->setArray(arr); @@ -2279,18 +1988,17 @@ MCAuto MEDCouplingFieldDouble::convertQuadraticCellsToLi if(!disc2) throw INTERP_KERNEL::Exception("convertQuadraticCellsToLinear : Not a ON_GAUSS_PT field"); std::set gt2(umesh->getAllGeoTypes()); - const DataArrayDouble *arr(getArray()); - std::vector< MCAuto > cellIdsV; + std::vector< MCAuto > cellIdsV; std::vector< MCAuto > meshesV; std::vector< MEDCouplingGaussLocalization > glV; bool isZipReq(false); for(std::set::const_iterator it=gt.begin();it!=gt.end();it++) { const INTERP_KERNEL::CellModel& cm(INTERP_KERNEL::CellModel::GetCellModel(*it)); - MCAuto cellIds(umesh->giveCellsWithType(*it)); + MCAuto cellIds(umesh->giveCellsWithType(*it)); cellIdsV.push_back(cellIds); MCAuto part(umesh->buildPartOfMySelf(cellIds->begin(),cellIds->end())); - int id(disc2->getGaussLocalizationIdOfOneType(*it)); + mcIdType id(disc2->getGaussLocalizationIdOfOneType(*it)); const MEDCouplingGaussLocalization& gl(disc2->getGaussLocalization(id)); if(!cm.isQuadratic()) { @@ -2311,8 +2019,8 @@ MCAuto MEDCouplingFieldDouble::convertQuadraticCellsToLi { std::vector< const MEDCouplingUMesh * > meshesPtr(VecAutoToVecOfCstPt(meshesV)); umesh=MEDCouplingUMesh::MergeUMeshesOnSameCoords(meshesPtr); - std::vector< const DataArrayInt * > zeCellIds(VecAutoToVecOfCstPt(cellIdsV)); - MCAuto zeIds(DataArrayInt::Aggregate(zeCellIds)); + std::vector< const DataArrayIdType * > zeCellIds(VecAutoToVecOfCstPt(cellIdsV)); + MCAuto zeIds(DataArrayIdType::Aggregate(zeCellIds)); umesh->renumberCells(zeIds->begin()); umesh->setName(mesh->getName()); } @@ -2334,7 +2042,7 @@ MCAuto MEDCouplingFieldDouble::convertQuadraticCellsToLi /*! * This is expected to be a 3 components vector field on nodes (if not an exception will be thrown). \a this is also expected to lie on a MEDCouplingPointSet mesh. - * Finaly \a this is also expected to be consistent. + * Finally \a this is also expected to be consistent. * In these conditions this method returns a newly created field (to be dealed by the caller). * The returned field will also 3 compo vector field be on nodes lying on the same mesh than \a this. * @@ -2576,7 +2284,7 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::maxPerTuple() const * \param [in] dftValue - value assigned to new values added to \a this field. * \throw If \a this is not allocated. */ -void MEDCouplingFieldDouble::changeNbOfComponents(int newNbOfComp, double dftValue) +void MEDCouplingFieldDouble::changeNbOfComponents(std::size_t newNbOfComp, double dftValue) { timeDiscr()->changeNbOfComponents(newNbOfComp,dftValue); } @@ -2593,7 +2301,7 @@ void MEDCouplingFieldDouble::changeNbOfComponents(int newNbOfComp, double dftVal * \throw If a component index (\a i) is not valid: * \a i < 0 || \a i >= \a this->getNumberOfComponents(). */ -MEDCouplingFieldDouble *MEDCouplingFieldDouble::keepSelectedComponents(const std::vector& compoIds) const +MEDCouplingFieldDouble *MEDCouplingFieldDouble::keepSelectedComponents(const std::vector& compoIds) const { if(_type.isNull()) throw INTERP_KERNEL::Exception("No spatial discretization underlying this field to perform keepSelectedComponents !"); @@ -2605,7 +2313,6 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::keepSelectedComponents(const std return ret.retn(); } - /*! * Copy all components in a specified order from another field. * The number of tuples in \a this and the other field can be different. @@ -2617,7 +2324,7 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::keepSelectedComponents(const std * \throw If \a compoIds.size() != \a a->getNumberOfComponents(). * \throw If \a compoIds[i] < 0 or \a compoIds[i] > \a this->getNumberOfComponents(). */ -void MEDCouplingFieldDouble::setSelectedComponents(const MEDCouplingFieldDouble *f, const std::vector& compoIds) +void MEDCouplingFieldDouble::setSelectedComponents(const MEDCouplingFieldDouble *f, const std::vector& compoIds) { timeDiscr()->setSelectedComponents(f->timeDiscr(),compoIds); } @@ -2653,24 +2360,9 @@ void MEDCouplingFieldDouble::sortPerTuple(bool asc) */ MEDCouplingFieldDouble *MEDCouplingFieldDouble::MergeFields(const MEDCouplingFieldDouble *f1, const MEDCouplingFieldDouble *f2) { - if(!f1->areCompatibleForMerge(f2)) - throw INTERP_KERNEL::Exception("Fields are not compatible. Unable to apply MergeFields on them ! Check support mesh, field nature, and spatial and time discretisation."); - const MEDCouplingMesh *m1(f1->getMesh()),*m2(f2->getMesh()); - if(!f1->timeDiscr()) - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::MergeFields : no time discr of f1 !"); - if(!f1->_type) - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::MergeFields : no spatial discr of f1 !"); - MEDCouplingTimeDiscretization *td(f1->timeDiscr()->aggregate(f2->timeDiscr())); - td->copyTinyAttrFrom(*f1->timeDiscr()); - MCAuto ret(new MEDCouplingFieldDouble(f1->getNature(),td,f1->_type->clone())); - ret->setName(f1->getName()); - ret->setDescription(f1->getDescription()); - if(m1) - { - MCAuto m=m1->mergeMyselfWith(m2); - ret->setMesh(m); - } - return ret.retn(); + std::vector a(2); + a[0]=f1; a[1]=f2; + return MergeFields(a); } /*! @@ -2694,29 +2386,36 @@ MEDCouplingFieldDouble *MEDCouplingFieldDouble::MergeFields(const MEDCouplingFie */ MEDCouplingFieldDouble *MEDCouplingFieldDouble::MergeFields(const std::vector& a) { - if(a.size()<1) - throw INTERP_KERNEL::Exception("FieldDouble::MergeFields : size of array must be >= 1 !"); + if(a.empty()) + throw INTERP_KERNEL::Exception("FieldDouble::MergeFields : input array is empty !"); std::vector< MCAuto > ms(a.size()); std::vector< const MEDCouplingUMesh *> ms2(a.size()); std::vector< const MEDCouplingTimeDiscretization *> tds(a.size()); - std::vector::const_iterator it=a.begin(); - const MEDCouplingFieldDouble *ref=(*it++); + std::vector< const MEDCouplingFieldDouble *>::const_iterator it=a.begin(); + std::vector fds(a.size()); + const MEDCouplingFieldDouble *ref((*it++)); if(!ref) - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::MergeFields : presence of NULL instance in first place of input vector !"); + throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::MergeFields : presence of nullptr instance in first place of input vector !"); + if(!ref->getDiscretization()) + throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::MergeFields : nullptr spatial discretization !"); for(;it!=a.end();it++) if(!ref->areCompatibleForMerge(*it)) throw INTERP_KERNEL::Exception("Fields are not compatible. Unable to apply MergeFields on them! Check support mesh, field nature, and spatial and time discretisation."); - for(int i=0;i<(int)a.size();i++) + for(std::size_t i=0;igetMesh()) { ms[i]=a[i]->getMesh()->buildUnstructured(); ms2[i]=ms[i]; } else { ms[i]=0; ms2[i]=0; } tds[i]=a[i]->timeDiscr(); + fds[i]=a[i]->getDiscretization(); } MEDCouplingTimeDiscretization *td(tds[0]->aggregate(tds)); + MCAuto fda(fds[0]->aggregate(fds)); td->copyTinyAttrFrom(*(a[0]->timeDiscr())); - MCAuto ret(new MEDCouplingFieldDouble(a[0]->getNature(),td,a[0]->_type->clone())); + MCAuto ret(new MEDCouplingFieldDouble(a[0]->getNature(),td,fda.retn())); ret->setName(a[0]->getName()); ret->setDescription(a[0]->getDescription()); if(ms2[0]) @@ -3215,14 +2914,14 @@ MCAuto MEDCouplingFieldDouble::voronoizeGen(const Voroni inpMeshBase=fieldToWO->getMesh(); inpMesh=inpMeshBase->buildUnstructured(); } - int nbCells(inpMesh->getNumberOfCells()); + mcIdType nbCells(inpMesh->getNumberOfCells()); const MEDCouplingFieldDiscretization *disc(fieldToWO->getDiscretization()); const MEDCouplingFieldDiscretizationGauss *disc2(dynamic_cast(disc)); if(!disc2) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::voronoize2D : Not a ON_GAUSS_PT field"); - int nbLocs(disc2->getNbOfGaussLocalization()); + mcIdType nbLocs(disc2->getNbOfGaussLocalization()); std::vector< MCAuto > cells(nbCells); - for(int i=0;igetGaussLocalization(i)); if(gl.getDimension()!=vor->getDimension()) @@ -3235,20 +2934,20 @@ MCAuto MEDCouplingFieldDouble::voronoizeGen(const Voroni MCAuto coo3(MEDCouplingUMesh::Build0DMeshFromCoords(coo2)); // MCAuto vorCellsForCurDisc(vor->doIt(mesh,coo2,eps)); - std::vector ids; + std::vector ids; MCAuto ptsInReal; disc2->getCellIdsHavingGaussLocalization(i,ids); { MCAuto subMesh(inpMesh->buildPartOfMySelf(&ids[0],&ids[0]+ids.size())); ptsInReal=gl.localizePtsInRefCooForEachCell(vorCellsForCurDisc->getCoords(),subMesh); } - int nbPtsPerCell(vorCellsForCurDisc->getNumberOfNodes()); - for(std::size_t i=0;igetNumberOfNodes()); + for(mcIdType j=0;j elt(vorCellsForCurDisc->clone(false)); - MCAuto coo(ptsInReal->selectByTupleIdSafeSlice(i*nbPtsPerCell,(i+1)*nbPtsPerCell,1)); - elt->setCoords(coo); - cells[ids[i]]=elt; + MCAuto coo4(ptsInReal->selectByTupleIdSafeSlice(j*nbPtsPerCell,(j+1)*nbPtsPerCell,1)); + elt->setCoords(coo4); + cells[ids[j]]=elt; } } std::vector< const MEDCouplingUMesh * > cellsPtr(VecAutoToVecOfCstPt(cells)); @@ -3291,4 +2990,3 @@ const MEDCouplingTimeDiscretization *MEDCouplingFieldDouble::timeDiscr() const throw INTERP_KERNEL::Exception("Field Double Null invalid type of time discr !"); return retc; } -