open the restart dump file and write out the 'normal' restart header as well as the mesh.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_restart_type) | :: | me | the restart infotmation |
|||
type(treelmesh_type) | :: | tree | mesh, provided in treelm format |
|||
type(tem_time_type), | intent(in) | :: | timing | current simulation time information |
||
type(tem_varSys_type), | intent(in) | :: | varSys | the used var systeme |
||
type(tem_subTree_type), | intent(inout), | optional | :: | subTree | optional subTree of the given tree |
|
character(len=*), | intent(in), | optional | :: | label | additional label for the filename (needed for tracking in harvester format) |
|
character(len=*), | intent(in), | optional | :: | suffix | optional suffix (if present NO timestamp will be added!!!!) |
subroutine tem_restart_openWrite( me, tree, timing, varSys, subTree, label, &
& suffix )
! -------------------------------------------------------------------- !
!> the restart infotmation
type(tem_restart_type) :: me
!> mesh, provided in treelm format
type(treelmesh_type) :: tree
!> current simulation time information
type(tem_time_type),intent(in) :: timing
!> the used var systeme
type(tem_varSys_type), intent(in) :: varSys
!> optional subTree of the given tree
type(tem_subTree_type), optional, intent(inout) :: subTree
!> additional label for the filename (needed for tracking in harvester
!! format)
character(len=*), optional, intent(in) :: label
!> optional suffix (if present NO timestamp will be added!!!!)
character(len=*), optional, intent(in) :: suffix
! -------------------------------------------------------------------- !
! variables to catch possible MPI I/O errors
integer :: iError
integer :: pos
character(len=pathLen) :: prefix
logical :: meshChange_loc
type(tem_global_type) :: global_loc
! -------------------------------------------------------------------- !
! Update the timestamp
me%header%timestamp = trim(tem_time_sim_stamp(timing))
! Set the iteration to know when the last restart file was written
me%lastWritten = timing
if ( present(subTree) ) then
global_loc = subTree%global
else
global_loc = tree%global
end if
meshChange_loc = global_loc%meshChange
! communicate wether the mesh has changed since last time dumping it
call MPI_ALLREDUCE( meshChange_loc, global_loc%meshChange, 1, &
& MPI_LOGICAL, MPI_LOR, global_loc%comm, iError )
! if the mesh has changed ...
if (global_loc%meshChange) then
! ... set the meshChange to false
global_loc%meshChange = .false.
! ... get the position of the last path seperator
pos = INDEX(trim(global_loc%dirname), pathSep, .true.)
if ( present(label) ) then
prefix = trim(global_loc%dirname(1:pos))//trim(label)//'_'
else
prefix = trim(global_loc%dirname(1:pos))
end if
if ( present(suffix) ) then
! change the dirname using NO timestamp but the suffix
write(global_loc%dirname,'(a)') trim(prefix)//trim(suffix)//'_'
else
! ... change the dirname
write(global_loc%dirname,'(a)') trim(prefix) &
& // trim( me%header%timestamp ) // '_'
end if
! ... remove a possible predefined tag
global_loc%predefined = ''
! ... copy back the global information to the tree or subTree and dump it
if ( present(subTree) ) then
subTree%global = global_loc
call tem_dump_subTree( subTree, tree )
else
tree%global = global_loc
call dump_treelmesh( tree )
end if
end if
if ( present(suffix) ) then
! define the name of the file to write the binary data to without
! timestamp but using the suffix
write(me%header%binName,'(a)') trim( me%header%binPrefix )//'_' &
& // trim( suffix ) &
& // tem_create_EndianSuffix()
else
! define the name of the file to write the binary data to
write(me%header%binName,'(a)') trim( me%header%binPrefix )//'_' &
& // trim( me%header%timestamp ) &
& // tem_create_EndianSuffix()
end if
! open the binary file for MPI I/O
call MPI_FILE_OPEN( me%comm%comm, &
& trim( me%header%binName ), &
& MPI_MODE_WRONLY+MPI_MODE_CREATE, &
& MPI_INFO_NULL, me%binaryUnit, &
& iError )
call check_mpi_error( iError,'File open in tem_restart_openWrite')
call MPI_FILE_SET_VIEW( me%binaryUnit, me%write_file%displacement, &
& me%write_file%vectype, &
& me%write_file%ftype, "native", &
& MPI_INFO_NULL, iError )
call check_mpi_error( iError,'set File view in tem_restart_openWrite')
! write out a regular restart header
! @todo: if [[tem_restart_writeHeader]] is only called here, then it should
! not be public. It would be better not to call it here, but let user
! decide where to call it.
call tem_restart_writeHeader( me = me, &
& tree = tree, &
& subTree = subTree, &
& timing = timing, &
& varSys = varSys, &
& suffix = suffix )
end subroutine tem_restart_openWrite