problem with put_att (maximum number of attributes)
Wei-keng Liao
wkliao at ece.northwestern.edu
Thu Feb 19 14:27:57 CST 2009
Hi, Lex,
PnetCDF requires the attribute define arguments be the same across
all processes. This is why you got the error message for defining
attribute "history" in line 400, if its value "conflicts" among
processes.
I think you have got this.
I checked your codes. Starting from line 562, you have a few text
attributes
from des_tgas_picture(i), des_trac_picture(i), des_tpas_picture(i),
and des.
Similar for out_type == 2. Are you sure their values are all the same
across
all the processes? May be you can use MPI_Bcast to check if anyone has
different value.
Wei-keng
On Feb 19, 2009, at 11:14 AM, Alex Hoffmann wrote:
> Dear Rob
> Thanks a lot for your answer.
> Isolating the PnetCDF output module from the code as a stand-alone
> would
> require a substantial effort, and I do not encounter this error in my
> small test programs. I attached the output module for reference.
>
> The attribute section that causes trouble is between lines 369-405
> (global) and 468-613 (variables). I am aware that the attribute
> history
> (line 400) may be problematic as every process may have a slightly
> different value (for the time element taken from the fortran function
> date_and_time). Yet this is not the only issue.
>
> If I prematurely exit at line 492, uncommenting any further attribute
> definition between 468 and 489 causes a crash with the multiprocesses
> conflict.
>
> Note also that the attribute definitions between 558 and 613 only
> produce no crash currently because of the print statements on lines
> 560
> and 591, which made me think that maybe there is an optimization
> problem. What is strange is that if these are not included, the crash
> occurs only when I start writing the first file (movie file,
> out_type=2), AND if I leave the first block (if out_type==1)
> uncommented, although this block is not even entered in that
> particular
> case, and vice versa. Hope this is more or less clear...
>
> Cheers,
> Lex
>
>
> Robert Latham wrote:
>> On Thu, Feb 19, 2009 at 10:09:37AM +0000, Alex Hoffmann wrote:
>>> Hello,
>>> I am getting the same error message as had already been inquired
>>> on in
>>> this list, i.e.:
>>>
>>> NC definations on multiprocesses conflict.
>>> NOTE: Definitions across all process
>>>
>>> and this seems to be related somehow randomly to the total number of
>>> attributes (global or for each variable) that I intend to write
>>> during
>>> the the definition phase (and, though I am not sure about this, to
>>> the
>>> number of processes used to run my F90 parallel code).
>>>
>>> More precisely, if I uncomment one put_att to replace another, the
>>> program still runs, if I do not comment out another one, the program
>>> crashes with the above error message.
>>>
>>> Is there any way of identifying where this problem comes from or is
>>> there a maximum amount of attributes (though I don't write an
>>> excessive
>>> amount of them)? There is no problem running it on one process(or).
>>
>> Maybe you can show us with a small test program how you are
>> encountering this error? The maximum number of attributes is 4k (the
>> constant NC_MAX_ATTRS).
>>
>> ==rob
>>
>
> --
> ______________________________________________________________________
>
> Alex HOFFMANN PhD Candidate
> Centre for Atmospheric Science
> Department of Geography University of Cambridge
> Downing Place, Cambridge CB2 3EN, UK
> e-mail: ah519 at cam.ac.uk tel: +44 (0)1223 766581
> www.geog.cam.ac.uk/people/hoffmann/
> ______________________________________________________________________
> !-*- F90 -*-
> module atham_pnetcdf
>
> !--------------------------------------------------------------------!
> ! author: Alex
> HOFFMANN !
> ! email:
> ah519 at cam.ac.uk !
> ! date: February
> 2009 !
> ! version:
> v0.1 !
> ! !
> ! collection of routines for ATHAM PnetCDF
> output !
> !--------------------------------------------------------------------!
>
> ! module is to replace existing atham_netcdf.mod (GL) to write ATHAM
> output as netCDF files
> ! same as atham_netcdf.mod (AH) but adapted to run with the Parallel
> NetCDF API,
> ! developed by Northwestern University and Argonne National
> Laboratory,
> ! which is built on top of MPI-IO (tested with MPICH 2.1)
>
> use precision, only : kint, kreal, real4, my_real
>
> use atham_module, only : nx, ny, nz, ntx, nty, npx, npy
>
>
> use atham_module, only : ntgas_picture, ntrac_picture,
> ntpas_picture, &
> ntgas_movie, ntrac_movie, ntpas_movie
>
> implicit none
>
> private
> public :: netcdf_data
>
> ! 'pnetcdf.inc' file includes cpp directives that were not
> understood at compile-time
> ! this is to be changed and hard-wired link to be replaced by the
> include 'pnetcdf.inc' command
> !include 'pnetcdf.inc'
> #include "/usr/local/parallel-netcdf-1.0.1/include/pnetcdf.inc"
> include 'mpif.h'
>
>
> ! ######### tried saving netCDF variable IDs here so that they must
> not be retrieved by inquiry
> ! ######### if this creates conflict, especially between picture and
> movie file, this must be changed
> integer(kint), save :: x_dimID, y_dimID,
> z_dimID, t_dimID
> integer(kint), save :: x_varID, y_varID,
> z_varID, t_varID
> integer(kint), save :: u_varID, v_varID, w_varID
> integer(kint), save :: pnew_varID,
> tetnew_varID, tempnew_varID, density_varID
> integer(kint), save :: turbhor_varID,
> turbver_varID, turblen_varID
> integer(kint), dimension(99), save :: tgas_varID, trac_varID,
> tpas_varID, d_trac_varID
>
>
> integer(MPI_OFFSET_KIND), save :: tcounter
>
> real(real4), parameter :: undef = -0.99e33_real4 !
> make sure precision of _FillValue and output (NF90_FLOAT) is the
> same !!!
>
> contains
> !
> =====================================================================
> subroutine netcdf_data(outfile,out_type,timetot)
> ! IF: outfile = picture_file or movie_file (path/filename for
> output created in atham_module)
> ! out_type = 1 (picture_file) or 2 (movie_file)
> ! timetot = total simulation time since simulation start
>
> use atham_module, only : unew, vnew, wnew, pnew, tetnew, tempnew, &
> density, turbhor, turbver, turblen
>
> use atham_module, only : tgasnew, tracnew, tpasnew, tracdep
>
> use atham_module, only : itgas_picture, itrac_picture,
> itpas_picture, &
> itgas_movie, itrac_movie, itpas_movie
>
> use atham_module, only : mycoor, my_cart, myrank
>
> character(*), intent(in ) :: outfile
> integer(kint), intent(in ) :: out_type
> real(kreal), intent(in ) :: timetot
>
> !------------------------------------------------------------------!
> ! local
> variables !
> !------------------------------------------------------------------!
> integer(MPI_OFFSET_KIND) :: nx_mpi,ny_mpi, nz_mpi,
> y_cl_mpi
> integer(MPI_OFFSET_KIND) :: istart,jstart
> integer(kint) :: STATUS
> character(len=50) :: OP ! debugging variable
> corresponding to the called netCDF OPeration
> integer(kint) :: NCID
> integer(kint) :: i
> logical :: DynMovie_flag,
> bounds_control
> integer(kint) :: y_st, y_sp, y_cl
>
> ! replace DynMovie precompiler flag by program flag for more
> convenient code structure
> DynMovie_flag = .false.
> #ifdef DynMovie
> DynMovie_flag = .true.
> #endif
>
> ! re-assign dimension lengths as an MPI_Offset type (necessary
> for the PnetCDF interface)
> ! cut-off subdomain borders
> nx_mpi = nx-2
> ny_mpi = ny-2
> nz_mpi = nz
>
> ! assign coordinates of first element of each process in the
> netCDF file
> istart = mycoor(1)*nx_mpi + 1_MPI_OFFSET_KIND
> jstart = mycoor(2)*ny_mpi + 1_MPI_OFFSET_KIND
>
> bounds_control = .true. ! debugging flag
> tcounter = tcounter+1_MPI_OFFSET_KIND
>
> ! === open netCDF dataset: enter data mode
> ------------------------!
> ! if dataset does not yet exist (STATUS = ), create file and
> enter data mode
> ! else continue
> OP = 'open existing netCDF file'
> STATUS = nfmpi_open(my_cart, trim(outfile), NF_WRITE,
> MPI_INFO_NULL, NCID)
> if ( STATUS /= nf_noerr ) then
> if (myrank==0) then
> print *, ""
> print *, "P-NetCDF operation: ",trim(OP)
> print *, trim(nfmpi_strerror(STATUS))
> print *, "atham_pnetcdf netcdf_data(): new netCDF file
> created: ", outfile
> print *, ""
> end if
> call netcdf_define(outfile,out_type,timetot,NCID)
> tcounter = 1_MPI_OFFSET_KIND ! reset time counter for output
> if new file is created
> end if
>
> ! --- write data values
> --------------------!
> ! unlimited record dimension time (only one process writes the
> whole dimension, i.e. accross all processes)
> OP = 'write data values - unlimited dimension t'
>
> call handle_err(nfmpi_begin_indep_data(NCID))
>
> if (myrank==0) then
> call handle_err(nfmpi_put_vara_real(NCID, t_varID, (/
> tcounter/), (/1_MPI_OFFSET_KIND/), real(timetot,real4)),OP)
> end if
>
> call handle_err(nfmpi_end_indep_data(NCID))
>
> ! --- write data values
> --------------------!
> ! discriminate between 2D and 3D case for output generation
> if (nty>4) then
> y_st = 2 ! y index start
> y_sp = ny-1 ! y index stop
> y_cl = ny-2 ! y number of columns
> else
> y_st = ny-1 ! 3 in 2D case
> y_sp = ny-1 ! 3 in 2D case
> y_cl = 1
> end if
> y_cl_mpi = y_cl
>
> ! dynamics data
> OP = 'write data values - data'
> if (out_type == 1 .OR. DynMovie_flag == .true.) then
> call write_data(real(unew,real4),u_varID)
> bounds_control = .false.
> call write_data(real(vnew, real4),v_varID)
> call write_data(real(wnew, real4),w_varID)
> call write_data(real(pnew, real4),pnew_varID)
> call write_data(real(tetnew, real4),tetnew_varID)
> call write_data(real(tempnew,real4),tempnew_varID)
> call write_data(real(density,real4),density_varID)
> call write_data(real(turbhor,real4),turbhor_varID)
> call write_data(real(turbver,real4),turbver_varID)
> call write_data(real(turblen,real4),turblen_varID)
> end if
>
> ! tracer data
> if (out_type == 1) then
> do i=1,ntgas_picture
> call
> write_data(real(tgasnew(:,:,:,itgas_picture(i)),real4),tgas_varID(i))
> enddo
> do i=1,ntrac_picture
> call
> write_data(real(tracnew(:,:,:,itrac_picture(i)),real4),trac_varID(i))
> enddo
> do i=1,ntpas_picture
> call
> write_data(real(tpasnew(:,:,:,itpas_picture(i)),real4),tpas_varID(i))
> enddo
> do i=1,ntrac_picture
> call handle_err(nfmpi_begin_indep_data(NCID))
> call handle_err(nfmpi_put_vara_real(NCID, d_trac_varID(i),(/
> istart,jstart,tcounter/), &
> (/nx_mpi,y_cl_mpi,1_MPI_OFFSET_KIND/),
> real(reshape(tracdep(2:nx-1,y_st:y_sp,itrac_picture(i)),shape=(/
> nx-2,y_cl,1/)),real4) ),OP)
> call handle_err(nfmpi_end_indep_data(NCID))
> enddo
> else if (out_type == 2) then
> do i=1,ntgas_movie
> call
> write_data(real(tgasnew(:,:,:,itgas_movie(i)),real4),tgas_varID(i))
> enddo
> do i=1,ntrac_movie
> call
> write_data(real(tracnew(:,:,:,itrac_movie(i)),real4),trac_varID(i))
> enddo
> do i=1,ntpas_movie
> call
> write_data(real(tpasnew(:,:,:,itpas_movie(i)),real4),tpas_varID(i))
> enddo
> endif
>
> ! === close netCDF dataset: exit data mode & save
> -----------------!
> OP = 'close netCDF file'
> call handle_err(nfmpi_close(NCID))
>
> if (myrank==0) then
> print *, ''
> print *, 'wrote netCDF output to file ', outfile
> print *, ''
> end if
>
> contains
> !----------------------------------------------------------------
> subroutine write_data(array_in,varID)
> ! IF: array_in = data array (3D) to be written to netCDF
> ! varID = data variable netCDF ID
>
> use atham_module, only : iflgs ! topography mask: topography
> (iflgs=0) remains undef
>
> use atham_module, only : myrank
>
> real(real4),dimension(nx,ny,nz), intent (in ) :: array_in
> integer(kint), intent(in ) :: varID
>
> !--------------------------------------------------------------!
> ! local
> variables !
> !--------------------------------------------------------------!
>
> real(real4), dimension(nx,ny,nz) :: array_masked
>
> ! dimensions & bounds control
> integer(MPI_OFFSET_KIND) :: dimlenx,
> dimleny, dimlenz, dimlent
> integer(kint), dimension(NF_max_var_dims) :: dimIDs
>
> ! dimensions & bounds control
> if (myrank == 0) then
> if (bounds_control) then
> print *, ''
> print *, 'atham var in xyz ',shape(array_in)
> print *, 'atham var reshaped to xyzt
> ',shape(reshape(array_in(2:nx-1,y_st:y_sp,1:nz),shape=(/nx-2,y_cl,nz,
> 1/)))
> call handle_err(nfmpi_inq_vardimid(NCID, u_varID,
> dimIDs)) ! taken unew as ref
> call handle_err(nfmpi_inq_dimlen(NCID, dimIDs(1),
> dimlenx))
> call handle_err(nfmpi_inq_dimlen(NCID, dimIDs(2),
> dimleny))
> call handle_err(nfmpi_inq_dimlen(NCID, dimIDs(3),
> dimlenz))
> call handle_err(nfmpi_inq_dimlen(NCID, dimIDs(4),
> dimlent))
> print *, 'netCDF var dimensions in xyzt
> ',dimlenx,dimleny,dimlenz,dimlent
> end if
> end if
>
> ! mask topography
> where (iflgs == 1)
> array_masked = array_in
> elsewhere
> array_masked = undef
> endwhere
>
> ! mask control
> !print *, ''
> !print *, 'topography mask'
> !print *, iflgs(1:5,3,3)
> !print *, iflgs(1:5,3,2)
> !print *, iflgs(1:5,3,1)
> !print *, ''
> !print *, 'masked variable array'
> !print *, array_masked(:,3,3)
> !print *, array_masked(:,3,2)
> !print *, array_masked(:,3,1)
> !print *, ''
>
> call handle_err(nfmpi_begin_indep_data(NCID))
> call handle_err(nfmpi_put_vara_real(NCID, varID,(/
> istart,jstart,1_MPI_OFFSET_KIND,tcounter/), &
> (/nx_mpi,y_cl_mpi,nz_mpi,1_MPI_OFFSET_KIND/),
> reshape(array_masked(2:nx-1,y_st:y_sp,1:nz),shape=(/nx-2,y_cl,nz,
> 1/)) ),OP)
> call handle_err(nfmpi_end_indep_data(NCID))
>
> end subroutine write_data
> !
> ----------------------------------------------------------------
> end subroutine netcdf_data
> !
> =====================================================================
> subroutine netcdf_define(outfile,out_type,timetot,ncid_def)
> ! IF: outfile = picture_file or movie_file (path/filename for
> output created in atham_module)
> ! out_type = 1 (picture_file) or 2 (movie_file)
> ! timetot = simulation time since simulation start (from
> atham/atham_out)
> ! ncid_def = netCDF ID assigned to file during creation
>
> use atham_module, only : var_tgas_picture,
> var_tgas_movie, &
> des_tgas_picture,
> des_tgas_movie, &
> var_trac_picture,
> var_trac_movie, &
> des_trac_picture,
> des_trac_movie, &
> var_tpas_picture,
> var_tpas_movie, &
> des_tpas_picture, des_tpas_movie
>
> use atham_module, only : iindex, spinup, nrep, periodt
>
> use atham_module, only : volcano_setup,
> coignimbrite_setup, &
> nuclear_setup, convection_setup,
> procsconfig_setup
>
> use atham_module, only : x, y, z, xg, yg
>
> use atham_module, only : grid2geo, sim_d_YYYY, sim_d_MM,
> sim_d_DD, &
> sim_t_hh, sim_t_mm, sim_t_ss
>
> use atham_module, only : my_cart, myrank
>
> character(*), intent(in ) :: outfile
> integer(kint), intent(in ) :: out_type
> real(kreal), intent(in ) :: timetot
> integer(kint), intent( out) :: ncid_def
>
> !------------------------------------------------------------------!
> ! local
> variables !
> !------------------------------------------------------------------!
> integer(MPI_OFFSET_KIND) :: ntx_mpi,nty_mpi,nz_mpi
> character(len=50) :: OP ! debugging variable
> corresponding to the called netCDF OPeration
> integer(kint) :: NCID
> integer(kint) :: i
> character(len=50) :: var, des
> real(kreal) :: toffset
> real(real4) :: coord_scale,
> coord_x_offset, coord_y_offset, coord_t_offset
> logical :: DynMovie_flag
> character(len=3) :: coord_x_name,
> coord_y_name, coord_z_name
> character(len=4) :: coord_t_name
> character(len=9) :: coord_x_lname,
> coord_y_lname
> character(len=13) :: coord_x_units,
> coord_y_units
> character(len=33) :: coord_t_units
> character(len=8) :: date
> character(len=10) :: time
> character(len=19) :: simdatetime
> character(len=10) :: simdate
> character(len=20) :: login
> character(len=63) :: hist_string
> integer(kint) :: isetup
> character(len=12) :: model_setup(6)
> data model_setup /'volcano ', 'coignimbrite', 'nuclear ',
> 'convection ', 'procsconfig ','unknown '/
>
> ! replace DynMovie precompiler flag by program flag for more
> convenient code structure
> DynMovie_flag = .false.
> #ifdef DynMovie
> DynMovie_flag = .true.
> #endif
>
> ! re-assign dimension lengths as an MPI_Offset type (necessary
> for the PnetCDF interface)
> ! cut-off domain borders
> ntx_mpi = ntx-2
> nty_mpi = nty-2
> nz_mpi = nz
>
> ! convert date and time integers into string 'YYYYMMDD hh:mm:ss'
> write (simdatetime,10)
> sim_d_YYYY,sim_d_MM,sim_d_DD,sim_t_hh,sim_t_mm,sim_t_ss
> 10 format (I4,'-',I2,'-',I2,1X,I2,':',I2,':',I2)
> simdate = simdatetime(1:10)
>
> ! switch between cartesian axes/time (default) and geographic
> axes/date (linear approx)
> coord_scale = 1._real4
> coord_x_offset = 0._real4
> coord_x_name = 'x '
> coord_x_lname = 'x_coor '
> coord_x_units = 'm '
> coord_y_offset = 0._real4
> coord_y_name = 'y '
> coord_y_lname = 'y_coor '
> coord_y_units = 'm '
> coord_z_name = 'z '
> coord_t_offset = 0._real4
> coord_t_name = 'time'
> coord_t_units = 'sec '
> if (grid2geo) then
> call
> gridconvert
> (coord_scale
> ,coord_x_offset,coord_x_name,coord_x_lname,coord_x_units, &
>
> coord_y_offset,coord_y_name,coord_y_lname,coord_y_units, &
>
> coord_z_name,coord_t_offset,coord_t_name,coord_t_units)
> end if
>
> ! === create netCDF dataset: enter define mode
> --------------------!
>
> OP = 'enter define mode'
> call handle_err(nfmpi_create(my_cart, trim(outfile), 0,
> MPI_INFO_NULL,NCID),OP)
> ncid_def = NCID
>
> ! === create netCDF dataset: assign metadata
> ----------------------!
>
> ! --- set global attributes
> ----------------!
> OP = 'set global attributes'
> if (out_type == 1) then
> toffset = timetot - spinup
> call handle_err(nfmpi_put_att_text(NCID, NF_GLOBAL, 'title',
> 13_MPI_OFFSET_KIND, 'atham_picture'),OP)
> else
> toffset = timetot - spinup - nrep*periodt
> call handle_err(nfmpi_put_att_text(NCID, NF_GLOBAL, 'title',
> 11_MPI_OFFSET_KIND, 'atham_movie'),OP)
> end if
> call handle_err(nfmpi_put_att_text(NCID, NF_GLOBAL, 'content',
> 223_MPI_OFFSET_KIND, &
> 'This data corresponds to a simulation run of the mesoscale-
> beta/gamma type non-hydrostatic Active Tracer High-resolution
> Atmospheric Model ATHAM ' &
> // '(Oberhuber et al., 1998, Herzog, 1998), for a setup as
> specified under history'),OP) ! ######### add further description as
> necessary
> call handle_err(nfmpi_put_att_text(NCID, NF_GLOBAL, 'version',
> 21_MPI_OFFSET_KIND, 'no current versioning'),OP) ! ######### change
> once available
>
> call date_and_time(date, time)
> call getlog(login)
> if (volcano_setup) then
> isetup=1
> else if (coignimbrite_setup) then
> isetup=2
> else if (nuclear_setup) then
> isetup=3
> else if (convection_setup) then
> isetup=4
> else if (procsconfig_setup) then
> isetup=5
> else
> isetup=6
> end if
> hist_string = trim(date//' '//time//' '//trim(login)//' atham
> '//model_setup(isetup))
>
> ! call handle_err(nfmpi_put_att_text(NCID, NF_GLOBAL, 'history',
> 63_MPI_OFFSET_KIND, hist_string),OP) ! 1 line/modification: - cmd arg
> ! call handle_err(nfmpi_put_att_text(NCID, NF_GLOBAL,
> 'Conventions', 28_MPI_OFFSET_KIND, 'COARDS, //cf-pcmdi.llnl.gov/'),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, NF_GLOBAL,
> 'sim_onset_date_time', 19_MPI_OFFSET_KIND, simdatetime),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, NF_GLOBAL,
> 'sim_time_offset', NF_FLOAT, 1_MPI_OFFSET_KIND,
> real(toffset,real4)),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, NF_GLOBAL,
> 'x_zoom_location', NF_FLOAT, 1_MPI_OFFSET_KIND,
> real(x(max(1,iindex)),real4)),OP)
>
> ! --- define dimensions
> --------------------!
> OP = 'define dimensions'
> call handle_err(nfmpi_def_dim(NCID, trim(coord_x_name),
> ntx_mpi, x_dimID),OP)
> if (nty>4) then
> call handle_err(nfmpi_def_dim(NCID, trim(coord_y_name),
> nty_mpi, y_dimID),OP)
> else
> call handle_err(nfmpi_def_dim(NCID, trim(coord_y_name),
> 1_MPI_OFFSET_KIND, y_dimID),OP)
> end if
> call handle_err(nfmpi_def_dim(NCID, trim(coord_z_name),
> nz_mpi, z_dimID),OP)
> call handle_err(nfmpi_def_dim(NCID, coord_t_name,
> nfmpi_unlimited, t_dimID),OP)
>
> ! --- define variables
> ---------------------!
> ! dimensions
> OP = 'define variables - dimensions'
> call handle_err(nfmpi_def_var(NCID, trim(coord_x_name),
> NF_FLOAT, 1, x_dimID, x_varID),OP)
> call handle_err(nfmpi_def_var(NCID, trim(coord_y_name),
> NF_FLOAT, 1, y_dimID, y_varID),OP)
> call handle_err(nfmpi_def_var(NCID, trim(coord_z_name),
> NF_FLOAT, 1, z_dimID, z_varID),OP)
> call handle_err(nfmpi_def_var(NCID, coord_t_name,
> NF_FLOAT, 1, t_dimID, t_varID),OP)
>
> ! dynamics data
> OP = 'define variables - data'
> if (out_type == 1 .OR. DynMovie_flag == .true.) then
> call handle_err(nfmpi_def_var(NCID, 'u', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), u_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'v', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), v_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'w', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), w_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'pnew', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), pnew_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'tetnew', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), tetnew_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'tempnew', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), tempnew_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'density', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), density_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'turbhor', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), turbhor_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'turbver', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), turbver_varID),OP)
> call handle_err(nfmpi_def_var(NCID, 'turblen', NF_FLOAT, 4, (/
> x_dimID,y_dimID,z_dimID,t_dimID/), turblen_varID),OP)
> end if
>
> ! tracer data
> if (out_type == 1) then
> do i=1,ntgas_picture
> call handle_err(nfmpi_def_var(NCID, var_tgas_picture(i),
> NF_FLOAT, 4, (/x_dimID,y_dimID,z_dimID,t_dimID/), tgas_varID(i)),OP)
> enddo
> do i=1,ntrac_picture
> call handle_err(nfmpi_def_var(NCID, var_trac_picture(i),
> NF_FLOAT, 4, (/x_dimID,y_dimID,z_dimID,t_dimID/), trac_varID(i)),OP)
> enddo
> do i=1,ntpas_picture
> call handle_err(nfmpi_def_var(NCID, var_tpas_picture(i),
> NF_FLOAT, 4, (/x_dimID,y_dimID,z_dimID,t_dimID/), tpas_varID(i)),OP)
> enddo
> do i=1,ntrac_picture
> var='d_'//trim(var_trac_picture(i))
> call handle_err(nfmpi_def_var(NCID, var,
> NF_FLOAT, 3, (/x_dimID,y_dimID,t_dimID/), d_trac_varID(i)),OP)
> enddo
> else if (out_type == 2) then
> do i=1,ntgas_movie
> call handle_err(nfmpi_def_var(NCID, var_tgas_movie(i),
> NF_FLOAT, 4, (/x_dimID,y_dimID,z_dimID,t_dimID/), tgas_varID(i)),OP)
> enddo
> do i=1,ntrac_movie
> call handle_err(nfmpi_def_var(NCID, var_trac_movie(i),
> NF_FLOAT, 4, (/x_dimID,y_dimID,z_dimID,t_dimID/), trac_varID(i)),OP)
> enddo
> do i=1,ntpas_movie
> call handle_err(nfmpi_def_var(NCID, var_tpas_movie(i),
> NF_FLOAT, 4, (/x_dimID,y_dimID,z_dimID,t_dimID/), tpas_varID(i)),OP)
> enddo
> endif
>
> ! --- assign attributes
> --------------------!
> ! common attributes: long_name, units, valid_range, scale_factor,
> add_offset, _FillValue, history, conventions
> ! dimensions
>
> OP = 'assign attributes - dimensions'
> call handle_err(nfmpi_put_att_text(NCID, x_varID,
> 'long_name', 9_MPI_OFFSET_KIND, trim(coord_x_lname)),OP)
> call handle_err(nfmpi_put_att_text(NCID, x_varID,
> 'units', 13_MPI_OFFSET_KIND, trim(coord_x_units)),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, x_varID,
> 'scale_factor', NF_FLOAT, 1_MPI_OFFSET_KIND, coord_scale),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, x_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, coord_x_offset),OP)
>
> call handle_err(nfmpi_put_att_text(NCID, y_varID,
> 'long_name', 9_MPI_OFFSET_KIND, trim(coord_y_lname)),OP)
> call handle_err(nfmpi_put_att_text(NCID, y_varID,
> 'units', 13_MPI_OFFSET_KIND, trim(coord_y_units)),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, y_varID,
> 'scale_factor', NF_FLOAT, 1_MPI_OFFSET_KIND, coord_scale),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, y_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, coord_y_offset),OP)
>
> call handle_err(nfmpi_put_att_text(NCID, z_varID,
> 'long_name', 6_MPI_OFFSET_KIND, 'height'),OP)
> call handle_err(nfmpi_put_att_text(NCID, z_varID,
> 'units', 1_MPI_OFFSET_KIND, 'm'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, z_varID,
> 'positive', 2_MPI_OFFSET_KIND, 'up'),OP)
>
> call handle_err(nfmpi_put_att_text(NCID, t_varID,
> 'long_name', 4_MPI_OFFSET_KIND, coord_t_name),OP)
> call handle_err(nfmpi_put_att_text(NCID, t_varID,
> 'units', 33_MPI_OFFSET_KIND, trim(coord_t_units)),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, t_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, coord_t_offset),OP)
>
> ! OP = 'exit define mode NOW for testing
> ****************************************************' ! ah_testing
> ********************************
> ! call
> handle_err
> (nfmpi_enddef
> (NCID),OP) !
> ah_testing ********************************
>
> ! dynamics data
> OP = 'assign attributes - data'
> if (out_type == 1 .OR. DynMovie_flag == .true.) then
> ! call handle_err(nfmpi_put_att_text(NCID, u_varID,
> 'long_name', 6_MPI_OFFSET_KIND, 'x_wind'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, u_varID,
> 'units', 7_MPI_OFFSET_KIND, 'm sec-1'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, u_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, u_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, u_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, v_varID,
> 'long_name', 6_MPI_OFFSET_KIND, 'y_wind'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, v_varID,
> 'units', 7_MPI_OFFSET_KIND, 'm sec-1'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, v_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, v_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, v_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, w_varID,
> 'long_name', 19_MPI_OFFSET_KIND,
> 'upward_air_velocity'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, w_varID,
> 'units', 7_MPI_OFFSET_KIND, 'm sec-1'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, w_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, w_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, w_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, pnew_varID,
> 'long_name', 20_MPI_OFFSET_KIND,
> 'air_pressure_anomaly'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, pnew_varID,
> 'units', 2_MPI_OFFSET_KIND, 'Pa'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, pnew_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, pnew_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, pnew_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, tetnew_varID,
> 'long_name', 25_MPI_OFFSET_KIND,
> 'air_potential_temperature'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, tetnew_varID,
> 'units', 1_MPI_OFFSET_KIND, 'K'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, tetnew_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, tetnew_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, tetnew_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, tempnew_varID,
> 'long_name', 15_MPI_OFFSET_KIND, 'air_temperature'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, tempnew_varID,
> 'units', 7_MPI_OFFSET_KIND, 'Celsius'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, tempnew_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, tempnew_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, -273.15),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, tempnew_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, density_varID,
> 'long_name', 11_MPI_OFFSET_KIND, 'air_density'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, density_varID,
> 'units', 6_MPI_OFFSET_KIND, 'kg m-3'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, density_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, density_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, density_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, turbhor_varID,
> 'long_name', 15_MPI_OFFSET_KIND, 'hor_turb_energy'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, turbhor_varID,
> 'units', 8_MPI_OFFSET_KIND, 'm2 sec-2'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turbhor_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turbhor_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turbhor_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, turbver_varID,
> 'long_name', 15_MPI_OFFSET_KIND, 'ver_turb_energy'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, turbver_varID,
> 'units', 8_MPI_OFFSET_KIND, 'm2 sec-2'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turbver_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turbver_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turbver_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
>
> ! call handle_err(nfmpi_put_att_text(NCID, turblen_varID,
> 'long_name', 17_MPI_OFFSET_KIND, 'turb_length_scale'),OP)
> ! call handle_err(nfmpi_put_att_text(NCID, turblen_varID,
> 'units', 1_MPI_OFFSET_KIND, 'm'),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turblen_varID,
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1.),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turblen_varID,
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> ! call handle_err(nfmpi_put_att_real(NCID, turblen_varID,
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> end if
>
> ! tracer data
> if (out_type == 1) then
> print *, 'NetCDF output type (1-picture,2-movie) ',out_type !
> ##### DO NOT REMOVE!!! optimization problem, trace source
> do i=1,ntgas_picture
> call handle_err(nfmpi_put_att_text(NCID, tgas_varID(i),
> 'long_name', 25_MPI_OFFSET_KIND, des_tgas_picture(i)),OP)
> call handle_err(nfmpi_put_att_text(NCID, tgas_varID(i),
> 'units', 9_MPI_OFFSET_KIND, 'gram kg-1'),OP)
> call handle_err(nfmpi_put_att_real(NCID, tgas_varID(i),
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1000.),OP)
> call handle_err(nfmpi_put_att_real(NCID, tgas_varID(i),
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, tgas_varID(i),
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> enddo
> do i=1,ntrac_picture
> call handle_err(nfmpi_put_att_text(NCID, trac_varID(i),
> 'long_name', 25_MPI_OFFSET_KIND, des_trac_picture(i)),OP)
> call handle_err(nfmpi_put_att_text(NCID, trac_varID(i),
> 'units', 9_MPI_OFFSET_KIND, 'gram kg-1'),OP)
> call handle_err(nfmpi_put_att_real(NCID, trac_varID(i),
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1000.),OP)
> call handle_err(nfmpi_put_att_real(NCID, trac_varID(i),
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, trac_varID(i),
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> enddo
> do i=1,ntpas_picture
> call handle_err(nfmpi_put_att_text(NCID, tpas_varID(i),
> 'long_name', 25_MPI_OFFSET_KIND, des_tpas_picture(i)),OP)
> call handle_err(nfmpi_put_att_text(NCID, tpas_varID(i),
> 'units', 1_MPI_OFFSET_KIND, '%'),OP)
> call handle_err(nfmpi_put_att_real(NCID, tpas_varID(i),
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 100.),OP)
> call handle_err(nfmpi_put_att_real(NCID, tpas_varID(i),
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, tpas_varID(i),
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> enddo
> do i=1,ntrac_picture
> des='deposited_'//trim(des_trac_picture(i))
> call handle_err(nfmpi_put_att_text(NCID, d_trac_varID(i),
> 'long_name', 35_MPI_OFFSET_KIND, des),OP)
> call handle_err(nfmpi_put_att_text(NCID, d_trac_varID(i),
> 'units', 9_MPI_OFFSET_KIND, 'gram m-2'),OP)
> call handle_err(nfmpi_put_att_real(NCID, d_trac_varID(i),
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1000.),OP)
> call handle_err(nfmpi_put_att_real(NCID, d_trac_varID(i),
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, d_trac_varID(i),
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> enddo
> else if (out_type == 2) then
> print *, 'NetCDF output type (1-picture,2-movie) ',out_type !
> ##### DO NOT REMOVE!!! optimization problem, trace source
> do i=1,ntgas_movie
> call handle_err(nfmpi_put_att_text(NCID, tgas_varID(i),
> 'long_name', 25_MPI_OFFSET_KIND, des_tgas_movie(i)),OP)
> call handle_err(nfmpi_put_att_text(NCID, tgas_varID(i),
> 'units', 9_MPI_OFFSET_KIND, 'gram kg-1'),OP)
> call handle_err(nfmpi_put_att_real(NCID, tgas_varID(i),
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1000.),OP)
> call handle_err(nfmpi_put_att_real(NCID, tgas_varID(i),
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, tgas_varID(i),
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> enddo
> do i=1,ntrac_movie
> call handle_err(nfmpi_put_att_text(NCID, trac_varID(i),
> 'long_name', 25_MPI_OFFSET_KIND, des_trac_movie(i)),OP)
> call handle_err(nfmpi_put_att_text(NCID, trac_varID(i),
> 'units', 9_MPI_OFFSET_KIND, 'gram kg-1'),OP)
> call handle_err(nfmpi_put_att_real(NCID, trac_varID(i),
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 1000.),OP)
> call handle_err(nfmpi_put_att_real(NCID, trac_varID(i),
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, trac_varID(i),
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> enddo
> do i=1,ntpas_movie
> call handle_err(nfmpi_put_att_text(NCID, tpas_varID(i),
> 'long_name', 25_MPI_OFFSET_KIND, des_tpas_movie(i)),OP)
> call handle_err(nfmpi_put_att_text(NCID, tpas_varID(i),
> 'units', 1_MPI_OFFSET_KIND, '%'),OP)
> call handle_err(nfmpi_put_att_real(NCID, tpas_varID(i),
> 'scale_factor',NF_FLOAT, 1_MPI_OFFSET_KIND, 100.),OP)
> call handle_err(nfmpi_put_att_real(NCID, tpas_varID(i),
> 'add_offset', NF_FLOAT, 1_MPI_OFFSET_KIND, 0.0),OP)
> call handle_err(nfmpi_put_att_real(NCID, tpas_varID(i),
> '_FillValue', NF_FLOAT, 1_MPI_OFFSET_KIND, undef),OP)
> enddo
> end if
>
> ! === create netCDF dataset: exit define mode, enter data mode
> ----!
> OP = 'exit define mode'
> call handle_err(nfmpi_enddef(NCID),OP)
>
> ! --- write data values
> --------------------!
> ! dimensions (only one process writes the whole dimension, i.e.
> accross all processes)
> OP = 'write data values - dimensions'
>
> call handle_err(nfmpi_begin_indep_data(NCID))
>
> if (myrank==0) then
> call handle_err(nfmpi_put_vara_real(NCID, x_varID, (/
> 1_MPI_OFFSET_KIND/), (/ntx_mpi/),real(xg(2:ntx-1),real4)),OP)
> if (nty>4) then
> call handle_err(nfmpi_put_vara_real(NCID, y_varID, (/
> 1_MPI_OFFSET_KIND/), (/nty_mpi/), real(yg(2:nty-1),real4)),OP)
> else
> call handle_err(nfmpi_put_vara_real(NCID, y_varID, (/
> 1_MPI_OFFSET_KIND/), (/1_MPI_OFFSET_KIND/), real(yg(nty-1),real4)),OP)
> end if
> call handle_err(nfmpi_put_vara_real(NCID, z_varID, (/
> 1_MPI_OFFSET_KIND/), (/nz_mpi/), real(z,real4)),OP)
> end if
>
> call handle_err(nfmpi_end_indep_data(NCID))
>
> contains
> !
> ----------------------------------------------------------------
> subroutine
> gridconvert(cd_scale,cd_x_offset,cd_x_name,cd_x_lname,cd_x_units, &
>
> cd_y_offset,cd_y_name,cd_y_lname,cd_y_units, &
>
> cd_z_name,cd_t_offset,cd_t_name,cd_t_units)
> ! IF: cd_* = coordinate parameters
>
> !--------------------------------------------------------------!
> ! linear conversion from cartesian grid into lon/lat
> system !
> ! only valid as first approxiamtion over small
> domains !
> ! to be replaced once a dyn core in a lat/lon system
> available !
> !--------------------------------------------------------------!
>
> use atham_module, only : deglat_start, deglon_start
>
> use phys_constants, only : pi
>
> real(real4), intent(inout) :: cd_scale, cd_x_offset,
> cd_y_offset, cd_t_offset
> character(len=3), intent(inout) :: cd_x_name, cd_y_name,
> cd_z_name
> character(len=4), intent(inout) :: cd_t_name
> character(len=9), intent(inout) :: cd_x_lname, cd_y_lname
> character(len=13), intent(inout) :: cd_x_units, cd_y_units
> character(len=33), intent(inout) :: cd_t_units
>
> !--------------------------------------------------------------!
> ! local
> variables !
> !--------------------------------------------------------------!
>
> real(kreal) :: r
> real(kreal), parameter :: a = 6378137._kreal !
> (WGS 84)
> real(kreal), parameter :: b = 6356752.3142_kreal !
> (WGS 84)
>
> ! ellipsoid radius at ATHAM domain start
> r = a*b / sqrt((b*b*(cos(deglat_start*pi/180._kreal))**2 )+
> (a*a*(sin(deglat_start*pi/180._kreal))**2 ))
>
> cd_scale = real((1/r) * (180._kreal/pi),real4)
>
> cd_x_offset = deglon_start
> cd_x_name = 'lon'
> cd_x_lname = 'longitude'
> cd_x_units = 'degrees_east '
>
> cd_y_offset = deglat_start
> cd_y_name = 'lat'
> cd_y_lname = 'latitude '
> cd_y_units = 'degrees_north'
>
> cd_z_name = 'lev'
>
> coord_t_offset = real((sim_t_hh*3600 + sim_t_mm*60
> +sim_t_ss),real4)
> coord_t_name = 'date'
> coord_t_units = 'seconds since '//simdate//' 00:00:00 [local]'
> ! COARDS conventions require time zone from UTC to be specified
> ! not necessary for local area version of ATHAM
>
> end subroutine gridconvert
> !
> ----------------------------------------------------------------
>
> end subroutine netcdf_define
> !
> =====================================================================
>
> !
> ======================================================================
> subroutine handle_err(status,op)
>
> use atham_module, only : myrank
>
> integer, intent (in ) :: status
> character(len=*), optional, intent (in ) :: op
>
> if ( status /= nf_noerr ) then
> if (myrank==0) then
> print *, ""
> print *, "P-NetCDF operation: ",trim(op)
> print *, trim(nfmpi_strerror(status))
> print *, "atham_pnetcdf error: program execution stopped"
> print *, ""
>
> stop
> end if
> end if
>
> return
>
> end subroutine handle_err
> !
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
>
> end module atham_pnetcdf
More information about the parallel-netcdf
mailing list