read_restart_file Subroutine

public subroutine read_restart_file(mesh, flow, params, fields, species, energy, transport, step, time, chemistry_accum_dt)

Read a restart file if restart_from_file is enabled. All ranks read the same global file; because arrays are global, this naturally supports a new MPI rank count without scatter logic.

Arguments

Type IntentOptional Attributes Name
type(mesh_t), intent(in) :: mesh
type(flow_mpi_t), intent(inout) :: flow
type(case_params_t), intent(inout) :: params
type(flow_fields_t), intent(inout) :: fields
type(species_fields_t), intent(inout) :: species
type(energy_fields_t), intent(inout) :: energy
type(transport_properties_t), intent(inout) :: transport
integer, intent(inout) :: step
real(kind=rk), intent(inout) :: time
real(kind=rk), intent(inout), optional :: chemistry_accum_dt

Source Code

   subroutine read_restart_file(mesh, flow, params, fields, species, energy, transport, step, time, chemistry_accum_dt)
      type(mesh_t), intent(in) :: mesh
      type(flow_mpi_t), intent(inout) :: flow
      type(case_params_t), intent(inout) :: params
      type(flow_fields_t), intent(inout) :: fields
      type(species_fields_t), intent(inout) :: species
      type(energy_fields_t), intent(inout) :: energy
      type(transport_properties_t), intent(inout) :: transport
      integer, intent(inout) :: step
      real(rk), intent(inout) :: time
      real(rk), intent(inout), optional :: chemistry_accum_dt

      character(len=32) :: magic
      integer :: unit_id, ios, version
      integer :: file_ncells, file_nfaces, file_nspecies, file_step, writer_nprocs
      integer :: has_species, has_energy, has_variable_density, rhs_old_valid_int
      integer :: species_rhs_valid_int, energy_rhs_valid_int
      real(rk) :: file_time, file_dt, file_chemistry_accum_dt
      real(rk), allocatable :: tmp_matrix(:,:)
      real(rk), allocatable :: energy_diag(:)
      logical :: load_species, load_energy

      if (.not. params%restart_from_file) return
      if (len_trim(params%restart_file) == 0) then
         call fatal_error('restart', 'restart_from_file=.true. requires restart_file')
      end if

      open(newunit=unit_id, file=trim(params%restart_file), access='stream', form='unformatted', &
           status='old', action='read', iostat=ios)
      if (ios /= 0) call fatal_error('restart', 'could not open restart_file: '//trim(params%restart_file))

      read(unit_id, iostat=ios) magic
      if (ios /= 0) call fatal_error('restart', 'failed reading restart magic')
      if (trim(magic) /= trim(restart_magic)) then
         call fatal_error('restart', 'restart file magic mismatch; expected '//trim(restart_magic))
      end if

      read(unit_id) version
      if (version /= restart_version) call fatal_error('restart', 'unsupported restart version')
      read(unit_id) file_ncells, file_nfaces, file_nspecies, file_step, writer_nprocs
      read(unit_id) file_time, file_dt, file_chemistry_accum_dt
      read(unit_id) has_species, has_energy, has_variable_density, rhs_old_valid_int, &
                    species_rhs_valid_int, energy_rhs_valid_int

      if (file_ncells /= mesh%ncells) call fatal_error('restart', 'restart ncells does not match current mesh')
      if (file_nfaces /= mesh%nfaces) call fatal_error('restart', 'restart nfaces does not match current mesh')
      if (params%enable_species .and. file_nspecies > params%nspecies) then
         call fatal_error('restart', 'restart nspecies exceeds current case nspecies; cannot load restart')
      end if
      if (params%enable_species .and. flow%rank == 0 .and. file_nspecies /= params%nspecies) then
         write(output_unit,'(a,i0,a,i0,a)') &
            'restart: WARNING: file nspecies=', file_nspecies, &
            ' < current nspecies=', params%nspecies, &
            '; remaining species initialized to zero'
      end if
      if (has_energy == 1 .and. .not. params%enable_energy) then
         call fatal_error('restart', 'restart contains energy state but current case has enable_energy=.false.')
      end if
      if (has_species == 1 .and. .not. params%enable_species) then
         call fatal_error('restart', 'restart contains species state but current case has enable_species=.false.')
      end if
      if (has_variable_density == 1 .and. .not. params%enable_variable_density) then
         call fatal_error('restart', 'restart was written from variable-density mode but current case is not variable-density')
      end if

      read(unit_id) fields%u
      read(unit_id) fields%u_old
      read(unit_id) fields%p
      read(unit_id) fields%phi
      read(unit_id) fields%divergence_source
      read(unit_id) fields%projection_rho
      read(unit_id) fields%projection_divergence_source
      read(unit_id) fields%rhs_old
      read(unit_id) fields%face_flux
      read(unit_id) fields%mass_flux

      read(unit_id) transport%rho
      read(unit_id) transport%rho_old
      read(unit_id) transport%mu
      read(unit_id) transport%nu
      read(unit_id) transport%lambda

      if (file_nspecies > 0) then
         allocate(tmp_matrix(file_nspecies, mesh%ncells))
         read(unit_id) tmp_matrix
         if (allocated(transport%diffusivity)) then
            transport%diffusivity(1:min(file_nspecies, params%nspecies), :) = &
               tmp_matrix(1:min(file_nspecies, params%nspecies), :)
         end if
         deallocate(tmp_matrix)
      end if

      load_species = has_species == 1 .and. file_nspecies > 0
      if (load_species) then
         allocate(tmp_matrix(file_nspecies, mesh%ncells))
         read(unit_id) tmp_matrix
         species%Y(1:min(file_nspecies, params%nspecies), :) = &
            tmp_matrix(1:min(file_nspecies, params%nspecies), :)
         if (allocated(species%Y_old)) species%Y_old = species%Y
         read(unit_id) tmp_matrix
         if (allocated(species%rhs_old)) then
            species%rhs_old(1:min(file_nspecies, params%nspecies), :) = &
               tmp_matrix(1:min(file_nspecies, params%nspecies), :)
         end if
         species%rhs_old_valid = species_rhs_valid_int /= 0
         deallocate(tmp_matrix)
      else
         species%rhs_old_valid = .false.
      end if

      load_energy = has_energy == 1
      if (load_energy) then
         read(unit_id) energy%T
         read(unit_id) energy%T_old
         read(unit_id) energy%h
         read(unit_id) energy%h_old
         read(unit_id) energy%rhs_old
         energy%rhs_old_valid = energy_rhs_valid_int /= 0
         read(unit_id) energy%qrad
         read(unit_id) energy%cp
         read(unit_id) energy%lambda
         read(unit_id) energy%rho_thermo
         allocate(energy_diag(12))
         read(unit_id) energy_diag
         call restore_energy_diagnostics(energy, energy_diag)
         deallocate(energy_diag)
      end if

      close(unit_id)

      fields%rhs_old_valid = rhs_old_valid_int /= 0
      step = file_step
      time = file_time
      if (params%restart_use_file_dt) params%dt = file_dt
      if (params%restart_nsteps_are_additional) params%nsteps = file_step + params%nsteps
      if (present(chemistry_accum_dt)) chemistry_accum_dt = file_chemistry_accum_dt

      if (flow%rank == 0) then
         write(output_unit,'(a,a,a,i0,a,es13.5,a,es13.5,a,es13.5,a,i0,a,i0,a,l1,a,l1)') &
            'read restart: ', trim(params%restart_file), ' step=', step, &
            ' time=', time, ' file_dt=', file_dt, ' run_dt=', params%dt, &
            ' nsteps=', params%nsteps, ' writer_ranks=', writer_nprocs, &
            ' use_file_dt=', params%restart_use_file_dt, &
            ' nsteps_additional=', params%restart_nsteps_are_additional
      end if
   end subroutine read_restart_file