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
irp
Fresnel
Commits
e2f3056d
Commit
e2f3056d
authored
Nov 26, 2020
by
Leon Merten Lohse
Browse files
Merge branch 'master' of gitlab.gwdg.de:irp/fresnel
parents
c0aa297c
2676e61d
Changes
1
Hide whitespace changes
Inline
Side-by-side
fresnel/solver.py
View file @
e2f3056d
import
numpy
as
np
import
_solver
_k
=
2
*
np
.
pi
# all lengths are in units of the wavelength
class
Solver2d
():
...
...
@@ -9,157 +9,157 @@ class Solver2d():
Solver for 2d PDEs of the form
u_z = A * u_xx + F * u
"""
dtype
=
np
.
complex128
def
__init__
(
self
,
A0
,
F0
,
u0
,
dz
,
dx
):
self
.
_nx
=
u0
.
shape
[
-
1
]
self
.
_ones
=
np
.
ones
((
self
.
_nx
,),
dtype
=
self
.
dtype
)
self
.
_boundary_slice
=
np
.
zeros_like
(
self
.
_ones
)
self
.
u
=
u0
*
self
.
_ones
self
.
dx
=
dx
self
.
dz
=
dz
self
.
_compute_coefficients
(
A0
,
F0
)
def
_compute_coefficients
(
self
,
A
,
F
):
self
.
rx
=
A
*
self
.
dz
/
(
2.
*
self
.
dx
**
2
)
*
self
.
_ones
self
.
rc
=
F
*
self
.
dz
/
2.
*
self
.
_ones
def
step
(
self
,
A
,
F
,
boundary
):
up
=
self
.
u
rxp
=
self
.
rx
rcp
=
self
.
rc
self
.
_compute_coefficients
(
A
,
F
)
u
=
self
.
_boundary_slice
rx
=
self
.
rx
rc
=
self
.
rc
# set boundary values
u
[
0
]
=
boundary
[
0
]
u
[
-
1
]
=
boundary
[
1
]
self
.
u
=
_solver
.
step_AF
(
up
,
rxp
,
rcp
,
u
,
rx
,
rc
)
return
self
.
u
class
Propagator2d
(
Solver2d
):
def
__init__
(
self
,
n0
,
u0
,
dz
,
dx
):
A
,
F
=
self
.
_compute_helmholtz_coefficients
(
n0
)
super
().
__init__
(
A
,
F
,
u0
,
dz
,
dx
)
def
_compute_helmholtz_coefficients
(
self
,
n
):
A
=
-
1j
/
(
2.
*
_k
)
F
=
-
1j
*
_k
*
(
n
*
n
-
1
)
/
2
return
A
,
F
def
step
(
self
,
n
,
boundary
):
A
,
F
=
self
.
_compute_helmholtz_coefficients
(
n
)
return
super
().
step
(
A
,
F
,
boundary
)
class
Solver3d
():
"""
Solver for equations of the form
u_z = A * u_xx + C * u_yy + F * u
Abbreviations:
'rx' : A * dz / dx**2
'rc' : C * dz / dy**2
'rf : F * dz / 2
"""
dtype
=
np
.
complex128
def
__init__
(
self
,
A0
,
F0
,
u0
,
dz
,
dy
,
dx
):
self
.
_nx
=
u0
.
shape
[
-
1
]
self
.
_ny
=
u0
.
shape
[
-
2
]
self
.
_ones
=
np
.
ones
((
self
.
_ny
,
self
.
_nx
,),
dtype
=
self
.
dtype
)
self
.
_boundary_slice
=
np
.
zeros_like
(
self
.
_ones
)
self
.
u
=
u0
*
self
.
_ones
self
.
dx
=
dx
self
.
dy
=
dy
self
.
dz
=
dz
self
.
_compute_coefficients
(
A0
,
F0
)
def
_compute_coefficients
(
self
,
A
,
F
):
self
.
rx
=
A
*
self
.
dz
/
(
2.
*
self
.
dx
*
self
.
dx
)
*
self
.
_ones
self
.
ry
=
A
*
self
.
dz
/
(
2.
*
self
.
dy
*
self
.
dy
)
*
self
.
_ones
self
.
rc
=
F
*
self
.
dz
/
4.
*
self
.
_ones
def
step
(
self
,
A
,
F
,
boundary
):
up
=
self
.
u
rxp
=
self
.
rx
ryp
=
self
.
ry
rcp
=
self
.
rc
self
.
_compute_coefficients
(
A
,
F
)
u
=
self
.
_boundary_slice
rx
=
self
.
rx
ry
=
self
.
ry
rc
=
self
.
rc
# set boundary values
u
[
0
,:]
=
boundary
[
0
]
u
[
-
1
,:]
=
boundary
[
1
]
u
[:,
0
]
=
boundary
[
2
]
u
[:,
-
1
]
=
boundary
[
3
]
self
.
u
=
_solver
.
step_ACF
(
up
,
rxp
,
ryp
,
rcp
,
u
,
rx
,
ry
,
rc
)
return
self
.
u
class
Propagator3d
(
Solver3d
):
def
__init__
(
self
,
n0
,
u0
,
dz
,
dy
,
dx
):
A
,
F
=
self
.
_compute_helmholtz_coefficients
(
n0
)
super
().
__init__
(
A
,
F
,
u0
,
dz
,
dy
,
dx
)
def
_compute_helmholtz_coefficients
(
self
,
n
):
A
=
-
1j
/
(
2.
*
_k
)
F
=
-
1j
*
_k
*
(
n
*
n
-
1
)
/
2
return
A
,
F
def
step
(
self
,
n
,
boundary
):
A
,
F
=
self
.
_compute_helmholtz_coefficients
(
n
)
return
super
().
step
(
A
,
F
,
boundary
)
\ No newline at end of file
return
super
().
step
(
A
,
F
,
boundary
)
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