Commit 38b963b4 by Jean-François Remacle

A

Merge branch 'new_reparametrization' of http://gitlab.onelab.info/gmsh/gmsh into new_reparametrization
parents 4ca55e0f 0e3cf793
Pipeline #1396 failed with stage
in 15 minutes 27 seconds
3.1.0: new C++, C and Python API (in beta); new MSH4 format (in beta); new
partitioning code based on Metis 5; new 3D tetrahedralization algorithm as
default; new compound entities workflow for remeshing (as meshing constraints);
added support for general b-splines with OpenCASCADE kernel; uniformize entity
added support for general b-splines with OpenCASCADE kernel; uniformized entity
naming conventions (line/curve, vertex/node, etc.); generalized handling of
"all" entities in geo file (using {:} notation); removed old CAD creation
factory (GModelFactory), old reparametrization code
......
......@@ -52,7 +52,7 @@ opt(GETDP "Enable GetDP solver (as a directly linked library)" ${DEFAULT})
opt(GMM "Enable GMM linear solvers (simple alternative to PETSc)" ${DEFAULT})
opt(GMP "Enable GMP for Kbipack (advanced)" ON)
opt(GRAPHICS "Enable building graphics lib even without GUI (advanced)" OFF)
opt(HXT "Enable HXT library" OFF)
opt(HXT "Enable HXT library" ${DEFAULT})
opt(INTERNAL_DEVELOPER_API "Enable internal developer API" OFF)
opt(KBIPACK "Enable Kbipack (neeeded by homology solver)" ${DEFAULT})
opt(MATHEX "Enable math expression parser (used by plugins and options)" ${DEFAULT})
......@@ -1786,8 +1786,9 @@ if(TEXI2PDF)
install(FILES ${TEX_DIR}/gmsh.pdf DESTINATION ${GMSH_DOC} OPTIONAL)
endif(TEXI2PDF)
execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${OPT_TEXI}"
OUTPUT_FILE cmake_options.texi)
execute_process(COMMAND ${CMAKE_COMMAND} -E echo
"@c This file was generated by cmake: do not edit manually!\n${OPT_TEXI}"
OUTPUT_FILE cmake_options.texi)
if(MAKEINFO AND TEXI2PDF)
add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E tar zcf
......
......@@ -745,10 +745,7 @@ void PrintOptions(int num, int level, int diff, int help, const char *filename,
void PrintOptionsDoc()
{
const char *warn =
"@c\n"
"@c This file is generated automatically by running \"gmsh -doc\".\n"
"@c Do not edit by hand!\n"
"@c\n\n";
"@c This file was generated by \"gmsh -doc\": do not edit manually!\n\n";
{
FILE *file = Fopen("opt_general.texi", "w");
......
......@@ -2149,11 +2149,15 @@ bool OCC_Internals::_extrude(int mode,
return false;
}
TopoDS_Wire wire = TopoDS::Wire(_tagWire.Find(wireTag));
BRepOffsetAPI_MakePipe p(wire, c, GeomFill_IsCorrectedFrenet);
/* GeomFill_IsCorrectedFrenet, GeomFill_IsFixed, GeomFill_IsFrenet,
GeomFill_IsConstantNormal, GeomFill_IsDarboux, GeomFill_IsGuideAC,
GeomFill_IsGuidePlan, GeomFill_IsGuideACWithContact,
GeomFill_IsGuidePlanWithContact, GeomFill_IsDiscreteTrihedron */
BRepOffsetAPI_MakePipe p(wire, c, GeomFill_IsDiscreteTrihedron);
// Available choices:
// GeomFill_IsCorrectedFrenet, GeomFill_IsFixed, GeomFill_IsFrenet,
// GeomFill_IsConstantNormal, GeomFill_IsDarboux, GeomFill_IsGuideAC,
// GeomFill_IsGuidePlan, GeomFill_IsGuideACWithContact,
// GeomFill_IsGuidePlanWithContact, GeomFill_IsDiscreteTrihedron
// DiscreteTrihedron seems the most robust; CorrectedFrenet e.g. fails on
// very simple cases with straight extrusions. We might want to make this
// an option.
p.Build();
if(!p.IsDone()){
Msg::Error("Could not create pipe");
......
......@@ -10,6 +10,8 @@
#include "Numeric.h"
#include "Context.h"
static double fd_eps = 1e-8;
static void InterpolateCatmullRom(Vertex *v[4], double t, Vertex &V)
{
V.lc = (1 - t) * v[1]->lc + t * v[2]->lc;
......@@ -315,8 +317,8 @@ Vertex InterpolateCurve(Curve *c, double u, int derivee)
V.u = u;
break;
default :
double eps1 = (u < 1e-5) ? 0 : 1.e-5;
double eps2 = (u > 1 - 1e-5) ? 0 : 1.e-5;
double eps1 = (u < fd_eps) ? 0 : fd_eps;
double eps2 = (u > 1 - fd_eps) ? 0 : fd_eps;
Vertex D[2];
D[0] = InterpolateCurve(c, u - eps1, 0);
D[1] = InterpolateCurve(c, u + eps2, 0);
......@@ -342,8 +344,8 @@ Vertex InterpolateCurve(Curve *c, double u, int derivee)
V.u = u;
break;
default :
double eps1 = (u < 1e-5) ? 0 : 1.e-5;
double eps2 = (u > 1 - 1e-5) ? 0 : 1.e-5;
double eps1 = (u < fd_eps) ? 0 : fd_eps;
double eps2 = (u > 1 - fd_eps) ? 0 : fd_eps;
Vertex D[2];
D[0] = InterpolateCurve(c, u - eps1, 1);
D[1] = InterpolateCurve(c, u + eps2, 1);
......@@ -834,68 +836,66 @@ static Vertex InterpolateExtrudedSurface(Surface *s, double u, double v)
Vertex InterpolateSurface(Surface *s, double u, double v, int derivee, int u_v)
{
if(derivee == 1) {
double eps = 1.e-8;
Vertex D[4];
if(u_v == 1) {
if(u - eps < 0.0) {
if(u - fd_eps < 0.0) {
D[0] = InterpolateSurface(s, u, v, 0, 0);
D[1] = InterpolateSurface(s, u + eps, v, 0, 0);
D[1] = InterpolateSurface(s, u + fd_eps, v, 0, 0);
}
else {
D[0] = InterpolateSurface(s, u - eps, v, 0, 0);
D[0] = InterpolateSurface(s, u - fd_eps, v, 0, 0);
D[1] = InterpolateSurface(s, u, v, 0, 0);
}
}
else {
if(v - eps < 0.0) {
if(v - fd_eps < 0.0) {
D[0] = InterpolateSurface(s, u, v, 0, 0);
D[1] = InterpolateSurface(s, u, v + eps, 0, 0);
D[1] = InterpolateSurface(s, u, v + fd_eps, 0, 0);
}
else {
D[0] = InterpolateSurface(s, u, v - eps, 0, 0);
D[0] = InterpolateSurface(s, u, v - fd_eps, 0, 0);
D[1] = InterpolateSurface(s, u, v, 0, 0);
}
}
return Vertex((D[1].Pos.X - D[0].Pos.X) / eps,
(D[1].Pos.Y - D[0].Pos.Y) / eps,
(D[1].Pos.Z - D[0].Pos.Z) / eps);
return Vertex((D[1].Pos.X - D[0].Pos.X) / fd_eps,
(D[1].Pos.Y - D[0].Pos.Y) / fd_eps,
(D[1].Pos.Z - D[0].Pos.Z) / fd_eps);
}
else if (derivee == 2) {
double eps = 1.e-6;
Vertex D[2];
if(u_v == 1) { // dudu
if(u - eps < 0.0) {
if(u - fd_eps < 0.0) {
D[0] = InterpolateSurface(s, u, v, 1, 1);
D[1] = InterpolateSurface(s, u + eps, v, 1, 1);
D[1] = InterpolateSurface(s, u + fd_eps, v, 1, 1);
}
else {
D[0] = InterpolateSurface(s, u - eps, v, 1, 1);
D[0] = InterpolateSurface(s, u - fd_eps, v, 1, 1);
D[1] = InterpolateSurface(s, u, v, 1, 1);
}
}
else if(u_v == 2) { // dvdv
if(v - eps < 0.0) {
if(v - fd_eps < 0.0) {
D[0] = InterpolateSurface(s, u, v, 1, 2);
D[1] = InterpolateSurface(s, u, v + eps, 1, 2);
D[1] = InterpolateSurface(s, u, v + fd_eps, 1, 2);
}
else {
D[0] = InterpolateSurface(s, u, v - eps, 1, 2);
D[0] = InterpolateSurface(s, u, v - fd_eps, 1, 2);
D[1] = InterpolateSurface(s, u, v, 1, 2);
}
}
else { // dudv
if(v - eps < 0.0) {
if(v - fd_eps < 0.0) {
D[0] = InterpolateSurface(s, u, v, 1, 1);
D[1] = InterpolateSurface(s, u, v + eps, 1, 1);
D[1] = InterpolateSurface(s, u, v + fd_eps, 1, 1);
}
else {
D[0] = InterpolateSurface(s, u, v - eps, 1, 1);
D[0] = InterpolateSurface(s, u, v - fd_eps, 1, 1);
D[1] = InterpolateSurface(s, u, v, 1, 1);
}
}
return Vertex((D[1].Pos.X - D[0].Pos.X) / eps,
(D[1].Pos.Y - D[0].Pos.Y) / eps,
(D[1].Pos.Z - D[0].Pos.Z) / eps);
return Vertex((D[1].Pos.X - D[0].Pos.X) / fd_eps,
(D[1].Pos.Y - D[0].Pos.Y) / fd_eps,
(D[1].Pos.Z - D[0].Pos.Z) / fd_eps);
}
if(s->geometry){
......
......@@ -118,6 +118,8 @@ int discreteFace::trianglePosition(double par1, double par2, double &u, double &
u = uv[0];
v = uv[1];
return position;
#else
return 0;
#endif
}
......@@ -163,7 +165,7 @@ class dfWrapper{
static SVector3 _NORMAL_ ( const MTriangle &t3d)
{
SVector3 v31 (t3d.getVertex(2)->x()- t3d.getVertex(0)->x(),
t3d.getVertex(2)->y()- t3d.getVertex(0)->y(),
t3d.getVertex(2)->z()- t3d.getVertex(0)->z());
......@@ -171,7 +173,7 @@ static SVector3 _NORMAL_ ( const MTriangle &t3d)
t3d.getVertex(1)->y()- t3d.getVertex(0)->y(),
t3d.getVertex(1)->z()- t3d.getVertex(0)->z());
SVector3 n = crossprod(v31,v21);
n.normalize();
return n;
}
......@@ -243,7 +245,7 @@ GPoint discreteFace::closestPoint(const SPoint3 &queryPoint, double maxDistance
GPoint discreteFace::closestPoint(const SPoint3 &queryPoint, const double initialGuess[2]) const
{
#ifdef HAVE_HXT
return closestPoint(queryPoint, 0.0001);
return closestPoint(queryPoint, 0.0001);
#else
Msg::Error("Cannot evaluate closest point on discrete face without HXT");
return GPoint();
......@@ -264,14 +266,19 @@ SPoint2 discreteFace::parFromPoint(const SPoint3 &p, bool onSurface) const
SVector3 discreteFace::normal(const SPoint2 &param) const
{
#ifdef HAVE_HXT
MElement *e = _parametrizations[_current_parametrization].oct->find(param.x(),param.y(),0.0);
if (!e){
Msg::Warning("discreteFace::normal << triangle not found %g %g",param[0],param[1]);
return SVector3(0,0,0);
}
int position = (int)((MTriangle*)e - &_parametrizations[_current_parametrization].t2d[0]);
int position = (int)((MTriangle*)e - &_parametrizations[_current_parametrization].t2d[0]);
const MTriangle &t3d = _parametrizations[_current_parametrization].t3d[position];
return _NORMAL_ (t3d);
#else
Msg::Error("Cannot evaluate normal on discrete face without HXT");
return SVector3();
#endif
}
double discreteFace::curvatureMax(const SPoint2 &param) const
......@@ -640,7 +647,7 @@ GPoint discreteFace::intersectionWithCircle(const SVector3 &n1, const SVector3 &
int position = (int)(t2d - &_parametrizations[_current_parametrization].t2d[0]);
t3d = &_parametrizations[_current_parametrization].t3d[position];
}
SVector3 n = crossprod(n1,n2);
n.normalize();
......
......@@ -62,7 +62,7 @@ class discreteFace : public GFace {
std::vector<std::vector<MEdge> > &boundaries,
std::vector<std::vector<MEdge> > &internals );
#endif
public:
discreteFace(GModel *model, int num);
virtual ~discreteFace() {}
......@@ -85,13 +85,10 @@ class discreteFace : public GFace {
void setBoundEdges(const std::vector<int> &tagEdges);
void setBoundEdges(const std::vector<int> &tagEdges,
const std::vector<int> &signEdges);
#ifdef HAVE_HXT
int trianglePosition(double par1, double par2, double &u, double &v) const;
GPoint intersectionWithCircle(const SVector3 &n1, const SVector3 &n2,
const SVector3 &p, const double &R,
double uv[2]) ;
#endif
};
#endif
......@@ -915,7 +915,6 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
std::map<MVertex*, BDS_Point*> recoverMapInv;
std::list<GEdge*> edges = replacement_edges ? *replacement_edges : gf->edges();
std::list<int> dir = gf->edgeOrientations();
std::vector<MEdge> medgesToRecover;
// build a set with all points of the boundaries
std::set<MVertex*, MVertexLessThanNum> all_vertices, boundary;
......@@ -932,10 +931,6 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
while(ite != edges.end()){
if((*ite)->isSeam(gf)) return false;
if(!(*ite)->isMeshDegenerated()){
// printf("edge %d\n",(*ite)->tag());
for(unsigned int i = 0; i< (*ite)->lines.size(); i++)
medgesToRecover.push_back(MEdge((*ite)->lines[i]->getVertex(0),
(*ite)->lines[i]->getVertex(1)));
for(unsigned int i = 0; i< (*ite)->lines.size(); i++){
MVertex *v1 = (*ite)->lines[i]->getVertex(0);
MVertex *v2 = (*ite)->lines[i]->getVertex(1);
......@@ -944,7 +939,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
fprintf(fdeb,"SL(%g,%g,%g,%g,%g,%g){%d,%d};\n",
v1->x(),v1->y(),v1->z(),v2->x(),v2->y(),v2->z(),(*ite)->tag(),(*ite)->tag());
}
all_vertices.insert(v1);
all_vertices.insert(v2);
if(boundary.find(v1) == boundary.end())
......@@ -976,9 +971,6 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
std::list<GEdge*> emb_edges = gf->embeddedEdges();
ite = emb_edges.begin();
while(ite != emb_edges.end()){
for(unsigned int i = 0; i< (*ite)->lines.size(); i++)
medgesToRecover.push_back(MEdge((*ite)->lines[i]->getVertex(0),
(*ite)->lines[i]->getVertex(1)));
if(!(*ite)->isMeshDegenerated()){
all_vertices.insert((*ite)->mesh_vertices.begin(),
(*ite)->mesh_vertices.end() );
......@@ -1135,7 +1127,6 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
v0->setXYZ(p0->u,p0->v,0.0);
}
delaunayMeshIn2D(v, result, 0);
// delaunayMeshIn2D(v, result, 0, &medgesToRecover);
for(unsigned int i = 0; i < v.size()-4; i++) {
MVertex *v0 = v[i];
......@@ -1878,8 +1869,8 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
}
if(nbPointsTotal < 3){
Msg::Warning("Mesh Generation of Model Face %d Skipped: "
......@@ -1906,10 +1897,10 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
// Use a divide & conquer type algorithm to create a triangulation. We add to
// the triangulation a box with 4 points that encloses the domain.
std::vector<int> edgesEmbedded;
#if 1 //OLD_CODE_DELAUNAY
{
DocRecord doc(nbPointsTotal + 4);
int count = 0;
/////////////////////////////////////////////////////////////////
......@@ -1919,20 +1910,37 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
std::list<GVertex*>::iterator itvx = emb_vertx.begin();
int pNum = m->MAXPOINTNUMBER;
nbPointsTotal += emb_vertx.size();
{
std::list<GEdge*> emb_edges = gf->embeddedEdges();
std::list<GEdge*>::iterator ite = emb_edges.begin();
std::set<MVertex*> vs;
while(ite != emb_edges.end()){
for(unsigned int i = 0; i< (*ite)->lines.size(); i++){
for(unsigned int j = 0; j< 2; j++){
MVertex *v = (*ite)->lines[i]->getVertex(j);
if (vs.find(v) == vs.end()){
vs.insert(v);
}
}
}
++ite;
}
nbPointsTotal += vs.size();
}
DocRecord doc(nbPointsTotal + 4 );
while(itvx != emb_vertx.end()){
MVertex *v = (*itvx)->mesh_vertices[0];
double uv[2]={0,0};
GPoint gp = gf->closestPoint (SPoint3(v->x(),v->y(),v->z()),uv);
GPoint gp = gf->closestPoint (SPoint3(v->x(),v->y(),v->z()),uv);
BDS_Point *pp = m->add_point(++pNum, gp.u(), gp.v(), gf);
m->add_geom(-(*itvx)->tag(),0);
pp->g = m->get_geom(-(*itvx)->tag(),0);
pp->lcBGM() = BGM_MeshSize(*itvx, 0, 0, v->x(),v->y(),v->z());
pp->lc() = pp->lcBGM();
// printf("%g\n",pp->lc());
recoverMap[pp] = v;
recoverMap[pp] = v;
double XX = CTX::instance()->mesh.randFactor * LC2D * (double)rand() /
(double)RAND_MAX;
double YY = CTX::instance()->mesh.randFactor * LC2D * (double)rand() /
......@@ -1944,10 +1952,59 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
count++;
++itvx;
}
nbPointsTotal += count;
// nbPointsTotal += count;
std::list<GEdge*> emb_edges = gf->embeddedEdges();
std::list<GEdge*>::iterator ite = emb_edges.begin();
std::set<MVertex*> vs;
std::map<MVertex *, BDS_Point *> facile;
while(ite != emb_edges.end()){
m->add_geom(-(*ite)->tag(),1);
for(unsigned int i = 0; i< (*ite)->lines.size(); i++){
for(unsigned int j = 0; j< 2; j++){
MVertex *v = (*ite)->lines[i]->getVertex(j);
if (vs.find(v) == vs.end()){
vs.insert(v);
double uv[2]={0,0};
GPoint gp = gf->closestPoint (SPoint3(v->x(),v->y(),v->z()),uv);
BDS_Point *pp = m->add_point(++pNum, gp.u(), gp.v(), gf);
pp->g = m->get_geom(-(*ite)->tag(),1);
if (v->onWhat()->dim() == 0)
pp->lcBGM() = BGM_MeshSize(v->onWhat(), 0, 0, v->x(),v->y(),v->z());
else {
double uu;
v->getParameter(0,uu);
pp->lcBGM() = BGM_MeshSize(*ite, uu, 0, v->x(),v->y(),v->z());
}
pp->lc() = pp->lcBGM();
// printf("%g\n",pp->lc());
recoverMap[pp] = v;
facile[v] = pp;
double XX = CTX::instance()->mesh.randFactor * LC2D * (double)rand() /
(double)RAND_MAX;
double YY = CTX::instance()->mesh.randFactor * LC2D * (double)rand() /
(double)RAND_MAX;
doc.points[count].where.h = pp->u + XX;
doc.points[count].where.v = pp->v + YY;
doc.points[count].adjacent = NULL;
doc.points[count].data = pp;
count++;
}
}
}
for(unsigned int i = 0; i< (*ite)->lines.size(); i++){
BDS_Point *p0 = facile[(*ite)->lines[i]->getVertex(0)];
BDS_Point *p1 = facile[(*ite)->lines[i]->getVertex(1)];
edgesEmbedded.push_back(p0->iD);
edgesEmbedded.push_back(p1->iD);
}
++ite;
}
/////////////////////////////////////////////////////////////////
for(unsigned int i = 0; i < edgeLoops_BDS.size(); i++){
std::vector<BDS_Point*> &edgeLoop_BDS = edgeLoops_BDS[i];
for(unsigned int j = 0; j < edgeLoop_BDS.size(); j++){
......@@ -2045,7 +2102,6 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
}
std::vector<MTriangle*> result;
delaunayMeshIn2D(v, result, 0);
// delaunayMeshIn2D(v, result, 0, & medgesToRecover);
for(unsigned int i = 0; i < v.size()-4; i++) {
MVertex *v0 = v[i];
......@@ -2075,7 +2131,7 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
}
#endif
// Recover the boundary edges and compute characteristic lenghts using mesh
// edge spacing
BDS_GeomEntity CLASS_F(1, 2);
......@@ -2092,6 +2148,19 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
bool _fatallyFailed;
for(unsigned int i = 0; i < edgesEmbedded.size()/2; i++){
BDS_Edge * e = m->recover_edge
(edgesEmbedded[2*i], edgesEmbedded[2*i+1], _fatallyFailed);
if(!e){
Msg::Error("Impossible to recover the edge %d %d",
edgesEmbedded[2*i], edgesEmbedded[2*i+1]);
gf->meshStatistics.status = GFace::FAILED;
delete m;
return false;
}
else e->g = &CLASS_E;
}
for(unsigned int i = 0; i < edgeLoops_BDS.size(); i++){
std::vector<BDS_Point*> &edgeLoop_BDS = edgeLoops_BDS[i];
for(unsigned int j = 0; j < edgeLoop_BDS.size(); j++){
......
......@@ -732,5 +732,6 @@ class API:
for m in module.submodules :
write_module(m, full)
with open("api.texi","w") as f:
f.write("@c This file was generated by api/gen.py: do not edit manually!\n\n")
for m in self.modules:
write_module(m, "")
/*****
This example shows the possibility of inserting embedded points "by hand"
on general surfaces, including periodic ones (this was not possible before
this release.
*****/
// This example shows the possibility of inserting embedded points and lines on
// periodic surfaces
//+
SetFactory("OpenCASCADE");
Cylinder(1) = {-0.5, 0, 0, 1, 0, 0, 0.5, 2*Pi};
//+
Point(3) = {0, .5, 0, .0001};
Point(3) = {0, .5, 0, .01};
Point {3} In Surface {1};
//+
Point(4) = {-.5, 0, 0, .0001};
Point(4) = {-.5, 0, 0, .01};
Point {4} In Surface {3};
//+
Characteristic Length {2, 1} = 0.1;
//Point(5) = {0, 0.6, 0.3, .001};
//Point(6) = {0, 0.6, -0.2, .01};
//Line(4) = {6, 5};
Rectangle(4) = {0.2, 0.2, -0.2, .5, 0.5};
Rotate {{0, 1, 0}, {0, 0, 0}, Pi/4} { Surface{4}; }
BooleanFragments{ Surface{1}; Delete; }{ Surface{4}; Delete; }
Curve{5} In Surface {1};
Characteristic Length {7, 5} = 0.01;
SetFactory("OpenCASCADE");
Mesh.CharacteristicLengthMin = 0.4;
Mesh.CharacteristicLengthMin = 0.02;
Mesh.CharacteristicLengthMax = 0.4;
Circle(1) = {0,0,0, 2, Pi};
......@@ -14,3 +14,5 @@ Rotate {{1, 0, 0}, {0, 0, 4}, Pi/2} {Surface{9};}
Rotate {{0, 0, 1}, {0, 0, 4}, Pi/6} {Surface{9};}
BooleanFragments{ Surface{1,9}; Delete; }{}
Recursive Delete{ Surface{3,4}; }
Characteristic Length{7, 8} = 0.02;
* { line-height: 1.35; }
html { max-width: 1200px; margin: auto; background: #ffffff/*#f4f4f4*/; color: #252525;
font-family: helvetica,sans-serif; font-size: 95%; }
body { margin: auto; padding: 15px; background-color: #ffffff; }
a { text-decoration: none; color: #1a0dab; background: none; }
a:visited { color: #660099; }
a:hover { text-decoration: underline; }
a[data-tooltip]:link, a[data-tooltip]:visited { position: relative; }
a[data-tooltip]:before { content: ""; position: absolute;
border-top: 18px solid black; border-left: 13px solid transparent;
border-right: 13px solid transparent; visibility: hidden; top: -18px; left: 0px; }
a[data-tooltip]:after { font-size: 80%; font-family: helvetica, sans-serif;
font-style: normal; content: attr(data-tooltip); position: absolute;
color: white; top: -35px; left: -10px; background: black; padding: 5px 15px;
-webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px;
white-space: nowrap; visibility: hidden; }
a[data-tooltip]:hover:before, a[data-tooltip]:hover:after { visibility: visible;
-webkit-transition: visibility 0s linear 0s; -moz-transition: visibility 0s linear 0s;
-o-transition: visibility 0s linear 0s; transition: visibility 0s linear 0s; }
img { border: none; vertical-align: middle; }
#banner { float: right; width: 180px; padding-left: 1.5em; padding-bottom: 1.5em;
background: #ffffff; }
#banner img { width: 180px; margin-bottom: 1.5ex; box-shadow: 0px 1px 4px #bbb; }
img.screenshot { margin:0.5ex; box-shadow: 0px 1px 4px #bbb; }
#toc { margin-top:2em; margin-bottom:2.5em; }
.fb-like, .twitter-follow-button { vertical-align:bottom; }
.social{ height:18px; vertical-align:top; }
hr { height: 1px; color: #aaa; background-color: #aaa; border: 0;
margin: .2em 0 .2em 0; }
h1, h2, h3, h4, h5, h6 { background: none; font-weight: normal; margin: 0;
padding-top: 0.4em; padding-bottom: 0.2em; width: auto; }
h1 { font-size: 210%; margin-bottom: 0.4em; line-height: 1.2em; }
h1.short{ color: #555; border-bottom: 1px solid #aaa; }
h2 { color: #555; font-size: 145%; margin-bottom: 0.4em; border-bottom: 1px solid #aaa;
line-height: 1.1em; }
h3 { color: #555; font-size: 130%; margin-bottom: 0.4em; border-bottom: 1px solid #aaa; }
h4 { color: #555; font-size: 110%; margin-bottom: 0.4em; font-weight: normal; }
h5 { color: #555; font-size: 100%; margin-bottom: 0.4em; font-weight: bold;
border-bottom: none; }
h6 { color: #555; font-size: 80%; border-bottom: none; font-weight: bold; }
table, th, td, tr { border: 1px solid #aaa; border-collapse: collapse; font-size:inherit; }
td { padding: 4px; }
/* class="menu" for texinfo-generated html */
table.menu { border: 0; }
.menu td { border: 0; }
.menu tr { border: 0; }
.menu th { border: 0; }
p, div.p { margin: .8em 0 .8em 0; }
/* class="highlight" for getdp and gmsh pages */
p.highlight { padding: 1ex; background-color: #f3f7ff; font-weight: bold; }
code { font-size: 95%; }
pre { font-size: 90%; padding: 1em; border: 1px dashed #2f6fab; color: black;
line-height: 1.2em; background-color: #f3f7ff; white-space: pre-wrap;
white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap;
word-wrap: break-word;
}
/* class="sp", "example" and "menu-comment" for texinfo-generated html */
pre.sp { padding: 1em; border: 0px; background-color: #ffffff; }
pre.example { font-size: 95%; }
pre.menu-comment { border: 0px; background-color: #ffffff; font-family: inherit; }
div.example { margin-left: 0em; }
div.smallexample { margin-left: 0em; }
@media screen and (max-width: 500px) {
body { padding: 10px; }
h1 { font-size: 145%; }
h2 { font-size: 140%; }
ul { padding-left: 1.5em; }
#banner { width: 90px; padding-left: 1em; padding-bottom: 1em; }
#banner img { width: 90px; margin-bottom: 1ex; }
}
@media screen and (min-width: 1200px) {
#banner { width: 250px; }
#banner img { width: 250px; margin-bottom: 2.5ex; }
}
......@@ -12,10 +12,10 @@ unstructured grids, delaunay, discontinuous galerkin, triangulation,
automatic, maillages, mailleur 3D, mesh adaptation, postprocessing,
post processing, post-processor, postprocessor, post-processeur, CAD,
CAO, OpenGL, GL2PS, Gmesh">
<meta name="viewport" content="width= device-width">
<meta name="viewport" content="width=device-width">
<meta name="apple-itunes-app" content="app-id=845930897">
<link href="http://gmsh.info/gmsh.css" rel="stylesheet" type="text/css">
<link href="/favicon.ico" rel="shortcut icon" type="image/x-icon">
<link href="gmsh.css" rel="stylesheet" type="text/css">
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon">
<style type="text/css"><!--
div.small { font-size:80%; }
ul.small { margin-top:1ex; margin-bottom:1ex; }
......@@ -109,7 +109,7 @@ Public License (GPL)</a>:
<a href="bin/Windows/gmsh-3.0.6-Windows64.zip">Windows</a>
(<a href="bin/Windows/gmsh-3.0.6-Windows32.zip">32 bit</a>),
<a href="bin/Linux/gmsh-3.0.6-Linux64.tgz">Linux</a>,
<!--(<a href="bin/Windows/gmsh-3.0.6-Linux32.zip">32 bit</a>),-->
<!--(<a href="bin/Linux/gmsh-3.0.6-Linux32.tgz">32 bit</a>),-->
<a href="bin/MacOSX/gmsh-3.0.6-MacOSX.dmg">MacOS</a>
and
<a href="src/gmsh-3.0.6-source.tgz">source code</a>
......@@ -127,7 +127,7 @@ Public License (GPL)</a>:
<a href="bin/Windows/gmsh-git-Windows64.zip">Windows</a>
(<a href="bin/Windows/gmsh-git-Windows32.zip">32 bit</a>),
<a href="bin/Linux/gmsh-git-Linux64.tgz">Linux</a>
(<a href="bin/Windows/gmsh-git-Linux32.zip">32 bit</a>),
(<a href="bin/Linux/gmsh-git-Linux32.tgz">32 bit</a>),
<a href="bin/MacOSX/gmsh-git-MacOSX.dmg">MacOS</a> and
<a href="src/gmsh-git-source.tgz">source code</a>
</ul>
......
@c This file was generated by api/gen.py: do not edit manually!
@heading Module @code{/gmsh}
@ftable @code
@item initialize
......
@c This file was generated by cmake: do not edit manually!
@item ENABLE_3M
Enable proprietary 3M extension (default: OFF)
......
@c
@c This file is generated automatically by running "gmsh -doc".
@c Do not edit by hand!
@c
@c This file was generated by "gmsh -doc": do not edit manually!
@ftable @code
@end ftable
......@@ -49,7 +46,7 @@ Preserve element numbering in MSH2 format
@item -save_all
Save all elements (discard physical group definitions)
@item -save_parametric
Save vertices with their parametric coordinates
Save nodes with their parametric coordinates
@item -save_topology
Save model topology
@item -algo string</