(git:f2099e5)
Loading...
Searching...
No Matches
gw_ri_rs_grid_from_file.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Read pretabulated atom-relative RI-RS grids from data files.
10!> \par History
11!> 09.2026 created
12! **************************************************************************************************
14 USE cp_files, ONLY: close_file,&
16 USE kinds, ONLY: default_path_length,&
18 dp
22#include "./base/base_uses.f90"
23
24 IMPLICIT NONE
25 PRIVATE
26
28
29 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'gw_ri_rs_grid_from_file'
30
31CONTAINS
32
33! **************************************************************************************************
34!> \brief Read pretabulated atom-relative RI-RS grids from the CP2K data files.
35!> \param bs_env ...
36! **************************************************************************************************
37 SUBROUTINE read_ri_rs_grid_from_file(bs_env)
38 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
39
40 CHARACTER(LEN=*), PARAMETER :: routinen = 'read_ri_rs_grid_from_file'
41
42 CHARACTER(LEN=default_path_length) :: filepath
43 CHARACTER(LEN=default_string_length) :: element_symbol
44 INTEGER :: handle, iatom, ikind, natom, nkind
45 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
46 TYPE(rirs_grid_type), ALLOCATABLE :: kind_grids(:)
47
48 CALL timeset(routinen, handle)
49
50 cpassert(ASSOCIATED(bs_env%ri_rs%atomic_kind_set))
51 nkind = SIZE(bs_env%ri_rs%atomic_kind_set)
52 particle_set => bs_env%ri_rs%particle_set
53 cpassert(ASSOCIATED(particle_set))
54 natom = bs_env%n_atom
55 ALLOCATE (kind_grids(nkind))
56
57 DO ikind = 1, nkind
58 element_symbol = trim(bs_env%ri_rs%atomic_kind_set(ikind)%element_symbol)
59 CALL get_ri_rs_grid_filepath(element_symbol, bs_env%ri_rs%grid_select, &
60 bs_env%ri_rs%grid_file_suffix, filepath)
61 CALL read_ri_rs_grid_file(trim(filepath), kind_grids(ikind)%raw_points)
62 kind_grids(ikind)%npts = SIZE(kind_grids(ikind)%raw_points, 2)
63 END DO
64
65 IF (ALLOCATED(bs_env%ri_rs%atomic_grids)) DEALLOCATE (bs_env%ri_rs%atomic_grids)
66 ALLOCATE (bs_env%ri_rs%atomic_grids(natom))
67 DO iatom = 1, natom
68 ikind = particle_set(iatom)%atomic_kind%kind_number
69 bs_env%ri_rs%atomic_grids(iatom) = kind_grids(ikind)
70 END DO
71 DEALLOCATE (kind_grids)
72
73 CALL timestop(handle)
74
75 END SUBROUTINE read_ri_rs_grid_from_file
76
77! **************************************************************************************************
78!> \brief Construct the path of a pretabulated RI-RS grid file.
79!> \param element_symbol ...
80!> \param grid_select ...
81!> \param grid_file_suffix ...
82!> \param filepath ...
83! **************************************************************************************************
84 SUBROUTINE get_ri_rs_grid_filepath(element_symbol, grid_select, grid_file_suffix, filepath)
85 CHARACTER(LEN=*), INTENT(IN) :: element_symbol
86 INTEGER, INTENT(IN) :: grid_select
87 CHARACTER(LEN=*), INTENT(IN) :: grid_file_suffix
88 CHARACTER(LEN=*), INTENT(OUT) :: filepath
89
90 CHARACTER(LEN=default_string_length) :: suffix
91
92 SELECT CASE (grid_select)
93 CASE (1)
94 suffix = "_def2-tzvp-rs.ion"
95 CASE (2)
96 suffix = "_cc-pvtz-rs.ion"
97 CASE (3)
98 IF (len_trim(grid_file_suffix) > 0) THEN
99 suffix = trim(grid_file_suffix)
100 ELSE
101 suffix = "_rirs.ion"
102 END IF
103 CASE DEFAULT
104 cpabort("Unknown grid_select (1=def2-TZVPP, 2=cc-pVTZ, 3=user-provided).")
105 END SELECT
106 filepath = "ri_rs_grid/"//trim(element_symbol)//trim(suffix)
107 END SUBROUTINE get_ri_rs_grid_filepath
108
109! **************************************************************************************************
110!> \brief Read Cartesian grid points from the existing CP2K RI-RS .ion format.
111!> \param filename Complete input filename; no suffix or element-name construction is performed.
112!> \param points Grid points in Bohr, indexed (alpha,l).
113! **************************************************************************************************
114 SUBROUTINE read_ri_rs_grid_file(filename, points)
115 CHARACTER(LEN=*), INTENT(IN) :: filename
116 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :), &
117 INTENT(OUT) :: points
118
119 CHARACTER(LEN=*), PARAMETER :: routinen = 'read_ri_rs_grid_file'
120
121 CHARACTER(LEN=default_path_length) :: line
122 INTEGER :: handle, ierr, ipoint, iunit, npoints
123 LOGICAL :: found_points
124
125 CALL timeset(routinen, handle)
126 CALL open_file(file_name=trim(filename), unit_number=iunit, &
127 file_action='READ', file_status='OLD')
128
129 CALL read_ri_rs_grid_header(iunit, filename, npoints)
130
131 rewind(iunit)
132 found_points = .false.
133 DO
134 READ (iunit, '(A)', iostat=ierr) line
135 IF (ierr /= 0) EXIT
136 IF (index(line, '<grid_points>') > 0) THEN
137 found_points = .true.
138 EXIT
139 END IF
140 END DO
141 IF (.NOT. found_points) THEN
142 cpabort('RI-RS .ion file has no <grid_points> block: '//trim(filename))
143 END IF
144
145 ALLOCATE (points(3, npoints))
146 DO ipoint = 1, npoints
147 READ (iunit, *, iostat=ierr) points(:, ipoint)
148 IF (ierr /= 0) cpabort('Invalid grid point in RI-RS .ion file: '//trim(filename))
149 END DO
150 CALL close_file(unit_number=iunit)
151 CALL timestop(handle)
152 END SUBROUTINE read_ri_rs_grid_file
153
154! **************************************************************************************************
155!> \brief Read and validate the point count in an open RI-RS grid file.
156!> \param iunit ...
157!> \param filename ...
158!> \param npoints ...
159! **************************************************************************************************
160 SUBROUTINE read_ri_rs_grid_header(iunit, filename, npoints)
161 INTEGER, INTENT(IN) :: iunit
162 CHARACTER(LEN=*), INTENT(IN) :: filename
163 INTEGER, INTENT(OUT) :: npoints
164
165 CHARACTER(LEN=default_path_length) :: line
166 INTEGER :: colon, ierr
167 LOGICAL :: found_size
168
169 found_size = .false.
170 npoints = 0
171 DO
172 READ (iunit, '(A)', iostat=ierr) line
173 IF (ierr /= 0) EXIT
174 IF (index(line, 'n points') > 0) THEN
175 colon = index(line, ':')
176 IF (colon > 0) THEN
177 READ (line(colon + 1:), *, iostat=ierr) npoints
178 found_size = ierr == 0 .AND. npoints > 0
179 END IF
180 EXIT
181 END IF
182 END DO
183 IF (.NOT. found_size) THEN
184 cpabort('RI-RS .ion file has no valid n points field: '//trim(filename))
185 END IF
186 END SUBROUTINE read_ri_rs_grid_header
187
Utility routines to open and close files. Tracking of preconnections.
Definition cp_files.F:16
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
Definition cp_files.F:323
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Definition cp_files.F:123
Read pretabulated atom-relative RI-RS grids from data files.
subroutine, public read_ri_rs_grid_from_file(bs_env)
Read pretabulated atom-relative RI-RS grids from the CP2K data files.
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
integer, parameter, public default_path_length
Definition kinds.F:58
Define the data structure for the particle information.