Skip to content

Commit d882889

Browse files
committed
Add methods to create kWaveGrid from geometry and domain parameters
- Implemented `from_geometry` method to create a kWaveGrid based on domain size and minimum element width. - Implemented `from_domain` method to create a kWaveGrid using physical dimensions and acoustic properties. - Added input validation for parameters in both methods to ensure positive values.
1 parent b24bfa1 commit d882889

1 file changed

Lines changed: 81 additions & 0 deletions

File tree

kwave/kgrid.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,3 +699,84 @@ def k_dtt(self, dtt_type): # Not tested for correctness!
699699
# define product of implied period
700700
M = Mx * My * Mz
701701
return k, M
702+
703+
@classmethod
704+
def from_geometry(cls, domain_size, min_element_width, points_per_wavelength=10, cfl=None):
705+
"""
706+
Create a kWaveGrid based on domain dimensions and the smallest resolvable geometry element.
707+
708+
Args:
709+
domain_size: List or array of physical domain sizes [m]
710+
min_element_width: Width of the smallest resolvable geometry element [m]
711+
points_per_wavelength: Number of points per wavelength (default=10)
712+
cfl: CFL number (default=cls.CFL_DEFAULT)
713+
714+
Returns:
715+
kWaveGrid instance with appropriate grid size and spacing
716+
"""
717+
# Validate input parameters
718+
domain_size = np.atleast_1d(domain_size)
719+
if not np.all(domain_size > 0):
720+
raise ValueError("Domain dimensions must be positive")
721+
if not min_element_width > 0:
722+
raise ValueError("Minimum element width must be positive")
723+
724+
# Calculate grid spacing based on minimum element width
725+
# Ensure at least points_per_wavelength points across the smallest element
726+
grid_spacing = min_element_width / points_per_wavelength
727+
728+
# Calculate grid size
729+
N = np.ceil(domain_size / grid_spacing).astype(int)
730+
731+
# Create grid instance
732+
grid = cls(N=N, spacing=grid_spacing)
733+
734+
# Note: Time parameters are left as "auto"
735+
# The user can set them later using makeTime method
736+
737+
return grid
738+
739+
@classmethod
740+
def from_domain(cls, dimensions, frequency, sound_speed_min, sound_speed_max=None, points_per_wavelength=10, cfl=None):
741+
"""
742+
Create a kWaveGrid based on physical dimensions and acoustic properties.
743+
744+
Args:
745+
dimensions: List or array of physical domain sizes [m]
746+
frequency: Transmit frequency [Hz]
747+
sound_speed_min: Minimum sound speed in the medium [m/s]
748+
sound_speed_max: Maximum sound speed in the medium [m/s] (default=sound_speed_min)
749+
points_per_wavelength: Number of points per wavelength (default=10)
750+
cfl: CFL number (default=cls.CFL_DEFAULT)
751+
752+
Returns:
753+
kWaveGrid instance with appropriate grid size, spacing, and time parameters
754+
"""
755+
# Validate input parameters
756+
dimensions = np.atleast_1d(dimensions)
757+
if not np.all(dimensions > 0):
758+
raise ValueError("Dimensions must be positive")
759+
if not frequency > 0:
760+
raise ValueError("Frequency must be positive")
761+
if not sound_speed_min > 0:
762+
raise ValueError("Sound speed must be positive")
763+
764+
# Use sound_speed_min for sound_speed_max if not provided
765+
if sound_speed_max is None:
766+
sound_speed_max = sound_speed_min
767+
if sound_speed_max > 0:
768+
raise ValueError("Sound speed must be positive")
769+
770+
# Calculate wavelength
771+
wavelength = sound_speed_min / frequency
772+
773+
# Calculate grid spacing
774+
grid_spacing = wavelength / points_per_wavelength
775+
776+
# Calculate grid size
777+
N = np.ceil(dimensions / grid_spacing).astype(int)
778+
779+
# Create grid instance
780+
grid = cls(N=N, spacing=grid_spacing)
781+
782+
return grid

0 commit comments

Comments
 (0)