112 if (params_.saturationOutput_) {
115 if (params_.mobilityOutput_) {
118 if (params_.relativePermeabilityOutput_) {
122 if (params_.porosityOutput_) {
125 if (params_.intrinsicPermeabilityOutput_) {
128 if (params_.volumeFractionOutput_) {
132 if (params_.velocityOutput_) {
133 const std::size_t nDof = this->simulator_.model().numGridDof();
134 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
135 fractureVelocity_[phaseIdx].resize(nDof);
136 for (
unsigned dofIdx = 0; dofIdx < nDof; ++dofIdx) {
137 fractureVelocity_[phaseIdx][dofIdx].resize(dimWorld);
138 fractureVelocity_[phaseIdx][dofIdx] = 0.0;
155 const auto& fractureMapper = elemCtx.simulator().vanguard().fractureMapper();
157 for (
unsigned i = 0; i < elemCtx.numPrimaryDof(0); ++i) {
158 const unsigned I = elemCtx.globalSpaceIndex(i, 0);
159 if (!fractureMapper.isFractureVertex(I)) {
163 const auto& intQuants = elemCtx.intensiveQuantities(i, 0);
164 const auto& fs = intQuants.fractureFluidState();
166 if (params_.porosityOutput_) {
167 Valgrind::CheckDefined(intQuants.fracturePorosity());
168 fracturePorosity_[I] = intQuants.fracturePorosity();
170 if (params_.intrinsicPermeabilityOutput_) {
171 const auto& K = intQuants.fractureIntrinsicPermeability();
172 fractureIntrinsicPermeability_[I] = K[0][0];
175 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
176 if (params_.saturationOutput_) {
177 Valgrind::CheckDefined(fs.saturation(phaseIdx));
178 fractureSaturation_[phaseIdx][I] = fs.saturation(phaseIdx);
180 if (params_.mobilityOutput_) {
181 Valgrind::CheckDefined(intQuants.fractureMobility(phaseIdx));
182 fractureMobility_[phaseIdx][I] = intQuants.fractureMobility(phaseIdx);
184 if (params_.relativePermeabilityOutput_) {
185 Valgrind::CheckDefined(intQuants.fractureRelativePermeability(phaseIdx));
186 fractureRelativePermeability_[phaseIdx][I] =
187 intQuants.fractureRelativePermeability(phaseIdx);
189 if (params_.volumeFractionOutput_) {
190 Valgrind::CheckDefined(intQuants.fractureVolume());
191 fractureVolumeFraction_[I] += intQuants.fractureVolume();
196 if (params_.velocityOutput_) {
198 for (
unsigned scvfIdx = 0; scvfIdx < elemCtx.numInteriorFaces(0); ++scvfIdx) {
199 const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, 0);
201 const unsigned i = extQuants.interiorIndex();
202 const unsigned I = elemCtx.globalSpaceIndex(i, 0);
204 const unsigned j = extQuants.exteriorIndex();
205 const unsigned J = elemCtx.globalSpaceIndex(j, 0);
207 if (!fractureMapper.isFractureEdge(I, J)) {
211 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
212 Scalar weight = std::max(Scalar{1e-16},
213 std::abs(extQuants.fractureVolumeFlux(phaseIdx)));
214 Valgrind::CheckDefined(extQuants.extrusionFactor());
215 assert(extQuants.extrusionFactor() > 0);
216 weight *= extQuants.extrusionFactor();
218 Dune::FieldVector<Scalar, dim> v(extQuants.fractureFilterVelocity(phaseIdx));
221 for (
unsigned dimIdx = 0; dimIdx < dimWorld; ++dimIdx) {
222 fractureVelocity_[phaseIdx][I][dimIdx] += v[dimIdx];
223 fractureVelocity_[phaseIdx][J][dimIdx] += v[dimIdx];
226 fractureVelocityWeight_[phaseIdx][I] += weight;
227 fractureVelocityWeight_[phaseIdx][J] += weight;
238 if (!
dynamic_cast<VtkMultiWriter*
>(&baseWriter)) {
242 if (params_.saturationOutput_) {
244 fractureSaturation_, BufferType::Dof);
246 if (params_.mobilityOutput_) {
248 fractureMobility_, BufferType::Dof);
250 if (params_.relativePermeabilityOutput_) {
252 fractureRelativePermeability_, BufferType::Dof);
255 if (params_.porosityOutput_) {
257 fracturePorosity_, BufferType::Dof);
259 if (params_.intrinsicPermeabilityOutput_) {
261 fractureIntrinsicPermeability_, BufferType::Dof);
263 if (params_.volumeFractionOutput_) {
265 for (
unsigned I = 0; I < fractureVolumeFraction_.size(); ++I) {
266 fractureVolumeFraction_[I] /= this->simulator_.model().dofTotalVolume(I);
269 fractureVolumeFraction_, BufferType::Dof);
272 if (params_.velocityOutput_) {
273 const std::size_t nDof = this->simulator_.model().numGridDof();
274 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
277 for (
unsigned dofIdx = 0; dofIdx < nDof; ++dofIdx) {
278 fractureVelocity_[phaseIdx][dofIdx] /=
279 std::max<Scalar>(1e-20, fractureVelocityWeight_[phaseIdx][dofIdx]);
283 snprintf(name, 512,
"fractureFilterVelocity_%s", FluidSystem::phaseName(phaseIdx).data());
285 DiscBaseOutputModule::attachVectorDofData_(baseWriter, fractureVelocity_[phaseIdx], name);