59 integer,
parameter :: RESTART_N_DATA_TYPES = 15
61 integer,
parameter,
public :: &
62 RESTART_UNDEFINED = -1, &
82 character(len=20) :: tag
83 character(len=MAX_PATH_LEN) :: basedir
84 character(len=MAX_PATH_LEN) :: dir
89 integer,
parameter,
public :: &
90 RESTART_TYPE_DUMP = 1, &
94 integer,
parameter,
public :: &
95 RESTART_FLAG_STATES = 1, &
106 character(len=20) :: tag
107 character(len=MAX_PATH_LEN) :: dir
109 integer :: default_flags = 0
112 character(len=4),
parameter :: type_string(2) = (/
"DUMP",
"LOAD"/)
124 type(namespace_t),
pointer,
public :: namespace
125 integer :: data_type = restart_undefined
126 integer ::
type = restart_undefined
128 character(len=MAX_PATH_LEN) :: dir_
129 character(len=MAX_PATH_LEN) :: pwd
132 character(len=MAX_PATH_LEN),
public :: basedir
134 type(mpi_grp_t) ,
public :: mpi_grp
135 logical :: initialized = .false.
139 procedure,
private :: restart_basic_init
140 generic :: init => restart_basic_init
163 integer(int64),
allocatable :: map(:)
165 integer,
public :: file_format_states
176 procedure,
private :: drestart_read_mesh_function, zrestart_read_mesh_function
177 generic :: read_mesh_function => drestart_read_mesh_function, zrestart_read_mesh_function
226 subroutine block_signals()
228 end subroutine block_signals
233 subroutine unblock_signals()
235 end subroutine unblock_signals
242 type(mpi_comm),
intent(in) :: comm
245 logical :: file_exists
252 inquire(file=
'stop', exist=file_exists)
253 if (file_exists)
then
261 call mpi_bcast(
clean_stop, 1, mpi_logical, 0, comm)
276 integer,
intent(in) :: data_type
277 integer,
intent(in) ::
type
279 integer,
intent(out) :: ierr
280 character(len=*),
optional,
intent(in) :: dir
283 character(len=MAX_PATH_LEN) :: basedir, dirname
284 integer :: iline, n_cols, idata_type, i
285 character(len=MAX_PATH_LEN) :: default_basedir
286 character(len=20) :: tag
288 logical :: restart_write, dir_exists
289 character(len=MAX_NAMESPACE_LEN) :: namespace_prefix
297 namespace_prefix = trim(namespace%get())
299 default_basedir = trim(
io_workdir())//
'/restart/'
300 restart%basedir = default_basedir
301 restart%skip_ = .false.
302 restart%data_type = data_type
303 if(data_type>0 .and. data_type<=restart_n_data_types)
then
304 restart%flags =
basic_info(data_type)%default_flags
309 if (data_type < restart_undefined .and. data_type > restart_n_data_types)
then
310 message(1) =
"Illegal data_type in restart_init"
313 restart%namespace => namespace
457 if (
parse_block(namespace,
'RestartOptions', blk) == 0)
then
464 if (idata_type < 0 .or. idata_type > restart_n_data_types)
then
465 call messages_input_error(namespace,
'RestartOptions',
"Invalid data type", row=iline-1, column=0)
467 if (data_type == 0)
then
471 if (idata_type == data_type .or. idata_type == 0)
then
476 namespace_prefix = namespace_prefix(1:len_trim(namespace_prefix)-len_trim(
'.RestartOptions'))
478 if (len_trim(namespace_prefix) == 0 .or. trim(namespace%get()) == trim(namespace_prefix))
then
479 namespace_prefix = trim(namespace%get())
483 namespace_prefix =
""
494 basedir = restart%basedir
497 do i=1, len(namespace_prefix)
498 if (namespace_prefix(i:i) ==
'.') namespace_prefix(i:i) =
'/'
502 basedir = trim(basedir)//trim(namespace_prefix)
504 dirname = trim(
basic_info(restart%data_type)%dir)
508 select case (restart%type)
509 case (restart_type_dump)
521 restart%skip_ = .not. restart_write
523 if (restart%skip_)
then
524 message(1) =
'Restart information will not be written.'
530 restart%skip_ = .false.
533 message(1) =
"Unknown restart type in restart_init"
539 if (restart%data_type == restart_undefined)
then
546 restart%dir_ = trim(basedir)//trim(dirname)
548 if (index(restart%dir_,
'/', .
true.) == len_trim(restart%dir_))
then
549 restart%dir_ = restart%dir_(1:len_trim(restart%dir_)-1)
553 restart%pwd = restart%dir_
556 if (restart%mpi_grp%is_root())
then
558 if (restart%type == restart_type_dump .and. .not. dir_exists)
then
562 if (restart%mpi_grp%size > 1)
then
563 call restart%mpi_grp%bcast(dir_exists, 1, mpi_logical, 0)
566 if (restart%data_type == restart_undefined)
then
572 select case (restart%type)
573 case (restart_type_dump)
574 if (.not. restart%skip_)
then
575 message(1) =
"Info: "//trim(tag)//
" restart information will be written to '"//trim(restart%pwd)//
"'."
580 if (.not. dir_exists)
then
582 restart%skip_ = .
true.
584 message(1) =
"Info: Could not find '"//trim(restart%pwd)//
"' directory for restart."
585 message(2) =
"Info: No restart information will be read."
588 message(1) =
"Info: "//trim(tag)//
" restart information will be read from '"//trim(restart%pwd)//
"'."
594 restart%initialized = .
true.
603 res = restart%mpi_grp%is_root()
613 subroutine restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
616 integer,
intent(in) :: data_type
617 integer,
intent(in) ::
type
620 integer,
intent(out) :: ierr
621 class(
mesh_t),
optional,
intent(in) :: mesh
623 character(len=*),
optional,
intent(in) :: dir
625 logical,
optional,
intent(in) :: exact
628 logical :: grid_changed, grid_reordered, exact_, with_changed_grid
629 integer :: default_format
639 restart%has_mesh =
present(mesh)
644 if (
present(exact) .and. .not.
present(mesh))
then
645 message(1) =
"Error in restart_init: the 'exact' optional argument requires a mesh."
651 restart%has_mesh =
present(mesh)
654 if(
present(mesh))
then
675 default_format = option__restartfileformatstates__adios2
677 default_format = option__restartfileformatstates__obf
679 call parse_variable(namespace,
'RestartFileFormatStates', default_format, restart%file_format_states)
684 if (restart%file_format_states == option__restartfileformatstates__adios2)
then
688 message(1) =
"Error: adios2 restart file format requested, but not compiled against ADIOS2 library."
700 call parse_variable(namespace,
'RestartWithChangedGrid', .false., with_changed_grid)
702 select case (restart%type)
703 case (restart_type_dump)
704 if (.not. restart%skip_)
then
707 call index_dump(mesh%idx, mesh%np_part_global, restart%pwd, restart%mpi_grp, &
708 restart%namespace, ierr)
710 message(1) =
"Unable to write index map to '"//trim(restart%pwd)//
"'."
716 message(1) =
"Unable to write mesh fingerprint to '"//trim(restart%pwd)//
"/grid'."
722 if(.not. restart%skip_)
then
724 restart%mpi_grp, grid_changed, grid_reordered, restart%map, ierr)
729 message(1) =
"Unable to check mesh compatibility: unable to read mesh fingerprint"
730 message(2) =
"in '"//trim(restart%pwd)//
"'."
731 else if (ierr > 1)
then
732 message(1) =
"Mesh from current calculation is not compatible with mesh found in"
733 message(2) =
"'"//trim(restart%pwd)//
"'."
735 message(3) =
"No restart information will be read."
741 if (grid_changed)
then
742 if (grid_reordered)
then
743 message(1) =
"Info: Octopus is attempting to restart from a mesh with a different order of points."
745 message(1) =
"Info: Octopus is attempting to restart from a different mesh."
747 if (with_changed_grid)
then
750 message(2) =
"This is disabled. To enable this, set RestartWithChangedGrid=True."
757 restart%skip_ = grid_changed .and. .not. grid_reordered
758 if (restart%skip_)
then
759 message(1) =
"This calculation requires the exact same mesh to restart."
760 message(2) =
"No restart information will be read from '"//trim(restart%pwd)//
"'."
765 restart%skip_ = .false.
773 if (restart%mpi_grp%size > 1)
then
774 call restart%mpi_grp%barrier()
789 restart%data_type = 0
790 restart%skip_ = .
true.
798 class(
restart_t),
intent(inout) :: restart
802 if (restart%mpi_grp%is_root() .and. .not. restart%skip_)
then
803 select case (restart%type)
805 message(1) =
"Info: Finished reading information "//trim(
basic_info(restart%type)%tag)//
" from '"//trim(restart%dir_)//
"'."
806 call io_rm(trim(restart%pwd)//
"/loading")
807 case (restart_type_dump)
808 call io_rm(trim(restart%pwd)//
"/dumping")
809 message(1) =
"Info: Finished writing information "//trim(
basic_info(restart%type)%tag)//
" to '"//trim(restart%dir_)//
"'."
814 safe_deallocate_a(restart%map)
815 restart%has_mesh = .false.
833 character(len=MAX_PATH_LEN) :: restart_basic_dir
835 push_sub(restart_basic_dir)
839 pop_sub(restart_basic_dir)
848 character(len=*),
intent(in) :: dirname
849 integer,
intent(out) :: ierr
853 assert(.not. restart%skip_)
857 select case (restart%type)
858 case (restart_type_dump)
861 if (.not.
loct_dir_exists(trim(restart%dir_)//
"/"//trim(dirname)))
then
867 if (index(dirname,
'/', .
true.) == len_trim(dirname))
then
868 restart%pwd = trim(restart%dir_)//
"/"//dirname(1:len_trim(dirname)-1)
870 restart%pwd = trim(restart%dir_)//
"/"//trim(dirname)
885 assert(.not. restart%skip_)
887 restart%pwd = restart%dir_
897 character(len=*),
intent(in) :: dirname
901 assert(.not. restart%skip_)
903 assert(restart%type == restart_type_dump)
905 call io_mkdir(trim(restart%pwd)//
"/"//trim(dirname), parents=.
true.)
915 character(len=*),
intent(in) :: name
917 assert(.not. restart%skip_)
918 assert(restart%type == restart_type_dump)
922 call io_rm(trim(restart%pwd)//
"/"//trim(name))
937 character(len=*),
intent(in) :: filename
938 character(len=*),
optional,
intent(in) :: status
939 character(len=*),
optional,
intent(in) :: position
940 logical,
optional,
intent(in) :: silent
941 integer :: restart_basic_open
944 character(len=20) :: action, status_
946 push_sub(restart_basic_open)
948 assert(restart%initialized)
949 assert(.not. restart%skip_)
951 select case (restart%type)
952 case (restart_type_dump)
963 message(1) =
"Error in restart_basic_open: illegal restart type"
967 if (
present(status)) status_ = status
969 restart_basic_open =
io_open(trim(restart%pwd)//
"/"//trim(filename), &
970 action=trim(action), status=trim(status_), &
971 die=die, position=position, form=
"formatted", grp=restart%mpi_grp)
973 if (restart_basic_open == -1 .and. .not.
optional_default(silent, .false.))
then
974 message(1) =
"Unable to open file '"//trim(restart%pwd)//
"/"//trim(filename)//
"'."
978 pop_sub(restart_basic_open)
985 integer,
intent(in) :: iunit
986 character(len=*),
intent(in) :: lines(:)
987 integer,
intent(in) :: nlines
988 integer,
intent(out) :: ierr
994 if (iunit /= -1)
then
996 if (restart%mpi_grp%is_root())
then
998 write(iunit,
"(a)") trim(lines(iline))
1012 integer,
intent(in) :: iunit
1013 character(len=*),
intent(out) :: lines(:)
1014 integer,
intent(in) :: nlines
1015 integer,
intent(out) :: ierr
1019 call iopar_read(restart%mpi_grp, iunit, lines, nlines, ierr)
1029 integer,
intent(inout) :: iunit
1033 if (iunit /= -1)
call io_close(iunit, restart%mpi_grp)
1035 call restart%mpi_grp%barrier()
1058 integer,
intent(in) :: flag
1085 character(:),
allocatable :: info
1094 character(:),
allocatable :: info
1102#include "restart_inc.F90"
1105#include "complex.F90"
1106#include "restart_inc.F90"
block signals while writing the restart files
unblock signals when writing restart is finished
This module implements batches of mesh functions.
This module handles the calculation mode.
character(len= *), parameter, public em_resp_fd_dir
character(len= *), parameter, public gs_dir
character(len= *), parameter, public iteration_dir
character(len= *), parameter, public casida_dir
character(len= *), parameter, public vib_modes_dir
character(len= *), parameter, public partition_dir
character(len= *), parameter, public kdotp_dir
character(len= *), parameter, public dm_dir
character(len= *), parameter, public em_resp_dir
character(len= *), parameter, public td_dir
character(len= *), parameter, public vdw_dir
character(len= *), parameter, public oct_dir
This module implements the index, used for the mesh points.
subroutine, public index_dump(idx, np, dir, mpi_grp, namespace, ierr)
subroutine, public io_close(iunit, grp)
subroutine, public iopar_read(grp, iunit, lines, n_lines, ierr)
character(len=max_path_len) function, public io_workpath(path, namespace)
construct path name from given name and namespace
subroutine, public io_rm(fname, namespace)
character(len=max_path_len) function, public io_workdir()
construct working directory
subroutine, public io_mkdir(fname, namespace, parents)
logical function, public io_dir_exists(dir, namespace)
Returns true if a dir with name 'dir' exists.
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
System information (time, memory, sysname)
subroutine, public loct_rm(name)
logical function, public loct_dir_exists(dirname)
This module defines functions over batches of mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public mesh_check_dump_compatibility(mesh, dir, filename, namespace, mpi_grp, grid_changed, grid_reordered, map, ierr)
subroutine, public mesh_write_fingerprint(mesh, dir, filename, mpi_grp, namespace, ierr)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
type(mpi_comm), parameter, public mpi_comm_undefined
used to indicate a communicator has not been initialized
type(mpi_grp_t), public mpi_world
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
This module handles the communicators for the various parallelization strategies.
type(namespace_t), public global_namespace
Some general things and nomenclature:
character(len=:) function, allocatable, public parse_get_full_name(namespace, varname)
Given a namespace and a variable name, this function will iterate over all namespace ancestors contai...
subroutine, public parse_block_string(blk, l, c, res, convert_to_c)
integer function, public parse_block(namespace, name, blk, check_varinfo_)
subroutine zrestart_write_binary3_int32(restart, filename, np, ff, ierr, root)
subroutine drestart_write_binary1_int32(restart, filename, np, ff, ierr, root)
subroutine drestart_read_binary3(restart, filename, np, ff, ierr)
logical pure function restart_has_map(restart)
Returns true if the restart was from a different order of mesh points.
integer, parameter, public restart_partition
integer, parameter, public restart_custom
subroutine drestart_write_binary5(restart, filename, np, ff, ierr, root)
subroutine restart_basic_end(restart)
subroutine restart_basic_open_dir(restart, dirname, ierr)
Change the restart directory to dirname, where "dirname" is a subdirectory of the base restart direct...
integer, parameter, public restart_dm
subroutine restart_basic_mkdir(restart, dirname)
Make directory "dirname" inside the current restart directory.
subroutine zrestart_write_mesh_function(restart, filename, mesh, ff, ierr, root)
integer, parameter, public restart_all
subroutine restart_basic_close(restart, iunit)
Close a file previously opened with restart_basic_open.
subroutine drestart_read_binary1(restart, filename, np, ff, ierr)
subroutine restart_basic_close_dir(restart)
Change back to the base directory. To be called after restart_basic_open_dir.
subroutine zrestart_write_binary1(restart, filename, np, ff, ierr, root)
integer, parameter, public restart_casida
subroutine zrestart_write_binary5_int32(restart, filename, np, ff, ierr, root)
logical function, public clean_stop(comm)
returns true if a file named stop exists
subroutine zrestart_read_binary5_int32(restart, filename, np, ff, ierr)
integer, parameter, public restart_kdotp
subroutine zrestart_read_binary3(restart, filename, np, ff, ierr)
integer, parameter, public restart_oct
subroutine drestart_read_binary3_int32(restart, filename, np, ff, ierr)
type(restart_basic_data_t), dimension(restart_undefined:restart_n_data_types), parameter basic_info
Information about the components for a given system.
subroutine zrestart_read_binary3_int32(restart, filename, np, ff, ierr)
subroutine drestart_read_binary2(restart, filename, np, ff, ierr)
integer, parameter, public restart_gs
subroutine zrestart_read_binary1_int32(restart, filename, np, ff, ierr)
integer, parameter, public restart_iteration
subroutine drestart_write_binary3(restart, filename, np, ff, ierr, root)
integer, parameter, public restart_flag_mix
subroutine drestart_write_binary3_int32(restart, filename, np, ff, ierr, root)
subroutine zrestart_write_binary1_int32(restart, filename, np, ff, ierr, root)
subroutine restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
Initializes a specific restart object.
integer function restart_basic_open(restart, filename, status, position, silent)
Open file "filename" found inside the current restart directory. Depending on the type of restart,...
integer, parameter, public restart_flag_skip
integer, parameter, public restart_em_resp_fd
subroutine drestart_read_binary2_int32(restart, filename, np, ff, ierr)
subroutine drestart_write_binary5_int32(restart, filename, np, ff, ierr, root)
subroutine restart_basic_rm(restart, name)
Remove directory or file "name" that is located inside the current restart directory.
subroutine restart_end(restart)
integer, parameter, public restart_proj
subroutine zrestart_read_binary1(restart, filename, np, ff, ierr)
integer, parameter, public restart_flag_rho
integer, parameter, public restart_em_resp
integer, parameter, public restart_vib_modes
subroutine drestart_write_binary1(restart, filename, np, ff, ierr, root)
subroutine drestart_read_binary1_int32(restart, filename, np, ff, ierr)
subroutine zrestart_write_binary5(restart, filename, np, ff, ierr, root)
integer, parameter, public restart_flag_vhxc
logical pure function restart_basic_has_flag(restart, flag)
Returns true if...
subroutine restart_basic_write(restart, iunit, lines, nlines, ierr)
integer, parameter, public restart_flag_literal
subroutine drestart_read_binary5_int32(restart, filename, np, ff, ierr)
subroutine drestart_write_binary2(restart, filename, np, ff, ierr, root)
subroutine drestart_read_binary5(restart, filename, np, ff, ierr)
character(len=max_path_len) function restart_basic_dir(restart)
Returns the name of the directory containing the restart information. The use of this function should...
subroutine zrestart_write_binary2_int32(restart, filename, np, ff, ierr, root)
character(len=4), dimension(2), parameter type_string
subroutine drestart_write_mesh_function(restart, filename, mesh, ff, ierr, root)
logical pure function restart_basic_skip(restart)
Returns true if the restart information should neither be read nor written. This might happen because...
integer, parameter, public restart_td
integer, parameter, public restart_type_load
character(:) function, allocatable restart_basic_get_info(restart)
subroutine restart_basic_read(restart, iunit, lines, nlines, ierr)
subroutine zrestart_read_binary2(restart, filename, np, ff, ierr)
integer pure function restart_basic_get_data_type(restart)
Returns the data type of the restart.
integer, parameter, public restart_vdw
subroutine zrestart_read_binary5(restart, filename, np, ff, ierr)
subroutine zrestart_write_binary2(restart, filename, np, ff, ierr, root)
integer, parameter, public restart_unocc
subroutine zrestart_write_binary3(restart, filename, np, ff, ierr, root)
subroutine zrestart_read_binary2_int32(restart, filename, np, ff, ierr)
logical function restart_basic_do_i_write(restart)
character(:) function, allocatable restart_get_info(restart)
subroutine restart_basic_init(restart, namespace, data_type, type, ierr, dir)
subroutine drestart_write_binary2_int32(restart, filename, np, ff, ierr, root)
subroutine, public add_last_slash(str)
Adds a '/' in the end of the string, only if it missing. Useful for directories.
This module defines the unit system, used for input and output.
Describes mesh distribution to nodes.
Stores all communicators and groups.
restart_basic_data_t stores global information about a specific component we want to save....
restart_basic_t stores the basic information about a restart object.