diff --git a/Plugin/DisplacementRaise.cpp b/Plugin/DisplacementRaise.cpp new file mode 100644 index 0000000000000000000000000000000000000000..11b2ac618a1753616922ffd8754afd95993f00d7 --- /dev/null +++ b/Plugin/DisplacementRaise.cpp @@ -0,0 +1,201 @@ +// $Id: DisplacementRaise.cpp,v 1.1 2003-11-13 17:39:03 geuzaine Exp $ +// +// Copyright (C) 1997-2003 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 "DisplacementRaise.h" +#include "List.h" +#include "Views.h" +#include "Context.h" +#include "Numeric.h" + +extern Context_T CTX; + +StringXNumber DisplacementRaiseOptions_Number[] = { + {GMSH_FULLRC, "Factor", NULL, 1.}, + {GMSH_FULLRC, "TimeStep", NULL, 0.}, + {GMSH_FULLRC, "dView", NULL, -1.}, + {GMSH_FULLRC, "iView", NULL, -1.} +}; + +extern "C" +{ + GMSH_Plugin *GMSH_RegisterDisplacementRaisePlugin() + { + return new GMSH_DisplacementRaisePlugin(); + } +} + + +GMSH_DisplacementRaisePlugin::GMSH_DisplacementRaisePlugin() +{ + ; +} + +void GMSH_DisplacementRaisePlugin::getName(char *name) const +{ + strcpy(name, "Displacement raise"); +} + +void GMSH_DisplacementRaisePlugin::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, + "DisplacementRaise transforms the coordinates\n" + "of the elements in a view (iView) according\n" + "to the vectorial values (the displacements)\n" + "associated with the elements of another\n" + "view (dView).\n" + "Script name: Plugin(DisplacementRaise)."); +} + +int GMSH_DisplacementRaisePlugin::getNbOptions() const +{ + return sizeof(DisplacementRaiseOptions_Number) / sizeof(StringXNumber); +} + +StringXNumber *GMSH_DisplacementRaisePlugin::GetOption(int iopt) +{ + return &DisplacementRaiseOptions_Number[iopt]; +} + +void GMSH_DisplacementRaisePlugin::CatchErrorMessage(char *errorMessage) const +{ + strcpy(errorMessage, "DisplacementRaise failed..."); +} + +static void displacementRaiseList(Post_View * iView, List_T * iList, int iNbElm, + Post_View * dView, List_T * dList, int dNbElm, + int nbVert, double factor, int dTimeStep) +{ + if(!iNbElm) + return; + + if(iNbElm != dNbElm){ + Msg(GERROR, "View[%d] and View[%d] have different number of elements (%d != %d)", + iView->Index, dView->Index, iNbElm, dNbElm); + return; + } + + // should we treat multiple time steps by generating new views + // (cf. time dependent CutMaps)? + if(dTimeStep < 0 || dTimeStep > dView->NbTimeStep - 1){ + dTimeStep = 0; + Msg(WARNING, "Invalid TimeStep (%d) in View[%d]: choosing TimeStep 0", + dTimeStep, dView->Index); + } + + iView->Changed = 1; + + // for each element + // for each node + // compute (x,y,z)_new = (x,y,z)_old + factor*(valx,valy,valz) + + int iNb = List_Nbr(iList) / iNbElm; + int dNb = List_Nbr(dList) / dNbElm; + int j = 0; + for(int i = 0; i < List_Nbr(iList); i += iNb) { + double *x = (double *)List_Pointer_Fast(iList, i); + double *y = (double *)List_Pointer_Fast(iList, i + nbVert); + double *z = (double *)List_Pointer_Fast(iList, i + 2 * nbVert); + j += dNb; + double *val = (double *)List_Pointer_Fast(dList, j + 3 * nbVert); + for(int k = 0; k < nbVert; k++) { + x[k] += factor * val[3 * nbVert * dTimeStep + 3 * k]; + y[k] += factor * val[3 * nbVert * dTimeStep + 3 * k + 1]; + z[k] += factor * val[3 * nbVert * dTimeStep + 3 * k + 2]; + } + } + +} + +static void displacementRaise(Post_View * v, Post_View * w, double factor, int ts) +{ + displacementRaiseList(v, v->SP, v->NbSP, w, w->VP, w->NbVP, 1, factor, ts); + displacementRaiseList(v, v->SL, v->NbSL, w, w->VL, w->NbVL, 2, factor, ts); + displacementRaiseList(v, v->ST, v->NbST, w, w->VT, w->NbVT, 3, factor, ts); + displacementRaiseList(v, v->SQ, v->NbSQ, w, w->VQ, w->NbVQ, 4, factor, ts); + displacementRaiseList(v, v->SS, v->NbSS, w, w->VS, w->NbVS, 4, factor, ts); + displacementRaiseList(v, v->SH, v->NbSH, w, w->VH, w->NbVH, 8, factor, ts); + displacementRaiseList(v, v->SI, v->NbSI, w, w->VI, w->NbVI, 6, factor, ts); + displacementRaiseList(v, v->SY, v->NbSY, w, w->VY, w->NbVY, 5, factor, ts); + + displacementRaiseList(v, v->VP, v->NbVP, w, w->VP, w->NbVP, 1, factor, ts); + displacementRaiseList(v, v->VL, v->NbVL, w, w->VL, w->NbVL, 2, factor, ts); + displacementRaiseList(v, v->VT, v->NbVT, w, w->VT, w->NbVT, 3, factor, ts); + displacementRaiseList(v, v->VQ, v->NbVQ, w, w->VQ, w->NbVQ, 4, factor, ts); + displacementRaiseList(v, v->VS, v->NbVS, w, w->VS, w->NbVS, 4, factor, ts); + displacementRaiseList(v, v->VH, v->NbVH, w, w->VH, w->NbVH, 8, factor, ts); + displacementRaiseList(v, v->VI, v->NbVI, w, w->VI, w->NbVI, 6, factor, ts); + displacementRaiseList(v, v->VY, v->NbVY, w, w->VY, w->NbVY, 5, factor, ts); + + displacementRaiseList(v, v->TP, v->NbTP, w, w->VP, w->NbVP, 1, factor, ts); + displacementRaiseList(v, v->TL, v->NbTL, w, w->VL, w->NbVL, 2, factor, ts); + displacementRaiseList(v, v->TT, v->NbTT, w, w->VT, w->NbVT, 3, factor, ts); + displacementRaiseList(v, v->TQ, v->NbTQ, w, w->VQ, w->NbVQ, 4, factor, ts); + displacementRaiseList(v, v->TS, v->NbTS, w, w->VS, w->NbVS, 4, factor, ts); + displacementRaiseList(v, v->TH, v->NbTH, w, w->VH, w->NbVH, 8, factor, ts); + displacementRaiseList(v, v->TI, v->NbTI, w, w->VI, w->NbVI, 6, factor, ts); + displacementRaiseList(v, v->TY, v->NbTY, w, w->VY, w->NbVY, 5, factor, ts); +} + +Post_View *GMSH_DisplacementRaisePlugin::execute(Post_View * v) +{ + Post_View *vv, *ww; + + double factor = DisplacementRaiseOptions_Number[0].def; + int timeStep = (int)DisplacementRaiseOptions_Number[1].def; + int dView = (int)DisplacementRaiseOptions_Number[2].def; + int iView = (int)DisplacementRaiseOptions_Number[3].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(GERROR, "View[%d] does not exist", iView); + return 0; + } + } + + if(dView < 0){ + dView = vv->Index + 1; // by default, try to use the next view + } + if(!(ww = (Post_View *) List_Pointer_Test(CTX.post.list, dView))) { + Msg(GERROR, "View[%d] does not exist", dView); + return 0; + } + + displacementRaise(vv, ww, factor, timeStep); + return vv; +} + +void GMSH_DisplacementRaisePlugin::Run() +{ + execute(0); +} + +void GMSH_DisplacementRaisePlugin::Save() +{ + ; +} diff --git a/Plugin/DisplacementRaise.h b/Plugin/DisplacementRaise.h new file mode 100644 index 0000000000000000000000000000000000000000..1fd1679ea9b1ad4fe8ade5787e2457ca799b2d92 --- /dev/null +++ b/Plugin/DisplacementRaise.h @@ -0,0 +1,43 @@ +#ifndef _DISPLACEMENT_RAISE_H_ +#define _DISPLACEMENT_RAISE_H + +// Copyright (C) 1997-2003 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". + +extern "C" +{ + GMSH_Plugin *GMSH_RegisterDisplacementRaisePlugin (); +} + +class GMSH_DisplacementRaisePlugin : public GMSH_Post_Plugin +{ +public: + GMSH_DisplacementRaisePlugin(); + void Run(); + void Save(); + void getName (char *name) const; + void getInfos (char *author, + char *copyright, + char *help_text) const; + void CatchErrorMessage (char *errorMessage) const; + int getNbOptions() const; + StringXNumber* GetOption (int iopt); + Post_View *execute (Post_View *); +}; +#endif diff --git a/Plugin/Makefile b/Plugin/Makefile index 7b24e05b5d4334409eec0c9535f6ed172a5927d8..ee7cf81f2754589690253031714ef751ad18236e 100644 --- a/Plugin/Makefile +++ b/Plugin/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.36 2003-06-18 20:47:41 geuzaine Exp $ +# $Id: Makefile,v 1.37 2003-11-13 17:39:03 geuzaine Exp $ # # Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle # @@ -33,6 +33,7 @@ SRC = Plugin.cpp\ Transform.cpp\ Triangulate.cpp\ SphericalRaise.cpp\ + DisplacementRaise.cpp\ Skin.cpp\ DecomposeInSimplex.cpp\ Harmonic2Time.cpp diff --git a/Plugin/Plugin.cpp b/Plugin/Plugin.cpp index 92bc9b3d8dc2e475e50e0d08ad3959f54542e279..dcaec12ab07d91ce39d80194f5fdaf36f30ecc64 100644 --- a/Plugin/Plugin.cpp +++ b/Plugin/Plugin.cpp @@ -1,4 +1,4 @@ -// $Id: Plugin.cpp,v 1.41 2003-06-18 20:47:41 geuzaine Exp $ +// $Id: Plugin.cpp,v 1.42 2003-11-13 17:39:03 geuzaine Exp $ // // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle // @@ -42,6 +42,7 @@ #include "Transform.h" #include "Triangulate.h" #include "SphericalRaise.h" +#include "DisplacementRaise.h" using namespace std; @@ -155,6 +156,8 @@ void GMSH_PluginManager::RegisterDefaultPlugins() #endif allPlugins.insert(std::pair < char *, GMSH_Plugin * > ("SphericalRaise", GMSH_RegisterSphericalRaisePlugin())); + allPlugins.insert(std::pair < char *, GMSH_Plugin * > + ("DisplacementRaise", GMSH_RegisterDisplacementRaisePlugin())); #if defined(HAVE_FLTK) struct dirent **list;