|
valout_hdf.f.html |
|
|
Source file: valout_hdf.f
|
|
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib
|
|
Converted: Sun May 15 2011 at 19:16:16
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
c
c -----------------------------------------------------
c
subroutine valout (lst, lend, time, nvar, naux)
c
implicit double precision (a-h,o-z)
include "call.i"
parameter (nDim = 2)
character*14 fname
character*13 qname2
character*9 qname
c
c # HDF: Declare variables that describe datasets and HDF files.
c
integer sd_id, sds_id, sds_rank
integer sds_dims, sds_start, sds_edges, sds_stride
dimension sds_dims(nDim), sds_start(nDim)
dimension sds_edges(nDim), sds_stride(nDim)
c # HDF: Arrays which will hold output arrays.
integer ntotal_output
parameter (ntotal_output = 1000000)
dimension qbuf(21), qout(ntotal_output)
c
c # HDF: Declare external HDF functions
c
integer sfstart, sfcreate, sfwdata, sfscompress, sfendacc, sfend
external sfstart, sfcreate, sfwdata, sfscompress, sfendacc, sfend
c
c # HDF: Set up HDF constants
c
integer DFACC_READ, DFACC_WRITE, DFACC_CREATE
parameter(DFACC_READ = 1, DFACC_WRITE = 2, DFACC_CREATE = 4)
integer DFNT_FLOAT64, DFNT_INT32
parameter(DFNT_FLOAT64 = 6, DFNT_INT32 = 24)
integer SUCCEED, FAIL
parameter(SUCCEED = 0, FAIL = -1)
c
c # HDF: Set up compression constants for HDF file.
c
integer COMP_CODE_DEFLATE, DEFLATE_LEVEL
parameter (COMP_CODE_DEFLATE = 4, DEFLATE_LEVEL = 6)
c
iadd(i,j,ivar) = loc + i - 1 + mitot*((ivar-1)*mjtot+j-1)
c
c ::::::::::::::::::::::::::: VALOUT ::::::::::::::::::::::::::::::::::;
c valout = graphics output of soln values for contour or surface plots.
c can output for matlab or ncar graphics post-processing
c :::::::::::::::::::::::::::::::::::::;:::::::::::::::::::::::::::::::;
c
c ### NCAR graphics output
if (ncarout) then
call basic (time, lst, lend )
c
write(pltunit1,100) nvar
100 format(10h*VALS ,i10)
c
level = lst
10 if (level .gt. lend) go to 60
mptr = lstart(level)
20 if (mptr .eq. 0) go to 50
nx = node(ndihi,mptr)-node(ndilo,mptr) + 1
ny = node(ndjhi,mptr)-node(ndjlo,mptr) + 1
mitot = nx + 2*nghost
mjtot = ny + 2*nghost
loc = node(store1,mptr)
call outvar(alloc(loc),mitot,mjtot,nvar,mptr,nghost)
mptr = node(levelptr,mptr)
go to 20
50 continue
level = level + 1
go to 10
c
60 continue
endif
c ### MATLAB graphics output
c
c # HDF: Modified 8/2003 by Peter Blossey to generate HDF
c # (version 4) output files. These portable, binary
c # format output files allow for self-describing data
c # sets as well as data compression.
c
c # For more information about HDF, see
c # http://hdf.ncsa.uiuc.edu/
c
if (matlabout) then
c ### make the file names and open output files
iframe = matlabu
fname = 'fort.q'
& // char(ichar('0') + mod(iframe/1000,10))
& // char(ichar('0') + mod(iframe/100,10))
& // char(ichar('0') + mod(iframe/10,10))
& // char(ichar('0') + mod(iframe,10))
& // '.hdf'
level = lst
ngrids = 0
c
c # HDF: create hdf file.
c
sd_id = sfstart(fname, DFACC_CREATE)
if (sd_id.eq.FAIL) THEN
WRITE(*,*) 'Failed to create HDF file (call to sfstart)'
STOP
end if
65 if (level .gt. lfine) go to 90
mptr = lstart(level)
70 if (mptr .eq. 0) go to 80
ngrids = ngrids + 1
nx = node(ndihi,mptr) - node(ndilo,mptr) + 1
ny = node(ndjhi,mptr) - node(ndjlo,mptr) + 1
loc = node(store1, mptr)
locaux = node(storeaux,mptr)
mitot = nx + 2*nghost
mjtot = ny + 2*nghost
xlow = rnode(cornxlo,mptr)
ylow = rnode(cornylo,mptr)
c
c # HDF: Check whether grid is larger than statically allocated
c # output array.
c
if ((nx*ny).gt.ntotal_output) then
WRITE(*,*) 'Grid number ', mptr, ' on level number ',
& level, ' exceeds ntotal_output'
WRITE(*,*) 'Increase ntotal_output in valout_hdf.f'
STOP
end if
c
c # HDF: create a data set for parameters describing q in HDF file.
c
qname = 'grid_'
& // char(ichar('0') + mod(mptr/1000,10))
& // char(ichar('0') + mod(mptr/100,10))
& // char(ichar('0') + mod(mptr/10,10))
& // char(ichar('0') + mod(mptr,10))
sds_rank = 1
sds_dims(1) = 21
sds_id = sfcreate(sd_id,qname,DFNT_FLOAT64,sds_rank,sds_dims)
if (sds_id.eq.FAIL) THEN
WRITE(*,*)
& 'Failed to create scientific data set in HDF file'
STOP
end if
c
c # HDF: set up parameters describing data set.
c
sds_start(1) = 0
sds_edges(1) = sds_dims(1)
sds_stride(1) = 1
qbuf(1) = ngrids
qbuf(2) = nDim
qbuf(3) = time
qbuf(4) = nvar
qbuf(5) = level
qbuf(6) = nx
qbuf(7) = ny
qbuf(8) = 0.
qbuf(9) = 0.
qbuf(10) = xlow
qbuf(11) = ylow
qbuf(12) = 0.
qbuf(13) = 0.
qbuf(14) = xlow+nx*hxposs(level)
qbuf(15) = ylow+ny*hyposs(level)
qbuf(16) = 0.
qbuf(17) = 0.
qbuf(18) = hxposs(level)
qbuf(19) = hyposs(level)
qbuf(20) = 0.
qbuf(21) = 0.
istat = sfwdata(sds_id,sds_start,sds_stride,sds_edges,qbuf)
istat = sfendacc(sds_id)
c
c # Loop over fields in q
c
do ivar = 1,nvar
c
c # HDF: create a data set for parameters describing q in HDF file.
c
qname2 = qname // '_'
& // char(ichar('0') + mod(ivar/100,10))
& // char(ichar('0') + mod(ivar/10,10))
& // char(ichar('0') + mod(ivar,10))
c
c # HDF: Reverse dimensions when storing arrays because of different
c # conventions between c and FORTRAN as to which dimension should
c # be stored first. Reversing the dimensions here will make
c # the x-direction first when reading into MATLAB.
c
sds_rank = nDim
sds_dims(1) = ny
sds_dims(2) = nx
c
sds_id = sfcreate(sd_id,qname2,DFNT_FLOAT64,sds_rank,
& sds_dims)
if (sds_id.eq.FAIL) THEN
WRITE(*,*) 'Failed to create data set in HDF file'
STOP
end if
c
c # HDF: set up parameters describing data set.
c
sds_start(1) = 0
sds_edges(1) = sds_dims(1)
sds_stride(1) = 1
sds_start(2) = 0
sds_edges(2) = sds_dims(2)
sds_stride(2) = 1
c
c # Copy current field of q into qout.
c
ioffset = 0
do j = nghost+1, mitot-nghost
do i = nghost+1, mjtot-nghost
qout(ioffset+i-nghost) = alloc(iadd(j,i,ivar))
end do
ioffset = ioffset + ny
end do
c
c # HDF: set compression mode and write data to hdf file.
c
istat=sfscompress(sds_id,COMP_CODE_DEFLATE,DEFLATE_LEVEL)
istat = sfwdata(sds_id,sds_start,sds_stride,sds_edges,qout)
if (istat.eq.FAIL) then
WRITE(*,*) 'Failed to write SDS (call to sfwdata)'
STOP
end if
c
c # HDF: Close the data set
c
istat = sfendacc(sds_id)
if (istat.eq.FAIL) then
WRITE(*,*) 'Failed to close SDS (call to sfendacc)'
STOP
end if
end do
mptr = node(levelptr, mptr)
go to 70
80 level = level + 1
go to 65
90 continue
c
c # HDF: Close HDF file.
c
istat = sfend(sd_id)
if (istat.eq.FAIL) then
WRITE(*,*) 'Failed to close ', fname, ' (call to sfend)'
STOP
end if
c
c # Output message saying that write is complete.
c
write(6,601) matlabu,time
601 format('AMRCLAW: Frame ',i4,
& ' output files done at time t = ', d12.5,/)
matlabu = matlabu + 1
endif
return
end