Skip to content

Commit 277019a

Browse files
committed
Add turbulence example
1 parent 49defa4 commit 277019a

File tree

6 files changed

+145
-18
lines changed

6 files changed

+145
-18
lines changed

default.nix

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
, pylint
1717
, pytest
1818
, pytestCheckHook
19+
, turbulence
1920
}:
2021

2122
buildPythonPackage rec {
@@ -46,6 +47,7 @@ buildPythonPackage rec {
4647
pylint
4748
pytest
4849
pytestCheckHook
50+
turbulence
4951
];
5052

5153
preCheck = ''

examples/basic_example.ipynb

+12-3
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,13 @@
9696
"metadata": {},
9797
"outputs": [],
9898
"source": [
99-
"model = PSTD(maximum_frequency=maximum_frequency_target, pml=pml, medium=medium, cfl=0.05, size=[x, y])"
99+
"model = PSTD(\n",
100+
" maximum_frequency=maximum_frequency_target,\n",
101+
" pml=pml,\n",
102+
" medium=medium,\n",
103+
" cfl=None,\n",
104+
" size=[x, y]\n",
105+
")"
100106
]
101107
},
102108
{
@@ -221,10 +227,13 @@
221227
{
222228
"cell_type": "code",
223229
"execution_count": null,
224-
"metadata": {},
230+
"metadata": {
231+
"scrolled": true
232+
},
225233
"outputs": [],
226234
"source": [
227-
"model.run(seconds=0.060)"
235+
"%%prun\n",
236+
"model.run(seconds=0.06)"
228237
]
229238
},
230239
{

examples/turbulence_example.ipynb

+68-9
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"from pstd import PSTD, PML, Medium, Position2D, PointSource\n",
2020
"from pstd import PSTD\n",
2121
"from acoustics import Signal\n",
22+
"from turbulence import Field2D, Gaussian2DTemp\n",
2223
"#import seaborn as sns\n",
2324
"%matplotlib inline"
2425
]
@@ -38,14 +39,65 @@
3839
"metadata": {},
3940
"outputs": [],
4041
"source": [
41-
"x = 30.0\n",
42-
"y = 20.0\n",
42+
"x = 50.0\n",
43+
"y = 40.0\n",
4344
"z = 0.0\n",
4445
"\n",
45-
"c = 343.2\n",
46+
"c_0 = 343.2\n",
4647
"maximum_frequency_target = 200.0"
4748
]
4849
},
50+
{
51+
"cell_type": "markdown",
52+
"metadata": {},
53+
"source": [
54+
"## Turbulent field"
55+
]
56+
},
57+
{
58+
"cell_type": "code",
59+
"execution_count": null,
60+
"metadata": {},
61+
"outputs": [],
62+
"source": [
63+
"f_max = 500.0\n",
64+
"\n",
65+
"f_margin = 1.0\n",
66+
"\n",
67+
"# Amount of modes\n",
68+
"max_mode_order = 100\n",
69+
"# Maximum wavenumber\n",
70+
"k_max = 10.0\n",
71+
"\n",
72+
"wavenumber_resolution = k_max / max_mode_order\n",
73+
"\n",
74+
"# We don't need it for the calculations but we do need it to create an instance.\n",
75+
"spatial_resolution = c_0 / (2.0 * f_max * f_margin)\n",
76+
"\n",
77+
"spectrum = Gaussian2DTemp(\n",
78+
" max_mode_order=max_mode_order,\n",
79+
" wavenumber_resolution=wavenumber_resolution,\n",
80+
" mu_0=3e-2,\n",
81+
" a=1.1,\n",
82+
"# a=0.001,\n",
83+
")\n",
84+
"\n",
85+
"field = Field2D(\n",
86+
" x=x,\n",
87+
" y=y,\n",
88+
" z=y,\n",
89+
" spatial_resolution=spatial_resolution,\n",
90+
" spectrum=spectrum,\n",
91+
")\n",
92+
"\n",
93+
"mu = field.randomize().generate().mu\n",
94+
"\n",
95+
"print(\"Mu shape: {}\".format(mu.shape))\n",
96+
"c = ( mu + 1.0 ) * c_0\n",
97+
"\n",
98+
"field.plot()"
99+
]
100+
},
49101
{
50102
"cell_type": "markdown",
51103
"metadata": {},
@@ -93,7 +145,14 @@
93145
"metadata": {},
94146
"outputs": [],
95147
"source": [
96-
"model = PSTD(maximum_frequency=maximum_frequency_target, pml=pml, medium=medium, cfl=0.05, size=[x, y])"
148+
"model = PSTD(\n",
149+
" maximum_frequency=maximum_frequency_target,\n",
150+
" pml=pml,\n",
151+
" medium=medium,\n",
152+
" cfl=PSTD.maximum_cfl(medium.soundspeed)/2.,\n",
153+
" size=[x, y],\n",
154+
" spacing = spatial_resolution,\n",
155+
")"
97156
]
98157
},
99158
{
@@ -109,7 +168,7 @@
109168
"metadata": {},
110169
"outputs": [],
111170
"source": [
112-
"source_position = Position2D(x/4.0, y/2.0)\n",
171+
"source_position = Position2D(x*2.0/5.0, y/2.0)\n",
113172
"\n",
114173
"source = model.add_object('source', 'PointSource', position=source_position, \n",
115174
" excitation='pulse', quantity='pressure', amplitude=0.1)"
@@ -128,7 +187,7 @@
128187
"metadata": {},
129188
"outputs": [],
130189
"source": [
131-
"receiver_position = Position2D(x*3.0/4.0, y/2.0)\n",
190+
"receiver_position = Position2D(x*3.0/5.0, y/2.0)\n",
132191
"\n",
133192
"receiver = model.add_object('receiver', 'Receiver', position=receiver_position, quantity='pressure')"
134193
]
@@ -189,7 +248,7 @@
189248
"metadata": {},
190249
"outputs": [],
191250
"source": [
192-
"model.run(steps=10)"
251+
"model.run(seconds=0.01)"
193252
]
194253
},
195254
{
@@ -221,14 +280,14 @@
221280
"metadata": {},
222281
"outputs": [],
223282
"source": [
224-
"model.run(steps=500)"
283+
"model.run(seconds=0.03)"
225284
]
226285
},
227286
{
228287
"cell_type": "markdown",
229288
"metadata": {},
230289
"source": [
231-
"as you can see."
290+
"With more steps we now see the effect of the turbulence."
232291
]
233292
},
234293
{

flake.lock

+50
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
inputs.nixpkgs.url = "nixpkgs/nixpkgs-unstable";
55
inputs.utils.url = "github:numtide/flake-utils";
6+
inputs.turbulence.url = "github:FRidh/turbulence";
67

7-
outputs = { self, nixpkgs, utils }: {
8+
outputs = { self, nixpkgs, utils, turbulence }: {
89
overlay = final: prev: {
910
pythonPackagesOverrides = (prev.pythonPackagesOverrides or []) ++ [
1011
(self: super: {
@@ -23,7 +24,7 @@
2324
} // (utils.lib.eachSystem [ "x86_64-linux" ] (system: let
2425
pkgs = (import nixpkgs {
2526
inherit system;
26-
overlays = [ self.overlay ];
27+
overlays = [ self.overlay turbulence.overlay ];
2728
});
2829
python = pkgs.python3;
2930
pstd = python.pkgs.pstd;
@@ -42,4 +43,4 @@
4243
'';
4344
};
4445
}));
45-
}
46+
}

pstd/model.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,7 @@ def __init__(
12201220
maximum_frequency,
12211221
medium=None,
12221222
pml=None,
1223-
cfl=0.05,
1223+
cfl=None,
12241224
spacing=None,
12251225
axes=None,
12261226
size=None,
@@ -1347,11 +1347,17 @@ def cfl(self):
13471347
return self._cfl
13481348

13491349
@cfl.setter
1350-
def cfl(self, x):
1351-
if not x <= np.mean(self.medium.soundspeed) / np.max(self.medium.soundspeed):
1350+
def cfl(self, x=None):
1351+
if x is None:
1352+
x = self.maximum_cfl(self.medium.soundspeed)
1353+
if not x <= self.maximum_cfl(self.medium.soundspeed):
13521354
raise ValueError("CFL too high.")
13531355
self._cfl = x
13541356

1357+
@staticmethod
1358+
def maximum_cfl(soundspeed):
1359+
return np.mean(soundspeed) / np.max(soundspeed)
1360+
13551361
@property
13561362
def constant_field(self):
13571363
"""Constant refractive-index field."""

0 commit comments

Comments
 (0)