Coverage for kwave/kWaveSimulation_helper/set_sound_speed_ref.py: 28%
18 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-24 11:55 -0700
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-24 11:55 -0700
1from kwave import kWaveMedium
2import numpy as np
5def set_sound_speed_ref(medium: kWaveMedium, elastic_code: bool, kspace_elastic_code: bool):
6 """
7 select the reference sound speed used in the k-space operator
8 based on the heterogeneous sound speed map
9 Args:
10 medium:
11 elastic_code:
12 kspace_elastic_code:
14 Returns:
16 """
17 if not elastic_code:
18 return get_ordinary_sound_speed_ref(medium)
19 elif not kspace_elastic_code: # pragma: no cover
20 return get_pstd_elastic_sound_speed_ref(medium)
21 else: # pragma: no cover
22 return get_kspace_elastic_sound_speed_ref(medium)
25def get_ordinary_sound_speed_ref(medium):
26 """
27 calculate the reference sound speed for the fluid code, using the
28 maximum by default which ensures the model is unconditionally stable
29 Args:
30 medium:
32 Returns:
34 """
35 c_ref = _get_sound_speed_ref(medium.sound_speed_ref, medium.sound_speed)
36 print(' reference sound speed: ', c_ref, 'm/s')
37 return c_ref, None, None
40def get_pstd_elastic_sound_speed_ref(medium: kWaveMedium): # pragma: no cover
41 """
42 in the pstd elastic case, the reference sound speed is only used to
43 calculate the PML absorption, so just use the compressional wave speed
44 Args:
45 medium:
47 Returns:
49 """
50 c_ref = _get_sound_speed_ref(medium.sound_speed_ref, medium.sound_speed_compression)
51 print(' reference sound speed: ', c_ref, 'm/s')
52 return c_ref, None, None
55def get_kspace_elastic_sound_speed_ref(medium: kWaveMedium): # pragma: no cover
56 """
57 in the k-space elastic case, there are two reference sound speeds for
58 the compressional and shear waves, so compute them seperately
59 Args:
60 medium:
62 Returns:
64 """
65 c_ref_compression = _get_sound_speed_ref(medium.sound_speed_ref_compression, medium.sound_speed_compression)
66 print(' reference sound speed (compression): ', c_ref_compression, 'm/s')
68 c_ref_shear = _get_sound_speed_ref(medium.sound_speed_ref_shear, medium.sound_speed_shear)
69 print(' reference sound speed (shear): ', c_ref_shear, 'm/s')
71 return None, c_ref_compression, c_ref_shear
74def _get_sound_speed_ref(reference, speed):
75 reductions = {
76 'min': np.min,
77 'max': np.max,
78 'mean': np.mean
79 }
81 if reference is not None:
82 # if reference is defined, check whether it is a scalar or 'reduction'
83 if np.isscalar(reference):
84 c_ref = reference
85 else:
86 c_ref = reductions[reference](speed)
87 else:
88 c_ref = reductions['max'](speed)
90 print(' reference sound speed: ', c_ref, 'm/s')
91 return float(c_ref)