Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
LDD-for-two-phase-flow-systems
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
David Seus
LDD-for-two-phase-flow-systems
Commits
8e78757a
Commit
8e78757a
authored
Apr 5, 2019
by
David Seus
Browse files
Options
Downloads
Patches
Plain Diff
fix bugs
parent
66da3ba8
No related branches found
No related tags found
No related merge requests found
Changes
3
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
LDDsimulation/LDDsimulation.py
+121
-45
121 additions, 45 deletions
LDDsimulation/LDDsimulation.py
LDDsimulation/domainPatch.py
+137
-150
137 additions, 150 deletions
LDDsimulation/domainPatch.py
RR-2-patch-test-case/RR-2-patch-test.py
+66
-51
66 additions, 51 deletions
RR-2-patch-test-case/RR-2-patch-test.py
with
324 additions
and
246 deletions
LDDsimulation/LDDsimulation.py
+
121
−
45
View file @
8e78757a
...
@@ -81,9 +81,9 @@ class LDDsimulation(object):
...
@@ -81,9 +81,9 @@ class LDDsimulation(object):
## Private variables
## Private variables
# maximal number of L-iterations that the LDD solver uses.
# maximal number of L-iterations that the LDD solver uses.
self
.
_max_iter_num
=
100
self
.
_max_iter_num
=
5
# TODO rewrite this with regard to the mesh sizes
# TODO rewrite this with regard to the mesh sizes
self
.
calc_tol
=
10
^-
6
self
.
calc_tol
=
self
.
tol
# The number of subdomains are counted by self.init_meshes_and_markers()
# The number of subdomains are counted by self.init_meshes_and_markers()
self
.
_number_of_subdomains
=
0
self
.
_number_of_subdomains
=
0
# variable to check if self.set_parameters() has been called
# variable to check if self.set_parameters() has been called
...
@@ -111,6 +111,29 @@ class LDDsimulation(object):
...
@@ -111,6 +111,29 @@ class LDDsimulation(object):
# These are interpolated and stored to each respective subdomain by
# These are interpolated and stored to each respective subdomain by
# self._init_initial_values()
# self._init_initial_values()
self
.
initial_conditions
=
None
self
.
initial_conditions
=
None
########## SOLVER DEFINITION AND PARAMETERS ########
# print("\nLinear Algebra Backends:")
# df.list_linear_algebra_backends()
# print("\nLinear Solver Methods:")
# df.list_linear_solver_methods()
# print("\nPeconditioners for Krylov Solvers:")
# df.list_krylov_solver_preconditioners()
### Define the linear solver to be used.
solver
=
'
bicgstab
'
# biconjugate gradient stabilized method
preconditioner
=
'
ilu
'
# incomplete LU factorization
self
.
linear_solver
=
df
.
KrylovSolver
(
solver
,
preconditioner
)
# we use the previous iteration as an initial guess for the linear solver.
solver_param
=
self
.
linear_solver
.
parameters
solver_param
[
'
nonzero_initial_guess
'
]
=
True
# solver_param['absolute_tolerance'] = 1E-12
# solver_param['relative_tolerance'] = 1E-9
solver_param
[
'
maximum_iterations
'
]
=
1000
solver_param
[
'
report
'
]
=
True
# ## print out set solver parameters
# for parameter, value in self.linear_solver.parameters.items():
# print(f"parameter: {parameter} = {value}")
df
.
info
(
solver_param
,
True
)
def
set_parameters
(
self
,
#
def
set_parameters
(
self
,
#
output_dir
:
str
,
#
output_dir
:
str
,
#
...
@@ -181,7 +204,7 @@ class LDDsimulation(object):
...
@@ -181,7 +204,7 @@ class LDDsimulation(object):
# before the iteration gets started all iteration numbers must be nulled
# before the iteration gets started all iteration numbers must be nulled
# and the subdomain_calc_isdone dictionary must be set to False
# and the subdomain_calc_isdone dictionary must be set to False
for
ind
,
subdomain
in
self
.
subdomain
.
items
():
for
ind
,
subdomain
in
self
.
subdomain
.
items
():
subdomain_calc_isdone
.
update
({
ind
,
False
})
subdomain_calc_isdone
.
update
({
ind
:
False
})
# reset all interface[has_interface].current_iteration[ind] = 0, for
# reset all interface[has_interface].current_iteration[ind] = 0, for
# index has_interface in subdomain.has_interface
# index has_interface in subdomain.has_interface
subdomain
.
null_all_interface_iteration_numbers
()
subdomain
.
null_all_interface_iteration_numbers
()
...
@@ -194,15 +217,15 @@ class LDDsimulation(object):
...
@@ -194,15 +217,15 @@ class LDDsimulation(object):
# the following only needs to be done when time is not equal 0 since
# the following only needs to be done when time is not equal 0 since
# our initialisation functions already took care of setting what follows
# our initialisation functions already took care of setting what follows
# for the initial iteration step at time = 0.
# for the initial iteration step at time = 0.
if
time
>
self
.
tol
:
if
time
>
self
.
calc_
tol
:
# this is the beginning of the solver, so iteration must be set
# this is the beginning of the solver, so iteration must be set
# to 0.
# to 0.
subdomain
.
iteration_number
=
0
subdomain
.
iteration_number
=
0
for
phase
in
subdomain
.
has_phases
:
# set the solution of the previous timestep as new prev_timestep pressure
# set the solution of the previous timestep as new prev_timestep pressure
subdomain
.
pressure_prev_timestep
=
subdomain
.
pressure
subdomain
.
pressure_prev_timestep
[
phase
].
vector
().
set_local
(
# TODO recheck if
subdomain
.
pressure
[
phase
].
vector
().
get_local
()
subdomain
.
pressure_prev_iter
=
subdomain
.
pressure
)
# needs to be set also
### actual iteration starts here
### actual iteration starts here
# gobal stopping criterion for the iteration.
# gobal stopping criterion for the iteration.
...
@@ -220,21 +243,24 @@ class LDDsimulation(object):
...
@@ -220,21 +243,24 @@ class LDDsimulation(object):
subdomain
.
iteration_number
=
iteration
subdomain
.
iteration_number
=
iteration
# solve the problem on subdomain
# solve the problem on subdomain
self
.
Lsolver_step
(
subdomain_index
=
sd_index
,
#
self
.
Lsolver_step
(
subdomain_index
=
sd_index
,
#
debug
=
True
debug
=
True
,
)
subsequent_iterations_err
=
self
.
calc_iteration_error
(
subdomain_index
=
sd_index
,
#
error_type
=
"
L2
"
)
)
# check if error criterion has been met
# subsequent_iterations_err = self.calc_iteration_error(
if
subsequent_iterations_err
<
self
.
calc_tol
:
# subdomain_index = sd_index,#
subdomain_calc_isdone
[
sd_index
]
=
True
# error_type = "L2"
# )
# # check if error criterion has been met
# if subsequent_iterations_err < self.calc_tol:
# subdomain_calc_isdone[sd_index] = True
# prepare next iteration
# prepare next iteration
# write the newly calculated solution to the inteface dictionaries
# write the newly calculated solution to the inteface dictionaries
# for communication
# for communication
subdomain
.
write_pressure_to_interfaces
()
subdomain
.
write_pressure_to_interfaces
()
subdomain
.
pressure_prev_iter
=
subdomain
.
pressure
for
phase
in
subdomain
.
has_phases
:
subdomain
.
pressure_prev_iter
[
phase
].
vector
().
set_local
(
subdomain
.
pressure
[
phase
].
vector
().
get_local
()
)
else
:
else
:
# one subdomain is done. Check if all subdomains are done to
# one subdomain is done. Check if all subdomains are done to
# stop the while loop if needed.
# stop the while loop if needed.
...
@@ -255,7 +281,7 @@ class LDDsimulation(object):
...
@@ -255,7 +281,7 @@ class LDDsimulation(object):
iteration
+=
1
iteration
+=
1
# end iteration while loop.
# end iteration while loop.
def
Lsolver_step
(
self
,
subdomain_index
:
int
]
,
#
def
Lsolver_step
(
self
,
subdomain_index
:
int
,
#
debug
:
bool
=
False
)
->
None
:
debug
:
bool
=
False
)
->
None
:
"""
L-scheme solver iteration step for an object of class subdomain
"""
L-scheme solver iteration step for an object of class subdomain
...
@@ -273,28 +299,54 @@ class LDDsimulation(object):
...
@@ -273,28 +299,54 @@ class LDDsimulation(object):
"""
"""
subdomain
=
self
.
subdomain
[
subdomain_index
]
subdomain
=
self
.
subdomain
[
subdomain_index
]
iteration
=
subdomain
.
iteration_number
iteration
=
subdomain
.
iteration_number
if
subdomain
.
isRichards
:
# calculate the gli terms on the right hand side and store
subdomain
.
calc_gli_term
()
for
phase
in
subdomain
.
has_phases
:
# extract L-scheme form and rhs (without gli term) from subdomain.
# extract L-scheme form and rhs (without gli term) from subdomain.
governing_problem
=
subdomain
.
governing_problem
(
phase
=
'
wetting
'
)
governing_problem
=
subdomain
.
governing_problem
(
phase
=
phase
)
form
=
governing_problem
[
form
]
form
=
governing_problem
[
'
form
'
]
rhs_without_gli
=
governing_problem
[
rhs_without_gli
]
rhs_without_gli
=
governing_problem
[
'
rhs_without_gli
'
]
# assemble the form and rhs
# assemble the form and rhs
form_assembled
=
df
.
assemble
(
form
)
form_assembled
=
df
.
assemble
(
form
)
rhs_without_gli_assembled
=
df
.
assemble
(
rhs_without_gli
)
rhs_without_gli_assembled
=
df
.
assemble
(
rhs_without_gli
)
#
calculate the gli term
#
access the assembled gli term for the rhs.
gli_term_assembled
=
subdomain
.
calc_gli_term
(
iteration
=
iteration
)
gli_term_assembled
=
subdomain
.
gli_assembled
[
phase
]
# subdomain.calc_gli_term() asslembles gli but on the left hand side
# subdomain.calc_gli_term() asslembles gli but on the left hand side
# so gli_term_assembled needs to actually be subtracted from the rhs.
# so gli_term_assembled needs to actually be subtracted from the rhs.
rhs_assembled
=
rhs_without_gli_assembled
-
gli_term_assembled
if
debug
and
subdomain
.
mesh
.
num_cells
()
<
36
:
print
(
"
\n
System before applying outer boundary conditions:
"
)
print
(
f
"
phase =
{
phase
}
: rhs_without_gli:
\n
"
,
rhs_without_gli_assembled
.
get_local
())
rhs_without_gli_assembled
.
set_local
(
rhs_without_gli_assembled
.
get_local
()
-
gli_term_assembled
)
rhs_assembled
=
rhs_without_gli_assembled
if
debug
and
subdomain
.
mesh
.
num_cells
()
<
36
:
# print(f"phase = {phase}: form_assembled:\n", form_assembled.array())
# print(f"phase = {phase}: rhs_without_gli:\n", rhs_without_gli_assembled.get_local())
print
(
f
"
phase =
{
phase
}
: gli_term:
\n
"
,
gli_term_assembled
)
print
(
f
"
phase =
{
phase
}
: rhs_assembled:
\n
"
,
rhs_assembled
.
get_local
())
# apply outer Dirichlet boundary conditions if present.
# apply outer Dirichlet boundary conditions if present.
if
subdomain
.
outer_boundary
is
not
None
:
if
subdomain
.
outer_boundary
is
not
None
:
self
.
outerBC
[
subdomain_index
][
'
wetting
'
].
apply
(
form_assembled
,
rhs_assembled
)
self
.
outerBC
[
subdomain_index
][
phase
].
apply
(
form_assembled
,
rhs_assembled
)
solution_pw
=
subdomain
.
pressure
[
'
wetting
'
].
vector
()
else
:
if
debug
and
subdomain
.
mesh
.
num_cells
()
<
36
:
print
(
"
implement two phase assembly
"
)
print
(
"
\n
System after applying outer boundary conditions:
"
)
# print(f"phase = {phase}: form_assembled:\n", form_assembled.array())
print
(
f
"
phase =
{
phase
}
: rhs_assembled:
\n
"
,
rhs_assembled
.
get_local
())
# # set previous iteration as initial guess for the linear solver
# pi_prev = subdomain.pressure_prev_iter[phase].vector().get_local()
# subdomain.pressure[phase].vector().set_local(pi_prev)
if
debug
and
subdomain
.
mesh
.
num_cells
()
<
36
:
print
(
"
\n
pressure before solver:
\n
"
,
subdomain
.
pressure
[
phase
].
vector
().
get_local
())
solver
=
self
.
linear_solver
solver
.
solve
(
form_assembled
,
subdomain
.
pressure
[
phase
].
vector
(),
rhs_assembled
)
if
debug
and
subdomain
.
mesh
.
num_cells
()
<
36
:
print
(
"
\n
pressure after solver:
\n
"
,
subdomain
.
pressure
[
phase
].
vector
().
get_local
())
## Private methods
## Private methods
def
_init_meshes_and_markers
(
self
,
subdomain_def_points
:
tp
.
List
[
tp
.
List
[
df
.
Point
]]
=
None
,
#
def
_init_meshes_and_markers
(
self
,
subdomain_def_points
:
tp
.
List
[
tp
.
List
[
df
.
Point
]]
=
None
,
#
...
@@ -358,7 +410,7 @@ class LDDsimulation(object):
...
@@ -358,7 +410,7 @@ class LDDsimulation(object):
def
_init_interfaces
(
self
,
interface_def_points
:
tp
.
List
[
tp
.
List
[
df
.
Point
]]
=
None
,
#
def
_init_interfaces
(
self
,
interface_def_points
:
tp
.
List
[
tp
.
List
[
df
.
Point
]]
=
None
,
#
adjacent_subdomains
:
tp
.
List
[
np
.
ndarray
]
=
None
)
->
None
:
adjacent_subdomains
:
tp
.
List
[
np
.
ndarray
]
=
None
)
->
None
:
"""
generate interfaces and interface markerfunctions for sudomains and
"""
generate interfaces and interface markerfunctions for sud
d
omains and
set the internal lists used by the LDDsimulation class.
set the internal lists used by the LDDsimulation class.
This initialises a list of interfaces and global interface marker functions
This initialises a list of interfaces and global interface marker functions
...
@@ -405,7 +457,7 @@ class LDDsimulation(object):
...
@@ -405,7 +457,7 @@ class LDDsimulation(object):
self
.
interface_marker
.
set_all
(
0
)
self
.
interface_marker
.
set_all
(
0
)
for
num
,
vertices
in
enumerate
(
interface_def_points
):
for
num
,
vertices
in
enumerate
(
interface_def_points
):
self
.
interface
.
append
(
dp
.
Interface
(
vertices
=
vertices
,
#
self
.
interface
.
append
(
dp
.
Interface
(
vertices
=
vertices
,
#
tol
=
mesh
.
hmin
()
/
100
,
#
tol
=
self
.
tol
,
#
mesh.hmin()/100,
internal
=
True
,
#
internal
=
True
,
#
adjacent_subdomains
=
adjacent_subdomains
[
num
],
#
adjacent_subdomains
=
adjacent_subdomains
[
num
],
#
isRichards
=
self
.
isRichards
))
#
isRichards
=
self
.
isRichards
))
#
...
@@ -423,6 +475,7 @@ class LDDsimulation(object):
...
@@ -423,6 +475,7 @@ class LDDsimulation(object):
# Therefor it is used in the subdomain initialisation loop.
# Therefor it is used in the subdomain initialisation loop.
for
subdom_num
,
isR
in
self
.
isRichards
.
items
():
for
subdom_num
,
isR
in
self
.
isRichards
.
items
():
interface_list
=
self
.
_get_interfaces
(
subdom_num
)
interface_list
=
self
.
_get_interfaces
(
subdom_num
)
# print(f"has_interface list for subdomain {subdom_num}:", interface_list)
self
.
subdomain
.
update
(
#
self
.
subdomain
.
update
(
#
{
subdom_num
:
dp
.
DomainPatch
(
#
{
subdom_num
:
dp
.
DomainPatch
(
#
subdomain_index
=
subdom_num
,
#
subdomain_index
=
subdom_num
,
#
...
@@ -438,6 +491,7 @@ class LDDsimulation(object):
...
@@ -438,6 +491,7 @@ class LDDsimulation(object):
relative_permeability
=
self
.
relative_permeability
[
subdom_num
],
#
relative_permeability
=
self
.
relative_permeability
[
subdom_num
],
#
saturation
=
self
.
saturation
[
subdom_num
],
#
saturation
=
self
.
saturation
[
subdom_num
],
#
timestep_size
=
self
.
timestep_size
[
subdom_num
],
#
timestep_size
=
self
.
timestep_size
[
subdom_num
],
#
tol
=
self
.
tol
)})
)})
...
@@ -450,7 +504,7 @@ class LDDsimulation(object):
...
@@ -450,7 +504,7 @@ class LDDsimulation(object):
This method determins all (global) indices of interfaces belonging to
This method determins all (global) indices of interfaces belonging to
subdomain with index subdomain_index from adjacent_subdomains.
subdomain with index subdomain_index from adjacent_subdomains.
"""
"""
if
not
adjacent_subdomains
:
if
adjacent_subdomains
is
None
:
adjacent_subdomains
=
self
.
adjacent_subdomains
adjacent_subdomains
=
self
.
adjacent_subdomains
else
:
else
:
# overwrite what has been set by init()
# overwrite what has been set by init()
...
@@ -480,24 +534,45 @@ class LDDsimulation(object):
...
@@ -480,24 +534,45 @@ class LDDsimulation(object):
if
subdomain
.
isRichards
:
if
subdomain
.
isRichards
:
# note that the default interpolation degree is 2
# note that the default interpolation degree is 2
pw0
=
df
.
Expression
(
p0
[
'
wetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
)
pw0
=
df
.
Expression
(
p0
[
'
wetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
)
subdomain
.
pressure
=
{
'
wetting
'
:
df
.
Function
(
V
[
'
wetting
'
])
}
subdomain
.
pressure_prev_timestep
=
{
'
wetting
'
:
df
.
Function
(
V
[
'
wetting
'
])
}
subdomain
.
pressure_prev_iter
=
{
'
wetting
'
:
df
.
interpolate
(
pw0
,
V
[
'
wetting
'
])}
subdomain
.
pressure_prev_iter
=
{
'
wetting
'
:
df
.
interpolate
(
pw0
,
V
[
'
wetting
'
])}
subdomain
.
pressure_prev_timestep
=
{
'
wetting
'
:
df
.
interpolate
(
pw0
,
V
[
'
wetting
'
])}
# print("vector()",subdomain.pressure_prev_iter['wetting'].vector().get_local())
pw_prev
=
subdomain
.
pressure_prev_iter
[
'
wetting
'
].
vector
().
get_local
()
subdomain
.
pressure_prev_timestep
[
'
wetting
'
].
vector
().
set_local
(
pw_prev
)
subdomain
.
pressure
[
'
wetting
'
].
vector
().
set_local
(
pw_prev
)
else
:
else
:
pw0
=
df
.
Expression
(
p0
[
'
wetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
)
pw0
=
df
.
Expression
(
p0
[
'
wetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
)
pnw0
=
df
.
Expression
(
p0
[
'
nonwetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
)
pnw0
=
df
.
Expression
(
p0
[
'
nonwetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
)
subdomain
.
pressure
=
{
'
wetting
'
:
df
.
Function
(
V
[
'
wetting
'
]),
#
'
nonwetting
'
:
df
.
Function
(
V
[
'
nonwetting
'
])
}
subdomain
.
pressure_prev_timestep
=
{
'
wetting
'
:
df
.
Function
(
V
[
'
wetting
'
]),
'
nonwetting
'
:
df
.
Function
(
V
[
'
nonwetting
'
])
}
subdomain
.
pressure_prev_iter
=
{
'
wetting
'
:
df
.
interpolate
(
pw0
,
V
[
'
wetting
'
]),
#
subdomain
.
pressure_prev_iter
=
{
'
wetting
'
:
df
.
interpolate
(
pw0
,
V
[
'
wetting
'
]),
#
'
nonwetting
'
:
df
.
interpolate
(
pnw0
,
V
[
'
nonwetting
'
])}
'
nonwetting
'
:
df
.
interpolate
(
pnw0
,
V
[
'
nonwetting
'
])}
subdomain
.
pressure_prev_timestep
=
{
'
wetting
'
:
df
.
interpolate
(
pw0
,
V
[
'
wetting
'
]),
#
'
nonwetting
'
:
df
.
interpolate
(
pnw0
,
V
[
'
nonwetting
'
])}
pw_prev
=
subdomain
.
pressure_prev_iter
[
'
wetting
'
].
vector
().
get_local
()
pnw_prev
=
subdomain
.
pressure_prev_iter
[
'
nonwetting
'
].
vector
().
get_local
()
subdomain
.
pressure_prev_timestep
[
'
wetting
'
].
vector
().
set_local
(
pw_prev
)
subdomain
.
pressure
[
'
wetting
'
].
vector
().
set_local
(
pw_prev
)
subdomain
.
pressure_prev_timestep
[
'
nonwetting
'
].
vector
().
set_local
(
pnw_prev
)
subdomain
.
pressure
[
'
nonwetting
'
].
vector
().
set_local
(
pnw_prev
)
# populate interface dictionaries with pressure values.
# populate interface dictionaries with pressure values.
subdomain
.
write_pressure_to_interfaces
(
initial_values
=
True
)
subdomain
.
write_pressure_to_interfaces
(
initial_values
=
True
)
def
update_DirichletBC_dictionary
(
self
,
def
update_DirichletBC_dictionary
(
self
,
subdomain_index
:
int
,
#
interpolation_degree
:
int
=
2
,
#
interpolation_degree
:
int
=
2
,
#
time
:
float
=
0
,
#
time
:
float
=
0
,
#
# exact_solution: bool = False,#
):
subdomain_index
:
int
):
"""
update time of the dirichlet boundary object for subdomain with
"""
update time of the dirichlet boundary object for subdomain with
index subdomain_index.
index subdomain_index.
...
@@ -512,7 +587,7 @@ class LDDsimulation(object):
...
@@ -512,7 +587,7 @@ class LDDsimulation(object):
mesh
=
subdomain
.
mesh
mesh
=
subdomain
.
mesh
V
=
subdomain
.
function_space
V
=
subdomain
.
function_space
# Here the dictionary has to be created first because t = 0.
# Here the dictionary has to be created first because t = 0.
if
np
.
abs
(
time
)
<
self
.
tol
:
if
np
.
abs
(
time
)
<
self
.
calc_
tol
:
self
.
outerBC
.
update
({
num
:
dict
()})
self
.
outerBC
.
update
({
num
:
dict
()})
self
.
dirichletBC_dfExpression
.
update
({
num
:
dict
()})
self
.
dirichletBC_dfExpression
.
update
({
num
:
dict
()})
...
@@ -529,7 +604,7 @@ class LDDsimulation(object):
...
@@ -529,7 +604,7 @@ class LDDsimulation(object):
self
.
outerBC
[
num
].
update
({
'
wetting
'
:
df
.
DirichletBC
(
V
[
'
wetting
'
],
pDCw
,
boundary_marker
,
1
)})
self
.
outerBC
[
num
].
update
({
'
wetting
'
:
df
.
DirichletBC
(
V
[
'
wetting
'
],
pDCw
,
boundary_marker
,
1
)})
else
:
else
:
if
np
.
abs
(
time
)
<
self
.
tol
:
if
np
.
abs
(
time
)
<
self
.
calc_
tol
:
# time = 0 so the Dolfin Expression has to be created first.
# time = 0 so the Dolfin Expression has to be created first.
pDCw
=
df
.
Expression
(
pDC
[
'
wetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
,
t
=
time
)
pDCw
=
df
.
Expression
(
pDC
[
'
wetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
,
t
=
time
)
pDCnw
=
df
.
Expression
(
pDC
[
'
nonwetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
,
t
=
time
)
pDCnw
=
df
.
Expression
(
pDC
[
'
nonwetting
'
],
domain
=
mesh
,
degree
=
interpolation_degree
,
t
=
time
)
...
@@ -550,13 +625,14 @@ class LDDsimulation(object):
...
@@ -550,13 +625,14 @@ class LDDsimulation(object):
print
(
"
subdomain is an inner subdomain and has no outer boundary.
\n
"
,
print
(
"
subdomain is an inner subdomain and has no outer boundary.
\n
"
,
"
no Dirichlet boundary has been set.
"
)
"
no Dirichlet boundary has been set.
"
)
def
_eval_sources
(
self
,
interpolation_degree
:
int
=
2
,
#
def
_eval_sources
(
self
,
subdomain_index
:
int
,
#
time
:
float
=
0
,
interpolation_degree
:
int
=
2
,
#
subdomain_index
:
int
):
time
:
float
=
0
,
#
):
"""
evaluate time dependent source terms or initialise them if time == 0
"""
evaluate time dependent source terms or initialise them if time == 0
"""
"""
subdomain
=
self
.
subdomain
[
subdomain_index
]
subdomain
=
self
.
subdomain
[
subdomain_index
]
if
np
.
abs
(
time
)
<
self
.
tol
:
if
np
.
abs
(
time
)
<
self
.
calc_
tol
:
# here t = 0 and we have to initialise the sources.
# here t = 0 and we have to initialise the sources.
mesh
=
subdomain
.
mesh
mesh
=
subdomain
.
mesh
V
=
subdomain
.
function_space
V
=
subdomain
.
function_space
...
...
...
...
This diff is collapsed.
Click to expand it.
LDDsimulation/domainPatch.py
+
137
−
150
View file @
8e78757a
This diff is collapsed.
Click to expand it.
RR-2-patch-test-case/RR-2-patch-test.py
+
66
−
51
View file @
8e78757a
...
@@ -183,7 +183,7 @@ dirichletBC = exact_solution
...
@@ -183,7 +183,7 @@ dirichletBC = exact_solution
mesh_resolution
=
3
mesh_resolution
=
3
# initialise LDD simulation class
# initialise LDD simulation class
simulation
=
ldd
.
LDDsimulation
()
simulation
=
ldd
.
LDDsimulation
(
tol
=
1E-12
)
simulation
.
set_parameters
(
output_dir
=
""
,
#
simulation
.
set_parameters
(
output_dir
=
""
,
#
subdomain_def_points
=
subdomain_def_points
,
#
subdomain_def_points
=
subdomain_def_points
,
#
isRichards
=
isRichards
,
#
isRichards
=
isRichards
,
#
...
@@ -211,7 +211,7 @@ domain_marker = simulation.domain_marker
...
@@ -211,7 +211,7 @@ domain_marker = simulation.domain_marker
mesh_subdomain
=
simulation
.
mesh_subdomain
mesh_subdomain
=
simulation
.
mesh_subdomain
# mesh = mesh_subdomain[0]
# mesh = mesh_subdomain[0]
# interface_marker = df.MeshFunction('
size_
t', mesh, mesh.topology().dim()-1)
# interface_marker = df.MeshFunction('
in
t', mesh, mesh.topology().dim()-1)
# interface_marker.set_all(0)
# interface_marker.set_all(0)
# interface = dp.Interface(vertices=interface_def_points[0], #
# interface = dp.Interface(vertices=interface_def_points[0], #
# tol=mesh.hmin()/100,#
# tol=mesh.hmin()/100,#
...
@@ -226,53 +226,68 @@ interface_marker = simulation.interface_marker
...
@@ -226,53 +226,68 @@ interface_marker = simulation.interface_marker
subdoms
=
simulation
.
subdomain
subdoms
=
simulation
.
subdomain
for
iterations
in
range
(
1
):
# df.File('./test_domain_layered_soil.xml.gz') << mesh_subdomain[0]
#
# df.File('./test_domain_mesh.pvd') << mesh_subdomain[0]
df
.
File
(
'
./global_interface_marker.pvd
'
)
<<
interface_marker
a1
=
(
L1
*
u1
*
v1
)
*
dx1
+
(
df
.
inner
(
relative_permeability
(
saturation
(
p1_i
,
1
),
1
)
*
df
.
grad
(
u1
),
df
.
grad
(
v1
)))
*
dx_1
+
(
timestep
*
lambda1
*
u1
*
v1
)
*
ds1
(
1
)
#timestep*
# df.File('./test_subdomain1.xml.gz') << mesh_subdomain[1]
rhs1
=
(
L1
*
p1_i
*
v1
)
*
dx1
-
((
saturation
(
p1_i
,
1
)
-
saturation
(
p1_0
,
1
))
*
v1
)
*
dx1
+
(
timestep
*
(
source1
-
g1_i
)
*
v1
)
*
ds1
(
1
)
# df.File('./test_subdomain2.xml.gz') << mesh_subdomain[2]
rhssplit1
=
(
L1
*
p1_i
*
v1
)
*
dx1
-
((
saturation
(
p1_i
,
1
)
-
saturation
(
p1_0
,
1
))
*
v1
)
*
dx1
df
.
File
(
'
./domain_marker.pvd
'
)
<<
domain_marker
extratrem
=
(
timestep
*
(
source1
-
g1_i
)
*
v1
)
*
ds1
(
1
)
# df.File('./test_domain_layered_soil_solution.pvd') << u
splitrhs
=
df
.
assemble
(
rhssplit1
)
df
.
File
(
'
./subdomain1_interface_marker.pvd
'
)
<<
simulation
.
subdomain
[
1
].
interface_marker
print
(
"
splitrhs:
\n
"
,
splitrhs
.
get_local
())
df
.
File
(
'
./subdomain2_interface_marker.pvd
'
)
<<
simulation
.
subdomain
[
2
].
interface_marker
extrat_assembled
=
df
.
assemble
(
extratrem
)
# df.File('./test_subdomain1_boundary_marker.pvd') << boundary_marker1
print
(
"
extratrem:
\n
"
,
extrat_assembled
.
get_local
())
# df.File('./test_subdomain2_boundary_marker.pvd') << boundary_marker2
added
=
splitrhs
+
extrat_assembled
print
(
"
both added together:
\n
"
,
added
.
get_local
())
simulation
.
LDDsolver
(
time
=
0
)
# df.info(parameters, True)
A1
=
df
.
assemble
(
a1
)
dsform
=
(
timestep
*
lambda1
*
u1
*
v1
)
*
ds1
(
1
)
# for iterations in range(1):
dsform_vec
=
df
.
assemble
(
dsform
)
# #
b1
=
df
.
assemble
(
rhs1
)
#
#p_gamma1.apply(A1,b1)
# a1 = (L1*u1*v1)*dx1 + (df.inner(relative_permeability(saturation(p1_i, 1), 1)*df.grad(u1), df.grad(v1)))*dx_1 + (timestep*lambda1*u1*v1)*ds1(1) #timestep*
# outerBC1.apply(A1,b1)
# rhs1 = (L1*p1_i*v1)*dx1 - ((saturation(p1_i, 1) - saturation(p1_0, 1))*v1)*dx1 + (timestep*(source1 - g1_i)*v1)*ds1(1)
u
=
df
.
Function
(
V1
)
# rhssplit1 = (L1*p1_i*v1)*dx1 - ((saturation(p1_i, 1) - saturation(p1_0, 1))*v1)*dx1
U1
=
u
.
vector
()
# extratrem = (timestep*(source1 - g1_i)*v1)*ds1(1)
df
.
solve
(
A1
,
U1
,
b1
)
# splitrhs = df.assemble(rhssplit1)
# print("Form:\n", A1.array())
# print("splitrhs: \n", splitrhs.get_local())
print
(
"
RHS:
\n
"
,
b1
.
get_local
())
# extrat_assembled = df.assemble(extratrem)
#print("ds term:\n", dsform_vec.array())
# print("extratrem: \n", extrat_assembled.get_local())
# print('solution:\n', U1.get_local())
# added = splitrhs + extrat_assembled
p1_i
.
vector
()[:]
=
U1
# print("both added together:\n", added.get_local())
interface
[
0
].
read_pressure_dofs
(
from_function
=
p1_i
,
#
#
interface_dofs
=
dofs_on_interface1
,
#
# A1 = df.assemble(a1)
dof_to_vert_map
=
dom1_d2v
,
#
# dsform = (timestep*lambda1*u1*v1)*ds1(1)
local_to_parent_vertex_map
=
dom1_parent_vertex_indices
,
#
# dsform_vec = df.assemble(dsform)
phase
=
'
wetting
'
,
#
# b1 = df.assemble(rhs1)
subdomain_ind
=
1
)
# #p_gamma1.apply(A1,b1)
#
# # outerBC1.apply(A1,b1)
# Save mesh to file
# u = df.Function(V1)
df
.
File
(
'
./test_domain_layered_soil.xml.gz
'
)
<<
mesh_subdomain
[
0
]
# U1 = u.vector()
df
.
File
(
'
./test_domain_mesh.pvd
'
)
<<
mesh_subdomain
[
0
]
# df.solve(A1,U1,b1)
df
.
File
(
'
./test_global_interface_marker.pvd
'
)
<<
interface_marker
# # print("Form:\n", A1.array())
df
.
File
(
'
./test_subdomain1.xml.gz
'
)
<<
mesh_subdomain
[
1
]
# print("RHS:\n", b1.get_local())
df
.
File
(
'
./test_subdomain2.xml.gz
'
)
<<
mesh_subdomain
[
2
]
# #print("ds term:\n", dsform_vec.array())
df
.
File
(
'
./test_domain_marker.pvd
'
)
<<
domain_marker
# # print('solution:\n', U1.get_local())
df
.
File
(
'
./test_domain_layered_soil_solution.pvd
'
)
<<
u
# p1_i.vector()[:] = U1
df
.
File
(
'
./test_subdomain1_interface_marker.pvd
'
)
<<
interface_marker1
# interface[0].read_pressure_dofs(from_function = p1_i, #
df
.
File
(
'
./test_subdomain2_interface_marker.pvd
'
)
<<
interface_marker2
# interface_dofs = dofs_on_interface1,#
df
.
File
(
'
./test_subdomain1_boundary_marker.pvd
'
)
<<
boundary_marker1
# dof_to_vert_map = dom1_d2v,#
df
.
File
(
'
./test_subdomain2_boundary_marker.pvd
'
)
<<
boundary_marker2
# local_to_parent_vertex_map = dom1_parent_vertex_indices,#
# phase = 'wetting',#
# subdomain_ind = 1)
# #
# # Save mesh to file
# df.File('./test_domain_layered_soil.xml.gz') << mesh_subdomain[0]
# df.File('./test_domain_mesh.pvd') << mesh_subdomain[0]
# df.File('./test_global_interface_marker.pvd') << interface_marker
# df.File('./test_subdomain1.xml.gz') << mesh_subdomain[1]
# df.File('./test_subdomain2.xml.gz') << mesh_subdomain[2]
# df.File('./test_domain_marker.pvd') << domain_marker
# df.File('./test_domain_layered_soil_solution.pvd') << u
# df.File('./test_subdomain1_interface_marker.pvd') << interface_marker1
# df.File('./test_subdomain2_interface_marker.pvd') << interface_marker2
# df.File('./test_subdomain1_boundary_marker.pvd') << boundary_marker1
# df.File('./test_subdomain2_boundary_marker.pvd') << boundary_marker2
# boundary_marker1 = simulation.subdomain[1].outer_boundary_marker
# boundary_marker1 = simulation.subdomain[1].outer_boundary_marker
# boundary_marker2 = simulation.subdomain[2].outer_boundary_marker
# boundary_marker2 = simulation.subdomain[2].outer_boundary_marker
...
@@ -281,8 +296,8 @@ df.File('./test_subdomain2_boundary_marker.pvd') << boundary_marker2
...
@@ -281,8 +296,8 @@ df.File('./test_subdomain2_boundary_marker.pvd') << boundary_marker2
# ds_1 = simulation.subdomain[1].ds
# ds_1 = simulation.subdomain[1].ds
# ds_2 = simulation.subdomain[2].ds
# ds_2 = simulation.subdomain[2].ds
#
#
# interface_marker1 = simulation.subdomain[1].interface_marker#df.MeshFunction('
size_
t', mesh_subdomain[1], mesh_subdomain[1].topology().dim()-1)
# interface_marker1 = simulation.subdomain[1].interface_marker#df.MeshFunction('
in
t', mesh_subdomain[1], mesh_subdomain[1].topology().dim()-1)
# interface_marker2 = simulation.subdomain[2].interface_marker#df.MeshFunction('
size_
t', mesh_subdomain[2], mesh_subdomain[2].topology().dim()-1)
# interface_marker2 = simulation.subdomain[2].interface_marker#df.MeshFunction('
in
t', mesh_subdomain[2], mesh_subdomain[2].topology().dim()-1)
# # interface_marker1.set_all(0)
# # interface_marker1.set_all(0)
# # interface_marker2.set_all(0)
# # interface_marker2.set_all(0)
# # print(dir(interface_marker1))
# # print(dir(interface_marker1))
...
...
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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!
Save comment
Cancel
Please
sign in
to comment