Actual source code: vnetcdf.c

      1: #define PETSC_DLL
      2: /*
      3:      Code for the parallel NetCDF viewer.
      4: */
     5:  #include src/sys/src/viewer/viewerimpl.h
     6:  #include petscsys.h
      8: #include "pnetcdf.h"
     10: typedef struct  {
     11:   int                 ncid;            /* NetCDF dataset id */
     12:   char                *filename;        /* NetCDF dataset name */
     13:   PetscViewerFileType nctype;          /* read or write? */
     14: } PetscViewer_Netcdf;

     19: PetscErrorCode PetscViewerDestroy_Netcdf(PetscViewer v)
     20: {
     21:   PetscViewer_Netcdf *vnetcdf = (PetscViewer_Netcdf*)v->data;
     22:   PetscErrorCode     ierr;
     23:   int                rank;

     26:   if (vnetcdf->ncid) {
     27:     ncmpi_close(vnetcdf->ncid);
     28:   }
     29:   PetscStrfree(vnetcdf->filename);
     30:   PetscFree(vnetcdf);
     31:   return(0);
     32: }

     37: PetscErrorCode PETSC_DLLEXPORT PetscViewerCreate_Netcdf(PetscViewer v)
     38: {
     39:   PetscErrorCode     ierr;
     40:   PetscViewer_Netcdf *vnetcdf;

     43:   PetscNew(PetscViewer_Netcdf,&vnetcdf);
     44:   v->data            = (void*)vnetcdf;
     45:   v->ops->destroy    = PetscViewerDestroy_Netcdf;
     46:   v->ops->flush      = 0;
     47:   v->iformat         = 0;
     48:   vnetcdf->ncid      = -1;
     49:   vnetcdf->nctype    = (PetscViewerFileType) -1;
     50:   vnetcdf->filename  = 0;

     52:   PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerSetFilename_C",
     53:                                     "PetscViewerSetFilename_Netcdf",
     54:                                      PetscViewerSetFilename_Netcdf);
     55:   PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerSetFileType_C",
     56:                                     "PetscViewerSetFileType_Netcdf",
     57:                                      PetscViewerSetFileType_Netcdf);
     58:   return(0);
     59: }

     65: PetscErrorCode PETSC_DLLEXPORT PetscViewerNetcdfGetID(PetscViewer viewer,int *ncid)
     66: {
     67:   PetscViewer_Netcdf *vnetcdf = (PetscViewer_Netcdf*)viewer->data;

     70:   *ncid = vnetcdf->ncid;
     71:   return(0);
     72: }

     77: PetscErrorCode PETSC_DLLEXPORT PetscViewerSetFileType_Netcdf(PetscViewer viewer,PetscViewerFileType type)
     78: {
     79:   PetscViewer_Netcdf *vnetcdf = (PetscViewer_Netcdf*)viewer->data;

     82:   vnetcdf->nctype = type;
     83:   return(0);
     84: }

     90: PetscErrorCode PETSC_DLLEXPORT PetscViewerNetcdfOpen(MPI_Comm comm,const char name[],PetscViewerFileType type,PetscViewer* viewer)
     91: {

     95:   PetscViewerCreate(comm,viewer);
     96:   PetscViewerSetType(*viewer,PETSC_VIEWER_NETCDF);
     97:   PetscViewerSetFileType(*viewer,type);
     98:   PetscViewerSetFilename(*viewer,name);
     99:   return(0);
    100: }

    105: PetscErrorCode PETSC_DLLEXPORT PetscViewerSetFilename_Netcdf(PetscViewer viewer,const char name[])
    106: {
    107:   int                 rank;
    108:   PetscErrorCode      ierr;
    109:   PetscViewer_Netcdf  *vnetcdf = (PetscViewer_Netcdf*)viewer->data;
    110:   PetscViewerFileType type = vnetcdf->nctype;
    111:   MPI_Comm            comm = viewer->comm;
    112:   PetscTruth          flg;
    113:   char                fname[PETSC_MAX_PATH_LEN],*gz;
    114:
    116:   PetscOptionsGetString(PETSC_NULL,"-netcdf_viewer_name",fname,PETSC_MAX_PATH_LEN,&flg);
    117:   if (flg) {
    118:     PetscStrallocpy(fname,&vnetcdf->filename);
    119:   } else {
    120:     PetscStrallocpy(name,&vnetcdf->filename);
    121:   }
    122:   if (type == (PetscViewerFileType) -1) {
    123:     SETERRQ(PETSC_ERR_ORDER,"Must call PetscViewerSetFileType() before PetscViewerSetFilename()");
    124:   } else if (type == PETSC_FILE_RDONLY) {
    125:     ncmpi_open(comm,vnetcdf->filename,0,MPI_INFO_NULL,&vnetcdf->ncid);
    126:   } else if (type == PETSC_FILE_RDWR) {
    127:     ncmpi_open(comm,vnetcdf->filename,NC_WRITE,MPI_INFO_NULL,&vnetcdf->ncid);
    128:   } else if (type == PETSC_FILE_CREATE) {
    129:     ncmpi_create(comm,vnetcdf->filename,NC_CLOBBER,MPI_INFO_NULL,&vnetcdf->ncid);
    130:   }
    131:   return(0);
    132: }