@@ -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