blob: d3085a030a0aa0dc31ce6f94c5297295794320d3 [file] [log] [blame]
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine setup_btio
c---------------------------------------------------------------------
c---------------------------------------------------------------------
include 'header.h'
include 'mpinpb.h'
character*(128) newfilenm
integer m, ierr
if (node.eq.root) record_length = 40/fortran_rec_sz
call mpi_bcast(record_length, 1, MPI_INTEGER,
> root, comm_setup, ierr)
open (unit=99, file=filenm,
$ form='unformatted', access='direct',
$ recl=record_length)
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 ix, jio, kio, cio
do cio=1,ncells
do kio=0, cell_size(3,cio)-1
do jio=0, cell_size(2,cio)-1
iseek=(cell_low(1,cio) +
$ PROBLEM_SIZE*((cell_low(2,cio)+jio) +
$ PROBLEM_SIZE*((cell_low(3,cio)+kio) +
$ PROBLEM_SIZE*idump_sub)))
do ix=0,cell_size(1,cio)-1
write(99, rec=iseek+ix+1)
$ u(1,ix, jio,kio,cio),
$ u(2,ix, jio,kio,cio),
$ u(3,ix, jio,kio,cio),
$ u(4,ix, jio,kio,cio),
$ u(5,ix, jio,kio,cio)
enddo
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 ix, jio, kio, cio, ii, m, ichunk
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=(cell_low(1,cio) +
$ PROBLEM_SIZE*((cell_low(2,cio)+jio) +
$ PROBLEM_SIZE*((cell_low(3,cio)+kio) +
$ PROBLEM_SIZE*ii)))
do ix=0,cell_size(1,cio)-1
read(99, rec=iseek+ix+1)
$ u(1,ix, jio,kio,cio),
$ u(2,ix, jio,kio,cio),
$ u(3,ix, jio,kio,cio),
$ u(4,ix, jio,kio,cio),
$ u(5,ix, jio,kio,cio)
enddo
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---------------------------------------------------------------------
close(unit=99)
return
end
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine accumulate_norms(xce_acc)
c---------------------------------------------------------------------
c---------------------------------------------------------------------
include 'header.h'
include 'mpinpb.h'
double precision xce_acc(5)
integer m
if (rd_interval .gt. 0) goto 20
open (unit=99, file=filenm,
$ form='unformatted', access='direct',
$ recl=record_length)
c clear the last time step
call clear_timestep
c read back the time steps and accumulate norms
call acc_sub_norms(idump)
close(unit=99)
20 continue
do m = 1, 5
xce_acc(m) = xce_sub(m) / dble(idump)
end do
return
end