X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling%2FMEDCouplingFieldDouble.cxx;h=20ded05dd31f9d55475539b87a6fca49951c303f;hb=fc22b4cd63404700f73e09be7507a11b838e55bc;hp=e5b4a4711feb79ca8d90ed33a0c1bee43cfe30a0;hpb=8de05faeebdd2a851021362e57d87fc1e8792c0a;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingFieldDouble.cxx b/src/MEDCoupling/MEDCouplingFieldDouble.cxx index e5b4a4711..20ded05dd 100644 --- a/src/MEDCoupling/MEDCouplingFieldDouble.cxx +++ b/src/MEDCoupling/MEDCouplingFieldDouble.cxx @@ -16,12 +16,13 @@ // // 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 "MEDCouplingFieldFloat.hxx" #include "MEDCouplingUMesh.hxx" #include "MEDCouplingTimeDiscretization.hxx" #include "MEDCouplingFieldDiscretization.hxx" @@ -30,6 +31,7 @@ #include "MEDCouplingNatureOfField.hxx" #include "InterpKernelAutoPtr.hxx" +#include "InterpKernelGaussCoords.hxx" #include #include @@ -38,7 +40,7 @@ using namespace MEDCoupling; -template class MEDCouplingFieldT; +template class MEDCoupling::MEDCouplingFieldT; /*! * Creates a new MEDCouplingFieldDouble, of given spatial type and time discretization. @@ -173,9 +175,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(); @@ -521,162 +523,30 @@ DataArrayInt *MEDCouplingFieldDouble::findIdsInRange(double vmin, double vmax) c 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 +MEDCouplingFieldInt *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)) @@ -690,7 +560,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) { } @@ -1768,126 +1638,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 @@ -2114,7 +1864,7 @@ 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(); + std::size_t oldNbOfCells(meshC2->getNumberOfCells()); MCAuto arr=meshC2->zipConnectivityTraducer(compType); if(meshC2->getNumberOfCells()!=oldNbOfCells) { @@ -2264,8 +2014,69 @@ MCAuto MEDCouplingFieldDouble::convertQuadraticCellsToLi ret->copyAllTinyAttrFrom(this); return ret; } + case ON_GAUSS_PT: + { + const MEDCouplingMesh *mesh(getMesh()); + if(!mesh) + throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::convertQuadraticCellsToLinear : null mesh !"); + MCAuto umesh(mesh->buildUnstructured()); + std::set gt(umesh->getAllGeoTypes()); + MCAuto ret(MEDCouplingFieldDouble::New(ON_GAUSS_PT)); + // + const MEDCouplingFieldDiscretization *disc(getDiscretization()); + const MEDCouplingFieldDiscretizationGauss *disc2(dynamic_cast(disc)); + if(!disc2) + throw INTERP_KERNEL::Exception("convertQuadraticCellsToLinear : Not a ON_GAUSS_PT field"); + std::set gt2(umesh->getAllGeoTypes()); + 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)); + cellIdsV.push_back(cellIds); + MCAuto part(umesh->buildPartOfMySelf(cellIds->begin(),cellIds->end())); + int id(disc2->getGaussLocalizationIdOfOneType(*it)); + const MEDCouplingGaussLocalization& gl(disc2->getGaussLocalization(id)); + if(!cm.isQuadratic()) + { + glV.push_back(gl); + } + else + { + isZipReq=true; + part->convertQuadraticCellsToLinear(); + INTERP_KERNEL::GaussInfo gi(*it,gl.getGaussCoords(),gl.getNumberOfGaussPt(),gl.getRefCoords(),gl.getNumberOfPtsInRefCell()); + INTERP_KERNEL::GaussInfo gi2(gi.convertToLinear()); + MEDCouplingGaussLocalization gl2(gi2.getGeoType(),gi2.getRefCoords(),gi2.getGaussCoords(),gl.getWeights()); + glV.push_back(gl2); + } + meshesV.push_back(part); + } + // + { + std::vector< const MEDCouplingUMesh * > meshesPtr(VecAutoToVecOfCstPt(meshesV)); + umesh=MEDCouplingUMesh::MergeUMeshesOnSameCoords(meshesPtr); + std::vector< const DataArrayInt * > zeCellIds(VecAutoToVecOfCstPt(cellIdsV)); + MCAuto zeIds(DataArrayInt::Aggregate(zeCellIds)); + umesh->renumberCells(zeIds->begin()); + umesh->setName(mesh->getName()); + } + // + if(isZipReq) + umesh->zipCoords(); + ret->setArray(const_cast(getArray())); + ret->setMesh(umesh); + for(std::vector< MEDCouplingGaussLocalization >::const_iterator it=glV.begin();it!=glV.end();it++) + ret->setGaussLocalizationOnType((*it).getType(),(*it).getRefCoords(),(*it).getGaussCoords(),(*it).getWeights()); + ret->copyAllTinyAttrFrom(this); + ret->checkConsistencyLight(); + return ret; + } default: - throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::convertQuadraticCellsToLinear : Only available for fields on nodes !"); + throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::convertQuadraticCellsToLinear : Only available for fields on nodes and on cells !"); } } @@ -3140,9 +2951,20 @@ MCAuto MEDCouplingFieldDouble::voronoizeGen(const Voroni checkConsistencyLight(); if(!vor) throw INTERP_KERNEL::Exception("MEDCouplingFieldDouble::voronoizeGen : null pointer !"); - const MEDCouplingMesh *inpMesh(getMesh()); + MCAuto fieldToWO; + const MEDCouplingMesh *inpMeshBase(getMesh()); + MCAuto inpMesh(inpMeshBase->buildUnstructured()); + std::string meshName(inpMesh->getName()); + if(!inpMesh->isPresenceOfQuadratic()) + fieldToWO=clone(false); + else + { + fieldToWO=convertQuadraticCellsToLinear(); + inpMeshBase=fieldToWO->getMesh(); + inpMesh=inpMeshBase->buildUnstructured(); + } int nbCells(inpMesh->getNumberOfCells()); - const MEDCouplingFieldDiscretization *disc(getDiscretization()); + 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"); @@ -3165,25 +2987,25 @@ MCAuto MEDCouplingFieldDouble::voronoizeGen(const Voroni MCAuto ptsInReal; disc2->getCellIdsHavingGaussLocalization(i,ids); { - MCAuto tmp4(inpMesh->buildUnstructured()); - MCAuto subMesh(tmp4->buildPartOfMySelf(&ids[0],&ids[0]+ids.size())); + 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;i 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)); MCAuto outMesh(MEDCouplingUMesh::MergeUMeshes(cellsPtr)); + outMesh->setName(meshName); MCAuto onCells(MEDCouplingFieldDouble::New(ON_CELLS)); onCells->setMesh(outMesh); { - MCAuto arr(getArray()->deepCopy()); + MCAuto arr(fieldToWO->getArray()->deepCopy()); onCells->setArray(arr); } onCells->setTimeUnit(getTimeUnit()); @@ -3217,4 +3039,3 @@ const MEDCouplingTimeDiscretization *MEDCouplingFieldDouble::timeDiscr() const throw INTERP_KERNEL::Exception("Field Double Null invalid type of time discr !"); return retc; } -