Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
dumux-repositories
dumux-course
Commits
3f0ede68
Commit
3f0ede68
authored
Nov 28, 2018
by
Theresa Schollenberger
Browse files
[exercise-properties] update
parent
693a7970
Changes
4
Hide whitespace changes
Inline
Side-by-side
exercises/exercise-properties/README.md
View file @
3f0ede68
...
...
@@ -69,7 +69,8 @@ Types that are properties can be changed on the problem level by using the prope
```
c++
// note that every property struct knows about TypeTag
SET_PROP
(
TwoPIncompressible
,
LocalResidual
)
template
<
class
TypeTag
>
struct
LocalResidual
<
TypeTag
,
TTag
::
TwoPIncompressible
>
{
using
type
=
MyLocalResidual
<
TypeTag
>
;
};
...
...
exercises/exercise-properties/exercise_properties.cc
View file @
3f0ede68
...
...
@@ -46,10 +46,11 @@
#include
<dumux/assembly/fvassembler.hh>
#include
<dumux/assembly/diffmethod.hh>
#include
<dumux/discretization/method
s
.hh>
#include
<dumux/discretization/method.hh>
#include
<dumux/io/vtkoutputmodule.hh>
#include
<dumux/io/grid/gridmanager.hh>
#include
<dumux/io/loadsolution.hh>
/*!
* \brief Provides an interface for customizing error messages associated with
...
...
@@ -88,7 +89,7 @@ int main(int argc, char** argv) try
using
namespace
Dumux
;
// define the type tag for this problem
using
TypeTag
=
TTAG
(
TwoPIncompressibleTpfa
)
;
using
TypeTag
=
Properties
::
TTag
::
TwoPIncompressibleTpfa
;
// initialize MPI, finalize is done automatically on exit
const
auto
&
mpiHelper
=
Dune
::
MPIHelper
::
instance
(
argc
,
argv
);
...
...
@@ -101,7 +102,7 @@ int main(int argc, char** argv) try
Parameters
::
init
(
argc
,
argv
,
usage
);
// try to create a grid (from the given grid file or the input file)
GridManager
<
typename
GET_PROP_TYPE
(
TypeTag
,
Grid
)
>
gridManager
;
GridManager
<
GetPropType
<
TypeTag
,
Properties
::
Grid
>
>
gridManager
;
gridManager
.
init
();
////////////////////////////////////////////////////////////
...
...
@@ -112,41 +113,57 @@ int main(int argc, char** argv) try
const
auto
&
leafGridView
=
gridManager
.
grid
().
leafGridView
();
// create the finite volume grid geometry
using
FVGridGeometry
=
typename
GET_PROP_TYPE
(
TypeTag
,
FVGridGeometry
)
;
using
FVGridGeometry
=
GetPropType
<
TypeTag
,
Properties
::
FVGridGeometry
>
;
auto
fvGridGeometry
=
std
::
make_shared
<
FVGridGeometry
>
(
leafGridView
);
fvGridGeometry
->
update
();
// the problem (initial and boundary conditions)
using
Problem
=
typename
GET_PROP_TYPE
(
TypeTag
,
Problem
)
;
using
Problem
=
GetPropType
<
TypeTag
,
Properties
::
Problem
>
;
auto
problem
=
std
::
make_shared
<
Problem
>
(
fvGridGeometry
);
// check if we are about to restart a previously interrupted simulation
using
Scalar
=
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
;
Scalar
restartTime
=
getParam
<
Scalar
>
(
"Restart.Time"
,
0
);
// the solution vector
using
SolutionVector
=
typename
GET_PROP_TYPE
(
TypeTag
,
SolutionVector
);
using
Scalar
=
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
;
using
SolutionVector
=
GetPropType
<
TypeTag
,
Properties
::
SolutionVector
>
;
SolutionVector
x
(
fvGridGeometry
->
numDofs
());
problem
->
applyInitialSolution
(
x
);
if
(
restartTime
>
0
)
{
using
IOFields
=
GetPropType
<
TypeTag
,
Properties
::
IOFields
>
;
using
PrimaryVariables
=
GetPropType
<
TypeTag
,
Properties
::
PrimaryVariables
>
;
using
ModelTraits
=
GetPropType
<
TypeTag
,
Properties
::
ModelTraits
>
;
using
FluidSystem
=
GetPropType
<
TypeTag
,
Properties
::
FluidSystem
>
;
const
auto
fileName
=
getParam
<
std
::
string
>
(
"Restart.File"
);
const
auto
pvName
=
createPVNameFunction
<
IOFields
,
PrimaryVariables
,
ModelTraits
,
FluidSystem
>
();
loadSolution
(
x
,
fileName
,
pvName
,
*
fvGridGeometry
);
}
else
problem
->
applyInitialSolution
(
x
);
auto
xOld
=
x
;
// the grid variables
using
GridVariables
=
typename
GET_PROP_TYPE
(
TypeTag
,
GridVariables
)
;
using
GridVariables
=
GetPropType
<
TypeTag
,
Properties
::
GridVariables
>
;
auto
gridVariables
=
std
::
make_shared
<
GridVariables
>
(
problem
,
fvGridGeometry
);
gridVariables
->
init
(
x
,
xOld
);
gridVariables
->
init
(
x
);
// get some time loop parameters
using
Scalar
=
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
)
;
using
Scalar
=
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
;
const
auto
tEnd
=
getParam
<
Scalar
>
(
"TimeLoop.TEnd"
);
const
auto
maxDt
=
getParam
<
Scalar
>
(
"TimeLoop.MaxTimeStepSize"
);
auto
dt
=
getParam
<
Scalar
>
(
"TimeLoop.DtInitial"
);
// intialize the vtk output module
using
VtkOutputFields
=
typename
GET_PROP_TYPE
(
TypeTag
,
VtkOutputFields
)
;
using
VtkOutputFields
=
GetPropType
<
TypeTag
,
Properties
::
VtkOutputFields
>
;
//
use non-conforming output for the test with interface solver
const
auto
ncOutput
=
g
etP
aram
<
bool
>
(
"Problem.UseNonConformingOutput"
,
false
)
;
VtkOutputModule
<
TypeTag
>
vtkWriter
(
*
pro
ble
m
,
*
fvGridGeometry
,
*
gridVariables
,
x
,
problem
->
name
()
,
""
,
(
ncOutput
?
Dune
::
VTK
::
nonconforming
:
Dune
::
VTK
::
conforming
))
;
VtkOutputFields
::
init
(
vtkWriter
);
//!< Add model specific output fields
vtkWriter
.
write
(
0.0
);
//
intialize the vtk output module
using
VtkOutputFields
=
G
etP
ropType
<
TypeTag
,
Properties
::
VtkOutputFields
>
;
VtkOutputModule
<
GridVaria
ble
s
,
SolutionVector
>
vtkWriter
(
*
gridVariables
,
x
,
problem
->
name
()
);
using
VelocityOutput
=
GetPropType
<
TypeTag
,
Properties
::
VelocityOutput
>
;
vtkWriter
.
addVelocityOutput
(
std
::
make_shared
<
VelocityOutput
>
(
*
gridVariables
));
VtkOutputFields
::
init
OutputModule
(
vtkWriter
);
//!< Add model specific output fields
vtkWriter
.
write
(
restartTime
);
// instantiate time loop
auto
timeLoop
=
std
::
make_shared
<
TimeLoop
<
Scalar
>>
(
0.0
,
dt
,
tEnd
);
...
...
exercises/exercise-properties/problem.hh
View file @
3f0ede68
...
...
@@ -47,32 +47,39 @@ namespace Dumux {
template
<
class
TypeTag
>
class
TwoPTestProblem
;
namespace
Properties
{
NEW_TYPE_TAG
(
TwoPIncompressible
,
INHERITS_FROM
(
TwoP
));
NEW_TYPE_TAG
(
TwoPIncompressibleTpfa
,
INHERITS_FROM
(
CCTpfaModel
,
TwoPIncompressible
));
// Create new type tags
namespace
TTag
{
struct
TwoPIncompressible
{
using
InheritsFrom
=
std
::
tuple
<
TwoP
>
;
};
struct
TwoPIncompressibleTpfa
{
using
InheritsFrom
=
std
::
tuple
<
TwoPIncompressible
,
CCTpfaModel
>
;
};
}
// end namespace TTag
// Set the grid type
SET_TYPE_PROP
(
TwoPIncompressible
,
Grid
,
Dune
::
YaspGrid
<
2
>
);
template
<
class
TypeTag
>
struct
Grid
<
TypeTag
,
TTag
::
TwoPIncompressible
>
{
using
type
=
Dune
::
YaspGrid
<
2
>
;
};
// Set the problem type
SET_TYPE_PROP
(
TwoPIncompressible
,
Problem
,
TwoPTestProblem
<
TypeTag
>
);
template
<
class
TypeTag
>
struct
Problem
<
TypeTag
,
TTag
::
TwoPIncompressible
>
{
using
type
=
TwoPTestProblem
<
TypeTag
>
;
};
// TODO: use MyLocalResidual as LocalResidual
// Set the fluid system
SET_PROP
(
TwoPIncompressible
,
FluidSystem
)
template
<
class
TypeTag
>
struct
FluidSystem
<
TypeTag
,
TTag
::
TwoPIncompressible
>
{
using
Scalar
=
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
)
;
using
Scalar
=
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
;
using
WettingPhase
=
FluidSystems
::
OnePLiquid
<
Scalar
,
Components
::
SimpleH2O
<
Scalar
>
>
;
using
NonwettingPhase
=
FluidSystems
::
OnePLiquid
<
Scalar
,
Components
::
Trichloroethene
<
Scalar
>
>
;
using
type
=
FluidSystems
::
TwoPImmiscible
<
Scalar
,
WettingPhase
,
NonwettingPhase
>
;
};
// Set the spatial parameters
SET_PROP
(
TwoPIncompressible
,
SpatialParams
)
template
<
class
TypeTag
>
struct
SpatialParams
<
TypeTag
,
TTag
::
TwoPIncompressible
>
{
private:
using
FVGridGeometry
=
typename
GET_PROP_TYPE
(
TypeTag
,
FVGridGeometry
)
;
using
Scalar
=
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
)
;
using
FVGridGeometry
=
GetPropType
<
TypeTag
,
Properties
::
FVGridGeometry
>
;
using
Scalar
=
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
;
public:
using
type
=
TwoPTestSpatialParams
<
FVGridGeometry
,
Scalar
>
;
};
...
...
@@ -86,16 +93,16 @@ template<class TypeTag>
class
TwoPTestProblem
:
public
PorousMediumFlowProblem
<
TypeTag
>
{
using
ParentType
=
PorousMediumFlowProblem
<
TypeTag
>
;
using
GridView
=
typename
GET_PROP_TYPE
(
TypeTag
,
GridView
)
;
using
GridView
=
GetPropType
<
TypeTag
,
Properties
::
GridView
>
;
using
Element
=
typename
GridView
::
template
Codim
<
0
>
::
Entity
;
using
Scalar
=
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
)
;
using
FluidSystem
=
typename
GET_PROP_TYPE
(
TypeTag
,
FluidSystem
)
;
using
PrimaryVariables
=
typename
GET_PROP_TYPE
(
TypeTag
,
PrimaryVariables
)
;
using
FVGridGeometry
=
typename
GET_PROP_TYPE
(
TypeTag
,
FVGridGeometry
)
;
using
BoundaryTypes
=
typename
GET_PROP_TYPE
(
TypeTag
,
BoundaryTypes
)
;
using
Scalar
=
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
;
using
FluidSystem
=
GetPropType
<
TypeTag
,
Properties
::
FluidSystem
>
;
using
PrimaryVariables
=
GetPropType
<
TypeTag
,
Properties
::
PrimaryVariables
>
;
using
FVGridGeometry
=
GetPropType
<
TypeTag
,
Properties
::
FVGridGeometry
>
;
using
BoundaryTypes
=
GetPropType
<
TypeTag
,
Properties
::
BoundaryTypes
>
;
using
GlobalPosition
=
typename
Element
::
Geometry
::
GlobalCoordinate
;
using
NumEqVector
=
typename
GET_PROP_TYPE
(
TypeTag
,
NumEqVector
)
;
using
Indices
=
typename
G
ET_PROP_TYPE
(
TypeTag
,
ModelTraits
)
::
Indices
;
using
NumEqVector
=
GetPropType
<
TypeTag
,
Properties
::
NumEqVector
>
;
using
Indices
=
typename
G
etPropType
<
TypeTag
,
Properties
::
ModelTraits
>
::
Indices
;
enum
{
pressureH2OIdx
=
Indices
::
pressureIdx
,
saturationDNAPLIdx
=
Indices
::
saturationIdx
,
...
...
@@ -136,7 +143,7 @@ public:
PrimaryVariables
dirichletAtPos
(
const
GlobalPosition
&
globalPos
)
const
{
PrimaryVariables
values
;
typename
GET_PROP_TYPE
(
TypeTag
,
FluidState
)
fluidState
;
GetPropType
<
TypeTag
,
Properties
::
FluidState
>
fluidState
;
fluidState
.
setTemperature
(
temperature
());
fluidState
.
setPressure
(
waterPhaseIdx
,
/*pressure=*/
1e5
);
fluidState
.
setPressure
(
dnaplPhaseIdx
,
/*pressure=*/
1e5
);
...
...
@@ -186,7 +193,7 @@ public:
PrimaryVariables
initialAtPos
(
const
GlobalPosition
&
globalPos
)
const
{
PrimaryVariables
values
;
typename
GET_PROP_TYPE
(
TypeTag
,
FluidState
)
fluidState
;
GetPropType
<
TypeTag
,
Properties
::
FluidState
>
fluidState
;
fluidState
.
setTemperature
(
temperature
());
fluidState
.
setPressure
(
waterPhaseIdx
,
/*pressure=*/
1e5
);
fluidState
.
setPressure
(
dnaplPhaseIdx
,
/*pressure=*/
1e5
);
...
...
exercises/solution/exercise-properties/exercise_properties_solution.cc
View file @
3f0ede68
...
...
@@ -46,10 +46,11 @@
#include
<dumux/assembly/fvassembler.hh>
#include
<dumux/assembly/diffmethod.hh>
#include
<dumux/discretization/method
s
.hh>
#include
<dumux/discretization/method.hh>
#include
<dumux/io/vtkoutputmodule.hh>
#include
<dumux/io/grid/gridmanager.hh>
#include
<dumux/io/loadsolution.hh>
/*!
* \brief Provides an interface for customizing error messages associated with
...
...
@@ -120,16 +121,31 @@ int main(int argc, char** argv) try
using
Problem
=
typename
GET_PROP_TYPE
(
TypeTag
,
Problem
);
auto
problem
=
std
::
make_shared
<
Problem
>
(
fvGridGeometry
);
// check if we are about to restart a previously interrupted simulation
using
Scalar
=
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
;
Scalar
restartTime
=
getParam
<
Scalar
>
(
"Restart.Time"
,
0
);
// the solution vector
using
SolutionVector
=
typename
GET_PROP_TYPE
(
TypeTag
,
SolutionVector
)
;
using
SolutionVector
=
GetPropType
<
TypeTag
,
Properties
::
SolutionVector
>
;
SolutionVector
x
(
fvGridGeometry
->
numDofs
());
problem
->
applyInitialSolution
(
x
);
if
(
restartTime
>
0
)
{
using
IOFields
=
GetPropType
<
TypeTag
,
Properties
::
IOFields
>
;
using
PrimaryVariables
=
GetPropType
<
TypeTag
,
Properties
::
PrimaryVariables
>
;
using
ModelTraits
=
GetPropType
<
TypeTag
,
Properties
::
ModelTraits
>
;
using
FluidSystem
=
GetPropType
<
TypeTag
,
Properties
::
FluidSystem
>
;
const
auto
fileName
=
getParam
<
std
::
string
>
(
"Restart.File"
);
const
auto
pvName
=
createPVNameFunction
<
IOFields
,
PrimaryVariables
,
ModelTraits
,
FluidSystem
>
();
loadSolution
(
x
,
fileName
,
pvName
,
*
fvGridGeometry
);
}
else
problem
->
applyInitialSolution
(
x
);
auto
xOld
=
x
;
// the grid variables
using
GridVariables
=
typename
GET_PROP_TYPE
(
TypeTag
,
GridVariables
);
auto
gridVariables
=
std
::
make_shared
<
GridVariables
>
(
problem
,
fvGridGeometry
);
gridVariables
->
init
(
x
,
xOld
);
gridVariables
->
init
(
x
);
// get some time loop parameters
using
Scalar
=
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
);
...
...
@@ -140,13 +156,13 @@ int main(int argc, char** argv) try
// intialize the vtk output module
using
VtkOutputFields
=
typename
GET_PROP_TYPE
(
TypeTag
,
VtkOutputFields
);
//
use non-conforming output for the test with interface solver
const
auto
ncOutput
=
g
etP
aram
<
bool
>
(
"Problem.UseNonConformingOutput"
,
false
)
;
VtkOutputModule
<
TypeTag
>
vtkWriter
(
*
pro
ble
m
,
*
fvGridGeometry
,
*
gridVariables
,
x
,
problem
->
name
()
,
""
,
(
ncOutput
?
Dune
::
VTK
::
nonconforming
:
Dune
::
VTK
::
conforming
))
;
VtkOutputFields
::
init
(
vtkWriter
);
//!< Add model specific output fields
vtkWriter
.
write
(
0.0
);
//
intialize the vtk output module
using
VtkOutputFields
=
G
etP
ropType
<
TypeTag
,
Properties
::
VtkOutputFields
>
;
VtkOutputModule
<
GridVaria
ble
s
,
SolutionVector
>
vtkWriter
(
*
gridVariables
,
x
,
problem
->
name
()
);
using
VelocityOutput
=
GetPropType
<
TypeTag
,
Properties
::
VelocityOutput
>
;
vtkWriter
.
addVelocityOutput
(
std
::
make_shared
<
VelocityOutput
>
(
*
gridVariables
));
VtkOutputFields
::
init
OutputModule
(
vtkWriter
);
//!< Add model specific output fields
vtkWriter
.
write
(
restartTime
);
// instantiate time loop
auto
timeLoop
=
std
::
make_shared
<
TimeLoop
<
Scalar
>>
(
0.0
,
dt
,
tEnd
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment