25 use,
intrinsic :: iso_c_binding, only: c_double
26 use,
intrinsic :: iso_fortran_env
113 real(c_double) function expm1(x) bind(c, name=
'expm1')
115 real(c_double),
intent(in),
value :: x
140 real(real64),
intent(in) :: x, y
141 real(real64),
optional,
intent(in) :: rtol
142 real(real64),
optional,
intent(in) :: atol
143 real(real64) :: atol_, rtol_
145 atol_ = optional_default(atol, 1.e-8_real64)
146 rtol_ = optional_default(rtol, 1.e-5_real64)
153 complex(real64),
intent(in) :: x, y
154 real(real64),
optional,
intent(in) :: rtol
155 real(real64),
optional,
intent(in) :: atol
156 real(real64) :: atol_, rtol_
158 atol_ = optional_default(atol, 1.e-8_real64)
159 rtol_ = optional_default(rtol, 1.e-5_real64)
169 integer,
intent(in) :: dim
170 integer,
intent(in) :: diag
171 integer :: matrix(dim, dim)
177 matrix(ii, ii) = diag
183 recursive function hermite(n, x)
result (h)
184 integer,
intent(in) :: n
185 real(real64),
intent(in) :: x
203 recursive function factorial (n)
RESULT (fac)
204 integer,
intent(in) :: n
220 real(real64),
intent(in) :: xx(3)
221 integer,
intent(in) :: li, mi
222 complex(real64),
intent(out) :: ylm
225 real(real64) :: dx, dy, dz, r, plm, cosm, sinm, cosmm1, sinmm1, cosphi, sinphi
226 real(real64),
parameter :: tiny = 1.e-15_real64
232 ylm = cmplx(
sqrt(m_one/(m_four*m_pi)), m_zero, real64)
236 r =
sqrt(xx(1)**2 + xx(2)**2 + xx(3)**2)
249 if(abs(dz) > m_one) dz = sign(m_one, dz)
250 plm = loct_legendre_sphplm(li, abs(mi), dz)
253 r =
sqrt(dx*dx + dy*dy)
267 cosm = cosmm1*cosphi - sinmm1*sinphi
268 sinm = cosmm1*sinphi + sinmm1*cosphi
272 ylm = plm*cmplx(cosm, sinm, real64)
291 real(real64),
intent(in) :: xx(3)
292 integer,
intent(in) :: li, mi
293 real(real64),
intent(out) :: ylm
295 integer,
parameter :: lmaxd = 20
296 real(real64),
parameter :: tiny = 1.e-15_real64
297 integer :: i, ilm0, l, m, mabs
298 integer,
save :: lmax = -1
300 real(real64) :: cmi, cosm, cosmm1, cosphi, dphase, dplg, fac, &
301 fourpi, plgndr, phase, pll, pmm, pmmp1, sinm, &
302 sinmm1, sinphi, rsize, rx, ry, rz, xysize
303 real(real64),
save :: c(0:(lmaxd+1)*(lmaxd+1))
314 do i = l - m + 1, l + m
317 c(ilm0 + m) =
sqrt(fac)
319 if (m /= 0) c(ilm0 + m) = c(ilm0 + m)*
sqrt(m_two)
320 c(ilm0 - m) = c(ilm0 + m)
333 rsize =
sqrt(xx(1)**2 + xx(2)**2 + xx(3)**2)
334 if (rsize < tiny)
then
359 ylm = c(4)*6.0_real64*rx*ry
361 ylm = (-c(5))*m_three*ry*rz
363 ylm = c(6)*m_half*(m_three*rz*rz - m_one)
365 ylm = (-c(7))*m_three*rx*rz
367 ylm = c(8)*m_three*(rx*rx - ry*ry)
374 xysize =
sqrt(max(rx*rx + ry*ry, tiny))
382 cosm = cosmm1*cosphi - sinmm1*sinphi
383 sinm = cosmm1*sinphi + sinmm1*cosphi
391 dphase = (-mabs)*sinm
397 if (mabs > m_zero)
then
399 pmm = (-pmm)*fac*xysize
406 dplg = (-li)*rz*pmm/(xysize**2)
408 pmmp1 = rz*(2*mabs + 1)*pmm
409 if (li == mabs + 1)
then
411 dplg = -((li*rz*pmmp1 - (mabs + li)*pmm)/(xysize**2))
414 pll = (rz*(2*l - 1)*pmmp1 - (l + mabs - 1)*pmm)/(l - mabs)
419 dplg = -((li*rz*pll - (l + mabs - 1)*pmm)/(xysize**2))
425 ylm = cmi*plgndr*phase
439 real(real64) function
real_gaunt(l1, m1, l2, m2, l3, m3) result(coeff)
440 integer,
intent(in) :: l1, m1, l2, m2, l3, m3
442 integer,
parameter :: lmax_cache = 6
443 integer,
parameter :: ngauss = 16
444 integer,
parameter :: nphi = 72
445 real(real64),
save :: cache(0:lmax_cache, -lmax_cache:lmax_cache, &
446 0:lmax_cache, -lmax_cache:lmax_cache, 0:lmax_cache, -lmax_cache:lmax_cache)
447 logical,
save :: initialized(0:lmax_cache, -lmax_cache:lmax_cache, &
448 0:lmax_cache, -lmax_cache:lmax_cache, 0:lmax_cache, -lmax_cache:lmax_cache) = .false.
449 real(real64),
save :: gl_x(1:ngauss), gl_w(1:ngauss)
450 logical,
save :: gl_initialized = .false.
452 integer :: ix, iphi, ii, jj, iter
453 real(real64) :: phi, dphi, y1, y2, y3, xx(3), sintheta
454 real(real64) :: zz, p0, p1, p2, dp
458 assert(l1 >= 0 .and. l1 <= lmax_cache)
459 assert(l2 >= 0 .and. l2 <= lmax_cache)
460 assert(l3 >= 0 .and. l3 <= lmax_cache)
461 assert(abs(m1) <= l1)
462 assert(abs(m2) <= l2)
463 assert(abs(m3) <= l3)
465 if (.not. gl_initialized)
then
469 zz =
cos(m_pi*(ii - 0.25_real64)/(ngauss + m_half))
476 p0 = ((2*jj - 1)*zz*p1 - (jj - 1)*p2)/jj
478 dp = ngauss*(zz*p0 - p1)/(zz**2 - m_one)
479 if (abs(p0/dp) < 1e-15_real64)
exit
483 gl_x(ngauss + 1 - ii) = zz
484 gl_w(ii) = m_two/((m_one - zz**2)*dp**2)
485 gl_w(ngauss + 1 - ii) = gl_w(ii)
487 gl_initialized = .
true.
490 if (.not. initialized(l1, m1, l2, m2, l3, m3))
then
491 dphi = m_two*m_pi/real(nphi, real64)
495 sintheta =
sqrt(max(m_one - gl_x(ix)**2, m_zero))
497 phi = (real(iphi, real64) - m_half)*dphi
498 xx(1) = sintheta*
cos(phi)
499 xx(2) = sintheta*
sin(phi)
506 coeff = coeff + y1*y2*y3*gl_w(ix)*dphi
510 cache(l1, m1, l2, m2, l3, m3) = coeff
511 initialized(l1, m1, l2, m2, l3, m3) = .
true.
514 coeff = cache(l1, m1, l2, m2, l3, m3)
528 subroutine weights(N, M, cc, side)
529 integer,
intent(in) :: n, m
530 real(real64),
intent(out) :: cc(0:,0:,0:)
531 integer,
optional,
intent(in) :: side
533 integer :: i, j, k, mn, side_
534 real(real64) :: c1, c2, c3, c4, c5, xi
535 real(real64),
allocatable :: x(:)
539 safe_allocate(x(0:m))
541 if (
present(side))
then
551 x(:) = (/(-i,i=0,mn)/)
555 x(:) = (/(i,i=0,mn)/)
559 x(:) = (/0,(-i,i,i=1,mn)/)
582 if (j <= n) cc(k, j - 1, j) = m_zero
583 cc(k, j, 0) = c4*cc(k, j - 1, 0)/c3
586 cc(k, j, i) = (c4*cc(k, j - 1, i) - i*cc(k, j - 1, i - 1))/c3
589 cc(j, j, 0) = -c1*c5*cc(j - 1, j - 1, 0) / c2
593 cc(j, j, i) = c1*(i*cc(j - 1, j - 1, i - 1) - c5*cc(j - 1, j - 1, i))/c2
604 real(real64)
pure function
ddelta(i, j)
605 integer,
intent(in) :: i
606 integer,
intent(in) :: j
620 integer,
intent(in) :: nn
621 real(real64),
intent(in) :: xa(:)
622 real(real64),
intent(in) :: xx
623 real(real64),
contiguous,
intent(out) :: cc(:)
633 cc(ii) = cc(ii)*(xx - xa(kk))/(xa(ii) - xa(kk))
642 logical pure function
even(n)
643 integer,
intent(in) :: n
645 even = (mod(n, 2) == 0)
652 logical pure function
odd(n)
653 integer,
intent(in) :: n
663 real(real64),
contiguous,
intent(in) :: x(:)
664 real(real64),
contiguous,
intent(out) :: u(:)
667 real(real64) :: sumx2
668 real(real64),
allocatable :: xx(:)
674 assert(
size(u) == n-1)
677 safe_allocate(xx(1:n))
679 if (abs(x(j))<1.0e-8_real64)
then
690 sumx2 = sumx2 + xx(j)**2
692 if (abs(sumx2) <= m_epsilon .and. abs(xx(k)) <= m_epsilon)
exit
696 u(n-1) =
atan2(xx(n), xx(n-1))
710 real(real64),
contiguous,
intent(in) :: u(:)
711 real(real64),
contiguous,
intent(out) :: x(:)
719 assert(
size(u) == n-1)
726 x(2) =
sin(u(1))*
cos(u(2))
727 x(3) =
sin(u(1))*
sin(u(2))
730 x(2) =
sin(u(1))*
cos(u(2))
737 x(j) = x(j) *
cos(u(j))
741 x(n) = x(n) *
sin(u(k))
743 x(n) = x(n) *
sin(u(n-1))
756 real(real64),
contiguous,
intent(out) :: grad_matrix(:,:)
757 real(real64),
intent(in) :: r
758 real(real64),
contiguous,
intent(in) :: x(:)
768 grad_matrix(1,1) = -r*
sin(x(1))
770 grad_matrix(m,1) = m_zero
777 grad_matrix(m,l) = -r*grad_matrix(m,l)*product(
sin(x(1:l)))
779 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)))
781 grad_matrix(m,l) = m_zero
788 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)))
795 integer(int64) pure function
pad88(size, blk)
796 integer(int64),
intent(in) :: size
797 integer(int64),
intent(in) :: blk
805 pad88 =
size + blk - mm
810 integer(int64) pure function
pad48(size, blk)
811 integer,
intent(in) :: size
812 integer(int64),
intent(in) :: blk
818 integer(int64) pure function
pad8(size, blk)
819 integer(int64),
intent(in) :: size
820 integer,
intent(in) :: blk
826 integer pure function
pad4(size, blk)
827 integer,
intent(in) :: size
828 integer,
intent(in) :: blk
830 pad4 = int(
pad88(int(
size, int64), int(blk, int64)), int32)
839 integer pure function
pad_pow2(size)
840 integer,
intent(in) :: size
848 if (
size == 0)
return
854 if (mm - 2*mm2 /= 0)
exit
868 real(real64)
pure function
dlog2(xx)
869 real(real64),
intent(in) :: xx
876 integer pure function
ilog2(xx)
877 integer,
intent(in) :: xx
884 integer(int64) pure function
llog2(xx)
885 integer(int64),
intent(in) :: xx
887 llog2 = nint(
log2(real(xx, real64) ), kind=int64)
893 complex(real64),
intent(in) :: z
904 complex(real64) pure function
phi1(z)
905 complex(real64),
intent(in) :: z
907 real(real64),
parameter :: cut = 0.002_real64
909 if (abs(z) < cut)
then
910 phi1 = m_one + m_half*z*(m_one + z/m_three*(m_one + m_fourth*z*(m_one + z/m_five)))
923 complex(real64) pure function
phi2(z)
924 complex(real64),
intent(in) :: z
926 real(real64),
parameter :: cut = 0.002_real64
928 if (abs(z) < cut)
then
929 phi2 = m_half + z/6.0_real64*(m_one + m_fourth*z*(m_one + z/m_five*(m_one + z/6.0_real64)))
931 phi2 = (
exp(z) - z - m_z1)/z**2
938 real(real64),
intent(in) :: x
946 integer,
intent(in) :: n
953 message(1) =
"Internal error: is_prime does not take negative numbers."
954 call messages_fatal(1)
962 root = nint(
sqrt(real(n, real64) ))
964 if (mod(n,i) == 0)
then
981 real(real64),
contiguous,
intent(out) :: r(:,:)
982 real(real64),
intent(in) :: ff(:)
983 real(real64),
contiguous,
intent(in) :: tt(:)
986 real(real64) :: th, uv, uu, vv, ft
987 real(real64),
allocatable :: axis(:), u(:), v(:),
f(:), t(:), p(:)
993 assert((dim == 2) .or. (dim == 3))
994 assert(
size(tt,1) == dim)
995 assert((
size(r,1) == dim) .and. (
size(r,2) == dim))
997 safe_allocate(u(1:dim))
998 safe_allocate(v(1:dim))
999 safe_allocate(
f(1:dim))
1000 safe_allocate(t(1:dim))
1007 ft = dot_product(
f,t)
1011 if (abs(ft) < m_one)
then
1024 safe_allocate(axis(1:dim))
1027 u =
f / dot_product(
f,
f)
1028 v = t /dot_product(t,t)
1031 axis = axis / norm2(axis)
1033 r(1,1) =
cos(th) + axis(1)**2 * (1 -
cos(th))
1034 r(1,2) = axis(1)*axis(2)*(1-
cos(th)) + axis(3)*
sin(th)
1035 r(1,3) = axis(1)*axis(3)*(1-
cos(th)) - axis(2)*
sin(th)
1037 r(2,1) = axis(2)*axis(1)*(1-
cos(th)) - axis(3)*
sin(th)
1038 r(2,2) =
cos(th) + axis(2)**2 * (1 -
cos(th))
1039 r(2,3) = axis(2)*axis(3)*(1-
cos(th)) + axis(1)*
sin(th)
1041 r(3,1) = axis(3)*axis(1)*(1-
cos(th)) + axis(2)*
sin(th)
1042 r(3,2) = axis(3)*axis(2)*(1-
cos(th)) - axis(1)*
sin(th)
1043 r(3,3) =
cos(th) + axis(3)**2 * (1 -
cos(th))
1045 safe_deallocate_a(axis)
1054 r(1,1) = u(1)**2 + (1-u(1)**2)*
cos(th)
1055 r(1,2) = u(1)*u(2)*(1-
cos(th)) - u(3)*
sin(th)
1056 r(1,3) = u(1)*u(3) + u(2)*
sin(th)
1058 r(2,1) = u(1)*u(2)*(1-
cos(th)) + u(3)*
sin(th)
1059 r(2,2) = u(2)**2 + (1-u(2)**2)*
cos(th)
1060 r(2,3) = u(2)*u(3)*(1-
cos(th)) - u(1)*
sin(th)
1062 r(3,1) = u(1)*u(3)*(1-
cos(th)) - u(2)*
sin(th)
1063 r(3,2) = u(2)*u(3)*(1-
cos(th)) + u(1)*
sin(th)
1064 r(3,3) = u(3)**2 + (1-u(3)**2)*
cos(th)
1069 safe_allocate(p(1:dim))
1071 if (abs(
f(1)) <= abs(
f(2)) .and. abs(
f(1)) < abs(
f(3)))
then
1072 p = (/m_one, m_zero, m_zero/)
1073 else if (abs(
f(2)) < abs(
f(1)) .and. abs(
f(2)) <= abs(
f(3)))
then
1074 p = (/m_zero, m_one, m_zero/)
1075 else if (abs(
f(3)) <= abs(
f(1)) .and. abs(
f(3)) < abs(
f(2)))
then
1076 p = (/m_zero, m_zero, m_one/)
1082 uu = dot_product(u,u)
1083 vv = dot_product(v,v)
1084 uv = dot_product(u,v)
1089 r(i,j) =
ddelta(i,j) - m_two * u(i)*u(j)/uu - m_two * v(i)*v(j)/vv &
1090 + 4_real64*uv * v(i)*u(j) /(uu*vv)
1095 safe_deallocate_a(p)
1111 safe_deallocate_a(u)
1112 safe_deallocate_a(v)
1128 real(real64),
intent(in) :: x, h
1129 real(real64),
intent(out) :: res, err
1132 use,
intrinsic :: iso_fortran_env
1134 real(real64),
intent(in) :: x
1135 real(real64),
intent(inout) :: fx
1139 real(real64),
parameter :: con = 1.4_real64, big = 1.0e30_real64, safe = m_two
1140 integer,
parameter :: ntab = 20
1142 real(real64) :: errt, fac, hh, fx1, fx2
1143 real(real64),
allocatable :: a(:, :)
1147 if (abs(h) <= m_epsilon)
then
1148 message(1) =
"h must be nonzero in numder_ridders"
1149 call messages_fatal(1)
1152 safe_allocate(a(1:ntab, 1:ntab))
1157 a(1,1) = (fx1-fx2) / (m_two*hh)
1163 a(1,i) = (fx1-fx2) / (m_two*hh)
1166 a(j,i) = (a(j-1,i)*fac-a(j-1,i-1)) / (fac-m_one)
1168 errt = max(abs(a(j,i)-a(j-1,i)),abs(a(j,i)-a(j-1,i-1)))
1169 if (errt .le. err)
then
1174 if (abs(a(i,i)-a(i-1,i-1)) .ge. safe*err)
then
1175 safe_deallocate_a(a)
1181 safe_deallocate_a(a)
1187 real(real64),
contiguous,
intent(in) :: a(:)
1188 complex(real64),
contiguous,
intent(in) :: b(:)
1190 complex(real64) :: c(1:3)
1192 c(1) = a(2)*b(3) - a(3)*b(2)
1193 c(2) = a(3)*b(1) - a(1)*b(3)
1194 c(3) = a(1)*b(2) - a(2)*b(1)
1200 complex(real64),
contiguous,
intent(in) :: a(:)
1201 real(real64),
contiguous,
intent(in) :: b(:)
1203 complex(real64) :: c(1:3)
1205 c(1) = a(2)*b(3) - a(3)*b(2)
1206 c(2) = a(3)*b(1) - a(1)*b(3)
1207 c(3) = a(1)*b(2) - a(2)*b(1)
1313 integer,
intent(in) :: np
1314 integer,
intent(in) :: nn, mm
1315 real(real64),
intent(in) :: xx(np)
1316 real(real64),
intent(out) :: cx(np)
1319 real(real64),
allocatable :: cx_tmp(:,:)
1323 safe_allocate(cx_tmp(1:np, 0:nn))
1335 cx_tmp(1:np,0) = m_one
1339 cx_tmp(ip,1) = real(mm + 1, real64) - xx(ip)
1346 (( real(mm + 2*ii - 1, real64) - xx(ip)) * cx_tmp(ip,ii-1) &
1347 + real(-mm -ii + 1, real64) * cx_tmp(ip,ii-2)) / real(ii, real64)
1352 cx(1:np) = cx_tmp(1:np, nn)
1354 safe_deallocate_a(cx_tmp)
1359 integer,
intent(in) :: nn
1360 real(real64),
contiguous,
intent(inout) :: aa(:, :)
1366 aa(jj, ii) = aa(ii, jj)
1372 integer,
intent(in) :: nn
1373 complex(real64),
contiguous,
intent(inout) :: aa(:, :)
1379 aa(jj, ii) = conjg(aa(ii, jj))
1381 aa(jj, jj) = real(aa(jj, jj), real64)
1386 integer,
intent(in) :: nn
1387 real(real64),
contiguous,
intent(inout) :: aa(:, :)
1393 aa(ii, jj) = aa(jj, ii)
1399 integer,
intent(in) :: nn
1400 complex(real64),
contiguous,
intent(inout) :: aa(:, :)
1406 aa(ii, jj) = conjg(aa(jj, ii))
1408 aa(jj, jj) = real(aa(jj, jj), real64)
1414 integer,
intent(in) :: nn
1415 real(real64),
contiguous,
intent(inout) :: aa(:, :)
1421 aa(ii, jj) = m_half * (aa(ii, jj) + aa(jj, ii))
1422 aa(jj, ii) = aa(ii, jj)
1429 integer,
intent(in) :: n
1430 complex(real64),
contiguous,
intent(inout) :: a(:, :)
1436 a(i, j) = m_half * (a(i, j) + conjg(a(j, i)))
1437 a(j, i) = conjg(a(i, j))
1444 real(real64),
contiguous,
intent(inout) :: aa(:, :)
1445 real(real64),
intent(in) :: tol
1454 real(real64),
intent(in) :: a(:, :)
1455 real(real64),
optional,
intent(in) :: tol
1457 real(real64) :: tolerance
1461 tolerance = optional_default(tol, 1.0e-8_real64)
1463 assert(
size(a, 1) ==
size(a, 2))
1472 logical pure function is_diagonal(dim, matrix, tol)
1473 integer,
intent(in) :: dim
1474 real(real64),
intent(in) :: matrix(:, :)
1475 real(real64),
intent(in) :: tol
1478 real(real64) :: max_diag
1482 max_diag = max(abs(matrix(ii, ii)), max_diag)
1489 if (abs(matrix(ii, jj)) > tol*max_diag)
is_diagonal = .false.
1497 integer,
intent(in) :: num
1498 integer,
intent(in) :: base
1499 integer,
contiguous,
intent(out) :: converted(:)
1501 integer :: i, num_, length
1508 length =
floor(
log(real(num, real64)) /
log(real(base, real64))) + 1
1509 assert(
size(converted) >= length)
1513 do i = 1,
size(converted)
1514 converted(i) = mod(num_, base)
1523 integer,
intent(in) :: converted(:)
1524 integer,
intent(in) :: base
1525 integer,
intent(out) :: num
1532 do i = 1,
size(converted)
1533 num = num + converted(i) * base**(i-1)
1539#include "complex.F90"
1540#include "math_inc.F90"
1544#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__
This module is intended to contain "only mathematical" functions and procedures.
subroutine zsymmetrize_matrix(n, a)
make a complex matrix Hermitian
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.
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, public dzero_small_elements_matrix(aa, tol)
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)
symmetrize a real matrix
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)
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
real(real64) function, public real_gaunt(l1, m1, l2, m2, l3, m3)
Real Gaunt coefficient , by quadrature.
subroutine, public hyperspherical2cartesian(u, x)
Performs the inverse transformation of cartesian2hyperspherical.
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)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
static double f(double w, void *p)