1/** \file dparallel.c
2This file has the parallel I/O functions which correspond to the serial I/O functions.
3
4Copyright 2010 University Corporation for Atmospheric
5Research/Unidata. See COPYRIGHT file for more info.
6*/
7
8#include "config.h"
9#include "ncdispatch.h"
10
11/**
12
13 This function creates a file for use with parallel I/O.
14
15*/
16int nc_create_par(const char *path, int cmodeMPI_Comm comm,
17       MPI_Info info, int *ncidp)
18{
19#ifndef USE_PARALLEL
20   return NC_ENOPAR;
21#else
22   NC_MPI_INFO data;
23
24   /* One of these two parallel IO modes must be chosen by the user,
25    * or else pnetcdf must be in use. */
26   if (!(cmode & NC_MPIIO || cmode & NC_MPIPOSIX) &&
27       !(cmode & NC_PNETCDF))
28      return NC_EINVAL;
29
30   data.comm = comm;
31   data.info = info;
32   return NC_create(pathcmode, 0, 0, NULL, 1, &datancidp);
33#endif /* USE_PARALLEL */
34}
35
36/*! \ingroup datasets
37
38  This function opens a file for parallel I/O.
39
40*/
41int
42nc_open_par(const char *path, int modeMPI_Comm comm,
43     MPI_Info info, int *ncidp)
44{
45#ifndef USE_PARALLEL
46   return NC_ENOPAR;
47#else
48   NC_MPI_INFO mpi_data;
49
50   /* One of these two parallel IO modes must be chosen by the user,
51    * or else pnetcdf must be in use. */
52   if ((mode & NC_MPIIO) || (mode & NC_MPIPOSIX)) {
53 /* ok */
54   } else if(mode & NC_PNETCDF) {
55 /* ok */
56   } else
57      return NC_EINVAL;
58
59   mpi_data.comm = comm;
60   mpi_data.info = info;
61
62   return NC_open(pathmode, 0, NULL, 1, &mpi_datancidp);
63#endif /* USE_PARALLEL */
64}
65
66/*! \ingroup datasets
67
68 Fortran needs to pass MPI comm/info as integers.
69
70*/
71int
72nc_open_par_fortran(const char *path, int mode, int comm,
73     int info, int *ncidp)
74{
75#ifndef USE_PARALLEL
76   return NC_ENOPAR;
77#else
78   MPI_Comm comm_c;
79   MPI_Info info_c;
80
81   /* Convert fortran comm and info to C comm and info, if there is a
82    * function to do so. Otherwise just pass them. */
83#ifdef HAVE_MPI_COMM_F2C
84   comm_c = MPI_Comm_f2c(comm);
85   info_c = MPI_Info_f2c(info);
86#else
87   comm_c = (MPI_Comm)comm;
88   info_c = (MPI_Info)info;
89#endif
90
91   return nc_open_par(pathmodecomm_cinfo_cncidp);
92#endif
93}
94
95/* This function will change the parallel access of a variable from
96 * independent to collective. */
97int
98nc_var_par_access(int ncid, int varid, int par_access)
99{
100    NCncp;
101
102    int stat = NC_NOERR;
103
104    if ((stat = NC_check_id(ncid, &ncp)))
105       return stat;
106
107#ifndef USE_PARALLEL
108    return NC_ENOPAR;
109#else
110    return ncp->dispatch->var_par_access(ncid,varid,par_access);
111#endif
112}
113
114/* when calling from fortran: convert MPI_Comm and MPI_Info to C */
115int
116nc_create_par_fortran(const char *path, int cmode, int comm,
117       int info, int *ncidp)
118{
119#ifndef USE_PARALLEL
120   return NC_ENOPAR;
121#else
122   MPI_Comm comm_c;
123   MPI_Info info_c;
124
125   /* Convert fortran comm and info to C comm and info, if there is a
126    * function to do so. Otherwise just pass them. */
127#ifdef HAVE_MPI_COMM_F2C
128   comm_c = MPI_Comm_f2c(comm);
129   info_c = MPI_Info_f2c(info);
130#else
131   comm_c = (MPI_Comm)comm;
132   info_c = (MPI_Info)info;
133#endif
134
135   return nc_create_par(pathcmodecomm_cinfo_cncidp);
136#endif
137}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed