References

Considering the computational efficiency and user-friendly environment, the GeoNDT software is developed using a dual layer/hybrid Python and Fortran environment to benefit from the strengths of the two languages, as follows: a) Fortran is a compiled language; it is closer to the material architecture it is executed on; it benefits from established mathematical libraries and thus compensates for the lower computational performance of interpreted languages such as Python under CPU intensive tasks; b) Python is a user-friendly language; it has a wide support online; it has a rich set of high-quality scientific computational libraries and frameworks; and it offers improved code reusability, faster and cost-effective development. The detailed discription of the functions in GeoNDT can be found in following reference:

one_phase_dynamic

one_phase_dynamic function is used to study the wave propagation and dynamic response in one-phase material. The inputs of this function is listed as follows:

parameter tmin:A mandatory (floating) parameter that defines the minimum time (s)
parameter tmax:A mandatory (floating) parameter that defines the maximum time (s)
parameter tlin:A mandatory (integer) parameter that defines the number of points within the maximum and minimum time
parameter E:A mandatory (floating) list that defines the Young’s modulus (Pa) for all layers
parameter mu:A mandatory (floating) list that defines the Poisson’s ratio for all layers
parameter rho:A mandatory (floating) list that defines the density (kg/m^3) for all layers
parameter H:A mandatory (floating) list that defines the thickness (m) for all layers
parameter r:A mandatory (floating) parameter that defines the radius (m) of the location of interest
parameter rmax:A mandatory (floating) parameter that defines the maximum radius (m) of the domain
parameter node:A mandatory (integer) parameter that spesfies the ID of the output node (for instance, the ‘node’ for surface vertical displacement is 2)
parameter loc:An optioanl (integer) parameter that defines the ID of the input load (for instance, the ‘loc’ for surface vertical load is 2)
parameter st:An optional (integer) parameter (either 0 or 1) that defined the output type, where 0 represnts displacement and 1 represents stress output
parameter m_num:
 An optional (integer) parameter that defines the number of modes in the Fourier-Bessel series
parameter lap_num:
 An optional (integer) parameter that defines the number of iteration in the inverse Laplace transform
parameter a1:An optional (integer) parameter that defines (m) the radius on the contact area between external load and domain
parameter ncore:
 An optional (integer) parameter that defines the number of cores (-1 is used in default to use all available cores)

one_phase_dispersion

one_phase_dynamic function is used to perform dispersion analysis of one-phase material with the last layer as infinite half space. The inputs of this function is listed as follows:

parameter f1:A mandatory (floating) parameter that defines the lower bound of frequency (Hz)
parameter f2:A mandatory (floating) parameter that defines the upper bound frequency (Hz)
parameter flin:A mandatory (integer) parameter that defines the number of points within the lower and upper bound of frequency
parameter E:A mandatory (floating) list that defines the Young’s modulus (Pa) for all layers
parameter mu:A mandatory (floating) list that defines the Poisson’s ratio for all layers
parameter rho:A mandatory (floating) list that defines the density (kg/m^3) for all layers
parameter H:A mandatory (floating) list that defines the thickness (m) for all layers
parameter ncore:
 An optional (integer) parameter that defines the number of cores (-1 is used in default to use all available cores)

two_phase_dynamic

Object for wave propagation modeling of two-phase material in finite and infinite space. The inputs of this function is listed as follows:

parameter tmin:A mandatory (floating) parameter that defines the minimum time (s)
parameter tmax:A mandatory (floating) parameter that defines the maximum time (s)
parameter tlin:A mandatory (integer) parameter that defines the number of points within the maximum and mimumun time
parameter E:A mandatory (floating) list that defines the Young’s modulus (Pa) of bulk soil for all layers
parameter mu:A mandatory (floating) list that defines the Poisson’s ratio of bulk soil for all layers
parameter rho:A mandatory (floating) list that defines the density (kg/m^3) of bulk soil for all layers
parameter H:A mandatory (floating) list that defines the thickness (m) for all layers
parameter kh:A mandatory (floating) list that defines the permeability coefcient (m^2) of bulk soil for all layers
parameter porosity:
 A mandatory (floating) list that defines the porosity of bulk soil for all layers
