5 type(Dataset),
intent(inout) :: dset
6 character(len=*),
intent(in) :: varname
7 integer,
intent(in),
optional :: nslice
8 integer,
intent(in),
optional :: slicedim
9 integer,
intent(out),
optional :: errcode
10 integer ncerr, nvar, ncount, ndim, nd, n
11 integer,
allocatable,
dimension(:) :: start, count, dimlens
13 logical return_errcode
15 if(
present(errcode))
then
19 return_errcode=.false.
22 if (
present(nslice))
then
30 nvar = get_nvar(dset,varname)
31 allocate(start(dset%variables(nvar)%ndims),count(dset%variables(nvar)%ndims))
32 allocate(dimlens(dset%variables(nvar)%ndims))
36 if (
present(slicedim))
then
39 nd = dset%variables(nvar)%ndims
42 do n=1,dset%variables(nvar)%ndims
48 count(n) = dset%variables(nvar)%dimlens(n)
49 dimlens(ndim) = dset%variables(nvar)%dimlens(n)
54 ncerr = nf90_var_par_access(dset%ncid, dset%variables(nvar)%varid, nf90_collective)
56 if (dset%variables(nvar)%ndims > 1)
then
57 ncerr = nf90_put_var(dset%ncid, dset%variables(nvar)%varid,values, &
58 start=start,count=count)
59 else if (dset%variables(nvar)%ndims == 1)
then
60 if (return_errcode)
then
64 print *,
'cannot write a slice to a 1d variable'
68 else if (
present(ncstart) .and.
present(nccount))
then
69 ncerr = nf90_put_var(dset%ncid, dset%variables(nvar)%varid,values, &
70 start=ncstart, count=nccount)
72 ncerr = nf90_put_var(dset%ncid, dset%variables(nvar)%varid, values)
74 if (return_errcode)
then
75 call nccheck(ncerr,halt=.false.)
77 if (ncerr /= 0)
return
82 if (dset%variables(nvar)%hasunlim)
then
83 if (return_errcode)
then
84 call set_varunlimdimlens_(dset,errcode)
86 call set_varunlimdimlens_(dset)