[docs]defcreate_absorption_variables(kgrid:kWaveGrid,medium:kWaveMedium,equation_of_state):# define the lossy derivative operators and proportionality coefficientsifequation_of_state=="absorbing":returncreate_absorbing_medium_variables(kgrid.k,medium)elifequation_of_state=="stokes":returncreate_stokes_medium_variables(medium)else:raiseNotImplementedError
[docs]defcreate_absorbing_medium_variables(kgrid_k,medium:kWaveMedium):# convert the absorption coefficient to nepers.(rad/s)^-y.m^-1medium.alpha_coeff=db2neper(medium.alpha_coeff,medium.alpha_power)absorb_nabla1,absorb_tau=get_absorbtion(kgrid_k,medium)absorb_nabla2,absorb_eta=get_dispersion(kgrid_k,medium)absorb_nabla1,absorb_nabla2=apply_alpha_filter(medium,absorb_nabla1,absorb_nabla2)returnabsorb_nabla1,absorb_nabla2,absorb_tau,absorb_eta
[docs]defcreate_stokes_medium_variables(medium:kWaveMedium):# convert the absorption coefficient to nepers.(rad/s)^-2.m^-1medium.alpha_coeff=db2neper(medium.alpha_coeff,2)# compute the absorbing coefficientabsorb_tau=compute_absorbing_coeff(medium)returnNone,None,absorb_tau,None
[docs]defget_absorbtion(kgrid_k,medium):# compute the absorbing fractional Laplacian operator and coefficientifmedium.alpha_mode=="no_absorption":return0,0nabla1=kgrid_k**(medium.alpha_power-2)nabla1[np.isinf(nabla1)]=0nabla1=np.fft.ifftshift(nabla1)tau=compute_absorbing_coeff(medium)returnnabla1,tau
[docs]defget_dispersion(kgrid_k,medium):# compute the dispersive fractional Laplacian operator and coefficientifmedium.alpha_mode=="no_dispersion":return0,0nabla2=kgrid_k**(medium.alpha_power-1)nabla2[np.isinf(nabla2)]=0nabla2=np.fft.ifftshift(nabla2)eta=compute_dispersive_coeff(medium)returnnabla2,eta
[docs]defcompute_absorbing_coeff(medium):tau=-2*medium.alpha_coeff*(medium.sound_speed**(medium.alpha_power-1))# modify the sign of the absorption operator if alpha_sign is defined# (this is used for time-reversal photoacoustic image reconstruction# with absorption compensation)ifmedium.alpha_signisnotNone:tau=np.sign(medium.alpha_sign[0])*taureturntau
[docs]defcompute_dispersive_coeff(medium):eta=2*medium.alpha_coeff*medium.sound_speed**(medium.alpha_power)*math.tan(math.pi*medium.alpha_power/2)# modify the sign of the absorption operator if alpha_sign is defined# (this is used for time-reversal photoacoustic image reconstruction# with absorption compensation)ifmedium.alpha_signisnotNone:eta=np.sign(medium.alpha_sign[1])*etareturneta
[docs]defapply_alpha_filter(medium,nabla1,nabla2):# pre-filter the absorption parameters if alpha_filter is defined (this# is used for time-reversal photoacoustic image reconstruction# with absorption compensation)ifmedium.alpha_filterisNone:returnnabla1,nabla2# update command line statuslogging.log(logging.INFO," filtering absorption variables...")# frequency shift the absorption parametersnabla1=np.fft.fftshift(nabla1)nabla2=np.fft.fftshift(nabla2)# apply the filternabla1=nabla1*medium.alpha_filternabla2=nabla2*medium.alpha_filter# shift the parameters backnabla1=np.fft.ifftshift(nabla1)nabla2=np.fft.ifftshift(nabla2)returnnabla1,nabla2