blob: 02e27001775d23ed57c33d96e9afb797f3b18c93 [file] [log] [blame]
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine setup_btio
c---------------------------------------------------------------------
c---------------------------------------------------------------------
include 'header.h'
include 'mpinpb.h'
integer m, ierr
iseek=0
if (node .eq. root) then
call MPI_File_delete(filenm, MPI_INFO_NULL, ierr)
endif
call MPI_Barrier(comm_solve, ierr)
call MPI_File_open(comm_solve,
$ filenm,
$ MPI_MODE_RDWR + MPI_MODE_CREATE,
$ MPI_INFO_NULL,
$ fp,
$ ierr)
call MPI_File_set_view(fp,
$ iseek, MPI_DOUBLE_PRECISION, MPI_DOUBLE_PRECISION,
$ 'native', MPI_INFO_NULL, ierr)
if (ierr .ne. MPI_SUCCESS) then
print *, 'Error opening file'
stop
endif
do m = 1, 5
xce_sub(m) = 0.d0
end do
idump_sub = 0
return
end
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine output_timestep
c---------------------------------------------------------------------
c---------------------------------------------------------------------
include 'header.h'
include 'mpinpb.h'
integer count, jio, kio, cio, aio
integer ierr
integer mstatus(MPI_STATUS_SIZE)
do cio=1,ncells
do kio=0, cell_size(3,cio)-1
do jio=0, cell_size(2,cio)-1
iseek=5*(cell_low(1,cio) +
$ PROBLEM_SIZE*((cell_low(2,cio)+jio) +
$ PROBLEM_SIZE*((cell_low(3,cio)+kio) +
$ PROBLEM_SIZE*idump_sub)))
count=5*cell_size(1,cio)
call MPI_File_write_at(fp, iseek,
$ u(1,0,jio,kio,cio),
$ count, MPI_DOUBLE_PRECISION,
$ mstatus, ierr)
if (ierr .ne. MPI_SUCCESS) then
print *, 'Error writing to file'
stop
endif
enddo
enddo
enddo
idump_sub = idump_sub + 1
if (rd_interval .gt. 0) then
if (idump_sub .ge. rd_interval) then
call acc_sub_norms(idump+1)
idump_sub = 0
endif
endif
return
end
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine acc_sub_norms(idump_cur)
include 'header.h'
include 'mpinpb.h'
integer idump_cur
integer count, jio, kio, cio, ii, m, ichunk
integer ierr
integer mstatus(MPI_STATUS_SIZE)
double precision xce_single(5)
ichunk = idump_cur - idump_sub + 1
do ii=0, idump_sub-1
do cio=1,ncells
do kio=0, cell_size(3,cio)-1
do jio=0, cell_size(2,cio)-1
iseek=5*(cell_low(1,cio) +
$ PROBLEM_SIZE*((cell_low(2,cio)+jio) +
$ PROBLEM_SIZE*((cell_low(3,cio)+kio) +
$ PROBLEM_SIZE*ii)))
count=5*cell_size(1,cio)
call MPI_File_read_at(fp, iseek,
$ u(1,0,jio,kio,cio),
$ count, MPI_DOUBLE_PRECISION,
$ mstatus, ierr)
if (ierr .ne. MPI_SUCCESS) then
print *, 'Error reading back file'
call MPI_File_close(fp, ierr)
stop
endif
enddo
enddo
enddo
if (node .eq. root) print *, 'Reading data set ', ii+ichunk
call error_norm(xce_single)
do m = 1, 5
xce_sub(m) = xce_sub(m) + xce_single(m)
end do
enddo
return
end
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine btio_cleanup
c---------------------------------------------------------------------
c---------------------------------------------------------------------
include 'header.h'
include 'mpinpb.h'
integer ierr
call MPI_File_close(fp, ierr)
return
end
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine accumulate_norms(xce_acc)
c---------------------------------------------------------------------
c---------------------------------------------------------------------
include 'header.h'
include 'mpinpb.h'
double precision xce_acc(5)
integer m, ierr
if (rd_interval .gt. 0) goto 20
call MPI_File_open(comm_solve,
$ filenm,
$ MPI_MODE_RDONLY,
$ MPI_INFO_NULL,
$ fp,
$ ierr)
iseek = 0
call MPI_File_set_view(fp,
$ iseek, MPI_DOUBLE_PRECISION, MPI_DOUBLE_PRECISION,
$ 'native', MPI_INFO_NULL, ierr)
c clear the last time step
call clear_timestep
c read back the time steps and accumulate norms
call acc_sub_norms(idump)
call MPI_File_close(fp, ierr)
20 continue
do m = 1, 5
xce_acc(m) = xce_sub(m) / dble(idump)
end do
return
end