81 void update(
const ElementContext& elemCtx,
unsigned vertexIdx,
unsigned timeIdx)
85 const auto& problem = elemCtx.problem();
86 const auto& fractureMapper = problem.fractureMapper();
87 const unsigned globalVertexIdx = elemCtx.globalSpaceIndex(vertexIdx, timeIdx);
89 Valgrind::SetUndefined(fractureFluidState_);
90 Valgrind::SetUndefined(fractureVolume_);
91 Valgrind::SetUndefined(fracturePorosity_);
92 Valgrind::SetUndefined(fractureIntrinsicPermeability_);
93 Valgrind::SetUndefined(fractureRelativePermeabilities_);
96 if (!fractureMapper.isFractureVertex(globalVertexIdx)) {
103 const Scalar SwMatrix =
104 std::min<Scalar>(1.0, this->fluidState_.saturation(wettingPhaseIdx));
105 this->fluidState_.setSaturation(wettingPhaseIdx, SwMatrix);
106 this->fluidState_.setSaturation(nonWettingPhaseIdx, 1 - SwMatrix);
111 problem.fracturePorosity(elemCtx, vertexIdx, timeIdx);
112 fractureIntrinsicPermeability_ =
113 problem.fractureIntrinsicPermeability(elemCtx, vertexIdx, timeIdx);
119 const auto& vertexPos = elemCtx.pos(vertexIdx, timeIdx);
120 for (
unsigned vertex2Idx = 0; vertex2Idx < elemCtx.numDof(0); ++vertex2Idx) {
121 const unsigned globalVertex2Idx = elemCtx.globalSpaceIndex(vertex2Idx, timeIdx);
123 if (vertexIdx == vertex2Idx ||
124 !fractureMapper.isFractureEdge(globalVertexIdx, globalVertex2Idx))
129 const Scalar fractureWidth =
130 problem.fractureWidth(elemCtx, vertexIdx, vertex2Idx, timeIdx);
132 auto distVec = elemCtx.pos(vertex2Idx, timeIdx);
133 distVec -= vertexPos;
135 const Scalar edgeLength = distVec.two_norm();
143 fractureVolume_ += (fractureWidth / 2) * (edgeLength / 2);
153 fractureFluidState_.assign(this->fluidState_);
157 const auto& fractureMatParams =
158 problem.fractureMaterialLawParams(elemCtx, vertexIdx, timeIdx);
162 std::array<Scalar, numPhases> saturations;
163 MaterialLaw::saturations(saturations, fractureMatParams,
164 fractureFluidState_);
165 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
166 fractureFluidState_.setSaturation(phaseIdx, saturations[phaseIdx]);
171 const Scalar SwFracture =
172 std::max<Scalar>(0.0, fractureFluidState_.saturation(wettingPhaseIdx));
173 fractureFluidState_.setSaturation(wettingPhaseIdx, SwFracture);
174 fractureFluidState_.setSaturation(nonWettingPhaseIdx, 1 - SwFracture);
177 MaterialLaw::relativePermeabilities(fractureRelativePermeabilities_,
179 fractureFluidState_);
183 fractureFluidState_.checkDefined();