From 2c4561b54e202fe316143cdbeced90e797ede5d1 Mon Sep 17 00:00:00 2001
From: Stefan Girke <stefan.girke@wwu.de>
Date: Thu, 18 Feb 2016 18:46:58 +0100
Subject: [PATCH] adjust flux discrete model, still not compiling
 (advdiff-test)

---
 dune/fem-dg/operator/dg/fluxdiscretemodel.hh  | 66 +++++++------------
 .../operator/fluxes/diffusion/averageflux.hh  |  6 +-
 2 files changed, 28 insertions(+), 44 deletions(-)

diff --git a/dune/fem-dg/operator/dg/fluxdiscretemodel.hh b/dune/fem-dg/operator/dg/fluxdiscretemodel.hh
index 381bcd8d..bc976abe 100644
--- a/dune/fem-dg/operator/dg/fluxdiscretemodel.hh
+++ b/dune/fem-dg/operator/dg/fluxdiscretemodel.hh
@@ -167,7 +167,7 @@ namespace Fem
     void analyticalFlux(const LocalEvaluation& local,
                         JacobianRangeType& f)
     {
-      model_.jacobian( local.entity(), local.time(), local.position(), local.values()[ uVar ], f);
+      model_.jacobian( local, local.values()[ uVar ], f);
     }
 
     /**
@@ -178,41 +178,27 @@ namespace Fem
                         RangeType& gLeft,
                         JacobianRangeType& gDiffLeft ) const
     {
-      return boundaryFluxImpl( left.intersection(), left.time(),
-                               left.quadrature(), left.index(),
-                               left.values()[ uVar ], gLeft, gDiffLeft );
+      return boundaryFluxImpl( left, left.values()[ uVar ], gLeft, gDiffLeft );
     }
 
   protected:
-    template <class QuadratureImp,
-              class UType>
-    double boundaryFluxImpl(const Intersection& it,
-                        double time,
-                        const QuadratureImp& faceQuadInner,
-                        const int quadPoint,
-                        const UType& uLeft,
-                        RangeType& gLeft,
-                        JacobianRangeType& gDiffLeft ) const
+    template <class LocalEvaluation, class UType >
+    double boundaryFluxImpl( const LocalEvaluation& left,
+                             const UType& uLeft,
+                             RangeType& gLeft,
+                             JacobianRangeType& gDiffLeft ) const
     {
-      const FaceDomainType& x = faceQuadInner.localPosition( quadPoint );
+      const FaceDomainType& x = left.localPosition();
+      const DomainType normal = left.intersection().integrationOuterNormal( x );
 
       UType uRight;
 
-      if( model_.hasBoundaryValue(it,time,x) )
-      {
-        model_.boundaryValue(it, time, x, uLeft, uRight);
-      }
+      if( model_.hasBoundaryValue( left ) )
+        model_.boundaryValue( left, uLeft, uRight);
       else
-      {
         uRight = uLeft;
-      }
 
-      return gradientFlux_.gradientBoundaryFlux(it, inside(),
-                             time, faceQuadInner, quadPoint,
-                             uLeft,
-                             uRight,
-                             gLeft,
-                             gDiffLeft );
+      return gradientFlux_.gradientBoundaryFlux( left, uLeft, uRight, gLeft, gDiffLeft );
     }
 
   private:
@@ -344,7 +330,7 @@ namespace Fem
       if (diffusion)
       {
         const double dtStiff =
-          model_.stiffSource( local.entity(), local.time(), local.position(), local.values()[uVar], uJac, s );
+          model_.stiffSource( local, local.values()[uVar], uJac, s );
         dtEst = ( dtStiff > 0 ) ? dtStiff : dtEst;
       }
 
@@ -352,7 +338,7 @@ namespace Fem
       {
         RangeType sNonStiff(0);
         const double dtNon =
-          model_.nonStiffSource( local.entity(), local.time(), local.position(), local.values()[uVar], uJac, sNonStiff );
+          model_.nonStiffSource( local, local.values()[uVar], uJac, sNonStiff );
 
         s += sNonStiff;
 
@@ -410,8 +396,7 @@ namespace Fem
       {
         RangeType dLeft, dRight;
         diffTimeStep =
-          diffFlux_.numericalFlux(left.intersection(), *this,
-                                  left.time(), left.quadrature(), right.quadrature(), left.index(),
+          diffFlux_.numericalFlux(left,
                                   left.values()[ uVar ], right.values()[ uVar ],
                                   left.values() [ sigmaVar ], right.values()[ sigmaVar ],
                                   dLeft, dRight,
@@ -445,20 +430,18 @@ namespace Fem
 
       double diffTimeStep = 0.0;
 
-      bool hasBoundaryValue =
-        model_.hasBoundaryValue( left );
+      bool hasBoundaryValue = model_.hasBoundaryValue( left );
 
       if( diffusion && hasBoundaryValue )
       {
         // diffusion boundary flux for Dirichlet boundaries
         RangeType dLeft ( 0 );
-        diffTimeStep = diffFlux_.boundaryFlux( left.intersection(),
-                               *this,
-                               left.time(), left.quadrature(), left.index(),
-                               left.values()[ uVar ], uBnd_, // is set during call of  BaseType::boundaryFlux
-                               left.values()[ sigmaVar ],
-                               dLeft,
-                               gDiffLeft);
+        diffTimeStep = diffFlux_.boundaryFlux( left,
+                                               left.values()[ uVar ],
+                                               uBnd_, // is set during call of  BaseType::boundaryFlux
+                                               left.values()[ sigmaVar ],
+                                               dLeft,
+                                               gDiffLeft);
         gLeft += dLeft;
       }
       else if ( diffusion )
@@ -468,8 +451,7 @@ namespace Fem
         typedef typename DiffusionFluxType::GradientRangeType GradientRangeType;
         Dune::Fem::FieldMatrixConverter< GradientRangeType, JacobianRangeType > uJac( left.values()[ sigmaVar ] );
 
-        model_.diffusionBoundaryFlux( left.intersection(), left.time(), left.localPosition(),
-                                      left.values()[uVar], uJac, diffBndFlux );
+        model_.diffusionBoundaryFlux( left, left.values()[uVar], uJac, diffBndFlux );
         gLeft += diffBndFlux;
       }
       else
@@ -498,7 +480,7 @@ namespace Fem
         typedef typename DiffusionFluxType::GradientRangeType GradientRangeType;
         Dune::Fem::FieldMatrixConverter< GradientRangeType, JacobianRangeType > uJac( local.values()[ sigmaVar ] );
 
-        model_.diffusion( local.entity(), local.time(), local.position(), local.values()[ uVar ], uJac, diffmatrix);
+        model_.diffusion( local, local.values()[ uVar ], uJac, diffmatrix);
         // ldg case
         f += diffmatrix;
       }
diff --git a/dune/fem-dg/operator/fluxes/diffusion/averageflux.hh b/dune/fem-dg/operator/fluxes/diffusion/averageflux.hh
index e19b6cd5..24b7ebb7 100644
--- a/dune/fem-dg/operator/fluxes/diffusion/averageflux.hh
+++ b/dune/fem-dg/operator/fluxes/diffusion/averageflux.hh
@@ -144,6 +144,7 @@ namespace Fem
 
       if( thetaLeft > 0 )
       {
+        //TODO use diffusionTimeStep
         diffTimeStep =
           /* central differences (might be suboptimal) */
           model_.diffusion(left, uLeft, diffmatrix );
@@ -204,6 +205,7 @@ namespace Fem
       if( thetaRight > 0 )
         uVal.axpy( thetaRight, uBnd );
 
+      //TODO use diffusionTimeStep
       const double diffTimeStep =
             model_.diffusion(left, uVal, diffmatrix );
 
@@ -234,8 +236,6 @@ namespace Fem
                          const LocalEvaluation& right,
                          const RangeType& uLeft,
                          const RangeType& uRight,
-                         const JacobianRangeType& jacLeft,
-                         const JacobianRangeType& jacRight,
                          const GradientRangeType& sigmaLeft,
                          const GradientRangeType& sigmaRight,
                          RangeType& gLeft,
@@ -309,8 +309,10 @@ namespace Fem
       /* Diffusion (Pass 2)       */
       /****************************/
       JacobianRangeType diffmatrix;
+      //TODO use diffusionTimeStep
       double diffTimeStep =
         model_.diffusion(left, uLeft, sigmaLeft, diffmatrix);
+
       diffmatrix.mv(normal, gLeft);
 
       // add penalty term
-- 
GitLab