<br>
\image html Arguments.png Dialog boxes of <b>Gmsh 2D</b> and <b> Gmsh 3D</b> algorithms.
-The <b>Arguments tab</b> of the dialog boxes is very similar to the original <a href="http://www.geuz.org/gmsh/"> <b> Gmsh </b></a>
+The <b>Arguments tab</b> of the dialog boxes is very similar to the original <a href="https://gmsh.info"> <b> Gmsh </b></a>
GUI general mesh option tab.
One familiar with the original interface can refer to the <a href="http://www.geuz.org/gmsh/doc/texinfo/gmsh.html">
<b> Gmsh documentation </b></a> for more information.
We briefly describe each argument of the <b>Arguments tab</b> and give the original corresponding Gmsh keyword
(referring to <a href="http://www.geuz.org/gmsh/doc/texinfo/gmsh.html#Mesh-options-list"> <b> Gmsh Mesh options list</b></a>):
+
- <b>Name</b> - allows to define the name for the algorithm ("Gmsh Parameters" by default).
- <b>2D algorithm</b> - allows to choose the Gmsh 2D algorithm for both 2D and 3D meshes.
Original corresponding Gmsh keyword is <b>"Mesh.Algorithm"</b>.
Original corresponding Gmsh keyword is <b>"Mesh.RemeshAlgorithm"</b>.
- <b>Remeshing parametrization</b> - allows to choose the remeshing parametrization.
Original corresponding Gmsh keyword is <b>"Mesh.RemeshParametrization"</b>.
-- <b>Smoothing steps</b> - Number of steps to smooth the final mesh.
+- <b>Smoothing steps</b> - number of steps to smooth the final mesh.
Original corresponding Gmsh keyword is <b>"Mesh.Smoothing"</b>.
- <b>Element size factor</b> - factor used to linearly increase or decrease the default mesh size.
-Original corresponding Gmsh keyword is <b>"Mesh.CharacteristicLengthFactor"</b>.
-- <b>Max Size</b> - maximum linear dimensions for mesh cells.
-Original corresponding Gmsh keyword is <b>"Mesh.CharacteristicLengthMax"</b>.
-- <b>Min Size</b> - minimum linear dimensions for mesh cells.
-Original corresponding Gmsh keyword is <b>"Mesh.CharacteristicLengthMin"</b>.
+Original corresponding Gmsh keyword is <b>"Mesh.MeshSizeFactor"</b>.
+- <b>Elements per 2Pi radians</b> - number of mesh elements per 2 Pi radians. This helps defining a mesh size with respect to the curvature of the underlying geometry.
+Original corresponding Gmsh keyword is <b>"Mesh.MeshSizeFromCurvature"</b>.
+- <b>Max. Size</b> - maximum linear dimensions for mesh cells.
+Original corresponding Gmsh keyword is <b>"Mesh.MeshSizeMax"</b>.
+- <b>Min. Size</b> - minimum linear dimensions for mesh cells.
+Original corresponding Gmsh keyword is <b>"Mesh.MeshSizeMin"</b>.
- <b>Second Order</b> - if this box is checked in, the algorithm will create second order nodes on the mesh,
which actually will become quadratic.
Original corresponding Gmsh keyword is <b>"Mesh.ElementOrder"</b> (set to 2 if the box is checked in, else 1).
When meshed, the single entity will be reparametrized as a single surface, whose mesh can thus cross internal boundaries.
- <b>Remove</b> - deletes selected rows from the table.
-*/
+*/
\ No newline at end of file
\mainpage Introduction to GMSHPLUGIN
\b GMSHPLUGIN plugin provides an integration of certain functionalities of the well known
-<a href="http://www.geuz.org/gmsh/"> <b>Gmsh three-dimensional finite element mesh generator</b></a>.
+<a href="https://www.gmsh.info"> <b>Gmsh three-dimensional finite element mesh generator</b></a>.
It is possible to mesh 2D and 3D geometric entities. The plugin was especially developed to
integrate the Gmsh compound functionality. The plugin provides support
of sub-meshes.
void SetSizeFactor(in double value);
double GetSizeFactor();
+
+ void SetMeshCurvatureSize(in double value);
+ double GetMeshCurvatureSize();
void SetMaxSize(in double value);
double GetMaxSize();
_remeshPara (harmonic),
_smouthSteps (1),
_sizeFactor (1),
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ _meshCurvatureSize(0),
+#endif
_minSize (0),
_maxSize (1e22),
_secondOrder (false),
}
}
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+void GMSHPlugin_Hypothesis::SetMeshCurvatureSize(double theMeshCurvatureSize)
+{
+ if (theMeshCurvatureSize != _meshCurvatureSize)
+ {
+ _meshCurvatureSize = theMeshCurvatureSize;
+ NotifySubMeshesHypothesisModification();
+ }
+}
+#endif
+
void GMSHPlugin_Hypothesis::SetMaxSize(double theSize)
{
if (theSize != _maxSize)
" " << _remeshPara <<
" " << _smouthSteps <<
" " << _sizeFactor <<
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ " " << _meshCurvatureSize <<
+#endif
" " << _maxSize <<
" " << _minSize <<
" " << (int)_secondOrder <<
else
load.clear(ios::badbit | load.rdstate());
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ isOK = static_cast<bool>(load >> val);
+ if (isOK)
+ _meshCurvatureSize = val;
+ else
+ load.clear(ios::badbit | load.rdstate());
+#endif
+
isOK = static_cast<bool>(load >> val);
if (isOK)
_maxSize = val;
delaunay,
frontal,
delaunayforquad,
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ packingparallelograms,
+ quadqs
+#else
packingparallelograms
+#endif
};
void Set2DAlgo(Algo2D the2DAlgo);
void SetUseIncomplElem(bool theUseIncomplElem);
bool GetUseIncomplElem() const { return _useIncomplElem; }
+
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ void SetMeshCurvatureSize(double theMeshCurvatureSize);
+ double GetMeshCurvatureSize() const { return _meshCurvatureSize; }
+#endif
void SetMaxSize(double theSize);
double GetMaxSize() const { return _maxSize; }
RemeshPara _remeshPara;
double _smouthSteps;
double _sizeFactor;
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ double _meshCurvatureSize;
+#endif
double _minSize, _maxSize;
bool _secondOrder, _useIncomplElem;
bool _is2d;
return this->GetImpl()->GetMaxSize();
}
+
+void GMSHPlugin_Hypothesis_i::SetMeshCurvatureSize (CORBA::Double theMeshCurvatureSize)
+{
+ if ( isToSetParameter( GetMeshCurvatureSize(), theMeshCurvatureSize, METH_SetMeshCurvatureSize ))
+ {
+ this->GetImpl()->SetMeshCurvatureSize(theMeshCurvatureSize);
+ SMESH::TPythonDump() << _this() << ".SetMeshCurvatureSize( " << SMESH::TVar(theMeshCurvatureSize) << " )";
+ }
+}
+
+CORBA::Double GMSHPlugin_Hypothesis_i::GetMeshCurvatureSize()
+{
+ return this->GetImpl()->GetMeshCurvatureSize();
+}
+
+
void GMSHPlugin_Hypothesis_i::SetMinSize (CORBA::Double theValue)
{
if ( isToSetParameter( GetMinSize(), theValue, METH_SetMinSize ))
if ( method == "SetNbSegPerEdge" ) return 2;
if ( method == "SetNbSegPerRadius" ) return 3;
if ( method == "SetMinSize" ) return nbVars-1;
+ if ( method == "SetMeshCurvatureSize" ) return 5;
return SMESH_Hypothesis_i::getParamIndex( method, nbVars ); // return default value
}
case 2: return "SetNbSegPerEdge";
case 3: return "SetNbSegPerRadius";
case 4: return "SetMinSize";
+ case 5: return "SetMeshCurvatureSize";
}
return "";
}
virtual ~GMSHPlugin_Hypothesis_i();
// Ajout d'un truc
+ void SetMeshCurvatureSize(CORBA::Double theMeshCurvatureSize);
+ CORBA::Double GetMeshCurvatureSize();
void SetMaxSize(CORBA::Double theSize);
CORBA::Double GetMaxSize();
// to remember whether a parameter is already set (issue 0021364)
enum SettingMethod
{
+ METH_SetMeshCurvatureSize = 5,
METH_SetMaxSize = 1,
METH_SetMinSize = 2,
METH_SetSecondOrder = 4,
_remeshPara = hyp->GetRemeshPara();
_smouthSteps = hyp->GetSmouthSteps();
_sizeFactor = hyp->GetSizeFactor();
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ _meshCurvatureSize = hyp->GetMeshCurvatureSize();
+#endif
_minSize = hyp->GetMinSize();
_maxSize = hyp->GetMaxSize();
_secondOrder = hyp->GetSecondOrder();
_remeshPara = 0;
_smouthSteps = 1;
_sizeFactor = 1;
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ _meshCurvatureSize = 0;
+#endif
_minSize = 0;
_maxSize = 1e22;
_secondOrder = false;
void GMSHPlugin_Mesher::SetMaxThreadsGmsh()
{
MESSAGE("GMSHPlugin_Mesher::SetMaxThreadsGmsh");
- if (_compounds.size() > 0)
+ // compound meshing (_compounds.size() > 0) and quad meshing (_algo2d >= 5) will
+ // not be multi-threaded
+ if (_compounds.size() > 0 || _algo2d >= 5){
_maxThreads = 1;
+ }
else
_maxThreads = omp_get_max_threads();
}
mapAlgo2d[3]=6; // Frontal-Delaunay
mapAlgo2d[4]=8; // DelQuad (Frontal-Delaunay for Quads)
mapAlgo2d[5]=9; // Packing of parallelograms
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ mapAlgo2d[6]=11;// Quasistructured quads with cross-fields
+#endif
std::map <int,double> mapAlgo3d;
mapAlgo3d[0]=1; // Delaunay
//ASSERT(ok);
ok = GmshSetOption("Mesh", "Smoothing" , (double)_smouthSteps) ;
//ASSERT(ok);
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ ok = GmshSetOption("Mesh", "MeshSizeFromCurvature" , _meshCurvatureSize) ;
+ ASSERT(ok);
+#endif
#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=8
ok = GmshSetOption("Mesh", "MeshSizeFactor" , _sizeFactor) ;
ASSERT(ok);
#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=3
double _maxThreads;
#endif
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ double _meshCurvatureSize;
+#endif
std::set<std::string> _compounds;
delaunay,
frontal,
delaunayforquad,
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ packingparallelograms,
+ quadqs
+#else
packingparallelograms
+#endif
};
enum Algo3D
delaunay3,
frontal3,
mmg3d,
- rtree
+ rtree,
+ hxt
};
#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=8
aGroupLayout->addWidget( new QLabel( tr( "GMSH_2D_ALGO" ), GroupC1 ), row, 0 );
my2DAlgo = new QComboBox( GroupC1 );
QStringList types2DAlgo;
- types2DAlgo << tr( "GMSH_AUTOMATIC" ) << tr( "GMSH_MESH_ADAPT" ) << tr( "GMSH_DELAUNAY" ) <<
- tr( "GMSH_FRONTAL" ) << tr( "GMSH_DELAUNAY_FOR_QUAD" ) << tr( "GMSH_PACKING_OF_PARALLELOGRAMS" );
+ types2DAlgo << tr( "GMSH_AUTOMATIC" )
+ << tr( "GMSH_MESH_ADAPT" )
+ << tr( "GMSH_DELAUNAY" )
+ << tr( "GMSH_FRONTAL" )
+ << tr( "GMSH_DELAUNAY_FOR_QUAD" )
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ << tr( "GMSH_PACKING_OF_PARALLELOGRAMS" )
+ << tr( "GMSH_QUASI_STRUCTURED_QUAD" );
+#else
+ << tr( "GMSH_PACKING_OF_PARALLELOGRAMS" );
+#endif
my2DAlgo->addItems( types2DAlgo );
aGroupLayout->addWidget( my2DAlgo, row, 1 );
row++;
aGroupLayout->addWidget( mySizeFactor, row, 1 );
row++;
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ aGroupLayout->addWidget( new QLabel( tr( "GMSH_SIZE_FROM_CURVATURE" ), GroupC1 ), row, 0 );
+ myMeshCurvatureSize = new SMESHGUI_SpinBox( GroupC1 );
+ myMeshCurvatureSize->RangeStepAndValidator( 0.0, 1e+22, 1.0, "length_precision" );
+ aGroupLayout->addWidget( myMeshCurvatureSize, row, 1 );
+ row++;
+#endif
+
aGroupLayout->addWidget( new QLabel( tr( "GMSH_MIN_SIZE" ), GroupC1 ), row, 0 );
myMinSize = new SMESHGUI_SpinBox( GroupC1 );
myMinSize->RangeStepAndValidator( 0.0, 1e+22, 1., "length_precision" );
mySizeFactor->setValue( data.mySizeFactor );
else
mySizeFactor->setText( data.mySizeFactorVar );
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ if(data.myMeshCurvatureSizeVar.isEmpty())
+ myMeshCurvatureSize->setValue( data.myMeshCurvatureSize );
+ else
+ myMeshCurvatureSize->setText( data.myMeshCurvatureSizeVar );
+#endif
if(data.myMaxSizeVar.isEmpty())
myMaxSize->setValue( data.myMaxSize );
else
QString valStr = tr("GMSH_MAX_SIZE") + " = " + QString::number( data.myMaxSize ) + "; ";
valStr += tr("GMSH_MIN_SIZE") + " = " + QString::number( data.myMinSize ) + "; ";
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ valStr += tr("GMSH_SIZE_FROM_CURVATURE") + " = " + QString::number( data.myMeshCurvatureSize ) + "; ";
+#endif
if ( data.mySecondOrder )
valStr += tr("GMSH_SECOND_ORDER") + "; ";
h_data.myRemeshPara = (int) h->GetRemeshPara();
h_data.mySmouthSteps = h->GetSmouthSteps();
h_data.mySizeFactor = h->GetSizeFactor();
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ h_data.myMeshCurvatureSize = h->GetMeshCurvatureSize();
+ h_data.myMeshCurvatureSizeVar = getVariableName("SetMeshCurvatureSize");
+#endif
h_data.myMinSize = h->GetMinSize();
h_data.myMaxSize = h->GetMaxSize();
h_data.mySmouthStepsVar = getVariableName("SmouthSteps");
h->SetRemeshPara( h_data.myRemeshPara );
h->SetSmouthSteps( h_data.mySmouthSteps );
h->SetSizeFactor( h_data.mySizeFactor );
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ h->SetMeshCurvatureSize( h_data.myMeshCurvatureSize );
+#endif
h->SetMinSize( h_data.myMinSize );
h->SetMaxSize( h_data.myMaxSize );
h->SetVarParameter( h_data.mySmouthStepsVar.toLatin1().constData(), "SmouthSteps");
h->SetVarParameter( h_data.mySizeFactorVar.toLatin1().constData(), "SizeFactor");
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ h->SetVarParameter( h_data.myMeshCurvatureSizeVar.toLatin1().constData(), "SetMeshCurvatureSize");
+#endif
h->SetVarParameter( h_data.myMinSizeVar.toLatin1().constData(), "SetMinSize");
h->SetVarParameter( h_data.myMaxSizeVar.toLatin1().constData(), "SetMaxSize");
h->SetSecondOrder( h_data.mySecondOrder );
h_data.myRemeshPara = myRemeshPara->currentIndex();
h_data.mySmouthSteps = mySmouthSteps->value();
h_data.mySizeFactor = mySizeFactor->value();
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ h_data.myMeshCurvatureSize = myMeshCurvatureSize->value();
+ h_data.myMeshCurvatureSizeVar = myMeshCurvatureSize->text();
+#endif
h_data.myMinSize = myMinSize->value();
h_data.myMaxSize = myMaxSize->value();
h_data.mySmouthStepsVar = mySmouthSteps->text();
int mySubdivAlgo,myRemeshAlgo,myRemeshPara,mySmouthSteps;
bool myUseIncomplElem;
bool mySecondOrder;
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ double mySizeFactor,myMaxSize, myMinSize, myMeshCurvatureSize;
+ QString myMaxSizeVar, myMinSizeVar, mySmouthStepsVar, mySizeFactorVar, myMeshCurvatureSizeVar;
+#else
double mySizeFactor,myMaxSize, myMinSize;
QString myMaxSizeVar, myMinSizeVar, mySmouthStepsVar, mySizeFactorVar;
+#endif
mutable QString myErrorMsg;
} GmshHypothesisData;
QComboBox* myRemeshPara;
SMESHGUI_SpinBox* mySmouthSteps;
SMESHGUI_SpinBox* mySizeFactor;
+#if GMSH_MAJOR_VERSION >=4 && GMSH_MINOR_VERSION >=10
+ SMESHGUI_SpinBox* myMeshCurvatureSize;
+#endif
SMESHGUI_SpinBox* myMaxSize;
SMESHGUI_SpinBox* myMinSize;
QCheckBox* myUseIncomplElem;
<source>GMSH_3D_TITLE</source>
<translation>Hypothesis Construction</translation>
</message>
+ <message>
+ <source>GMSH_SIZE_FROM_CURVATURE</source>
+ <translation>Elements per 2Pi radians</translation>
+ </message>
<message>
<source>GMSH_MAX_SIZE</source>
<translation>Max. Size</translation>
</message>
<message>
<source>GMSH_MESH_ADAPT</source>
- <translation>Mesh adapt</translation>
+ <translation>MeshAdapt</translation>
</message>
<message>
<source>GMSH_DELAUNAY</source>
</message>
<message>
<source>GMSH_FRONTAL</source>
- <translation>Frontal</translation>
+ <translation>Frontal-Delaunay</translation>
</message>
<message>
<source>GMSH_DELAUNAY_FOR_QUAD</source>
- <translation>Delaunay for quads</translation>
+ <translation>Frontal-Delaunay for Quads</translation>
+ </message>
+ <message>
+ <source>GMSH_QUASI_STRUCTURED_QUAD</source>
+ <translation>Quasi-Structured Quad</translation>
</message>
<message>
<source>GMSH_PACKING_OF_PARALLELOGRAMS</source>
<source>GMSH_3D_TITLE</source>
<translation>Construction d'une hypothèse</translation>
</message>
+ <message>
+ <source>GMSH_SIZE_FROM_CURVATURE</source>
+ <translation>Eléments par 2Pi radians</translation>
+ </message>
<message>
<source>GMSH_MAX_SIZE</source>
<translation>Taille maximale</translation>
<source>GMSH_DELAUNAY_FOR_QUAD</source>
<translation>Delaunay pour quads</translation>
</message>
+ <message>
+ <source>GMSH_QUASI_STRUCTURED_QUAD</source>
+ <translation>Quadrangles quasi-structuré</translation>
+ </message>
<message>
<source>GMSH_PACKING_OF_PARALLELOGRAMS</source>
<translation>Remplissage de parallélogrammes</translation>