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

missed those files in my previous commit
parent 337de422
No related branches found
No related tags found
No related merge requests found
%{
/*
* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
*
* This file is part of GNU libmatheval
*
* GNU libmatheval is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* GNU libmatheval is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with program; see the file COPYING. If not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
/* This file was modified for inclusion in Gmsh */
#include "common.h"
#include "node.h"
/* Variables used to communicate with code using parser. */
extern Node* matheval_root; /* Root of tree representation of function. */
extern int matheval_ok; /* Flag representing success of parsing. */
/* Report parsing error. */
int yyerror (char *s);
/* Function used to tokenize string representing function (this function
is generated by scanner generator). */
int yylex (void);
%}
/* Parser semantic values type. */
%union {
Node *node;
Record *record;
}
/* Grammar terminal symbols. */
%token <node> NUMBER VARIABLE
%token <record> FUNCTION
/* Grammar non-terminal symbols. */
%type <node> expression
%left '-' '+'
%left '*' '/'
%left NEG
%left '^'
/* Grammar start non-terminal. */
%start input
%%
input
: expression '\n' {
matheval_root = $1;
yyerrok;
return 1;
}
;
expression
: NUMBER {
$$ = $1;
}
| VARIABLE {
$$ = $1;
}
| expression '+' expression {
/* Create addition binary operator node. */
$$ = node_create ('b', '+', $1, $3);
}
| expression '-' expression {
/* Create subtraction binary operator node. */
$$ = node_create ('b', '-', $1, $3);
}
| expression '*' expression {
/* Create multiplication binary operator node. */
$$ = node_create ('b', '*', $1, $3);
}
| expression '/' expression {
/* Create division binary operator node. */
$$ = node_create ('b', '/', $1, $3);
}
| '-' expression %prec NEG {
/* Create minus unary operator node. */
$$ = node_create ('u', '-', $2);
}
| expression '^' expression {
/* Create exponentiation unary operator node. */
$$ = node_create ('b', '^', $1, $3);
}
| FUNCTION '(' expression ')' {
/* Create function node. */
$$ = node_create ('f', $1, $3);
}
| '(' expression ')' {
$$ = $2;
}
;
%%
int yyerror(char* s)
{
/* Indicate parsing error through appropriate flag and stop
parsing. */
matheval_ok = 0;
return 0;
}
%{
/*
* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
*
* This file is part of GNU libmatheval
*
* GNU libmatheval is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* GNU libmatheval is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with program; see the file COPYING. If not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
/* This file was modified for inclusion in Gmsh */
#include "common.h"
#include "node.h"
#include "parser.h"
#include "symbol_table.h"
/* Redefine macro to redirect scanner input from string instead of
standard input. */
#define YY_INPUT( buffer, result, max_size ) \
{ result = input_from_string (buffer, max_size); }
/* Variables used to communicate with code using scanner. */
extern SymbolTable *matheval_symbol_table; /* Evaluator symbol table. */
extern char *matheval_input_string; /* String representing function. */
/* Read next max_size character from string into buffer. */
static int input_from_string (char *buffer, int max_size);
%}
/* Token definitions. */
whitespace [\ \t]+
digit [0-9]
number ({digit}+|{digit}+"."{digit}*|{digit}*"."{digit}+)([Ee][-+]?{digit}+)?
function "Exp"|"Log"|"Sqrt"|"Sin"|"Cos"|"Tan"|"Ctan"|"Asin"|"Acos"|"Atan"|"Actan"|"Sinh"|"Cosh"|"Tanh"|"Ctanh"|"Asinh"|"Acosh"|"Atanh"|"Actanh"|"Fabs"
identifier [a-zA-Z\_][a-zA-Z0-9\_]*
%%
{whitespace}
{number} {
/* Create node representing constant with appropriate value. */
melval.node = node_create ('c', atof (metext));
return NUMBER;
}
{function} {
/* Find symbol table record corresponding to function name. */
melval.record = symbol_table_lookup (matheval_symbol_table, metext);
return FUNCTION;
}
{identifier} {
Record *record; /* Symbol table record. */
/* Inserty variable into symbol table. */
record = symbol_table_insert (matheval_symbol_table, metext, 'v');
melval.node = node_create ('v', record);
return VARIABLE;
}
"+" {
return '+';
}
"-" {
return '-';
}
"*" {
return '*';
}
"/" {
return '/';
}
"^" {
return '^';
}
"(" {
return '(';
}
")" {
return ')';
}
"\n" {
return '\n';
}
%%
#undef mewrap
int mewrap() {return 1;}
static int input_from_string (char *buffer, int max_size)
{
int count; /* Count of characters to copy from input string to buffer. */
/* Calculate count of characters to copy. */
count = strlen (matheval_input_string);
if (count > max_size)
count = max_size;
/* Perform copy operation and update input string. */
memcpy(buffer, matheval_input_string, count);
matheval_input_string += count;
return count;
}
// $Id: Evaluate.cpp,v 1.1 2004-05-12 03:23:31 geuzaine Exp $
//
// Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems to <gmsh@geuz.org>.
#include "Plugin.h"
#include "Evaluate.h"
#include "List.h"
#include "Views.h"
#include "Context.h"
#include "Numeric.h"
#if defined(HAVE_MATH_EVAL)
#include "matheval.h"
#endif
extern Context_T CTX;
StringXNumber EvaluateOptions_Number[] = {
{GMSH_FULLRC, "TimeStep", NULL, 0.},
{GMSH_FULLRC, "iView", NULL, -1.}
};
StringXString EvaluateOptions_String[] = {
{GMSH_FULLRC, "Expression", NULL, "Sin(v) * Sqrt(x^2+y^2)"}
};
extern "C"
{
GMSH_Plugin *GMSH_RegisterEvaluatePlugin()
{
return new GMSH_EvaluatePlugin();
}
}
GMSH_EvaluatePlugin::GMSH_EvaluatePlugin()
{
;
}
void GMSH_EvaluatePlugin::getName(char *name) const
{
strcpy(name, "Evaluate");
}
void GMSH_EvaluatePlugin::getInfos(char *author, char *copyright,
char *help_text) const
{
strcpy(author, "C. Geuzaine (geuz@geuz.org)");
strcpy(copyright, "DGR (www.multiphysics.com)");
strcpy(help_text,
"Plugin(Evaluate) sets the values associated with\n"
"the `TimeStep'-th time step in the view `iView'\n"
"to the expression `Expression'. In addition to\n"
"the usual mathematical functions, `Expression' can\n"
"contain the symbols x, y, z and v, which represent\n"
"the three spatial coordinates and the value of the\n"
"field, respectively.\n"
"\n"
"Plugin(Evaluate) is executed in-place.\n");
}
int GMSH_EvaluatePlugin::getNbOptions() const
{
return sizeof(EvaluateOptions_Number) / sizeof(StringXNumber);
}
StringXNumber *GMSH_EvaluatePlugin::getOption(int iopt)
{
return &EvaluateOptions_Number[iopt];
}
int GMSH_EvaluatePlugin::getNbOptionsStr() const
{
return sizeof(EvaluateOptions_String) / sizeof(StringXString);
}
StringXString *GMSH_EvaluatePlugin::getOptionStr(int iopt)
{
return &EvaluateOptions_String[iopt];
}
void GMSH_EvaluatePlugin::catchErrorMessage(char *errorMessage) const
{
strcpy(errorMessage, "Evaluate failed...");
}
static void evaluateList(Post_View * v, List_T * list, int nbElm,
int nbNod, int timeStep, char *expression)
{
#if !defined(HAVE_MATH_EVAL)
Msg(GERROR, "MathEval is not compiled in this version of Gmsh");
#else
double *x, *y, *z, *val;
int nb, i, j;
if(!nbElm)
return;
v->Changed = 1;
if(timeStep < 0 || timeStep > v->NbTimeStep - 1){
Msg(WARNING, "Invalid TimeStep (%d) in View[%d]: choosing TimeStep 0",
timeStep, v->Index);
timeStep = 0;
}
void *f = evaluator_create(expression);
if(!f){
Msg(GERROR, "Invalid expression '%s'", expression);
return;
}
double min = VAL_INF;
double max = -VAL_INF;
nb = List_Nbr(list) / nbElm;
for(i = 0; i < List_Nbr(list); i += nb) {
x = (double *)List_Pointer_Fast(list, i);
y = (double *)List_Pointer_Fast(list, i + nbNod);
z = (double *)List_Pointer_Fast(list, i + 2 * nbNod);
val = (double *)List_Pointer_Fast(list, i + 3 * nbNod);
for(j = 0; j < nbNod; j++) {
double xx = x[j];
double yy = y[j];
double zz = z[j];
double vv = val[nbNod * timeStep + j];
char *names[] = { "x", "y" , "z", "v" };
double values[] = { xx , yy, zz, vv };
double res = evaluator_evaluate(f, sizeof(names)/sizeof(names[0]), names, values);
val[nbNod * timeStep + j] = res;
if(res < min) min = res;
if(res > max) max = res;
}
}
evaluator_destroy(f);
v->TimeStepMin[timeStep] = min;
v->TimeStepMax[timeStep] = max;
v->Min = v->TimeStepMin[0];
v->Max = v->TimeStepMax[0];
for(int i = 1; i < v->NbTimeStep; i++){
if(v->TimeStepMin[i] < v->Min) v->Min = v->TimeStepMin[i];
if(v->TimeStepMax[i] > v->Max) v->Max = v->TimeStepMax[i];
}
#endif
}
static void evaluate(Post_View * v, int timeStep, char *expression)
{
evaluateList(v, v->SP, v->NbSP, 1, timeStep, expression);
evaluateList(v, v->SL, v->NbSL, 2, timeStep, expression);
evaluateList(v, v->ST, v->NbST, 3, timeStep, expression);
evaluateList(v, v->SQ, v->NbSQ, 4, timeStep, expression);
evaluateList(v, v->SS, v->NbSS, 4, timeStep, expression);
evaluateList(v, v->SH, v->NbSH, 8, timeStep, expression);
evaluateList(v, v->SI, v->NbSI, 6, timeStep, expression);
evaluateList(v, v->SY, v->NbSY, 5, timeStep, expression);
}
Post_View *GMSH_EvaluatePlugin::execute(Post_View * v)
{
Post_View *vv;
int timeStep = (int)EvaluateOptions_Number[0].def;
int iView = (int)EvaluateOptions_Number[1].def;
char *expr = EvaluateOptions_String[0].def;
if(v && iView < 0)
vv = v;
else {
if(!v && iView < 0)
iView = 0;
if(!(vv = (Post_View *) List_Pointer_Test(CTX.post.list, iView))) {
Msg(WARNING, "View[%d] does not exist", iView);
return 0;
}
}
evaluate(vv, timeStep, expr);
return vv;
}
#ifndef _EVALUATE_H_
#define _EVALUATE_H
// Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems to <gmsh@geuz.org>.
#include "Plugin.h"
extern "C"
{
GMSH_Plugin *GMSH_RegisterEvaluatePlugin();
}
class GMSH_EvaluatePlugin : public GMSH_Post_Plugin
{
public:
GMSH_EvaluatePlugin();
void getName(char *name) const;
void getInfos(char *author, char *copyright, char *helpText) const;
void catchErrorMessage(char *errorMessage) const;
int getNbOptions() const;
StringXNumber* getOption(int iopt);
int getNbOptionsStr() const;
StringXString* getOptionStr(int iopt);
Post_View *execute(Post_View *);
};
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment