2222#include <stdio.h>
2323#include <stdlib.h>
2424#include <string.h>
25+ #include <unistd.h> /* getopt() */
2526#include <libgen.h> /* basename() */
26- #include <pnetcdf.h>
27+
2728#include <mpi.h>
29+ #include <pnetcdf.h>
2830#include <testutils.h>
2931
3032#include "pres_temp_4D.h"
3133
34+ static void
35+ usage (char * argv0 )
36+ {
37+ char * help =
38+ "Usage: %s [OPTIONS]...[filename]\n"
39+ " [-h] Print help\n"
40+ " [-a] use independent I/O\n"
41+ " [filename]: input netCDF file name (default: %s)\n" ;
42+ fprintf (stderr , help , argv0 , FILE_NAME );
43+ }
44+
3245int main (int argc , char * * argv )
3346{
34- int rank , nprocs , ncid , pres_varid , temp_varid ;
47+ extern int optind ;
48+ extern char * optarg ;
49+ char filename [256 ];
50+ int rank , nprocs , ncid , pres_varid , temp_varid , indep_io ;
3551 int lat_varid , lon_varid ;
3652
3753 /* The start and count arrays will tell the netCDF library where to
@@ -52,20 +68,22 @@ int main(int argc, char **argv)
5268 /* Error handling. */
5369 int err , nerrs = 0 ;
5470
55- char * filename = FILE_NAME ;
56-
5771 MPI_Init (& argc , & argv );
5872 MPI_Comm_size (MPI_COMM_WORLD , & nprocs );
5973 MPI_Comm_rank (MPI_COMM_WORLD , & rank );
6074
61- if (argc > 3 ) {
62- if (!rank )
63- printf ("Usage: %s [filename]\n" , argv [0 ]);
64- MPI_Finalize ();
65- return 1 ;
66- }
67-
68- if (argc > 1 ) filename = argv [1 ];
75+ indep_io = 0 ;
76+ while ((i = getopt (argc , argv , "ha" )) != EOF )
77+ switch (i ) {
78+ case 'a' : indep_io = 1 ;
79+ break ;
80+ case 'h' :
81+ default : if (rank == 0 ) usage (argv [0 ]);
82+ MPI_Finalize ();
83+ return 1 ;
84+ }
85+ if (argv [optind ] == NULL ) strcpy (filename , FILE_NAME );
86+ else snprintf (filename , 256 , "%s" , argv [optind ]);
6987
7088 /* Open the file. */
7189 err = ncmpi_open (MPI_COMM_WORLD , filename , NC_NOWRITE , MPI_INFO_NULL , & ncid );
@@ -75,6 +93,11 @@ int main(int argc, char **argv)
7593 goto err_out ;
7694 }
7795
96+ if (indep_io ) {
97+ err = ncmpi_begin_indep_data (ncid );
98+ CHECK_ERR
99+ }
100+
78101 if (rank == 0 ) {
79102 char * cmd_str = (char * )malloc (strlen (argv [0 ]) + 256 );
80103 int format ;
@@ -96,9 +119,15 @@ int main(int argc, char **argv)
96119 /* Read the coordinate variable data. */
97120 memset (lats , 0 , sizeof (float ) * NLAT );
98121 memset (lons , 0 , sizeof (float ) * NLON );
99- err = ncmpi_get_var_float_all (ncid , lat_varid , & lats [0 ]);
122+ if (indep_io )
123+ err = ncmpi_get_var_float (ncid , lat_varid , & lats [0 ]);
124+ else
125+ err = ncmpi_get_var_float_all (ncid , lat_varid , & lats [0 ]);
100126 CHECK_ERR
101- err = ncmpi_get_var_float_all (ncid , lon_varid , & lons [0 ]);
127+ if (indep_io )
128+ err = ncmpi_get_var_float (ncid , lat_varid , & lats [0 ]);
129+ else
130+ err = ncmpi_get_var_float_all (ncid , lon_varid , & lons [0 ]);
102131 CHECK_ERR
103132
104133 /* Check the coordinate variable data. */
@@ -164,9 +193,15 @@ int main(int argc, char **argv)
164193 /* Read and check one record at a time. */
165194 for (rec = 0 ; rec < NREC ; rec ++ ) {
166195 start [0 ] = rec ;
167- err = ncmpi_get_vara_float_all (ncid , pres_varid , start , count , & pres_in [0 ][0 ]);
196+ if (indep_io )
197+ err = ncmpi_get_vara_float (ncid , pres_varid , start , count , & pres_in [0 ][0 ]);
198+ else
199+ err = ncmpi_get_vara_float_all (ncid , pres_varid , start , count , & pres_in [0 ][0 ]);
168200 CHECK_ERR
169- err = ncmpi_get_vara_float_all (ncid , temp_varid , start , count , & temp_in [0 ][0 ]);
201+ if (indep_io )
202+ err = ncmpi_get_vara_float (ncid , temp_varid , start , count , & temp_in [0 ][0 ]);
203+ else
204+ err = ncmpi_get_vara_float_all (ncid , temp_varid , start , count , & temp_in [0 ][0 ]);
170205 CHECK_ERR
171206
172207 /* Check the data. */
0 commit comments