diff --git a/Plugin/Gradient.cpp b/Plugin/Gradient.cpp index 75655036dd74cba1d56d997c73088e4262d302cc..43fef86084b01bde08fe0ed0411467e1dfe29c84 100644 --- a/Plugin/Gradient.cpp +++ b/Plugin/Gradient.cpp @@ -1,4 +1,4 @@ -// $Id: Gradient.cpp,v 1.1 2004-11-26 10:31:54 remacle Exp $ +// $Id: Gradient.cpp,v 1.2 2004-11-26 16:16:39 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -30,10 +30,6 @@ #include <math.h> #include <stdio.h> -#if defined(HAVE_MATH_EVAL) -#include "matheval.h" -#endif - extern Context_T CTX; StringXNumber GradientOptions_Number[] = { @@ -48,11 +44,6 @@ extern "C" } } -int GMSH_GradientPlugin::getNbOptionsStr() const -{ - return 0; -} - int GMSH_GradientPlugin::getNbOptions() const { return sizeof(GradientOptions_Number) / sizeof(StringXNumber); @@ -63,13 +54,6 @@ StringXNumber *GMSH_GradientPlugin::getOption(int iopt) return &GradientOptions_Number[iopt]; } -StringXString *GMSH_GradientPlugin::getOptionStr(int iopt) -{ - throw; -} - - - GMSH_GradientPlugin::GMSH_GradientPlugin() { ; @@ -86,36 +70,25 @@ void GMSH_GradientPlugin::getInfos(char *author, char *copyright, strcpy(author, "E. Marchandise"); strcpy(copyright, "DGR (www.multiphysics.com)"); strcpy(help_text, - "Plugin(Gradient) computes\n" - "the eigenvalues Lambda (1,2,3)\n" - "of the tensor S_ik S_kj + Om_ik Om_kj,\n" - "where S_ij = 0.5 (ui,j + uj,i)) and\n" - "Om_ij = 0.5 (ui,j - uj,i) are respectively\n" - "the symmetric and antisymmetric parts\n" - "of the velocity gradient tensor.\n" - "Vortices are well-represented by regions\n" - "where Lambda (2) is negative.\n" + "Plugin(Gradient) computes XXX\n" "If `iView' < 0, the plugin is run\n" "on the current view.\n" "\n" - "Plugin(Lambda2) is executed in-place.\n"); + "Plugin(Gradient) creates one new view.\n"); } - void GMSH_GradientPlugin::catchErrorMessage(char *errorMessage) const { strcpy(errorMessage, "Gradient failed..."); } -//----------------------------------------------------------------------------- -static void computeGradient( List_T *inList, int inNb, - List_T *outListVector, int *outNbVector, - int nbTime, int nbNod, int nbComp) +static void computeGradient(List_T *inList, int inNb, + List_T *outListVector, int *outNbVector, + int nbTime, int nbNod, int nbComp) { - - if(!inNb) + if(!inNb) return; - + int outNbComp, *outNb; List_T *outList; @@ -128,132 +101,127 @@ static void computeGradient( List_T *inList, int inNb, int nb = List_Nbr(inList) / inNb; - //on parcourt les elements - //------------------------ - //------------------------ + // on parcourt les elements for(int i = 0; i < List_Nbr(inList); i += nb) { - + double *yy = (double *)List_Pointer_Fast(inList, i + nbNod); - if (yy[0] > 0) - { - for(int j = 0; j < 3 * nbNod; j++) - List_Add(outList, List_Pointer_Fast(inList, i + j)); + if(yy[0] > 0){ + for(int j = 0; j < 3 * nbNod; j++) + List_Add(outList, List_Pointer_Fast(inList, i + j)); + + for(int t = 0; t < nbTime; t++){ + + //on lit vecteurs positions et vitesses + //------------------------------------- + double *x = (double *)List_Pointer_Fast(inList, i); + double *y = (double *)List_Pointer_Fast(inList, i + nbNod); + double *z = (double *)List_Pointer_Fast(inList, i + 2 * nbNod); + double val[MAX_COMP][MAX_NOD]; + for(int k = 0; k < nbNod; k++){ + double *v = (double *)List_Pointer_Fast(inList, i + 3 * nbNod + + nbNod * nbComp * t + nbComp * k); + for(int l = 0; l < nbComp; l++){ + val[l][k] = v[l]; + } + } + + //on calcule le gradient des fonctions de forme + //--------------------------------------------- + double GradPhi_x[4][3]; + double GradPhi_ksi[4][3]; + double dx_dksi[3][3]; + double dksi_dx[3][3]; + double det; + + //triangles + //+++++++++ + if (nbNod == 3){ + double a[3], b[3], cross[3]; + a[0]= x[1]-x[0]; a[1]= y[1]-y[0]; a[2]= z[1]-z[0]; + b[0]= x[2]-x[0]; b[1]= y[2]-y[0]; b[2]= z[2]-z[0]; + prodve(a, b, cross); + dx_dksi[0][0] = x[1] - x[0]; dx_dksi[0][1] = x[2]-x[0]; dx_dksi[0][2] = cross[0]; + dx_dksi[1][0] = y[1] - y[0]; dx_dksi[1][1] = y[2]-y[0]; dx_dksi[1][2] = cross[1]; + dx_dksi[2][0] = z[1] - z[0]; dx_dksi[2][1] = z[2]-z[0]; dx_dksi[2][2] = cross[2]; + inv3x3(dx_dksi, dksi_dx, &det); + + GradPhi_ksi[0][0]= -1; GradPhi_ksi[0][1]= -1; GradPhi_ksi[0][2]= 0; + GradPhi_ksi[1][0]= 1; GradPhi_ksi[1][1]= 0; GradPhi_ksi[1][2]= 0; + GradPhi_ksi[2][0]= 0; GradPhi_ksi[2][1]= 1; GradPhi_ksi[2][2]= 0; + } - for(int t = 0; t < nbTime; t++){ - - //on lit vecteurs positions et vitesses - //------------------------------------- - double *x = (double *)List_Pointer_Fast(inList, i); - double *y = (double *)List_Pointer_Fast(inList, i + nbNod); - double *z = (double *)List_Pointer_Fast(inList, i + 2 * nbNod); - double val[MAX_COMP][MAX_NOD]; - for(int k = 0; k < nbNod; k++){ - double *v = (double *)List_Pointer_Fast(inList, i + 3 * nbNod + nbNod * nbComp * t + nbComp * k); - for(int l = 0; l < nbComp; l++){ - val[l][k] = v[l]; - } + //tetraedre + //++++++++++ + if (nbNod == 4){ + dx_dksi[0][0] = x[1] - x[0]; dx_dksi[0][1] = x[2]-x[0]; dx_dksi[0][2] = x[3]-x[0]; + dx_dksi[1][0] = y[1] - y[0]; dx_dksi[1][1] = y[2]-y[0]; dx_dksi[1][2] = y[3]-y[0]; + dx_dksi[2][0] = z[1] - z[0]; dx_dksi[2][1] = z[2]-z[0]; dx_dksi[2][2] = z[3]-z[0]; + inv3x3(dx_dksi, dksi_dx, &det); + GradPhi_ksi[0][0]= -1; GradPhi_ksi[0][1]= -1; GradPhi_ksi[0][2]= -1; + GradPhi_ksi[1][0]= 1; GradPhi_ksi[1][1]= 0; GradPhi_ksi[1][2]= 0; + GradPhi_ksi[2][0]= 0; GradPhi_ksi[2][1]= 1; GradPhi_ksi[2][2]= 0; + GradPhi_ksi[3][0]= 0; GradPhi_ksi[3][1]= 0; GradPhi_ksi[3][2]= 1; + } + + for(int k = 0; k < nbNod ; k++){ + for(int l = 0; l < 3; l++){ + GradPhi_x[k][l] = 0.0; + for(int m = 0; m < 3; m++){ + GradPhi_x[k][l] += GradPhi_ksi[k][m] * dksi_dx[l][m]; } - - - //on calcule le gradient des fonctions de forme - //--------------------------------------------- - double GradPhi_x[4][3]; - double GradPhi_ksi[4][3]; - double dx_dksi[3][3]; - double dksi_dx[3][3]; - double det; - - //triangles - //+++++++++ - if (nbNod == 3){ - double a[3], b[3], cross[3]; - a[0]= x[1]-x[0]; a[1]= y[1]-y[0]; a[2]= z[1]-z[0]; - b[0]= x[2]-x[0]; b[1]= y[2]-y[0]; b[2]= z[2]-z[0]; - prodve(a, b, cross); - dx_dksi[0][0] = x[1] - x[0]; dx_dksi[0][1] = x[2]-x[0]; dx_dksi[0][2] = cross[0]; - dx_dksi[1][0] = y[1] - y[0]; dx_dksi[1][1] = y[2]-y[0]; dx_dksi[1][2] = cross[1]; - dx_dksi[2][0] = z[1] - z[0]; dx_dksi[2][1] = z[2]-z[0]; dx_dksi[2][2] = cross[2]; - inv3x3(dx_dksi, dksi_dx, &det); - - GradPhi_ksi[0][0]= -1; GradPhi_ksi[0][1]= -1; GradPhi_ksi[0][2]= 0; - GradPhi_ksi[1][0]= 1; GradPhi_ksi[1][1]= 0; GradPhi_ksi[1][2]= 0; - GradPhi_ksi[2][0]= 0; GradPhi_ksi[2][1]= 1; GradPhi_ksi[2][2]= 0; - } - - //tetraedre - //++++++++++ - if (nbNod == 4){ - dx_dksi[0][0] = x[1] - x[0]; dx_dksi[0][1] = x[2]-x[0]; dx_dksi[0][2] = x[3]-x[0]; - dx_dksi[1][0] = y[1] - y[0]; dx_dksi[1][1] = y[2]-y[0]; dx_dksi[1][2] = y[3]-y[0]; - dx_dksi[2][0] = z[1] - z[0]; dx_dksi[2][1] = z[2]-z[0]; dx_dksi[2][2] = z[3]-z[0]; - inv3x3(dx_dksi, dksi_dx, &det); - GradPhi_ksi[0][0]= -1; GradPhi_ksi[0][1]= -1; GradPhi_ksi[0][2]= -1; - GradPhi_ksi[1][0]= 1; GradPhi_ksi[1][1]= 0; GradPhi_ksi[1][2]= 0; - GradPhi_ksi[2][0]= 0; GradPhi_ksi[2][1]= 1; GradPhi_ksi[2][2]= 0; - GradPhi_ksi[3][0]= 0; GradPhi_ksi[3][1]= 0; GradPhi_ksi[3][2]= 1; - } - - for(int k = 0; k < nbNod ; k++){ - for(int l = 0; l < 3; l++){ - GradPhi_x[k][l] = 0.0; - for(int m = 0; m < 3; m++){ - GradPhi_x[k][l] += GradPhi_ksi[k][m] * dksi_dx[l][m]; - } - } - } - - //on calcule le gradient des vitesses - //---------------------------------- - - //par noeud on a max 9 composantes - double res, grad[3][3], sym[3][3], asym[3][3]; -// for(int l = outNbComp; l < 9; l++) -// d[l] = 0.0; - for(int k = 0; k < nbComp; k++){ - for(int l = 0; l < 3; l++){ - grad[k][l] = 0.0; - for(int m = 0; m < nbNod; m++){ - grad[k][l] += val[k][m]* GradPhi_x[m][l]; + } + } + + //on calcule le gradient des vitesses + //---------------------------------- + + //par noeud on a max 9 composantes + double res, grad[3][3], sym[3][3], asym[3][3]; + // for(int l = outNbComp; l < 9; l++) + // d[l] = 0.0; + for(int k = 0; k < nbComp; k++){ + for(int l = 0; l < 3; l++){ + grad[k][l] = 0.0; + for(int m = 0; m < nbNod; m++){ + grad[k][l] += val[k][m]* GradPhi_x[m][l]; + } + } + } + + for(int k=0; k<nbComp; k++){ + for(int l=0; l<3; l++){ + sym[k][l] = 0.5*(grad[k][l]+grad[l][k]); + asym[k][l] = 0.5*(grad[k][l]-grad[l][k]); + } } + + double a[3][3]; + for(int i=0; i<3; i++) + for(int j=0; j<3; j++){ + a[i][j] = 0.0; + for(int k=0; k<3; k++) + a[i][j] += sym[i][k]*sym[k][j] + asym[i][k]*asym[k][j]; + } + + //calcul de lambda avec tri + double lambda[3]; + eigenvalue(a, lambda); + + for(int k = 0; k < nbNod; k++){ + for(int l = 0; l < outNbComp; l++){ + res = lambda[1]; + List_Add(outList, &res); + } + } } - } - - for(int k=0; k<nbComp; k++){ - for(int l=0; l<3; l++){ - sym[k][l] = 0.5*(grad[k][l]+grad[l][k]); - asym[k][l] = 0.5*(grad[k][l]-grad[l][k]); - } - } - - double a[3][3]; - for(int i=0; i<3; i++) - for(int j=0; j<3; j++){ - a[i][j] = 0.0; - for(int k=0; k<3; k++) - a[i][j] += sym[i][k]*sym[k][j] + asym[i][k]*asym[k][j]; - } - - //calcul de lambda avec tri - double lambda[3]; - eigenvalue(a, lambda); - - for(int k = 0; k < nbNod; k++){ - for(int l = 0; l < outNbComp; l++){ - res = lambda[1]; - List_Add(outList, &res); - } - } - } - (*outNb)++; + (*outNb)++; } } } -//----------------------------------------------------------------------------- Post_View *GMSH_GradientPlugin::execute(Post_View * v) { - int iView = (int)GradientOptions_Number[0].def; if(iView < 0) @@ -264,73 +232,60 @@ Post_View *GMSH_GradientPlugin::execute(Post_View * v) return v; } - Post_View *v2 = BeginView(1); - - Post_View *v1 = (Post_View*)List_Pointer(CTX.post.list, iView); + Post_View *v1 = *(Post_View **)List_Pointer(CTX.post.list, iView); -// points -//-------- -// computeGradient( v1->SP, v1->NbSP, v2->VP, &v2->NbVP, v1->NbTimeStep, 1, 1); -// computeGradient( v1->VP, v1->NbVP, v2->TP, &v2->NbTP, v1->NbTimeStep, 1, 3); + Post_View *v2 = BeginView(1); -// lines -//------- + // points + //-------- + // computeGradient( v1->SP, v1->NbSP, v2->VP, &v2->NbVP, v1->NbTimeStep, 1, 1); + // computeGradient( v1->VP, v1->NbVP, v2->TP, &v2->NbTP, v1->NbTimeStep, 1, 3); + + // lines + //------- // computeGradient( v1->SL, v1->NbSL, v2->VL, &v2->NbVL, v1->NbTimeStep, 2, 1); // computeGradient( v1->VL, v1->NbVL, v2->TL, &v2->NbTL, v1->NbTimeStep, 2, 3); - - -// triangles -//------------ -// computeGradient( v1->ST, v1->NbST, v2->VT, &v2->NbVT, v1->NbTimeStep, 3, 1); -// computeGradient( v1->VT, v1->NbVT, v2->TT, &v2->NbTT, v1->NbTimeStep, 3, 3); - - -// tets -//------ -// computeGradient( v1->SS, v1->NbSS, v2->VS, &v2->NbVS, v1->NbTimeStep, 4, 1); + + // triangles + //------------ + // computeGradient( v1->ST, v1->NbST, v2->VT, &v2->NbVT, v1->NbTimeStep, 3, 1); + // computeGradient( v1->VT, v1->NbVT, v2->TT, &v2->NbTT, v1->NbTimeStep, 3, 3); + + // tets + //------ + // computeGradient( v1->SS, v1->NbSS, v2->VS, &v2->NbVS, v1->NbTimeStep, 4, 1); computeGradient( v1->VS, v1->NbVS, v2->SS, &v2->NbSS, v1->NbTimeStep, 4, 3); - - -/* -// quadrangles -//----------- -computeGradient( v1->SQ, v1->NbSQ, v2->VQ, &v2->NbVQ, v1->NbTimeStep, 4, 1); -computeGradient( v1->VQ, v1->NbVQ, v2->VQ, &v2->NbVQ, v1->NbTimeStep, 4, 3); -computeGradient( v1->TQ, v1->NbTQ, v2->VQ, &v2->NbVQ, v1->NbTimeStep, 4, 9); -// hexas -//-------- -computeGradient( v1->SH, v1->NbSH, v2->VH, &v2->NbVH, v1->NbTimeStep, 8, 1); -computeGradient( v1->VH, v1->NbVH, v2->VH, &v2->NbVH, v1->NbTimeStep, 8, 3); -computeGradient( v1->TH, v1->NbTH, v2->VH, &v2->NbVH, v1->NbTimeStep, 8, 9); -// prisms -//-------- -computeGradient( v1->SI, v1->NbSI, v2->VI, &v2->NbVI, v1->NbTimeStep, 6, 1); -computeGradient( v1->VI, v1->NbVI, v2->VI, &v2->NbVI, v1->NbTimeStep, 6, 3); -computeGradient( v1->TI, v1->NbTI, v2->VI, &v2->NbVI, v1->NbTimeStep, 6, 9); -// pyramids -//---------- -computeGradient( v1->SY, v1->NbSY, v2->VY, &v2->NbVY, v1->NbTimeStep, 5, 1); -computeGradient( v1->VY, v1->NbVY, v2->VY, &v2->NbVY, v1->NbTimeStep, 5, 3); -computeGradient( v1->TY, v1->NbTY, v2->VY, &v2->NbVY, v1->NbTimeStep, 5, 9); -*/ - - if(v2->empty()) { - RemoveViewByNumber(v2->Num); - return v1; - } - else{ - // copy time data - for(int i = 0; i < List_Nbr(v1->Time); i++) - List_Add(v2->Time, List_Pointer(v1->Time, i)); - // finalize - char name[1024], filename[1024]; - sprintf(name, "%s_Gradient", v1->Name); - sprintf(filename, "%s_Gradient.pos", v1->Name); - EndView(v2, 1, filename, name); - return v2; - } + + /* + // quadrangles + //----------- + computeGradient( v1->SQ, v1->NbSQ, v2->VQ, &v2->NbVQ, v1->NbTimeStep, 4, 1); + computeGradient( v1->VQ, v1->NbVQ, v2->VQ, &v2->NbVQ, v1->NbTimeStep, 4, 3); + computeGradient( v1->TQ, v1->NbTQ, v2->VQ, &v2->NbVQ, v1->NbTimeStep, 4, 9); + // hexas + //-------- + computeGradient( v1->SH, v1->NbSH, v2->VH, &v2->NbVH, v1->NbTimeStep, 8, 1); + computeGradient( v1->VH, v1->NbVH, v2->VH, &v2->NbVH, v1->NbTimeStep, 8, 3); + computeGradient( v1->TH, v1->NbTH, v2->VH, &v2->NbVH, v1->NbTimeStep, 8, 9); + // prisms + //-------- + computeGradient( v1->SI, v1->NbSI, v2->VI, &v2->NbVI, v1->NbTimeStep, 6, 1); + computeGradient( v1->VI, v1->NbVI, v2->VI, &v2->NbVI, v1->NbTimeStep, 6, 3); + computeGradient( v1->TI, v1->NbTI, v2->VI, &v2->NbVI, v1->NbTimeStep, 6, 9); + // pyramids + //---------- + computeGradient( v1->SY, v1->NbSY, v2->VY, &v2->NbVY, v1->NbTimeStep, 5, 1); + computeGradient( v1->VY, v1->NbVY, v2->VY, &v2->NbVY, v1->NbTimeStep, 5, 3); + computeGradient( v1->TY, v1->NbTY, v2->VY, &v2->NbVY, v1->NbTimeStep, 5, 9); + */ + + // copy time data + for(int i = 0; i < List_Nbr(v1->Time); i++) + List_Add(v2->Time, List_Pointer(v1->Time, i)); + // finalize + char name[1024], filename[1024]; + sprintf(name, "%s_Gradient", v1->Name); + sprintf(filename, "%s_Gradient.pos", v1->Name); + EndView(v2, 1, filename, name); + return v2; } - - - -//---------------------------------------------------------------------- diff --git a/Plugin/Gradient.h b/Plugin/Gradient.h index 19ec8b91d71c5cc28145ce465ec244957f7c3733..516ef94946a69276f4dfe6ccecb859705fb8f163 100644 --- a/Plugin/Gradient.h +++ b/Plugin/Gradient.h @@ -37,8 +37,6 @@ public: void catchErrorMessage(char *errorMessage) const; int getNbOptions() const; StringXNumber* getOption(int iopt); - int getNbOptionsStr() const; - StringXString* getOptionStr(int iopt); Post_View *execute(Post_View *); }; diff --git a/Plugin/Integrate.cpp b/Plugin/Integrate.cpp index 0062f1ae289b9b29dd137e80bdb1b9687593b3be..5300a519de8f302bb5c834c2cc9c41728c902fa3 100644 --- a/Plugin/Integrate.cpp +++ b/Plugin/Integrate.cpp @@ -1,4 +1,4 @@ -// $Id: Integrate.cpp,v 1.8 2004-11-26 15:06:50 remacle Exp $ +// $Id: Integrate.cpp,v 1.9 2004-11-26 16:16:39 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -30,235 +30,199 @@ extern Context_T CTX; StringXNumber IntegrateOptions_Number[] = { - {GMSH_FULLRC, "iView", NULL, -1.}, - {GMSH_FULLRC, "computeLevelsetPositive", NULL, 0.} + {GMSH_FULLRC, "iView", NULL, -1.}, + {GMSH_FULLRC, "computeLevelsetPositive", NULL, 0.} }; extern "C" { - GMSH_Plugin *GMSH_RegisterIntegratePlugin() - { - return new GMSH_IntegratePlugin(); - } + GMSH_Plugin *GMSH_RegisterIntegratePlugin() + { + return new GMSH_IntegratePlugin(); + } } GMSH_IntegratePlugin::GMSH_IntegratePlugin() { - ; + ; } void GMSH_IntegratePlugin::getName(char *name) const { - strcpy(name, "Integrate"); + strcpy(name, "Integrate"); } void GMSH_IntegratePlugin::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(Integrate) integrates scalar fields over\n" - "all the elements in the view `iView', as well\n" - "as the circulation/flux of vector fields over\n" - "line/surface elements. If `iView' < 0, the\n" - "plugin is run on the current view. If\n" - "`computeLevelsetPositive' is set, the plugin\n" - "computes the positive area (volume) of the map\n" - "(for triangle/tetrahedron maps only).\n" - "\n" - "Plugin(Integrate) creates one new view.\n"); + strcpy(author, "C. Geuzaine (geuz@geuz.org)"); + strcpy(copyright, "DGR (www.multiphysics.com)"); + strcpy(help_text, + "Plugin(Integrate) integrates scalar fields over\n" + "all the elements in the view `iView', as well\n" + "as the circulation/flux of vector fields over\n" + "line/surface elements. If `iView' < 0, the\n" + "plugin is run on the current view. If\n" + "`computeLevelsetPositive' is set, the plugin\n" + "computes the positive area (volume) of the map\n" + "(for triangle/tetrahedron maps only).\n" + "\n" + "Plugin(Integrate) creates one new view.\n"); } int GMSH_IntegratePlugin::getNbOptions() const { - return sizeof(IntegrateOptions_Number) / sizeof(StringXNumber); + return sizeof(IntegrateOptions_Number) / sizeof(StringXNumber); } StringXNumber *GMSH_IntegratePlugin::getOption(int iopt) { - return &IntegrateOptions_Number[iopt]; + return &IntegrateOptions_Number[iopt]; } void GMSH_IntegratePlugin::catchErrorMessage(char *errorMessage) const { - strcpy(errorMessage, "Integrate failed..."); + strcpy(errorMessage, "Integrate failed..."); } static double integrate(int nbList, List_T *list, int dim, int nbNod, int nbComp, int step) { - if(!nbList) return 0.; + if(!nbList) return 0.; - const int levelsetPositive = (int)IntegrateOptions_Number[1].def; - - double res = 0.; - int nb = List_Nbr(list) / nbList; - for(int i = 0; i < List_Nbr(list); i += nb) { - double *x = (double *)List_Pointer_Fast(list, i); - double *y = (double *)List_Pointer_Fast(list, i + nbNod); - double *z = (double *)List_Pointer_Fast(list, i + 2 * nbNod); - double *v = (double *)List_Pointer_Fast(list, i + 3 * nbNod + - nbNod * nbComp * step); - if(dim == 0){ - if(nbNod == 1){ - point p(x, y, z); - if(nbComp == 1) res += p.integrate(v); - } + const int levelsetPositive = (int)IntegrateOptions_Number[1].def; + + double res = 0.; + int nb = List_Nbr(list) / nbList; + for(int i = 0; i < List_Nbr(list); i += nb) { + double *x = (double *)List_Pointer_Fast(list, i); + double *y = (double *)List_Pointer_Fast(list, i + nbNod); + double *z = (double *)List_Pointer_Fast(list, i + 2 * nbNod); + double *v = (double *)List_Pointer_Fast(list, i + 3 * nbNod + + nbNod * nbComp * step); + if(dim == 0){ + if(nbNod == 1){ + point p(x, y, z); + if(nbComp == 1){ + if(!levelsetPositive) res += p.integrate(v); + else res += p.integrateLevelsetPositive(v); + } + } + } + else if(dim == 1){ + if(nbNod == 2){ + line l(x, y, z); + if(nbComp == 1){ + if(!levelsetPositive) res += l.integrate(v); + else res += l.integrateLevelsetPositive(v); + } + else if(nbComp == 3) res += l.integrateCirculation(v); + } + } + else if(dim == 2){ + if(nbNod == 3){ + triangle t(x, y, z); + if(nbComp == 1){ + if(!levelsetPositive) res += t.integrate(v); + else res += t.integrateLevelsetPositive(v); + } + else if(nbComp == 3) res += t.integrateFlux(v); + } + else if(nbNod == 4){ + quadrangle q(x, y, z); + if(nbComp == 1) { + if(!levelsetPositive) res += q.integrate(v); + else res += q.integrateLevelsetPositive(v); + } + else if(nbComp == 3) res += q.integrateFlux(v); + } + } + else if(dim == 3){ + if(nbNod == 4){ + tetrahedron t(x, y, z); + if(nbComp == 1){ + if(!levelsetPositive) res += t.integrate(v); + else res += t.integrateLevelsetPositive(v); } - else if(dim == 1){ - if(nbNod == 2){ - line l(x, y, z); - if(nbComp == 1) res += l.integrate(v); - else if(nbComp == 3) res += l.integrateCirculation(v); - } + } + else if(nbNod == 8){ + hexahedron h(x, y, z); + if(nbComp == 1){ + if(!levelsetPositive) res += h.integrate(v); + else res += h.integrateLevelsetPositive(v); } - else if(dim == 2){ - if(nbNod == 3){ - triangle t(x, y, z); - if(nbComp == 1){ - if(!levelsetPositive) - res += t.integrate(v); - else{ - double ONES[] = { 1.0 , 1.0 , 1.0 }; - const double area = t.integrate(ONES); - const double SUM = v[0] + v[1] + v[2]; - const double SUMABS = fabs(v[0]) + fabs(v[1]) + fabs (v[2]); - if(SUMABS){ - const double XI = SUM / SUMABS; - res += area * (1 - XI) * 0.5 ; - } - } - } - else if(nbComp == 3) res += t.integrateFlux(v); - } - else if(nbNod == 4){ - quadrangle q(x, y, z); - if(nbComp == 1) { - if(!levelsetPositive) - { - res += q.integrate(v); - } - else - { - double ONES[] = { 1.0 , 1.0 , 1.0 , 1.0}; - const double area = q.integrate(ONES); - const double SUM = v[0] + v[1] + v[2] + v[3]; - const double SUMABS = fabs(v[0]) + fabs(v[1]) + fabs (v[2]) + fabs (v[3]); - if(SUMABS != 0.0){ - const double XI = SUM / SUMABS; - res += area * (1 - XI) * 0.5 ; - } - } - } - else if(nbComp == 3) res += q.integrateFlux(v); - } + } + else if(nbNod == 6){ + prism p(x, y, z); + if(nbComp == 1){ + if(!levelsetPositive) res += p.integrate(v); + else res += p.integrateLevelsetPositive(v); } - else if(dim == 3) - { - if(nbNod == 4) - { - tetrahedron t(x, y, z); - if(nbComp == 1) - { - if ( ! levelsetPositive ) - res += t.integrate(v); - else - { - double ONES[] = { 1.0 , 1.0 , 1.0, 1.0 }; - const double area = fabs(t.integrate (ONES)); - const double SUM = v[0] + v[1] + v[2] + v[3]; - const double SUMABS = fabs(v[0]) + fabs(v[1]) + fabs (v[2]) + fabs (v[3]); - const double XI = SUM / SUMABS; - res += area * (1 - XI) * 0.5 ; - } - } - } - else if(nbNod == 8){ - hexahedron h(x, y, z); - if(nbComp == 1) - { - if ( ! levelsetPositive ) - res += h.integrate(v); - else - { - double ONES[] = { 1.0 , 1.0 , 1.0, 1.0 ,1,1,1,1}; - const double area = fabs(h.integrate (ONES)); - const double SUM = v[0] + v[1] + v[2] + v[3]+v[4] + v[5] + v[6] + v[7]; - const double SUMABS = fabs(v[0]) + fabs(v[1]) + fabs (v[2]) + fabs (v[3]) + - fabs(v[4]) + fabs(v[5]) + fabs (v[6]) + fabs (v[7]); - if (SUMABS) - { - const double XI = SUM / SUMABS; - res += area * (1 - XI) * 0.5 ; - } - } - } - } - else if(nbNod == 6){ - prism p(x, y, z); - if(nbComp == 1) res += p.integrate(v); - } - else if(nbNod == 5){ - pyramid p(x, y, z); - if(nbComp == 1) res += p.integrate(v); - } + } + else if(nbNod == 5){ + pyramid p(x, y, z); + if(nbComp == 1){ + if(!levelsetPositive) res += p.integrate(v); + else res += p.integrateLevelsetPositive(v); } + } } -// printf("integration res = %22.15E\n",res); - return res; + } + // printf("integration res = %22.15E\n",res); + return res; } + Post_View *GMSH_IntegratePlugin::execute(Post_View * v) { - int iView = (int)IntegrateOptions_Number[0].def; - - if(iView < 0) - iView = v ? v->Index : 0; - - if(!List_Pointer_Test(CTX.post.list, iView)) { - Msg(GERROR, "View[%d] does not exist", iView); - return v; - } - - Post_View *v1 = *(Post_View **)List_Pointer(CTX.post.list, iView); - Post_View *v2 = BeginView(1); - - double x = (v1->BBox[0]+v1->BBox[1])/2.; - double y = (v1->BBox[2]+v1->BBox[3])/2.; - double z = (v1->BBox[4]+v1->BBox[5])/2.; - List_Add(v2->SP, &x); - List_Add(v2->SP, &y); - List_Add(v2->SP, &z); - for(int ts = 0; ts < v1->NbTimeStep; ts++){ - double val = 0; -// scalar fields - val += integrate(v1->NbSP, v1->SP, 0, 1, 1, ts); - val += integrate(v1->NbSL, v1->SL, 1, 2, 1, ts); - val += integrate(v1->NbST, v1->ST, 2, 3, 1, ts); - val += integrate(v1->NbSQ, v1->SQ, 2, 4, 1, ts); - val += integrate(v1->NbSS, v1->SS, 3, 4, 1, ts); - val += integrate(v1->NbSH, v1->SH, 3, 8, 1, ts); - val += integrate(v1->NbSI, v1->SI, 3, 6, 1, ts); - val += integrate(v1->NbSY, v1->SY, 3, 5, 1, ts); -// circulations - val += integrate(v1->NbVL, v1->VL, 1, 2, 3, ts); -// fluxes - val += integrate(v1->NbVT, v1->VT, 2, 3, 3, ts); - val += integrate(v1->NbVQ, v1->VQ, 2, 4, 3, ts); - Msg(INFO, "Step %d: integral = %.16g", ts, val); - List_Add(v2->SP, &val); - } - v2->NbSP = 1; - v2->IntervalsType = DRAW_POST_NUMERIC; - -// copy time data - for(int i = 0; i < List_Nbr(v1->Time); i++) - List_Add(v2->Time, List_Pointer(v1->Time, i)); -// finalize - char name[1024], filename[1024]; - sprintf(name, "%s_Integrate", v1->Name); - sprintf(filename, "%s_Integrate.pos", v1->Name); - EndView(v2, 1, filename, name); - - return v2; + int iView = (int)IntegrateOptions_Number[0].def; + + if(iView < 0) + iView = v ? v->Index : 0; + + if(!List_Pointer_Test(CTX.post.list, iView)) { + Msg(GERROR, "View[%d] does not exist", iView); + return v; + } + + Post_View *v1 = *(Post_View **)List_Pointer(CTX.post.list, iView); + Post_View *v2 = BeginView(1); + + double x = (v1->BBox[0]+v1->BBox[1])/2.; + double y = (v1->BBox[2]+v1->BBox[3])/2.; + double z = (v1->BBox[4]+v1->BBox[5])/2.; + List_Add(v2->SP, &x); + List_Add(v2->SP, &y); + List_Add(v2->SP, &z); + for(int ts = 0; ts < v1->NbTimeStep; ts++){ + double val = 0; + // scalar fields + val += integrate(v1->NbSP, v1->SP, 0, 1, 1, ts); + val += integrate(v1->NbSL, v1->SL, 1, 2, 1, ts); + val += integrate(v1->NbST, v1->ST, 2, 3, 1, ts); + val += integrate(v1->NbSQ, v1->SQ, 2, 4, 1, ts); + val += integrate(v1->NbSS, v1->SS, 3, 4, 1, ts); + val += integrate(v1->NbSH, v1->SH, 3, 8, 1, ts); + val += integrate(v1->NbSI, v1->SI, 3, 6, 1, ts); + val += integrate(v1->NbSY, v1->SY, 3, 5, 1, ts); + // circulations + val += integrate(v1->NbVL, v1->VL, 1, 2, 3, ts); + // fluxes + val += integrate(v1->NbVT, v1->VT, 2, 3, 3, ts); + val += integrate(v1->NbVQ, v1->VQ, 2, 4, 3, ts); + Msg(INFO, "Step %d: integral = %.16g", ts, val); + List_Add(v2->SP, &val); + } + v2->NbSP = 1; + v2->IntervalsType = DRAW_POST_NUMERIC; + + // copy time data + for(int i = 0; i < List_Nbr(v1->Time); i++) + List_Add(v2->Time, List_Pointer(v1->Time, i)); + // finalize + char name[1024], filename[1024]; + sprintf(name, "%s_Integrate", v1->Name); + sprintf(filename, "%s_Integrate.pos", v1->Name); + EndView(v2, 1, filename, name); + + return v2; } diff --git a/Plugin/Lambda2.cpp b/Plugin/Lambda2.cpp index 2be82101660e858572ee46e85edf20cb14431b2b..056c602634e537381300ed013035e2b660c18418 100644 --- a/Plugin/Lambda2.cpp +++ b/Plugin/Lambda2.cpp @@ -1,4 +1,4 @@ -// $Id: Lambda2.cpp,v 1.1 2004-11-26 10:31:54 remacle Exp $ +// $Id: Lambda2.cpp,v 1.2 2004-11-26 16:16:39 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -30,10 +30,6 @@ #include <math.h> #include <stdio.h> -#if defined(HAVE_MATH_EVAL) -#include "matheval.h" -#endif - extern Context_T CTX; StringXNumber Lambda2Options_Number[] = { @@ -41,7 +37,6 @@ StringXNumber Lambda2Options_Number[] = { {GMSH_FULLRC, "iView", NULL, -1.} }; - extern "C" { GMSH_Plugin *GMSH_RegisterLambda2Plugin() @@ -50,7 +45,6 @@ extern "C" } } - GMSH_Lambda2Plugin::GMSH_Lambda2Plugin() { ; @@ -79,7 +73,7 @@ void GMSH_Lambda2Plugin::getInfos(char *author, char *copyright, "If `iView' < 0, the plugin is run\n" "on the current view.\n" "\n" - "Plugin(Lambda2) is executed in-place.\n"); + "Plugin(Lambda2) creates one noew view.\n"); } int GMSH_Lambda2Plugin::getNbOptions() const @@ -97,45 +91,44 @@ void GMSH_Lambda2Plugin::catchErrorMessage(char *errorMessage) const strcpy(errorMessage, "Lambda2 failed..."); } -//----------------------------------------------------------------------------- static void eigen(List_T *inList, int inNb, List_T *outListScalar, int *outNbScalar, int nbTime, int nbNod, int nbComp, int lam) { - if(!inNb) return; int outNbComp, *outNb; List_T *outList; - + outNbComp = 1; outNb = outNbScalar; outList = outListScalar; - + int nb = List_Nbr(inList) / inNb; - + //boucle sur les elements //----------------------- for(int i = 0; i < List_Nbr(inList); i += nb) { - + for(int j = 0; j < 3 * nbNod; j++) List_Add(outList, List_Pointer_Fast(inList, i + j)); - + for(int j = 0; j < nbTime; j++){ double *x = (double *)List_Pointer_Fast(inList, i); double *y = (double *)List_Pointer_Fast(inList, i + nbNod); double *z = (double *)List_Pointer_Fast(inList, i + 2 * nbNod); + double *v = (double *)List_Pointer_Fast(inList, i + 3 * nbNod + + nbNod * nbComp * j + nbComp * 0); double GradVel[3][3]; - double *v = (double *)List_Pointer_Fast(inList, i + 3 * nbNod + nbNod * nbComp * j + nbComp * 0); GradVel[0][0] = v[0]; GradVel[0][1] = v[1]; GradVel[0][2] = v[2]; GradVel[1][0] = v[3]; GradVel[1][1] = v[4]; GradVel[1][2] = v[5]; GradVel[2][0] = v[6]; GradVel[2][1] = v[7]; GradVel[2][2] = v[8]; - + //par element //------------ - + //calcul partie sym et antisymetrique double sym[3][3]; double asym[3][3]; @@ -156,7 +149,7 @@ static void eigen(List_T *inList, int inNb, //calcul de lambda avec tri double lambda[3]; eigenvalue(a, lambda); - + double res; for(int k = 0; k < nbNod; k++){ for(int l = 0; l < outNbComp; l++){ @@ -167,46 +160,34 @@ static void eigen(List_T *inList, int inNb, } (*outNb)++; } - } -//----------------------------------------------------------------------------- Post_View *GMSH_Lambda2Plugin::execute(Post_View * v) { int ev = (int)Lambda2Options_Number[0].def; int iView = (int)Lambda2Options_Number[1].def; - + if(iView < 0) iView = v ? v->Index : 0; - + if(!List_Pointer_Test(CTX.post.list, iView)) { Msg(GERROR, "View[%d] does not exist", iView); return v; } + Post_View *v1 = *(Post_View **)List_Pointer(CTX.post.list, iView); Post_View *v2 = BeginView(1); - Post_View *v1 = (Post_View*)List_Pointer(CTX.post.list, iView); - eigen(v1->TT, v1->NbTT, v2->ST, &v2->NbSS, v1->NbTimeStep, 3, 9, ev); - eigen(v1->TS, v1->NbTS, v2->SS, &v2->NbSS, v1->NbTimeStep, 4, 9, ev); - - if(v2->empty()) { - RemoveViewByNumber(v2->Num); - return v1; - } - else{ - // copy time data - for(int i = 0; i < List_Nbr(v1->Time); i++) - List_Add(v2->Time, List_Pointer(v1->Time, i)); - // finalize - char name[1024], filename[1024]; - sprintf(name, "%s_Extract", v1->Name); - sprintf(filename, "%s_Extract.pos", v1->Name); - EndView(v2, 1, filename, name); - return v2; - - } + + // copy time data + for(int i = 0; i < List_Nbr(v1->Time); i++) + List_Add(v2->Time, List_Pointer(v1->Time, i)); + // finalize + char name[1024], filename[1024]; + sprintf(name, "%s_Extract", v1->Name); + sprintf(filename, "%s_Extract.pos", v1->Name); + EndView(v2, 1, filename, name); + return v2; } -//------------------------------------------------------------------ diff --git a/Plugin/ShapeFunctions.h b/Plugin/ShapeFunctions.h index 68b1d1a3dcc906769793bfd260138a2088a6e2c0..8e5c246ce79b32533cd873875ee27aa1a28120e9 100644 --- a/Plugin/ShapeFunctions.h +++ b/Plugin/ShapeFunctions.h @@ -93,6 +93,20 @@ public: } return sum; } + double integrateLevelsetPositive(double val[]) + { + double ones[8] = {1., 1., 1., 1., 1., 1., 1., 1.}; // FIXME: 8-node max + double area = integrate(ones); + double sum = 0, sumabs = 0.; + for(int i = 0; i < getNumNodes(); i++){ + sum += val[i]; + sumabs += fabs(val[i]); + } + double res = 0.; + if(sumabs) + res = area * (1 - sum/sumabs) * 0.5 ; + return res; + } }; class point : public element{