Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Alexander Reinauer
pystencils
Commits
59caa88a
Commit
59caa88a
authored
Apr 02, 2020
by
Alexander Reinauer
Browse files
NoFlux Boundary condition of Michael
parent
1d6d60ad
Pipeline
#22994
failed with stage
in 10 minutes and 49 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Sidebyside
pystencils/boundaries/boundaryconditions.py
View file @
59caa88a
from
typing
import
Any
,
List
,
Tuple
import
pystencils
as
ps
import
sympy
as
sp
import
numpy
as
np
from
pystencils
import
Assignment
from
pystencils.boundaries.boundaryhandling
import
BoundaryOffsetInfo
from
pystencils.data_types
import
create_type
...
...
@@ 111,3 +114,42 @@ class Dirichlet(Boundary):
assert
len
(
self
.
_value
)
==
field
.
index_shape
[
0
],
"Dirichlet value does not match index shape of field"
return
[
Assignment
(
field
(
i
),
self
.
_value
[
i
])
for
i
in
range
(
field
.
index_shape
[
0
])]
raise
NotImplementedError
(
"Dirichlet boundary not implemented for fields with more than one index dimension"
)
class
NoFlux
(
Boundary
):
inner_or_boundary
=
True
# call the boundary condition with the fluid cell
single_link
=
False
# needs to be called for all directional fluxes
def
__init__
(
self
,
stencil
):
self
.
stencil
=
stencil
def
__call__
(
self
,
field
,
direction_symbol
,
**
kwargs
):
assert
ps
.
FieldType
.
is_staggered
(
field
)
assert
all
([
s
==
0
for
s
in
self
.
stencil
[
0
]])
accesses
=
[
field
.
staggered_vector_access
(
ps
.
stencil
.
offset_to_direction_string
(
d
))
for
d
in
self
.
stencil
[
1
:]]
conds
=
[
sp
.
Equality
(
direction_symbol
,
d
+
1
)
for
d
in
range
(
len
(
accesses
))]
val
=
sp
.
Matrix
(
np
.
zeros
(
accesses
[
0
].
shape
,
dtype
=
int
))
# use conditional
conditional
=
None
for
a
,
c
in
zip
(
accesses
,
conds
):
assignments
=
[]
for
i
in
range
(
len
(
a
)):
if
type
(
a
[
i
])
is
sp
.
Mul
and
a
[
i
].
args
[
0
]
==

1
:
continue
# this will be written by the neighboring cell
else
:
assignments
.
append
(
ps
.
Assignment
(
a
[
i
],
val
[
i
]))
if
len
(
assignments
)
>
0
:
conditional
=
ps
.
astnodes
.
Conditional
(
ps
.
data_types
.
type_all_numbers
(
c
,
"int"
),
ps
.
astnodes
.
Block
(
assignments
),
conditional
)
return
[
conditional
]
def
__hash__
(
self
):
return
hash
((
NoFlux
,
self
.
stencil
))
def
__eq__
(
self
,
other
):
return
type
(
other
)
==
NoFlux
and
other
.
stencil
==
self
.
stencil
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