Forked from
gmsh / gmsh
8448 commits behind the upstream repository.
-
Christophe Geuzaine authoredChristophe Geuzaine authored
BackgroundMesh2D.h 4.04 KiB
// Gmsh - Copyright (C) 1997-2016 C. Geuzaine, J.-F. Remacle
//
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to the public mailing list <gmsh@onelab.info>.
#ifndef _BACKGROUND_MESH2D_H_
#define _BACKGROUND_MESH2D_H_
#include <string>
#include <map>
#include <vector>
#include "Pair.h"
#include "STensor3.h"
#include "BGMBase.h"
class MTriangle;
using namespace std;
/*
The backgroundMesh2D creates a bunch of triangles on the parametric space of a GFace.
Those triangles are local to the backgroundMesh2D so that
they do not depend on the actual mesh that can be deleted.
It extends the sizefield from the edges.
*/
class backgroundMesh2D : public BGMBase {
protected:
virtual void propagateValues(DoubleStorageType &dirichlet,
simpleFunction<double> &eval_diffusivity,
bool in_parametric_plane = false);
virtual void computeSizeField();
virtual inline unsigned int getNumMeshElements()const{return elements.size();}
virtual const MElement* getElement(unsigned int i)const;
virtual GPoint get_GPoint_from_MVertex(const MVertex *) const;
// only 2D:
void updateSizes();
// copy the mesh stored in GFace in local
void create_mesh_copy();
// creates a mesh of GFace and store it in local !!!, does not store the mesh in GFace !
void create_face_mesh();
double sizeFactor;
std::vector<MTriangle*> tempTR;
vector<MElement*> elements;
vector<MVertex*> vertices;
map<MVertex*,MVertex*> _3Dto2D;
map<MVertex*,MVertex*> _2Dto3D;
public:
backgroundMesh2D(GFace *, bool erase_2D3D=true);
virtual ~backgroundMesh2D();
virtual MElementOctree* getOctree();
// TODO: only 2D
virtual void reset(bool erase_2D3D=true);// deletes everything and rebuild with GFace*
virtual void unset();// deletes everything... called by destructor.
// not used !!!! TODO !!!
void setSizeFactor (double s) {sizeFactor = s;}
virtual vector<MVertex*>::iterator beginvertices(){ return vertices.begin(); }
virtual vector<MVertex*>::iterator endvertices(){ return vertices.end(); }
virtual vector<MElement*>::iterator beginelements(){ return elements.begin(); }
virtual vector<MElement*>::iterator endelements(){ return elements.end(); }
virtual vector<MVertex*>::const_iterator beginvertices() const { return vertices.begin(); }
virtual vector<MVertex*>::const_iterator endvertices() const { return vertices.end(); }
virtual vector<MElement*>::const_iterator beginelements() const { return elements.begin(); }
virtual vector<MElement*>::const_iterator endelements() const { return elements.end(); }
};
class RK_form{ // informations for RK at one point
public:
RK_form() : angle(0.), localsize(0.)
{
}
SMetric3 metricField;
SVector3 t1, t2;// 3D cross field directions
SVector3 normal;// 3D cross field directions
pair<double,double> h;// 3D sizes
pair<double,double> paramh;// sizes in parametric domain
SPoint2 paramt1, paramt2;
double angle, localsize;
};
class frameFieldBackgroundMesh2D : public backgroundMesh2D {
private:
// specification for cross field
DoubleStorageType angles; // an attached angle
DoubleStorageType smoothness;
void computeCrossField(simpleFunction<double> &eval_diffusivity);
void computeSmoothness();
public:
frameFieldBackgroundMesh2D(GFace *_gf);
virtual ~frameFieldBackgroundMesh2D();
virtual void reset(bool erase_2D3D=true);
double angle(double u, double v);
double angle(MVertex *v);
double get_smoothness(double u, double v);
double get_smoothness(MVertex *v);
void eval_crossfield(double u, double v, STensor3 &cf);
void eval_crossfield(MVertex *vert, STensor3 &cf);
void exportCrossField(const string &filename);
Pair<SVector3, SVector3> compute_crossfield_directions(double u,double v,
double angle_current);
bool compute_RK_infos(double u,double v, double x, double y, double z,RK_form &infos);
inline void exportSmoothness(const string &filename) const
{
export_scalar(filename,smoothness);
}
};
#endif