Source code for kwave.kWaveSimulation_helper.data_cast

import logging

from kwave.kmedium import kWaveMedium
from kwave.kgrid import kWaveGrid
from kwave.options.simulation_options import SimulationOptions
from kwave.utils.conversion import cast_to_type
from kwave.utils.dotdictionary import dotdict


[docs] def dataCast(data_cast, medium: kWaveMedium, kgrid: kWaveGrid, opt: SimulationOptions, values: dotdict, flags: dotdict): # NOTE from Farid: this method is not used now. # Therefore, there still exists 'self' calls at the end. # Originally, self was referring to the kWaveSimulation class # update command line status logging.log(logging.INFO, f" casting variables to {data_cast} type...") # create list of variable names used in all dimensions if flags.elastic_code: # pragma: no cover cast_variables = ["dt", "mu", "lambda"] else: cast_variables = ["dt", "kappa", "c0", "rho0"] # create a separate list for indexing variables cast_index_variables = [] # add variables specific to simulations in certain dimensions if kgrid.dim == 1: # variables used in the fluid code cast_variables = cast_variables + ["ddx_k", "shift_pos", "shift_neg", "pml_x", "pml_x_sgx", "rho0_sgx_inv"] elif kgrid.dim == 2: # variables used in both fluid and elastic codes cast_variables = cast_variables + [ "ddx_k_shift_pos", "ddx_k_shift_neg", "pml_x", "pml_y", "pml_x_sgx", "pml_y_sgy", "rho0_sgx_inv", "rho0_sgy_inv", ] # y-dimension shift and derivative variables (these differ between the fluid/elastic code and the axisymmetric code) if flags.axisymmetric: # y-axis variables cast_variables = cast_variables + ["y_vec", "y_vec_sg"] # derivative and shift variables if opt.radial_symmetry in ["WSWA-FFT", "WSWS-FFT", "WS-FFT"]: cast_variables = cast_variables + ["ddy_k", "y_shift_pos", "y_shift_neg"] elif opt.radial_symmetry == "WSWA": cast_variables = cast_variables + ["ddy_k_wswa", "ddy_k_hahs"] elif opt.radial_symmetry == "WSWS": cast_variables = cast_variables + ["ddy_k_wsws", "ddy_k_haha"] else: # derivative and shift variables in the regular code cast_variables = cast_variables + ["ddy_k_shift_pos", "ddy_k_shift_neg"] # extra variables only used in elastic code if flags.elastic_code: # pragma: no cover # variables used in both lossless and lossy case cast_variables = cast_variables + ["mu_sgxy", "mpml_x", "mpml_y", "mpml_x_sgx", "mpml_y_sgy"] # extra variables only used in the lossy case if flags.kelvin_voigt_model: cast_variables = cast_variables + ["chi", "eta", "eta_sgxy"] elif kgrid.dim == 3: # variables used in both fluid and elastic codes cast_variables = cast_variables + [ "ddx_k_shift_pos", "ddy_k_shift_pos", "ddz_k_shift_pos", "ddx_k_shift_neg", "ddy_k_shift_neg", "ddz_k_shift_neg", "pml_x", "pml_y", "pml_z", "pml_x_sgx", "pml_y_sgy", "pml_z_sgz", "rho0_sgx_inv", "rho0_sgy_inv", "rho0_sgz_inv", ] # extra variables only used in elastic code if flags.elastic_code: # pragma: no cover # variables used in both lossless and lossy case cast_variables = cast_variables + [ "mu_sgxy", "mu_sgxz", "mu_sgyz", "mpml_x", "mpml_y", "mpml_z", "mpml_x_sgx", "mpml_y_sgy", "mpml_z_sgz", ] # extra variables only used in the lossy case if flags.kelvin_voigt_model: cast_variables = cast_variables + ["chi", "eta", "eta_sgxy", "eta_sgxz", "eta_sgyz"] # add sensor mask variables if flags.use_sensor: cast_index_variables += ["sensor_mask_index"] if flags.binary_sensor_mask and (values.record.u_non_staggered or values.record.I or values.record.I_avg): if kgrid.dim == 1: cast_index_variables += ["record.x_shift_neg"] elif kgrid.dim == 2: cast_index_variables += ["record.x_shift_neg", "record.y_shift_neg"] elif kgrid.dim == 3: cast_index_variables += ["record.x_shift_neg", "record.y_shift_neg", "record.z_shift_neg"] # additional variables only used if the medium is absorbing if values.equation_of_state == "absorbing": cast_variables += ["absorb_nabla1", "absorb_nabla2", "absorb_eta", "absorb_tau"] # additional variables only used if the propagation is nonlinear if medium.is_nonlinear(): cast_variables += ["medium.BonA"] # additional variables only used if there is an initial pressure source if flags.source_p0: cast_variables += ["source.p0"] # additional variables only used if there is a time varying pressure source term if flags.source_p: cast_variables += ["source.p"] cast_index_variables += ["p_source_pos_index"] if flags.source_p_labelled: cast_index_variables += ["p_source_sig_index"] # additional variables only used if there is a time varying velocity source term if flags.source_ux or flags.source_uy or flags.source_uz: cast_index_variables += ["u_source_pos_index"] if self.source_u_labelled: # noqa: F821 cast_index_variables += ["u_source_sig_index"] if flags.source_ux: cast_variables += ["source.ux"] if flags.source_uy: cast_variables += ["source.uy"] if flags.source_uz: cast_variables += ["source.uz"] # additional variables only used if there is a time varying stress source term if flags.source_sxx or flags.source_syy or flags.source_szz or flags.source_sxy or flags.source_sxz or flags.source_syz: cast_index_variables += ["s_source_pos_index"] if flags.source_s_labelled: cast_index_variables += ["s_source_sig_index"] if flags.source_sxx: cast_variables += ["source.sxx"] if flags.source_syy: cast_variables += ["source.syy"] if flags.source_szz: cast_variables += ["source.szz"] if flags.source_sxy: cast_variables += ["source.sxy"] if flags.source_sxz: cast_variables += ["source.sxz"] if flags.source_syz: cast_variables += ["source.syz"] # addition variables only used if there is a transducer source if flags.transducer_source: cast_variables += ["transducer_input_signal"] cast_index_variables += ["u_source_pos_index", "delay_mask", "self.transducer_source", "transducer_transmit_apodization"] # addition variables only used if there is a transducer sensor with an elevation focus if flags.transducer_sensor and flags.transducer_receive_elevation_focus: cast_index_variables += ["sensor_data_buffer", "transducer_receive_mask"] # additional variables only used with nonuniform grids if flags.nonuniform_grid: if kgrid.dim == 1: cast_index_variables += ["kgrid.dxudxn"] elif kgrid.dim == 2: cast_index_variables += ["kgrid.dxudxn", "kgrid.dyudyn"] elif kgrid.dim == 3: cast_index_variables += ["kgrid.dxudxn", "kgrid.dyudyn", "kgrid.dzudzn"] # additional variables only used for Cartesian sensor masks with linear interpolation if flags.use_sensor and not flags.binary_sensor_mask and not flags.time_rev: if kgrid.dim == 1: cast_variables += ["record.grid_x", "record.sensor_x"] else: cast_variables += ["record.tri", "record.bc"] # additional variables only used in 2D if sensor directivity is defined if flags.compute_directivity: cast_variables += ["sensor.directivity_angle", "sensor.directivity_unique_angles", "sensor.directivity_wavenumbers"] # cast variables for cast_var in cast_variables: if "." in cast_var: part1, part2 = cast_var.split(".") subdict = getattr(self, part1) # noqa: F821 subdict[part2] = cast_to_type(subdict[part2], data_cast) else: setattr(self, cast_var, cast_to_type(getattr(self, cast_var), data_cast)) # noqa: F821 # cast index variables only if casting to the GPU if data_cast.startswith("kWaveGPU"): raise NotImplementedError