Skip to content
Snippets Groups Projects
Commit 8e399b40 authored by Jean-François Remacle's avatar Jean-François Remacle
Browse files

Added Compound Line possibilities

parent d7f6bb25
No related branches found
No related tags found
No related merge requests found
......@@ -271,10 +271,13 @@ bool GEdge::XYZToU(const SVector3 &Q, double &u, const double relax) const
double err, err2;
int iter;
Range<double> uu = parBounds(0);
double uMin = uu.low();
double uMax = uu.high();
printf("dans GEdge uMin=%g, uMax=%g \n", uMin, uMax);
SVector3 P;
double init[NumInitGuess];
......@@ -288,6 +291,8 @@ bool GEdge::XYZToU(const SVector3 &Q, double &u, const double relax) const
err = 1.0;
iter = 1;
SVector3 dPQ = P - Q;
err2 = dPQ.norm();
......
......@@ -74,6 +74,10 @@ class GEdge : public GEntity {
GPoint gp = point(p);
return SVector3(gp.x(), gp.y(), gp.z());
}
// return the parmater location on the edge given a point in space
// that is on the edge
//virtual double parFromPoint(const SPoint3 &) const;
// get first derivative of edge at the given parameter
virtual SVector3 firstDer(double par) const = 0;
......
......@@ -97,7 +97,7 @@ Range<double> GEdgeCompound::parBounds(int i) const {
/*
+--------+-----------+----------- ... ----+
0 _par[1] _par[2] _par[N-1]
0 _pars[1] _pars[2] _pars[N-1]
*/
......@@ -105,8 +105,9 @@ void GEdgeCompound::getLocalParameter ( const double &t,
int &iEdge,
double & tLoc) const
{
for (iEdge=0 ; iEdge<_compound.size() ;iEdge++){
// printf("iEdge %d par %g\n",iEdge,_pars[iEdge]);
//printf("iEdge=%d tmin=%g\n",iEdge,_pars[iEdge]);
double tmin = _pars[iEdge];
double tmax = _pars[iEdge+1];
if (t >= tmin && t <= tmax){
......@@ -114,7 +115,7 @@ void GEdgeCompound::getLocalParameter ( const double &t,
tLoc = _orientation[iEdge] ?
b.low() + (t-tmin)/(tmax-tmin) * (b.high()-b.low()) :
b.high() - (t-tmin)/(tmax-tmin) * (b.high()-b.low()) ;
// printf("%g %g %d\n",t,tLoc,iEdge);
//printf("bhigh=%g, blow=%g, global t=%g , tLoc=%g ,iEdge=%d\n",b.high(), b.low(), t,tLoc,iEdge);
return;
}
}
......@@ -127,6 +128,11 @@ void GEdgeCompound::parametrize()
Range<double> b = _compound[i]->parBounds(0);
_pars.push_back(_pars[_pars.size()-1]+(b.high() - b.low()));
}
// for (int i=0;i<_compound.size()+1;i++){
// printf("_pars[%d]=%g\n",i, _pars[i] );
//}
}
......@@ -143,7 +149,7 @@ GPoint GEdgeCompound::point(double par) const
double tLoc;
int iEdge;
getLocalParameter(par,iEdge,tLoc);
// printf("compound %d par %g edge %d loc %g\n",tag(),par,iEdge,tLoc);
//printf("compound %d par %g edge %d loc %g\n",tag(),par,iEdge,tLoc);
return _compound[iEdge]->point(tLoc);
}
......
......@@ -20,11 +20,11 @@ class GEdgeCompound : public GEdge {
std::vector<double> _pars;
void parametrize() ;
void orderEdges() ;
public:
void getLocalParameter ( const double &t,
int &iEdge,
double & tLoc) const;
public:
GEdgeCompound(GModel *m, int tag, std::vector<GEdge*> &compound);
virtual ~GEdgeCompound();
Range<double> parBounds(int i) const;
......@@ -36,7 +36,7 @@ public:
virtual double curvature(double t) const;
virtual int minimumMeshSegments() const;
virtual int minimumDrawSegments() const;
std::vector<GEdge*> getEdgesOfCompound() const { return _compound; }
};
#endif
......@@ -16,11 +16,11 @@
class gmshGradientBasedDiffusivity : public gmshFunction<double>
{
private:
private:
MElement *_current;
int _iComp;
mutable std::map<MVertex*, SPoint2> _coordinates;
public:
public:
gmshGradientBasedDiffusivity (std::map<MVertex*,SPoint2> &coordinates)
: _current (0), _iComp(-1),_coordinates(coordinates){}
void setCurrent (MElement *current){ _current = current; }
......@@ -47,10 +47,10 @@ class gmshGradientBasedDiffusivity : public gmshFunction<double>
class gmshDistanceBasedDiffusivity : public gmshFunction<double>
{
private:
private:
MElement *_current;
mutable std::map<MVertex*, SPoint3> _coordinates;
public:
public:
gmshDistanceBasedDiffusivity (std::map<MVertex*,SPoint3> &coordinates)
: _current (0),_coordinates(coordinates){}
void setCurrent (MElement *current){ _current = current; }
......@@ -79,6 +79,7 @@ static void fixEdgeToValue(GEdge *ed, double value, gmshAssembler<double> &myAss
void GFaceCompound::parametrize() const
{
if (!oct){
coordinates.clear();
parametrize(ITERD);
......@@ -152,6 +153,8 @@ GFaceCompound::~GFaceCompound()
}
}
static bool orderVertices(const std::list<GEdge*> &e, std::vector<MVertex*> &l,
std::vector<double> &coord)
{
......@@ -213,6 +216,99 @@ static bool orderVertices(const std::list<GEdge*> &e, std::vector<MVertex*> &l,
return true;
}
SPoint2 GFaceCompound::getCoordinates(MVertex *v) const
{
parametrize() ;
std::map<MVertex*,SPoint3>::iterator it = coordinates.find(v);
// return SPoint2(it->second.x(),it->second.y());
if(it != coordinates.end()){
return SPoint2(it->second.x(),it->second.y());
}
else{
double tGlob, tLoc;
double tL, tR;
int iEdge;
//getParameter Point
v->getParameter(0,tGlob);
//printf("global param for point (%g, %g, %g ) = %g\n", v->x(), v->y(), v->z(), tGlob);
//find compound Edge
GEdgeCompound *gec = dynamic_cast<GEdgeCompound*>(v->onWhat());
//printf("tag compound=%d, beginvertex=%d, endvertex=%d \n", gec->tag(), gec->getBeginVertex()->tag(), gec->getEndVertex()->tag());
if (gec){
//compute local parameter on Edge
gec->getLocalParameter(tGlob,iEdge,tLoc);
std::vector<GEdge*> gev = gec->getEdgesOfCompound();
GEdge *ge = gev[iEdge];
//printf("iEdge =%d, leftV =%d, rightV=%d, and local param=%g \n", ge->tag(), ge->getBeginVertex()->tag(), ge->getEndVertex()->tag(), tLoc);
//left and right vertex of the Edge
MVertex *v0 = ge->getBeginVertex()->mesh_vertices[0];
MVertex *v1 = ge->getEndVertex()->mesh_vertices[0];
std::map<MVertex*,SPoint3>::iterator itL = coordinates.find(v0);
std::map<MVertex*,SPoint3>::iterator itR = coordinates.find(v1);
//for the Edge, find the left and right vertices of the initial 1D mesh and interpolate to find (u,v)
//printf("number of vertices =%d for Edge =%d \n", ge->mesh_vertices.size(), ge->tag());
MVertex *vL = v0;
MVertex *vR = v1;
double xL = vL->x();
double yL = vL->y();
double zL = vL->z();
tL = ge->parBounds(0).low();
tR = ge->parBounds(0).high();
//printf("tLeftEDGE=%g tRightEDGE=%g, tLoc=%g\n", tL, tR, tLoc);
int j = 0;
//printf("j =%d, veL (%g,%g,%g), -> uv= (%g,%g)\n",j,xL,yL,zL, itL->second.x(), itL->second.y());
bool found = false;
while (j < ge->mesh_vertices.size()){
vR = ge->mesh_vertices[j];
double xR=vR->x();
double yR=vR->y();
double zR=vR->z();
//printf("*** L=(%g,%g,%g) et R=(%g,%g,%g)\n",xL,yL,zL, vR->x(), vR->y(), vR->z());
//printf("conditions XL %g < %g, yL %g < %g, zL %g < %g \n", fabs(v->x()-xL) , fabs(xL-xR), fabs(v->y()-yL), fabs(yL-yR), fabs(v->z()-zL) , fabs (zL-zR));
//printf("conditions XR %g < %g, yR %g < %g, zR %g < %g \n", fabs(v->x()-vR->x()) , fabs(xL-xR),fabs(v->y()-vR->y()), fabs(yL-yR),fabs(v->z()-vR->z()) , fabs (zL-zR));
if (fabs(v->x()-xL) <= fabs(xL-xR) && fabs(v->y()-yL) <= fabs(yL-yR) && fabs(v->z()-zL) <= fabs (zL-zR) &&
fabs(v->x()-vR->x()) <= fabs(xL-xR) && fabs(v->y()-vR->y()) <= fabs(yL-yR) && fabs(v->z()-vR->z()) <= fabs(zL-zR)){
found = true;
itR = coordinates.find(vR);
vR->getParameter(0,tR);
break;
}
else{
xL = xR; yL = yR ; zL = zR;
itL = coordinates.find(vR);
vL = vR;
vL->getParameter(0,tL);
}
j++;
//printf("in while j =%d, vL (%g,%g,%g), -> uv= (%g,%g)\n",j, vL->x(), vL->y(), vL->z(), itL->second.x(), itL->second.y());
}
if (!found) vR=v1;
//printf("vL (%g,%g,%g), -> uv= (%g,%g)\n",vL->x(), vL->y(), vL->z(), itL->second.x(), itL->second.y());
//printf("vR (%g,%g,%g), -> uv= (%g,%g)\n",vR->x(), vR->y(), vR->z(), itR->second.x(), itR->second.y());
//printf("tL:%g, tR=%g, tLoc=%g \n", tL, tR, tLoc);
//Linear interpolation between tL and tR
double uloc, vloc;
uloc = itL->second.x() + (tLoc-tL)/(tR-tL) * (itR->second.x()-itL->second.x());
vloc = itL->second.y() + (tLoc-tL)/(tR-tL) * (itR->second.y()-itL->second.y());
//printf("uloc=%g, vloc=%g \n", uloc,vloc);
//printf("Vertex coordinates not found in compound face \n");
//exit(0);
return SPoint2(uloc,vloc);
}
}
}
void GFaceCompound::parametrize(iterationStep step) const
{
Msg::Info("Parametrizing Surface %d coordinate (ITER %d)", tag(), step);
......@@ -383,18 +479,18 @@ double GFaceCompound::curvature(const SPoint2 &param) const
return 0.0;
}
// if (lt->gf && lt->gf->geomType() != GEntity::DiscreteSurface){
// SPoint2 pv1, pv2, pv3;
// bool ok = reparamMeshVertexOnFace(lt->t->getVertex(0), lt->gf, pv1);
// ok |= reparamMeshVertexOnFace(lt->t->getVertex(1), lt->gf, pv2);
// ok |= reparamMeshVertexOnFace(lt->t->getVertex(2), lt->gf, pv3);
// if (ok){
// SPoint2 pv = pv1*(1.-U-V) + pv2*U + pv3*V;
// return lt->gf->curvature(pv));
// }
// }
// return curvature(lt->t);
// if (lt->gf && lt->gf->geomType() != GEntity::DiscreteSurface){
// SPoint2 pv1, pv2, pv3;
// bool ok = reparamMeshVertexOnFace(lt->t->getVertex(0), lt->gf, pv1);
// ok |= reparamMeshVertexOnFace(lt->t->getVertex(1), lt->gf, pv2);
// ok |= reparamMeshVertexOnFace(lt->t->getVertex(2), lt->gf, pv3);
// if (ok){
// SPoint2 pv = pv1*(1.-U-V) + pv2*U + pv3*V;
// return lt->gf->curvature(pv));
// }
// }
// return curvature(lt->t);
return 0.;
}
......@@ -418,7 +514,7 @@ GPoint GFaceCompound::point(double par1, double par2) const
getTriangle (par1, par2, &lt, U,V);
SPoint3 p(0, 0, 0);
if (!lt){
Msg::Warning("Re-Parametrized face %d --> point (%g %g) lies outside the domain", tag(), par1,par2);
// Msg::Warning("Re-Parametrized face %d --> point (%g %g) lies outside the domain", tag(), par1,par2);
return GPoint(p.x(),p.y(),p.z(),this);
}
......
......@@ -8,6 +8,7 @@
#include "GFace.h"
#include "GEdge.h"
#include "GEdgeCompound.h"
/*
A GFaceCompound is a model face that is the compound of model faces.
......@@ -71,11 +72,9 @@ public:
virtual GEntity::GeomType geomType() const { return CompoundSurface; }
ModelType getNativeType() const { return GmshModel; }
void * getNativePtr() const { return 0; }
SPoint2 getCoordinates(MVertex *v) const {
parametrize() ;
std::map<MVertex*,SPoint3>::iterator it = coordinates.find(v);
return SPoint2(it->second.x(),it->second.y());
}
virtual SPoint2 getCoordinates(MVertex *v) const;
virtual bool buildRepresentationCross(){ return false; }
virtual double curvature(const SPoint2 &param) const;
private:
......
......@@ -234,6 +234,7 @@ void deMeshGEdge::operator() (GEdge *ge)
void meshGEdge::operator() (GEdge *ge)
{
ge->model()->setCurrentMeshEntity(ge);
if(ge->geomType() == GEntity::DiscreteCurve) return;
......
......@@ -384,13 +384,13 @@ static bool gmsh2DMeshGenerator(GFace *gf, int RECUR_ITER,
while(it != edges.end()){
if ((*it)->getCompound()){
mySet.insert((*it)->getCompound());
printf("compound edge %d found in %d\n",(*it)->getCompound()->tag(), (*it)->tag());
//printf("compound edge %d found in %d\n",(*it)->getCompound()->tag(), (*it)->tag());
}
else
mySet.insert(*it);
++it;
}
printf("replacing %d edges by %d in the compound %d\n",edges.size(),mySet.size(),gf->tag());
//printf("Replacing %d edges by %d in the compound %d\n",edges.size(),mySet.size(),gf->tag());
edges.clear();
edges.insert(edges.begin(), mySet.begin(), mySet.end());
}
......@@ -455,7 +455,7 @@ static bool gmsh2DMeshGenerator(GFace *gf, int RECUR_ITER,
reparamMeshVertexOnFace(here, gf, param);
U_[count] = param[0];
V_[count] = param[1];
// printf("coucou : %g %g -> %g %g\n",here->x(),here->y(),param.x(),param.y());
//printf("*** meshGFace : %g %g -> u,v = %g %g\n",here->x(),here->y(),param.x(),param.y());
(*itv)->setIndex(count);
numbered_vertices[(*itv)->getIndex()] = *itv;
bbox += SPoint3(param.x(), param.y(), 0);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment