59 integer,
parameter :: RESTART_N_DATA_TYPES = 14
61 integer,
parameter,
public :: &
62 RESTART_UNDEFINED = -1, &
81 character(len=20) :: tag
82 character(len=MAX_PATH_LEN) :: basedir
83 character(len=MAX_PATH_LEN) :: dir
88 integer,
parameter,
public :: &
89 RESTART_TYPE_DUMP = 1, &
93 integer,
parameter,
public :: &
94 RESTART_FLAG_STATES = 1, &
105 character(len=20) :: tag
106 character(len=MAX_PATH_LEN) :: dir
108 integer :: default_flags = 0
111 character(len=4),
parameter :: type_string(2) = (/
"DUMP",
"LOAD"/)
123 type(namespace_t),
pointer,
public :: namespace
124 integer :: data_type = restart_undefined
125 integer ::
type = restart_undefined
127 character(len=MAX_PATH_LEN) :: dir_
128 character(len=MAX_PATH_LEN) :: pwd
131 character(len=MAX_PATH_LEN),
public :: basedir
133 type(mpi_grp_t) ,
public :: mpi_grp
134 logical :: initialized = .false.
138 procedure,
private :: restart_basic_init
139 generic :: init => restart_basic_init
162 integer(int64),
allocatable :: map(:)
164 integer,
public :: file_format_states
175 procedure,
private :: drestart_read_mesh_function, zrestart_read_mesh_function
176 generic :: read_mesh_function => drestart_read_mesh_function, zrestart_read_mesh_function
224 subroutine block_signals()
226 end subroutine block_signals
231 subroutine unblock_signals()
233 end subroutine unblock_signals
240 type(mpi_comm),
intent(in) :: comm
243 logical :: file_exists
250 inquire(file=
'stop', exist=file_exists)
251 if (file_exists)
then
274 integer,
intent(in) :: data_type
275 integer,
intent(in) ::
type
277 integer,
intent(out) :: ierr
278 character(len=*),
optional,
intent(in) :: dir
281 character(len=MAX_PATH_LEN) :: basedir, dirname
282 integer :: iline, n_cols, idata_type, i
283 character(len=MAX_PATH_LEN) :: default_basedir
284 character(len=20) :: tag
286 logical :: restart_write, dir_exists
287 character(len=MAX_NAMESPACE_LEN) :: namespace_prefix
295 namespace_prefix = trim(namespace%get())
297 default_basedir = trim(
io_workdir())//
'/restart/'
298 restart%basedir = default_basedir
299 restart%skip_ = .false.
300 restart%data_type = data_type
301 if(data_type>0 .and. data_type<=restart_n_data_types)
then
302 restart%flags =
basic_info(data_type)%default_flags
307 if (data_type < restart_undefined .and. data_type > restart_n_data_types)
then
308 message(1) =
"Illegal data_type in restart_init"
311 restart%namespace => namespace
455 if (
parse_block(namespace,
'RestartOptions', blk) == 0)
then
462 if (idata_type < 0 .or. idata_type > restart_n_data_types)
then
463 call messages_input_error(namespace,
'RestartOptions',
"Invalid data type", row=iline-1, column=0)
465 if (data_type == 0)
then
469 if (idata_type == data_type .or. idata_type == 0)
then
474 namespace_prefix = namespace_prefix(1:len_trim(namespace_prefix)-len_trim(
'.RestartOptions'))
476 if (len_trim(namespace_prefix) == 0 .or. trim(namespace%get()) == trim(namespace_prefix))
then
477 namespace_prefix = trim(namespace%get())
481 namespace_prefix =
""
492 basedir = restart%basedir
495 do i=1, len(namespace_prefix)
496 if (namespace_prefix(i:i) ==
'.') namespace_prefix(i:i) =
'/'
500 basedir = trim(basedir)//trim(namespace_prefix)
502 dirname = trim(
basic_info(restart%data_type)%dir)
506 select case (restart%type)
507 case (restart_type_dump)
519 restart%skip_ = .not. restart_write
521 if (restart%skip_)
then
522 message(1) =
'Restart information will not be written.'
528 restart%skip_ = .false.
531 message(1) =
"Unknown restart type in restart_init"
537 if (restart%data_type == restart_undefined)
then
544 restart%dir_ = trim(basedir)//trim(dirname)
546 if (index(restart%dir_,
'/', .
true.) == len_trim(restart%dir_))
then
547 restart%dir_ = restart%dir_(1:len_trim(restart%dir_)-1)
551 restart%pwd = restart%dir_
554 if (restart%mpi_grp%is_root())
then
556 if (restart%type == restart_type_dump .and. .not. dir_exists)
then
560 if (restart%mpi_grp%size > 1)
then
561 call restart%mpi_grp%bcast(dir_exists, 1, mpi_logical, 0)
564 if (restart%data_type == restart_undefined)
then
570 select case (restart%type)
571 case (restart_type_dump)
572 if (.not. restart%skip_)
then
573 message(1) =
"Info: "//trim(tag)//
" restart information will be written to '"//trim(restart%pwd)//
"'."
578 if (.not. dir_exists)
then
580 restart%skip_ = .
true.
582 message(1) =
"Info: Could not find '"//trim(restart%pwd)//
"' directory for restart."
583 message(2) =
"Info: No restart information will be read."
586 message(1) =
"Info: "//trim(tag)//
" restart information will be read from '"//trim(restart%pwd)//
"'."
592 restart%initialized = .
true.
601 res = restart%mpi_grp%is_root()
611 subroutine restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
614 integer,
intent(in) :: data_type
615 integer,
intent(in) ::
type
618 integer,
intent(out) :: ierr
619 class(
mesh_t),
optional,
intent(in) :: mesh
621 character(len=*),
optional,
intent(in) :: dir
623 logical,
optional,
intent(in) :: exact
626 logical :: grid_changed, grid_reordered, exact_, with_changed_grid
627 integer :: default_format
637 restart%has_mesh =
present(mesh)
642 if (
present(exact) .and. .not.
present(mesh))
then
643 message(1) =
"Error in restart_init: the 'exact' optional argument requires a mesh."
649 restart%has_mesh =
present(mesh)
652 if(
present(mesh))
then
673 default_format = option__restartfileformatstates__adios2
675 default_format = option__restartfileformatstates__obf
677 call parse_variable(namespace,
'RestartFileFormatStates', default_format, restart%file_format_states)
682 if (restart%file_format_states == option__restartfileformatstates__adios2)
then
686 message(1) =
"Error: adios2 restart file format requested, but not compiled against ADIOS2 library."
698 call parse_variable(namespace,
'RestartWithChangedGrid', .false., with_changed_grid)
700 select case (restart%type)
701 case (restart_type_dump)
702 if (.not. restart%skip_)
then
705 call index_dump(mesh%idx, mesh%np_part_global, restart%pwd, restart%mpi_grp, &
706 restart%namespace, ierr)
708 message(1) =
"Unable to write index map to '"//trim(restart%pwd)//
"'."
714 message(1) =
"Unable to write mesh fingerprint to '"//trim(restart%pwd)//
"/grid'."
720 if(.not. restart%skip_)
then
722 restart%mpi_grp, grid_changed, grid_reordered, restart%map, ierr)
727 message(1) =
"Unable to check mesh compatibility: unable to read mesh fingerprint"
728 message(2) =
"in '"//trim(restart%pwd)//
"'."
729 else if (ierr > 1)
then
730 message(1) =
"Mesh from current calculation is not compatible with mesh found in"
731 message(2) =
"'"//trim(restart%pwd)//
"'."
733 message(3) =
"No restart information will be read."
739 if (grid_changed)
then
740 if (grid_reordered)
then
741 message(1) =
"Info: Octopus is attempting to restart from a mesh with a different order of points."
743 message(1) =
"Info: Octopus is attempting to restart from a different mesh."
745 if (with_changed_grid)
then
748 message(2) =
"This is disabled. To enable this, set RestartWithChangedGrid=True."
755 restart%skip_ = grid_changed .and. .not. grid_reordered
756 if (restart%skip_)
then
757 message(1) =
"This calculation requires the exact same mesh to restart."
758 message(2) =
"No restart information will be read from '"//trim(restart%pwd)//
"'."
763 restart%skip_ = .false.
771 if (restart%mpi_grp%size > 1)
then
772 call restart%mpi_grp%barrier()
787 restart%data_type = 0
788 restart%skip_ = .
true.
796 class(
restart_t),
intent(inout) :: restart
800 if (restart%mpi_grp%is_root() .and. .not. restart%skip_)
then
801 select case (restart%type)
803 message(1) =
"Info: Finished reading information "//trim(
basic_info(restart%type)%tag)//
" from '"//trim(restart%dir_)//
"'."
804 call io_rm(trim(restart%pwd)//
"/loading")
805 case (restart_type_dump)
806 call io_rm(trim(restart%pwd)//
"/dumping")
807 message(1) =
"Info: Finished writing information "//trim(
basic_info(restart%type)%tag)//
" to '"//trim(restart%dir_)//
"'."
812 safe_deallocate_a(restart%map)
813 restart%has_mesh = .false.
831 character(len=MAX_PATH_LEN) :: restart_basic_dir
833 push_sub(restart_basic_dir)
837 pop_sub(restart_basic_dir)
846 character(len=*),
intent(in) :: dirname
847 integer,
intent(out) :: ierr
851 assert(.not. restart%skip_)
855 select case (restart%type)
856 case (restart_type_dump)
859 if (.not.
loct_dir_exists(trim(restart%dir_)//
"/"//trim(dirname)))
then
865 if (index(dirname,
'/', .
true.) == len_trim(dirname))
then
866 restart%pwd = trim(restart%dir_)//
"/"//dirname(1:len_trim(dirname)-1)
868 restart%pwd = trim(restart%dir_)//
"/"//trim(dirname)
883 assert(.not. restart%skip_)
885 restart%pwd = restart%dir_
895 character(len=*),
intent(in) :: dirname
899 assert(.not. restart%skip_)
901 assert(restart%type == restart_type_dump)
903 call io_mkdir(trim(restart%pwd)//
"/"//trim(dirname), parents=.
true.)
913 character(len=*),
intent(in) :: name
915 assert(.not. restart%skip_)
916 assert(restart%type == restart_type_dump)
920 call io_rm(trim(restart%pwd)//
"/"//trim(name))
935 character(len=*),
intent(in) :: filename
936 character(len=*),
optional,
intent(in) :: status
937 character(len=*),
optional,
intent(in) :: position
938 logical,
optional,
intent(in) :: silent
939 integer :: restart_basic_open
942 character(len=20) :: action, status_
944 push_sub(restart_basic_open)
946 assert(restart%initialized)
947 assert(.not. restart%skip_)
949 select case (restart%type)
950 case (restart_type_dump)
961 message(1) =
"Error in restart_basic_open: illegal restart type"
965 if (
present(status)) status_ = status
967 restart_basic_open =
io_open(trim(restart%pwd)//
"/"//trim(filename), &
968 action=trim(action), status=trim(status_), &
969 die=die, position=position, form=
"formatted", grp=restart%mpi_grp)
971 if (restart_basic_open == -1 .and. .not.
optional_default(silent, .false.))
then
972 message(1) =
"Unable to open file '"//trim(restart%pwd)//
"/"//trim(filename)//
"'."
976 pop_sub(restart_basic_open)
983 integer,
intent(in) :: iunit
984 character(len=*),
intent(in) :: lines(:)
985 integer,
intent(in) :: nlines
986 integer,
intent(out) :: ierr
992 if (iunit /= -1)
then
994 if (restart%mpi_grp%is_root())
then
996 write(iunit,
"(a)") trim(lines(iline))
1010 integer,
intent(in) :: iunit
1011 character(len=*),
intent(out) :: lines(:)
1012 integer,
intent(in) :: nlines
1013 integer,
intent(out) :: ierr
1017 call iopar_read(restart%mpi_grp, iunit, lines, nlines, ierr)
1027 integer,
intent(inout) :: iunit
1031 if (iunit /= -1)
call io_close(iunit, restart%mpi_grp)
1033 call restart%mpi_grp%barrier()
1056 integer,
intent(in) :: flag
1083 character(:),
allocatable :: info
1092 character(:),
allocatable :: info
1100#include "restart_inc.F90"
1103#include "complex.F90"
1104#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 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...
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.