22#include "./base/base_uses.f90"
29 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ri_rs_grid_from_file'
40 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_ri_rs_grid_from_file'
42 CHARACTER(LEN=default_path_length) :: filepath
43 CHARACTER(LEN=default_string_length) :: element_symbol
44 INTEGER :: handle, iatom, ikind, natom, nkind
48 CALL timeset(routinen, handle)
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))
55 ALLOCATE (kind_grids(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, filepath)
60 CALL read_ri_rs_grid_file(trim(filepath), kind_grids(ikind)%raw_points)
61 kind_grids(ikind)%npts =
SIZE(kind_grids(ikind)%raw_points, 2)
64 IF (
ALLOCATED(bs_env%ri_rs%atomic_grids))
DEALLOCATE (bs_env%ri_rs%atomic_grids)
65 ALLOCATE (bs_env%ri_rs%atomic_grids(natom))
67 ikind = particle_set(iatom)%atomic_kind%kind_number
68 bs_env%ri_rs%atomic_grids(iatom) = kind_grids(ikind)
70 DEALLOCATE (kind_grids)
82 SUBROUTINE get_ri_rs_grid_filepath(element_symbol, grid_select, filepath)
83 CHARACTER(LEN=*),
INTENT(IN) :: element_symbol
84 INTEGER,
INTENT(IN) :: grid_select
85 CHARACTER(LEN=*),
INTENT(OUT) :: filepath
87 CHARACTER(LEN=default_string_length) :: suffix
89 SELECT CASE (grid_select)
91 suffix =
"_def2-tzvp-rs.ion"
93 suffix =
"_cc-pvtz-rs.ion"
97 cpabort(
"Unknown grid_select (1=def2-TZVPP, 2=cc-pVTZ, 3=user-provided).")
99 filepath =
"ri_rs_grid/"//trim(element_symbol)//trim(suffix)
100 END SUBROUTINE get_ri_rs_grid_filepath
107 SUBROUTINE read_ri_rs_grid_file(filename, points)
108 CHARACTER(LEN=*),
INTENT(IN) :: filename
109 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :), &
110 INTENT(OUT) :: points
112 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_ri_rs_grid_file'
114 CHARACTER(LEN=default_path_length) :: line
115 INTEGER :: handle, ierr, ipoint, iunit, npoints
116 LOGICAL :: found_points
118 CALL timeset(routinen, handle)
119 CALL open_file(file_name=trim(filename), unit_number=iunit, &
120 file_action=
'READ', file_status=
'OLD')
122 CALL read_ri_rs_grid_header(iunit, filename, npoints)
125 found_points = .false.
127 READ (iunit,
'(A)', iostat=ierr) line
129 IF (index(line,
'<grid_points>') > 0)
THEN
130 found_points = .true.
134 IF (.NOT. found_points)
THEN
135 cpabort(
'RI-RS .ion file has no <grid_points> block: '//trim(filename))
138 ALLOCATE (points(3, npoints))
139 DO ipoint = 1, npoints
140 READ (iunit, *, iostat=ierr) points(:, ipoint)
141 IF (ierr /= 0) cpabort(
'Invalid grid point in RI-RS .ion file: '//trim(filename))
144 CALL timestop(handle)
145 END SUBROUTINE read_ri_rs_grid_file
153 SUBROUTINE read_ri_rs_grid_header(iunit, filename, npoints)
154 INTEGER,
INTENT(IN) :: iunit
155 CHARACTER(LEN=*),
INTENT(IN) :: filename
156 INTEGER,
INTENT(OUT) :: npoints
158 CHARACTER(LEN=default_path_length) :: line
159 INTEGER :: colon, ierr
160 LOGICAL :: found_size
165 READ (iunit,
'(A)', iostat=ierr) line
167 IF (index(line,
'n points') > 0)
THEN
168 colon = index(line,
':')
170 READ (line(colon + 1:), *, iostat=ierr) npoints
171 found_size = ierr == 0 .AND. npoints > 0
176 IF (.NOT. found_size)
THEN
177 cpabort(
'RI-RS .ion file has no valid n points field: '//trim(filename))
179 END SUBROUTINE read_ri_rs_grid_header
Utility routines to open and close files.
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Define the data structure for the particle information.
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.
Shared real-space resolution-of-identity grid and matrix data.