25#include "./base/base_uses.f90"
31 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'negf_io'
60 s00, s01, h, s, hc, sc, h_scf)
61 CHARACTER(LEN=default_path_length),
INTENT(OUT) :: filename
62 LOGICAL,
INTENT(OUT) :: exist
65 INTEGER,
INTENT(IN),
OPTIONAL :: icontact, ispin
66 LOGICAL,
INTENT(IN),
OPTIONAL :: h00, h01, s00, s01, h, s, hc, sc, h_scf
68 CHARACTER(len=default_string_length) :: middle_name, string1, string2
69 LOGICAL :: my_h, my_h00, my_h01, my_h_scf, my_hc, &
70 my_s, my_s00, my_s01, my_sc
74 IF (
PRESENT(h00)) my_h00 = h00
76 IF (
PRESENT(h01)) my_h01 = h01
78 IF (
PRESENT(s00)) my_s00 = s00
80 IF (
PRESENT(s01)) my_s01 = s01
82 IF (
PRESENT(h)) my_h = h
84 IF (
PRESENT(s)) my_s = s
86 IF (
PRESENT(hc)) my_hc = hc
88 IF (
PRESENT(sc)) my_sc = sc
90 IF (
PRESENT(h_scf)) my_h_scf = h_scf
94 IF (my_h00 .OR. my_h01 .OR. my_s00 .OR. my_s01)
THEN
95 IF (.NOT.
PRESENT(icontact))
THEN
96 cpabort(
"Missing contact index for NEGF restart filename")
98 WRITE (string1, *) icontact
100 IF (my_h00 .OR. my_h01)
THEN
101 IF (.NOT.
PRESENT(ispin))
THEN
102 cpabort(
"Missing spin index for NEGF restart filename")
104 WRITE (string2, *) ispin
113 middle_name =
"N"//trim(string1)//
"-H00"
115 middle_name =
"N"//trim(string1)//
"-H00-S"//trim(string2)
117 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
118 extension=
".hs", my_local=.false.)
123 middle_name =
"N"//trim(string1)//
"-H01"
125 middle_name =
"N"//trim(string1)//
"-H01-S"//trim(string2)
127 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
128 extension=
".hs", my_local=.false.)
132 middle_name =
"N"//trim(string1)//
"-S00"
133 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
134 extension=
".hs", my_local=.false.)
138 middle_name =
"N"//trim(string1)//
"-S01"
139 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
140 extension=
".hs", my_local=.false.)
144 IF (my_h .OR. my_s .OR. my_hc .OR. my_sc)
THEN
145 IF (my_h .OR. my_hc)
THEN
146 IF (.NOT.
PRESENT(ispin))
THEN
147 cpabort(
"Missing spin index for NEGF restart filename")
149 WRITE (string2, *) ispin
152 IF (my_hc .OR. my_sc)
THEN
153 IF (.NOT.
PRESENT(icontact))
THEN
154 cpabort(
"Missing contact index for NEGF restart filename")
156 WRITE (string1, *) icontact
166 middle_name =
"Hs-S"//trim(string2)
168 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
169 extension=
".hs", my_local=.false.)
174 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
175 extension=
".hs", my_local=.false.)
180 middle_name =
"Hsc-N"//trim(string1)
182 middle_name =
"Hsc-N"//trim(string1)//
"-S"//trim(string2)
184 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
185 extension=
".hs", my_local=.false.)
189 middle_name =
"Ssc-N"//trim(string1)
190 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
191 extension=
".hs", my_local=.false.)
198 filename = negf_generate_filename(logger, print_key, &
199 extension=
"", my_local=.false., iter_string=.true.)
202 INQUIRE (file=filename, exist=exist)
222 FUNCTION negf_generate_filename(logger, print_key, middle_name, extension, &
223 my_local, iter_string)
RESULT(filename)
226 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
227 CHARACTER(len=*),
INTENT(IN) :: extension
228 LOGICAL,
INTENT(IN),
OPTIONAL :: my_local, iter_string
229 CHARACTER(len=default_path_length) :: filename
231 CHARACTER(len=default_path_length) :: outname, outpath, postfix, root
232 CHARACTER(len=default_string_length) :: my_middle_name
233 INTEGER :: my_ind1, my_ind2
237 IF (outpath(1:1) ==
'=')
THEN
238 cpassert(len(outpath) - 1 <= len(filename))
239 filename = outpath(2:)
242 IF (outpath ==
"__STD_OUT__") outpath =
""
245 my_ind1 = index(outpath,
"/")
246 my_ind2 = len_trim(outpath)
247 IF (my_ind1 /= 0)
THEN
249 DO WHILE (index(outpath(my_ind1 + 1:my_ind2),
"/") /= 0)
250 my_ind1 = index(outpath(my_ind1 + 1:my_ind2),
"/") + my_ind1
252 IF (my_ind1 == my_ind2)
THEN
255 outname = outpath(my_ind1 + 1:my_ind2)
259 IF (
PRESENT(middle_name))
THEN
260 IF (outname /=
"")
THEN
261 my_middle_name =
"-"//trim(outname)//
"-"//middle_name
263 my_middle_name =
"-"//middle_name
266 IF (outname /=
"")
THEN
267 my_middle_name =
"-"//trim(outname)
273 IF (.NOT. has_root)
THEN
274 root = trim(logger%iter_info%project_name)//trim(my_middle_name)
275 ELSE IF (outname ==
"")
THEN
276 root = outpath(1:my_ind1)//trim(logger%iter_info%project_name)//trim(my_middle_name)
278 root = outpath(1:my_ind1)//my_middle_name(2:len_trim(my_middle_name))
282 IF (
PRESENT(iter_string))
THEN
283 IF (iter_string)
THEN
285 postfix =
"-"//trim(
cp_iter_string(logger%iter_info, print_key=print_key, for_file=.true.))
286 IF (trim(postfix) ==
"-") postfix =
""
288 postfix = trim(postfix)//extension
294 root=root, postfix=postfix, local=my_local)
296 END FUNCTION negf_generate_filename
306 CHARACTER(LEN=default_path_length),
INTENT(IN) :: filename
307 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: matrix
309 CHARACTER(len=100) :: sfmt
310 INTEGER :: i, j, ncol, nrow, print_unit
312 CALL open_file(file_name=filename, file_status=
"REPLACE", &
313 file_form=
"FORMATTED", file_action=
"WRITE", &
314 file_position=
"REWIND", unit_number=print_unit)
316 nrow =
SIZE(matrix, 1)
317 ncol =
SIZE(matrix, 2)
318 WRITE (sfmt,
"('(',i0,'(E15.5))')") ncol
319 WRITE (print_unit, *) nrow, ncol
321 WRITE (print_unit, sfmt) (matrix(i, j), j=1, ncol)
336 CHARACTER(LEN=default_path_length),
INTENT(IN) :: filename
337 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: matrix
339 INTEGER :: i, j, ncol, nrow, print_unit
341 CALL open_file(file_name=filename, file_status=
"OLD", &
342 file_form=
"FORMATTED", file_action=
"READ", &
343 file_position=
"REWIND", unit_number=print_unit)
345 READ (print_unit, *) nrow, ncol
347 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)
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
character(len=default_string_length) function, public cp_iter_string(iter_info, print_key, for_file)
returns the iteration string, a string that is useful to create unique filenames (once you trim it)
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, h_scf)
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...