save_restart_variables Subroutine

public subroutine save_restart_variables(params, spp, F)

Arguments

Type IntentOptional AttributesName
type(KORC_PARAMS), intent(in) :: params

params Core KORC simulation parameters.

type(SPECIES), intent(in), DIMENSION(:), ALLOCATABLE:: spp

An instance of KORC's derived type SPECIES containing all the information of different electron species. See korc_types.

type(FIELDS), intent(in) :: F

Calls

proc~~save_restart_variables~~CallsGraph proc~save_restart_variables save_restart_variables mpi_barrier mpi_barrier proc~save_restart_variables->mpi_barrier proc~rsave_2d_array_to_hdf5 rsave_2d_array_to_hdf5 proc~save_restart_variables->proc~rsave_2d_array_to_hdf5 h5fclose_f h5fclose_f proc~save_restart_variables->h5fclose_f interface~save_1d_array_to_hdf5 save_1d_array_to_hdf5 proc~save_restart_variables->interface~save_1d_array_to_hdf5 interface~save_to_hdf5 save_to_hdf5 proc~save_restart_variables->interface~save_to_hdf5 mpi_gather mpi_gather proc~save_restart_variables->mpi_gather h5gclose_f h5gclose_f proc~save_restart_variables->h5gclose_f h5dclose_f h5dclose_f proc~rsave_2d_array_to_hdf5->h5dclose_f h5screate_simple_f h5screate_simple_f proc~rsave_2d_array_to_hdf5->h5screate_simple_f h5dwrite_f h5dwrite_f proc~rsave_2d_array_to_hdf5->h5dwrite_f h5sclose_f h5sclose_f proc~rsave_2d_array_to_hdf5->h5sclose_f proc~isave_1d_array_to_hdf5 isave_1d_array_to_hdf5 interface~save_1d_array_to_hdf5->proc~isave_1d_array_to_hdf5 proc~rsave_1d_array_to_hdf5 rsave_1d_array_to_hdf5 interface~save_1d_array_to_hdf5->proc~rsave_1d_array_to_hdf5 proc~i2save_to_hdf5 i2save_to_hdf5 interface~save_to_hdf5->proc~i2save_to_hdf5 proc~i1save_to_hdf5 i1save_to_hdf5 interface~save_to_hdf5->proc~i1save_to_hdf5 proc~i4save_to_hdf5 i4save_to_hdf5 interface~save_to_hdf5->proc~i4save_to_hdf5 proc~i8save_to_hdf5 i8save_to_hdf5 interface~save_to_hdf5->proc~i8save_to_hdf5 proc~rsave_to_hdf5 rsave_to_hdf5 interface~save_to_hdf5->proc~rsave_to_hdf5 proc~isave_1d_array_to_hdf5->h5dclose_f proc~isave_1d_array_to_hdf5->h5screate_simple_f proc~isave_1d_array_to_hdf5->h5dwrite_f proc~isave_1d_array_to_hdf5->h5sclose_f h5tset_size_f h5tset_size_f proc~isave_1d_array_to_hdf5->h5tset_size_f h5aclose_f h5aclose_f proc~isave_1d_array_to_hdf5->h5aclose_f h5tcopy_f h5tcopy_f proc~isave_1d_array_to_hdf5->h5tcopy_f h5awrite_f h5awrite_f proc~isave_1d_array_to_hdf5->h5awrite_f h5acreate_f h5acreate_f proc~isave_1d_array_to_hdf5->h5acreate_f proc~i2save_to_hdf5->h5dclose_f proc~i2save_to_hdf5->h5screate_simple_f proc~i2save_to_hdf5->h5sclose_f proc~i2save_to_hdf5->h5tset_size_f proc~i2save_to_hdf5->h5aclose_f proc~i2save_to_hdf5->h5tcopy_f proc~i2save_to_hdf5->h5awrite_f proc~i2save_to_hdf5->h5acreate_f proc~i1save_to_hdf5->h5dclose_f proc~i1save_to_hdf5->h5screate_simple_f proc~i1save_to_hdf5->h5sclose_f proc~i1save_to_hdf5->h5tset_size_f proc~i1save_to_hdf5->h5aclose_f proc~i1save_to_hdf5->h5tcopy_f proc~i1save_to_hdf5->h5awrite_f proc~i1save_to_hdf5->h5acreate_f proc~i4save_to_hdf5->h5dclose_f proc~i4save_to_hdf5->h5screate_simple_f proc~i4save_to_hdf5->h5sclose_f proc~i4save_to_hdf5->h5tset_size_f proc~i4save_to_hdf5->h5aclose_f proc~i4save_to_hdf5->h5tcopy_f proc~i4save_to_hdf5->h5awrite_f proc~i4save_to_hdf5->h5acreate_f proc~i8save_to_hdf5->h5dclose_f proc~i8save_to_hdf5->h5screate_simple_f proc~i8save_to_hdf5->h5sclose_f proc~i8save_to_hdf5->h5tset_size_f proc~i8save_to_hdf5->h5aclose_f proc~i8save_to_hdf5->h5tcopy_f proc~i8save_to_hdf5->h5awrite_f proc~i8save_to_hdf5->h5acreate_f proc~rsave_to_hdf5->h5dclose_f proc~rsave_to_hdf5->h5screate_simple_f proc~rsave_to_hdf5->h5dwrite_f proc~rsave_to_hdf5->h5sclose_f proc~rsave_to_hdf5->h5tset_size_f proc~rsave_to_hdf5->h5aclose_f proc~rsave_to_hdf5->h5tcopy_f proc~rsave_to_hdf5->h5awrite_f proc~rsave_to_hdf5->h5acreate_f proc~rsave_1d_array_to_hdf5->h5dclose_f proc~rsave_1d_array_to_hdf5->h5screate_simple_f proc~rsave_1d_array_to_hdf5->h5dwrite_f proc~rsave_1d_array_to_hdf5->h5sclose_f proc~rsave_1d_array_to_hdf5->h5tset_size_f proc~rsave_1d_array_to_hdf5->h5aclose_f proc~rsave_1d_array_to_hdf5->h5tcopy_f proc~rsave_1d_array_to_hdf5->h5awrite_f proc~rsave_1d_array_to_hdf5->h5acreate_f

