fixed LG+CC spectral density calculation for omega=0; closes #118

This commit is contained in:
Dominik Demuth 2023-09-08 17:54:27 +02:00
parent a406908a69
commit b8bab2af7b
2 changed files with 15 additions and 13 deletions

View File

@ -54,6 +54,9 @@ class ColeCole(Distribution):
tau (array_like): tau (array_like):
alpha (float): alpha (float):
""" """
if alpha == 1:
return tau / (1 + omega**2 * tau**2)
omtau = (omega*tau)**alpha omtau = (omega*tau)**alpha
return np.sin(alpha*np.pi/2) * omtau / (1 + omtau**2 + 2*np.cos(alpha*np.pi/2)*omtau) / omega return np.sin(alpha*np.pi/2) * omtau / (1 + omtau**2 + 2*np.cos(alpha*np.pi/2)*omtau) / omega

View File

@ -5,6 +5,7 @@ from typing import Callable
import numpy as np import numpy as np
from scipy import LowLevelCallable from scipy import LowLevelCallable
from scipy.special import erf
from nmreval.lib.utils import ArrayLike from nmreval.lib.utils import ArrayLike
@ -32,7 +33,7 @@ class LogGaussian(Distribution):
return np.exp(-0.5*(np.log(tau/tau0)/sigma)**2)/np.sqrt(2*np.pi)/sigma return np.exp(-0.5*(np.log(tau/tau0)/sigma)**2)/np.sqrt(2*np.pi)/sigma
@staticmethod @staticmethod
def correlation(t, tau0, sigma: float): def correlation(t: ArrayLike, tau0: ArrayLike, sigma: float):
_t = np.atleast_1d(t) _t = np.atleast_1d(t)
_tau = np.atleast_1d(tau0) _tau = np.atleast_1d(tau0)
@ -44,7 +45,7 @@ class LogGaussian(Distribution):
return res.squeeze() return res.squeeze()
@staticmethod @staticmethod
def susceptibility(omega, tau0, sigma: float): def susceptibility(omega: ArrayLike, tau0: ArrayLike, sigma: float):
_omega = np.atleast_1d(omega) _omega = np.atleast_1d(omega)
_tau = np.atleast_1d(tau0) _tau = np.atleast_1d(tau0)
@ -68,6 +69,7 @@ class LogGaussian(Distribution):
ret_val = _integration_parallel(_omega, _tau, sigma, _integrate_process_imag) ret_val = _integration_parallel(_omega, _tau, sigma, _integrate_process_imag)
ret_val /= _omega[:, None] ret_val /= _omega[:, None]
ret_val[_omega == 0, :] = tau[None, :] * np.exp(sigma**2 / 2)
return ret_val.squeeze() return ret_val.squeeze()
@ -113,18 +115,16 @@ def _integrate_susc_c(lowfunc, highfunc, omega, tau, sigma):
return res return res
def _integrate_process_imag(args): def _integrate_process_imag(omega, tau, sigma):
omega_i, tau_j, sigma = args area = quad(_integrand_freq_imag_high, 0, 50, args=(omega, tau, sigma), epsabs=1e-12, epsrel=1e-12)[0]
area = quad(_integrand_freq_imag_high, 0, 50, args=(omega_i, tau_j, sigma), epsabs=1e-12, epsrel=1e-12)[0] area += quad(_integrand_freq_imag_low, -50, 0, args=(omega, tau, sigma), epsabs=1e-12, epsrel=1e-12)[0]
area += quad(_integrand_freq_imag_low, -50, 0, args=(omega_i, tau_j, sigma), epsabs=1e-12, epsrel=1e-12)[0]
return area return area
def _integrate_process_real(args): def _integrate_process_real(omega: float, tau: float, sigma: float):
omega_i, tau_j, sigma = args area = quad(_integrand_freq_real_high, 0, 50, args=(omega, tau, sigma))[0]
area = quad(_integrand_freq_real_high, 0, 50, args=(omega_i, tau_j, sigma))[0] area += quad(_integrand_freq_real_low, -50, 0, args=(omega, tau, sigma))[0]
area += quad(_integrand_freq_real_low, -50, 0, args=(omega_i, tau_j, sigma))[0]
return area return area
@ -145,9 +145,8 @@ def _integrate_correlation_c(t, tau, sigma):
return res return res
def _integrate_process_time(args): def _integrate_process_time(omega, tau, sigma):
omega_i, tau_j, sigma = args return quad(_integrand_time, -50, 50, args=(omega, tau, sigma), epsabs=1e-12, epsrel=1e-12)[0]
return quad(_integrand_time, -50, 50, args=(omega_i, tau_j, sigma), epsabs=1e-12, epsrel=1e-12)[0]
def _integrand_time(u, t, tau, sigma): def _integrand_time(u, t, tau, sigma):