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