Skip to content
Snippets Groups Projects
Commit 594e59c0 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

refactor incrementList + add option to extract visible elements in Plugin(ExtractElements)

parent f00edd6a
No related branches found
No related tags found
No related merge requests found
...@@ -37,21 +37,6 @@ StringXNumber *GMSH_CurlPlugin::getOption(int iopt) ...@@ -37,21 +37,6 @@ StringXNumber *GMSH_CurlPlugin::getOption(int iopt)
return &CurlOptions_Number[iopt]; return &CurlOptions_Number[iopt];
} }
static std::vector<double> *incrementList(PViewDataList *data2, int type)
{
switch(type){
case TYPE_PNT: data2->NbVP++; return &data2->VP;
case TYPE_LIN: data2->NbVL++; return &data2->VL;
case TYPE_TRI: data2->NbVT++; return &data2->VT;
case TYPE_QUA: data2->NbVQ++; return &data2->VQ;
case TYPE_TET: data2->NbVS++; return &data2->VS;
case TYPE_HEX: data2->NbVH++; return &data2->VH;
case TYPE_PRI: data2->NbVI++; return &data2->VI;
case TYPE_PYR: data2->NbVY++; return &data2->VY;
default: return 0;
}
}
PView *GMSH_CurlPlugin::execute(PView *v) PView *GMSH_CurlPlugin::execute(PView *v)
{ {
int iView = (int)CurlOptions_Number[0].def; int iView = (int)CurlOptions_Number[0].def;
...@@ -74,7 +59,7 @@ PView *GMSH_CurlPlugin::execute(PView *v) ...@@ -74,7 +59,7 @@ PView *GMSH_CurlPlugin::execute(PView *v)
int numComp = data1->getNumComponents(0, ent, ele); int numComp = data1->getNumComponents(0, ent, ele);
if(numComp != 3) continue; if(numComp != 3) continue;
int type = data1->getType(0, ent, ele); int type = data1->getType(0, ent, ele);
std::vector<double> *out = incrementList(data2, type); std::vector<double> *out = data2->incrementList(3, type);
if(!out) continue; if(!out) continue;
int numNodes = data1->getNumNodes(0, ent, ele); int numNodes = data1->getNumNodes(0, ent, ele);
double x[8], y[8], z[8], val[8 * 3]; double x[8], y[8], z[8], val[8 * 3];
......
...@@ -37,21 +37,6 @@ StringXNumber *GMSH_DivergencePlugin::getOption(int iopt) ...@@ -37,21 +37,6 @@ StringXNumber *GMSH_DivergencePlugin::getOption(int iopt)
return &DivergenceOptions_Number[iopt]; return &DivergenceOptions_Number[iopt];
} }
static std::vector<double> *incrementList(PViewDataList *data2, int type)
{
switch(type){
case TYPE_PNT: data2->NbSP++; return &data2->SP;
case TYPE_LIN: data2->NbSL++; return &data2->SL;
case TYPE_TRI: data2->NbST++; return &data2->ST;
case TYPE_QUA: data2->NbSQ++; return &data2->SQ;
case TYPE_TET: data2->NbSS++; return &data2->SS;
case TYPE_HEX: data2->NbSH++; return &data2->SH;
case TYPE_PRI: data2->NbSI++; return &data2->SI;
case TYPE_PYR: data2->NbSY++; return &data2->SY;
default: return 0;
}
}
PView *GMSH_DivergencePlugin::execute(PView *v) PView *GMSH_DivergencePlugin::execute(PView *v)
{ {
int iView = (int)DivergenceOptions_Number[0].def; int iView = (int)DivergenceOptions_Number[0].def;
...@@ -74,7 +59,7 @@ PView *GMSH_DivergencePlugin::execute(PView *v) ...@@ -74,7 +59,7 @@ PView *GMSH_DivergencePlugin::execute(PView *v)
int numComp = data1->getNumComponents(0, ent, ele); int numComp = data1->getNumComponents(0, ent, ele);
if(numComp != 3) continue; if(numComp != 3) continue;
int type = data1->getType(0, ent, ele); int type = data1->getType(0, ent, ele);
std::vector<double> *out = incrementList(data2, type); std::vector<double> *out = data2->incrementList(1, type);
if(!out) continue; if(!out) continue;
int numNodes = data1->getNumNodes(0, ent, ele); int numNodes = data1->getNumNodes(0, ent, ele);
double x[8], y[8], z[8], val[8 * 3]; double x[8], y[8], z[8], val[8 * 3];
......
...@@ -37,21 +37,6 @@ StringXNumber *GMSH_EigenvaluesPlugin::getOption(int iopt) ...@@ -37,21 +37,6 @@ StringXNumber *GMSH_EigenvaluesPlugin::getOption(int iopt)
return &EigenvaluesOptions_Number[iopt]; return &EigenvaluesOptions_Number[iopt];
} }
static std::vector<double> *incrementList(PViewDataList *data2, int type)
{
switch(type){
case TYPE_PNT: data2->NbSP++; return &data2->SP;
case TYPE_LIN: data2->NbSL++; return &data2->SL;
case TYPE_TRI: data2->NbST++; return &data2->ST;
case TYPE_QUA: data2->NbSQ++; return &data2->SQ;
case TYPE_TET: data2->NbSS++; return &data2->SS;
case TYPE_HEX: data2->NbSH++; return &data2->SH;
case TYPE_PRI: data2->NbSI++; return &data2->SI;
case TYPE_PYR: data2->NbSY++; return &data2->SY;
default: return 0;
}
}
PView *GMSH_EigenvaluesPlugin::execute(PView *v) PView *GMSH_EigenvaluesPlugin::execute(PView *v)
{ {
int iView = (int)EigenvaluesOptions_Number[0].def; int iView = (int)EigenvaluesOptions_Number[0].def;
...@@ -79,9 +64,9 @@ PView *GMSH_EigenvaluesPlugin::execute(PView *v) ...@@ -79,9 +64,9 @@ PView *GMSH_EigenvaluesPlugin::execute(PView *v)
int numComp = data1->getNumComponents(0, ent, ele); int numComp = data1->getNumComponents(0, ent, ele);
if(numComp != 9) continue; if(numComp != 9) continue;
int type = data1->getType(0, ent, ele); int type = data1->getType(0, ent, ele);
std::vector<double> *outmin = incrementList(dmin, type); std::vector<double> *outmin = dmin->incrementList(1, type);
std::vector<double> *outmid = incrementList(dmid, type); std::vector<double> *outmid = dmid->incrementList(1, type);
std::vector<double> *outmax = incrementList(dmax, type); std::vector<double> *outmax = dmax->incrementList(1, type);
if(!outmin || !outmid || !outmax) continue; if(!outmin || !outmid || !outmax) continue;
int numNodes = data1->getNumNodes(0, ent, ele); int numNodes = data1->getNumNodes(0, ent, ele);
double xyz[3][8]; double xyz[3][8];
......
...@@ -44,21 +44,6 @@ StringXNumber *GMSH_EigenvectorsPlugin::getOption(int iopt) ...@@ -44,21 +44,6 @@ StringXNumber *GMSH_EigenvectorsPlugin::getOption(int iopt)
return &EigenvectorsOptions_Number[iopt]; return &EigenvectorsOptions_Number[iopt];
} }
static std::vector<double> *incrementList(PViewDataList *data2, int type)
{
switch(type){
case TYPE_PNT: data2->NbVP++; return &data2->VP;
case TYPE_LIN: data2->NbVL++; return &data2->VL;
case TYPE_TRI: data2->NbVT++; return &data2->VT;
case TYPE_QUA: data2->NbVQ++; return &data2->VQ;
case TYPE_TET: data2->NbVS++; return &data2->VS;
case TYPE_HEX: data2->NbVH++; return &data2->VH;
case TYPE_PRI: data2->NbVI++; return &data2->VI;
case TYPE_PYR: data2->NbVY++; return &data2->VY;
default: return 0;
}
}
static int nonzero(double v[3]) static int nonzero(double v[3])
{ {
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
...@@ -97,9 +82,9 @@ PView *GMSH_EigenvectorsPlugin::execute(PView *v) ...@@ -97,9 +82,9 @@ PView *GMSH_EigenvectorsPlugin::execute(PView *v)
int numComp = data1->getNumComponents(0, ent, ele); int numComp = data1->getNumComponents(0, ent, ele);
if(numComp != 9) continue; if(numComp != 9) continue;
int type = data1->getType(0, ent, ele); int type = data1->getType(0, ent, ele);
std::vector<double> *outmin = incrementList(dmin, type); std::vector<double> *outmin = dmin->incrementList(3, type);
std::vector<double> *outmid = incrementList(dmid, type); std::vector<double> *outmid = dmid->incrementList(3, type);
std::vector<double> *outmax = incrementList(dmax, type); std::vector<double> *outmax = dmax->incrementList(3, type);
if(!outmin || !outmid || !outmax) continue; if(!outmin || !outmid || !outmax) continue;
int numNodes = data1->getNumNodes(0, ent, ele); int numNodes = data1->getNumNodes(0, ent, ele);
double xyz[3][8]; double xyz[3][8];
......
...@@ -6,12 +6,11 @@ ...@@ -6,12 +6,11 @@
#include "ExtractElements.h" #include "ExtractElements.h"
#include "Numeric.h" #include "Numeric.h"
#define SQU(a) ((a)*(a))
StringXNumber ExtractElementsOptions_Number[] = { StringXNumber ExtractElementsOptions_Number[] = {
{GMSH_FULLRC, "MinVal", NULL, 0.}, {GMSH_FULLRC, "MinVal", NULL, 0.},
{GMSH_FULLRC, "MaxVal", NULL, 1.}, {GMSH_FULLRC, "MaxVal", NULL, 0.},
{GMSH_FULLRC, "TimeStep", NULL, 0.}, {GMSH_FULLRC, "TimeStep", NULL, 0.},
{GMSH_FULLRC, "Visible", NULL, 1.},
{GMSH_FULLRC, "View", NULL, -1.} {GMSH_FULLRC, "View", NULL, -1.}
}; };
...@@ -25,10 +24,12 @@ extern "C" ...@@ -25,10 +24,12 @@ extern "C"
std::string GMSH_ExtractElementsPlugin::getHelp() const std::string GMSH_ExtractElementsPlugin::getHelp() const
{ {
return "Plugin(ExtractElements) extracts the elements " return "Plugin(ExtractElements) extracts some elements "
"from the view `View' whose `TimeStep'-th values " "from the view `View'. If `MinVal' != `MaxVal', it extracts "
"(averaged by element) are comprised between " "the elements whose `TimeStep'-th values (averaged by element) "
"`MinVal' and `MaxVal'.\n\n" "are comprised between `MinVal' and `MaxVal'. If `Visible' != 0, "
"it extracts visible elements. "
"\n\n"
"If `View' < 0, the plugin is run on the current view.\n\n" "If `View' < 0, the plugin is run on the current view.\n\n"
"Plugin(ExtractElements) creates one new view."; "Plugin(ExtractElements) creates one new view.";
} }
...@@ -43,101 +44,69 @@ StringXNumber *GMSH_ExtractElementsPlugin::getOption(int iopt) ...@@ -43,101 +44,69 @@ StringXNumber *GMSH_ExtractElementsPlugin::getOption(int iopt)
return &ExtractElementsOptions_Number[iopt]; return &ExtractElementsOptions_Number[iopt];
} }
static void extract(std::vector<double> &inList, int inNb, PView *GMSH_ExtractElementsPlugin::execute(PView *v)
std::vector<double> &outList, int *outNb,
int timeStep, int nbNod, int nbComp)
{ {
if(!inNb)
return;
double MinVal = ExtractElementsOptions_Number[0].def; double MinVal = ExtractElementsOptions_Number[0].def;
double MaxVal = ExtractElementsOptions_Number[1].def; double MaxVal = ExtractElementsOptions_Number[1].def;
int nb = inList.size() / inNb;
for(unsigned int i = 0; i < inList.size(); i += nb) {
double *vals = &inList[i + 3 * nbNod + timeStep * nbNod * nbComp];
double d = 0.;
for(int k = 0; k < nbNod; k++) {
double *v = &vals[nbComp * k];
switch(nbComp) {
case 1: // scalar
d += v[0];
break;
case 3 : // vector
d += sqrt(SQU(v[0]) + SQU(v[1]) + SQU(v[2]));
break;
case 9 : // tensor
d += ComputeVonMises(v);
break;
}
}
d /= (double)nbNod;
// We use '>=' and '<' so that we can do segmentation without
// worrying about roundoff errors
if(d >= MinVal && d < MaxVal){
for(int j = 0; j < nb; j++)
outList.push_back(inList[i + j]);
(*outNb)++;
}
}
}
PView *GMSH_ExtractElementsPlugin::execute(PView *v)
{
int step = (int)ExtractElementsOptions_Number[2].def; int step = (int)ExtractElementsOptions_Number[2].def;
int iView = (int)ExtractElementsOptions_Number[3].def; int visible = (int)ExtractElementsOptions_Number[3].def;
int iView = (int)ExtractElementsOptions_Number[4].def;
PView *v1 = getView(iView, v); PView *v1 = getView(iView, v);
if(!v1) return v; if(!v1) return v;
PViewDataList *data1 = getDataList(v1); PViewData *data1 = v1->getData();
if(!data1) return v;
PView *v2 = new PView(); bool checkMinMax = MinVal != MaxVal;
PViewDataList *data2 = getDataList(v2);
if(!data2) return v;
if(step < 0 || step > data1->getNumTimeSteps() - 1){ if(step < 0 || step > data1->getNumTimeSteps() - 1){
Msg::Error("Invalid time step (%d) in View[%d]: using first step instead", Msg::Error("Invalid time step (%d) in View[%d]: using first step instead",
step, v1->getIndex()); step, v1->getIndex());
step = 0; step = 0;
} }
// points PView *v2 = new PView();
extract(data1->SP, data1->NbSP, data2->SP, &data2->NbSP, step, 1, 1); PViewDataList *data2 = getDataList(v2);
extract(data1->VP, data1->NbVP, data2->VP, &data2->NbVP, step, 1, 3);
extract(data1->TP, data1->NbTP, data2->TP, &data2->NbTP, step, 1, 9); for(int ent = 0; ent < data1->getNumEntities(step); ent++){
// lines if(visible && data1->skipEntity(step, ent)) continue;
extract(data1->SL, data1->NbSL, data2->SL, &data2->NbSL, step, 2, 1); for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
extract(data1->VL, data1->NbVL, data2->VL, &data2->NbVL, step, 2, 3); if(data1->skipElement(step, ent, ele, visible)) continue;
extract(data1->TL, data1->NbTL, data2->TL, &data2->NbTL, step, 2, 9); int numNodes = data1->getNumNodes(step, ent, ele);
// triangles if(checkMinMax){
extract(data1->ST, data1->NbST, data2->ST, &data2->NbST, step, 3, 1); double d = 0.;
extract(data1->VT, data1->NbVT, data2->VT, &data2->NbVT, step, 3, 3); for(int nod = 0; nod < numNodes; nod++){
extract(data1->TT, data1->NbTT, data2->TT, &data2->NbTT, step, 3, 9); double val;
// quadrangles data1->getScalarValue(step, ent, ele, nod, val);
extract(data1->SQ, data1->NbSQ, data2->SQ, &data2->NbSQ, step, 4, 1); d += val;
extract(data1->VQ, data1->NbVQ, data2->VQ, &data2->NbVQ, step, 4, 3); }
extract(data1->TQ, data1->NbTQ, data2->TQ, &data2->NbTQ, step, 4, 9); d /= (double)numNodes;
// tets // use '>=' and '<' so that we can do segmentation without
extract(data1->SS, data1->NbSS, data2->SS, &data2->NbSS, step, 4, 1); // worrying about roundoff errors
extract(data1->VS, data1->NbVS, data2->VS, &data2->NbVS, step, 4, 3); if(d < MinVal || d >= MaxVal) continue;
extract(data1->TS, data1->NbTS, data2->TS, &data2->NbTS, step, 4, 9); }
// hexas int type = data1->getType(step, ent, ele);
extract(data1->SH, data1->NbSH, data2->SH, &data2->NbSH, step, 8, 1); int numComp = data1->getNumComponents(step, ent, ele);
extract(data1->VH, data1->NbVH, data2->VH, &data2->NbVH, step, 8, 3); std::vector<double> *out = data2->incrementList(numComp, type);
extract(data1->TH, data1->NbTH, data2->TH, &data2->NbTH, step, 8, 9); std::vector<double> x(numNodes), y(numNodes), z(numNodes);
// prisms std::vector<double> v(numNodes * numComp);
extract(data1->SI, data1->NbSI, data2->SI, &data2->NbSI, step, 6, 1); for(int nod = 0; nod < numNodes; nod++){
extract(data1->VI, data1->NbVI, data2->VI, &data2->NbVI, step, 6, 3); data1->getNode(step, ent, ele, nod, x[nod], y[nod], z[nod]);
extract(data1->TI, data1->NbTI, data2->TI, &data2->NbTI, step, 6, 9); for(int comp = 0; comp < numComp; comp++)
// pyramids data1->getValue(step, ent, ele, nod, comp, v[numComp * nod + comp]);
extract(data1->SY, data1->NbSY, data2->SY, &data2->NbSY, step, 5, 1); }
extract(data1->VY, data1->NbVY, data2->VY, &data2->NbVY, step, 5, 3); for(int nod = 0; nod < numNodes; nod++) out->push_back(x[nod]);
extract(data1->TY, data1->NbTY, data2->TY, &data2->NbTY, step, 5, 9); for(int nod = 0; nod < numNodes; nod++) out->push_back(y[nod]);
for(int nod = 0; nod < numNodes; nod++) out->push_back(z[nod]);
for(int nod = 0; nod < numNodes; nod++) {
for(int comp = 0; comp < numComp; comp++) {
out->push_back(v[numComp * nod + comp]);
}
}
}
}
data2->Time = data1->Time; data2->Time.push_back(data1->getTime(step));
data2->setName(data1->getName() + "_ExtractElements"); data2->setName(data1->getName() + "_ExtractElements");
data2->setFileName(data1->getName() + "_ExtractElements.pos"); data2->setFileName(data1->getName() + "_ExtractElements.pos");
data2->finalize(); data2->finalize();
......
...@@ -37,37 +37,6 @@ StringXNumber *GMSH_GradientPlugin::getOption(int iopt) ...@@ -37,37 +37,6 @@ StringXNumber *GMSH_GradientPlugin::getOption(int iopt)
return &GradientOptions_Number[iopt]; return &GradientOptions_Number[iopt];
} }
static std::vector<double> *incrementList(PViewDataList *data2, int numComp, int type)
{
if(numComp == 1){
switch(type){
case TYPE_PNT: data2->NbVP++; return &data2->VP;
case TYPE_LIN: data2->NbVL++; return &data2->VL;
case TYPE_TRI: data2->NbVT++; return &data2->VT;
case TYPE_QUA: data2->NbVQ++; return &data2->VQ;
case TYPE_TET: data2->NbVS++; return &data2->VS;
case TYPE_HEX: data2->NbVH++; return &data2->VH;
case TYPE_PRI: data2->NbVI++; return &data2->VI;
case TYPE_PYR: data2->NbVY++; return &data2->VY;
default: return 0;
}
}
else if(numComp == 3){
switch(type){
case TYPE_PNT: data2->NbTP++; return &data2->TP;
case TYPE_LIN: data2->NbTL++; return &data2->TL;
case TYPE_TRI: data2->NbTT++; return &data2->TT;
case TYPE_QUA: data2->NbTQ++; return &data2->TQ;
case TYPE_TET: data2->NbTS++; return &data2->TS;
case TYPE_HEX: data2->NbTH++; return &data2->TH;
case TYPE_PRI: data2->NbTI++; return &data2->TI;
case TYPE_PYR: data2->NbTY++; return &data2->TY;
default: return 0;
}
}
return 0;
}
PView *GMSH_GradientPlugin::execute(PView *v) PView *GMSH_GradientPlugin::execute(PView *v)
{ {
int iView = (int)GradientOptions_Number[0].def; int iView = (int)GradientOptions_Number[0].def;
...@@ -90,7 +59,7 @@ PView *GMSH_GradientPlugin::execute(PView *v) ...@@ -90,7 +59,7 @@ PView *GMSH_GradientPlugin::execute(PView *v)
int numComp = data1->getNumComponents(0, ent, ele); int numComp = data1->getNumComponents(0, ent, ele);
if(numComp != 1 && numComp != 3) continue; if(numComp != 1 && numComp != 3) continue;
int type = data1->getType(0, ent, ele); int type = data1->getType(0, ent, ele);
std::vector<double> *out = incrementList(data2, numComp, type); std::vector<double> *out = data2->incrementList((numComp == 1) ? 3 : 9, type);
if(!out) continue; if(!out) continue;
int numNodes = data1->getNumNodes(0, ent, ele); int numNodes = data1->getNumNodes(0, ent, ele);
double x[8], y[8], z[8], val[8 * 3]; double x[8], y[8], z[8], val[8 * 3];
......
...@@ -43,54 +43,6 @@ StringXNumber *GMSH_HarmonicToTimePlugin::getOption(int iopt) ...@@ -43,54 +43,6 @@ StringXNumber *GMSH_HarmonicToTimePlugin::getOption(int iopt)
return &HarmonicToTimeOptions_Number[iopt]; return &HarmonicToTimeOptions_Number[iopt];
} }
static std::vector<double> *incrementList(PViewDataList *data, int numComp,
int type)
{
switch(type){
case TYPE_PNT:
if (numComp == 1){ data->NbSP++; return &data->SP; }
else if(numComp == 3){ data->NbVP++; return &data->VP; }
else if(numComp == 9){ data->NbTP++; return &data->TP; }
break;
case TYPE_LIN:
if (numComp == 1){ data->NbSL++; return &data->SL; }
else if(numComp == 3){ data->NbVL++; return &data->VL; }
else if(numComp == 9){ data->NbTL++; return &data->TL; }
break;
case TYPE_TRI:
if (numComp == 1){ data->NbST++; return &data->ST; }
else if(numComp == 3){ data->NbVT++; return &data->VT; }
else if(numComp == 9){ data->NbTT++; return &data->TT; }
break;
case TYPE_QUA:
if (numComp == 1){ data->NbSQ++; return &data->SQ; }
else if(numComp == 3){ data->NbVQ++; return &data->VQ; }
else if(numComp == 9){ data->NbTQ++; return &data->TQ; }
break;
case TYPE_TET:
if (numComp == 1){ data->NbSS++; return &data->SS; }
else if(numComp == 3){ data->NbVS++; return &data->VS; }
else if(numComp == 9){ data->NbTS++; return &data->TS; }
break;
case TYPE_HEX:
if (numComp == 1){ data->NbSH++; return &data->SH; }
else if(numComp == 3){ data->NbVH++; return &data->VH; }
else if(numComp == 9){ data->NbTH++; return &data->TH; }
break;
case TYPE_PRI:
if (numComp == 1){ data->NbSI++; return &data->SI; }
else if(numComp == 3){ data->NbVI++; return &data->VI; }
else if(numComp == 9){ data->NbTI++; return &data->TI; }
break;
case TYPE_PYR:
if (numComp == 1){ data->NbSY++; return &data->SY; }
else if(numComp == 3){ data->NbVY++; return &data->VY; }
else if(numComp == 9){ data->NbTY++; return &data->TY; }
break;
}
return 0;
}
PView *GMSH_HarmonicToTimePlugin::execute(PView * v) PView *GMSH_HarmonicToTimePlugin::execute(PView * v)
{ {
int rIndex = (int)HarmonicToTimeOptions_Number[0].def; int rIndex = (int)HarmonicToTimeOptions_Number[0].def;
...@@ -127,7 +79,7 @@ PView *GMSH_HarmonicToTimePlugin::execute(PView * v) ...@@ -127,7 +79,7 @@ PView *GMSH_HarmonicToTimePlugin::execute(PView * v)
int numNodes = data1->getNumNodes(0, ent, ele); int numNodes = data1->getNumNodes(0, ent, ele);
int type = data1->getType(0, ent, ele); int type = data1->getType(0, ent, ele);
int numComp = data1->getNumComponents(0, ent, ele); int numComp = data1->getNumComponents(0, ent, ele);
std::vector<double> *out = incrementList(data2, numComp, type); std::vector<double> *out = data2->incrementList(numComp, type);
std::vector<double> x(numNodes), y(numNodes), z(numNodes); std::vector<double> x(numNodes), y(numNodes), z(numNodes);
std::vector<double> vr(numNodes * numComp), vi(numNodes * numComp); std::vector<double> vr(numNodes * numComp), vi(numNodes * numComp);
for(int nod = 0; nod < numNodes; nod++){ for(int nod = 0; nod < numNodes; nod++){
......
...@@ -84,54 +84,6 @@ StringXString *GMSH_MathEvalPlugin::getOptionStr(int iopt) ...@@ -84,54 +84,6 @@ StringXString *GMSH_MathEvalPlugin::getOptionStr(int iopt)
return &MathEvalOptions_String[iopt]; return &MathEvalOptions_String[iopt];
} }
static std::vector<double> *incrementList(PViewDataList *data, int numComp,
int type)
{
switch(type){
case TYPE_PNT:
if (numComp == 1){ data->NbSP++; return &data->SP; }
else if(numComp == 3){ data->NbVP++; return &data->VP; }
else if(numComp == 9){ data->NbTP++; return &data->TP; }
break;
case TYPE_LIN:
if (numComp == 1){ data->NbSL++; return &data->SL; }
else if(numComp == 3){ data->NbVL++; return &data->VL; }
else if(numComp == 9){ data->NbTL++; return &data->TL; }
break;
case TYPE_TRI:
if (numComp == 1){ data->NbST++; return &data->ST; }
else if(numComp == 3){ data->NbVT++; return &data->VT; }
else if(numComp == 9){ data->NbTT++; return &data->TT; }
break;
case TYPE_QUA:
if (numComp == 1){ data->NbSQ++; return &data->SQ; }
else if(numComp == 3){ data->NbVQ++; return &data->VQ; }
else if(numComp == 9){ data->NbTQ++; return &data->TQ; }
break;
case TYPE_TET:
if (numComp == 1){ data->NbSS++; return &data->SS; }
else if(numComp == 3){ data->NbVS++; return &data->VS; }
else if(numComp == 9){ data->NbTS++; return &data->TS; }
break;
case TYPE_HEX:
if (numComp == 1){ data->NbSH++; return &data->SH; }
else if(numComp == 3){ data->NbVH++; return &data->VH; }
else if(numComp == 9){ data->NbTH++; return &data->TH; }
break;
case TYPE_PRI:
if (numComp == 1){ data->NbSI++; return &data->SI; }
else if(numComp == 3){ data->NbVI++; return &data->VI; }
else if(numComp == 9){ data->NbTI++; return &data->TI; }
break;
case TYPE_PYR:
if (numComp == 1){ data->NbSY++; return &data->SY; }
else if(numComp == 3){ data->NbVY++; return &data->VY; }
else if(numComp == 9){ data->NbTY++; return &data->TY; }
break;
}
return 0;
}
PView *GMSH_MathEvalPlugin::execute(PView *view) PView *GMSH_MathEvalPlugin::execute(PView *view)
{ {
int timeStep = (int)MathEvalOptions_Number[0].def; int timeStep = (int)MathEvalOptions_Number[0].def;
...@@ -210,24 +162,24 @@ PView *GMSH_MathEvalPlugin::execute(PView *view) ...@@ -210,24 +162,24 @@ PView *GMSH_MathEvalPlugin::execute(PView *view)
timeStep = - data1->getNumTimeSteps(); timeStep = - data1->getNumTimeSteps();
} }
for(int ent = 0; ent < data1->getNumEntities(0); ent++){ int timeBeg = (timeStep < 0) ? 0 : timeStep;
for(int ele = 0; ele < data1->getNumElements(0, ent); ele++){ int timeEnd = (timeStep < 0) ? -timeStep : timeStep + 1;
if(data1->skipElement(0, ent, ele)) continue; for(int ent = 0; ent < data1->getNumEntities(timeBeg); ent++){
int numNodes = data1->getNumNodes(0, ent, ele); for(int ele = 0; ele < data1->getNumElements(timeBeg, ent); ele++){
int type = data1->getType(0, ent, ele); if(data1->skipElement(timeBeg, ent, ele)) continue;
int numComp = data1->getNumComponents(0, ent, ele); int numNodes = data1->getNumNodes(timeBeg, ent, ele);
int type = data1->getType(timeBeg, ent, ele);
int numComp = data1->getNumComponents(timeBeg, ent, ele);
int numCompOther = !dataOther ? 9 : octree ? 9 : int numCompOther = !dataOther ? 9 : octree ? 9 :
dataOther->getNumComponents(otherTimeStep, ent, ele); dataOther->getNumComponents(otherTimeStep, ent, ele);
std::vector<double> *out = incrementList(data2, numComp2, type); std::vector<double> *out = data2->incrementList(numComp2, type);
std::vector<double> w(std::max(9, numCompOther), 0.); std::vector<double> w(std::max(9, numCompOther), 0.);
std::vector<double> x(numNodes), y(numNodes), z(numNodes); std::vector<double> x(numNodes), y(numNodes), z(numNodes);
for(int nod = 0; nod < numNodes; nod++) for(int nod = 0; nod < numNodes; nod++)
data1->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]); data1->getNode(timeBeg, ent, ele, nod, x[nod], y[nod], z[nod]);
for(int nod = 0; nod < numNodes; nod++) out->push_back(x[nod]); for(int nod = 0; nod < numNodes; nod++) out->push_back(x[nod]);
for(int nod = 0; nod < numNodes; nod++) out->push_back(y[nod]); for(int nod = 0; nod < numNodes; nod++) out->push_back(y[nod]);
for(int nod = 0; nod < numNodes; nod++) out->push_back(z[nod]); for(int nod = 0; nod < numNodes; nod++) out->push_back(z[nod]);
int timeBeg = (timeStep < 0) ? 0 : timeStep;
int timeEnd = (timeStep < 0) ? -timeStep : timeStep + 1;
for(int step = timeBeg; step < timeEnd; step++){ for(int step = timeBeg; step < timeEnd; step++){
for(int nod = 0; nod < numNodes; nod++){ for(int nod = 0; nod < numNodes; nod++){
std::vector<double> v(std::max(9, numComp), 0.); std::vector<double> v(std::max(9, numComp), 0.);
......
...@@ -792,3 +792,50 @@ void PViewDataList::setOrder2(int type) ...@@ -792,3 +792,50 @@ void PViewDataList::setOrder2(int type)
setInterpolationMatrices(type, fs->coefficients, fs->monomials, setInterpolationMatrices(type, fs->coefficients, fs->monomials,
fs->coefficients, fs->monomials); fs->coefficients, fs->monomials);
} }
std::vector<double> *PViewDataList::incrementList(int numComp, int type)
{
switch(type){
case TYPE_PNT:
if (numComp == 1){ NbSP++; return &SP; }
else if(numComp == 3){ NbVP++; return &VP; }
else if(numComp == 9){ NbTP++; return &TP; }
break;
case TYPE_LIN:
if (numComp == 1){ NbSL++; return &SL; }
else if(numComp == 3){ NbVL++; return &VL; }
else if(numComp == 9){ NbTL++; return &TL; }
break;
case TYPE_TRI:
if (numComp == 1){ NbST++; return &ST; }
else if(numComp == 3){ NbVT++; return &VT; }
else if(numComp == 9){ NbTT++; return &TT; }
break;
case TYPE_QUA:
if (numComp == 1){ NbSQ++; return &SQ; }
else if(numComp == 3){ NbVQ++; return &VQ; }
else if(numComp == 9){ NbTQ++; return &TQ; }
break;
case TYPE_TET:
if (numComp == 1){ NbSS++; return &SS; }
else if(numComp == 3){ NbVS++; return &VS; }
else if(numComp == 9){ NbTS++; return &TS; }
break;
case TYPE_HEX:
if (numComp == 1){ NbSH++; return &SH; }
else if(numComp == 3){ NbVH++; return &VH; }
else if(numComp == 9){ NbTH++; return &TH; }
break;
case TYPE_PRI:
if (numComp == 1){ NbSI++; return &SI; }
else if(numComp == 3){ NbVI++; return &VI; }
else if(numComp == 9){ NbTI++; return &TI; }
break;
case TYPE_PYR:
if (numComp == 1){ NbSY++; return &SY; }
else if(numComp == 3){ NbVY++; return &VY; }
else if(numComp == 9){ NbTY++; return &TY; }
break;
}
return 0;
}
...@@ -104,6 +104,7 @@ class PViewDataList : public PViewData { ...@@ -104,6 +104,7 @@ class PViewDataList : public PViewData {
// specific to list-based data sets // specific to list-based data sets
void getRawData(int type, std::vector<double> **l, int **ne, int *nc, int *nn); void getRawData(int type, std::vector<double> **l, int **ne, int *nc, int *nn);
void setOrder2(int type); void setOrder2(int type);
std::vector<double> *incrementList(int numComp, int type);
// I/O routines // I/O routines
bool readPOS(FILE *fp, double version, bool binary); bool readPOS(FILE *fp, double version, bool binary);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment