From 1307885154520fde5295b5229f25a32be54b1fa3 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 27 Jan 2012 09:33:59 +0000
Subject: [PATCH] fix for sparse time steps

---
 Plugin/Curl.cpp       | 23 +++++++++++++----------
 Plugin/Divergence.cpp | 21 ++++++++++++---------
 Plugin/Gradient.cpp   | 23 +++++++++++++----------
 3 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/Plugin/Curl.cpp b/Plugin/Curl.cpp
index c09d3e5b2e..bec30666b9 100644
--- a/Plugin/Curl.cpp
+++ b/Plugin/Curl.cpp
@@ -40,7 +40,7 @@ StringXNumber *GMSH_CurlPlugin::getOption(int iopt)
 PView *GMSH_CurlPlugin::execute(PView *v)
 {
   int iView = (int)CurlOptions_Number[0].def;
-  
+
   PView *v1 = getView(iView, v);
   if(!v1) return v;
 
@@ -52,20 +52,21 @@ PView *GMSH_CurlPlugin::execute(PView *v)
 
   PView *v2 = new PView();
   PViewDataList *data2 = getDataList(v2);
+  int firstNonEmptyStep =  data1->getFirstNonEmptyTimeStep();
 
-  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 numComp = data1->getNumComponents(0, ent, ele);
+  for(int ent = 0; ent < data1->getNumEntities(firstNonEmptyStep); ent++){
+    for(int ele = 0; ele < data1->getNumElements(firstNonEmptyStep, ent); ele++){
+      if(data1->skipElement(firstNonEmptyStep, ent, ele)) continue;
+      int numComp = data1->getNumComponents(firstNonEmptyStep, ent, ele);
       if(numComp != 3) continue;
-      int type = data1->getType(0, ent, ele);
+      int type = data1->getType(firstNonEmptyStep, ent, ele);
       std::vector<double> *out = data2->incrementList(3, type);
       if(!out) continue;
-      int numNodes = data1->getNumNodes(0, ent, ele);
+      int numNodes = data1->getNumNodes(firstNonEmptyStep, ent, ele);
       double x[8], y[8], z[8], val[8 * 3];
       for(int nod = 0; nod < numNodes; nod++)
-        data1->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]);
-      int dim = data1->getDimension(0, ent, ele);
+        data1->getNode(firstNonEmptyStep, ent, ele, nod, x[nod], y[nod], z[nod]);
+      int dim = data1->getDimension(firstNonEmptyStep, ent, ele);
       elementFactory factory;
       element *element = factory.create(numNodes, dim, x, y, z);
       if(!element) continue;
@@ -73,6 +74,7 @@ PView *GMSH_CurlPlugin::execute(PView *v)
       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 step = 0; step < data1->getNumTimeSteps(); step++){
+        if(!data1->hasTimeStep(step)) continue;
         for(int nod = 0; nod < numNodes; nod++)
           for(int comp = 0; comp < numComp; comp++)
             data1->getValue(step, ent, ele, nod, comp, val[numComp * nod + comp]);
@@ -90,12 +92,13 @@ PView *GMSH_CurlPlugin::execute(PView *v)
   }
 
   for(int i = 0; i < data1->getNumTimeSteps(); i++){
+    if(!data1->hasTimeStep(i)) continue;
     double time = data1->getTime(i);
     data2->Time.push_back(time);
   }
   data2->setName(data1->getName() + "_Curl");
   data2->setFileName(data1->getName() + "_Curl.pos");
   data2->finalize();
-  
+
   return v2;
 }
