From 2887e36a31fa907e8d78a6abcbc12085ce5bd5b7 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Wed, 1 Jul 2009 21:55:19 +0000
Subject: [PATCH] ported Plugin(Extract) to the new api: testing required...

---
 Plugin/Extract.cpp | 288 +++++++++++++++++++++------------------------
 1 file changed, 134 insertions(+), 154 deletions(-)

diff --git a/Plugin/Extract.cpp b/Plugin/Extract.cpp
index 4aeaec6ce9..d54d16f0f9 100644
--- a/Plugin/Extract.cpp
+++ b/Plugin/Extract.cpp
@@ -97,207 +97,187 @@ void GMSH_ExtractPlugin::catchErrorMessage(char *errorMessage) const
   strcpy(errorMessage, "Extract failed...");
 }
 
-static void extract(const char *expr[9], std::vector<double> &inList, int inNb, 
-                    std::vector<double> *outListScalar, int *outNbScalar, 
-                    std::vector<double> *outListVector, int *outNbVector, 
-                    std::vector<double> *outListTensor, int *outNbTensor, 
-                    int timeStep, int nbNod, int nbComp)
+static std::vector<double> *incrementList(PViewDataList *data2, int numComp2, 
+                                          int numEdges)
 {
-  if(!inNb)
-    return;
+  switch(numEdges){
+  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;
-  std::vector<double> *outList;
+PView *GMSH_ExtractPlugin::execute(PView *v)
+{
+  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]) || 
      strlen(expr[6]) || strlen(expr[7]) || strlen(expr[8])){
-    outNbComp = 9;
-    outNb = outNbTensor;
-    outList = outListTensor;
+    numComp2 = 9;
     for(int i = 0; i < 9; i++)
       if(!strlen(expr[i])) expr[i] = "0";
   }
   else if(strlen(expr[1]) || strlen(expr[2])){
-    outNbComp = 3;
-    outNb = outNbVector;
-    outList = outListVector;
+    numComp2 = 3;
     for(int i = 0; i < 3; i++)
       if(!strlen(expr[i])) expr[i] = "0";
   }
   else{
-    outNbComp = 1;
-    outNb = outNbScalar;
-    outList = outListScalar;
+    numComp2 = 1;
   }
 
   // if we have MathEval, we can evaluate arbitrary expressions;
   // otherwise, we only allow to extract single components
-
 #if defined(HAVE_MATH_EVAL)
   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]);
     if(!f[i]){
       Msg::Error("Invalid expression '%s'", expr[i]);
       for(int j = 0; j < i; j++)
         if(f[j]) evaluator_destroy(f[j]);
-      return;
+      return v;
     }
   }
 #else
-  int comp[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-  for(int i = 0; i < outNbComp; i++){
-    if     (!strcmp(expr[i], "v0")) comp[i] = 0;
-    else if(!strcmp(expr[i], "v1")) comp[i] = 1;
-    else if(!strcmp(expr[i], "v2")) comp[i] = 2;
-    else if(!strcmp(expr[i], "v3")) comp[i] = 3;
-    else if(!strcmp(expr[i], "v4")) comp[i] = 4;
-    else if(!strcmp(expr[i], "v5")) comp[i] = 5;
-    else if(!strcmp(expr[i], "v6")) comp[i] = 6;
-    else if(!strcmp(expr[i], "v7")) comp[i] = 7;
-    else if(!strcmp(expr[i], "v8")) comp[i] = 8;
+  int comp2[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+  for(int i = 0; i < numComp2; i++){
+    if     (!strcmp(expr[i], "v0")) comp2[i] = 0;
+    else if(!strcmp(expr[i], "v1")) comp2[i] = 1;
+    else if(!strcmp(expr[i], "v2")) comp2[i] = 2;
+    else if(!strcmp(expr[i], "v3")) comp2[i] = 3;
+    else if(!strcmp(expr[i], "v4")) comp2[i] = 4;
+    else if(!strcmp(expr[i], "v5")) comp2[i] = 5;
+    else if(!strcmp(expr[i], "v6")) comp2[i] = 6;
+    else if(!strcmp(expr[i], "v7")) comp2[i] = 7;
+    else if(!strcmp(expr[i], "v8")) comp2[i] = 8;
     else{
       Msg::Error("Invalid expression '%s'", expr[i]);
-      return;
+      return v;
     }
   }
 #endif
 
-  int timeBeg = (timeStep < 0) ? 0 : timeStep;
-  int timeEnd = (timeStep < 0) ? -timeStep : timeStep + 1;
+  PView *v2 = new PView();
+  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(unsigned int i = 0; i < inList.size(); i += nb) {
-    double *x = &inList[i];
-    double *y = &inList[i + nbNod];
-    double *z = &inList[i + 2 * nbNod];
-    for(int j = 0; j < 3 * nbNod; j++)
-      outList->push_back(inList[i + j]);
-    for(int j = timeBeg; j < timeEnd; j++){
-      for(int k = 0; k < nbNod; k++){
-        double xx = x[k];
-        double yy = y[k];
-        double zz = z[k];
-        double d[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.};
-        for(int l = 0; l < nbComp; l++)
-          d[l] = inList[i + 3 * nbNod + nbNod * nbComp * j + nbComp * k + l];
-        for(int l = 0; l < outNbComp; l++){
+  for(int ent = 0; ent < data1->getNumEntities(0); ent++){
+    for(int ele = 0; ele < data1->getNumElements(0, ent); ele++){
+      if(data1->skipElement(0, ent, ele)) continue;
+      int numNodes = data1->getNumNodes(0, ent, ele);
+      int numEdges = data1->getNumEdges(0, ent, ele);
+      int numComp = data1->getNumComponents(0, ent, ele);
+      std::vector<double> *out = incrementList(data2, numComp2, numEdges);
+      std::vector<double> x(numNodes), y(numNodes), z(numNodes);
+      for(int nod = 0; nod < numNodes; nod++)
+        data1->getNode(0, 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(y[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 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)
-          char *names[] = { "x", "y", "z", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8" };
-          double values[] = { xx, yy, zz, d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8] };
-          double res = evaluator_evaluate(f[l], sizeof(names)/sizeof(names[0]), names, values);
+            char *names[] = { "x", "y", "z", "v0", "v1", "v2", 
+                              "v3", "v4", "v5", "v6", "v7", "v8" };
+            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
-          double res = d[comp[l]];
+            double res = v[comp2[comp]];
 #endif
-          outList->push_back(res);
+            out->push_back(res);
+          }
         }
       }
     }
-    (*outNb)++;
   }
-
+  
 #if defined(HAVE_MATH_EVAL)
-  for(int i = 0; i < outNbComp; i++)
+  for(int i = 0; i < numComp2; i++)
     evaluator_destroy(f[i]);
 #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(!v1) return v;
-
-  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();
+  if(timeStep < 0){
+    for(int i = 0; i < data1->getNumTimeSteps(); i++)
+      data2->Time.push_back(data1->getTime(i));
   }
-
-  // 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
-    data2->Time.push_back(data1->Time[step]);
-
+    data2->Time.push_back(data1->getTime(timeStep));
+        
   data2->setName(data1->getName() + "_Extract");
   data2->setFileName(data1->getName() + "_Extract.pos");
   data2->finalize();
-- 
GitLab