(git:b195825)
aux_basis_set.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \par History
10 !> none
11 !> \author JGH (11.2017)
12 ! **************************************************************************************************
14 
15  USE basis_set_types, ONLY: gto_basis_set_type
16  USE kinds, ONLY: default_string_length,&
17  dp
18  USE lapack, ONLY: lapack_spotrf
19  USE orbital_pointers, ONLY: indco,&
20  nco,&
21  ncoset,&
22  nso
23  USE orbital_symbols, ONLY: cgf_symbol,&
25 #include "../base/base_uses.f90"
26 
27  IMPLICIT NONE
28 
29  PRIVATE
30 
31 ! *** Global parameters (only in this module)
32 
33  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'aux_basis_set'
34 
35 ! *** Public subroutines ***
36 
37  PUBLIC :: create_aux_basis
38 
39 CONTAINS
40 
41 ! **************************************************************************************************
42 !> \brief create a basis in GTO form
43 !> \param aux_basis ...
44 !> \param bsname ...
45 !> \param nsets ...
46 !> \param lmin ...
47 !> \param lmax ...
48 !> \param nl ...
49 !> \param npgf ...
50 !> \param zet ...
51 !> \version 1.0
52 ! **************************************************************************************************
53  SUBROUTINE create_aux_basis(aux_basis, bsname, nsets, lmin, lmax, nl, npgf, zet)
54 
55  TYPE(gto_basis_set_type), POINTER :: aux_basis
56  CHARACTER(LEN=default_string_length) :: bsname
57  INTEGER, INTENT(IN) :: nsets
58  INTEGER, DIMENSION(:), INTENT(IN) :: lmin, lmax
59  INTEGER, DIMENSION(0:, :), INTENT(IN) :: nl
60  INTEGER, DIMENSION(:), INTENT(IN) :: npgf
61  REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: zet
62 
63  INTEGER :: i, ico, info, iset, ishell, j, l, &
64  lshell, m, maxco, maxpgf, maxshell, &
65  ncgf, ns, nsgf, nx
66  REAL(kind=dp) :: za, zb, zetab
67  REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: so
68 
69  cpassert(.NOT. ASSOCIATED(aux_basis))
70  ALLOCATE (aux_basis)
71  !
72  aux_basis%name = bsname
73  aux_basis%aliases = bsname
74  aux_basis%nset = nsets
75  !
76  ALLOCATE (aux_basis%npgf(nsets), aux_basis%nshell(nsets), &
77  aux_basis%lmax(nsets), aux_basis%lmin(nsets))
78  aux_basis%lmax(1:nsets) = lmax(1:nsets)
79  aux_basis%lmin(1:nsets) = lmin(1:nsets)
80  aux_basis%npgf(1:nsets) = npgf(1:nsets)
81  DO iset = 1, nsets
82  aux_basis%nshell(iset) = 0
83  DO l = lmin(iset), lmax(iset)
84  aux_basis%nshell(iset) = aux_basis%nshell(iset) + nl(l, iset)
85  END DO
86  END DO
87  maxpgf = maxval(npgf(1:nsets))
88  maxshell = maxval(aux_basis%nshell(1:nsets))
89  ALLOCATE (aux_basis%zet(maxpgf, nsets))
90  aux_basis%zet(1:maxpgf, 1:nsets) = zet(1:maxpgf, 1:nsets)
91 
92  ALLOCATE (aux_basis%n(maxshell, nsets))
93  ALLOCATE (aux_basis%l(maxshell, nsets))
94  ALLOCATE (aux_basis%gcc(maxpgf, maxshell, nsets))
95 
96  DO iset = 1, nsets
97  ns = 0
98  DO l = lmin(iset), lmax(iset)
99  DO i = 1, nl(l, iset)
100  ns = ns + 1
101  aux_basis%l(ns, iset) = l
102  aux_basis%n(ns, iset) = l + i
103  END DO
104  END DO
105  END DO
106 
107  ! contraction
108  aux_basis%gcc = 0.0_dp
109  DO iset = 1, nsets
110  ns = 0
111  DO l = lmin(iset), lmax(iset)
112  nx = aux_basis%npgf(iset)
113  ALLOCATE (so(nx, nx))
114  cpassert(nx >= nl(l, iset))
115  DO i = 1, nx
116  za = (2.0_dp*zet(i, iset))**(0.25_dp*(2*l + 3))
117  DO j = i, nx
118  zb = (2.0_dp*zet(j, iset))**(0.25_dp*(2*l + 3))
119  zetab = zet(i, iset) + zet(j, iset)
120  so(i, j) = za*zb/zetab**(l + 1.5_dp)
121  so(j, i) = so(i, j)
122  END DO
123  END DO
124  info = 0
125  CALL lapack_spotrf("U", nx, so, nx, info)
126  cpassert(info == 0)
127  CALL dtrtri("U", "N", nx, so, nx, info)
128  cpassert(info == 0)
129  DO i = ns + 1, ns + nl(l, iset)
130  DO j = 1, i - ns
131  aux_basis%gcc(j, i, iset) = so(j, i - ns)
132  END DO
133  END DO
134  IF (nl(l, iset) < nx) THEN
135  i = ns + nl(l, iset)
136  DO j = nl(l, iset) + 1, nx
137  aux_basis%gcc(j, i, iset) = 1.0_dp
138  END DO
139  END IF
140  ns = ns + nl(l, iset)
141  DEALLOCATE (so)
142  END DO
143  END DO
144 
145  ! Initialise the depending aux_basis structures
146  ALLOCATE (aux_basis%first_cgf(maxshell, nsets))
147  ALLOCATE (aux_basis%first_sgf(maxshell, nsets))
148  ALLOCATE (aux_basis%last_cgf(maxshell, nsets))
149  ALLOCATE (aux_basis%last_sgf(maxshell, nsets))
150  ALLOCATE (aux_basis%ncgf_set(nsets))
151  ALLOCATE (aux_basis%nsgf_set(nsets))
152 
153  maxco = 0
154  ncgf = 0
155  nsgf = 0
156  DO iset = 1, nsets
157  aux_basis%ncgf_set(iset) = 0
158  aux_basis%nsgf_set(iset) = 0
159  DO ishell = 1, aux_basis%nshell(iset)
160  lshell = aux_basis%l(ishell, iset)
161  aux_basis%first_cgf(ishell, iset) = ncgf + 1
162  ncgf = ncgf + nco(lshell)
163  aux_basis%last_cgf(ishell, iset) = ncgf
164  aux_basis%ncgf_set(iset) = &
165  aux_basis%ncgf_set(iset) + nco(lshell)
166  aux_basis%first_sgf(ishell, iset) = nsgf + 1
167  nsgf = nsgf + nso(lshell)
168  aux_basis%last_sgf(ishell, iset) = nsgf
169  aux_basis%nsgf_set(iset) = &
170  aux_basis%nsgf_set(iset) + nso(lshell)
171  END DO
172  maxco = max(maxco, npgf(iset)*ncoset(lmax(iset)))
173  END DO
174  aux_basis%ncgf = ncgf
175  aux_basis%nsgf = nsgf
176 
177  ALLOCATE (aux_basis%lx(ncgf))
178  ALLOCATE (aux_basis%ly(ncgf))
179  ALLOCATE (aux_basis%lz(ncgf))
180  ALLOCATE (aux_basis%m(nsgf))
181  ALLOCATE (aux_basis%cgf_symbol(ncgf))
182  ALLOCATE (aux_basis%sgf_symbol(nsgf))
183 
184  ncgf = 0
185  nsgf = 0
186 
187  DO iset = 1, nsets
188  DO ishell = 1, aux_basis%nshell(iset)
189  lshell = aux_basis%l(ishell, iset)
190  DO ico = ncoset(lshell - 1) + 1, ncoset(lshell)
191  ncgf = ncgf + 1
192  aux_basis%lx(ncgf) = indco(1, ico)
193  aux_basis%ly(ncgf) = indco(2, ico)
194  aux_basis%lz(ncgf) = indco(3, ico)
195  aux_basis%cgf_symbol(ncgf) = &
196  cgf_symbol(aux_basis%n(ishell, iset), (/aux_basis%lx(ncgf), &
197  aux_basis%ly(ncgf), &
198  aux_basis%lz(ncgf)/))
199  END DO
200  DO m = -lshell, lshell
201  nsgf = nsgf + 1
202  aux_basis%m(nsgf) = m
203  aux_basis%sgf_symbol(nsgf) = &
204  sgf_symbol(aux_basis%n(ishell, iset), lshell, m)
205  END DO
206  END DO
207  END DO
208 
209  ! orbital radii (initialize later)
210  aux_basis%kind_radius = 0.0_dp
211  aux_basis%short_kind_radius = 0.0_dp
212  ALLOCATE (aux_basis%set_radius(nsets))
213  ALLOCATE (aux_basis%pgf_radius(maxpgf, nsets))
214  aux_basis%set_radius = 0.0_dp
215  aux_basis%pgf_radius = 0.0_dp
216 
217  ! basis transformation matrices
218  ALLOCATE (aux_basis%cphi(maxco, ncgf))
219  ALLOCATE (aux_basis%sphi(maxco, nsgf))
220  ALLOCATE (aux_basis%scon(maxco, nsgf))
221  ALLOCATE (aux_basis%norm_cgf(ncgf))
222  aux_basis%norm_type = 2
223 ! CALL init_orb_basis_set(aux_basis)
224 
225  END SUBROUTINE create_aux_basis
226 
227 END MODULE aux_basis_set
subroutine, public create_aux_basis(aux_basis, bsname, nsets, lmin, lmax, nl, npgf, zet)
create a basis in GTO form
Definition: aux_basis_set.F:54
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
integer, parameter, public default_string_length
Definition: kinds.F:57
Interface to the LAPACK F77 library.
Definition: lapack.F:17
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public ncoset
integer, dimension(:, :), allocatable, public indco
integer, dimension(:), allocatable, public nso
orbital_symbols
character(len=12) function, public cgf_symbol(n, lxyz)
Build a Cartesian orbital symbol (orbital labels for printing).
character(len=6) function, public sgf_symbol(n, l, m)
Build a spherical orbital symbol (orbital labels for printing).