Coverage for kwave/recorder.py: 18%
65 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 dataclasses import dataclass
2from typing import List
4from kwave.data import Array
5from kwave.kgrid import kWaveGrid
8@dataclass
9class Recorder(object):
11 def __init__(self):
12 # flags which control which parameters are recorded
13 self.p = True #: time-varying acoustic pressure
14 self.p_max = False #: maximum pressure over simulation
15 self.p_min = False #: minimum pressure over simulation
16 self.p_rms = False #: root-mean-squared pressure over simulation
17 self.p_max_all = False #: maximum pressure over simulation at all grid points
18 self.p_min_all = False #: minimum pressure over simulation at all grid points
19 self.p_final = False #: final pressure field at all grid points
20 self.u = False #: time-varying particle velocity
21 self.u_split_field = False #: compressional and shear components of time-varying particle velocity
22 self.u_non_staggered = False #: time-varying particle velocity on non-staggered grid
23 self.u_max = False #: maximum particle velocity over simulation
24 self.u_min = False #: minimum particle velocity over simulation
25 self.u_rms = False #: root-mean-squared particle velocity over simulation
26 self.u_max_all = False #: maximum particle velocity over simulation at all grid points
27 self.u_min_all = False #: minimum particle velocity over simulation at all grid points
28 self.u_final = False #: final particle velocity field at all grid points
29 self.I = False #: time-varying acoustic intensity
30 self.I_avg = False #: time-averaged acoustic intensity
32 self.cuboid_corners_list = None
34 self.x1_inside, self.x2_inside = None, None
35 self.y1_inside, self.y2_inside = None, None
36 self.z1_inside, self.z2_inside = None, None
38 def set_flags_from_list(self, flags_list: List[str], is_elastic_code: bool) -> None:
39 """
40 Set Recorder flags that are present in the string list to True
42 Args:
43 flags_list: String list of flags that should be set to True
44 is_elastic_code: Is the simulation elastic
46 Returns:
47 None
48 """
49 # check the contents of the cell array are valid inputs
50 allowed_flags = self.get_allowed_flags(is_elastic_code)
51 for record_element in flags_list:
52 assert record_element in allowed_flags, f'{record_element} is not a valid input for sensor.record'
54 if record_element == 'p': # custom logic for 'p'
55 continue
56 else:
57 setattr(self, record_element, True)
59 # set self.record_p to false if a user input for sensor.record
60 # is given and 'p' is not set (default is true)
61 self.p = ('p' in flags_list)
63 def set_index_variables(self, kgrid: kWaveGrid, pml_size: Array, is_pml_inside: bool, is_axisymmetric: bool) -> None:
64 """
65 Assign the index variables
67 Args:
68 kgrid: kWaveGrid instance
69 pml_size: Size of the PML
70 is_pml_inside: Whether the PML is inside the grid defined by the user
71 is_axisymmetric: Whether the simulation is axisymmetric
73 Returns:
74 None
75 """
76 if not is_pml_inside:
77 self.x1_inside = pml_size.x + 1.0
78 self.x2_inside = kgrid.Nx - pml_size.x
79 if kgrid.dim == 2:
80 if is_axisymmetric:
81 self.y1_inside = 1
82 else:
83 self.y1_inside = pml_size.y + 1.0
84 self.y2_inside = kgrid.Ny - pml_size.y
85 elif kgrid.dim == 3:
86 self.y1_inside = pml_size.y + 1.0
87 self.y2_inside = kgrid.Ny - pml_size.y
88 self.z1_inside = pml_size.z + 1.0
89 self.z2_inside = kgrid.Nz - pml_size.z
90 else:
91 self.x1_inside = 1.0
92 self.x2_inside = kgrid.Nx
93 if kgrid.dim == 2:
94 self.y1_inside = 1.0
95 self.y2_inside = kgrid.Ny
96 if kgrid.dim == 3:
97 self.z1_inside = 1.0
98 self.z2_inside = kgrid.Nz
100 @staticmethod
101 def get_allowed_flags(is_elastic_code):
102 """
103 Get the list of allowed flags for a given simulation type
105 Args:
106 is_elastic_code: Whether the simulation is axisymmetric
108 Returns:
109 List of allowed flags for a given simulation type
110 """
111 allowed_flags = ['p', 'p_max', 'p_min', 'p_rms', 'p_max_all', 'p_min_all', 'p_final',
112 'u', 'u_max', 'u_min', 'u_rms', 'u_max_all', 'u_min_all', 'u_final',
113 'u_non_staggered', 'I', 'I_avg']
114 if is_elastic_code: # pragma: no cover
115 allowed_flags += ['u_split_field']
116 return allowed_flags
118 def is_set(self, attrs: List[str]) -> List[bool]:
119 """
120 Check if the attributes are set
122 Args:
123 attrs: Attributes to check
125 Returns:
126 List of individual boolean results
127 """
128 return [getattr(self, a) for a in attrs]