Source code for kwave.recorder

from dataclasses import dataclass
from typing import List

from kwave.data import Vector
from kwave.kgrid import kWaveGrid


[docs] @dataclass class Recorder(object):
[docs] def __init__(self): # flags which control which parameters are recorded self.p = True #: time-varying acoustic pressure self.p_max = False #: maximum pressure over simulation self.p_min = False #: minimum pressure over simulation self.p_rms = False #: root-mean-squared pressure over simulation self.p_max_all = False #: maximum pressure over simulation at all grid points self.p_min_all = False #: minimum pressure over simulation at all grid points self.p_final = False #: final pressure field at all grid points self.u = False #: time-varying particle velocity self.u_split_field = False #: compressional and shear components of time-varying particle velocity self.u_non_staggered = False #: time-varying particle velocity on non-staggered grid self.u_max = False #: maximum particle velocity over simulation self.u_min = False #: minimum particle velocity over simulation self.u_rms = False #: root-mean-squared particle velocity over simulation self.u_max_all = False #: maximum particle velocity over simulation at all grid points self.u_min_all = False #: minimum particle velocity over simulation at all grid points self.u_final = False #: final particle velocity field at all grid points self.I = False #: time-varying acoustic intensity self.I_avg = False #: time-averaged acoustic intensity self.cuboid_corners_list = None self.x1_inside, self.x2_inside = None, None self.y1_inside, self.y2_inside = None, None self.z1_inside, self.z2_inside = None, None
[docs] def set_flags_from_list(self, flags_list: List[str], is_elastic_code: bool) -> None: """ Set Recorder flags that are present in the string list to True Args: flags_list: String list of flags that should be set to True is_elastic_code: Is the simulation elastic Returns: None """ # check the contents of the cell array are valid inputs allowed_flags = self.get_allowed_flags(is_elastic_code) for record_element in flags_list: assert record_element in allowed_flags, f"{record_element} is not a valid input for sensor.record" if record_element == "p": # custom logic for 'p' continue else: setattr(self, record_element, True) # set self.record_p to false if a user input for sensor.record # is given and 'p' is not set (default is true) self.p = "p" in flags_list
[docs] def set_index_variables(self, kgrid: kWaveGrid, pml_size: Vector, is_pml_inside: bool, is_axisymmetric: bool) -> None: """ Assign the index variables Args: kgrid: kWaveGrid instance pml_size: Size of the PML is_pml_inside: Whether the PML is inside the grid defined by the user is_axisymmetric: Whether the simulation is axisymmetric Returns: None """ if not is_pml_inside: self.x1_inside = pml_size.x + 1.0 self.x2_inside = kgrid.Nx - pml_size.x if kgrid.dim == 2: if is_axisymmetric: self.y1_inside = 1 else: self.y1_inside = pml_size.y + 1.0 self.y2_inside = kgrid.Ny - pml_size.y elif kgrid.dim == 3: self.y1_inside = pml_size.y + 1.0 self.y2_inside = kgrid.Ny - pml_size.y self.z1_inside = pml_size.z + 1.0 self.z2_inside = kgrid.Nz - pml_size.z else: self.x1_inside = 1.0 self.x2_inside = kgrid.Nx if kgrid.dim == 2: self.y1_inside = 1.0 self.y2_inside = kgrid.Ny if kgrid.dim == 3: self.z1_inside = 1.0 self.z2_inside = kgrid.Nz
[docs] @staticmethod def get_allowed_flags(is_elastic_code): """ Get the list of allowed flags for a given simulation type Args: is_elastic_code: Whether the simulation is axisymmetric Returns: List of allowed flags for a given simulation type """ allowed_flags = [ "p", "p_max", "p_min", "p_rms", "p_max_all", "p_min_all", "p_final", "u", "u_max", "u_min", "u_rms", "u_max_all", "u_min_all", "u_final", "u_non_staggered", "I", "I_avg", ] if is_elastic_code: # pragma: no cover allowed_flags += ["u_split_field"] return allowed_flags
[docs] def is_set(self, attrs: List[str]) -> List[bool]: """ Check if the attributes are set Args: attrs: Attributes to check Returns: List of individual boolean results """ return [getattr(self, a) for a in attrs]