Called by

proc~~save_restart_variables~~CalledByGraph proc~save_restart_variables save_restart_variables program~main main program~main->proc~save_restart_variables

Contents


Source Code

  subroutine save_restart_variables(params,spp,F)
    !! @note Subroutine that saves all the variables that KORC needs for
    !! restarting a simulation. These variables are saved to "restart_file.h5".
    TYPE(KORC_PARAMS), INTENT(IN) 				:: params
    !! params Core KORC simulation parameters.
    TYPE(SPECIES), DIMENSION(:), ALLOCATABLE, INTENT(IN) 	:: spp
    !! An instance of KORC's derived type SPECIES containing
    !! all the information of different electron species. See [[korc_types]].
    TYPE(FIELDS), INTENT(IN)      :: F
    REAL(rp), DIMENSION(:), ALLOCATABLE :: send_buffer_rp, receive_buffer_rp
    !! Temporary buffer to be used by MPI to gather different electrons'
    !! variables.
    !! Temporary buffer to be used by MPI to gather different electrons'
    !! variables.
    INTEGER(is), DIMENSION(:), ALLOCATABLE :: send_buffer_is, receive_buffer_is
    !! Temporary buffer to be used by MPI to gather different electrons'
    !! variables.
    !! Temporary buffer to be used by MPI to gather different electrons'
    !! variables.
    REAL(rp), DIMENSION(:,:), ALLOCATABLE 			:: X
    REAL(rp), DIMENSION(:,:), ALLOCATABLE 			:: V
    REAL(rp), DIMENSION(:), ALLOCATABLE 			:: g
    REAL(rp), DIMENSION(:), ALLOCATABLE 			:: J0_SC
    REAL(rp), DIMENSION(:), ALLOCATABLE 			:: J1_SC
    REAL(rp), DIMENSION(:), ALLOCATABLE 			:: J2_SC
    REAL(rp), DIMENSION(:), ALLOCATABLE 			:: J3_SC
    REAL(rp), DIMENSION(:), ALLOCATABLE 			:: E_SC
    INTEGER(is), DIMENSION(:), ALLOCATABLE :: flagCon,flagCol,flagRE
    CHARACTER(MAX_STRING_LENGTH) 				:: filename
    !! String containing the name of the HDF5 file.
    CHARACTER(MAX_STRING_LENGTH) 				:: gname
    !! String containing the group name of a set of KORC parameters.
    CHARACTER(MAX_STRING_LENGTH) 				:: subgname
    CHARACTER(MAX_STRING_LENGTH) 				:: dset
    !! Name of data set to be saved to file.
    INTEGER(HID_T) 						:: h5file_id
    !! HDF5 file identifier.
    INTEGER(HID_T) 						:: group_id
    !! HDF5 group identifier.
    INTEGER(HID_T) 						:: subgroup_id
    !! HDF5 subgroup identifier.
    INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE 		:: dims
    !!  Dimensions of data saved to HDF5 file.
    REAL(rp), DIMENSION(:), ALLOCATABLE 			:: rdata
    !! 1-D array of real data to be saved to HDF5 file.
    INTEGER, DIMENSION(:), ALLOCATABLE 				:: idata
    !! 1-D array of integer data to be saved to HDF5 file.
    CHARACTER(MAX_STRING_LENGTH), DIMENSION(:), ALLOCATABLE :: attr_array
    !! An 1-D array with attributes of 1-D real or integer arrays that
    !! are passed to KORC interfaces of HDF5 I/O subroutines.
    CHARACTER(MAX_STRING_LENGTH) 				:: attr
    !! A single attributes of real or integer data that is passed to KORC
    !! interfaces of HDF5 I/O subroutines.
    INTEGER 							:: h5error
    !! HDF5 error status.
    CHARACTER(19) 						:: tmp_str
    !! Temporary string used to manipulate various strings.
    REAL(rp) 							:: units
    !! Temporary variable used to add physical units to restart variables.
    INTEGER 							:: ss,jj
    !! Electron species iterator.
    !! Iterator for reading all the entried of params::outputs_list.
    INTEGER 							:: mpierr
    !! MPI error status.
    INTEGER 					:: numel_send, numel_receive
    !! Variable used by MPI to count the amount of data sent by each MPI
    !! procces.
    !! Variable used by MPI to count the amount of data received by the main
    !! MPI procces.


