/******************************************************************************* * Function "read_waccm2" reads WACCM C2 model climatology data * from a NetCDF file generated by Dan Marsh at UCAR for the SOFIE. * (B.T. Marshall, February, 2014) *******************************************************************************/ #include "netcdf.h" #include #include // Global variable definitions. The comments contain the dimension names. /* int date[1]; // time double latitude[96]; // lat double p[66]; // lev float h2o[1][66][96]; // time, lev, lat float co2[1][66][96]; // time, lev, lat float o3[1][66][96]; // time, lev, lat float n2o[1][66][96]; // time, lev, lat float ch4[1][66][96]; // time, lev, lat float o[1][66][96]; // time, lev, lat float o2[1][66][96]; // time, lev, lat float no[1][66][96]; // time, lev, lat float no2[1][66][96]; // time, lev, lat float oh[1][66][96]; // time, lev, lat float n2[1][66][96]; // time, lev, lat float ho2[1][66][96]; // time, lev, lat float cfcl3[1][66][96]; // time, lev, lat float cf2cl2[1][66][96]; // time, lev, lat float h[1][66][96]; // time, lev, lat float o1d[1][66][96]; // time, lev, lat float tk[1][66][96]; // time, lev, lat float z3[1][66][96]; // time, lev, lat */ void read_waccmc2_interp ( char *INFile, int *DATE1, int *DATE2, int *date_out, float *z_out, float z3_out[][96][66], float tk_out[][96][66], float h2o_out[][96][66], float co2_out[][96][66], float o3_out[][96][66], float n2o_out[][96][66], float ch4_out[][96][66], float o_out[][96][66], float o2_out[][96][66], float no_out[][96][66], float no2_out[][96][66], float oh_out[][96][66], float n2_out[][96][66], float ho2_out[][96][66], float cfcl3_out[][96][66], float cf2cl2_out[][96][66], float h_out[][96][66], float o1d_out[][96][66], float *latitude_out, float *p_out, float *wght) { int date[1]; // time double latitude[96]; // lat double p[66]; // lev float h2o[1][66][96]; // time, lev, lat float co2[1][66][96]; // time, lev, lat float o3[1][66][96]; // time, lev, lat float n2o[1][66][96]; // time, lev, lat float ch4[1][66][96]; // time, lev, lat float o[1][66][96]; // time, lev, lat float o2[1][66][96]; // time, lev, lat float no[1][66][96]; // time, lev, lat float no2[1][66][96]; // time, lev, lat float oh[1][66][96]; // time, lev, lat float n2[1][66][96]; // time, lev, lat float ho2[1][66][96]; // time, lev, lat float cfcl3[1][66][96]; // time, lev, lat float cf2cl2[1][66][96]; // time, lev, lat float h[1][66][96]; // time, lev, lat float o1d[1][66][96]; // time, lev, lat float tk[1][66][96]; // time, lev, lat float z3[1][66][96]; // time, lev, lat int i,j,k,istart; int fd; int NDATES = 264; long start[MAX_NC_VARS]; long end[MAX_NC_VARS]; // Find the correct WACCM file // Open the WACCM model NetCDF climatology file. fd = ncopen(INFile, NC_NOWRITE); printf("Construct climatology database from %s\n", INFile); // Read in the variables individually. printf ("wght: %f,\n",*wght); printf ("DATE: %i,\n",*DATE1); for( i = 0; i < NDATES; i++ ) { // Read: date. istart=i; start[0] = istart; end[0] = 1; ncvarget(fd, 2, start, end, date); // printf ("DATE: %i, %i,\n", i, date[0]); if (*DATE1 == date[0]) goto READDATA1; } READDATA1: printf ("DATE: %i,\n", date[0]); // Read: date. start[0] = istart; end[0] = 1; ncvarget(fd, 2, start, end, date); // Read: latitudes. start[0] = 0; end[0] = 96; ncvarget(fd, 3, start, end, latitude); // Read: pressure levels. start[0] = 0; end[0] = 66; ncvarget(fd, 0, start, end, p); // Read: CFCl3. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 5, start, end, cfcl3); // Read: CF2Cl2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 6, start, end, cf2cl2); // Read: CH4. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 7, start, end, ch4); // Read: CO2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 10, start, end, co2); // Read: H. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 11, start, end, h); // Read: H2O. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 12, start, end, h2o); // Read: HO2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 15, start, end, ho2); // Read: N2O. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 16, start, end, n2o); // Read: NO. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 18, start, end, no); // Read: NO2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 19, start, end, no2); // Read: O. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 20, start, end, o); // Read: O1D. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 21, start, end, o1d); // Read: O2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 22, start, end, o2); // Read: O3. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 23, start, end, o3); // Read: OH. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 24, start, end, oh); // Read: Tk. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 25, start, end, tk); // Read: Geopotential Height - Z3. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 26, start, end, z3); for( i = 0; i < 1; i++ ) { date_out[i] = date[i]; for( j = 0; j < 96; j++ ) { latitude_out[j] = (float)latitude[j]; for( k = 0; k < 66; k++ ) { cfcl3_out[i][j][k] = *wght * cfcl3[i][k][j]; cf2cl2_out[i][j][k] = *wght * cf2cl2[i][k][j]; ch4_out[i][j][k] = *wght * ch4[i][k][j]; co2_out[i][j][k] = *wght * co2[i][k][j]; h_out[i][j][k] = *wght * h[i][k][j]; h2o_out[i][j][k] = *wght * h2o[i][k][j]; ho2_out[i][j][k] = *wght * ho2[i][k][j]; n2o_out[i][j][k] = *wght * n2o[i][k][j]; no_out[i][j][k] = *wght * no[i][k][j]; no2_out[i][j][k] = *wght * no2[i][k][j]; o_out[i][j][k] = *wght * o[i][k][j]; o2_out[i][j][k] = *wght * o2[i][k][j]; o3_out[i][j][k] = *wght * o3[i][k][j]; oh_out[i][j][k] = *wght * oh[i][k][j]; o1d_out[i][j][k] = *wght * o1d[i][k][j]; tk_out[i][j][k] = *wght * tk[i][k][j]; z3_out[i][j][k] = *wght * z3[i][k][j]; } } } for( k = 0; k < 66; k++ ) { p_out[k] = *wght * (float)p[k]; } printf ("DATE: %i,\n",*DATE2); for( i = 0; i < NDATES; i++ ) { // Read: date. istart=i; start[0] = i; end[0] = 1; ncvarget(fd, 2, start, end, date); // printf ("DATE: %i, %i,\n", i, date[0]); if (*DATE2 == date[0]) goto READDATA2; } READDATA2: printf ("DATE: %i,\n", date[0]); // Read: latitudes. start[0] = 0; end[0] = 96; ncvarget(fd, 3, start, end, latitude); // Read: pressure levels. start[0] = 0; end[0] = 66; ncvarget(fd, 0, start, end, p); // Read: CFCl3. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 5, start, end, cfcl3); // Read: CF2Cl2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 6, start, end, cf2cl2); // Read: CH4. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 7, start, end, ch4); // Read: CO2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 10, start, end, co2); // Read: H. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 11, start, end, h); // Read: H2O. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 12, start, end, h2o); // Read: HO2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 15, start, end, ho2); // Read: N2O. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 16, start, end, n2o); // Read: NO. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 18, start, end, no); // Read: NO2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 19, start, end, no2); // Read: O. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 20, start, end, o); // Read: O1D. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 21, start, end, o1d); // Read: O2. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 22, start, end, o2); // Read: O3. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 23, start, end, o3); // Read: OH. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 24, start, end, oh); // Read: Tk. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 25, start, end, tk); // Read: Geopotential Height - Z3. start[0] = istart; start[1] = 0; start[2] = 0; end[0] = 1; end[1] = 66; end[2] = 96; ncvarget(fd, 26, start, end, z3); for( i = 0; i < 1; i++ ) { for( j = 0; j < 96; j++ ) { for( k = 0; k < 66; k++ ) { cfcl3_out[i][j][k] = cfcl3_out[i][j][k] + (1.0-*wght) * cfcl3[i][k][j]; cf2cl2_out[i][j][k] = cf2cl2_out[i][j][k] + (1.0-*wght) * cf2cl2[i][k][j]; ch4_out[i][j][k] = ch4_out[i][j][k] + (1.0-*wght) * ch4[i][k][j]; co2_out[i][j][k] = co2_out[i][j][k] + (1.0-*wght) * co2[i][k][j]; h_out[i][j][k] = h_out[i][j][k] + (1.0-*wght) * h[i][k][j]; h2o_out[i][j][k] = h2o_out[i][j][k] + (1.0-*wght) * h2o[i][k][j]; ho2_out[i][j][k] = ho2_out[i][j][k] + (1.0-*wght) * ho2[i][k][j]; n2o_out[i][j][k] = n2o_out[i][j][k] + (1.0-*wght) * n2o[i][k][j]; no_out[i][j][k] = no_out[i][j][k] + (1.0-*wght) * no[i][k][j]; no2_out[i][j][k] = no2_out[i][j][k] + (1.0-*wght) * no2[i][k][j]; o_out[i][j][k] = o_out[i][j][k] + (1.0-*wght) * o[i][k][j]; o2_out[i][j][k] = o2_out[i][j][k] + (1.0-*wght) * o2[i][k][j]; o3_out[i][j][k] = o3_out[i][j][k] + (1.0-*wght) * o3[i][k][j]; oh_out[i][j][k] = oh_out[i][j][k] + (1.0-*wght) * oh[i][k][j]; o1d_out[i][j][k] = o1d_out[i][j][k] + (1.0-*wght) * o1d[i][k][j]; tk_out[i][j][k] = tk_out[i][j][k] + (1.0-*wght) * tk[i][k][j]; z3_out[i][j][k] = z3_out[i][j][k] + (1.0-*wght) * z3[i][k][j]; n2_out[i][j][k] = 0.9906-(o2_out[i][j][k]+o_out[i][j][k]+co2_out[i][j][k]); } } } for( k = 0; k < 66; k++ ) { p_out[k] = p_out[k] + (1.0-*wght) * (float)p[k]; z_out[k] = log(1000.0/p_out[k])*7.0; } // Close the netCDF file. ncclose(fd); }