From 9bcd72632e4990702d092d879373ac821b591f53 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Sun, 30 Mar 2008 13:21:04 +0000
Subject: [PATCH] smoothing for ElementData fields

---
 Post/PViewDataGModel.cpp   | 45 +++++++++++++++++++++++++++++++++++++-
 Post/PViewDataGModel.h     |  6 ++++-
 Post/PViewDataGModelIO.cpp |  4 +---
 3 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/Post/PViewDataGModel.cpp b/Post/PViewDataGModel.cpp
index 3fcb56d1ee..6e55d7004e 100644
--- a/Post/PViewDataGModel.cpp
+++ b/Post/PViewDataGModel.cpp
@@ -1,4 +1,4 @@
-// $Id: PViewDataGModel.cpp,v 1.39 2008-03-30 10:25:09 geuzaine Exp $
+// $Id: PViewDataGModel.cpp,v 1.40 2008-03-30 13:21:04 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -24,6 +24,7 @@
 
 #include "PViewDataGModel.h"
 #include "MElement.h"
+#include "Numeric.h"
 #include "Message.h"
 
 PViewDataGModel::PViewDataGModel() 
@@ -180,6 +181,48 @@ int PViewDataGModel::getNumEdges(int step, int ent, int ele)
   return _steps[step]->getEntity(ent)->getMeshElement(ele)->getNumEdges();
 }
 
+void PViewDataGModel::smooth()
+{
+  if(_type == NodeData) return;
+  std::vector<stepData<double>*> _steps2;
+  for(unsigned int step = 0; step < _steps.size(); step++){
+    GModel *m = _steps[step]->getModel();
+    int numComp = _steps[step]->getNumComponents();
+    _steps2.push_back(new stepData<double>(m, numComp, _steps[step]->getFileName(),
+					   _steps[step]->getFileIndex()));
+    std::map<int, int> nodeConnect;
+    for(int ent = 0; ent < getNumEntities(step); ent++){
+      for(int ele = 0; ele < getNumElements(step, ent); ele++){
+	MElement *e = _steps[step]->getEntity(ent)->getMeshElement(ele);
+	for(int nod = 0; nod < e->getNumVertices(); nod++){
+	  MVertex *v = e->getVertex(nod);
+	  if(nodeConnect.count(v->getNum()))
+	    nodeConnect[v->getNum()]++;
+	  else
+	    nodeConnect[v->getNum()] = 1;
+	  double *d = _steps2.back()->getData(v->getNum(), true), val;
+	  for(int j = 0; j < numComp; j++)
+	    if(getValue(step, e->getNum(), j, val)) d[j] += val;
+	}
+      }
+    }
+    for(int i = 0; i < _steps2.back()->getNumData(); i++){
+      double *d = _steps2.back()->getData(i);
+      if(d){
+	double f = nodeConnect[i];
+	if(f) for(int j = 0; j < numComp; j++) d[j] /= f;
+	double s = ComputeScalarRep(numComp, d);
+	_steps2[step]->setMin(std::min(_steps2[step]->getMin(), s));
+	_steps2[step]->setMax(std::max(_steps2[step]->getMax(), s));
+      }
+    }
+  }
+  for(unsigned int i = 0; i < _steps.size(); i++) delete _steps[i];
+  _steps = _steps2;
+  _type = NodeData;
+  finalize();
+}
+
 bool PViewDataGModel::skipEntity(int step, int ent)
 {
   return !_steps[step]->getEntity(ent)->getVisibility();
diff --git a/Post/PViewDataGModel.h b/Post/PViewDataGModel.h
index ea6fd31136..659885b697 100644
--- a/Post/PViewDataGModel.h
+++ b/Post/PViewDataGModel.h
@@ -95,7 +95,10 @@ class stepData{
   {
     if(allocIfNeeded){
       if(index >= getNumData()) resizeData(index + 100); // optimize this
-      if(!(*_data)[index]) (*_data)[index] = new real[_numComp * mult];
+      if(!(*_data)[index]){
+	(*_data)[index] = new real[_numComp * mult];
+	for(int i = 0; i < _numComp * mult; i++) (*_data)[index][i] = 0.;
+      }
     }
     else{
       if(index >= getNumData()) return 0;
@@ -150,6 +153,7 @@ class PViewDataGModel : public PViewData {
   int getNumComponents(int step, int ent, int ele);
   void getValue(int step, int ent, int ele, int node, int comp, double &val);
   int getNumEdges(int step, int ent, int ele);
+  void smooth();
   bool skipEntity(int step, int ent);
   bool skipElement(int step, int ent, int ele);
   bool hasTimeStep(int step);
diff --git a/Post/PViewDataGModelIO.cpp b/Post/PViewDataGModelIO.cpp
index b6931170ec..0b2de783b2 100644
--- a/Post/PViewDataGModelIO.cpp
+++ b/Post/PViewDataGModelIO.cpp
@@ -1,4 +1,4 @@
-// $Id: PViewDataGModelIO.cpp,v 1.23 2008-03-30 11:53:04 geuzaine Exp $
+// $Id: PViewDataGModelIO.cpp,v 1.24 2008-03-30 13:21:04 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -320,8 +320,6 @@ bool PViewDataGModel::readMED(std::string fileName, int fileIndex)
 	double *d = _steps[step]->getData(num, true, mult);
 	for(int j = 0; j < numComp * mult; j++)
 	  d[j] = val[numComp * i + j];
-	for(int j = numComp; j < _steps[step]->getNumComponents(); j++)
-	  d[j] = 0.;
 	double s = ComputeScalarRep(_steps[step]->getNumComponents(), d);
 	_steps[step]->setMin(std::min(_steps[step]->getMin(), s));
 	_steps[step]->setMax(std::max(_steps[step]->getMax(), s));
-- 
GitLab