26 use,
intrinsic :: iso_fortran_env
133 real(real64),
intent(in) :: x, y
134 real(real64),
optional,
intent(in) :: rtol
135 real(real64),
optional,
intent(in) :: atol
136 real(real64) :: atol_, rtol_
146 complex(real64),
intent(in) :: x, y
147 real(real64),
optional,
intent(in) :: rtol
148 real(real64),
optional,
intent(in) :: atol
149 real(real64) :: atol_, rtol_
162 integer,
intent(in) :: dim
163 integer,
intent(in) :: diag
164 integer :: matrix(dim, dim)
170 matrix(ii, ii) = diag
176 recursive function hermite(n, x)
result (h)
177 integer,
intent(in) :: n
178 real(real64),
intent(in) :: x
196 recursive function factorial (n)
RESULT (fac)
197 integer,
intent(in) :: n
213 real(real64),
intent(in) :: xx(3)
214 integer,
intent(in) :: li, mi
215 complex(real64),
intent(out) :: ylm
218 real(real64) :: dx, dy, dz, r, plm, cosm, sinm, cosmm1, sinmm1, cosphi, sinphi
219 real(real64),
parameter :: tiny = 1.e-15_real64
229 r =
sqrt(xx(1)**2 + xx(2)**2 + xx(3)**2)
246 r =
sqrt(dx*dx + dy*dy)
260 cosm = cosmm1*cosphi - sinmm1*sinphi
261 sinm = cosmm1*sinphi + sinmm1*cosphi
265 ylm = plm*cmplx(cosm, sinm, real64)
284 real(real64),
intent(in) :: xx(3)
285 integer,
intent(in) :: li, mi
286 real(real64),
intent(out) :: ylm
288 integer,
parameter :: lmaxd = 20
289 real(real64),
parameter :: tiny = 1.e-15_real64
290 integer :: i, ilm0, l, m, mabs
291 integer,
save :: lmax = -1
293 real(real64) :: cmi, cosm, cosmm1, cosphi, dphase, dplg, fac, &
294 fourpi, plgndr, phase, pll, pmm, pmmp1, sinm, &
295 sinmm1, sinphi, rsize, rx, ry, rz, xysize
296 real(real64),
save :: c(0:(lmaxd+1)*(lmaxd+1))
307 do i = l - m + 1, l + m
310 c(ilm0 + m) =
sqrt(fac)
312 if (m /= 0) c(ilm0 + m) = c(ilm0 + m)*
sqrt(
m_two)
313 c(ilm0 - m) = c(ilm0 + m)
326 rsize =
sqrt(xx(1)**2 + xx(2)**2 + xx(3)**2)
327 if (rsize < tiny)
then
352 ylm = c(4)*6.0_real64*rx*ry
360 ylm = c(8)*
m_three*(rx*rx - ry*ry)
367 xysize =
sqrt(max(rx*rx + ry*ry, tiny))
375 cosm = cosmm1*cosphi - sinmm1*sinphi
376 sinm = cosmm1*sinphi + sinmm1*cosphi
384 dphase = (-mabs)*sinm
392 pmm = (-pmm)*fac*xysize
399 dplg = (-li)*rz*pmm/(xysize**2)
401 pmmp1 = rz*(2*mabs + 1)*pmm
402 if (li == mabs + 1)
then
404 dplg = -((li*rz*pmmp1 - (mabs + li)*pmm)/(xysize**2))
407 pll = (rz*(2*l - 1)*pmmp1 - (l + mabs - 1)*pmm)/(l - mabs)
412 dplg = -((li*rz*pll - (l + mabs - 1)*pmm)/(xysize**2))
418 ylm = cmi*plgndr*phase
433 subroutine weights(N, M, cc, side)
434 integer,
intent(in) :: n, m
435 real(real64),
intent(out) :: cc(0:,0:,0:)
436 integer,
optional,
intent(in) :: side
438 integer :: i, j, k, mn, side_
439 real(real64) :: c1, c2, c3, c4, c5, xi
440 real(real64),
allocatable :: x(:)
444 safe_allocate(x(0:m))
446 if (
present(side))
then
456 x(:) = (/(-i,i=0,mn)/)
460 x(:) = (/(i,i=0,mn)/)
464 x(:) = (/0,(-i,i,i=1,mn)/)
487 if (j <= n) cc(k, j - 1, j) =
m_zero
488 cc(k, j, 0) = c4*cc(k, j - 1, 0)/c3
491 cc(k, j, i) = (c4*cc(k, j - 1, i) - i*cc(k, j - 1, i - 1))/c3
494 cc(j, j, 0) = -c1*c5*cc(j - 1, j - 1, 0) / c2
498 cc(j, j, i) = c1*(i*cc(j - 1, j - 1, i - 1) - c5*cc(j - 1, j - 1, i))/c2
509 real(real64)
pure function
ddelta(i, j)
510 integer,
intent(in) :: i
511 integer,
intent(in) :: j
528 integer,
intent(in) :: n
529 integer,
allocatable,
intent(out) :: out(:)
530 integer,
intent(out) :: length
531 integer,
optional,
intent(in) :: in(:)
537 if (
present(in))
then
538 length = ubound(in, 1)
539 safe_allocate(out(1:length))
543 safe_allocate(out(1:length))
556 logical function member(n, a)
557 integer,
intent(in) :: n
558 integer,
intent(in) :: a(:)
566 do i = 1, ubound(a, 1)
578 integer,
intent(in) :: nn
579 real(real64),
intent(in) :: xa(:)
580 real(real64),
intent(in) :: xx
581 real(real64),
intent(out) :: cc(:)
591 cc(ii) = cc(ii)*(xx - xa(kk))/(xa(ii) - xa(kk))
600 logical pure function
even(n)
601 integer,
intent(in) :: n
603 even = (mod(n, 2) == 0)
610 logical pure function
odd(n)
611 integer,
intent(in) :: n
621 real(real64),
intent(in) :: x(:)
622 real(real64),
intent(out) :: u(:)
625 real(real64) :: sumx2
626 real(real64),
allocatable :: xx(:)
632 assert(
size(u) == n-1)
635 safe_allocate(xx(1:n))
637 if (abs(x(j))<1.0e-8_real64)
then
648 sumx2 = sumx2 + xx(j)**2
650 if (abs(sumx2) <= m_epsilon .and. abs(xx(k)) <= m_epsilon)
exit
654 u(n-1) =
atan2(xx(n), xx(n-1))
668 real(real64),
intent(in) :: u(:)
669 real(real64),
intent(out) :: x(:)
677 assert(
size(u) == n-1)
684 x(2) =
sin(u(1))*
cos(u(2))
685 x(3) =
sin(u(1))*
sin(u(2))
688 x(2) =
sin(u(1))*
cos(u(2))
695 x(j) = x(j) *
cos(u(j))
699 x(n) = x(n) *
sin(u(k))
701 x(n) = x(n) *
sin(u(n-1))
714 real(real64),
intent(out) :: grad_matrix(:,:)
715 real(real64),
intent(in) :: r
716 real(real64),
intent(in) :: x(:)
726 grad_matrix(1,1) = -r*
sin(x(1))
728 grad_matrix(m,1) = m_zero
735 grad_matrix(m,l) = -r*grad_matrix(m,l)*product(
sin(x(1:l)))
737 grad_matrix(m,l) = grad_matrix(m,l)*r*
cos(x(m))*
cos(x(l))*product(
sin(x(1:m-1)))*product(
sin(x(m+1:l-1)))
739 grad_matrix(m,l) = m_zero
746 grad_matrix(m,n) = r*
cos(x(m))*grad_matrix(m,n)*product(
sin(x(1:m-1)))*product(
sin(x(m+1:n-1)))
753 integer(int64) pure function
pad88(size, blk)
754 integer(int64),
intent(in) :: size
755 integer(int64),
intent(in) :: blk
763 pad88 =
size + blk - mm
768 integer(int64) pure function
pad48(size, blk)
769 integer,
intent(in) :: size
770 integer(int64),
intent(in) :: blk
776 integer(int64) pure function
pad8(size, blk)
777 integer(int64),
intent(in) :: size
778 integer,
intent(in) :: blk
784 integer pure function
pad4(size, blk)
785 integer,
intent(in) :: size
786 integer,
intent(in) :: blk
788 pad4 = int(
pad88(int(
size, int64), int(blk, int64)), int32)
797 integer pure function
pad_pow2(size)
798 integer,
intent(in) :: size
806 if (
size == 0)
return
812 if (mm - 2*mm2 /= 0)
exit
826 real(real64)
pure function
dlog2(xx)
827 real(real64),
intent(in) :: xx
834 integer pure function
ilog2(xx)
835 integer,
intent(in) :: xx
842 integer(int64) pure function
llog2(xx)
843 integer(int64),
intent(in) :: xx
845 llog2 = nint(
log2(real(xx, real64) ), kind=int64)
851 complex(real64),
intent(in) :: z
862 complex(real64) pure function
phi1(z)
863 complex(real64),
intent(in) :: z
865 real(real64),
parameter :: cut = 0.002_real64
867 if (abs(z) < cut)
then
868 phi1 = m_one + m_half*z*(m_one + z/m_three*(m_one + m_fourth*z*(m_one + z/m_five)))
881 complex(real64) pure function
phi2(z)
882 complex(real64),
intent(in) :: z
884 real(real64),
parameter :: cut = 0.002_real64
886 if (abs(z) < cut)
then
887 phi2 = m_half + z/6.0_real64*(m_one + m_fourth*z*(m_one + z/m_five*(m_one + z/6.0_real64)))
889 phi2 = (
exp(z) - z - m_z1)/z**2
896 real(real64),
intent(in) :: x
904 integer,
intent(in) :: n
911 message(1) =
"Internal error: is_prime does not take negative numbers."
912 call messages_fatal(1)
920 root = nint(
sqrt(real(n, real64) ))
922 if (mod(n,i) == 0)
then
939 real(real64),
intent(out) :: r(:,:)
940 real(real64),
intent(in) :: ff(:)
941 real(real64),
intent(in) :: tt(:)
944 real(real64) :: th, uv, uu, vv, ft
945 real(real64),
allocatable :: axis(:), u(:), v(:),
f(:), t(:), p(:)
951 assert((dim < 3) .or. (dim > 2))
952 assert(
size(tt,1) == dim)
953 assert((
size(r,1) == dim) .and. (
size(r,2) == dim))
955 safe_allocate(u(1:dim))
956 safe_allocate(v(1:dim))
957 safe_allocate(
f(1:dim))
958 safe_allocate(t(1:dim))
965 ft = dot_product(
f,t)
967 if (abs(ft) < m_one)
then
980 safe_allocate(axis(1:dim))
983 u =
f / dot_product(
f,
f)
984 v = t /dot_product(t,t)
987 axis = axis / norm2(axis)
989 r(1,1) =
cos(th) + axis(1)**2 * (1 -
cos(th))
990 r(1,2) = axis(1)*axis(2)*(1-
cos(th)) + axis(3)*
sin(th)
991 r(1,3) = axis(1)*axis(3)*(1-
cos(th)) - axis(2)*
sin(th)
993 r(2,1) = axis(2)*axis(1)*(1-
cos(th)) - axis(3)*
sin(th)
994 r(2,2) =
cos(th) + axis(2)**2 * (1 -
cos(th))
995 r(2,3) = axis(2)*axis(3)*(1-
cos(th)) + axis(1)*
sin(th)
997 r(3,1) = axis(3)*axis(1)*(1-
cos(th)) + axis(2)*
sin(th)
998 r(3,2) = axis(3)*axis(2)*(1-
cos(th)) - axis(1)*
sin(th)
999 r(3,3) =
cos(th) + axis(3)**2 * (1 -
cos(th))
1001 safe_deallocate_a(axis)
1010 r(1,1) = u(1)**2 + (1-u(1)**2)*
cos(th)
1011 r(1,2) = u(1)*u(2)*(1-
cos(th)) - u(3)*
sin(th)
1012 r(1,3) = u(1)*u(3) + u(2)*
sin(th)
1014 r(2,1) = u(1)*u(2)*(1-
cos(th)) + u(3)*
sin(th)
1015 r(2,2) = u(2)**2 + (1-u(2)**2)*
cos(th)
1016 r(2,3) = u(2)*u(3)*(1-
cos(th)) - u(1)*
sin(th)
1018 r(3,1) = u(1)*u(3)*(1-
cos(th)) - u(2)*
sin(th)
1019 r(3,2) = u(2)*u(3)*(1-
cos(th)) + u(1)*
sin(th)
1020 r(3,3) = u(3)**2 + (1-u(3)**2)*
cos(th)
1025 safe_allocate(p(1:dim))
1027 if (abs(
f(1)) <= abs(
f(2)) .and. abs(
f(1)) < abs(
f(3)))
then
1028 p = (/m_one, m_zero, m_zero/)
1029 else if (abs(
f(2)) < abs(
f(1)) .and. abs(
f(2)) <= abs(
f(3)))
then
1030 p = (/m_zero, m_one, m_zero/)
1031 else if (abs(
f(3)) <= abs(
f(1)) .and. abs(
f(3)) < abs(
f(2)))
then
1032 p = (/m_zero, m_zero, m_one/)
1038 uu = dot_product(u,u)
1039 vv = dot_product(v,v)
1040 uv = dot_product(u,v)
1045 r(i,j) =
ddelta(i,j) - m_two * u(i)*u(j)/uu - m_two * v(i)*v(j)/vv &
1046 + 4_real64*uv * v(i)*u(j) /(uu*vv)
1051 safe_deallocate_a(p)
1067 safe_deallocate_a(u)
1068 safe_deallocate_a(v)
1084 real(real64),
intent(in) :: x, h
1085 real(real64),
intent(out) :: res, err
1088 use,
intrinsic :: iso_fortran_env
1090 real(real64),
intent(in) :: x
1091 real(real64),
intent(inout) :: fx
1095 real(real64),
parameter :: con = 1.4_real64, big = 1.0e30_real64, safe = m_two
1096 integer,
parameter :: ntab = 20
1098 real(real64) :: errt, fac, hh, fx1, fx2
1099 real(real64),
allocatable :: a(:, :)
1103 if (abs(h) <= m_epsilon)
then
1104 message(1) =
"h must be nonzero in numder_ridders"
1105 call messages_fatal(1)
1108 safe_allocate(a(1:ntab, 1:ntab))
1113 a(1,1) = (fx1-fx2) / (m_two*hh)
1119 a(1,i) = (fx1-fx2) / (m_two*hh)
1122 a(j,i) = (a(j-1,i)*fac-a(j-1,i-1)) / (fac-m_one)
1124 errt = max(abs(a(j,i)-a(j-1,i)),abs(a(j,i)-a(j-1,i-1)))
1125 if (errt .le. err)
then
1130 if (abs(a(i,i)-a(i-1,i-1)) .ge. safe*err)
return
1133 safe_deallocate_a(a)
1139 real(real64),
intent(in) :: a(:)
1140 complex(real64),
intent(in) :: b(:)
1142 complex(real64) :: c(1:3)
1144 c(1) = a(2)*b(3) - a(3)*b(2)
1145 c(2) = a(3)*b(1) - a(1)*b(3)
1146 c(3) = a(1)*b(2) - a(2)*b(1)
1152 complex(real64),
intent(in) :: a(:)
1153 real(real64),
intent(in) :: b(:)
1155 complex(real64) :: c(1:3)
1157 c(1) = a(2)*b(3) - a(3)*b(2)
1158 c(2) = a(3)*b(1) - a(1)*b(3)
1159 c(3) = a(1)*b(2) - a(2)*b(1)
1265 integer,
intent(in) :: np
1266 integer,
intent(in) :: nn, mm
1267 real(real64),
intent(in) :: xx(np)
1268 real(real64),
intent(out) :: cx(np)
1271 real(real64),
allocatable :: cx_tmp(:,:)
1275 safe_allocate(cx_tmp(1:np, 0:nn))
1287 cx_tmp(1:np,0) = m_one
1288 cx_tmp(1:np,1) = real(mm + 1, real64) - xx(1:np)
1291 cx_tmp(1:np, ii) = &
1292 (( real(mm + 2*ii - 1, real64) - xx(1:np)) * cx_tmp(1:np,ii-1) &
1293 + real(-mm -ii + 1, real64) * cx_tmp(1:np,ii-2)) / real(ii, real64)
1296 cx(1:np) = cx_tmp(1:np, nn)
1298 safe_deallocate_a(cx_tmp)
1303 integer,
intent(in) :: nn
1304 real(real64),
intent(inout) :: aa(:, :)
1310 aa(jj, ii) = aa(ii, jj)
1316 integer,
intent(in) :: nn
1317 complex(real64),
intent(inout) :: aa(:, :)
1323 aa(jj, ii) = conjg(aa(ii, jj))
1325 aa(jj, jj) = real(aa(jj, jj), real64)
1330 integer,
intent(in) :: nn
1331 real(real64),
intent(inout) :: aa(:, :)
1337 aa(ii, jj) = aa(jj, ii)
1343 integer,
intent(in) :: nn
1344 complex(real64),
intent(inout) :: aa(:, :)
1350 aa(ii, jj) = conjg(aa(jj, ii))
1352 aa(jj, jj) = real(aa(jj, jj), real64)
1358 integer,
intent(in) :: nn
1359 real(real64),
intent(inout) :: aa(:, :)
1365 aa(ii, jj) = m_half * (aa(ii, jj) + aa(jj, ii))
1366 aa(jj, ii) = aa(ii, jj)
1372 integer,
intent(in) :: nn
1373 real(real64),
intent(inout) :: aa(:, :)
1383 real(real64),
intent(in) :: a(:, :)
1384 real(real64),
optional,
intent(in) :: tol
1386 real(real64) :: tolerance
1390 tolerance = optional_default(tol, 1.0e-8_real64)
1392 assert(
size(a, 1) ==
size(a, 2))
1401 logical pure function is_diagonal(dim, matrix, tol)
1402 integer,
intent(in) :: dim
1403 real(real64),
intent(in) :: matrix(:, :)
1404 real(real64),
intent(in) :: tol
1407 real(real64) :: max_diag
1411 max_diag = max(abs(matrix(ii, ii)), max_diag)
1418 if (abs(matrix(ii, jj)) > tol*max_diag)
is_diagonal = .false.
1426 integer,
intent(in) :: num
1427 integer,
intent(in) :: base
1428 integer,
intent(out) :: converted(:)
1430 integer :: i, num_, length
1437 length =
floor(
log(real(num, real64)) /
log(real(base, real64))) + 1
1438 assert(
size(converted) >= length)
1442 do i = 1,
size(converted)
1443 converted(i) = mod(num_, base)
1452 integer,
intent(in) :: converted(:)
1453 integer,
intent(in) :: base
1454 integer,
intent(out) :: num
1461 do i = 1,
size(converted)
1462 num = num + converted(i) * base**(i-1)
1469#include "complex.F90"
1470#include "math_inc.F90"
1474#include "math_inc.F90"
This is the common interface to a simple-minded polynomical interpolation procedure (simple use of th...
double acos(double __x) __attribute__((__nothrow__
double log(double __x) __attribute__((__nothrow__
double exp(double __x) __attribute__((__nothrow__
double sin(double __x) __attribute__((__nothrow__
double sqrt(double __x) __attribute__((__nothrow__
double cos(double __x) __attribute__((__nothrow__
double atan2(double __y, double __x) __attribute__((__nothrow__
double floor(double __x) __attribute__((__nothrow__
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_z0
real(real64), parameter, public m_half
real(real64), parameter, public m_one
real(real64), parameter, public m_three
This module is intended to contain "only mathematical" functions and procedures.
complex(real64) pure function, public phi2(z)
Compute phi2(z) = (phi1(z)-1)/z = (exp(z) - z - 1)/z^2.
integer pure function ilog2(xx)
logical pure function, public even(n)
Returns if n is even.
pure real(real64) function, dimension(dim, dim) ddiagonal_matrix(dim, diag)
Currently only returns a matrix whose diagonal elements are all the same. Note that the integer versi...
subroutine, public generalized_laguerre_polynomial(np, nn, mm, xx, cx)
complex(real64) pure function, public exponential(z)
Wrapper for exponential.
subroutine dinterpolate_0(xa, ya, x, y)
subroutine, public ylmr_cmplx(xx, li, mi, ylm)
Computes spherical harmonics ylm at position (x, y, z)
subroutine zinterpolate_0(xa, ya, x, y)
subroutine, public convert_to_base(num, base, converted)
convert an integer in base 10 to a different base
subroutine dinterpolate_1(xa, ya, x, y)
real(real64) pure function dlog2(xx)
integer(int64) pure function pad88(size, blk)
real(real64) pure function, public square_root(x)
Wrapper for sqrt.
logical function, public member(n, a)
Considers a(1:ubound(a, 1)) as an integer set and checks if n is a member of it.
integer pure function pad4(size, blk)
subroutine dlower_triangular_to_hermitian(nn, aa)
pure complex(real64) function, dimension(1:3), public dzcross_product(a, b)
subroutine, public cartesian2hyperspherical(x, u)
Performs a transformation of an n-dimensional vector from Cartesian coordinates to hyperspherical coo...
integer pure function, public pad_pow2(size)
create array size, which is padded to powers of 2
subroutine zinterpolate_1(xa, ya, x, y)
pure real(real64) function, dimension(1:3), public dcross_product(a, b)
integer(int64) pure function pad48(size, blk)
subroutine dsymmetrize_matrix(nn, aa)
subroutine, public ylmr_real(xx, li, mi, ylm)
This is a Numerical Recipes-based subroutine computes real spherical harmonics ylm at position (x,...
subroutine dupper_triangular_to_hermitian(nn, aa)
subroutine, public interpolation_coefficients(nn, xa, xx, cc)
logical function, public is_symmetric(a, tol)
Check if a 2D array is symmetric.
subroutine, public generate_rotation_matrix(R, ff, tt)
Generates a rotation matrix R to rotate a vector f to t.
elemental logical function zis_close_scalar(x, y, rtol, atol)
Same as dis_close_scalar for complex numbers.
logical pure function, public odd(n)
Returns if n is odd.
real(real64) pure function, public ddelta(i, j)
subroutine, public make_idx_set(n, out, length, in)
Construct out(1:length) = (/1, ..., n/) if in is not present, out(1:length) = in otherwise.
logical function, public is_prime(n)
complex(real64) pure function, public phi1(z)
Compute phi1(z) = (exp(z)-1)/z.
pure complex(real64) function, dimension(1:3), public zcross_product(a, b)
subroutine, public weights(N, M, cc, side)
Compute the weights for finite-difference calculations:
subroutine zinterpolate_2(xa, ya, x, y)
pure complex(real64) function, dimension(dim, dim) zdiagonal_matrix(dim, diag)
Currently only returns a matrix whose diagonal elements are all the same. Note that the integer versi...
subroutine zlower_triangular_to_hermitian(nn, aa)
logical pure function, public is_diagonal(dim, matrix, tol)
Returns true is the matrix of size dim x dim is diagonal, given a relative tolerance.
subroutine zupper_triangular_to_hermitian(nn, aa)
pure integer function, dimension(dim, dim) idiagonal_matrix(dim, diag)
Currently only returns a matrix whose diagonal elements are all the same. Note that the real and comp...
integer(int64) pure function pad8(size, blk)
subroutine dinterpolate_2(xa, ya, x, y)
subroutine, public numder_ridders(x, h, res, err, f)
Numerical derivative (Ridder`s algorithm).
integer(int64) pure function llog2(xx)
recursive real(real64) function, public hermite(n, x)
elemental logical function dis_close_scalar(x, y, rtol, atol)
Are and equal within a tolerance.
pure complex(real64) function, dimension(1:3), public zdcross_product(a, b)
subroutine, public convert_from_base(converted, base, num)
convert an integer to base 10 from a different base
subroutine, public hyperspherical2cartesian(u, x)
Performs the inverse transformation of cartesian2hyperspherical.
subroutine, public dzero_small_elements_matrix(nn, aa, tol)
subroutine, public hypersphere_grad_matrix(grad_matrix, r, x)
Gives the hyperspherical gradient matrix, which contains the derivatives of the Cartesian coordinates...
recursive integer function, public factorial(n)
static double f(double w, void *p)