24#include "./base/base_uses.f90"
30 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'negf_io'
57 SUBROUTINE negf_restart_file_name(filename, exist, negf_section, logger, icontact, ispin, h00, h01, s00, s01, h, s, hc, sc)
58 CHARACTER(LEN=default_path_length),
INTENT(OUT) :: filename
59 LOGICAL,
INTENT(OUT) :: exist
62 INTEGER,
INTENT(IN),
OPTIONAL :: icontact, ispin
63 LOGICAL,
INTENT(IN),
OPTIONAL :: h00, h01, s00, s01, h, s, hc, sc
65 CHARACTER(len=default_string_length) :: middle_name, string1, string2
66 LOGICAL :: my_h, my_h00, my_h01, my_hc, my_s, &
71 IF (
PRESENT(h00)) my_h00 = h00
73 IF (
PRESENT(h01)) my_h01 = h01
75 IF (
PRESENT(s00)) my_s00 = s00
77 IF (
PRESENT(s01)) my_s01 = s01
79 IF (
PRESENT(h)) my_h = h
81 IF (
PRESENT(s)) my_s = s
83 IF (
PRESENT(hc)) my_hc = hc
85 IF (
PRESENT(sc)) my_sc = sc
89 WRITE (string1, *) icontact
90 WRITE (string2, *) ispin
98 middle_name =
"N"//trim(string1)//
"-H00"
100 middle_name =
"N"//trim(string1)//
"-H00-S"//trim(string2)
102 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
103 extension=
".hs", my_local=.false.)
108 middle_name =
"N"//trim(string1)//
"-H01"
110 middle_name =
"N"//trim(string1)//
"-H01-S"//trim(string2)
112 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
113 extension=
".hs", my_local=.false.)
117 middle_name =
"N"//trim(string1)//
"-S00"
118 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
119 extension=
".hs", my_local=.false.)
123 middle_name =
"N"//trim(string1)//
"-S01"
124 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
125 extension=
".hs", my_local=.false.)
135 middle_name =
"Hs-S"//trim(string2)
137 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
138 extension=
".hs", my_local=.false.)
143 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
144 extension=
".hs", my_local=.false.)
149 middle_name =
"Hsc-N"//trim(string1)
151 middle_name =
"Hsc-N"//trim(string1)//
"-S"//trim(string2)
153 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
154 extension=
".hs", my_local=.false.)
158 middle_name =
"Ssc-N"//trim(string1)
159 filename = negf_elecrodes_generate_filename(logger, print_key, middle_name=middle_name, &
160 extension=
".hs", my_local=.false.)
163 INQUIRE (file=filename, exist=exist)
182 FUNCTION negf_elecrodes_generate_filename(logger, print_key, middle_name, extension, &
183 my_local)
RESULT(filename)
186 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
187 CHARACTER(len=*),
INTENT(IN) :: extension
188 LOGICAL,
INTENT(IN) :: my_local
189 CHARACTER(len=default_path_length) :: filename
191 CHARACTER(len=default_path_length) :: outname, outpath, postfix, root
192 CHARACTER(len=default_string_length) :: my_middle_name
193 INTEGER :: my_ind1, my_ind2
197 IF (outpath(1:1) ==
'=')
THEN
198 cpassert(len(outpath) - 1 <= len(filename))
199 filename = outpath(2:)
202 IF (outpath ==
"__STD_OUT__") outpath =
""
205 my_ind1 = index(outpath,
"/")
206 my_ind2 = len_trim(outpath)
207 IF (my_ind1 /= 0)
THEN
209 DO WHILE (index(outpath(my_ind1 + 1:my_ind2),
"/") /= 0)
210 my_ind1 = index(outpath(my_ind1 + 1:my_ind2),
"/") + my_ind1
212 IF (my_ind1 == my_ind2)
THEN
215 outname = outpath(my_ind1 + 1:my_ind2)
219 IF (
PRESENT(middle_name))
THEN
220 IF (outname /=
"")
THEN
221 my_middle_name =
"-"//trim(outname)//
"-"//middle_name
223 my_middle_name =
"-"//middle_name
226 IF (outname /=
"")
THEN
227 my_middle_name =
"-"//trim(outname)
233 IF (.NOT. has_root)
THEN
234 root = trim(logger%iter_info%project_name)//trim(my_middle_name)
235 ELSE IF (outname ==
"")
THEN
236 root = outpath(1:my_ind1)//trim(logger%iter_info%project_name)//trim(my_middle_name)
238 root = outpath(1:my_ind1)//my_middle_name(2:len_trim(my_middle_name))
245 root=root, postfix=postfix, local=my_local)
247 END FUNCTION negf_elecrodes_generate_filename
257 CHARACTER(LEN=default_path_length),
INTENT(IN) :: filename
258 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: matrix
260 CHARACTER(len=100) :: sfmt
261 INTEGER :: i, j, ncol, nrow, print_unit
263 CALL open_file(file_name=filename, file_status=
"REPLACE", &
264 file_form=
"FORMATTED", file_action=
"WRITE", &
265 file_position=
"REWIND", unit_number=print_unit)
267 nrow =
SIZE(matrix, 1)
268 ncol =
SIZE(matrix, 2)
269 WRITE (sfmt,
"('(',i0,'(E15.5))')") ncol
270 WRITE (print_unit, *) nrow, ncol
272 WRITE (print_unit, sfmt) (matrix(i, j), j=1, ncol)
287 CHARACTER(LEN=default_path_length),
INTENT(IN) :: filename
288 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: matrix
290 INTEGER :: i, j, ncol, nrow, print_unit
292 CALL open_file(file_name=filename, file_status=
"OLD", &
293 file_form=
"FORMATTED", file_action=
"READ", &
294 file_position=
"REWIND", unit_number=print_unit)
296 READ (print_unit, *) nrow, ncol
298 READ (print_unit, *) (matrix(i, j), j=1, ncol)
Utility routines to open and close files. Tracking of preconnections.
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.
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.
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_logger_generate_filename(logger, res, root, postfix, local)
generates a unique filename (ie adding eventual suffixes and process ids)
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Routines for reading and writing NEGF restart files.
subroutine, public negf_restart_file_name(filename, exist, negf_section, logger, icontact, ispin, h00, h01, s00, s01, h, s, hc, sc)
Checks if the restart file exists and returns the filename.
subroutine, public negf_print_matrix_to_file(filename, matrix)
Prints full matrix to a file.
subroutine, public negf_read_matrix_from_file(filename, matrix)
Reads full matrix from a file.
type of a logger, at the moment it contains just a print level starting at which level it should be l...