From 0a1b7cf2d4b3f34b73a6322bca085b3734c0c593 Mon Sep 17 00:00:00 2001
From: Jonathan Youett <youett@mi.fu-berlin.de>
Date: Mon, 14 Apr 2014 14:04:47 +0000
Subject: [PATCH] Use BoundaryFunctionalAssembler and NeumannBoundaryAssembler
 to make compile again.

[[Imported from SVN: r13123]]
---
 viscoelast.cc | 56 +++++++++++++++++++++++++--------------------------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/viscoelast.cc b/viscoelast.cc
index 294116e..36ead7e 100644
--- a/viscoelast.cc
+++ b/viscoelast.cc
@@ -21,9 +21,10 @@
 #include <dune/fufem/boundarypatch.hh>
 #include <dune/fufem/readbitfield.hh>
 #include <dune/fufem/computestress.hh>
-#include <dune/fufem/neumannassembler.hh>
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 #include <dune/fufem/assemblers/operatorassembler.hh>
+#include <dune/fufem/assemblers/boundaryfunctionalassembler.hh>
+#include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/viscosityassembler.hh>
 #include <dune/fufem/functiontools/gridfunctionadaptor.hh>
@@ -142,17 +143,16 @@ int main (int argc, char *argv[]) try
     	dirichletBoundaryAll[0].setup(grid, 0, dirichletNodesAll[0]);
         */
           	
-    	std::vector<BitSetVector<dim> > neumannNodes(maxLevel+1);
-    	std::vector<LevelBoundaryPatch> neumannBoundary(maxLevel+1);
-    	std::vector<VectorType> neumannValues(maxLevel+1);
-    	
+    	LevelBoundaryPatch coarseNeumannBoundary;
+    	VectorType coarseNeumannValues;
+	
     	//Read neumann boundary values
     	if (neumannBV) {
     		
-    		neumannBoundary[0].setup(grid.levelView(0));		
-    		readBoundaryPatch<GridType>(neumannBoundary[0], path + neumannFile);
-        	neumannValues[0].resize(grid.size(0,dim));     
-        	AmiraMeshReader<GridType>::readFunction(neumannValues[0], path + neumannValuesFile);
+    		coarseNeumannBoundary.setup(grid.levelView(0));		
+    		readBoundaryPatch<GridType>(coarseNeumannBoundary, path + neumannFile);
+        	coarseNeumannValues.resize(grid.size(0,dim));     
+        	AmiraMeshReader<GridType>::readFunction(coarseNeumannValues, path + neumannValuesFile);
     	}
     	
     	
@@ -191,23 +191,20 @@ int main (int argc, char *argv[]) try
     	sampleOnBitField(grid, dirichletValues, dirichletNodes);
     
     	//Determine Neumann dofs 
-    	if(neumannBV){  	
-    		BoundaryPatchProlongator<GridType>::prolong(neumannBoundary);
+
+    	BitSetVector<dim>  neumannNodes(grid.size(dim));
+    	VectorType neumannValues(neumannNodes.size());
+        BoundaryPatch<GridType::LeafGridView> neumannBoundary(grid.leafGridView());
+    	if(neumannBV) {  	
+    		BoundaryPatchProlongator<GridType>::prolong(coarseNeumannBoundary,neumannBoundary);
    
-       		for (int i=0; i<=grid.maxLevel(); i++) {        
-    	    	neumannNodes[i].resize(grid.size(i,dim));
-            	for (int j=0; j<grid.size(i,dim); j++)              
-                 	 for (int k=0; k<dim; k++)
-                      	  neumannNodes[i][j][k] = neumannBoundary[i].containsVertex(j);         
-       		}
+            for (size_t j=0; j<neumannNodes.size(); j++)
+                for (int k=0; k<dim; k++)
+                    neumannNodes[j][k] = neumannBoundary.containsVertex(j);
     
-       		sampleOnBitField(grid, neumannValues, neumannNodes);    
+       		sampleOnBitField(grid, coarseNeumannValues, neumannValues, neumannNodes);    
     	}
     
-        
-    	//PatchProlongator<GridType>::prolong(dirichletBoundaryAll);
-                
-
     	
      	//right-hand-side  rhs = bodyforces + neumanboundary
      	VectorType rhs(grid.size(dim));
@@ -224,10 +221,7 @@ int main (int argc, char *argv[]) try
                 
           	 }
 
-     	// Assemble neumann boundary values
-        if (neumannBV)        	
-            assembleAndAddNeumannTerm(neumannBoundary[grid.maxLevel()],neumannValues[grid.maxLevel()],rhs);
-        
+     
         OperatorType elasticPart,viscousPart;
         typedef P1NodalBasis<GridType::LeafGridView,double> P1Basis;
         P1Basis p1Basis(grid.leafView());
@@ -237,8 +231,14 @@ int main (int argc, char *argv[]) try
  
         ViscosityAssembler<GridType, P1Basis::LocalFiniteElement, P1Basis::LocalFiniteElement> visLocalAssembler(nu_shear, nu_bulk);
         globalAssembler.assemble(visLocalAssembler, viscousPart);
-                                	
-       
+
+        if (neumannBV) {
+            BasisGridFunction<P1Basis,VectorType> neumannFunction(p1Basis, neumannValues);
+            NeumannBoundaryAssembler<GridType, Dune::FieldVector<double,dim> > neumannBoundaryAssembler(neumannFunction);
+
+            BoundaryFunctionalAssembler<P1Basis> boundaryFunctionalAssembler(p1Basis, neumannBoundary);
+            boundaryFunctionalAssembler.assemble(neumannBoundaryAssembler, rhs, true);
+        } 
         /*
         //test vectors with time ,total surfacestress and total strain data 
         BlockVector<FieldVector<double,1> > time(num_timesteps),surfacestress(num_timesteps), strain(num_timesteps);
-- 
GitLab