Monitor netCDF File - Sample Program
This Fortran
progam creates a netCDF file containing 3 variables: r, time,
and
density. r is a 1-dimensional variable
containing six X values of points to plot. density is a
2-dimensional variable containing 11 sets of six Y values of points to
plot. time is a
1-dimensional variable
with 11 values that are used as time indices to the sets of Y
values. The program runs through 11 time steps. In each
time step it adds to the time and density variables. They are
defined with an "unlimited" dimension within the file so they are
extended at each time step. At time step 7, e.g., time contains only 7 values and density contains only 7 sets.
ElVis tracks the size of variables and updates the graph when their
size changes. Define
variables to be monitored with an unlimited
dimension so ElVis can detect a change in their size.
The attribute named "running" is set to true until the final time
step when it is set to false. ElVis will monitor the file while
running is set to true.
The output file is in
http:/w3.pppl.gov/elvis/data/monitor.cdf. It has a corresponding
template file, monitor.cdft. When you run ElVis and browse
for monitor.cdf the resulting plot is shown below the sample
program. The netCDF panel lists the variables in the file. r is selected as the X-axis values
and time is selected as the
index. The density
variable is selected for plotting. Its data is transposed
because array indexing in ElVis (Java) is transposed from
Fortran. The graph is an animated f(x,i) showing, in this screen
shot, the final time step. The slider or the VCR buttons in ElVis
are used to change the index to a different time step.
Fortran 90 netCDF Interface
program simmonitor
use netcdf
implicit none
C netCDF file ID
integer ncid
C netCDF error status return
integer iret
C netCDF dimension IDs
integer samples_dim
integer timesteps_dim
C program variables for dimensions
integer samples_len
parameter (samples_len = 6)
integer timesteps_len
parameter (timesteps_len = 11)
integer start(1)
integer start_den(2)
integer count(1)
integer count_den(2)
C netCDF variable IDs
integer time_id
integer r_id
integer density_id
C netCDF variable shapes
integer time_dims(1)
integer r_dims(1)
integer density_dims(2)
C program data variables
real*8 r(samples_len)
data r / 2., 2.4, 2.8, 3.2, 3.6, 4. /
real*8 simtime(1)
real*8 density(samples_len)
integer i, j
real*8 densitycalc
C create netCDF file and enter
define mode
iret = nf90_create('monitor.cdf', NF90_CLOBBER, ncid)
call check_err(iret)
C define netCDF dimensions
iret = nf90_def_dim(ncid, 'samples', samples_len, samples_dim)
call check_err(iret)
iret = nf90_def_dim(ncid, 'timesteps', NF90_UNLIMITED,
> timesteps_dim)
call check_err(iret)
C define netCDF variables
r_dims(1) = samples_dim
iret = nf90_def_var(ncid, 'r', NF90_DOUBLE, r_dims, r_id)
call check_err(iret)
time_dims(1) = timesteps_dim
iret = nf90_def_var(ncid, 'time', NF90_DOUBLE, time_dims,
>
time_id)
call check_err(iret)
iret = nf90_put_att(ncid, time_id, 'units', 'seconds')
call check_err(iret)
density_dims(1) = samples_dim
density_dims(2) = timesteps_dim
iret = nf90_def_var(ncid, 'density', NF90_DOUBLE,
>
density_dims, density_id)
call check_err(iret)
C set netCDF attribute for ElVis
to start monitoring netCDF file
iret = nf90_put_att(ncid, NF90_GLOBAL, 'running', 'true')
call check_err(iret)
C leave netCDF define mode
iret = nf90_enddef(ncid)
call check_err(iret)
C put data into netCDF r variable
iret = nf90_put_var(ncid, r_id, r)
call check_err(iret)
iret = nf90_sync(ncid)
call check_err(iret)
C initialize the simulation
simtime(1) = 0.
count(1) = 1
count_den(1) = samples_len
count_den(2) = 1
start_den(1) = 1
C loop through the simulation
time steps
do
j=1,timesteps_len
simtime(1) = simtime(1) + .1
C append the
current time value to the 1-D time variable in the file
start(1) = j
iret = nf90_put_var(ncid, time_id, simtime, start, count)
call check_err(iret)
C calculate
density for this time step
do i=1,samples_len
density(i) = densitycalc(i, j)
enddo
C append the
1-D density to the 2-D density variable in the file
start_den(2) = j
iret = nf90_put_var(ncid, density_id, density, start_den,
> count_den)
call check_err(iret)
iret = nf90_sync(ncid)
call check_err(iret)
print *, j
call sleep(5)
enddo
C set netCDF attribute for ElVis
to stop monitoring netCDF file
iret = nf90_redef(ncid)
call check_err(iret)
iret = nf90_put_att(ncid, NF90_GLOBAL, 'running', 'false')
call check_err(iret)
iret = nf90_enddef(ncid)
call check_err(iret)
iret = nf90_close(ncid)
call check_err(iret)
end
real function densitycalc(i, step)
implicit none
integer i
integer step
real initd(6)
data initd / 5., 6., 6.5, 6.8, 6.3, 5.4 /
real dcalc
if
(step .eq. 1) then
dcalc = initd(i)
else
dcalc = initd(i) * step * .8
endif
densitycalc = dcalc
return
end
subroutine check_err(iret)
use netcdf
implicit none
integer iret
if
(iret .ne. nf90_NoErr) then
print *, nf90_strerror(iret)
stop
endif
end
Fortran 77 netCDF Interface
program simmonitor
implicit none
include
'netcdf.inc'
C netCDF file ID
integer ncid
C dimension IDs
integer samples_dim
integer timesteps_dim
C dimensions
integer samples_len
integer timesteps_len
parameter (samples_len = 6)
parameter (timesteps_len = 11)
integer start(1)
integer count(1)
C variable IDs
integer time_id
integer r_id
integer density_id
C variable shapes
integer time_dims(1)
integer r_dims(1)
integer density_dims(2)
C variable data
real time(timesteps_len)
real r(samples_len)
real density(samples_len, timesteps_len)
C error status return
integer iret
integer i, j
real simtime
real densitycalc
C create netCDF file and enter
define mode
iret = nf_create('monitor.cdf', NF_CLOBBER, ncid)
call check_err(iret)
C define dimensions
iret = nf_def_dim(ncid, 'samples', 6, samples_dim)
call check_err(iret)
iret = nf_def_dim(ncid, 'timesteps', NF_UNLIMITED, timesteps_dim)
call check_err(iret)
C define variables
r_dims(1) = samples_dim
iret = nf_def_var(ncid, 'r', NF_REAL, 1, r_dims, r_id)
call check_err(iret)
time_dims(1) = timesteps_dim
iret = nf_def_var(ncid, 'time', NF_REAL, 1, time_dims,
1
time_id)
call check_err(iret)
iret = nf_put_att_text(ncid, time_id, 'units', 7, 'seconds')
call check_err(iret)
density_dims(1) = samples_dim
density_dims(2) = timesteps_dim
iret = nf_def_var(ncid, 'density', NF_REAL, 2,
1
density_dims, density_id)
call check_err(iret)
C set attribute for ElVis to
start monitoring netCDF file
iret = nf_put_att_text(ncid, NF_GLOBAL, 'running', 4, 'true')
call check_err(iret)
C leave define mode
iret = nf_enddef(ncid)
call check_err(iret)
C put data into r variable
data r / 2., 2.4, 2.8, 3.2, 3.6, 4. /
iret = nf_put_var_real(ncid, r_id, r)
call check_err(iret)
iret = nf_close(ncid)
call check_err(iret)
C initialize the simulation
simtime = 0.
start(1) = 1
C run the simulation
do
j=1,timesteps_len
simtime = simtime + .1
iret = nf_open('monitor.cdf', NF_WRITE, ncid)
call check_err(iret)
time(j) = simtime
count(1) = j
iret = nf_put_vara_real(ncid, time_id, start, count, time)
call check_err(iret)
do i=1,6
density(i,j) = densitycalc(i, j)
enddo
iret = nf_put_var_real(ncid, density_id, density)
call check_err(iret)
iret = nf_close(ncid)
call check_err(iret)
enddo
C assign attribute for ElVis to
stop monitoring output file
iret = nf_open('monitor.cdf', NF_WRITE, ncid)
call check_err(iret)
iret = nf_redef(ncid)
call check_err(iret)
iret = nf_put_att_text(ncid, NF_GLOBAL, 'running', 5, 'false')
call check_err(iret)
iret = nf_enddef(ncid)
call check_err(iret)
iret = nf_close(ncid)
call check_err(iret)
end
real function densitycalc(i, step)
implicit none
integer i
integer step
real initd(6)
data initd / 5., 6., 6.5, 6.8, 6.3, 5.4 /
real dcalc
if
(step .eq. 0) then
dcalc = initd(i)
else
dcalc = initd(i) * step * .8
endif
densitycalc = dcalc
return
end
subroutine check_err(iret)
implicit none
integer iret
include 'netcdf.inc'
if
(iret .ne. NF_NOERR) then
print *, nf_strerror(iret)
stop
endif
end