!    if ( MODULO(params%it,params%restart_output_cadence) .EQ. 0_ip ) then 
    if (params%mpi_params%rank.EQ.0_idef) then

       write(output_unit_write,'("Saving restart: ",I15)') &
            params%it/(params%t_skip*params%t_it_SC)

       filename = TRIM(params%path_to_outputs) // "restart_file.h5"
       call h5fcreate_f(TRIM(filename), H5F_ACC_TRUNC_F, h5file_id, h5error)

       dset = "it"
       attr = "Iteration"
       call save_to_hdf5(h5file_id,dset,params%it,attr)

       dset = "time"
       attr = "Current simulation time in secs"
       call save_to_hdf5(h5file_id,dset,params%init_time*params%cpp%time &
            + REAL(params%it,rp)*params%dt*params%cpp%time,attr)

       dset = "simulation_time"
       attr = "Total simulation time in secs"
       call save_to_hdf5(h5file_id,dset,params%simulation_time* &
            params%cpp%time,attr)

       dset = "snapshot_frequency"
       attr = "Snapshot frequency in secs"
       call save_to_hdf5(h5file_id,dset,params%snapshot_frequency* &
            params%cpp%time,attr)

       dset = "dt"
       attr = "Time step in secs"
       call save_to_hdf5(h5file_id,dset,params%dt*params%cpp%time,attr)

       dset = "t_steps"
       attr = "Time steps in simulation"
       call save_to_hdf5(h5file_id,dset,params%t_steps,attr)

       dset = "output_cadence"
       attr = "Output cadence"
       call save_to_hdf5(h5file_id,dset,params%output_cadence,attr)

       dset = "restart_output_cadence"
       attr = "Restart output cadence"
       call save_to_hdf5(h5file_id,dset,params%restart_output_cadence,attr)

       dset = "num_snapshots"
       attr = "Number of snapshots in time for saving simulation variables"
       call save_to_hdf5(h5file_id,dset,params%num_snapshots,attr)

       if (F%ReInterp_2x1t) then
          dset = "ind_2x1t"
          attr = "ReInterp_2x1t iteration"
          call save_to_hdf5(h5file_id,dset,F%ind_2x1t,attr)
       end if

       dset = "num_mpi"
       attr = "Number of mpi nodes used in simulation"
       call save_to_hdf5(h5file_id,dset,params%mpi_params%nmpi,attr)
       
    end if

    do ss=1_idef,params%num_species
       numel_send = 3_idef*spp(ss)%ppp
       numel_receive = 3_idef*spp(ss)%ppp*params%mpi_params%nmpi

       if (params%mpi_params%rank.EQ.0_idef) then
          ALLOCATE(X(spp(ss)%ppp*params%mpi_params%nmpi,3))
          ALLOCATE(V(spp(ss)%ppp*params%mpi_params%nmpi,3))
          ALLOCATE(g(spp(ss)%ppp*params%mpi_params%nmpi))
          ALLOCATE(flagCon(spp(ss)%ppp*params%mpi_params%nmpi))
          ALLOCATE(flagCol(spp(ss)%ppp*params%mpi_params%nmpi))
          ALLOCATE(flagRE(spp(ss)%ppp*params%mpi_params%nmpi))
       end if

       ALLOCATE(send_buffer_rp(numel_send))
       ALLOCATE(receive_buffer_rp(numel_receive))

       if (params%orbit_model(1:2).EQ.'FO') then             
          send_buffer_rp = RESHAPE(spp(ss)%vars%X,(/numel_send/))
       else if (params%orbit_model(1:2).EQ.'GC') then
          send_buffer_rp = RESHAPE(spp(ss)%vars%Y,(/numel_send/))
       end if
       receive_buffer_rp = 0.0_rp
       CALL MPI_GATHER(send_buffer_rp,numel_send,MPI_REAL8, &
            receive_buffer_rp,numel_send,MPI_REAL8,0,MPI_COMM_WORLD, &
            mpierr)
       if (params%mpi_params%rank.EQ.0_idef) then
          X = RESHAPE(receive_buffer_rp,(/spp(ss)%ppp* &
               params%mpi_params%nmpi,3/))
       end if

       send_buffer_rp = RESHAPE(spp(ss)%vars%V,(/numel_send/))
       receive_buffer_rp = 0.0_rp
       CALL MPI_GATHER(send_buffer_rp,numel_send,MPI_REAL8, &
            receive_buffer_rp,numel_send,MPI_REAL8,0,MPI_COMM_WORLD,mpierr)
       if (params%mpi_params%rank.EQ.0_idef) then
          V = RESHAPE(receive_buffer_rp,(/spp(ss)%ppp* &
               params%mpi_params%nmpi,3/))
       end if

       DEALLOCATE(send_buffer_rp)
       DEALLOCATE(receive_buffer_rp)

       numel_send = spp(ss)%ppp
       numel_receive = spp(ss)%ppp*params%mpi_params%nmpi

       ALLOCATE(send_buffer_is(numel_send))
       ALLOCATE(receive_buffer_is(numel_receive))

       send_buffer_is = spp(ss)%vars%flagRE
       receive_buffer_is = 0_is
       CALL MPI_GATHER(send_buffer_is,numel_send,MPI_INTEGER1, &
            receive_buffer_is,numel_send,&
            MPI_INTEGER1,0,MPI_COMM_WORLD,mpierr)
       if (params%mpi_params%rank.EQ.0_idef) then
          flagRE = receive_buffer_is
       end if
       
       send_buffer_is = spp(ss)%vars%flagCon
       receive_buffer_is = 0_is
       CALL MPI_GATHER(send_buffer_is,numel_send,MPI_INTEGER1, &
            receive_buffer_is,numel_send,&
            MPI_INTEGER1,0,MPI_COMM_WORLD,mpierr)
       if (params%mpi_params%rank.EQ.0_idef) then
          flagCon = receive_buffer_is
       end if

       send_buffer_is = spp(ss)%vars%flagCol
       receive_buffer_is = 0_is
       CALL MPI_GATHER(send_buffer_is,numel_send,MPI_INTEGER1, &
            receive_buffer_is,numel_send,&
            MPI_INTEGER1,0,MPI_COMM_WORLD,mpierr)
       if (params%mpi_params%rank.EQ.0_idef) then
          flagCol = receive_buffer_is
       end if
       
       DEALLOCATE(send_buffer_is)
       DEALLOCATE(receive_buffer_is)

       ALLOCATE(send_buffer_rp(numel_send))
       ALLOCATE(receive_buffer_rp(numel_receive))

       send_buffer_rp = spp(ss)%vars%g
       receive_buffer_rp = 0_rp
       CALL MPI_GATHER(send_buffer_rp,numel_send,MPI_REAL8, &
            receive_buffer_rp,numel_send,&
            MPI_REAL8,0,MPI_COMM_WORLD,mpierr)
       if (params%mpi_params%rank.EQ.0_idef) then
          g = receive_buffer_rp
       end if

       DEALLOCATE(send_buffer_rp)
       DEALLOCATE(receive_buffer_rp)

       if (params%mpi_params%rank.EQ.0_idef) then
          write(tmp_str,'(I18)') ss
          subgname = "spp_" // TRIM(ADJUSTL(tmp_str))
          call h5gcreate_f(h5file_id, TRIM(subgname), group_id, h5error)

          dset = "X"
          call rsave_2d_array_to_hdf5(group_id, dset, X)

          dset = "V"
          call rsave_2d_array_to_hdf5(group_id, dset, V)

          dset = "flagCon"
          call save_1d_array_to_hdf5(group_id,dset, INT(flagCon,idef))

          dset = "flagCol"
          call save_1d_array_to_hdf5(group_id,dset, INT(flagCol,idef))

          dset = "flagRE"
          call save_1d_array_to_hdf5(group_id,dset, INT(flagRE,idef))


          dset = "g"
          call save_1d_array_to_hdf5(group_id,dset, g)

          if (params%SC_E) then

             ALLOCATE(J0_SC(F%dim_1D))
             ALLOCATE(J1_SC(F%dim_1D))
             ALLOCATE(J2_SC(F%dim_1D))
             ALLOCATE(J3_SC(F%dim_1D))
             ALLOCATE(E_SC(F%dim_1D))
             J0_SC=F%J1_SC_1D%PHI/F%Ip0
             J1_SC=F%J1_SC_1D%PHI
             J2_SC=F%J2_SC_1D%PHI
             J3_SC=F%J3_SC_1D%PHI
             E_SC=F%E_SC_1D%PHI

             dset = "J0_SC"
             call save_1d_array_to_hdf5(group_id,dset,J0_SC)
             dset = "J1_SC"
             call save_1d_array_to_hdf5(group_id,dset,J1_SC)
             dset = "J2_SC"
             call save_1d_array_to_hdf5(group_id,dset,J2_SC)
             dset = "J3_SC"
             call save_1d_array_to_hdf5(group_id,dset,J3_SC)
             dset = "E_SC"
             call save_1d_array_to_hdf5(group_id,dset,E_SC)
             
             DEALLOCATE(J0_SC)
             DEALLOCATE(J1_SC)
             DEALLOCATE(J2_SC)
             DEALLOCATE(J3_SC)
             DEALLOCATE(E_SC)
          end if
          
          call h5gclose_f(group_id, h5error)
       end if

       if (params%mpi_params%rank.EQ.0_idef) then
          DEALLOCATE(X)
          DEALLOCATE(V)
          DEALLOCATE(g)
          DEALLOCATE(flagCon)
          DEALLOCATE(flagCol)
          DEALLOCATE(flagRE)
       end if
    end do

    
    if (params%mpi_params%rank.EQ.0_idef) then
       call h5fclose_f(h5file_id, h5error)
    end if

    call MPI_BARRIER(MPI_COMM_WORLD,mpierr)
    
!    end if
  end subroutine save_restart_variables