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