module s2dw_core_mod ! Uses use s2dw_types_mod use s2dw_error_mod use s2dw_dl_mod use omp_lib ! Types public type s2dw_wav_abg ! Variables integer, private, parameter :: FFTW_ESTIMATE = 64 integer, private, parameter :: FFTW_MEASURE = 0 integer, private, parameter :: FFTW_FORWARD = -1 integer, private, parameter :: FFTW_BACKWARD = 1 ! Subroutines and functions public subroutine s2dw_core_init_kernels (K_gamma, Phi2, bl_scoeff, J, B, alpha) private function s2dw_core_phi2_integrand (k, bw, alpha) result (integrand) public subroutine s2dw_core_init_directionality (Slm, B, N) public function s2dw_core_admiss (admiss, K_gamma, Phi2, B, J) result (pass) public subroutine s2dw_core_analysis_flm2wav (wav, scoeff, flm, K_gamma, Slm, J, B, N, bl_scoeff, alpha) public subroutine s2dw_core_analysis_flm2wav_dynamic (wavdyn, scoeff, flm, K_gamma, Slm, J, B, N, bl_scoeff, alpha) public subroutine s2dw_core_synthesis_wav2flm (flm, wav, scoeff, K_gamma, Phi2, Slm, J, B, N, bl_scoeff, alpha) public subroutine s2dw_core_synthesis_wav2flm_dynamic (flm, wavdyn, scoeff, K_gamma, Phi2, Slm, J, B, N, bl_scoeff, alpha) public subroutine s2dw_core_free_wavdyn (wavdyn) private function s2dw_core_params_valid (J, B, alpha, N) result (valid) public function s2dw_core_comp_Jmax (B, alpha) result (J_max) public function s2dw_core_assimilate_int (x, y) result (assimilated) private function quad_weights (theta_t, B) result (w) private function binomial (n, r) result (b) private function logfact (n) result (logfactn) private subroutine trapzd (func, B, alpha, a_lim, b_lim, s, n) private function qtrap (func, B, alpha, a_lim, b_lim) result (integral) private function qsimp (func, B, alpha, a_lim, b_lim) result (integral) end module s2dw_core_modFunctionality to perform scale discretised wavelet transform on the sphere.
Author: J. D. McEwen (mcewen@mrao.cam.ac.uk)
Version: 0.1 November 2007
public type s2dw_wav_abg real (kind=dp), allocatable, dimension (:,:,:) :: coeff end type s2dw_wav_abgStructure to store wavelet coefficients for given scale. Required for dynamic memory allocation of wavelet coefficients.
integer, private, parameter :: FFTW_ESTIMATE = 64
integer, private, parameter :: FFTW_MEASURE = 0
integer, private, parameter :: FFTW_FORWARD = -1
integer, private, parameter :: FFTW_BACKWARD = 1
public subroutine s2dw_core_init_kernels (K_gamma, Phi2, bl_scoeff, J, B, alpha) real (kind=dp), intent(out), dimension (0:J,0:B-1) :: K_gamma real (kind=dp), intent(out), dimension (0:B-1) :: Phi2 integer, intent(out) :: bl_scoeff integer, intent(in) :: J integer, intent(in) :: B real (kind=dp), intent(in) :: alpha ! Calls: s2dw_error end subroutine s2dw_core_init_kernelsCompute kernels, scaling functions and band limits.
Notes:
Author: J. D. McEwen
Version: 0.1 October 2007
s2dw_core_phi2_integrand
private function s2dw_core_phi2_integrand (k, bw, alpha) result (integrand) real (kind=dp), intent(in) :: k integer, intent(in) :: bw real (kind=dp), intent(in) :: alpha real (kind=dp) :: integrand end function s2dw_core_phi2_integrandIntegrand of definite integral to be calculated to compute the scaling function.
Notes:
Author: J. D. McEwen
Version: 0.1 October 2007
s2dw_core_init_directionality
public subroutine s2dw_core_init_directionality (Slm, B, N) complex (kind=dpc), intent(out), dimension (0:B-1,0:N-1) :: Slm integer, intent(in) :: B integer, intent(in) :: N ! Calls: s2dw_error end subroutine s2dw_core_init_directionalityCompute wavelet directionality coefficients.
Variables:
Author: J. D. McEwen
Version: 0.1 October 2007
s2dw_core_admiss
public function s2dw_core_admiss (admiss, K_gamma, Phi2, B, J) result (pass) real (kind=dp), intent(out), dimension (0:B-1) :: admiss real (kind=dp), intent(in), dimension (0:J,0:B-1) :: K_gamma real (kind=dp), intent(in), dimension (0:B-1) :: Phi2 integer, intent(in) :: B integer, intent(in) :: J logical :: pass end function s2dw_core_admissCompute resolution of the identity from scaled kernels and scaling function and check equal to unity for all el.
Notes:
Author: J. D. McEwen
Version: 0.1 October 2007
s2dw_core_analysis_flm2wav
public subroutine s2dw_core_analysis_flm2wav (wav, scoeff, flm, K_gamma, Slm, J, B, N, bl_scoeff, alpha) real (kind=dp), intent(out), dimension (0:J, 0:2*B-2, 0:2*B-1, 0:N-1) :: wav complex (kind=dpc), intent(out), dimension (0:bl_scoeff-1, 0:bl_scoeff-1) :: scoeff complex (kind=dpc), intent(in), dimension (0:B-1, 0:B-1) :: flm real (kind=dp), intent(in), dimension (0:J, 0:B-1) :: K_gamma complex (kind=dpc), intent(in), dimension (0:B-1, 0:N-1) :: Slm integer, intent(in) :: J integer, intent(in) :: B integer, intent(in) :: N integer, intent(in) :: bl_scoeff real (kind=dp), intent(in) :: alpha ! Calls: dfftw_destroy_plan, dfftw_execute_dft_c2r, dfftw_plan_dft_c2r_1d, s2dw_dl_beta_operator, s2dw_error end subroutine s2dw_core_analysis_flm2wavCompute wavelet and scaling coefficients from harmonic coefficients of original signal using fast algorithm.
Notes:
Author: J. D. McEwen
Version: 0.1 October 2007
s2dw_core_analysis_flm2wav_dynamic
public subroutine s2dw_core_analysis_flm2wav_dynamic (wavdyn, scoeff, flm, K_gamma, Slm, J, B, N, bl_scoeff, alpha) type (s2dw_wav_abg), intent(out), allocatable, dimension (:) :: wavdyn complex (kind=dpc), intent(out), dimension (0:bl_scoeff-1, 0:bl_scoeff-1) :: scoeff complex (kind=dpc), intent(in), dimension (0:B-1, 0:B-1) :: flm real (kind=dp), intent(in), dimension (0:J, 0:B-1) :: K_gamma complex (kind=dpc), intent(in), dimension (0:B-1, 0:N-1) :: Slm integer, intent(in) :: J integer, intent(in) :: B integer, intent(in) :: N integer, intent(in) :: bl_scoeff real (kind=dp), intent(in) :: alpha ! Calls: dfftw_destroy_plan, dfftw_execute_dft_c2r, dfftw_plan_dft_c2r_1d, s2dw_dl_beta_operator, s2dw_error end subroutine s2dw_core_analysis_flm2wav_dynamicCompute wavelet and scaling coefficients from harmonic coefficients of original signal using fast algorithm, dynamically allocating the memory required for the wavelet coefficients dynamically.
Notes:
Author: J. D. McEwen
Version: 0.1 February 2008
s2dw_core_synthesis_wav2flm
public subroutine s2dw_core_synthesis_wav2flm (flm, wav, scoeff, K_gamma, Phi2, Slm, J, B, N, bl_scoeff, alpha) complex (kind=dpc), intent(out), dimension (0:B-1, 0:B-1) :: flm real (kind=dp), intent(in), dimension (0:J, 0:2*B-2, 0:2*B-1, 0:N-1) :: wav complex (kind=dpc), intent(in), dimension (0:bl_scoeff-1, 0:bl_scoeff-1) :: scoeff real (kind=dp), intent(in), dimension (0:J, 0:B-1) :: K_gamma real (kind=dp), intent(in), dimension (0:B-1) :: Phi2 complex (kind=dpc), intent(in), dimension (0:B-1, 0:N-1) :: Slm integer, intent(in) :: J integer, intent(in) :: B integer, intent(in) :: N integer, intent(in) :: bl_scoeff real (kind=dp), intent(in) :: alpha ! Calls: dfftw_destroy_plan, dfftw_execute_dft_r2c, dfftw_plan_dft_r2c_1d, s2dw_dl_beta_operator, s2dw_error end subroutine s2dw_core_synthesis_wav2flmSynthesis harmonic coefficients of signal from wavelet and scaling coefficients.
Notes:
Author: J. D. McEwen
Version: 0.1 October 2007
s2dw_core_synthesis_wav2flm_dynamic
public subroutine s2dw_core_synthesis_wav2flm_dynamic (flm, wavdyn, scoeff, K_gamma, Phi2, Slm, J, B, N, bl_scoeff, alpha) complex (kind=dpc), intent(out), dimension (0:B-1, 0:B-1) :: flm type (s2dw_wav_abg), intent(inout), allocatable, dimension (:) :: wavdyn complex (kind=dpc), intent(in), dimension (0:bl_scoeff-1, 0:bl_scoeff-1) :: scoeff real (kind=dp), intent(in), dimension (0:J, 0:B-1) :: K_gamma real (kind=dp), intent(in), dimension (0:B-1) :: Phi2 complex (kind=dpc), intent(in), dimension (0:B-1, 0:N-1) :: Slm integer, intent(in) :: J integer, intent(in) :: B integer, intent(in) :: N integer, intent(in) :: bl_scoeff real (kind=dp), intent(in) :: alpha ! Calls: dfftw_destroy_plan, dfftw_execute_dft_r2c, dfftw_plan_dft_r2c_1d, s2dw_dl_beta_operator, s2dw_error end subroutine s2dw_core_synthesis_wav2flm_dynamicSynthesise harmonic coefficients of signal from wavelet and scaling coefficients, where the memory of the wavelet coefficients has been allocated dynamically (destroying wavelet coefficients in the process).
Notes:
Author: J. D. McEwen
Version: 0.1 February 2008
s2dw_core_free_wavdyn
public subroutine s2dw_core_free_wavdyn (wavdyn) type (s2dw_wav_abg), intent(inout), allocatable, dimension (:) :: wavdyn end subroutine s2dw_core_free_wavdynFree memory corresponding to dynamically allocated wavelet coefficients.
Variables:
Author: J. D. McEwen
Version: 0.1 February 2008
s2dw_core_params_valid
private function s2dw_core_params_valid (J, B, alpha, N) result (valid) integer, intent(in) :: J integer, intent(in) :: B real (kind=dp), intent(in) :: alpha integer, optional, intent(in) :: N logical :: valid end function s2dw_core_params_validCheck size parameters valid.
Notes:
Author: J. D. McEwen
Version: 0.1 October 2007
s2dw_core_comp_Jmax
public function s2dw_core_comp_Jmax (B, alpha) result (J_max) integer, intent(in) :: B real (kind=dp), intent(in) :: alpha integer :: J_max end function s2dw_core_comp_JmaxCompute maximum analysis depth allowed.
Variables:
Author: J. D. McEwen
Version: 0.1 November 2007
s2dw_core_assimilate_int
public function s2dw_core_assimilate_int (x, y) result (assimilated) real (kind=dp), intent(in) :: x integer, intent(out) :: y logical :: assimilated end function s2dw_core_assimilate_intIf a real value is very close to an integer then set to integer, otherwise leave unaltered. Necessary to avoid numerical precision problems when using ceiling and floor functions.
Variables:
Author: J. D. McEwen
Version: 0.1 November 2007
quad_weights
private function quad_weights (theta_t, B) result (w) real (kind=dp), intent(in) :: theta_t integer, intent(in) :: B real (kind=dp) :: w end function quad_weightsCompute quadrature weights for exact quadrature with measure dcos(theta). Weights are derived by Driscoll and Healy.
Variables:
Author: J. D. McEwen
Version: 0.1 October 2007
binomial
private function binomial (n, r) result (b) integer, intent(in) :: n integer, intent(in) :: r integer :: b end function binomialCompute Binomial coefficient nCr.
Variables:
Author: J. D. McEwen
Version: 0.1 October 2007
logfact
private function logfact (n) result (logfactn) integer, intent(in) :: n real (kind=dp) :: logfactn ! Calls: s2dw_error end function logfactComputes the natural logarithm of an (integer) factorial.
Variables:
Author: J. D. McEwen
Version: 0.1 October 2007
trapzd
private subroutine trapzd (func, B, alpha, a_lim, b_lim, s, n) interface func function func (k, B, alpha) result (integrand) real (kind=dp), intent(in) :: k integer, intent(in) :: B real (kind=dp), intent(in) :: alpha real (kind=dp) :: integrand end function func end interface func integer, intent(in) :: B real (kind=dp), intent(in) :: alpha real (kind=dp), intent(IN) :: a_lim real (kind=dp), intent(IN) :: b_lim real (kind=dp), intent(INOUT) :: s integer, intent(IN) :: n end subroutine trapzdComputes nth stage of refinement of extended trapezoidal rule. Adapted from numerical recipes for computing scaling functions squared.
Notes:
Author: J. D. McEwen
Version: 0.1 June 2005
qtrap
private function qtrap (func, B, alpha, a_lim, b_lim) result (integral) interface func function func (k, B, alpha) result (integrand) real (kind=dp), intent(in) :: k integer, intent(in) :: B real (kind=dp), intent(in) :: alpha real (kind=dp) :: integrand end function func end interface func integer, intent(in) :: B real (kind=dp), intent(in) :: alpha real (kind=dp), intent(in) :: a_lim real (kind=dp), intent(in) :: b_lim real (kind=dp) :: integral ! Calls: s2dw_error, trapzd end function qtrapComputes the integral of the function func from a to b using the trapezoid method. Adapted from numerical recipes for computing scaling functions squared.
Notes:
Author: J. D. McEwen
Version: 0.1 June 2005
qsimp
private function qsimp (func, B, alpha, a_lim, b_lim) result (integral) interface func function func (k, B, alpha) result (integrand) real (kind=dp), intent(in) :: k integer, intent(in) :: B real (kind=dp), intent(in) :: alpha real (kind=dp) :: integrand end function func end interface func integer, intent(in) :: B real (kind=dp), intent(in) :: alpha real (kind=dp), intent(IN) :: a_lim real (kind=dp), intent(IN) :: b_lim real (kind=dp) :: integral ! Calls: s2dw_error, trapzd end function qsimpComputes the integral of the function func from a to b using Simpson's rule. Adapted from numerical recipes for computing scaling functions squared.
Notes:
Author: J. D. McEwen
Version: 0.1 June 2005