diff --git a/Plugin/Divergence.cpp b/Plugin/Divergence.cpp
index 6b87dee4c6..ffabf5a367 100644
--- a/Plugin/Divergence.cpp
+++ b/Plugin/Divergence.cpp
@@ -40,7 +40,7 @@ StringXNumber *GMSH_DivergencePlugin::getOption(int iopt)
 PView *GMSH_DivergencePlugin::execute(PView *v)
 {
   int iView = (int)DivergenceOptions_Number[0].def;
-  
+
   PView *v1 = getView(iView, v);
   if(!v1) return v;
 
@@ -52,20 +52,21 @@ PView *GMSH_DivergencePlugin::execute(PView *v)
 
   PView *v2 = new PView();
   PViewDataList *data2 = getDataList(v2);
+  int firstNonEmptyStep =  data1->getFirstNonEmptyTimeStep();
 
-  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 numComp = data1->getNumComponents(0, ent, ele);
+  for(int ent = 0; ent < data1->getNumEntities(firstNonEmptyStep); ent++){
+    for(int ele = 0; ele < data1->getNumElements(firstNonEmptyStep, ent); ele++){
+      if(data1->skipElement(firstNonEmptyStep, ent, ele)) continue;
+      int numComp = data1->getNumComponents(firstNonEmptyStep, ent, ele);
       if(numComp != 3) continue;
-      int type = data1->getType(0, ent, ele);
+      int type = data1->getType(firstNonEmptyStep, ent, ele);
       std::vector<double> *out = data2->incrementList(1, type);
       if(!out) continue;
-      int numNodes = data1->getNumNodes(0, ent, ele);
+      int numNodes = data1->getNumNodes(firstNonEmptyStep, ent, ele);
       double x[8], y[8], z[8], val[8 * 3];
       for(int nod = 0; nod < numNodes; nod++)
-        data1->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]);
-      int dim = data1->getDimension(0, ent, ele);
+        data1->getNode(firstNonEmptyStep, ent, ele, nod, x[nod], y[nod], z[nod]);
+      int dim = data1->getDimension(firstNonEmptyStep, ent, ele);
       elementFactory factory;
       element *element = factory.create(numNodes, dim, x, y, z);
       if(!element) continue;
@@ -73,6 +74,7 @@ PView *GMSH_DivergencePlugin::execute(PView *v)
       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 step = 0; step < data1->getNumTimeSteps(); step++){
+        if(!data1->hasTimeStep(step)) continue;
         for(int nod = 0; nod < numNodes; nod++)
           for(int comp = 0; comp < numComp; comp++)
             data1->getValue(step, ent, ele, nod, comp, val[numComp * nod + comp]);
@@ -88,6 +90,7 @@ PView *GMSH_DivergencePlugin::execute(PView *v)
   }
 
   for(int i = 0; i < data1->getNumTimeSteps(); i++){
+    if(!data1->hasTimeStep(i)) continue;
     double time = data1->getTime(i);
     data2->Time.push_back(time);
   }
diff --git a/Plugin/Gradient.cpp b/Plugin/Gradient.cpp
index 4f954ed03d..98fe67a298 100644
--- a/Plugin/Gradient.cpp
+++ b/Plugin/Gradient.cpp
@@ -40,7 +40,7 @@ StringXNumber *GMSH_GradientPlugin::getOption(int iopt)
 PView *GMSH_GradientPlugin::execute(PView *v)
 {
   int iView = (int)GradientOptions_Number[0].def;
-  
+
   PView *v1 = getView(iView, v);
   if(!v1) return v;
 
@@ -52,20 +52,21 @@ PView *GMSH_GradientPlugin::execute(PView *v)
 
   PView *v2 = new PView();
   PViewDataList *data2 = getDataList(v2);
+  int firstNonEmptyStep =  data1->getFirstNonEmptyTimeStep();
 
-  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 numComp = data1->getNumComponents(0, ent, ele);
+  for(int ent = 0; ent < data1->getNumEntities(firstNonEmptyStep); ent++){
+    for(int ele = 0; ele < data1->getNumElements(firstNonEmptyStep, ent); ele++){
+      if(data1->skipElement(firstNonEmptyStep, ent, ele)) continue;
+      int numComp = data1->getNumComponents(firstNonEmptyStep, ent, ele);
       if(numComp != 1 && numComp != 3) continue;
-      int type = data1->getType(0, ent, ele);
+      int type = data1->getType(firstNonEmptyStep, ent, ele);
       std::vector<double> *out = data2->incrementList((numComp == 1) ? 3 : 9, type);
       if(!out) continue;
-      int numNodes = data1->getNumNodes(0, ent, ele);
+      int numNodes = data1->getNumNodes(firstNonEmptyStep, ent, ele);
       double x[8], y[8], z[8], val[8 * 3];
       for(int nod = 0; nod < numNodes; nod++)
-        data1->getNode(0, ent, ele, nod, x[nod], y[nod], z[nod]);
-      int dim = data1->getDimension(0, ent, ele);
+        data1->getNode(firstNonEmptyStep, ent, ele, nod, x[nod], y[nod], z[nod]);
+      int dim = data1->getDimension(firstNonEmptyStep, ent, ele);
       elementFactory factory;
       element *element = factory.create(numNodes, dim, x, y, z);
       if(!element) continue;
@@ -73,6 +74,7 @@ PView *GMSH_GradientPlugin::execute(PView *v)
       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 step = 0; step < data1->getNumTimeSteps(); step++){
+        if(!data1->hasTimeStep(step)) continue;
         for(int nod = 0; nod < numNodes; nod++)
           for(int comp = 0; comp < numComp; comp++)
             data1->getValue(step, ent, ele, nod, comp, val[numComp * nod + comp]);
@@ -92,12 +94,13 @@ PView *GMSH_GradientPlugin::execute(PView *v)
   }
 
   for(int i = 0; i < data1->getNumTimeSteps(); i++){
+    if(!data1->hasTimeStep(i)) continue;
     double time = data1->getTime(i);
     data2->Time.push_back(time);
   }
   data2->setName(data1->getName() + "_Gradient");
   data2->setFileName(data1->getName() + "_Gradient.pos");
   data2->finalize();
-  
+
   return v2;
 }
-- 
GitLab