write_periodic_operator_cache Subroutine

public subroutine write_periodic_operator_cache(path, fingerprint, target_nodes, operator, status)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: path
character(len=*), intent(in) :: fingerprint
integer(kind=i32), intent(in) :: target_nodes(:)
real(kind=dp), intent(in) :: operator(:,:,:)
integer(kind=i32), intent(out) :: status

Calls

proc~~write_periodic_operator_cache~~CallsGraph proc~write_periodic_operator_cache write_periodic_operator_cache proc~atomic_rename atomic_rename proc~write_periodic_operator_cache->proc~atomic_rename proc~periodic_operator_checksum periodic_operator_checksum proc~write_periodic_operator_cache->proc~periodic_operator_checksum

Called by

proc~~write_periodic_operator_cache~~CalledByGraph proc~write_periodic_operator_cache write_periodic_operator_cache proc~precompute_periodic_root_operator precompute_periodic_root_operator proc~precompute_periodic_root_operator->proc~write_periodic_operator_cache proc~core_build_panel_plan_impl core_build_panel_plan_impl proc~core_build_panel_plan_impl->proc~precompute_periodic_root_operator proc~core_build_plan_impl core_build_plan_impl proc~core_build_plan_impl->proc~precompute_periodic_root_operator

Source Code

  subroutine write_periodic_operator_cache(path, fingerprint, target_nodes, operator, status)
    character(len=*), intent(in) :: path, fingerprint
    integer(i32), intent(in) :: target_nodes(:)
    real(dp), intent(in) :: operator(:, :, :)
    integer(i32), intent(out) :: status
    character(len=128) :: stored_fingerprint
    character(len=:), allocatable :: temporary_path
    integer(i32) :: ncoef, ntarget
    integer(int64) :: checksum
    integer :: unit, ios, rename_status

    status = periodic_cache_invalid
    ncoef = int(size(operator, 1), i32)
    ntarget = int(size(operator, 3), i32)
    if (ncoef <= 0_i32 .or. size(operator, 2) /= ncoef .or. ntarget /= size(target_nodes)) return
    if (len_trim(path) == 0 .or. len_trim(fingerprint) == 0 .or. len_trim(fingerprint) > len(stored_fingerprint)) return

    stored_fingerprint = ''
    stored_fingerprint = trim(fingerprint)
    checksum = periodic_operator_checksum(target_nodes, operator)
    temporary_path = trim(path)//'.tmp'
    open (newunit=unit, file=temporary_path, access='stream', form='unformatted', status='replace', action='write', iostat=ios)
    if (ios /= 0) then
      status = periodic_cache_io_error
      return
    end if
    write (unit, iostat=ios) cache_magic, periodic_cache_format_version, stored_fingerprint, ncoef, ntarget, checksum
    if (ios == 0) write (unit, iostat=ios) target_nodes
    if (ios == 0) write (unit, iostat=ios) operator
    close (unit)
    if (ios /= 0) then
      status = periodic_cache_io_error
      return
    end if
    call atomic_rename(temporary_path, trim(path), rename_status)
    if (rename_status /= filesystem_success) then
      status = periodic_cache_io_error
      return
    end if
    status = periodic_cache_ok
  end subroutine write_periodic_operator_cache