Skip to content
Snippets Groups Projects
Commit 0e7846b7 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

add matheval levelset
parent c611fdf1
Branches
Tags
No related merge requests found
......@@ -13,7 +13,7 @@
#include "TreeUtils.h"
#include "SPoint2.h"
#include "ExtrudeParams.h"
#include "DILevelset.h"
#include "gmshLevelset.h"
#define MSH_POINT 100
#define MSH_POINT_BND_LAYER 101
......
// Gmsh - Copyright (C) 1997-2009 C. Geuzaine, J.-F. Remacle
//
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to <gmsh@geuz.org>.
#ifndef _GMSH_LEVELSET_H_
#define _GMSH_LEVELSET_H_
#include <string>
#include <vector>
#include "GmshConfig.h"
#if defined(HAVE_DINTEGRATION)
#include "DILevelset.h"
#include "mathEvaluator.h"
class gLevelsetMathEval: public gLevelsetPrimitive
{
mathEvaluator *_expr;
public:
gLevelsetMathEval(std::string f, int &tag) : gLevelsetPrimitive(tag)
{
std::vector<std::string> expressions(1, f);
std::vector<std::string> variables(3);
variables[0] = "x";
variables[1] = "y";
variables[2] = "z";
_expr = new mathEvaluator(expressions, variables);
}
~gLevelsetMathEval(){ delete _expr; }
virtual double operator () (const double &x, const double &y, const double &z) const
{
std::vector<double> values(3), res(1);
values[0] = x;
values[1] = y;
values[2] = z;
if(_expr->eval(values, res)) return res[0];
return 0.;
}
int type() const { return UNKNOWN; }
};
#endif
#endif
Source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -30,9 +30,9 @@
#include "OS.h"
#include "CreateFile.h"
#include "gmshSurface.h"
#include "gmshLevelset.h"
#include "Field.h"
#include "BackgroundMesh.h"
#include "DILevelset.h"
#if !defined(HAVE_NO_POST)
#include "PView.h"
#include "PViewDataList.h"
......@@ -1723,6 +1723,7 @@ ListOfShapes :
LevelSet :
tLevelset tPlane '(' FExpr ')' tAFFECT ListOfDouble tEND
{
#if defined(HAVE_DINTEGRATION)
if(List_Nbr($7) == 4){
int t = (int)$4;
if(FindLevelSet(t)){
......@@ -1739,10 +1740,12 @@ LevelSet :
}
else
yymsg(0, "Wrong levelset definition (%d)", $4);
#endif
}
| tLevelset tPlane '(' FExpr ')' tAFFECT '{' VExpr ',' VExpr ','
RecursiveListOfDouble '}' tEND
{
#if defined(HAVE_DINTEGRATION)
if(List_Nbr($12) == 0){
int t = (int)$4;
if(FindLevelSet(t)){
......@@ -1758,10 +1761,12 @@ LevelSet :
}
else
yymsg(0, "Wrong levelset definition (%d)", $4);
#endif
}
| tLevelset tPlane '(' FExpr ')' tAFFECT '{' VExpr ',' VExpr ',' VExpr ','
RecursiveListOfDouble '}' tEND
{
#if defined(HAVE_DINTEGRATION)
if(List_Nbr($14) == 0){
int t = (int)$4;
if(FindLevelSet(t)){
......@@ -1778,9 +1783,11 @@ LevelSet :
}
else
yymsg(0, "Wrong levelset definition (%d)", $4);
#endif
}
| tLevelset tSphere '(' FExpr ')' tAFFECT '{' VExpr ',' RecursiveListOfDouble '}' tEND
{
#if defined(HAVE_DINTEGRATION)
if(List_Nbr($10) == 1){
int t = (int)$4;
if(FindLevelSet(t)){
......@@ -1796,9 +1803,11 @@ LevelSet :
}
else
yymsg(0, "Wrong levelset definition (%d)", $4);
#endif
}
| tLevelset tSTRING '(' FExpr ')' tAFFECT ListOfDouble tEND
{
#if defined(HAVE_DINTEGRATION)
if(!strcmp($2, "Union")){
int t = (int)$4;
if(FindLevelSet(t)){
......@@ -1874,9 +1883,30 @@ LevelSet :
else
yymsg(0, "Wrong levelset definition (%d)", $4);
Free($2);
#endif
}
| tLevelset tSTRING '(' FExpr ')' tAFFECT tBIGSTR tEND
{
#if defined(HAVE_DINTEGRATION)
if(!strcmp($2, "MathEval")){
int t = (int)$4;
if(FindLevelSet(t)){
yymsg(0, "Levelset %d already exists", t);
}
else {
gLevelset *ls = new gLevelsetMathEval($7, t);
LevelSet *l = Create_LevelSet(ls->getTag(), ls);
Tree_Add(GModel::current()->getGEOInternals()->LevelSets, &l);
}
}
else
yymsg(0, "Wrong levelset definition");
Free($2); Free($7);
#endif
}
| tLevelset tSTRING '{' FExpr '}' tEND
{
#if defined(HAVE_DINTEGRATION)
if(!strcmp($2, "CutMesh")){
int t = (int)$4;
GModel *GM = GModel::current();
......@@ -1886,10 +1916,12 @@ LevelSet :
else
yymsg(0, "Wrong levelset definition");
Free($2);
#endif
}
| tLevelset tSTRING '(' FExpr ')' tAFFECT '{' VExpr ',' VExpr ','
RecursiveListOfDouble '}' tEND
{
#if defined(HAVE_DINTEGRATION)
if(!strcmp($2, "Cylinder") && List_Nbr($12) == 1){
int t = (int)$4;
if(FindLevelSet(t)){
......@@ -1988,6 +2020,7 @@ LevelSet :
else
yymsg(0, "Wrong levelset definition (%d)", $4);
Free($2);
#endif
}
;
......
......@@ -8,6 +8,7 @@
// PRIMITIVE LEVELSET
#define UNKNOWN 0
#define SPHERE 1
#define PLANE 2
#define GENCYLINDER 3
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment