*/
int MEDCoupling1GTUMesh::getCellContainingPoint(const double *pos, double eps) const
{
- MCAuto<MEDCouplingUMesh> m=buildUnstructured();
+ MCAuto<MEDCouplingUMesh> m(buildUnstructured());
return m->getCellContainingPoint(pos,eps);
}
+/*!
+ * to improve perf !
+ */
+void MEDCoupling1GTUMesh::getCellsContainingPoint(const double *pos, double eps, std::vector<int>& elts) const
+{
+ MCAuto<MEDCouplingUMesh> m(buildUnstructured());
+ return m->getCellsContainingPoint(pos,eps,elts);
+}
+
MEDCouplingFieldDouble *MEDCoupling1GTUMesh::buildOrthogonalField() const
{
MCAuto<MEDCouplingUMesh> m=buildUnstructured();
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<int>& 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);
return ret;
}
+void MEDCouplingCMesh::getCellsContainingPoint(const double *pos, double eps, std::vector<int>& 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 !");
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<int>& 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);
}
}
+void MEDCouplingCurveLinearMesh::getCellsContainingPoint(const double *pos, double eps, std::vector<int>& 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))
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<int>& 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);
const MEDCouplingMesh *mesh(getMesh());
INTERP_KERNEL::AutoCppPtr<Voronizer> 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;
return ret;
}
+void MEDCouplingIMesh::getCellsContainingPoint(const double *pos, double eps, std::vector<int>& 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 !");
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<int>& 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);
throw INTERP_KERNEL::Exception("MEDCouplingMappedExtrudedMesh::getCellContainingPoint : not implemented yet !");
}
+void MEDCouplingMappedExtrudedMesh::getCellsContainingPoint(const double *pos, double eps, std::vector<int>& elts) const
+{
+ throw INTERP_KERNEL::Exception("MEDCouplingMappedExtrudedMesh::getCellsContainingPoint : not implemented yet !");
+}
+
MEDCouplingMappedExtrudedMesh::~MEDCouplingMappedExtrudedMesh()
{
}
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<int>& elts) const;
MEDCOUPLING_EXPORT static int FindCorrespCellByNodalConn(const std::vector<int>& nodalConnec,
const int *revNodalPtr, const int *revNodalIndxPtr);
MEDCOUPLING_EXPORT static void Project1DMeshes(const MEDCouplingUMesh *m1, const MEDCouplingUMesh *m2, double eps,
#include "MEDCouplingMesh.hxx"
#include "MEDCouplingUMesh.hxx"
-#include "MEDCouplingMemArray.hxx"
+#include "MEDCouplingMemArray.txx"
#include "MEDCouplingFieldDouble.hxx"
#include "MEDCouplingFieldDiscretization.hxx"
#include "MCAuto.hxx"
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".<br>
- * \ref py_mcumesh_getCellsContainingPoint "Here is a Python example".
- * \endif
- */
-void MEDCouplingMesh::getCellsContainingPoint(const double *pos, double eps, std::vector<int>& 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
const double *work(pos);
for(int i=0;i<nbOfPoints;i++,work+=spaceDim)
{
- int ret=getCellContainingPoint(work,eps);
- if(ret>=0)
- {
- elts->pushBackSilent(ret);
- eltsIndexPtr[i+1]=eltsIndexPtr[i]+1;
- }
- else
- eltsIndexPtr[i+1]=eltsIndexPtr[i];
+ std::vector<int> ret;
+ getCellsContainingPoint(work,eps,ret);
+ elts->insertAtTheEnd(ret.begin(),ret.end());
+ eltsIndexPtr[i+1]=elts->getNumberOfTuples();
}
}
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<int>& elts) const;
+ MEDCOUPLING_EXPORT virtual void getCellsContainingPoint(const double *pos, double eps, std::vector<int>& elts) const = 0;
MEDCOUPLING_EXPORT virtual void getCellsContainingPoints(const double *pos, int nbOfPoints, double eps, MCAuto<DataArrayInt>& elts, MCAuto<DataArrayInt>& 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;
{
}
+int Voronizer1D::getDimension() const
+{
+ return 1;
+}
+
int Voronizer2D::getDimension() const
{
return 2;
return ret;
}
+MCAuto<MEDCouplingUMesh> MergeVorCells1D(const std::vector< MCAuto<MEDCouplingUMesh> >& 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<MEDCouplingUMesh> ret(MEDCouplingUMesh::New("",1)); ret->allocateCells(); ret->insertNextCell(INTERP_KERNEL::NORM_SEG2,2,CONN_SEG2_DFT);
+ MCAuto<DataArrayDouble> coo(DataArrayDouble::New()); coo->alloc(2,1); ret->setCoords(coo);
+ if(fabs(b0-a1)<eps)
+ { coo->setIJ(0,0,a0); coo->setIJ(1,0,b1); }
+ else if(fabs(b1-a0)<eps)
+ { coo->setIJ(0,0,b0); coo->setIJ(1,0,a1); }
+ return ret;
+}
+
+MCAuto<MEDCouplingUMesh> 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<double> bbox(4);
+ m->getBoundingBox(&bbox[0]);
+ std::vector< MCAuto<MEDCouplingUMesh> > l0(1,MCAuto<MEDCouplingUMesh>(m->deepCopy()));
+ const double *pts(points->begin());
+ for(int i=1;i<nbPts;i++)
+ {
+ MCAuto<MEDCouplingUMesh> vorTess;
+ {
+ std::vector< const MEDCouplingUMesh * > l0Bis(VecAutoToVecOfCstPt(l0));
+ vorTess=MEDCouplingUMesh::MergeUMeshes(l0Bis);
+ }
+ {
+ bool dummy;
+ int newNbNodes;
+ MCAuto<DataArrayInt> dummy3(vorTess->mergeNodes(eps,dummy,newNbNodes));
+ }
+ std::vector<int> 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<MEDCouplingUMesh> > newVorCells;
+ for(std::vector<int>::const_iterator it=polygsToIterOn.begin();it!=polygsToIterOn.end();it++)
+ {
+ int poly(*it);
+ //
+ double seed(pts[poly]),zept(*pt);
+ double mid((seed+zept)/2.);
+ //
+ MCAuto<MEDCouplingUMesh> 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<DataArrayDouble> 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<MEDCouplingUMesh> modifiedCell(MEDCouplingUMesh::New("",1)); modifiedCell->allocateCells();
+ MCAuto<DataArrayDouble> 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<MEDCouplingUMesh> newVorCell(MEDCouplingUMesh::New("",1)); newVorCell->allocateCells();
+ MCAuto<DataArrayDouble> 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<MEDCouplingUMesh> ret(MEDCouplingUMesh::MergeUMeshes(l0Bis));
+ {
+ bool dummy; int dummy2;
+ MCAuto<DataArrayInt> dummy3(ret->mergeNodes(eps,dummy,dummy2));
+ }
+ return ret;
+}
+
MCAuto<MEDCouplingUMesh> MEDCoupling::Voronizer2D::doIt(const MEDCouplingUMesh *m, const DataArrayDouble *points, double eps) const
{
if(!m || !points)
virtual ~Voronizer();
};
+ class Voronizer1D : public Voronizer
+ {
+ public:
+ MCAuto<MEDCouplingUMesh> doIt(const MEDCouplingUMesh *m, const DataArrayDouble *points, double eps) const;
+ int getDimension() const;
+ };
+
class Voronizer2D : public Voronizer
{
public:
#####
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()
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