parameter r:A mandatory (floating) parameter that defines the radius (m) of the location of interest
parameter rmax:A mandatory (floating) parameter that defines the maximum radius (m) of the domain
parameter node:A mandatory (integer) parameter that spesfies the ID of the output node (for instance, the ‘node’ for surface vertical displacement is 2)
parameter loc:An optioanl (integer) parameter that defines the ID of the input load (for instance, the ‘loc’ for surface vertical load is 2)
parameter st:An optional (integer) parameter (either 0 or 1) that defined the output type, where 0 represnts displacement and 1 represents stress output
parameter vis:An optional (floating) parameter that defines the viscosity (Pa-s) of water
parameter kf:An optional (floating) parameter that defines the bulk modulus (Pa) of the fluid
parameter m_num:
 An optional (integer) parameter that defines the number of modes in the Fourier-Bessel series
parameter lap_num:
 An optional (integer) parameter that defines the number of iteration in the inverse Laplace transform
parameter a1:An optional (integer) parameter that defines the radius (m) of the contact area between external load and domain

two_phase_dispersion

Object for one-phase material in infinite space dispersion modeling. The inputs of this function is listed as follows:

parameter f1:A mandatory (floating) parameter that defines the lower bound of frequency (Hz)
parameter f2:A mandatory (floating) parameter that defines the upper bound frequency (Hz)
parameter flin:A mandatory (integer) parameter that defines the number of points within the lower and upper bpund of frequency
parameter E:A mandatory (floating) list that defines the Young’s modulus (Pa) of bulk soil for all layers
parameter mu:A mandatory (floating) list that defines the Poisson’s ratio of bulk soil for all layers
parameter rho:A mandatory (floating) list that defines the density (kg/m^3) of bulk soil for all layers
parameter H:A mandatory (floating) list that defines the thickness (m) for all layers
parameter kh:A mandatory (floating) list that defines the permeability coefcient (m^2) of bulk soil for all layers
parameter porosity:
 A mandatory (floating) list that defines the porosity of bulk soil for all layers
parameter vis:An optional (floating) parameter that defines the viscosity (Pa-s) of water
parameter kf:An optional (floating) parameter that defines the bulk modulus (Pa) of the fluid
parameter ncore:
 An optional (integer) parameter that defines the number of cores (-1 is used in default to use all available cores)

three_phase_dynamic

Object for wave propagation modeling of three-phase material in finite and infinite space. The inputs of this function is listed as follows:

parameter tmin:A mandatory (floating) parameter that defines the minimum time (s)
parameter tmax:A mandatory (floating) parameter that defines the maximum time (s)
parameter tlin:A mandatory (integer) parameter that defines the number of points within the maximum and mimumun time
parameter kks:A mandatory (floating) list that defines the bulk modulus of soild skeleton (Pa) for all layers
parameter muus:A mandatory (floating) list that defines the shear modulus of soild skeleton (Pa) for all layers
parameter rho:A mandatory (floating) list that defines the density of soild skeleton (kg/m^3) for all layers
parameter phiw:A mandatory (floating) list that defines the volumetric water content for all layers
parameter phii:A mandatory (floating) list that defines the volumetric ice content for all layers
parameter H:A mandatory (floating) list that defines the thickness (m) for all layers
parameter r:A mandatory (floating) parameter that defines the radius of the location of interest
parameter rmax:A mandatory (floating) parameter that defines the maximum radius of the domain
parameter node:A mandatory (integer) parameter that spesfies the ID of the output node (for surface vertical displacement, it is 2)
parameter loc:A mandatory (integer) parameter that defines the ID of the input load
parameter st:A mandatory (integer) parameter (either 0 or 1) that defined the output type where 0 represnts displacement and 1 represents stress
parameter KKi:An optional (floating) parameter that defines the bulk modulus of ice (Pa)
parameter muui:An optional (floating) parameter that defines the shear modulus of ice (Pa)
parameter Kww:An optional (floating) parameter that defines the bulk modulus of water (Pa)
parameter kappas:
 An optional (floating) parameter related to the peameability of solid skeleton
parameter kappai:
 An optional (floating) parameter to the peameability of ice
parameter b013:An optional (floating) parameter that defines friction coefficient between the solid skeletal frame and ice matrix
parameter m_num:
 A optional (integer) parameter that defines the number of modes
parameter lap_num:
 A optional (integer) parameter that defines the number of iteration in the inverse Laplace transform
parameter a1:A optional (integer) parameter that defines the radius (m) of the contact area between external load and domain
parameter ncore:
 A optional (integer) parameter that defines the number of cores (-1 is used in default to use all available cores)

three_phase_dispersion

Object for one-phase material in infinite space dispersion modeling. The inputs of this function is listed as follows:

parameter f1:A mandatory (floating) parameter that defines the lower bound of frequency (Hz)
parameter f2:A mandatory (floating) parameter that defines the upper bound frequency (Hz)
parameter flin:A mandatory (integer) parameter that defines the number of points within the lower and upper bpund of frequency
parameter kks:A mandatory (floating) list that defines the bulk modulus of soild skeleton (Pa) for all layers
parameter muus:A mandatory (floating) list that defines the shear modulus of soild skeleton (Pa) for all layers
parameter rho:A mandatory (floating) list that defines the density of soild skeleton (kg/m^3) for all layers
parameter phiw:A mandatory (floating) list that defines the volumetric water content for all layers
parameter phii:A mandatory (floating) list that defines the volumetric ice content for all layers
parameter H:A mandatory (floating) list that defines the thickness (m) for all layers
parameter KKi:An optional (floating) parameter that defines the bulk modulus of ice (Pa)
parameter muui:An optional (floating) parameter that defines the shear modulus of ice (Pa)
parameter Kww:An optional (floating) parameter that defines the bulk modulus of water (Pa)
parameter kappas:
 An optional (floating) parameter related to the peameability of solid skeleton
parameter kappai:
 An optional (floating) parameter to the peameability of ice
parameter b013:An optional (floating) parameter that defines friction coefficient between the solid skeletal frame and ice matrix
parameter ncore:
 An optional (integer) parameter that defines the number of cores (-1 is used in default to use all available cores)

functions inside dynamic modules

model_f deefine the dynamic model for finite domain. For instance:

def model_f(self, s):
    ''' Define one-phase model for finite domain'''
    km = jn_zeros(0,self.m_num)/self.rmax
    fm=np.ones(self.m_num,dtype = float) # point load
    fn = self.external_load(s)
    yt =  PoroSEM.one_phase_finite(np.complex(s), self.E, self.mu, self.rho, self.H, km, fm, self.r, np.complex(fn), self.node, self.loc, self.st, self.m_num, len(self.E))
    return yt

model_i deefine the dynamic model for infinite domain. For instance:

def model_i(self, s):
    ''' Define one-phase model for infinite domain'''
    km = jn_zeros(0,self.m_num)/self.rmax
    fm=np.ones(self.m_num,dtype = float) # point load
    for i in range(self.m_num):
        fm[i] = 2*self.a1*jv(1,km[i]*self.a1)/(self.rmax**2*km[i]*jv(1,self.rmax*km[i])**2) #*(m_num + 1-i)/(m_num+1)*1.05*1.02
    fn = self.external_load2(s)
    yt =  PoroSEM.one_phase_infinite(np.complex(s), self.E, self.mu, self.rho, self.H, km, fm, self.r, np.complex(fn), self.node, self.loc, self.st, self.m_num, len(self.E))
    return yt

In above function, the external load is required to be defined in the Lapalce domain. For example, the 10 kHz load in the BE test can be defined as:

def external_load(self, s):
    ''' Define external load in the Lapalce domain (for BE example)'''
    fn1 = -20*10.0**3*(np.exp(-np.complex(s)/(2000)))*np.pi/(400*10.0**6*np.pi**2 + np.complex(s)**2)
    fn2 = 20*10.0**3*(np.exp(-np.complex(s)/(2500)))*np.pi/(400*10.0**6*np.pi**2 + np.complex(s)**2)
    fn = fn1 + fn2
    return fn

To run the dynamic response in the finite domain, users should use ‘run_f’ function, defined as:

def run_f(self):
    ''' Run the model using the  Parallel computing for finite domain'''
    t = np.linspace(self.tmin, self.tmax, self.tlin)
    yt = Parallel(n_jobs=self.ncore)(delayed(self.inv_f)(i) for i in range(len(t)))
    return np.real(yt)

To run the dynamic response in the infinite domain, users should use ‘run_i’ function, defined as:

def run_i(self):
    ''' Run the model using the  Parallel computing for infinite domain'''
    t = np.linspace(self.tmin, self.tmax, self.tlin)
    yt = Parallel(n_jobs=self.ncore)(delayed(self.inv_i)(i) for i in range(len(t)))
    return np.real(yt)

For dispersion analysis, users can call ‘run’ function directly, defined as follows:

def run(self):
    ''' Run the model using the Parallel computing for infinite domain'''
    omega = np.linspace(self.f1, self.f2,self.flin)*np.pi*2
    yt = Parallel(n_jobs=self.ncore)(delayed(self.final)(i) for i in range(len(omega)))
    return np.real(yt)