From 2341211bd5162eeff33e33ce192bc03559e3c7e9 Mon Sep 17 00:00:00 2001 From: Ruth Sabariego <ruth.sabariego@esat.kuleuven.be> Date: Tue, 2 Nov 2010 11:01:51 +0000 Subject: [PATCH] Plugin for computing u=a*exp(j*k*phi), from views containing a complex amplitude a, and a phase phi. --- Plugin/FieldFromAmplitudePhase.cpp | 147 +++++++++++++++++++++++++++++ Plugin/FieldFromAmplitudePhase.h | 33 +++++++ 2 files changed, 180 insertions(+) create mode 100644 Plugin/FieldFromAmplitudePhase.cpp create mode 100644 Plugin/FieldFromAmplitudePhase.h diff --git a/Plugin/FieldFromAmplitudePhase.cpp b/Plugin/FieldFromAmplitudePhase.cpp new file mode 100644 index 0000000000..55b305278f --- /dev/null +++ b/Plugin/FieldFromAmplitudePhase.cpp @@ -0,0 +1,147 @@ +// Gmsh - Copyright (C) 1997-2010 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// bugs and problems to <gmsh@geuz.org>. + +#include <stdlib.h> +#include "Gmsh.h" +#include "GmshConfig.h" +#include "GModel.h" +#include "MElement.h" +#include "OctreePost.h" +#include "FieldFromAmplitudePhase.h" + + +StringXNumber FieldFromAmplitudePhaseOptions_Number[] = { + {GMSH_FULLRC, "Wavenumber", NULL, 5.}, + {GMSH_FULLRC, "AmplitudeView", NULL, 0.}, + {GMSH_FULLRC, "PhaseView", NULL, 1.}, +}; + +StringXString FieldFromAmplitudePhaseOptions_String[] = { + {GMSH_FULLRC, "MeshFile", NULL, "fine.msh"} +}; + + +extern "C" +{ + GMSH_Plugin *GMSH_RegisterFieldFromAmplitudePhasePlugin() + { + return new GMSH_FieldFromAmplitudePhasePlugin(); + } +} + +std::string GMSH_FieldFromAmplitudePhasePlugin::getHelp() const +{ + return "Plugin(FieldFromAmplitudePhase) builds a complex field 'u' from " + "amplitude 'a' (complex) and phase 'phi' given in two different 'Views' " + "u = a * exp(k*phi), with k the wavenumber. \n\n" + "The result is to be interpolated in a sufficiently fine mesh: " + "'MeshFile'. \n\n" + "Plugin(FieldFromAmplitudePhase) generates one new view."; +} + +int GMSH_FieldFromAmplitudePhasePlugin::getNbOptions() const +{ + return sizeof(FieldFromAmplitudePhaseOptions_Number) / sizeof(StringXNumber); +} + +StringXNumber *GMSH_FieldFromAmplitudePhasePlugin::getOption(int iopt) +{ + return &FieldFromAmplitudePhaseOptions_Number[iopt]; +} + +int GMSH_FieldFromAmplitudePhasePlugin::getNbOptionsStr() const +{ + return sizeof(FieldFromAmplitudePhaseOptions_String) / sizeof(StringXString); +} + +StringXString *GMSH_FieldFromAmplitudePhasePlugin::getOptionStr(int iopt) +{ + return &FieldFromAmplitudePhaseOptions_String[iopt]; +} + +PView *GMSH_FieldFromAmplitudePhasePlugin::execute(PView *v) +{ + double k = (double)FieldFromAmplitudePhaseOptions_Number[0].def; + int aView = (int)FieldFromAmplitudePhaseOptions_Number[1].def; + int phiView = (int)FieldFromAmplitudePhaseOptions_Number[2].def; + std::string fileName = FieldFromAmplitudePhaseOptions_String[0].def; + + std::string name_model("") ; + + if(fileName==""){ + Msg::Info("Could not find mesh file for interpolating U=A*exp(j*k*phi)." + " Trying to use current model mesh, instead.") ; + name_model = GModel::current()->getName() ; + fileName = name_model + ".msh" ; + } + + PView *va = getView(aView, v); + if(!va) return v; + PViewData *aData = va->getData(); + if(aData->getNumTimeSteps() != 2){ + Msg::Error("Invalid number of time steps for AView, it must be complex!"); + return v ; + } + + PView *vphi = getView(phiView, v); + if(!vphi){ + Msg::Error("FieldFromAmplitudePhase plugin could not find PhiView %i", phiView); + return v; + } + PViewData *phiData = vphi->getData(); + + if(aData->hasMultipleMeshes() || phiData->hasMultipleMeshes()){ + Msg::Error("FieldFromAmplitudePhase plugin cannot be run on multi-mesh views"); + return v; + } + + OctreePost *oA = 0, *oPhi = 0 ; + oA = new OctreePost(va); + oPhi = new OctreePost(vphi); + + GModel *umodel = new GModel ; + umodel->readMSH(fileName) ; + std::vector<GEntity*> _entities ; + umodel->getEntities(_entities) ; + + std::set<MVertex*> ve; + std::map<int, std::vector<double> > dataR ; + std::map<int, std::vector<double> > dataI ; + + for(unsigned int ent = 0; ent < _entities.size(); ent++) + for(unsigned int ele = 0; ele < _entities[ent]->getNumMeshElements(); ele++){ + MElement *e = _entities[ent]->getMeshElement(ele); + for(int nod = 0; nod < e->getNumVertices() ; nod++) + ve.insert(e->getVertex(nod)); + } + + for (std::set<MVertex*>::iterator it = ve.begin(); it != ve.end(); ++it){ + double phi, ar, ai ; + std::vector<double> uR(1) ; + std::vector<double> uI(1) ; + oPhi->searchScalar((*it)->x(), (*it)->y(), (*it)->z(), &phi, 0); + oA->searchScalar((*it)->x(), (*it)->y(), (*it)->z(), &ar, 0); + oA->searchScalar((*it)->x(), (*it)->y(), (*it)->z(), &ai, 1); + + uR[0] = ar * cos(k*phi) - ai * sin(k*phi) ; + uI[0] = ar * sin(k*phi) + ai* cos(k*phi) ; + + dataR[(*it)->getNum()] = uR ; + dataI[(*it)->getNum()] = uI ; + } + + delete oA ; + delete oPhi; + + PView *vu = new PView("FieldFromAPhi","NodeData", umodel, dataR, 0.0, 1) ; + vu->addStep(umodel, dataI, 1); + + if(name_model.empty()) + umodel->setName("fine"); + else + umodel->setName(name_model); + + return vu; +} diff --git a/Plugin/FieldFromAmplitudePhase.h b/Plugin/FieldFromAmplitudePhase.h new file mode 100644 index 0000000000..ea8293bf77 --- /dev/null +++ b/Plugin/FieldFromAmplitudePhase.h @@ -0,0 +1,33 @@ +// Gmsh - Copyright (C) 1997-2010 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// bugs and problems to <gmsh@geuz.org>. + +#ifndef _FIELD_FROM_AMPLITUDE_PHASE_H_ +#define _FIELD_FROM_AMPLITUDE_PHASE_H_ + +#include "Plugin.h" + +extern "C" +{ + GMSH_Plugin *GMSH_RegisterFieldFromAmplitudePhasePlugin(); +} + +class GMSH_FieldFromAmplitudePhasePlugin : public GMSH_PostPlugin +{ + public: + GMSH_FieldFromAmplitudePhasePlugin(){} + std::string getName() const { return "FieldFromAmplitudePhase"; } + std::string getShortHelp() const + { + return "Compute field from amplitude and phase"; + } + std::string getHelp() const; + int getNbOptions() const; + StringXNumber *getOption(int iopt); + int getNbOptionsStr() const; + StringXString* getOptionStr(int iopt); + PView *execute(PView *); +}; + +#endif -- GitLab