Skip to content

Commit

Permalink
1: Fix the model.d2t bug in configuration file input. 2: Modify the n…
Browse files Browse the repository at this point in the history
…etcdf-cxx output to netcdf-c output. 3: Adding netcdf-c to cmakefile
  • Loading branch information
Aaron-Hsieh-0129 committed Dec 14, 2024
1 parent 83d311d commit c57cdd0
Show file tree
Hide file tree
Showing 3 changed files with 228 additions and 76 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ file(GLOB_RECURSE SRC src/*.cpp src/*.hpp)
add_executable(csswm ${SRC})

# Link libraries
find_library(libncPath netcdf "/home/Aaron/local/lib")
find_library(libncxxPath netcdf_c++4 "/home/Aaron/local/lib")
target_link_libraries(csswm ${libncxxPath} ${LIBS})
target_link_libraries(csswm ${libncPath} ${libncxxPath} ${LIBS})

# CPack settings
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
Expand Down
3 changes: 2 additions & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ int main(void) {
clock_t start, stop;
start = clock();


std::map<std::string, std::string> configs = csswm_read_config("../csswm_config.txt");
std::string csswm_outputpath = configs["CSSWM_OUTPUTPATH"];
double csswm_dt = std::stod(configs["CSSWM_DT"]);
Expand All @@ -21,7 +22,7 @@ int main(void) {

// int csswm_nx = (int) (90 / csswm_dx + 2);
// int csswm_ny = (int) (90 / csswm_dy + 2);
double csswm_d2t = csswm_dt * csswm_dt;
double csswm_d2t = 2 * csswm_dt;

model.output_path = csswm_outputpath;
model.dt = csswm_dt;
Expand Down
298 changes: 224 additions & 74 deletions src/outputs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,35 +94,160 @@ void CSSWM::Outputs::v(int n, CSSWM &model) {
return;
}

// void CSSWM::Outputs::grid_nc(CSSWM &model) {
// string dir = model.output_path + (string) "nc/";

// NcFile dataFile(dir + "grid.nc", NcFile::replace);
// // Create netCDF dimensions
// NcDim p = dataFile.addDim("p", 6);
// NcDim xDim = dataFile.addDim("x", NX);
// NcDim yDim = dataFile.addDim("y", NY);
// NcDim lonDim = dataFile.addDim("lon", NX);
// NcDim latDim = dataFile.addDim("lat", NY);

// vector<NcDim> xyDim, lonlatDim;
// xyDim.push_back(p);
// xyDim.push_back(xDim);
// xyDim.push_back(yDim);

// lonlatDim.push_back(p);
// lonlatDim.push_back(lonDim);
// lonlatDim.push_back(latDim);

// NcVar x = dataFile.addVar("x_local", ncDouble, xyDim);
// NcVar y = dataFile.addVar("y_local", ncDouble, xyDim);
// NcVar lon = dataFile.addVar("lon_sphere", ncDouble, lonlatDim);
// NcVar lat = dataFile.addVar("lat_sphere", ncDouble, lonlatDim);
// NcVar A = dataFile.addVar("area_sphere_coeff", ncDouble, lonlatDim);
// #if defined(Mountain)
// NcVar hs = dataFile.addVar("hs", ncDouble, xyDim);
// #endif

// double area[6][NX][NY];
// for (int p = 0; p < 6; p++) {
// for (int i = 0; i < NX; i++) {
// for (int j = 0; j < NY; j++) {
// area[p][i][j] = model.sqrtG[i][j];
// }
// }
// }

// vector<size_t> startp, countp;
// startp.push_back(0);
// startp.push_back(0);
// startp.push_back(0);
// countp.push_back(1);
// countp.push_back(NX);
// countp.push_back(NY);

// for (int p = 0; p < 6; p++) {
// startp[0] = p;
// x.putVar(startp, countp, model.csswm[p].x);
// y.putVar(startp, countp, model.csswm[p].y);
// lon.putVar(startp, countp, model.csswm[p].lon);
// lat.putVar(startp, countp, model.csswm[p].lat);
// A.putVar(startp, countp, area);
// #if defined(Mountain)
// hs.putVar(startp, countp, model.csswm[p].hs);
// #endif
// }
// }

// void CSSWM::Outputs::huv_nc(int n, CSSWM &model) {
// string dir = model.output_path + (string) "nc/";

// NcFile dataFile(dir + std::to_string(n) + ".nc", NcFile::replace);
// // Create netCDF dimensions
// NcDim p = dataFile.addDim("p", 6);
// NcDim xDim = dataFile.addDim("x", NX);
// NcDim yDim = dataFile.addDim("y", NY);
// NcDim lonDim = dataFile.addDim("lon", NX);
// NcDim latDim = dataFile.addDim("lat", NY);

// vector<NcDim> xyDim, lonlatDim;
// xyDim.push_back(p);
// xyDim.push_back(xDim);
// xyDim.push_back(yDim);

// lonlatDim.push_back(p);
// lonlatDim.push_back(lonDim);
// lonlatDim.push_back(latDim);

// NcVar h = dataFile.addVar("h", ncDouble, xyDim);
// NcVar u = dataFile.addVar("u", ncDouble, xyDim);
// NcVar v = dataFile.addVar("v", ncDouble, xyDim);

// NcVar ulonlat = dataFile.addVar("u_lonlat", ncDouble, lonlatDim);
// NcVar vlonlat = dataFile.addVar("v_lonlat", ncDouble, lonlatDim);
// double u_lon_lat[6][NX][NY], v_lon_lat[6][NX][NY];
// for (int p = 0; p < 6; p++) {
// for (int j = 0; j < NY; j++) {
// for (int i = 0; i < NX; i++) {
// u_lon_lat[p][i][j] = model.Cube2Sphere_U(model, p, i, j);
// v_lon_lat[p][i][j] = model.Cube2Sphere_V(model, p, i, j);
// }
// }
// }

// vector<size_t> startp, countp;
// startp.push_back(0);
// startp.push_back(0);
// startp.push_back(0);
// countp.push_back(1);
// countp.push_back(NX);
// countp.push_back(NY);

// for (int p = 0; p < 6; p++) {
// startp[0] = p;
// h.putVar(startp, countp, model.csswm[p].h);
// u.putVar(startp, countp, model.csswm[p].u);
// v.putVar(startp, countp, model.csswm[p].v);

// ulonlat.putVar(startp, countp, u_lon_lat[p]);
// vlonlat.putVar(startp, countp, v_lon_lat[p]);
// }
// }


void CSSWM::Outputs::grid_nc(CSSWM &model) {
string dir = model.output_path + (string) "nc/";
string filename = dir + "grid.nc";


int ncid;
if (nc_create(filename.c_str(), NC_CLOBBER, &ncid)) {
fprintf(stderr, "Error creating file: %s\n", filename.c_str());
return;
}

// Define dimensions
int p_dimid, x_dimid, y_dimid, lon_dimid, lat_dimid;
nc_def_dim(ncid, "p", 6, &p_dimid);
nc_def_dim(ncid, "x", NX, &x_dimid);
nc_def_dim(ncid, "y", NY, &y_dimid);
nc_def_dim(ncid, "lon", NX, &lon_dimid);
nc_def_dim(ncid, "lat", NY, &lat_dimid);

NcFile dataFile(dir + "grid.nc", NcFile::replace);
// Create netCDF dimensions
NcDim p = dataFile.addDim("p", 6);
NcDim xDim = dataFile.addDim("x", NX);
NcDim yDim = dataFile.addDim("y", NY);
NcDim lonDim = dataFile.addDim("lon", NX);
NcDim latDim = dataFile.addDim("lat", NY);

vector<NcDim> xyDim, lonlatDim;
xyDim.push_back(p);
xyDim.push_back(xDim);
xyDim.push_back(yDim);

lonlatDim.push_back(p);
lonlatDim.push_back(lonDim);
lonlatDim.push_back(latDim);

NcVar x = dataFile.addVar("x_local", ncDouble, xyDim);
NcVar y = dataFile.addVar("y_local", ncDouble, xyDim);
NcVar lon = dataFile.addVar("lon_sphere", ncDouble, lonlatDim);
NcVar lat = dataFile.addVar("lat_sphere", ncDouble, lonlatDim);
NcVar A = dataFile.addVar("area_sphere_coeff", ncDouble, lonlatDim);
#if defined(Mountain)
NcVar hs = dataFile.addVar("hs", ncDouble, xyDim);
// Define dimension IDs for variables
int xy_dimids[3] = {p_dimid, x_dimid, y_dimid};
int lonlat_dimids[3] = {p_dimid, lon_dimid, lat_dimid};

// Define variables
int x_varid, y_varid, lon_varid, lat_varid, A_varid;
nc_def_var(ncid, "x_local", NC_DOUBLE, 3, xy_dimids, &x_varid);
nc_def_var(ncid, "y_local", NC_DOUBLE, 3, xy_dimids, &y_varid);
nc_def_var(ncid, "lon_sphere", NC_DOUBLE, 3, lonlat_dimids, &lon_varid);
nc_def_var(ncid, "lat_sphere", NC_DOUBLE, 3, lonlat_dimids, &lat_varid);
nc_def_var(ncid, "area_sphere_coeff", NC_DOUBLE, 3, lonlat_dimids, &A_varid);

#ifdef Mountain
int hs_varid;
nc_def_var(ncid, "hs", NC_DOUBLE, 3, xy_dimids, &hs_varid);
#endif

// End define mode
nc_enddef(ncid);

double area[6][NX][NY];
for (int p = 0; p < 6; p++) {
for (int i = 0; i < NX; i++) {
Expand All @@ -131,54 +256,72 @@ void CSSWM::Outputs::grid_nc(CSSWM &model) {
}
}
}

vector<size_t> startp, countp;
startp.push_back(0);
startp.push_back(0);
startp.push_back(0);
countp.push_back(1);
countp.push_back(NX);
countp.push_back(NY);

size_t startp[3] = {0, 0, 0};
size_t countp[3] = {1, NX, NY};

for (int p = 0; p < 6; p++) {
startp[0] = p;
x.putVar(startp, countp, model.csswm[p].x);
y.putVar(startp, countp, model.csswm[p].y);
lon.putVar(startp, countp, model.csswm[p].lon);
lat.putVar(startp, countp, model.csswm[p].lat);
A.putVar(startp, countp, area);
#if defined(Mountain)
hs.putVar(startp, countp, model.csswm[p].hs);
nc_put_vara_double(ncid, x_varid, startp, countp, &model.csswm[p].x[0][0]);
nc_put_vara_double(ncid, y_varid, startp, countp, &model.csswm[p].y[0][0]);
nc_put_vara_double(ncid, lon_varid, startp, countp, &model.csswm[p].lon[0][0]);
nc_put_vara_double(ncid, lat_varid, startp, countp, &model.csswm[p].lat[0][0]);
nc_put_vara_double(ncid, A_varid, startp, countp, &area[p][0][0]);

#ifdef Mountain
nc_put_vara_double(ncid, hs_varid, startp, countp, &model->csswm[p].hs[0][0]);
#endif
}

// Close the file
nc_close(ncid);
}

void CSSWM::Outputs::huv_nc(int n, CSSWM &model) {
string dir = model.output_path + (string) "nc/";
string filename = dir + std::to_string(n) + ".nc";

int ncid;
int retval;

// Create a new NetCDF file
if ((retval = nc_create(filename.c_str(), NC_CLOBBER, &ncid))) {
fprintf(stderr, "Error: %s\n", nc_strerror(retval));
exit(EXIT_FAILURE);
}

// Define dimensions
int p_dimid, x_dimid, y_dimid, lon_dimid, lat_dimid;
if ((retval = nc_def_dim(ncid, "p", 6, &p_dimid)) ||
(retval = nc_def_dim(ncid, "x", NX, &x_dimid)) ||
(retval = nc_def_dim(ncid, "y", NY, &y_dimid)) ||
(retval = nc_def_dim(ncid, "lon", NX, &lon_dimid)) ||
(retval = nc_def_dim(ncid, "lat", NY, &lat_dimid))) {
fprintf(stderr, "Error: %s\n", nc_strerror(retval));
exit(EXIT_FAILURE);
}

// Define variables
int h_varid, u_varid, v_varid, ulonlat_varid, vlonlat_varid;
int xy_dims[3] = {p_dimid, x_dimid, y_dimid};
int lonlat_dims[3] = {p_dimid, lon_dimid, lat_dimid};

if ((retval = nc_def_var(ncid, "h", NC_DOUBLE, 3, xy_dims, &h_varid)) ||
(retval = nc_def_var(ncid, "u", NC_DOUBLE, 3, xy_dims, &u_varid)) ||
(retval = nc_def_var(ncid, "v", NC_DOUBLE, 3, xy_dims, &v_varid)) ||
(retval = nc_def_var(ncid, "u_lonlat", NC_DOUBLE, 3, lonlat_dims, &ulonlat_varid)) ||
(retval = nc_def_var(ncid, "v_lonlat", NC_DOUBLE, 3, lonlat_dims, &vlonlat_varid))) {
fprintf(stderr, "Error: %s\n", nc_strerror(retval));
exit(EXIT_FAILURE);
}

// End define mode
if ((retval = nc_enddef(ncid))) {
fprintf(stderr, "Error: %s\n", nc_strerror(retval));
exit(EXIT_FAILURE);
}

NcFile dataFile(dir + std::to_string(n) + ".nc", NcFile::replace);
// Create netCDF dimensions
NcDim p = dataFile.addDim("p", 6);
NcDim xDim = dataFile.addDim("x", NX);
NcDim yDim = dataFile.addDim("y", NY);
NcDim lonDim = dataFile.addDim("lon", NX);
NcDim latDim = dataFile.addDim("lat", NY);

vector<NcDim> xyDim, lonlatDim;
xyDim.push_back(p);
xyDim.push_back(xDim);
xyDim.push_back(yDim);

lonlatDim.push_back(p);
lonlatDim.push_back(lonDim);
lonlatDim.push_back(latDim);

NcVar h = dataFile.addVar("h", ncDouble, xyDim);
NcVar u = dataFile.addVar("u", ncDouble, xyDim);
NcVar v = dataFile.addVar("v", ncDouble, xyDim);

NcVar ulonlat = dataFile.addVar("u_lonlat", ncDouble, lonlatDim);
NcVar vlonlat = dataFile.addVar("v_lonlat", ncDouble, lonlatDim);
// Compute u_lon_lat and v_lon_lat
double u_lon_lat[6][NX][NY], v_lon_lat[6][NX][NY];
for (int p = 0; p < 6; p++) {
for (int j = 0; j < NY; j++) {
Expand All @@ -189,25 +332,32 @@ void CSSWM::Outputs::huv_nc(int n, CSSWM &model) {
}
}

vector<size_t> startp, countp;
startp.push_back(0);
startp.push_back(0);
startp.push_back(0);
countp.push_back(1);
countp.push_back(NX);
countp.push_back(NY);
size_t startp[3] = {0, 0, 0};
size_t countp[3] = {1, NX, NY};

// Write data
for (int p = 0; p < 6; p++) {
startp[0] = p;
h.putVar(startp, countp, model.csswm[p].h);
u.putVar(startp, countp, model.csswm[p].u);
v.putVar(startp, countp, model.csswm[p].v);

ulonlat.putVar(startp, countp, u_lon_lat[p]);
vlonlat.putVar(startp, countp, v_lon_lat[p]);
if ((retval = nc_put_vara_double(ncid, h_varid, startp, countp, &model.csswm[p].h[0][0])) ||
(retval = nc_put_vara_double(ncid, u_varid, startp, countp, &model.csswm[p].u[0][0])) ||
(retval = nc_put_vara_double(ncid, v_varid, startp, countp, &model.csswm[p].v[0][0])) ||
(retval = nc_put_vara_double(ncid, ulonlat_varid, startp, countp, &u_lon_lat[p][0][0])) ||
(retval = nc_put_vara_double(ncid, vlonlat_varid, startp, countp, &v_lon_lat[p][0][0]))) {
fprintf(stderr, "Error: %s\n", nc_strerror(retval));
exit(EXIT_FAILURE);
}
}

// Close the NetCDF file
if ((retval = nc_close(ncid))) {
fprintf(stderr, "Error: %s\n", nc_strerror(retval));
exit(EXIT_FAILURE);
}

}


void CSSWM::Outputs::create_all_directory(CSSWM &model) {
// data directory
#ifdef TXTOUTPUT
Expand Down

0 comments on commit c57cdd0

Please sign in to comment.