diff --git a/dumux/flux/box/dispersionflux.hh b/dumux/flux/box/dispersionflux.hh index fd8bbb8e2aa15e78096e3c5e652c2ce06cfb18ef..b6516f47d2ce884b694c63f5216cde13844b00e2 100644 --- a/dumux/flux/box/dispersionflux.hh +++ b/dumux/flux/box/dispersionflux.hh @@ -15,6 +15,7 @@ #include <dune/common/fvector.hh> #include <dune/common/fmatrix.hh> +#include <dune/common/float_cmp.hh> #include <dumux/common/math.hh> #include <dumux/common/properties.hh> @@ -22,6 +23,7 @@ #include <dumux/discretization/extrusion.hh> #include <dumux/flux/traits.hh> #include <dumux/flux/referencesystemformulation.hh> +#include <dumux/flux/facetensoraverage.hh> namespace Dumux { @@ -102,13 +104,30 @@ public: rhoMassOrMole += rho * shapeValues[scv.indexInElement()][0]; } + const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()]; + const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()]; + for (int compIdx = 0; compIdx < numComponents; compIdx++) { // collect the dispersion tensor, the fluxVarsCache and the shape values - const auto& dispersionTensor = - ModelTraits::CompositionalDispersionModel::compositionalDispersionTensor(problem, scvf, fvGeometry, - elemVolVars, elemFluxVarsCache, - phaseIdx, compIdx); + const auto& dispersionTensor = [&]() + { + const auto& tensor = + ModelTraits::CompositionalDispersionModel::compositionalDispersionTensor(problem, scvf, fvGeometry, + elemVolVars, elemFluxVarsCache, + phaseIdx, compIdx); + + if (Dune::FloatCmp::eq(insideVolVars.extrusionFactor(), outsideVolVars.extrusionFactor(), 1e-6)) + return insideVolVars.extrusionFactor()*tensor; + else + { + const auto insideTensor = insideVolVars.extrusionFactor() * tensor; + const auto outsideTensor = outsideVolVars.extrusionFactor() * tensor; + + // the resulting averaged dispersion tensor + return faceTensorAverage(insideTensor, outsideTensor, scvf.unitOuterNormal()); + } + }(); // the mole/mass fraction gradient Dune::FieldVector<Scalar, dimWorld> gradX(0.0); @@ -138,11 +157,29 @@ public: const int phaseIdx, const ElementFluxVariablesCache& elemFluxVarsCache) { + const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()]; + const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()]; + // collect the dispersion tensor - const auto& dispersionTensor = - ModelTraits::ThermalDispersionModel::thermalDispersionTensor(problem, scvf, fvGeometry, - elemVolVars, elemFluxVarsCache, - phaseIdx); + const auto& dispersionTensor = [&]() + { + const auto& tensor = + ModelTraits::ThermalDispersionModel::thermalDispersionTensor(problem, scvf, fvGeometry, + elemVolVars, elemFluxVarsCache, + phaseIdx); + + if (Dune::FloatCmp::eq(insideVolVars.extrusionFactor(), outsideVolVars.extrusionFactor(), 1e-6)) + return insideVolVars.extrusionFactor()*tensor; + else + { + const auto insideTensor = insideVolVars.extrusionFactor() * tensor; + const auto outsideTensor = outsideVolVars.extrusionFactor() * tensor; + + // the resulting averaged dispersion tensor + return faceTensorAverage(insideTensor, outsideTensor, scvf.unitOuterNormal()); + } + }(); + // compute the temperature gradient with the shape functions const auto& fluxVarsCache = elemFluxVarsCache[scvf]; Dune::FieldVector<Scalar, GridView::dimensionworld> gradTemp(0.0);