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

ported Plugin(Extract) to the new api: testing required...

parent c5e22da9
No related branches found
No related tags found
No related merge requests found
...@@ -97,207 +97,187 @@ void GMSH_ExtractPlugin::catchErrorMessage(char *errorMessage) const ...@@ -97,207 +97,187 @@ void GMSH_ExtractPlugin::catchErrorMessage(char *errorMessage) const
strcpy(errorMessage, "Extract failed..."); strcpy(errorMessage, "Extract failed...");
} }
static void extract(const char *expr[9], std::vector<double> &inList, int inNb, static std::vector<double> *incrementList(PViewDataList *data2, int numComp2,
std::vector<double> *outListScalar, int *outNbScalar, int numEdges)
std::vector<double> *outListVector, int *outNbVector,
std::vector<double> *outListTensor, int *outNbTensor,
int timeStep, int nbNod, int nbComp)
{ {
if(!inNb) switch(numEdges){
return; case 0:
if (numComp2 == 1){ data2->NbSP++; return &data2->SP; }
else if(numComp2 == 3){ data2->NbVP++; return &data2->VP; }
else if(numComp2 == 9){ data2->NbTP++; return &data2->TP; }
break;
case 1:
if (numComp2 == 1){ data2->NbSL++; return &data2->SL; }
else if(numComp2 == 3){ data2->NbVL++; return &data2->VL; }
else if(numComp2 == 9){ data2->NbTL++; return &data2->TL; }
break;
case 3:
if (numComp2 == 1){ data2->NbST++; return &data2->ST; }
else if(numComp2 == 3){ data2->NbVT++; return &data2->VT; }
else if(numComp2 == 9){ data2->NbTT++; return &data2->TT; }
break;
case 4:
if (numComp2 == 1){ data2->NbSQ++; return &data2->SQ; }
else if(numComp2 == 3){ data2->NbVQ++; return &data2->VQ; }
else if(numComp2 == 9){ data2->NbTQ++; return &data2->TQ; }
break;
case 6:
if (numComp2 == 1){ data2->NbSS++; return &data2->SS; }
else if(numComp2 == 3){ data2->NbVS++; return &data2->VS; }
else if(numComp2 == 9){ data2->NbTS++; return &data2->TS; }
break;
case 12:
if (numComp2 == 1){ data2->NbSH++; return &data2->SH; }
else if(numComp2 == 3){ data2->NbVH++; return &data2->VH; }
else if(numComp2 == 9){ data2->NbTH++; return &data2->TH; }
break;
case 9:
if (numComp2 == 1){ data2->NbSI++; return &data2->SI; }
else if(numComp2 == 3){ data2->NbVI++; return &data2->VI; }
else if(numComp2 == 9){ data2->NbTI++; return &data2->TI; }
break;
case 8:
if (numComp2 == 1){ data2->NbSY++; return &data2->SY; }
else if(numComp2 == 3){ data2->NbVY++; return &data2->VY; }
else if(numComp2 == 9){ data2->NbTY++; return &data2->TY; }
break;
}
return 0;
}
int outNbComp, *outNb; PView *GMSH_ExtractPlugin::execute(PView *v)
std::vector<double> *outList; {
int timeStep = (int)ExtractOptions_Number[0].def;
int iView = (int)ExtractOptions_Number[1].def;
const char *expr[9] = { ExtractOptions_String[0].def.c_str(),
ExtractOptions_String[1].def.c_str(),
ExtractOptions_String[2].def.c_str(),
ExtractOptions_String[3].def.c_str(),
ExtractOptions_String[4].def.c_str(),
ExtractOptions_String[5].def.c_str(),
ExtractOptions_String[6].def.c_str(),
ExtractOptions_String[7].def.c_str(),
ExtractOptions_String[8].def.c_str() };
PView *v1 = getView(iView, v);
if(!v1) return v;
PViewData *data1 = v1->getData();
if(data1->hasMultipleMeshes()){
Msg::Error("Extract plugin cannot be applied to multi-mesh views");
return v;
}
int numComp2;
if(strlen(expr[3]) || strlen(expr[4]) || strlen(expr[5]) || if(strlen(expr[3]) || strlen(expr[4]) || strlen(expr[5]) ||
strlen(expr[6]) || strlen(expr[7]) || strlen(expr[8])){ strlen(expr[6]) || strlen(expr[7]) || strlen(expr[8])){
outNbComp = 9; numComp2 = 9;
outNb = outNbTensor;
outList = outListTensor;
for(int i = 0; i < 9; i++) for(int i = 0; i < 9; i++)
if(!strlen(expr[i])) expr[i] = "0"; if(!strlen(expr[i])) expr[i] = "0";
} }
else if(strlen(expr[1]) || strlen(expr[2])){ else if(strlen(expr[1]) || strlen(expr[2])){
outNbComp = 3; numComp2 = 3;
outNb = outNbVector;
outList = outListVector;
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
if(!strlen(expr[i])) expr[i] = "0"; if(!strlen(expr[i])) expr[i] = "0";
} }
else{ else{
outNbComp = 1; numComp2 = 1;
outNb = outNbScalar;
outList = outListScalar;
} }
// if we have MathEval, we can evaluate arbitrary expressions; // if we have MathEval, we can evaluate arbitrary expressions;
// otherwise, we only allow to extract single components // otherwise, we only allow to extract single components
#if defined(HAVE_MATH_EVAL) #if defined(HAVE_MATH_EVAL)
void *f[9] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; void *f[9] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
for(int i = 0; i < outNbComp; i++){ for(int i = 0; i < numComp2; i++){
f[i] = evaluator_create((char*)expr[i]); f[i] = evaluator_create((char*)expr[i]);
if(!f[i]){ if(!f[i]){
Msg::Error("Invalid expression '%s'", expr[i]); Msg::Error("Invalid expression '%s'", expr[i]);
for(int j = 0; j < i; j++) for(int j = 0; j < i; j++)
if(f[j]) evaluator_destroy(f[j]); if(f[j]) evaluator_destroy(f[j]);
return; return v;
} }
} }
#else #else
int comp[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; int comp2[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for(int i = 0; i < outNbComp; i++){ for(int i = 0; i < numComp2; i++){
if (!strcmp(expr[i], "v0")) comp[i] = 0; if (!strcmp(expr[i], "v0")) comp2[i] = 0;
else if(!strcmp(expr[i], "v1")) comp[i] = 1; else if(!strcmp(expr[i], "v1")) comp2[i] = 1;
else if(!strcmp(expr[i], "v2")) comp[i] = 2; else if(!strcmp(expr[i], "v2")) comp2[i] = 2;
else if(!strcmp(expr[i], "v3")) comp[i] = 3; else if(!strcmp(expr[i], "v3")) comp2[i] = 3;
else if(!strcmp(expr[i], "v4")) comp[i] = 4; else if(!strcmp(expr[i], "v4")) comp2[i] = 4;
else if(!strcmp(expr[i], "v5")) comp[i] = 5; else if(!strcmp(expr[i], "v5")) comp2[i] = 5;
else if(!strcmp(expr[i], "v6")) comp[i] = 6; else if(!strcmp(expr[i], "v6")) comp2[i] = 6;
else if(!strcmp(expr[i], "v7")) comp[i] = 7; else if(!strcmp(expr[i], "v7")) comp2[i] = 7;
else if(!strcmp(expr[i], "v8")) comp[i] = 8; else if(!strcmp(expr[i], "v8")) comp2[i] = 8;
else{ else{
Msg::Error("Invalid expression '%s'", expr[i]); Msg::Error("Invalid expression '%s'", expr[i]);
return; return v;
} }
} }
#endif #endif
int timeBeg = (timeStep < 0) ? 0 : timeStep; PView *v2 = new PView();
int timeEnd = (timeStep < 0) ? -timeStep : timeStep + 1; PViewDataList *data2 = getDataList(v2);
if(timeStep < 0){
timeStep = - data1->getNumTimeSteps();
}
else if(timeStep > data1->getNumTimeSteps() - 1){
Msg::Error("Invalid time step (%d) in View[%d]: using all steps instead",
timeStep, v1->getIndex());
timeStep = - data1->getNumTimeSteps();
}
int nb = inList.size() / inNb; for(int ent = 0; ent < data1->getNumEntities(0); ent++){
for(unsigned int i = 0; i < inList.size(); i += nb) { for(int ele = 0; ele < data1->getNumElements(0, ent); ele++){
double *x = &inList[i]; if(data1->skipElement(0, ent, ele)) continue;
double *y = &inList[i + nbNod]; int numNodes = data1->getNumNodes(0, ent, ele);
double *z = &inList[i + 2 * nbNod]; int numEdges = data1->getNumEdges(0, ent, ele);
for(int j = 0; j < 3 * nbNod; j++) int numComp = data1->getNumComponents(0, ent, ele);
outList->push_back(inList[i + j]); std::vector<double> *out = incrementList(data2, numComp2, numEdges);
for(int j = timeBeg; j < timeEnd; j++){ std::vector<double> x(numNodes), y(numNodes), z(numNodes);
for(int k = 0; k < nbNod; k++){ for(int nod = 0; nod < numNodes; nod++)
double xx = x[k]; data1->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]);
double yy = y[k]; for(int nod = 0; nod < numNodes; nod++) out->push_back(x[nod]);
double zz = z[k]; for(int nod = 0; nod < numNodes; nod++) out->push_back(y[nod]);
double d[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.}; for(int nod = 0; nod < numNodes; nod++) out->push_back(z[nod]);
for(int l = 0; l < nbComp; l++) int timeBeg = (timeStep < 0) ? 0 : timeStep;
d[l] = inList[i + 3 * nbNod + nbNod * nbComp * j + nbComp * k + l]; int timeEnd = (timeStep < 0) ? -timeStep : timeStep + 1;
for(int l = 0; l < outNbComp; l++){ for(int step = timeBeg; step < timeEnd; step++){
for(int nod = 0; nod < numNodes; nod++){
double v[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.};
for(int comp = 0; comp < numComp; comp++)
data1->getValue(step, ent, ele, nod, comp, v[comp]);
for(int comp = 0; comp < numComp2; comp++){
#if defined(HAVE_MATH_EVAL) #if defined(HAVE_MATH_EVAL)
char *names[] = { "x", "y", "z", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8" }; char *names[] = { "x", "y", "z", "v0", "v1", "v2",
double values[] = { xx, yy, zz, d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8] }; "v3", "v4", "v5", "v6", "v7", "v8" };
double res = evaluator_evaluate(f[l], sizeof(names)/sizeof(names[0]), names, values); double values[] = { x[nod], y[nod], z[nod], v[0], v[1], v[2],
v[3], v[4], v[5], v[6], v[7], v[8] };
double res = evaluator_evaluate(f[comp], sizeof(names) / sizeof(names[0]),
names, values);
#else #else
double res = d[comp[l]]; double res = v[comp2[comp]];
#endif #endif
outList->push_back(res); out->push_back(res);
}
} }
} }
} }
(*outNb)++;
} }
#if defined(HAVE_MATH_EVAL) #if defined(HAVE_MATH_EVAL)
for(int i = 0; i < outNbComp; i++) for(int i = 0; i < numComp2; i++)
evaluator_destroy(f[i]); evaluator_destroy(f[i]);
#endif #endif
}
PView *GMSH_ExtractPlugin::execute(PView *v)
{
int step = (int)ExtractOptions_Number[0].def;
int iView = (int)ExtractOptions_Number[1].def;
const char *expr[9] = { ExtractOptions_String[0].def.c_str(),
ExtractOptions_String[1].def.c_str(),
ExtractOptions_String[2].def.c_str(),
ExtractOptions_String[3].def.c_str(),
ExtractOptions_String[4].def.c_str(),
ExtractOptions_String[5].def.c_str(),
ExtractOptions_String[6].def.c_str(),
ExtractOptions_String[7].def.c_str(),
ExtractOptions_String[8].def.c_str() };
PView *v1 = getView(iView, v); if(timeStep < 0){
if(!v1) return v; for(int i = 0; i < data1->getNumTimeSteps(); i++)
data2->Time.push_back(data1->getTime(i));
PViewDataList *data1 = getDataList(v1);
if(!data1) return v;
PView *v2 = new PView();
PViewDataList *data2 = getDataList(v2);
if(!data2) return v;
if(step < 0){
step = - data1->getNumTimeSteps();
}
else if(step > data1->getNumTimeSteps() - 1){
Msg::Error("Invalid time step (%d) in View[%d]: using all steps instead",
step, v1->getIndex());
step = - data1->getNumTimeSteps();
} }
// points
extract(expr, data1->SP, data1->NbSP, &data2->SP, &data2->NbSP,
&data2->VP, &data2->NbVP, &data2->TP, &data2->NbTP, step, 1, 1);
extract(expr, data1->VP, data1->NbVP, &data2->SP, &data2->NbSP,
&data2->VP, &data2->NbVP, &data2->TP, &data2->NbTP, step, 1, 3);
extract(expr, data1->TP, data1->NbTP, &data2->SP, &data2->NbSP,
&data2->VP, &data2->NbVP, &data2->TP, &data2->NbTP, step, 1, 9);
// lines
extract(expr, data1->SL, data1->NbSL, &data2->SL, &data2->NbSL,
&data2->VL, &data2->NbVL, &data2->TL, &data2->NbTL, step, 2, 1);
extract(expr, data1->VL, data1->NbVL, &data2->SL, &data2->NbSL,
&data2->VL, &data2->NbVL, &data2->TL, &data2->NbTL, step, 2, 3);
extract(expr, data1->TL, data1->NbTL, &data2->SL, &data2->NbSL,
&data2->VL, &data2->NbVL, &data2->TL, &data2->NbTL, step, 2, 9);
// triangles
extract(expr, data1->ST, data1->NbST, &data2->ST, &data2->NbST,
&data2->VT, &data2->NbVT, &data2->TT, &data2->NbTT, step, 3, 1);
extract(expr, data1->VT, data1->NbVT, &data2->ST, &data2->NbST,
&data2->VT, &data2->NbVT, &data2->TT, &data2->NbTT, step, 3, 3);
extract(expr, data1->TT, data1->NbTT, &data2->ST, &data2->NbST,
&data2->VT, &data2->NbVT, &data2->TT, &data2->NbTT, step, 3, 9);
// quadrangles
extract(expr, data1->SQ, data1->NbSQ, &data2->SQ, &data2->NbSQ,
&data2->VQ, &data2->NbVQ, &data2->TQ, &data2->NbTQ, step, 4, 1);
extract(expr, data1->VQ, data1->NbVQ, &data2->SQ, &data2->NbSQ,
&data2->VQ, &data2->NbVQ, &data2->TQ, &data2->NbTQ, step, 4, 3);
extract(expr, data1->TQ, data1->NbTQ, &data2->SQ, &data2->NbSQ,
&data2->VQ, &data2->NbVQ, &data2->TQ, &data2->NbTQ, step, 4, 9);
// tets
extract(expr, data1->SS, data1->NbSS, &data2->SS, &data2->NbSS,
&data2->VS, &data2->NbVS, &data2->TS, &data2->NbTS, step, 4, 1);
extract(expr, data1->VS, data1->NbVS, &data2->SS, &data2->NbSS,
&data2->VS, &data2->NbVS, &data2->TS, &data2->NbTS, step, 4, 3);
extract(expr, data1->TS, data1->NbTS, &data2->SS, &data2->NbSS,
&data2->VS, &data2->NbVS, &data2->TS, &data2->NbTS, step, 4, 9);
// hexas
extract(expr, data1->SH, data1->NbSH, &data2->SH, &data2->NbSH,
&data2->VH, &data2->NbVH, &data2->TH, &data2->NbTH, step, 8, 1);
extract(expr, data1->VH, data1->NbVH, &data2->SH, &data2->NbSH,
&data2->VH, &data2->NbVH, &data2->TH, &data2->NbTH, step, 8, 3);
extract(expr, data1->TH, data1->NbTH, &data2->SH, &data2->NbSH,
&data2->VH, &data2->NbVH, &data2->TH, &data2->NbTH, step, 8, 9);
// prisms
extract(expr, data1->SI, data1->NbSI, &data2->SI, &data2->NbSI,
&data2->VI, &data2->NbVI, &data2->TI, &data2->NbTI, step, 6, 1);
extract(expr, data1->VI, data1->NbVI, &data2->SI, &data2->NbSI,
&data2->VI, &data2->NbVI, &data2->TI, &data2->NbTI, step, 6, 3);
extract(expr, data1->TI, data1->NbTI, &data2->SI, &data2->NbSI,
&data2->VI, &data2->NbVI, &data2->TI, &data2->NbTI, step, 6, 9);
// pyramids
extract(expr, data1->SY, data1->NbSY, &data2->SY, &data2->NbSY,
&data2->VY, &data2->NbVY, &data2->TY, &data2->NbTY, step, 5, 1);
extract(expr, data1->VY, data1->NbVY, &data2->SY, &data2->NbSY,
&data2->VY, &data2->NbVY, &data2->TY, &data2->NbTY, step, 5, 3);
extract(expr, data1->TY, data1->NbTY, &data2->SY, &data2->NbSY,
&data2->VY, &data2->NbVY, &data2->TY, &data2->NbTY, step, 5, 9);
if(step < 0)
data2->Time = data1->Time;
else else
data2->Time.push_back(data1->Time[step]); data2->Time.push_back(data1->getTime(timeStep));
data2->setName(data1->getName() + "_Extract"); data2->setName(data1->getName() + "_Extract");
data2->setFileName(data1->getName() + "_Extract.pos"); data2->setFileName(data1->getName() + "_Extract.pos");
data2->finalize(); data2->finalize();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment