src.acoustools.BEM.Stiffness

 1import torch
 2from acoustools.BEM.Force import BEM_compute_force
 3from acoustools.Utilities import create_points, TRANSDUCERS
 4from acoustools.Constants import V
 5import acoustools.Constants as c
 6
 7from torch import Tensor
 8from vedo import Mesh
 9
10def stiffness_finite_differences_BEM(activations:Tensor, points:Tensor, board:Tensor|None=None, scatterer:Mesh = None, path=None, H=None, V=V, delta= 0.001, 
11                                    p_ref=c.P_ref,k=c.k, transducer_radius=c.radius, 
12                                    medium_density=c.p_0, medium_speed = c.c_0, particle_density = c.p_p, particle_speed = c.c_p):
13    '''
14    Computes the stiffness at a point as the gradient of the force. Force computed analytically and then finite differences used to find the gradient \n
15    Computed as `-1* (Fx + Fy + Fz)` where `Fa` is the gradient of force in that direction \n 
16    :param activation: Hologram
17    :param points: Points of interest
18    :param board: Transducers to use
19    :param delta: finite differences step size
20    
21    '''
22
23    if board is None:
24        board = TRANSDUCERS
25
26    dx = create_points(1,1,delta,0,0)
27    dy = create_points(1,1,0,delta,0)
28    dz = create_points(1,1,0,0,delta)
29
30    Fx1 = BEM_compute_force(activations,points + dx,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[0]
31    Fx2 = BEM_compute_force(activations,points - dx,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[0]
32
33    Fx = ((Fx1 - Fx2) / (2*delta))
34
35    Fy1 = BEM_compute_force(activations,points + dy,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[1]
36    Fy2 = BEM_compute_force(activations,points - dy,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[1]
37
38    Fy = ((Fy1 - Fy2) / (2*delta))
39
40    Fz1 = BEM_compute_force(activations,points + dz,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[2]
41    Fz2 = BEM_compute_force(activations,points - dz,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[2]
42    
43    Fz = ((Fz1 - Fz2) / (2*delta))
44
45    return -1* (Fx + Fy + Fz)
def stiffness_finite_differences_BEM( activations: torch.Tensor, points: torch.Tensor, board: torch.Tensor | None = None, scatterer: vedo.mesh.Mesh = None, path=None, H=None, V=4.188790204666667e-09, delta=0.001, p_ref=3.4000000000000004, k=732.7329804081634, transducer_radius=0.0045, medium_density=1.2, medium_speed=343, particle_density=29.36, particle_speed=1052):
11def stiffness_finite_differences_BEM(activations:Tensor, points:Tensor, board:Tensor|None=None, scatterer:Mesh = None, path=None, H=None, V=V, delta= 0.001, 
12                                    p_ref=c.P_ref,k=c.k, transducer_radius=c.radius, 
13                                    medium_density=c.p_0, medium_speed = c.c_0, particle_density = c.p_p, particle_speed = c.c_p):
14    '''
15    Computes the stiffness at a point as the gradient of the force. Force computed analytically and then finite differences used to find the gradient \n
16    Computed as `-1* (Fx + Fy + Fz)` where `Fa` is the gradient of force in that direction \n 
17    :param activation: Hologram
18    :param points: Points of interest
19    :param board: Transducers to use
20    :param delta: finite differences step size
21    
22    '''
23
24    if board is None:
25        board = TRANSDUCERS
26
27    dx = create_points(1,1,delta,0,0)
28    dy = create_points(1,1,0,delta,0)
29    dz = create_points(1,1,0,0,delta)
30
31    Fx1 = BEM_compute_force(activations,points + dx,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[0]
32    Fx2 = BEM_compute_force(activations,points - dx,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[0]
33
34    Fx = ((Fx1 - Fx2) / (2*delta))
35
36    Fy1 = BEM_compute_force(activations,points + dy,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[1]
37    Fy2 = BEM_compute_force(activations,points - dy,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[1]
38
39    Fy = ((Fy1 - Fy2) / (2*delta))
40
41    Fz1 = BEM_compute_force(activations,points + dz,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[2]
42    Fz2 = BEM_compute_force(activations,points - dz,board=board,scatterer=scatterer, path=path, H=H, V=V, p_ref=p_ref, transducer_radius=transducer_radius, medium_density=medium_density, medium_speed=medium_speed, particle_density=particle_density, particle_speed=particle_speed)[2]
43    
44    Fz = ((Fz1 - Fz2) / (2*delta))
45
46    return -1* (Fx + Fy + Fz)

Computes the stiffness at a point as the gradient of the force. Force computed analytically and then finite differences used to find the gradient

Computed as -1* (Fx + Fy + Fz) where Fa is the gradient of force in that direction

Parameters
  • activation: Hologram
  • points: Points of interest
  • board: Transducers to use
  • delta: finite differences step size