93 static ComponentFluxVector
flux(
const Problem& problem,
94 const Element& element,
95 const FVElementGeometry& fvGeometry,
96 const ElementVolumeVariables& elemVolVars,
97 const SubControlVolumeFace& scvf,
99 const ElementFluxVariablesCache& elemFluxVarsCache)
103 ComponentFluxVector componentFlux(0.0);
104 ReducedComponentVector moleFracInside(0.0);
105 ReducedComponentVector moleFracOutside(0.0);
106 ReducedComponentVector reducedFlux(0.0);
107 ReducedComponentMatrix reducedDiffusionMatrixInside(0.0);
108 ReducedComponentMatrix reducedDiffusionMatrixOutside(0.0);
111 const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()];
112 const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
113 const auto rhoInside = insideVolVars.density(phaseIdx);
114 const auto rhoOutside = outsideVolVars.density(phaseIdx);
116 for (
int compIdx = 0; compIdx < numComponents-1; compIdx++)
119 const auto xInside = insideVolVars.moleFraction(phaseIdx, compIdx);
121 const auto xOutside = outsideVolVars.moleFraction(phaseIdx, compIdx);
123 moleFracInside[compIdx] = xInside;
124 moleFracOutside[compIdx] = xOutside;
128 if(!(Dune::FloatCmp::eq<Scalar>(insideVolVars.saturation(phaseIdx), 0) || Dune::FloatCmp::eq<Scalar>(outsideVolVars.saturation(phaseIdx), 0)))
130 const auto insideScvIdx = scvf.insideScvIdx();
131 const auto& insideScv = fvGeometry.scv(insideScvIdx);
132 const Scalar omegai = calculateOmega_(scvf,
134 insideVolVars.extrusionFactor());
137 reducedDiffusionMatrixInside = setupMSMatrix_(problem, element, fvGeometry, insideVolVars, insideScv, phaseIdx);
140 if (scvf.boundary() || scvf.numOutsideScvs() > 1)
142 moleFracOutside -= moleFracInside;
143 reducedDiffusionMatrixInside.solve(reducedFlux, moleFracOutside);
144 reducedFlux *= omegai*rhoInside;
149 const auto outsideScvIdx = scvf.outsideScvIdx();
150 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
152 reducedDiffusionMatrixOutside = setupMSMatrix_(problem, element, fvGeometry, outsideVolVars, outsideScv, phaseIdx);
156 omegaj = -1.0*calculateOmega_(scvf,
158 outsideVolVars.extrusionFactor());
160 omegaj = calculateOmega_(fvGeometry.flipScvf(scvf.index()),
162 outsideVolVars.extrusionFactor());
164 reducedDiffusionMatrixInside.invert();
165 reducedDiffusionMatrixOutside.invert();
166 reducedDiffusionMatrixInside *= omegai*rhoInside;
167 reducedDiffusionMatrixOutside *= omegaj*rhoOutside;
170 ReducedComponentVector helperVector(0.0);
171 ReducedComponentVector gradientVectori(0.0);
172 ReducedComponentVector gradientVectorj(0.0);
174 reducedDiffusionMatrixInside.mv(moleFracInside, gradientVectori);
175 reducedDiffusionMatrixOutside.mv(moleFracOutside, gradientVectorj);
177 auto gradientVectorij = (gradientVectori + gradientVectorj);
180 reducedDiffusionMatrixOutside += reducedDiffusionMatrixInside;
182 reducedDiffusionMatrixOutside.solve(helperVector, gradientVectorij);
185 helperVector -=moleFracInside;
186 reducedDiffusionMatrixInside.mv(helperVector, reducedFlux);
189 reducedFlux *= -scvf.area();
190 for (
int compIdx = 0; compIdx < numComponents-1; compIdx++)
192 componentFlux[compIdx] = reducedFlux[compIdx];
193 componentFlux[numComponents-1] -=reducedFlux[compIdx];
196 return componentFlux ;