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