load_restart_checkpoint Subroutine

public subroutine load_restart_checkpoint(out_dir, mesh, stats, has_restart, state, mpi_rank, mpi_size, mpi)

既存出力ディレクトリから統計・要素電荷・乱数状態を復元する。

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: out_dir

チェックポイントを探索する出力ディレクトリ。

type(mesh_type), intent(inout) :: mesh

現在のメッシュ。q_elem を復元値で上書きする。

type(sim_stats), intent(out) :: stats

復元された統計値。

logical, intent(out) :: has_restart

復元可能なチェックポイントが存在したか。

type(injection_state), intent(inout), optional :: state

種別ごとのマクロ粒子残差(指定時のみ復元)。

integer(kind=i32), intent(in), optional :: mpi_rank
integer(kind=i32), intent(in), optional :: mpi_size
type(mpi_context), intent(in), optional :: mpi

Calls

proc~~load_restart_checkpoint~~CallsGraph proc~load_restart_checkpoint load_restart_checkpoint proc~mpi_get_rank_size mpi_get_rank_size proc~load_restart_checkpoint->proc~mpi_get_rank_size proc~restart_macro_residual_path restart_macro_residual_path proc~load_restart_checkpoint->proc~restart_macro_residual_path proc~restart_rng_state_path restart_rng_state_path proc~load_restart_checkpoint->proc~restart_rng_state_path proc~restart_macro_residual_path->proc~mpi_get_rank_size proc~restart_rng_state_path->proc~mpi_get_rank_size

Called by

proc~~load_restart_checkpoint~~CalledByGraph proc~load_restart_checkpoint load_restart_checkpoint proc~load_or_init_run_state load_or_init_run_state proc~load_or_init_run_state->proc~load_restart_checkpoint program~main main program~main->proc~load_or_init_run_state

Source Code

  subroutine load_restart_checkpoint(out_dir, mesh, stats, has_restart, state, mpi_rank, mpi_size, mpi)
    character(len=*), intent(in) :: out_dir
    type(mesh_type), intent(inout) :: mesh
    type(sim_stats), intent(out) :: stats
    logical, intent(out) :: has_restart
    type(injection_state), intent(inout), optional :: state
    integer(i32), intent(in), optional :: mpi_rank, mpi_size
    type(mpi_context), intent(in), optional :: mpi

    character(len=1024) :: summary_path, charges_path, rng_path, residual_path
    logical :: has_summary, has_charges, has_rng, has_residual
    integer(i32) :: local_rank, world_size

    stats = sim_stats()
    has_restart = .false.
    call resolve_parallel_rank_size(local_rank, world_size, mpi_rank, mpi_size, mpi, 'load_restart_checkpoint')

    summary_path = trim(out_dir)//'/summary.txt'
    charges_path = trim(out_dir)//'/charges.csv'
    rng_path = restart_rng_state_path(trim(out_dir), mpi_rank=local_rank, mpi_size=world_size)
    residual_path = restart_macro_residual_path(trim(out_dir), mpi_rank=local_rank, mpi_size=world_size)

    inquire (file=trim(summary_path), exist=has_summary)
    inquire (file=trim(charges_path), exist=has_charges)
    inquire (file=trim(rng_path), exist=has_rng)
    inquire (file=trim(residual_path), exist=has_residual)

    if (.not. has_summary .and. .not. has_charges .and. .not. has_rng) return

    if (.not. (has_summary .and. has_charges .and. has_rng)) then
      error stop 'Resume requested but checkpoint files are incomplete in output directory.'
    end if

    call load_summary_file(trim(summary_path), mesh%nelem, stats, expected_world_size=world_size)
    call load_charge_file(trim(charges_path), mesh)
    call restore_rng_state(trim(rng_path))
    if (present(state)) then
      if (allocated(state%macro_residual)) state%macro_residual = 0.0d0
      if (has_residual) call load_macro_residual_file(trim(residual_path), state)
    end if
    has_restart = .true.
  end subroutine load_restart_checkpoint