From 98f7ba20f9cf8c460c43e3ffd2eacc4ec473a9cb Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Mon, 6 Feb 2017 11:20:43 +0100 Subject: [PATCH] Voronoi 1D + getCellsContainingPoint is now a virtual abstract method --- src/MEDCoupling/MEDCoupling1GTUMesh.cxx | 11 +- src/MEDCoupling/MEDCoupling1GTUMesh.hxx | 1 + src/MEDCoupling/MEDCouplingCMesh.cxx | 6 + src/MEDCoupling/MEDCouplingCMesh.hxx | 1 + .../MEDCouplingCurveLinearMesh.cxx | 6 + .../MEDCouplingCurveLinearMesh.hxx | 1 + src/MEDCoupling/MEDCouplingFieldDouble.cxx | 4 +- src/MEDCoupling/MEDCouplingIMesh.cxx | 6 + src/MEDCoupling/MEDCouplingIMesh.hxx | 1 + .../MEDCouplingMappedExtrudedMesh.cxx | 5 + .../MEDCouplingMappedExtrudedMesh.hxx | 1 + src/MEDCoupling/MEDCouplingMesh.cxx | 35 +----- src/MEDCoupling/MEDCouplingMesh.hxx | 2 +- src/MEDCoupling/MEDCouplingVoronoi.cxx | 116 ++++++++++++++++++ src/MEDCoupling/MEDCouplingVoronoi.hxx | 7 ++ .../MEDCouplingBasicsTest5.py | 35 ++++++ 16 files changed, 205 insertions(+), 33 deletions(-) diff --git a/src/MEDCoupling/MEDCoupling1GTUMesh.cxx b/src/MEDCoupling/MEDCoupling1GTUMesh.cxx index e702119f7..7dda1671a 100644 --- a/src/MEDCoupling/MEDCoupling1GTUMesh.cxx +++ b/src/MEDCoupling/MEDCoupling1GTUMesh.cxx @@ -329,10 +329,19 @@ MEDCouplingFieldDouble *MEDCoupling1GTUMesh::getMeasureFieldOnNode(bool isAbs) c */ int MEDCoupling1GTUMesh::getCellContainingPoint(const double *pos, double eps) const { - MCAuto m=buildUnstructured(); + MCAuto m(buildUnstructured()); return m->getCellContainingPoint(pos,eps); } +/*! + * to improve perf ! + */ +void MEDCoupling1GTUMesh::getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const +{ + MCAuto m(buildUnstructured()); + return m->getCellsContainingPoint(pos,eps,elts); +} + MEDCouplingFieldDouble *MEDCoupling1GTUMesh::buildOrthogonalField() const { MCAuto m=buildUnstructured(); diff --git a/src/MEDCoupling/MEDCoupling1GTUMesh.hxx b/src/MEDCoupling/MEDCoupling1GTUMesh.hxx index cf44ed663..c17ab296f 100644 --- a/src/MEDCoupling/MEDCoupling1GTUMesh.hxx +++ b/src/MEDCoupling/MEDCoupling1GTUMesh.hxx @@ -60,6 +60,7 @@ namespace MEDCoupling MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureField(bool isAbs) const; MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureFieldOnNode(bool isAbs) const; MEDCOUPLING_EXPORT int getCellContainingPoint(const double *pos, double eps) const; + MEDCOUPLING_EXPORT void getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const; MEDCOUPLING_EXPORT MEDCouplingFieldDouble *buildOrthogonalField() const; MEDCOUPLING_EXPORT DataArrayInt *getCellsInBoundingBox(const double *bbox, double eps) const; MEDCOUPLING_EXPORT DataArrayInt *getCellsInBoundingBox(const INTERP_KERNEL::DirectedBoundingBox& bbox, double eps); diff --git a/src/MEDCoupling/MEDCouplingCMesh.cxx b/src/MEDCoupling/MEDCouplingCMesh.cxx index 0f413d26f..f64050492 100644 --- a/src/MEDCoupling/MEDCouplingCMesh.cxx +++ b/src/MEDCoupling/MEDCouplingCMesh.cxx @@ -633,6 +633,12 @@ int MEDCouplingCMesh::getCellContainingPoint(const double *pos, double eps) cons return ret; } +void MEDCouplingCMesh::getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const +{ + int ret(getCellContainingPoint(pos,eps)); + elts.push_back(ret); +} + void MEDCouplingCMesh::rotate(const double *center, const double *vector, double angle) { throw INTERP_KERNEL::Exception("No rotation available on CMesh : Traduce it to untructured mesh to apply it !"); diff --git a/src/MEDCoupling/MEDCouplingCMesh.hxx b/src/MEDCoupling/MEDCouplingCMesh.hxx index 9b6e50fe1..0af6ec292 100644 --- a/src/MEDCoupling/MEDCouplingCMesh.hxx +++ b/src/MEDCoupling/MEDCouplingCMesh.hxx @@ -65,6 +65,7 @@ namespace MEDCoupling MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureField(bool isAbs) const; MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureFieldOnNode(bool isAbs) const; MEDCOUPLING_EXPORT int getCellContainingPoint(const double *pos, double eps) const; + MEDCOUPLING_EXPORT void getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const; MEDCOUPLING_EXPORT void rotate(const double *center, const double *vector, double angle); MEDCOUPLING_EXPORT void translate(const double *vector); MEDCOUPLING_EXPORT void scale(const double *point, double factor); diff --git a/src/MEDCoupling/MEDCouplingCurveLinearMesh.cxx b/src/MEDCoupling/MEDCouplingCurveLinearMesh.cxx index 17db1d9a0..b8e76f682 100644 --- a/src/MEDCoupling/MEDCouplingCurveLinearMesh.cxx +++ b/src/MEDCoupling/MEDCouplingCurveLinearMesh.cxx @@ -634,6 +634,12 @@ int MEDCouplingCurveLinearMesh::getCellContainingPoint(const double *pos, double } } +void MEDCouplingCurveLinearMesh::getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const +{ + int ret(getCellContainingPoint(pos,eps)); + elts.push_back(ret); +} + void MEDCouplingCurveLinearMesh::rotate(const double *center, const double *vector, double angle) { if(!((DataArrayDouble *)_coords)) diff --git a/src/MEDCoupling/MEDCouplingCurveLinearMesh.hxx b/src/MEDCoupling/MEDCouplingCurveLinearMesh.hxx index 316e7eaae..d9884d89c 100644 --- a/src/MEDCoupling/MEDCouplingCurveLinearMesh.hxx +++ b/src/MEDCoupling/MEDCouplingCurveLinearMesh.hxx @@ -66,6 +66,7 @@ namespace MEDCoupling MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureFieldOnNode(bool isAbs) const; MEDCOUPLING_EXPORT MEDCouplingFieldDouble *buildOrthogonalField() const; MEDCOUPLING_EXPORT int getCellContainingPoint(const double *pos, double eps) const; + MEDCOUPLING_EXPORT void getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const; MEDCOUPLING_EXPORT void rotate(const double *center, const double *vector, double angle); MEDCOUPLING_EXPORT void translate(const double *vector); MEDCOUPLING_EXPORT void scale(const double *point, double factor); diff --git a/src/MEDCoupling/MEDCouplingFieldDouble.cxx b/src/MEDCoupling/MEDCouplingFieldDouble.cxx index 2b51bd607..4a1d54ba2 100644 --- a/src/MEDCoupling/MEDCouplingFieldDouble.cxx +++ b/src/MEDCoupling/MEDCouplingFieldDouble.cxx @@ -2213,7 +2213,9 @@ MCAuto MEDCouplingFieldDouble::voronoize(double eps) con const MEDCouplingMesh *mesh(getMesh()); INTERP_KERNEL::AutoCppPtr vor; int meshDim(mesh->getMeshDimension()),spaceDim(mesh->getSpaceDimension()); - if(meshDim==2 && (spaceDim==2 || spaceDim==3)) + if(meshDim==1 && (spaceDim==1 || spaceDim==2 || spaceDim==3)) + vor=new Voronizer1D; + else if(meshDim==2 && (spaceDim==2 || spaceDim==3)) vor=new Voronizer2D; else if(meshDim==3 && spaceDim==3) vor=new Voronizer3D; diff --git a/src/MEDCoupling/MEDCouplingIMesh.cxx b/src/MEDCoupling/MEDCouplingIMesh.cxx index f30feb9d4..329c54584 100644 --- a/src/MEDCoupling/MEDCouplingIMesh.cxx +++ b/src/MEDCoupling/MEDCouplingIMesh.cxx @@ -1123,6 +1123,12 @@ int MEDCouplingIMesh::getCellContainingPoint(const double *pos, double eps) cons return ret; } +void MEDCouplingIMesh::getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const +{ + int ret(getCellContainingPoint(pos,eps)); + elts.push_back(ret); +} + void MEDCouplingIMesh::rotate(const double *center, const double *vector, double angle) { throw INTERP_KERNEL::Exception("No rotation available on IMesh : Traduce it to unstructured mesh to apply it !"); diff --git a/src/MEDCoupling/MEDCouplingIMesh.hxx b/src/MEDCoupling/MEDCouplingIMesh.hxx index 78456d339..362cb9803 100644 --- a/src/MEDCoupling/MEDCouplingIMesh.hxx +++ b/src/MEDCoupling/MEDCouplingIMesh.hxx @@ -80,6 +80,7 @@ namespace MEDCoupling MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureField(bool isAbs) const; MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureFieldOnNode(bool isAbs) const; MEDCOUPLING_EXPORT int getCellContainingPoint(const double *pos, double eps) const; + MEDCOUPLING_EXPORT void getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const; MEDCOUPLING_EXPORT void rotate(const double *center, const double *vector, double angle); MEDCOUPLING_EXPORT void translate(const double *vector); MEDCOUPLING_EXPORT void scale(const double *point, double factor); diff --git a/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.cxx b/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.cxx index 463677011..9456bffcd 100644 --- a/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.cxx +++ b/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.cxx @@ -508,6 +508,11 @@ int MEDCouplingMappedExtrudedMesh::getCellContainingPoint(const double *pos, dou throw INTERP_KERNEL::Exception("MEDCouplingMappedExtrudedMesh::getCellContainingPoint : not implemented yet !"); } +void MEDCouplingMappedExtrudedMesh::getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const +{ + throw INTERP_KERNEL::Exception("MEDCouplingMappedExtrudedMesh::getCellsContainingPoint : not implemented yet !"); +} + MEDCouplingMappedExtrudedMesh::~MEDCouplingMappedExtrudedMesh() { } diff --git a/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.hxx b/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.hxx index 421d341c8..807c2f2c1 100644 --- a/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.hxx +++ b/src/MEDCoupling/MEDCouplingMappedExtrudedMesh.hxx @@ -82,6 +82,7 @@ namespace MEDCoupling MEDCOUPLING_EXPORT MEDCouplingFieldDouble *getMeasureFieldOnNode(bool) const; MEDCOUPLING_EXPORT MEDCouplingFieldDouble *buildOrthogonalField() const; MEDCOUPLING_EXPORT int getCellContainingPoint(const double *pos, double eps) const; + MEDCOUPLING_EXPORT void getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const; MEDCOUPLING_EXPORT static int FindCorrespCellByNodalConn(const std::vector& nodalConnec, const int *revNodalPtr, const int *revNodalIndxPtr); MEDCOUPLING_EXPORT static void Project1DMeshes(const MEDCouplingUMesh *m1, const MEDCouplingUMesh *m2, double eps, diff --git a/src/MEDCoupling/MEDCouplingMesh.cxx b/src/MEDCoupling/MEDCouplingMesh.cxx index 388623f7e..551d4c3f7 100644 --- a/src/MEDCoupling/MEDCouplingMesh.cxx +++ b/src/MEDCoupling/MEDCouplingMesh.cxx @@ -20,7 +20,7 @@ #include "MEDCouplingMesh.hxx" #include "MEDCouplingUMesh.hxx" -#include "MEDCouplingMemArray.hxx" +#include "MEDCouplingMemArray.txx" #include "MEDCouplingFieldDouble.hxx" #include "MEDCouplingFieldDiscretization.hxx" #include "MCAuto.hxx" @@ -622,27 +622,6 @@ const char *MEDCouplingMesh::GetReprOfGeometricType(INTERP_KERNEL::NormalizedCel return cm.getRepr(); } -/*! - * Finds cells in contact with a ball (i.e. a point with precision). - * \warning This method is suitable if the caller intends to evaluate only one - * point, for more points getCellsContainingPoints() is recommended as it is - * faster. - * \param [in] pos - array of coordinates of the ball central point. - * \param [in] eps - ball radius. - * \param [in,out] elts - vector returning ids of the found cells. It is cleared - * before inserting ids. - * - * \if ENABLE_EXAMPLES - * \ref cpp_mcumesh_getCellsContainingPoint "Here is a C++ example".
- * \ref py_mcumesh_getCellsContainingPoint "Here is a Python example". - * \endif - */ -void MEDCouplingMesh::getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const -{ - int ret=getCellContainingPoint(pos,eps); - elts.push_back(ret); -} - /*! * Finds cells in contact with several balls (i.e. points with precision). * This method is an extension of getCellContainingPoint() and @@ -676,14 +655,10 @@ void MEDCouplingMesh::getCellsContainingPoints(const double *pos, int nbOfPoints const double *work(pos); for(int i=0;i=0) - { - elts->pushBackSilent(ret); - eltsIndexPtr[i+1]=eltsIndexPtr[i]+1; - } - else - eltsIndexPtr[i+1]=eltsIndexPtr[i]; + std::vector ret; + getCellsContainingPoint(work,eps,ret); + elts->insertAtTheEnd(ret.begin(),ret.end()); + eltsIndexPtr[i+1]=elts->getNumberOfTuples(); } } diff --git a/src/MEDCoupling/MEDCouplingMesh.hxx b/src/MEDCoupling/MEDCouplingMesh.hxx index 0e9efe47a..1f1a79cc4 100644 --- a/src/MEDCoupling/MEDCouplingMesh.hxx +++ b/src/MEDCoupling/MEDCouplingMesh.hxx @@ -113,7 +113,7 @@ namespace MEDCoupling MEDCOUPLING_EXPORT virtual MEDCouplingFieldDouble *getMeasureField(bool isAbs) const = 0; MEDCOUPLING_EXPORT virtual MEDCouplingFieldDouble *getMeasureFieldOnNode(bool isAbs) const = 0; MEDCOUPLING_EXPORT virtual int getCellContainingPoint(const double *pos, double eps) const = 0; - MEDCOUPLING_EXPORT virtual void getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const; + MEDCOUPLING_EXPORT virtual void getCellsContainingPoint(const double *pos, double eps, std::vector& elts) const = 0; MEDCOUPLING_EXPORT virtual void getCellsContainingPoints(const double *pos, int nbOfPoints, double eps, MCAuto& elts, MCAuto& eltsIndex) const; MEDCOUPLING_EXPORT virtual MEDCouplingFieldDouble *fillFromAnalytic(TypeOfField t, int nbOfComp, FunctionToEvaluate func) const; MEDCOUPLING_EXPORT virtual MEDCouplingFieldDouble *fillFromAnalytic(TypeOfField t, int nbOfComp, const std::string& func) const; diff --git a/src/MEDCoupling/MEDCouplingVoronoi.cxx b/src/MEDCoupling/MEDCouplingVoronoi.cxx index be334825b..7e7efbcfd 100644 --- a/src/MEDCoupling/MEDCouplingVoronoi.cxx +++ b/src/MEDCoupling/MEDCouplingVoronoi.cxx @@ -33,6 +33,11 @@ Voronizer::~Voronizer() { } +int Voronizer1D::getDimension() const +{ + return 1; +} + int Voronizer2D::getDimension() const { return 2; @@ -212,6 +217,117 @@ MCAuto MergeVorCells3D(const std::vector< MCAuto MergeVorCells1D(const std::vector< MCAuto >& vcs, double eps) +{ + static const int CONN_SEG2_DFT[2]={0,1}; + if(vcs.empty()) + throw INTERP_KERNEL::Exception("MergeVorCells1D : internal error 1 !"); + if(vcs.size()==1) + return vcs[0]; + if(vcs.size()>2) + throw INTERP_KERNEL::Exception("MergeVorCells1D : internal error 2 !"); + double a0,b0,a1,b1; + { + const int *connPtr(vcs[0]->getNodalConnectivity()->begin()); + const double *coordPtr(vcs[0]->getCoords()->begin()); + a0=coordPtr[connPtr[1]]; b0=coordPtr[connPtr[2]]; + } + { + const int *connPtr(vcs[1]->getNodalConnectivity()->begin()); + const double *coordPtr(vcs[1]->getCoords()->begin()); + a1=coordPtr[connPtr[1]]; b1=coordPtr[connPtr[2]]; + } + MCAuto ret(MEDCouplingUMesh::New("",1)); ret->allocateCells(); ret->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,CONN_SEG2_DFT); + MCAuto coo(DataArrayDouble::New()); coo->alloc(2,1); ret->setCoords(coo); + if(fabs(b0-a1)setIJ(0,0,a0); coo->setIJ(1,0,b1); } + else if(fabs(b1-a0)setIJ(0,0,b0); coo->setIJ(1,0,a1); } + return ret; +} + +MCAuto MEDCoupling::Voronizer1D::doIt(const MEDCouplingUMesh *m, const DataArrayDouble *points, double eps) const +{ + static const int CONN_SEG2_DFT[2]={0,1}; + if(!m || !points) + throw INTERP_KERNEL::Exception("Voronoize1D : null pointer !"); + m->checkConsistencyLight(); + points->checkAllocated(); + if(m->getMeshDimension()!=1 || m->getSpaceDimension()!=1 || points->getNumberOfComponents()!=1) + throw INTERP_KERNEL::Exception("Voronoize1D : spacedim must be equal to 1 and meshdim also equal to 1 !"); + if(m->getNumberOfCells()!=1) + throw INTERP_KERNEL::Exception("Voronoize1D : mesh is expected to have only one cell !"); + int nbPts(points->getNumberOfTuples()); + if(nbPts<1) + throw INTERP_KERNEL::Exception("Voronoize1D : at least one point expected !"); + std::vector bbox(4); + m->getBoundingBox(&bbox[0]); + std::vector< MCAuto > l0(1,MCAuto(m->deepCopy())); + const double *pts(points->begin()); + for(int i=1;i vorTess; + { + std::vector< const MEDCouplingUMesh * > l0Bis(VecAutoToVecOfCstPt(l0)); + vorTess=MEDCouplingUMesh::MergeUMeshes(l0Bis); + } + { + bool dummy; + int newNbNodes; + MCAuto dummy3(vorTess->mergeNodes(eps,dummy,newNbNodes)); + } + std::vector polygsToIterOn; + const double *pt(pts+i); + vorTess->getCellsContainingPoint(pt,eps,polygsToIterOn); + if(polygsToIterOn.empty()) + throw INTERP_KERNEL::Exception("Voronoize1D : a point is outside domain !"); + if(polygsToIterOn.size()>2) + throw INTERP_KERNEL::Exception("Voronoize1D : overlap of points !"); + std::vector< MCAuto > newVorCells; + for(std::vector::const_iterator it=polygsToIterOn.begin();it!=polygsToIterOn.end();it++) + { + int poly(*it); + // + double seed(pts[poly]),zept(*pt); + double mid((seed+zept)/2.); + // + MCAuto tile(l0[poly]); + tile->zipCoords(); + double a,b; + { + const int *connPtr(tile->getNodalConnectivity()->begin()); + const double *coordPtr(tile->getCoords()->begin()); + a=coordPtr[connPtr[1]]; b=coordPtr[connPtr[2]]; + } + double pol0[2],pol1[2]; + MCAuto t0(DataArrayDouble::New()); t0->alloc(3,1); t0->setIJ(0,0,zept); t0->setIJ(1,0,mid); t0->setIJ(2,0,seed); + t0->applyLin(1.,-a); + if(t0->isMonotonic(true,eps)) + { pol0[0]=a; pol0[1]=mid; pol1[0]=mid; pol1[1]=b; } + else + { pol1[0]=a; pol1[1]=mid; pol0[0]=mid; pol0[1]=b; } + MCAuto modifiedCell(MEDCouplingUMesh::New("",1)); modifiedCell->allocateCells(); + MCAuto coo1(DataArrayDouble::New()); coo1->alloc(2,1); coo1->setIJ(0,0,pol1[0]); coo1->setIJ(1,0,pol1[1]); + modifiedCell->setCoords(coo1); modifiedCell->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,CONN_SEG2_DFT); + // + MCAuto newVorCell(MEDCouplingUMesh::New("",1)); newVorCell->allocateCells(); + MCAuto coo2(DataArrayDouble::New()); coo2->alloc(2,1); coo2->setIJ(0,0,pol0[0]); coo2->setIJ(1,0,pol0[1]); + newVorCell->setCoords(coo2); newVorCell->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,CONN_SEG2_DFT); + // + l0[poly]=modifiedCell; + newVorCells.push_back(newVorCell); + } + l0.push_back(MergeVorCells1D(newVorCells,eps)); + } + std::vector< const MEDCouplingUMesh * > l0Bis(VecAutoToVecOfCstPt(l0)); + MCAuto ret(MEDCouplingUMesh::MergeUMeshes(l0Bis)); + { + bool dummy; int dummy2; + MCAuto dummy3(ret->mergeNodes(eps,dummy,dummy2)); + } + return ret; +} + MCAuto MEDCoupling::Voronizer2D::doIt(const MEDCouplingUMesh *m, const DataArrayDouble *points, double eps) const { if(!m || !points) diff --git a/src/MEDCoupling/MEDCouplingVoronoi.hxx b/src/MEDCoupling/MEDCouplingVoronoi.hxx index 6047ecd93..261c63724 100644 --- a/src/MEDCoupling/MEDCouplingVoronoi.hxx +++ b/src/MEDCoupling/MEDCouplingVoronoi.hxx @@ -35,6 +35,13 @@ namespace MEDCoupling virtual ~Voronizer(); }; + class Voronizer1D : public Voronizer + { + public: + MCAuto doIt(const MEDCouplingUMesh *m, const DataArrayDouble *points, double eps) const; + int getDimension() const; + }; + class Voronizer2D : public Voronizer { public: diff --git a/src/MEDCoupling_Swig/MEDCouplingBasicsTest5.py b/src/MEDCoupling_Swig/MEDCouplingBasicsTest5.py index 3f3af10cb..45c3ae72b 100644 --- a/src/MEDCoupling_Swig/MEDCouplingBasicsTest5.py +++ b/src/MEDCoupling_Swig/MEDCouplingBasicsTest5.py @@ -4751,6 +4751,8 @@ class MEDCouplingBasicsTest5(unittest.TestCase): ##### fieldOnCell=field.voronoize(1e-12); fieldOnCell.checkConsistencyLight() + self.assertEqual(fieldOnCell.getMesh().getSpaceDimension(),3) + self.assertEqual(fieldOnCell.getMesh().getMeshDimension(),2) self.assertEqual(field.getMesh().getSpaceDimension(),fieldOnCell.getMesh().getSpaceDimension()) self.assertTrue(fieldOnCell.getArray().isEqual(field.getArray(),1e-12)) meaRef=field.getMesh().getMeasureField(True).getArray() @@ -4761,6 +4763,39 @@ class MEDCouplingBasicsTest5(unittest.TestCase): mea2=mea.sumPerTuple() self.assertTrue(mea2.isEqual(meaRef,1e-12)) pass + + def testVoronoi1D_1(self): + tmp=MEDCouplingCMesh("mesh") + arr=DataArrayDouble(5) ; arr.iota() + tmp.setCoords(arr) + tmp=tmp.build1SGTUnstructured() + tmp1=tmp.deepCopy() + tmp.changeSpaceDimension(2,0.) + tmp.getCoords()[:,1]=pi/(len(arr)-1)*tmp.getCoords()[:,0] + tmp.getCoords()[:,0]=1. + tmp.setCoords(tmp.getCoords().fromPolarToCart()) + tmp.changeSpaceDimension(3,1.) + # + field=MEDCouplingFieldDouble(ON_GAUSS_PT) + field.setName("MyFieldPG") ; field.setMesh(tmp) + field.setGaussLocalizationOnType(NORM_SEG2,[-1.,1.],[-0.9,-0.8,0.2,0.4,0.5,0.9],[0.1,0.1,0.1,0.1,0.1,0.5]) + arr=DataArrayDouble(field.getNumberOfTuplesExpected()) ; arr.iota() + field.setArray(arr) + field.checkConsistencyLight() + #### + fieldOnCell=field.voronoize(1e-12); + fieldOnCell.checkConsistencyLight() + self.assertEqual(fieldOnCell.getMesh().getSpaceDimension(),3) + self.assertEqual(fieldOnCell.getMesh().getMeshDimension(),1) + assert(fieldOnCell.getArray().isEqual(field.getArray(),1e-12)) + meaRef=field.getMesh().getMeasureField(True).getArray() + mea=fieldOnCell.getMesh().getMeasureField(True).getArray() + self.assertEqual(field.getDiscretization().getNbOfGaussLocalization(),1) + self.assertEqual(field.getDiscretization().getGaussLocalization(0).getNumberOfGaussPt(),6) + mea.rearrange(6) + mea2=mea.sumPerTuple() + self.assertTrue(mea2.isEqual(meaRef,1e-12)) + pass pass -- 2.39.2