Write a 3D array in Fortran using PnetCDF
MBR MBR
mbr.joos at gmail.com
Fri Jan 25 10:07:03 CST 2013
Dear all,
I'm trying to use PnetCDF to store the variables (which are 3D arrays) of
my algorithm. Good news is that it seems much simpler than PHDF5 (which I
already implemented); bad news is that I have a MPI error at runtime I
cannot understand.
Please find both the error I get and the piece of code I wrote below. It
seems to me that it should be quite simple, but I cannot figure out what is
the problem.
Any help would be greatly appreciated!
Best,
MBR
The error I get is the following:
[mypc:18412] *** An error occurred in MPI_Type_create_subarray
[mypc:18412] *** on communicator MPI_COMM_WORLD
[mypc:18412] *** MPI_ERR_ARG: invalid argument of some other kind
[mpyc:18412] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
Here is a simplified version of the subroutine I wrote, which compiles
without problems:
subroutine output(data,x,y,z,nout,myrank)
use pnetcdf
use mpi_var ! contains useful variables (idim, ni, etc. see below)
implicit none
include 'mpif.h'
! idim,jdim,kdim are the number of elements in each dimension
real(dp),dimension(idim,jdim,kdim) :: data
real(dp), dimension(idim) :: x
real(dp), dimension(jdim) :: y
real(dp), dimension(kdim) :: z
integer :: nout, myrank
character(LEN=*) :: filename
! PnetCDF variables
integer(kind=MPI_OFFSET_KIND) :: nxtot, nytot, nztot
integer :: nout, ncid, xdimid, ydimid, zdimid
integer, dimension(3) :: sdimid
integer :: varid
integer(kind=MPI_OFFSET_KIND), dimension(3) :: dims, start, count
! Dimensions; ni,nj,nk are the number of MPI threads per direction
nxtot = nx*ni
nytot = ny*nj
nztot = nz*nk
dims = (/ nx, ny, nz /)
! Get filename; nout is the number of the current output
call get_filename(nout, filename)
! Create filename
nout = nfmpi_create(MPI_COMM_WORLD, filename, NF_CLOBBER, MPI_INFO_NULL,
ncid)
! Define dimensions
nout = nfmpi_def_dim(ncid, "x", nxtot, xdimid)
nout = nfmpi_def_dim(ncid, "y", nytot, ydimid)
nout = nfmpi_def_dim(ncid, "z", nztot, zdimid)
sdimid = (/ xdimid, ydimid, zdimid /)
! Create variable
nout = nfmpi_def_var(ncid, "var", NF_DOUBLE, 3, sdimid, varid)
! End of definitions
nout = nfmpi_enddef(ncid)
! {x,y,z}pos corresponds to the position of the MPI thread in a 3D
cartesian grid
start = (/ xpos, ypos, zpos /)*dims
count = dims
! Write data
nout = nfmpi_put_vara_double_all(ncid, varid, start, count, data)
! Close file
nout = nfmpi_close(ncid)
end subroutine output
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/parallel-netcdf/attachments/20130125/f3769bec/attachment.html>
More information about the parallel-netcdf
mailing list