Skip to content
GitLab
Menu
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
111c328d
Commit
111c328d
authored
Dec 11, 2018
by
Dennis Gläser
Browse files
[ex-fractures] port to Dumux3.0
parent
92b54e43
Changes
3
Hide whitespace changes
Inline
Side-by-side
exercises/exercise-fractures/exercise_fractures.cc
View file @
111c328d
...
...
@@ -50,10 +50,10 @@
// Define some types for this test so that we can set them as properties below and
// reuse them again in the main function with only one single definition of them here
using
MatrixTypeTag
=
TTAG
(
MatrixProblemTypeTag
)
;
using
FractureTypeTag
=
TTAG
(
FractureProblemTypeTag
)
;
using
MatrixFVGridGeometry
=
typename
GET_PROP_TYPE
(
MatrixTypeTag
,
FVGridGeometry
)
;
using
FractureFVGridGeometry
=
typename
GET_PROP_TYPE
(
FractureTypeTag
,
FVGridGeometry
)
;
using
MatrixTypeTag
=
Dumux
::
Properties
::
TTag
::
MatrixProblemTypeTag
;
using
FractureTypeTag
=
Dumux
::
Properties
::
TTag
::
FractureProblemTypeTag
;
using
MatrixFVGridGeometry
=
Dumux
::
GetPropType
<
MatrixTypeTag
,
Dumux
::
Properties
::
FVGridGeometry
>
;
using
FractureFVGridGeometry
=
Dumux
::
GetPropType
<
FractureTypeTag
,
Dumux
::
Properties
::
FVGridGeometry
>
;
using
TheMultiDomainTraits
=
Dumux
::
MultiDomainTraits
<
MatrixTypeTag
,
FractureTypeTag
>
;
using
TheCouplingMapper
=
Dumux
::
FacetCouplingMapper
<
MatrixFVGridGeometry
,
FractureFVGridGeometry
>
;
using
TheCouplingManager
=
Dumux
::
FacetCouplingManager
<
TheMultiDomainTraits
,
TheCouplingMapper
>
;
...
...
@@ -61,8 +61,13 @@ using TheCouplingManager = Dumux::FacetCouplingManager<TheMultiDomainTraits, The
// set the coupling manager property in the sub-problems
namespace
Dumux
{
namespace
Properties
{
SET_TYPE_PROP
(
MatrixProblemTypeTag
,
CouplingManager
,
TheCouplingManager
);
SET_TYPE_PROP
(
FractureProblemTypeTag
,
CouplingManager
,
TheCouplingManager
);
template
<
class
TypeTag
>
struct
CouplingManager
<
TypeTag
,
TTag
::
MatrixProblemTypeTag
>
{
using
type
=
TheCouplingManager
;
};
template
<
class
TypeTag
>
struct
CouplingManager
<
TypeTag
,
TTag
::
FractureProblemTypeTag
>
{
using
type
=
TheCouplingManager
;
};
}
// end namespace Properties
}
// end namespace Dumux
...
...
@@ -85,8 +90,8 @@ int main(int argc, char** argv) try
// This requires the grids used to be passed as template arguments, where
// they are assumed to be ordered in descending grid dimension. Thus,
// we pass the matrix grid as first and the fracture grid as second argument.
using
MatrixGrid
=
typename
GET_PROP_TYPE
(
MatrixTypeTag
,
Grid
)
;
using
FractureGrid
=
typename
GET_PROP_TYPE
(
FractureTypeTag
,
Grid
)
;
using
MatrixGrid
=
GetPropType
<
MatrixTypeTag
,
Properties
::
Grid
>
;
using
FractureGrid
=
GetPropType
<
FractureTypeTag
,
Properties
::
Grid
>
;
using
GridManager
=
Dumux
::
FacetCouplingGridManager
<
MatrixGrid
,
FractureGrid
>
;
GridManager
gridManager
;
...
...
@@ -114,8 +119,8 @@ int main(int argc, char** argv) try
fractureFvGridGeometry
->
update
();
// the problems (boundary/initial conditions etc)
using
MatrixProblem
=
typename
GET_PROP_TYPE
(
MatrixTypeTag
,
Problem
)
;
using
FractureProblem
=
typename
GET_PROP_TYPE
(
FractureTypeTag
,
Problem
)
;
using
MatrixProblem
=
GetPropType
<
MatrixTypeTag
,
Properties
::
Problem
>
;
using
FractureProblem
=
GetPropType
<
FractureTypeTag
,
Properties
::
Problem
>
;
// pass the model parameter group to the spatial params so that they obtain the right
// values from the input file since we use groups for matrix and fracture
...
...
@@ -140,8 +145,8 @@ int main(int argc, char** argv) try
// in case you have more subdomains involved. We domain ids
// correspond to the order of the type tags passed to the multidomain
// traits (see definition of the traits class at the beginning of this file)
static
const
auto
matrixDomainId
=
typename
TheMultiDomainTraits
::
template
Domain
Idx
<
0
>();
static
const
auto
fractureDomainId
=
typename
TheMultiDomainTraits
::
template
Domain
Idx
<
1
>();
static
const
auto
matrixDomainId
=
typename
TheMultiDomainTraits
::
template
Sub
Domain
<
0
>
::
Index
();
static
const
auto
fractureDomainId
=
typename
TheMultiDomainTraits
::
template
Sub
Domain
<
1
>
::
Index
();
// resize the solution vector and write initial solution to it
x
[
matrixDomainId
].
resize
(
matrixFvGridGeometry
->
numDofs
());
...
...
@@ -167,23 +172,25 @@ int main(int argc, char** argv) try
fractureProblem
->
setCouplingManager
(
couplingManager
);
// the grid variables
using
MatrixGridVariables
=
typename
GET_PROP_TYPE
(
MatrixTypeTag
,
GridVariables
)
;
using
FractureGridVariables
=
typename
GET_PROP_TYPE
(
FractureTypeTag
,
GridVariables
)
;
using
MatrixGridVariables
=
GetPropType
<
MatrixTypeTag
,
Properties
::
GridVariables
>
;
using
FractureGridVariables
=
GetPropType
<
FractureTypeTag
,
Properties
::
GridVariables
>
;
auto
matrixGridVariables
=
std
::
make_shared
<
MatrixGridVariables
>
(
matrixProblem
,
matrixFvGridGeometry
);
auto
fractureGridVariables
=
std
::
make_shared
<
FractureGridVariables
>
(
fractureProblem
,
fractureFvGridGeometry
);
xOld
=
x
;
matrixGridVariables
->
init
(
x
[
matrixDomainId
]
,
xOld
[
matrixDomainId
]
);
fractureGridVariables
->
init
(
x
[
fractureDomainId
]
,
xOld
[
fractureDomainId
]
);
matrixGridVariables
->
init
(
x
[
matrixDomainId
]);
fractureGridVariables
->
init
(
x
[
fractureDomainId
]);
// intialize the vtk output modules
VtkOutputModule
<
MatrixTypeTag
>
matrixVtkWriter
(
*
matrixProblem
,
*
matrixFvGridGeometry
,
*
matrixGridVariables
,
x
[
matrixDomainId
],
matrixProblem
->
name
());
VtkOutputModule
<
FractureTypeTag
>
fractureVtkWriter
(
*
fractureProblem
,
*
fractureFvGridGeometry
,
*
fractureGridVariables
,
x
[
fractureDomainId
],
fractureProblem
->
name
());
using
MatrixVtkOutputModule
=
VtkOutputModule
<
MatrixGridVariables
,
GetPropType
<
MatrixTypeTag
,
Properties
::
SolutionVector
>>
;
using
FractureVtkOutputModule
=
VtkOutputModule
<
FractureGridVariables
,
GetPropType
<
FractureTypeTag
,
Properties
::
SolutionVector
>>
;
MatrixVtkOutputModule
matrixVtkWriter
(
*
matrixGridVariables
,
x
[
matrixDomainId
],
matrixProblem
->
name
());
FractureVtkOutputModule
fractureVtkWriter
(
*
fractureGridVariables
,
x
[
fractureDomainId
],
fractureProblem
->
name
());
// Add model specific output fields
using
MatrixVtkOutputFields
=
typename
GET_PROP_TYPE
(
MatrixTypeTag
,
VtkOutputFields
)
;
using
FractureVtkOutputFields
=
typename
GET_PROP_TYPE
(
FractureTypeTag
,
VtkOutputFields
)
;
MatrixVtkOutputFields
::
init
(
matrixVtkWriter
);
FractureVtkOutputFields
::
init
(
fractureVtkWriter
);
using
MatrixVtkOutputFields
=
GetPropType
<
MatrixTypeTag
,
Properties
::
VtkOutputFields
>
;
using
FractureVtkOutputFields
=
GetPropType
<
FractureTypeTag
,
Properties
::
VtkOutputFields
>
;
MatrixVtkOutputFields
::
init
OutputModule
(
matrixVtkWriter
);
FractureVtkOutputFields
::
init
OutputModule
(
fractureVtkWriter
);
// add domain markers to output
std
::
vector
<
int
>
matrixDomainMarkers
(
matrixFvGridGeometry
->
gridView
().
size
(
0
));
...
...
exercises/exercise-fractures/fractureproblem.hh
View file @
111c328d
...
...
@@ -48,24 +48,36 @@ namespace Dumux {
template
<
class
TypeTag
>
class
FractureSubProblem
;
namespace
Properties
{
NEW_PROP_TAG
(
GridData
);
// forward declaration of property
// create the type tag nodes
NEW_TYPE_TAG
(
FractureProblemTypeTag
,
INHERITS_FROM
(
CCTpfaModel
,
TwoP
));
// Create new type tag node
namespace
TTag
{
struct
FractureProblemTypeTag
{
using
InheritsFrom
=
std
::
tuple
<
CCTpfaModel
,
TwoP
>
;
};
}
// end namespace TTag
// Set the grid type
SET_TYPE_PROP
(
FractureProblemTypeTag
,
Grid
,
Dune
::
FoamGrid
<
1
,
2
>
);
template
<
class
TypeTag
>
struct
Grid
<
TypeTag
,
TTag
::
FractureProblemTypeTag
>
{
using
type
=
Dune
::
FoamGrid
<
1
,
2
>
;
};
// Set the problem type
SET_TYPE_PROP
(
FractureProblemTypeTag
,
Problem
,
FractureSubProblem
<
TypeTag
>
);
template
<
class
TypeTag
>
struct
Problem
<
TypeTag
,
TTag
::
FractureProblemTypeTag
>
{
using
type
=
FractureSubProblem
<
TypeTag
>
;
};
// set the spatial params
SET_TYPE_PROP
(
FractureProblemTypeTag
,
SpatialParams
,
FractureSpatialParams
<
typename
GET_PROP_TYPE
(
TypeTag
,
FVGridGeometry
),
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
)
>
);
template
<
class
TypeTag
>
struct
SpatialParams
<
TypeTag
,
TTag
::
FractureProblemTypeTag
>
{
using
type
=
FractureSpatialParams
<
GetPropType
<
TypeTag
,
Properties
::
FVGridGeometry
>
,
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
>
;
};
// the fluid system
SET_TYPE_PROP
(
FractureProblemTypeTag
,
FluidSystem
,
Dumux
::
FluidSystems
::
H2ON2
<
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
),
FluidSystems
::
H2ON2DefaultPolicy
<
/*fastButSimplifiedRelations=*/
true
>
>
);
template
<
class
TypeTag
>
struct
FluidSystem
<
TypeTag
,
TTag
::
FractureProblemTypeTag
>
{
using
type
=
Dumux
::
FluidSystems
::
H2ON2
<
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
,
FluidSystems
::
H2ON2DefaultPolicy
<
/*fastButSimplifiedRelations=*/
true
>
>
;
};
}
// end namespace Properties
/*!
...
...
@@ -79,10 +91,10 @@ class FractureSubProblem : public PorousMediumFlowProblem<TypeTag>
{
using
ParentType
=
PorousMediumFlowProblem
<
TypeTag
>
;
using
BoundaryTypes
=
typename
GET_PROP_TYPE
(
TypeTag
,
BoundaryTypes
)
;
using
CouplingManager
=
typename
GET_PROP_TYPE
(
TypeTag
,
CouplingManager
)
;
using
NumEqVector
=
typename
GET_PROP_TYPE
(
TypeTag
,
NumEqVector
)
;
using
GridVariables
=
typename
GET_PROP_TYPE
(
TypeTag
,
GridVariables
)
;
using
BoundaryTypes
=
GetPropType
<
TypeTag
,
Properties
::
BoundaryTypes
>
;
using
CouplingManager
=
GetPropType
<
TypeTag
,
Properties
::
CouplingManager
>
;
using
NumEqVector
=
GetPropType
<
TypeTag
,
Properties
::
NumEqVector
>
;
using
GridVariables
=
GetPropType
<
TypeTag
,
Properties
::
GridVariables
>
;
using
ElementVolumeVariables
=
typename
GridVariables
::
GridVolumeVariables
::
LocalView
;
using
PrimaryVariables
=
typename
GridVariables
::
PrimaryVariables
;
using
Scalar
=
typename
GridVariables
::
Scalar
;
...
...
@@ -95,7 +107,7 @@ class FractureSubProblem : public PorousMediumFlowProblem<TypeTag>
using
GlobalPosition
=
typename
Element
::
Geometry
::
GlobalCoordinate
;
// some indices for convenience
using
Indices
=
typename
G
ET_PROP_TYPE
(
TypeTag
,
ModelTraits
)
::
Indices
;
using
Indices
=
typename
G
etPropType
<
TypeTag
,
Properties
::
ModelTraits
>
::
Indices
;
enum
{
pressureIdx
=
Indices
::
pressureIdx
,
...
...
@@ -112,7 +124,7 @@ public:
{
// initialize the fluid system, i.e. the tabulation
// of water properties. Use the default p/T ranges.
using
FluidSystem
=
typename
GET_PROP_TYPE
(
TypeTag
,
FluidSystem
)
;
using
FluidSystem
=
GetPropType
<
TypeTag
,
Properties
::
FluidSystem
>
;
FluidSystem
::
init
();
}
...
...
exercises/exercise-fractures/matrixproblem.hh
View file @
111c328d
...
...
@@ -56,28 +56,36 @@ namespace Dumux {
template
<
class
TypeTag
>
class
MatrixSubProblem
;
namespace
Properties
{
NEW_PROP_TAG
(
GridData
);
// forward declaration of property
// create the type tag node for the matrix sub-problem
// We need to put the facet-coupling type tag after the physics-related type tag
// because it overwrites some of the properties inherited from "TwoP". This is
// necessary because we need e.g. a modified implementation of darcys law that
// evaluates the coupling conditions on faces that coincide with the fractures.
NEW_TYPE_TAG
(
MatrixProblemTypeTag
,
INHERITS_FROM
(
TwoP
,
CCTpfaFacetCouplingModel
));
// create the type tag node
namespace
TTag
{
struct
MatrixProblemTypeTag
{
using
InheritsFrom
=
std
::
tuple
<
CCTpfaFacetCouplingModel
,
TwoP
>
;
};
}
// end namespace TTag
// Set the grid type
SET_TYPE_PROP
(
MatrixProblemTypeTag
,
Grid
,
Dune
::
ALUGrid
<
2
,
2
,
Dune
::
simplex
,
Dune
::
conforming
>
);
template
<
class
TypeTag
>
struct
Grid
<
TypeTag
,
TTag
::
MatrixProblemTypeTag
>
{
using
type
=
Dune
::
ALUGrid
<
2
,
2
,
Dune
::
simplex
,
Dune
::
conforming
>
;
};
// Set the problem type
SET_TYPE_PROP
(
MatrixProblemTypeTag
,
Problem
,
MatrixSubProblem
<
TypeTag
>
);
template
<
class
TypeTag
>
struct
Problem
<
TypeTag
,
TTag
::
MatrixProblemTypeTag
>
{
using
type
=
MatrixSubProblem
<
TypeTag
>
;
};
// set the spatial params
SET_TYPE_PROP
(
MatrixProblemTypeTag
,
SpatialParams
,
MatrixSpatialParams
<
typename
GET_PROP_TYPE
(
TypeTag
,
FVGridGeometry
),
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
)
>
);
template
<
class
TypeTag
>
struct
SpatialParams
<
TypeTag
,
TTag
::
MatrixProblemTypeTag
>
{
using
type
=
MatrixSpatialParams
<
GetPropType
<
TypeTag
,
Properties
::
FVGridGeometry
>
,
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
>
;
};
// the fluid system
SET_TYPE_PROP
(
MatrixProblemTypeTag
,
FluidSystem
,
Dumux
::
FluidSystems
::
H2ON2
<
typename
GET_PROP_TYPE
(
TypeTag
,
Scalar
),
FluidSystems
::
H2ON2DefaultPolicy
<
/*fastButSimplifiedRelations=*/
true
>
>
);
template
<
class
TypeTag
>
struct
FluidSystem
<
TypeTag
,
TTag
::
MatrixProblemTypeTag
>
{
using
type
=
Dumux
::
FluidSystems
::
H2ON2
<
GetPropType
<
TypeTag
,
Properties
::
Scalar
>
,
FluidSystems
::
H2ON2DefaultPolicy
<
/*fastButSimplifiedRelations=*/
true
>
>
;
};
}
// end namespace Properties
/*!
...
...
@@ -91,10 +99,10 @@ class MatrixSubProblem : public PorousMediumFlowProblem<TypeTag>
{
using
ParentType
=
PorousMediumFlowProblem
<
TypeTag
>
;
using
BoundaryTypes
=
typename
GET_PROP_TYPE
(
TypeTag
,
BoundaryTypes
)
;
using
CouplingManager
=
typename
GET_PROP_TYPE
(
TypeTag
,
CouplingManager
)
;
using
NumEqVector
=
typename
GET_PROP_TYPE
(
TypeTag
,
NumEqVector
)
;
using
GridVariables
=
typename
GET_PROP_TYPE
(
TypeTag
,
GridVariables
)
;
using
BoundaryTypes
=
GetPropType
<
TypeTag
,
Properties
::
BoundaryTypes
>
;
using
CouplingManager
=
GetPropType
<
TypeTag
,
Properties
::
CouplingManager
>
;
using
NumEqVector
=
GetPropType
<
TypeTag
,
Properties
::
NumEqVector
>
;
using
GridVariables
=
GetPropType
<
TypeTag
,
Properties
::
GridVariables
>
;
using
PrimaryVariables
=
typename
GridVariables
::
PrimaryVariables
;
using
Scalar
=
typename
GridVariables
::
Scalar
;
...
...
@@ -107,7 +115,7 @@ class MatrixSubProblem : public PorousMediumFlowProblem<TypeTag>
using
GlobalPosition
=
typename
Element
::
Geometry
::
GlobalCoordinate
;
// some indices for convenience
using
Indices
=
typename
G
ET_PROP_TYPE
(
TypeTag
,
ModelTraits
)
::
Indices
;
using
Indices
=
typename
G
etPropType
<
TypeTag
,
Properties
::
ModelTraits
>
::
Indices
;
enum
{
pressureIdx
=
Indices
::
pressureIdx
,
...
...
@@ -125,7 +133,7 @@ public:
{
// initialize the fluid system, i.e. the tabulation
// of water properties. Use the default p/T ranges.
using
FluidSystem
=
typename
GET_PROP_TYPE
(
TypeTag
,
FluidSystem
)
;
using
FluidSystem
=
GetPropType
<
TypeTag
,
Properties
::
FluidSystem
>
;
FluidSystem
::
init
();
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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