97 static CellCenterPrimaryVariables
flux(
const Problem& problem,
98 const Element& element,
99 const FVElementGeometry& fvGeometry,
100 const ElementVolumeVariables& elemVolVars,
101 const SubControlVolumeFace& scvf)
105 CellCenterPrimaryVariables componentFlux(0.0);
106 ReducedComponentVector moleFracInside(0.0);
107 ReducedComponentVector moleFracOutside(0.0);
108 ReducedComponentVector reducedFlux(0.0);
109 ReducedComponentMatrix reducedDiffusionMatrixInside(0.0);
110 ReducedComponentMatrix reducedDiffusionMatrixOutside(0.0);
113 const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()];
114 const auto& outsideVolVars = elemVolVars[scvf.outsideScvIdx()];
115 const auto rhoInside = insideVolVars.density();
116 const auto rhoOutside = outsideVolVars.density();
119 for(
int compIdx = 0; compIdx < numComponents; ++compIdx)
121 if(compIdx == FluidSystem::getMainComponent(0))
125 const auto eqIdx = Indices::conti0EqIdx + compIdx;
128 const auto bcTypes = problem.boundaryTypes(element, scvf);
129 if((bcTypes.isOutflow(eqIdx)) || (bcTypes.isSymmetry()))
130 return componentFlux;
135 for (
int compIdx = 0; compIdx < numComponents-1; compIdx++)
138 const auto xInside = insideVolVars.moleFraction(compIdx);
140 const auto xOutside = outsideVolVars.moleFraction(compIdx);
142 moleFracInside[compIdx] = xInside;
143 moleFracOutside[compIdx] = xOutside;
147 reducedDiffusionMatrixInside = setupMSMatrix_(problem, fvGeometry, insideVolVars, scvf);
149 reducedDiffusionMatrixOutside = setupMSMatrix_(problem, fvGeometry, outsideVolVars, scvf);
151 const auto insideScvIdx = scvf.insideScvIdx();
152 const auto& insideScv = fvGeometry.scv(insideScvIdx);
153 const auto outsideScvIdx = scvf.outsideScvIdx();
154 const auto& outsideScv = fvGeometry.scv(outsideScvIdx);
156 const Scalar insideDistance = (insideScv.dofPosition() - scvf.ipGlobal()).two_norm();
158 const Scalar omegai = calculateOmega_(insideDistance, insideVolVars.extrusionFactor());
163 moleFracOutside -= moleFracInside;
164 reducedDiffusionMatrixInside.solve(reducedFlux, moleFracOutside);
165 reducedFlux *= omegai*rhoInside;
169 const Scalar outsideDistance = (outsideScv.dofPosition() - scvf.ipGlobal()).two_norm();
170 const Scalar omegaj = calculateOmega_(outsideDistance, outsideVolVars.extrusionFactor());
172 reducedDiffusionMatrixInside.invert();
173 reducedDiffusionMatrixOutside.invert();
174 reducedDiffusionMatrixInside *= omegai*rhoInside;
175 reducedDiffusionMatrixOutside *= omegaj*rhoOutside;
178 ReducedComponentVector helperVector(0.0);
179 ReducedComponentVector gradientVectori(0.0);
180 ReducedComponentVector gradientVectorj(0.0);
182 reducedDiffusionMatrixInside.mv(moleFracInside, gradientVectori);
183 reducedDiffusionMatrixOutside.mv(moleFracOutside, gradientVectorj);
185 auto gradientVectorij = (gradientVectori + gradientVectorj);
188 reducedDiffusionMatrixOutside += reducedDiffusionMatrixInside;
190 reducedDiffusionMatrixOutside.solve(helperVector, gradientVectorij);
193 helperVector -=moleFracInside;
194 reducedDiffusionMatrixInside.mv(helperVector, reducedFlux);
197 reducedFlux *= -Extrusion::area(scvf);
199 for (
int compIdx = 0; compIdx < numComponents-1; compIdx++)
201 componentFlux[compIdx] = reducedFlux[compIdx];
202 componentFlux[numComponents-1] -= reducedFlux[compIdx];
205 return componentFlux ;