14#include "../base/base_uses.f90"
18 INTEGER,
PARAMETER :: lmax = 5
19 REAL(kind=
dp),
PARAMETER :: eps = 1.0e-12_dp
20 REAL(kind=
dp),
DIMENSION(3, 3) :: rotmat
31 CALL check_orthogonal(orbrot)
33 CALL make_z_rotation(0.7_dp, rotmat)
35 CALL check_orthogonal(orbrot)
37 CALL make_axis_rotation([1.0_dp, 2.0_dp, 3.0_dp], 0.37_dp, rotmat)
39 CALL check_orthogonal(orbrot)
54 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ref
56 DO l = lbound(orbrot, 1), ubound(orbrot, 1)
57 n =
SIZE(orbrot(l)%mat, 1)
63 IF (maxval(abs(orbrot(l)%mat - ref)) > eps)
THEN
64 cpabort(
"Bad identity rotation")
75 SUBROUTINE check_orthogonal(orbrot)
78 INTEGER :: i, j, k, l, n
79 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ident, prod
81 DO l = lbound(orbrot, 1), ubound(orbrot, 1)
82 n =
SIZE(orbrot(l)%mat, 1)
83 ALLOCATE (ident(n, n), prod(n, n))
92 prod(i, j) = prod(i, j) + orbrot(l)%mat(i, k)*orbrot(l)%mat(j, k)
96 IF (maxval(abs(prod - ident)) > eps)
THEN
97 cpabort(
"Bad rotation orthogonality")
99 DEALLOCATE (ident, prod)
102 END SUBROUTINE check_orthogonal
109 SUBROUTINE make_z_rotation(angle, rotmat)
110 REAL(kind=
dp),
INTENT(IN) :: angle
111 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT) :: rotmat
113 REAL(kind=
dp) :: c, s
122 rotmat(3, 3) = 1.0_dp
124 END SUBROUTINE make_z_rotation
132 SUBROUTINE make_axis_rotation(axis, angle, rotmat)
133 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: axis
134 REAL(kind=
dp),
INTENT(IN) :: angle
135 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT) :: rotmat
137 REAL(kind=
dp) :: c, norm, one_c, s, x, y, z
139 norm = sqrt(sum(axis**2))
140 cpassert(norm > 0.0_dp)
148 rotmat(1, 1) = c + x*x*one_c
149 rotmat(1, 2) = x*y*one_c - z*s
150 rotmat(1, 3) = x*z*one_c + y*s
151 rotmat(2, 1) = y*x*one_c + z*s
152 rotmat(2, 2) = c + y*y*one_c
153 rotmat(2, 3) = y*z*one_c - x*s
154 rotmat(3, 1) = z*x*one_c - y*s
155 rotmat(3, 2) = z*y*one_c + x*s
156 rotmat(3, 3) = c + z*z*one_c
158 END SUBROUTINE make_axis_rotation
Defines the basic variable types.
integer, parameter, public dp
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
subroutine, public deallocate_orbital_pointers()
Deallocate the orbital pointers.