diff --git a/Plugin/CMakeLists.txt b/Plugin/CMakeLists.txt index 38315d9c01e046c83fb9bdf7db7947056ec32cef..0ffd46c933e5c78fad7edf8b96a355ec4bdf7b26 100644 --- a/Plugin/CMakeLists.txt +++ b/Plugin/CMakeLists.txt @@ -1,4 +1,4 @@ -# Gmsh - Copyright (C) 1997-2011 C. Geuzaine, J.-F. Remacle +# 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>. @@ -6,16 +6,16 @@ set(SRC Plugin.cpp PluginManager.cpp Levelset.cpp - CutPlane.cpp CutSphere.cpp Isosurface.cpp + CutPlane.cpp CutSphere.cpp Isosurface.cpp Smooth.cpp CutParametric.cpp Lambda2.cpp Eigenvectors.cpp Eigenvalues.cpp - StreamLines.cpp Particles.cpp CutGrid.cpp CutBox.cpp + StreamLines.cpp Particles.cpp CutGrid.cpp Transform.cpp LongitudeLatitude.cpp Triangulate.cpp Tetrahedralize.cpp Warp.cpp SphericalRaise.cpp - Skin.cpp GSHHS.cpp + Skin.cpp GSHHS.cpp MathEval.cpp ModifyComponent.cpp ExtractElements.cpp MakeSimplex.cpp Integrate.cpp Gradient.cpp Curl.cpp Divergence.cpp @@ -24,9 +24,9 @@ set(SRC HarmonicToTime.cpp ModulusPhase.cpp HomologyComputation.cpp Distance.cpp ExtractEdges.cpp NearestNeighbor.cpp - AnalyseCurvedMesh.cpp FieldFromAmplitudePhase.cpp - Bubbles.cpp NearToFarField.cpp + AnalyseCurvedMesh.cpp + DiscretizationError.cpp ) -file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) +file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) append_gmsh_src(Plugin "${SRC};${HDR}") diff --git a/Plugin/DiscretizationError.cpp b/Plugin/DiscretizationError.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a4cf71828160b66422c15fce2b6bc1c10d66138f --- /dev/null +++ b/Plugin/DiscretizationError.cpp @@ -0,0 +1,149 @@ +// Gmsh - Copyright (C) 1997-2011 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// bugs and problems to <gmsh@geuz.org>. + +#include "DiscretizationError.h" +#include "Numeric.h" +#include <GEntity.h> +#include <GModel.h> +#include <Context.h> + +// only temp for syntax higlighting +#include <MQuadrangle.h> +#include <MTriangle.h> + +StringXNumber DiscretizationErrorOptions_Number[] = { + {GMSH_FULLRC, "SuperSamplingNodes", NULL, 10.} +}; + +extern "C" +{ + GMSH_Plugin *GMSH_RegisterDiscretizationErrorPlugin() { + return new GMSH_DiscretizationErrorPlugin(); + } +} + +std::string GMSH_DiscretizationErrorPlugin::getHelp() const +{ + return "Plugin(DiscretizationError) computes the error between the mesh and the geometry. It does so by supersampling the elements and computing the distance between the supersampled points dans their projection on the geometry."; +} + +int GMSH_DiscretizationErrorPlugin::getNbOptions() const +{ + return sizeof(DiscretizationErrorOptions_Number) / sizeof(StringXNumber); +} + +StringXNumber *GMSH_DiscretizationErrorPlugin::getOption(int iopt) +{ + return &DiscretizationErrorOptions_Number[iopt]; +} + +PView *GMSH_DiscretizationErrorPlugin::execute(PView *v) +{ + double tol = CTX::instance()->geom.tolerance; + int nEdgeNodes = (int)DiscretizationErrorOptions_Number[0].def; + double paramQuandt = 1.0 / (nEdgeNodes -1) - 10*tol; + double paramQuandtQuad = 2.0 / (nEdgeNodes - 1) - 10*tol; + int i, j, k, counter; + double startEstimate[2] = {0.5, 0.5}; // used as a start estimate for u,v when performing an orthogonal projection + double dx,dy,dz,distance; + + std::vector< std::pair<SPoint3,double> > quadDist(nEdgeNodes*nEdgeNodes); + std::vector< std::pair<SPoint3,double> > triDist((nEdgeNodes + 1)*nEdgeNodes / 2); + + PView *v2 = new PView(); + PViewDataList *data2 = getDataList(v2); + + + for (GModel::fiter itFace = GModel::current()->firstFace(); itFace != GModel::current()->lastFace(); ++itFace) { + + // sample quadrangles + /* 13 14 15 16 + * 9 10 11 12 + * 5 6 7 8 + * 1 2 3 4 + */ + for (std::vector<MQuadrangle*>::iterator itQuad = (*itFace)->quadrangles.begin(); itQuad != (*itFace)->quadrangles.end(); ++itQuad) { + for (j = 0; j < nEdgeNodes; j++) { // u + for (i = 0; i < nEdgeNodes; i++) { // v + (*itQuad)->pnt(-1+5*tol+paramQuandtQuad*i, -1+5*tol+paramQuandtQuad*j, 0.0, quadDist[j*(nEdgeNodes) + i].first); + SPoint3 *point = &quadDist[j*(nEdgeNodes) + i].first; + GPoint closest = (*itFace)->closestPoint(*point,startEstimate); + dx = closest.x() - point->x(); + dy = closest.y() - point->y(); + dz = closest.z() - point->z(); + quadDist[j*(nEdgeNodes) + i].second = sqrt(dx*dx + dy*dy + dz*dz); + } + } + for (j = 0; j < nEdgeNodes - 1; j++) { + for (i = 0; i < nEdgeNodes - 1; i++) { + std::vector<double> *out = data2->incrementList(1, TYPE_QUA); + int indices[4] = {i+j*nEdgeNodes, i+j*nEdgeNodes+1, i+(j+1)*nEdgeNodes+1, i+(j+1)*nEdgeNodes}; + for (k = 0; k < 4; k++) out->push_back(quadDist[indices[k]].first.x()); + for (k = 0; k < 4; k++) out->push_back(quadDist[indices[k]].first.y()); + for (k = 0; k < 4; k++) out->push_back(quadDist[indices[k]].first.z()); + for (k = 0; k < 4; k++) out->push_back(quadDist[indices[k]].second); + } + } + } + + // sample triangles + /* 10 + * 6 9 + * 3 5 8 + * 1 2 4 7 + */ + for (std::vector<MTriangle*>::iterator itTri = (*itFace)->triangles.begin(); itTri != (*itFace)->triangles.end(); ++itTri) { + counter = 0; + for (i = 0; i < nEdgeNodes; i++) { + for (j = 0; j < (i + 1); j++) { + (*itTri)->pnt(5*tol + paramQuandt*(i - j), 5*tol + paramQuandt*j, 0.0, triDist[counter].first); + SPoint3 *point = &triDist[counter].first; // Check : the points are good + GPoint closest = (*itFace)->closestPoint(*point,startEstimate); + dx = (closest.x() - point->x()); + dy = (closest.y() - point->y()); + dz = (closest.z() - point->z()); + triDist[counter].second = sqrt(dx*dx + dy*dy + dz*dz); + counter++; + } + } + + int indices[3]; + for (j = 0; j < nEdgeNodes - 1; j++) { // row in the triangle + bool odd = false; + for (i = 0; i < j*2 + 1; i ++) { // small tri in the row + if (!odd) { + indices[0] = i / 2 + (j+1)*j/2; + indices[1] = i / 2 + (j+1)*j/2 + j+1; + indices[2] = i / 2 + (j+1)*j/2 + j+2; + } else { + indices[0] = (i-1)/2 + (j+1)*j/2; + indices[1] = (i-1)/2 + (j+1)*j/2 + j+2; + indices[2] = (i-1)/2 + (j+1)*j/2 + 1; + } + std::vector<double> *out = data2->incrementList(1, TYPE_TRI); + for (k = 0; k < 3; k++) out->push_back(triDist[indices[k]].first.x()); + for (k = 0; k < 3; k++) out->push_back(triDist[indices[k]].first.y()); + for (k = 0; k < 3; k++) out->push_back(triDist[indices[k]].first.z()); + for (k = 0; k < 3; k++) out->push_back(triDist[indices[k]].second); + odd = !odd; + } + + } + + + } + + //viusalize stuff + + + + } + + data2->setName("Discretization Error"); + data2->setFileName("discretization_err.pos"); + data2->finalize(); + + return v2; +} diff --git a/Plugin/DiscretizationError.h b/Plugin/DiscretizationError.h new file mode 100644 index 0000000000000000000000000000000000000000..52336d2b47156d9ab542d71b0c810973915b8a6b --- /dev/null +++ b/Plugin/DiscretizationError.h @@ -0,0 +1,32 @@ +// Gmsh - Copyright (C) 1997-2011 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// bugs and problems to <gmsh@geuz.org>. + +#ifndef _DISCRETIZATION_ERROR_H_ +#define _DISCRETIZATION_ERROR_H_ + +#include "Plugin.h" + +extern "C" +{ + GMSH_Plugin *GMSH_RegisterDiscretizationErrorPlugin(); +} + +class GMSH_DiscretizationErrorPlugin : public GMSH_PostPlugin +{ +public: + GMSH_DiscretizationErrorPlugin(){} + std::string getName() const { return "DiscretizationError"; } + std::string getShortHelp() const + { + return "Computes spline distance to the real geometry."; + } + std::string getHelp() const; + std::string getAuthor() const { return "B. Gorissen, T. Bolemann"; } + int getNbOptions() const; + StringXNumber* getOption(int iopt); + PView *execute(PView *); +}; + +#endif diff --git a/Plugin/PluginManager.cpp b/Plugin/PluginManager.cpp index bfb8adb113ea39783e4544fe6a07d06493291a4b..4c6f6ae93106d272a2ce2fbab7512d111811ad26 100644 --- a/Plugin/PluginManager.cpp +++ b/Plugin/PluginManager.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2011 C. Geuzaine, J.-F. Remacle +// 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>. @@ -17,7 +17,6 @@ #include "CutPlane.h" #include "CutParametric.h" #include "CutSphere.h" -#include "CutBox.h" #include "Skin.h" #include "AnalyseCurvedMesh.h" #include "MathEval.h" @@ -49,9 +48,7 @@ #include "GSHHS.h" #include "HomologyComputation.h" #include "ExtractEdges.h" -#include "FieldFromAmplitudePhase.h" -#include "Bubbles.h" -#include "NearToFarField.h" +#include "DiscretizationError.h" // for testing purposes only :-) #undef HAVE_DLOPEN @@ -92,7 +89,7 @@ GMSH_SolverPlugin *PluginManager::findSolverPlugin() GMSH_Plugin *p = it->second; if(p->getType() == GMSH_Plugin::GMSH_SOLVER_PLUGIN) { return (GMSH_SolverPlugin*)(p); - } + } } return 0; } @@ -108,7 +105,7 @@ void PluginManager::action(std::string pluginName, std::string action, void *dat throw "Unknown plugin action"; } -void PluginManager::setPluginOption(std::string pluginName, std::string option, +void PluginManager::setPluginOption(std::string pluginName, std::string option, std::string value) { GMSH_Plugin *plugin = find(pluginName); @@ -124,7 +121,7 @@ void PluginManager::setPluginOption(std::string pluginName, std::string option, throw "Unknown plugin option name"; } -void PluginManager::setPluginOption(std::string pluginName, std::string option, +void PluginManager::setPluginOption(std::string pluginName, std::string option, double value) { GMSH_Plugin *plugin = find(pluginName); @@ -159,8 +156,6 @@ void PluginManager::registerDefaultPlugins() ("Particles", GMSH_RegisterParticlesPlugin())); allPlugins.insert(std::pair<std::string, GMSH_Plugin*> ("CutGrid", GMSH_RegisterCutGridPlugin())); - allPlugins.insert(std::pair<std::string, GMSH_Plugin*> - ("CutBox", GMSH_RegisterCutBoxPlugin())); allPlugins.insert(std::pair<std::string, GMSH_Plugin*> ("Isosurface", GMSH_RegisterIsosurfacePlugin())); allPlugins.insert(std::pair<std::string, GMSH_Plugin*> @@ -226,11 +221,8 @@ void PluginManager::registerDefaultPlugins() allPlugins.insert(std::pair<std::string, GMSH_Plugin*> ("ExtractEdges", GMSH_RegisterExtractEdgesPlugin())); allPlugins.insert(std::pair<std::string, GMSH_Plugin*> - ("FieldFromAmplitudePhase", GMSH_RegisterFieldFromAmplitudePhasePlugin())); - allPlugins.insert(std::pair<std::string, GMSH_Plugin*> - ("NearToFarField", GMSH_RegisterNearToFarFieldPlugin())); - allPlugins.insert(std::pair<std::string, GMSH_Plugin*> - ("Bubbles", GMSH_RegisterBubblesPlugin())); + ("DiscretizationError", GMSH_RegisterDiscretizationErrorPlugin())); + #if defined(HAVE_TETGEN) allPlugins.insert(std::pair<std::string, GMSH_Plugin*> ("Tetrahedralize", GMSH_RegisterTetrahedralizePlugin()));