cuvetteproblem.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18
19 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
28#ifndef EWOMS_CUVETTE_PROBLEM_HH
29#define EWOMS_CUVETTE_PROBLEM_HH
30
32
33#include <opm/material/fluidstates/CompositionalFluidState.hpp>
34#include <opm/material/fluidstates/ImmiscibleFluidState.hpp>
35#include <opm/material/fluidsystems/H2OAirMesityleneFluidSystem.hpp>
36#include <opm/material/fluidmatrixinteractions/ThreePhaseParkerVanGenuchten.hpp>
37#include <opm/material/fluidmatrixinteractions/LinearMaterial.hpp>
38#include <opm/material/thermal/ConstantSolidHeatCapLaw.hpp>
39#include <opm/material/thermal/SomertonThermalConductionLaw.hpp>
40#include <opm/material/constraintsolvers/MiscibleMultiPhaseComposition.hpp>
41#include <opm/material/fluidmatrixinteractions/MaterialTraits.hpp>
42#include <opm/material/common/Valgrind.hpp>
43
44#include <dune/grid/yaspgrid.hh>
45#include <dune/grid/io/file/dgfparser/dgfyasp.hh>
46
47#include <dune/common/version.hh>
48#include <dune/common/fvector.hh>
49#include <dune/common/fmatrix.hh>
50
51#include <string>
52
53namespace Opm {
54template <class TypeTag>
55class CuvetteProblem;
56}
57
58namespace Opm::Properties {
59
60
61// create a new type tag for the cuvette steam injection problem
62namespace TTag {
64}
65
66// Set the grid type
67template<class TypeTag>
68struct Grid<TypeTag, TTag::CuvetteBaseProblem> { using type = Dune::YaspGrid<2>; };
69
70// Set the problem property
71template<class TypeTag>
72struct Problem<TypeTag, TTag::CuvetteBaseProblem> { using type = Opm::CuvetteProblem<TypeTag>; };
73
74// Set the fluid system
75template<class TypeTag>
76struct FluidSystem<TypeTag, TTag::CuvetteBaseProblem>
77{ using type = Opm::H2OAirMesityleneFluidSystem<GetPropType<TypeTag, Properties::Scalar>>; };
78
79// Set the material Law
80template<class TypeTag>
81struct MaterialLaw<TypeTag, TTag::CuvetteBaseProblem>
82{
83private:
86
87 using Traits = Opm::ThreePhaseMaterialTraits<
88 Scalar,
89 /*wettingPhaseIdx=*/FluidSystem::waterPhaseIdx,
90 /*nonWettingPhaseIdx=*/FluidSystem::naplPhaseIdx,
91 /*gasPhaseIdx=*/FluidSystem::gasPhaseIdx>;
92
93public:
94 using type = Opm::ThreePhaseParkerVanGenuchten<Traits>;
95};
96
97// set the energy storage law for the solid phase
98template<class TypeTag>
99struct SolidEnergyLaw<TypeTag, TTag::CuvetteBaseProblem>
100{ using type = Opm::ConstantSolidHeatCapLaw<GetPropType<TypeTag, Properties::Scalar>>; };
101
102// Set the thermal conduction law
103template<class TypeTag>
104struct ThermalConductionLaw<TypeTag, TTag::CuvetteBaseProblem>
105{
106private:
109
110public:
111 // define the material law parameterized by absolute saturations
112 using type = Opm::SomertonThermalConductionLaw<FluidSystem, Scalar>;
113};
114
115} // namespace Opm::Properties
116
117namespace Opm {
145template <class TypeTag>
146class CuvetteProblem : public GetPropType<TypeTag, Properties::BaseProblem>
147{
149
154 using ThermalConductionLawParams = GetPropType<TypeTag, Properties::ThermalConductionLawParams>;
163
164 // copy some indices for convenience
166 enum { numPhases = FluidSystem::numPhases };
167 enum { numComponents = FluidSystem::numComponents };
168 enum { waterPhaseIdx = FluidSystem::waterPhaseIdx };
169 enum { naplPhaseIdx = FluidSystem::naplPhaseIdx };
170 enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
171 enum { H2OIdx = FluidSystem::H2OIdx };
172 enum { airIdx = FluidSystem::airIdx };
173 enum { NAPLIdx = FluidSystem::NAPLIdx };
174 enum { conti0EqIdx = Indices::conti0EqIdx };
175
176 // Grid and world dimension
177 enum { dimWorld = GridView::dimensionworld };
178
179 using CoordScalar = typename GridView::ctype;
180 using GlobalPosition = Dune::FieldVector<CoordScalar, dimWorld>;
181 using DimMatrix = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>;
182
183public:
187 CuvetteProblem(Simulator& simulator)
188 : ParentType(simulator)
189 , eps_(1e-6)
190 { }
191
196 {
197 ParentType::finishInit();
198
199 if (Opm::Valgrind::IsRunning())
200 FluidSystem::init(/*minT=*/283.15, /*maxT=*/500.0, /*nT=*/20,
201 /*minp=*/0.8e5, /*maxp=*/2e5, /*np=*/10);
202 else
203 FluidSystem::init(/*minT=*/283.15, /*maxT=*/500.0, /*nT=*/200,
204 /*minp=*/0.8e5, /*maxp=*/2e5, /*np=*/100);
205
206 // intrinsic permeabilities
207 fineK_ = this->toDimMatrix_(6.28e-12);
208 coarseK_ = this->toDimMatrix_(9.14e-10);
209
210 // porosities
211 finePorosity_ = 0.42;
212 coarsePorosity_ = 0.42;
213
214 // parameters for the capillary pressure law
215#if 1
216 // three-phase Parker -- van Genuchten law
217 fineMaterialParams_.setVgAlpha(0.0005);
218 coarseMaterialParams_.setVgAlpha(0.005);
219 fineMaterialParams_.setVgN(4.0);
220 coarseMaterialParams_.setVgN(4.0);
221
222 coarseMaterialParams_.setkrRegardsSnr(true);
223 fineMaterialParams_.setkrRegardsSnr(true);
224
225 // residual saturations
226 fineMaterialParams_.setSwr(0.1201);
227 fineMaterialParams_.setSwrx(0.1201);
228 fineMaterialParams_.setSnr(0.0701);
229 fineMaterialParams_.setSgr(0.0101);
230 coarseMaterialParams_.setSwr(0.1201);
231 coarseMaterialParams_.setSwrx(0.1201);
232 coarseMaterialParams_.setSnr(0.0701);
233 coarseMaterialParams_.setSgr(0.0101);
234#else
235 // linear material law
236 fineMaterialParams_.setPcMinSat(gasPhaseIdx, 0);
237 fineMaterialParams_.setPcMaxSat(gasPhaseIdx, 0);
238 fineMaterialParams_.setPcMinSat(naplPhaseIdx, 0);
239 fineMaterialParams_.setPcMaxSat(naplPhaseIdx, -1000);
240 fineMaterialParams_.setPcMinSat(waterPhaseIdx, 0);
241 fineMaterialParams_.setPcMaxSat(waterPhaseIdx, -10000);
242
243 coarseMaterialParams_.setPcMinSat(gasPhaseIdx, 0);
244 coarseMaterialParams_.setPcMaxSat(gasPhaseIdx, 0);
245 coarseMaterialParams_.setPcMinSat(naplPhaseIdx, 0);
246 coarseMaterialParams_.setPcMaxSat(naplPhaseIdx, -100);
247 coarseMaterialParams_.setPcMinSat(waterPhaseIdx, 0);
248 coarseMaterialParams_.setPcMaxSat(waterPhaseIdx, -1000);
249
250 // residual saturations
251 fineMaterialParams_.setResidSat(waterPhaseIdx, 0.1201);
252 fineMaterialParams_.setResidSat(naplPhaseIdx, 0.0701);
253 fineMaterialParams_.setResidSat(gasPhaseIdx, 0.0101);
254
255 coarseMaterialParams_.setResidSat(waterPhaseIdx, 0.1201);
256 coarseMaterialParams_.setResidSat(naplPhaseIdx, 0.0701);
257 coarseMaterialParams_.setResidSat(gasPhaseIdx, 0.0101);
258#endif
259
260 fineMaterialParams_.finalize();
261 coarseMaterialParams_.finalize();
262
263 // initialize parameters for the thermal conduction law
264 computeThermalCondParams_(thermalCondParams_, finePorosity_);
265
266 // assume constant volumetric heat capacity and granite
267 solidEnergyLawParams_.setSolidHeatCapacity(790.0 // specific heat capacity of granite [J / (kg K)]
268 * 2700.0); // density of granite [kg/m^3]
269 solidEnergyLawParams_.finalize();
270
271 initInjectFluidState_();
272 }
273
277 static void registerParameters()
278 {
279 ParentType::registerParameters();
280
281 Parameters::SetDefault<Parameters::GridFile>("./data/cuvette_11x4.dgf");
282 Parameters::SetDefault<Parameters::EndTime<Scalar>>(100.0);
283 Parameters::SetDefault<Parameters::InitialTimeStepSize<Scalar>>(1.0);
284 Parameters::SetDefault<Parameters::MaxTimeStepSize<Scalar>>(600.0);
285 Parameters::SetDefault<Parameters::EnableGravity>(true);
286 }
287
292
299 { return true; }
300
304 std::string name() const
305 { return std::string("cuvette_") + Model::name(); }
306
311 {
312#ifndef NDEBUG
313 this->model().checkConservativeness();
314
315 // Calculate storage terms
316 EqVector storage;
317 this->model().globalStorage(storage);
318
319 // Write mass balance information for rank 0
320 if (this->gridView().comm().rank() == 0) {
321 std::cout << "Storage: " << storage << std::endl << std::flush;
322 }
323#endif // NDEBUG
324 }
325
327
332
336 template <class Context>
337 Scalar temperature(const Context& /*context*/,
338 unsigned /*spaceIdx*/,
339 unsigned /*timeIdx*/) const
340 { return 293.15; /* [K] */ }
341
345 template <class Context>
346 const DimMatrix& intrinsicPermeability(const Context& context, unsigned spaceIdx,
347 unsigned timeIdx) const
348 {
349 const GlobalPosition& pos = context.pos(spaceIdx, timeIdx);
350 if (isFineMaterial_(pos))
351 return fineK_;
352 return coarseK_;
353 }
354
358 template <class Context>
359 Scalar porosity(const Context& context, unsigned spaceIdx, unsigned timeIdx) const
360 {
361 const GlobalPosition& pos = context.pos(spaceIdx, timeIdx);
362 if (isFineMaterial_(pos))
363 return finePorosity_;
364 else
365 return coarsePorosity_;
366 }
367
371 template <class Context>
372 const MaterialLawParams& materialLawParams(const Context& context,
373 unsigned spaceIdx, unsigned timeIdx) const
374 {
375 const GlobalPosition& pos = context.pos(spaceIdx, timeIdx);
376 if (isFineMaterial_(pos))
377 return fineMaterialParams_;
378 else
379 return coarseMaterialParams_;
380 }
381
385 template <class Context>
386 const ThermalConductionLawParams &
387 thermalConductionParams(const Context& /*context*/,
388 unsigned /*spaceIdx*/,
389 unsigned /*timeIdx*/) const
390 { return thermalCondParams_; }
391
393
398
402 template <class Context>
403 void boundary(BoundaryRateVector& values, const Context& context,
404 unsigned spaceIdx, unsigned timeIdx) const
405 {
406 const auto& pos = context.pos(spaceIdx, timeIdx);
407
408 if (onRightBoundary_(pos)) {
409 Opm::CompositionalFluidState<Scalar, FluidSystem> fs;
410
411 initialFluidState_(fs, context, spaceIdx, timeIdx);
412
413 values.setFreeFlow(context, spaceIdx, timeIdx, fs);
414 values.setNoFlow();
415 }
416 else if (onLeftBoundary_(pos)) {
417 // injection
418 RateVector molarRate;
419
420 // inject with the same composition as the gas phase of
421 // the injection fluid state
422 Scalar molarInjectionRate = 0.3435; // [mol/(m^2 s)]
423 for (unsigned compIdx = 0; compIdx < numComponents; ++compIdx)
424 molarRate[conti0EqIdx + compIdx] =
425 -molarInjectionRate
426 * injectFluidState_.moleFraction(gasPhaseIdx, compIdx);
427
428 // calculate the total mass injection rate [kg / (m^2 s)
429 Scalar massInjectionRate =
430 molarInjectionRate
431 * injectFluidState_.averageMolarMass(gasPhaseIdx);
432
433 // set the boundary rate vector [J / (m^2 s)]
434 values.setMolarRate(molarRate);
435 values.setEnthalpyRate(-injectFluidState_.enthalpy(gasPhaseIdx) * massInjectionRate);
436 }
437 else
438 values.setNoFlow();
439 }
440
442
447
451 template <class Context>
452 void initial(PrimaryVariables& values, const Context& context, unsigned spaceIdx,
453 unsigned timeIdx) const
454 {
455 Opm::CompositionalFluidState<Scalar, FluidSystem> fs;
456
457 initialFluidState_(fs, context, spaceIdx, timeIdx);
458
459 const auto& matParams = materialLawParams(context, spaceIdx, timeIdx);
460 values.assignMassConservative(fs, matParams, /*inEquilibrium=*/false);
461 }
462
469 template <class Context>
470 void source(RateVector& rate,
471 const Context& /*context*/,
472 unsigned /*spaceIdx*/,
473 unsigned /*timeIdx*/) const
474 { rate = Scalar(0.0); }
475
477
478private:
479 bool onLeftBoundary_(const GlobalPosition& pos) const
480 { return pos[0] < eps_; }
481
482 bool onRightBoundary_(const GlobalPosition& pos) const
483 { return pos[0] > this->boundingBoxMax()[0] - eps_; }
484
485 bool onLowerBoundary_(const GlobalPosition& pos) const
486 { return pos[1] < eps_; }
487
488 bool onUpperBoundary_(const GlobalPosition& pos) const
489 { return pos[1] > this->boundingBoxMax()[1] - eps_; }
490
491 bool isContaminated_(const GlobalPosition& pos) const
492 {
493 return (0.20 <= pos[0]) && (pos[0] <= 0.80) && (0.4 <= pos[1])
494 && (pos[1] <= 0.65);
495 }
496
497 bool isFineMaterial_(const GlobalPosition& pos) const
498 {
499 if (0.13 <= pos[0] && 1.20 >= pos[0] && 0.32 <= pos[1] && pos[1] <= 0.57)
500 return true;
501 else if (pos[1] <= 0.15 && 1.20 <= pos[0])
502 return true;
503 else
504 return false;
505 }
506
507 template <class FluidState, class Context>
508 void initialFluidState_(FluidState& fs, const Context& context,
509 unsigned spaceIdx, unsigned timeIdx) const
510 {
511 const GlobalPosition& pos = context.pos(spaceIdx, timeIdx);
512
513 fs.setTemperature(293.0 /*[K]*/);
514
515 Scalar pw = 1e5;
516
517 if (isContaminated_(pos)) {
518 fs.setSaturation(waterPhaseIdx, 0.12);
519 fs.setSaturation(naplPhaseIdx, 0.07);
520 fs.setSaturation(gasPhaseIdx, 1 - 0.12 - 0.07);
521
522 // set the capillary pressures
523 const auto& matParams = materialLawParams(context, spaceIdx, timeIdx);
524 Scalar pc[numPhases];
525 MaterialLaw::capillaryPressures(pc, matParams, fs);
526 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
527 fs.setPressure(phaseIdx, pw + (pc[phaseIdx] - pc[waterPhaseIdx]));
528
529 // compute the phase compositions
530 using MMPC = Opm::MiscibleMultiPhaseComposition<Scalar, FluidSystem>;
531 typename FluidSystem::template ParameterCache<Scalar> paramCache;
532 MMPC::solve(fs, paramCache, /*setViscosity=*/true, /*setEnthalpy=*/true);
533 }
534 else {
535 fs.setSaturation(waterPhaseIdx, 0.12);
536 fs.setSaturation(gasPhaseIdx, 1 - fs.saturation(waterPhaseIdx));
537 fs.setSaturation(naplPhaseIdx, 0);
538
539 // set the capillary pressures
540 const auto& matParams = materialLawParams(context, spaceIdx, timeIdx);
541 Scalar pc[numPhases];
542 MaterialLaw::capillaryPressures(pc, matParams, fs);
543 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
544 fs.setPressure(phaseIdx, pw + (pc[phaseIdx] - pc[waterPhaseIdx]));
545
546 // compute the phase compositions
547 using MMPC = Opm::MiscibleMultiPhaseComposition<Scalar, FluidSystem>;
548 typename FluidSystem::template ParameterCache<Scalar> paramCache;
549 MMPC::solve(fs, paramCache, /*setViscosity=*/true, /*setEnthalpy=*/true);
550
551 // set the contaminant mole fractions to zero. this is a little bit hacky...
552 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
553 fs.setMoleFraction(phaseIdx, NAPLIdx, 0.0);
554
555 if (phaseIdx == naplPhaseIdx)
556 continue;
557
558 Scalar sumx = 0;
559 for (unsigned compIdx = 0; compIdx < numComponents; ++compIdx)
560 sumx += fs.moleFraction(phaseIdx, compIdx);
561
562 for (unsigned compIdx = 0; compIdx < numComponents; ++compIdx)
563 fs.setMoleFraction(phaseIdx, compIdx,
564 fs.moleFraction(phaseIdx, compIdx) / sumx);
565 }
566 }
567 }
568
569 void computeThermalCondParams_(ThermalConductionLawParams& params, Scalar poro)
570 {
571 Scalar lambdaGranite = 2.8; // [W / (K m)]
572
573 // create a Fluid state which has all phases present
574 Opm::ImmiscibleFluidState<Scalar, FluidSystem> fs;
575 fs.setTemperature(293.15);
576 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
577 fs.setPressure(phaseIdx, 1.0135e5);
578 }
579
580 typename FluidSystem::template ParameterCache<Scalar> paramCache;
581 paramCache.updateAll(fs);
582 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
583 Scalar rho = FluidSystem::density(fs, paramCache, phaseIdx);
584 fs.setDensity(phaseIdx, rho);
585 }
586
587 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
588 Scalar lambdaSaturated;
589 if (FluidSystem::isLiquid(phaseIdx)) {
590 Scalar lambdaFluid = FluidSystem::thermalConductivity(fs, paramCache, phaseIdx);
591 lambdaSaturated =
592 std::pow(lambdaGranite, (1 - poro))
593 +
594 std::pow(lambdaFluid, poro);
595 }
596 else
597 lambdaSaturated = std::pow(lambdaGranite, (1 - poro));
598
599 params.setFullySaturatedLambda(phaseIdx, lambdaSaturated);
600 if (!FluidSystem::isLiquid(phaseIdx))
601 params.setVacuumLambda(lambdaSaturated);
602 }
603 }
604
605 void initInjectFluidState_()
606 {
607 injectFluidState_.setTemperature(383.0); // [K]
608 injectFluidState_.setPressure(gasPhaseIdx, 1e5); // [Pa]
609 injectFluidState_.setSaturation(gasPhaseIdx, 1.0); // [-]
610
611 Scalar xgH2O = 0.417;
612 injectFluidState_.setMoleFraction(gasPhaseIdx, H2OIdx, xgH2O); // [-]
613 injectFluidState_.setMoleFraction(gasPhaseIdx, airIdx, 1 - xgH2O); // [-]
614 injectFluidState_.setMoleFraction(gasPhaseIdx, NAPLIdx, 0.0); // [-]
615
616 // set the specific enthalpy of the gas phase
617 typename FluidSystem::template ParameterCache<Scalar> paramCache;
618 paramCache.updatePhase(injectFluidState_, gasPhaseIdx);
619
620 Scalar h = FluidSystem::enthalpy(injectFluidState_, paramCache, gasPhaseIdx);
621 injectFluidState_.setEnthalpy(gasPhaseIdx, h);
622 }
623
624 DimMatrix fineK_;
625 DimMatrix coarseK_;
626
627 Scalar finePorosity_;
628 Scalar coarsePorosity_;
629
630 MaterialLawParams fineMaterialParams_;
631 MaterialLawParams coarseMaterialParams_;
632
633 ThermalConductionLawParams thermalCondParams_;
634 SolidEnergyLawParams solidEnergyLawParams_;
635
636 Opm::CompositionalFluidState<Scalar, FluidSystem> injectFluidState_;
637
638 const Scalar eps_;
639};
640} // namespace Opm
641
642#endif
Non-isothermal three-phase gas injection problem where a hot gas is injected into a unsaturated porou...
Definition: cuvetteproblem.hh:147
Scalar temperature(const Context &, unsigned, unsigned) const
Definition: cuvetteproblem.hh:337
void boundary(BoundaryRateVector &values, const Context &context, unsigned spaceIdx, unsigned timeIdx) const
Evaluate the boundary conditions for a boundary segment.
Definition: cuvetteproblem.hh:403
static void registerParameters()
Definition: cuvetteproblem.hh:277
CuvetteProblem(Simulator &simulator)
Definition: cuvetteproblem.hh:187
const MaterialLawParams & materialLawParams(const Context &context, unsigned spaceIdx, unsigned timeIdx) const
Definition: cuvetteproblem.hh:372
void initial(PrimaryVariables &values, const Context &context, unsigned spaceIdx, unsigned timeIdx) const
Evaluate the initial value for a control volume.
Definition: cuvetteproblem.hh:452
const DimMatrix & intrinsicPermeability(const Context &context, unsigned spaceIdx, unsigned timeIdx) const
Definition: cuvetteproblem.hh:346
const ThermalConductionLawParams & thermalConductionParams(const Context &, unsigned, unsigned) const
Definition: cuvetteproblem.hh:387
Scalar porosity(const Context &context, unsigned spaceIdx, unsigned timeIdx) const
Definition: cuvetteproblem.hh:359
void finishInit()
Called by the Opm::Simulator in order to initialize the problem.
Definition: cuvetteproblem.hh:195
std::string name() const
The problem name.
Definition: cuvetteproblem.hh:304
void endTimeStep()
Called by the simulator after each time integration.
Definition: cuvetteproblem.hh:310
bool shouldWriteRestartFile() const
Returns true if a restart file should be written to disk.
Definition: cuvetteproblem.hh:298
void source(RateVector &rate, const Context &, unsigned, unsigned) const
Evaluate the source term for all phases within a given sub-control-volume.
Definition: cuvetteproblem.hh:470
Definition: blackoilmodel.hh:72
Definition: blackoilboundaryratevector.hh:37
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:235
Declares the properties required for the compositional multi-phase primary variable switching model.
Opm::H2OAirMesityleneFluidSystem< GetPropType< TypeTag, Properties::Scalar > > type
Definition: cuvetteproblem.hh:77
The fluid systems including the information about the phases.
Definition: multiphasebaseproperties.hh:69
Dune::YaspGrid< 2 > type
Definition: cuvetteproblem.hh:68
The type of the DUNE grid.
Definition: basicproperties.hh:100
Opm::ThreePhaseParkerVanGenuchten< Traits > type
Definition: cuvetteproblem.hh:94
The material law which ought to be used (extracted from the spatial parameters)
Definition: multiphasebaseproperties.hh:51
The type of the problem.
Definition: fvbaseproperties.hh:81
Opm::ConstantSolidHeatCapLaw< GetPropType< TypeTag, Properties::Scalar > > type
Definition: cuvetteproblem.hh:100
The material law for the energy stored in the solid matrix.
Definition: multiphasebaseproperties.hh:57
Definition: cuvetteproblem.hh:63
Opm::SomertonThermalConductionLaw< FluidSystem, Scalar > type
Definition: cuvetteproblem.hh:112
The material law for thermal conduction.
Definition: multiphasebaseproperties.hh:63