netgen/libsrc/visualization/vssolution.hpp

395 lines
10 KiB
C++
Raw Normal View History

2009-01-13 04:40:13 +05:00
#ifndef FILE_VSSOLUTION
#define FILE_VSSOLUTION
#include "visual_api.hpp"
#include "mvdraw.hpp"
2014-10-08 18:46:25 +06:00
typedef void * ClientData;
struct Tcl_Interp;
2014-10-06 15:57:44 +06:00
namespace netgen
{
2009-01-13 04:40:13 +05:00
NGGUI_API extern void ImportSolution (const char * filename);
2009-01-18 19:47:12 +05:00
2009-01-13 04:40:13 +05:00
2014-10-08 18:46:25 +06:00
extern int Ng_Vis_Set (ClientData clientData,
Tcl_Interp * interp,
int argc, const char *argv[]);
2009-01-13 04:40:13 +05:00
class NGGUI_API VisualSceneSolution : public VisualScene
2009-01-13 04:40:13 +05:00
{
friend class FieldLineCalc;
class ClipPlaneTrig
{
public:
struct ps
{
int pnr, locpnr;
};
ps points[3];
ElementIndex elnr;
};
class ClipPlanePoint
{
public:
ElementIndex elnr;
Point<3> lami;
Point<3> p;
};
2017-04-26 15:15:05 +05:00
#ifndef WIN32
// use OpenGL vertex buffers from OpenGL 2.x
// not supported by some drivers on windows
// try on your own responsibility
#define USE_BUFFERS
2017-04-26 15:15:05 +05:00
#endif
#ifdef USE_BUFFERS
2016-11-01 15:47:49 +05:00
bool has_surfel_vbo = false;
GLuint surfel_vbo[4]; //
size_t surfel_vbo_size;
#endif
2009-01-13 04:40:13 +05:00
int surfellist;
int linelist;
2013-05-27 19:01:58 +06:00
int element1dlist;
2011-02-15 21:22:05 +05:00
int clipplanelist_scal;
int clipplanelist_vec;
2009-01-13 04:40:13 +05:00
int isolinelist;
int clipplane_isolinelist;
int surface_vector_list;
2009-08-05 20:20:30 +06:00
// int cone_list;
2009-01-13 04:40:13 +05:00
int isosurface_list;
int pointcurvelist;
bool draw_fieldlines;
bool drawpointcurves;
bool draw_isosurface;
int num_fieldlines;
bool fieldlines_randomstart;
int fieldlineslist;
int num_fieldlineslists;
int fieldlines_startarea;
2019-07-09 13:39:16 +05:00
NgArray<double> fieldlines_startarea_parameter;
2009-01-13 04:40:13 +05:00
int fieldlines_startface;
string fieldlines_filename;
double fieldlines_reltolerance;
int fieldlines_rktype;
double fieldlines_rellength;
double fieldlines_relthickness;
int fieldlines_vecfunction;
bool fieldlines_fixedphase;
float fieldlines_phase;
int fieldlines_maxpoints;
int surfeltimestamp, clipplanetimestamp, solutiontimestamp;
int surfellinetimestamp;
int fieldlinestimestamp, surface_vector_timestamp;
int pointcurve_timestamp;
int isosurface_timestamp;
int timetimestamp;
double minval, maxval;
int scalfunction, vecfunction;
string number_format = "%8.3e";
string unit = "";
string title = "";
2009-01-13 04:40:13 +05:00
NgLock *lock;
2014-02-24 01:31:40 +06:00
2009-01-13 04:40:13 +05:00
#ifdef PARALLELGL
2019-07-09 13:39:16 +05:00
NgArray<int> par_linelists;
NgArray<int> par_surfellists;
2009-01-13 04:40:13 +05:00
#endif
2019-07-09 13:39:16 +05:00
NgArray<UserVisualizationObject*> user_vis;
2009-01-13 04:40:13 +05:00
public:
enum EvalFunc {
FUNC_ABS = 1,
FUNC_ABS_TENSOR = 2,
FUNC_MISES = 3,
FUNC_MAIN = 4
};
2011-07-23 05:06:25 +06:00
int evalfunc;
2009-01-13 04:40:13 +05:00
enum SolType
{
SOL_NODAL = 1,
SOL_ELEMENT = 2,
SOL_SURFACE_ELEMENT = 3,
SOL_NONCONTINUOUS = 4,
SOL_SURFACE_NONCONTINUOUS = 5,
SOL_VIRTUALFUNCTION = 6,
SOL_MARKED_ELEMENTS = 10,
SOL_ELEMENT_ORDER = 11,
};
class SolData
{
public:
SolData ();
~SolData ();
2017-06-25 21:22:46 +05:00
string name;
string number_format = "%8.3e";
string unit = "";
string title = "";
2009-01-13 04:40:13 +05:00
double * data;
int components;
int dist;
int order;
bool iscomplex;
bool draw_volume;
bool draw_surface;
SolType soltype;
SolutionData * solclass;
// internal variables:
int size;
};
2019-07-09 13:39:16 +05:00
NgArray<SolData*> soldata;
2009-01-13 04:40:13 +05:00
int usetexture; // 0..no, 1..1D texture (standard), 2..2D-texture (complex)
int clipsolution; // 0..no, 1..scal, 2..vec
int scalcomp;
2009-01-13 04:40:13 +05:00
int gridsize;
double xoffset, yoffset;
int autoscale, logscale;
double mminval, mmaxval;
int numisolines;
bool showclipsolution;
bool showsurfacesolution;
bool lineartexture;
int numtexturecols;
int multidimcomponent;
// bool fieldlineplot;
double time;
int deform;
double scaledeform;
bool imag_part;
private:
2022-04-11 20:27:47 +05:00
void BuildFieldLinesFromFile(Array<Point<3>> & startpoints);
void BuildFieldLinesFromFace(Array<Point<3>> & startpoints);
void BuildFieldLinesFromBox(Array<Point<3>> & startpoints);
void BuildFieldLinesFromLine(Array<Point<3>> & startpoints);
2015-01-09 02:18:33 +05:00
// weak_ptr<Mesh> wp_mesh;
2009-01-13 04:40:13 +05:00
public:
VisualSceneSolution ();
virtual ~VisualSceneSolution ();
virtual void BuildScene (int zoomall = 0);
virtual void DrawScene ();
virtual void MouseDblClick (int px, int py);
2015-01-09 02:18:33 +05:00
// void SetMesh (shared_ptr<Mesh> amesh);
// shared_ptr<Mesh> GetMesh () { return shared_ptr<Mesh>(wp_mesh); }
shared_ptr<Mesh> GetMesh () const { return shared_ptr<Mesh>(global_mesh); }
2014-10-06 15:57:44 +06:00
2009-01-13 04:40:13 +05:00
void BuildFieldLinesPlot ();
void AddSolutionData (SolData * soldata);
void ClearSolutionData ();
void UpdateSolutionTimeStamp ();
SolData * GetSolData (int i);
int GetNSolData () { return soldata.Size(); }
void SaveSolutionData (const char * filename);
2013-02-27 23:30:38 +06:00
/*
2009-01-13 04:40:13 +05:00
static void RealVec3d (const double * values, Vec3d & v,
bool iscomplex, bool imag);
2013-02-27 23:30:38 +06:00
*/
static Vec<3> RealVec3d (const double * values,
bool iscomplex, bool imag);
2009-01-13 04:40:13 +05:00
static void RealVec3d (const double * values, Vec3d & v,
bool iscomplex, double phaser, double phasei);
void SetSubdivision (int sd)
{
subdivisions = sd;
subdivision_timestamp = solutiontimestamp = NextTimeStamp();
}
void GetMinMax (int funcnr, int comp, double & minv, double & maxv) const;
2014-02-24 01:31:40 +06:00
void AddUserVisualizationObject (UserVisualizationObject * vis)
{
user_vis.Append (vis);
}
2019-10-12 01:23:14 +05:00
void DeleteUserVisualizationObject (UserVisualizationObject * vis)
{
int pos = user_vis.Pos(vis);
if (pos >= 0)
user_vis.Delete(pos);
}
2014-02-24 01:31:40 +06:00
2011-07-15 22:26:32 +06:00
private:
2019-07-09 13:39:16 +05:00
void GetClippingPlaneTrigs (NgArray<ClipPlaneTrig> & trigs, NgArray<ClipPlanePoint> & pts);
void GetClippingPlaneGrid (NgArray<ClipPlanePoint> & pts);
2009-01-13 04:40:13 +05:00
void DrawCone (const Point<3> & p1, const Point<3> & p2, double r);
void DrawCylinder (const Point<3> & p1, const Point<3> & p2, double r);
// Get Function Value, local coordinates lam1, lam2, lam3,
bool GetValue (const SolData * data, ElementIndex elnr,
double lam1, double lam2, double lam3,
int comp, double & val) const;
bool GetValue (const SolData * data, ElementIndex elnr,
const double xref[], const double x[], const double dxdxref[],
int comp, double & val) const;
bool GetValueComplex (const SolData * data, ElementIndex elnr,
double lam1, double lam2, double lam3,
2009-08-29 15:29:09 +06:00
int comp, complex<double> & val) const;
2009-01-13 04:40:13 +05:00
bool GetValues (const SolData * data, ElementIndex elnr,
double lam1, double lam2, double lam3,
double * values) const;
bool GetValues (const SolData * data, ElementIndex elnr,
const double xref[], const double x[], const double dxdxref[],
double * values) const;
2012-04-27 00:22:49 +06:00
bool GetMultiValues (const SolData * data, ElementIndex elnr, int facetnr, int npt,
const double * xref, int sxref,
const double * x, int sx,
const double * dxdxref, int sdxdxref,
double * val, int sval) const;
2012-04-27 00:22:49 +06:00
bool GetSurfValue (const SolData * data, SurfaceElementIndex elnr, int facetnr,
2009-01-13 04:40:13 +05:00
double lam1, double lam2,
int comp, double & val) const;
2012-04-27 00:22:49 +06:00
bool GetSurfValue (const SolData * data, SurfaceElementIndex elnr, int facetnr,
2009-01-13 04:40:13 +05:00
const double xref[], const double x[], const double dxdxref[],
int comp, double & val) const;
2009-07-20 14:36:36 +06:00
2012-04-27 00:22:49 +06:00
bool GetSurfValueComplex (const SolData * data, SurfaceElementIndex elnr, int facetnr,
2009-01-13 04:40:13 +05:00
double lam1, double lam2,
2009-08-29 15:29:09 +06:00
int comp, complex<double> & val) const;
2009-01-13 04:40:13 +05:00
2012-04-27 00:22:49 +06:00
bool GetSurfValues (const SolData * data, SurfaceElementIndex elnr, int facetnr,
2009-01-13 04:40:13 +05:00
double lam1, double lam2,
double * values) const;
2012-04-27 00:22:49 +06:00
bool GetSurfValues (const SolData * data, SurfaceElementIndex elnr, int facetnr,
2009-01-13 04:40:13 +05:00
const double xref[], const double x[], const double dxdxref[],
double * values) const;
2012-04-27 00:22:49 +06:00
bool GetMultiSurfValues (const SolData * data, SurfaceElementIndex elnr, int facetnr,
int npt,
2009-07-20 14:36:36 +06:00
const double * xref, int sxref,
const double * x, int sx,
const double * dxdxref, int sdxdxref,
double * val, int sval) const;
double ExtractValue (const SolData * data, int comp, double * values) const;
2009-08-24 06:03:40 +06:00
complex<double> ExtractValueComplex (const SolData * data, int comp, double * values) const;
2009-01-13 04:40:13 +05:00
Vec<3> GetDeformation (ElementIndex elnr, const Point<3> & p) const;
2012-04-27 00:22:49 +06:00
Vec<3> GetSurfDeformation (SurfaceElementIndex selnr, int facetnr, double lam1, double lam2) const;
2009-01-13 04:40:13 +05:00
void GetPointDeformation (int pnum, Point<3> & p, SurfaceElementIndex elnr = -1) const;
public:
/// draw elements (build lists)
void DrawSurfaceElements ();
void DrawSurfaceElementLines ();
2013-05-27 19:01:58 +06:00
void Draw1DElements();
2009-01-13 04:40:13 +05:00
void DrawSurfaceVectors ();
2019-07-09 13:39:16 +05:00
void DrawTrigSurfaceVectors(const NgArray< Point<3> > & lp, const Point<3> & pmin, const Point<3> & pmax,
2023-03-08 00:30:30 +05:00
const int sei, const SolData * vsol, bool swap_lam=false);
2009-01-13 04:40:13 +05:00
void DrawIsoSurface(const SolData * sol, const SolData * grad, int comp);
void DrawIsoLines (const Point<3> & p1,
const Point<3> & p2,
const Point<3> & p3,
double val1, double val2, double val3);
// draw isolines between lines (p1,p2) and (p3,p4)
void DrawIsoLines2 (const Point<3> & p1,
const Point<3> & p2,
const Point<3> & p3,
const Point<3> & p4,
double val1, double val2, double val3, double val4);
2011-02-15 21:22:05 +05:00
void DrawClipPlaneTrigs (); // const SolData * sol, int comp);
2009-01-13 04:40:13 +05:00
void SetOpenGlColor(double val);
2009-08-05 20:20:30 +06:00
// 0 .. non, 1 .. scalar, 2 .. complex
void SetTextureMode (int texturemode) const;
2009-01-13 04:40:13 +05:00
friend int Ng_Vis_Set (ClientData clientData,
2014-10-08 18:46:25 +06:00
Tcl_Interp * interp,
int argc, const char *argv[]);
2009-01-13 04:40:13 +05:00
void SetScalfunction( int i ) {
scalfunction = i;
title = soldata[i]->title;
number_format = soldata[i]->number_format;
unit = soldata[i]->unit;
}
void SetVecfunction( int i ) {
vecfunction = i;
title = soldata[i]->title;
number_format = soldata[i]->number_format;
unit = soldata[i]->unit;
}
2009-01-13 04:40:13 +05:00
#ifdef PARALLELGL
void Broadcast ();
#endif
};
NGGUI_API VisualSceneSolution & GetVSSolution();
2009-01-13 04:40:13 +05:00
inline void AddUserVisualizationObject (UserVisualizationObject * vis)
{
GetVSSolution().AddUserVisualizationObject (vis);
}
2009-01-13 04:40:13 +05:00
inline void DeleteUserVisualizationObject (UserVisualizationObject * vis)
{
GetVSSolution().DeleteUserVisualizationObject (vis);
}
2009-01-13 04:40:13 +05:00
2014-10-06 15:57:44 +06:00
}
2009-01-13 04:40:13 +05:00
#endif