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 WRITE (string1, *) icontact
95 WRITE (string2, *) ispin
103 middle_name =
"N"//trim(string1)//
"-H00"
105 middle_name =
"N"//trim(string1)//
"-H00-S"//trim(string2)
107 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
108 extension=
".hs", my_local=.false.)
113 middle_name =
"N"//trim(string1)//
"-H01"
115 middle_name =
"N"//trim(string1)//
"-H01-S"//trim(string2)
117 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
118 extension=
".hs", my_local=.false.)
122 middle_name =
"N"//trim(string1)//
"-S00"
123 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
124 extension=
".hs", my_local=.false.)
128 middle_name =
"N"//trim(string1)//
"-S01"
129 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
130 extension=
".hs", my_local=.false.)
140 middle_name =
"Hs-S"//trim(string2)
142 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
143 extension=
".hs", my_local=.false.)
148 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
149 extension=
".hs", my_local=.false.)
154 middle_name =
"Hsc-N"//trim(string1)
156 middle_name =
"Hsc-N"//trim(string1)//
"-S"//trim(string2)
158 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
159 extension=
".hs", my_local=.false.)
163 middle_name =
"Ssc-N"//trim(string1)
164 filename = negf_generate_filename(logger, print_key, middle_name=middle_name, &
165 extension=
".hs", my_local=.false.)
172 filename = negf_generate_filename(logger, print_key, &
173 extension=
"", my_local=.false., iter_string=.true.)
176 INQUIRE (file=filename, exist=exist)
196 FUNCTION negf_generate_filename(logger, print_key, middle_name, extension, &
197 my_local, iter_string)
RESULT(filename)
200 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
201 CHARACTER(len=*),
INTENT(IN) :: extension
202 LOGICAL,
INTENT(IN),
OPTIONAL :: my_local, iter_string
203 CHARACTER(len=default_path_length) :: filename
205 CHARACTER(len=default_path_length) :: outname, outpath, postfix, root
206 CHARACTER(len=default_string_length) :: my_middle_name
207 INTEGER :: my_ind1, my_ind2
211 IF (outpath(1:1) ==
'=')
THEN
212 cpassert(len(outpath) - 1 <= len(filename))
213 filename = outpath(2:)
216 IF (outpath ==
"__STD_OUT__") outpath =
""
219 my_ind1 = index(outpath,
"/")
220 my_ind2 = len_trim(outpath)
221 IF (my_ind1 /= 0)
THEN
223 DO WHILE (index(outpath(my_ind1 + 1:my_ind2),
"/") /= 0)
224 my_ind1 = index(outpath(my_ind1 + 1:my_ind2),
"/") + my_ind1
226 IF (my_ind1 == my_ind2)
THEN
229 outname = outpath(my_ind1 + 1:my_ind2)
233 IF (
PRESENT(middle_name))
THEN
234 IF (outname /=
"")
THEN
235 my_middle_name =
"-"//trim(outname)//
"-"//middle_name
237 my_middle_name =
"-"//middle_name
240 IF (outname /=
"")
THEN
241 my_middle_name =
"-"//trim(outname)
247 IF (.NOT. has_root)
THEN
248 root = trim(logger%iter_info%project_name)//trim(my_middle_name)
249 ELSE IF (outname ==
"")
THEN
250 root = outpath(1:my_ind1)//trim(logger%iter_info%project_name)//trim(my_middle_name)
252 root = outpath(1:my_ind1)//my_middle_name(2:len_trim(my_middle_name))
255 IF (
PRESENT(iter_string) .AND. iter_string)
THEN
257 postfix =
"-"//trim(
cp_iter_string(logger%iter_info, print_key=print_key, for_file=.true.))
258 IF (trim(postfix) ==
"-") postfix =
""
260 postfix = trim(postfix)//extension
267 root=root, postfix=postfix, local=my_local)
269 END FUNCTION negf_generate_filename
279 CHARACTER(LEN=default_path_length),
INTENT(IN) :: filename
280 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: matrix
282 CHARACTER(len=100) :: sfmt
283 INTEGER :: i, j, ncol, nrow, print_unit
285 CALL open_file(file_name=filename, file_status=
"REPLACE", &
286 file_form=
"FORMATTED", file_action=
"WRITE", &
287 file_position=
"REWIND", unit_number=print_unit)
289 nrow =
SIZE(matrix, 1)
290 ncol =
SIZE(matrix, 2)
291 WRITE (sfmt,
"('(',i0,'(E15.5))')") ncol
292 WRITE (print_unit, *) nrow, ncol
294 WRITE (print_unit, sfmt) (matrix(i, j), j=1, ncol)
309 CHARACTER(LEN=default_path_length),
INTENT(IN) :: filename
310 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: matrix
312 INTEGER :: i, j, ncol, nrow, print_unit
314 CALL open_file(file_name=filename, file_status=
"OLD", &
315 file_form=
"FORMATTED", file_action=
"READ", &
316 file_position=
"REWIND", unit_number=print_unit)
318 READ (print_unit, *) nrow, ncol
320 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...