87    static CellCenterPrimaryVariables 
flux(
const Problem& problem,
 
   88                                           const Element& element,
 
   89                                           const FVElementGeometry& fvGeometry,
 
   90                                           const ElementVolumeVariables& elemVolVars,
 
   91                                           const SubControlVolumeFace& scvf)
 
   95        CellCenterPrimaryVariables componentFlux(0.0);
 
   96        ReducedComponentVector moleFracInside(0.0);
 
   97        ReducedComponentVector moleFracOutside(0.0);
 
   98        ReducedComponentVector reducedFlux(0.0);
 
   99        ReducedComponentMatrix reducedDiffusionMatrixInside(0.0);
 
  100        ReducedComponentMatrix reducedDiffusionMatrixOutside(0.0);
 
  103        const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()];
 
  104        const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
 
  105        const auto rhoInside = insideVolVars.density();
 
  106        const auto rhoOutside = outsideVolVars.density();
 
  109        for(
int compIdx = 0; compIdx < numComponents; ++compIdx)
 
  111            if(compIdx == FluidSystem::getMainComponent(0))
 
  115            const auto eqIdx = Indices::conti0EqIdx + compIdx;
 
  118               const auto bcTypes = problem.boundaryTypes(element, scvf);
 
  119                 if((bcTypes.isOutflow(eqIdx)) || (bcTypes.isSymmetry()))
 
  120                    return componentFlux;
 
  125        for (
int compIdx = 0; compIdx < numComponents-1; compIdx++)
 
  128            const auto xInside = insideVolVars.moleFraction(compIdx);
 
  130            const auto xOutside = outsideVolVars.moleFraction(compIdx);
 
  132            moleFracInside[compIdx] = xInside;
 
  133            moleFracOutside[compIdx] = xOutside;
 
  137        reducedDiffusionMatrixInside = setupMSMatrix_(problem, fvGeometry, insideVolVars, scvf);
 
  139        reducedDiffusionMatrixOutside = setupMSMatrix_(problem, fvGeometry, outsideVolVars, scvf);
 
  141        const auto insideScvIdx = scvf.insideScvIdx();
 
  142        const auto& insideScv = fvGeometry.scv(insideScvIdx);
 
  143        const auto outsideScvIdx = scvf.outsideScvIdx();
 
  144        const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
 
  146        const Scalar insideDistance = (insideScv.dofPosition() - scvf.ipGlobal()).two_norm();
 
  148        const Scalar omegai = calculateOmega_(insideDistance, insideVolVars.extrusionFactor());
 
  153            moleFracOutside -= moleFracInside;
 
  154            reducedDiffusionMatrixInside.solve(reducedFlux, moleFracOutside);
 
  155            reducedFlux *= omegai*rhoInside;
 
  159            const Scalar outsideDistance = (outsideScv.dofPosition() - scvf.ipGlobal()).two_norm();
 
  160            const Scalar omegaj = calculateOmega_(outsideDistance, outsideVolVars.extrusionFactor());
 
  162            reducedDiffusionMatrixInside.invert();
 
  163            reducedDiffusionMatrixOutside.invert();
 
  164            reducedDiffusionMatrixInside *= omegai*rhoInside;
 
  165            reducedDiffusionMatrixOutside *= omegaj*rhoOutside;
 
  168            ReducedComponentVector helperVector(0.0);
 
  169            ReducedComponentVector gradientVectori(0.0);
 
  170            ReducedComponentVector gradientVectorj(0.0);
 
  172            reducedDiffusionMatrixInside.mv(moleFracInside, gradientVectori);
 
  173            reducedDiffusionMatrixOutside.mv(moleFracOutside, gradientVectorj);
 
  175            auto gradientVectorij = (gradientVectori + gradientVectorj);
 
  178            reducedDiffusionMatrixOutside += reducedDiffusionMatrixInside;
 
  180            reducedDiffusionMatrixOutside.solve(helperVector, gradientVectorij);
 
  183            helperVector -=moleFracInside;
 
  184            reducedDiffusionMatrixInside.mv(helperVector, reducedFlux);
 
  187        reducedFlux *= -Extrusion::area(fvGeometry, scvf);
 
  189        for (
int compIdx = 0; compIdx < numComponents-1; compIdx++)
 
  191            componentFlux[compIdx] = reducedFlux[compIdx];
 
  192            componentFlux[numComponents-1] -= reducedFlux[compIdx];
 
  195        return componentFlux ;