diff --git a/src/basic/vx_math/nti.cc b/src/basic/vx_math/nti.cc index 3679260722..5c4c9b6003 100644 --- a/src/basic/vx_math/nti.cc +++ b/src/basic/vx_math/nti.cc @@ -150,7 +150,8 @@ y = ca2; // reduce x and y as much as possible // -n = (y*L_over_b - x*L_over_a)/( L_over_a*L_over_a + L_over_b*L_over_b ); +n = (0 == L_over_a && 0 == L_over_b) ? + 0 : (y*L_over_b - x*L_over_a)/( L_over_a*L_over_a + L_over_b*L_over_b ); x += n*L_over_a; y -= n*L_over_b; diff --git a/src/basic/vx_util/two_d_array.h b/src/basic/vx_util/two_d_array.h index 5109e2cbda..42d169d303 100644 --- a/src/basic/vx_util/two_d_array.h +++ b/src/basic/vx_util/two_d_array.h @@ -274,7 +274,7 @@ T TwoD_Array::operator()(int _x, int _y) const { -return ( E[two_to_one(_x, _y)] ); +return ( get(_x, _y) ); } @@ -287,6 +287,11 @@ T TwoD_Array::get(int _x, int _y) const { +if (E == nullptr) { + mlog << Error << "\nTwoD_Array::get(x,y) -> E is not initialized\n\n"; + exit ( 1 ); +} + return ( E[two_to_one(_x, _y)] ); } @@ -301,7 +306,7 @@ bool TwoD_Array::s_is_on(int _x, int _y) const { -return ( (bool) (E[two_to_one(_x, _y)]) ); +return ( (bool) (E == nullptr) ? false : (E[two_to_one(_x, _y)]) ); } diff --git a/src/libcode/vx_data2d_nc_met/met_file.cc b/src/libcode/vx_data2d_nc_met/met_file.cc index ab6df49a64..db2d5f9ca3 100644 --- a/src/libcode/vx_data2d_nc_met/met_file.cc +++ b/src/libcode/vx_data2d_nc_met/met_file.cc @@ -413,7 +413,7 @@ double fill_value; double missing_value = get_var_missing_value(var); get_var_fill_value(var, fill_value); -status = get_nc_data(var, &d, (long *)a); +status = get_nc_data(var, &d, a); if ( !status ) { @@ -579,10 +579,10 @@ plane.set_size(Nx, Ny); clock_t clock_time; double nc_time; - long dim[dimCount], cur[dimCount]; + LongArray dim, cur; for (int index=0; indexgetDim(k).getSize(); if (dim_size < offsets[k]) { mlog << Error << "\n" << method_name @@ -3202,9 +3202,11 @@ LatLonData NcCfFile::get_data_from_lat_lon_vars(NcVar *lat_var, NcVar *lon_var, bool lat_first = false; if (two_dim_coord) { lat_first = (lat_counts == get_dim_size(lat_var, 0)); - long cur[2], length[2]; - cur[0] = cur[1] = 0; - length[0] = length[1] = 1; + LongArray cur, length; // {0,0}, {1,1} + cur.add(0); + cur.add(0); + length.add(1); + length.add(1); if (lat_first) length[0] = lat_counts; else length[1] = lat_counts; get_nc_data(lat_var,lat_values, length, cur); diff --git a/src/libcode/vx_nc_obs/nc_obs_util.cc b/src/libcode/vx_nc_obs/nc_obs_util.cc index 8f9fa37082..f33eb40f5c 100644 --- a/src/libcode/vx_nc_obs/nc_obs_util.cc +++ b/src/libcode/vx_nc_obs/nc_obs_util.cc @@ -603,10 +603,17 @@ void NetcdfObsVars::read_header_data(MetPointHeader &hdr_data) { float *hdr_lon_block = new float[buf_size]; float *hdr_elv_block = new float[buf_size]; - long offsets[2] = { 0, 0 }; - long lengths[2] = { 1, 1 }; - long offsets_1D[1] = { 0 }; - long lengths_1D[1] = { 1 }; + LongArray offsets; // = { 0, 0 }; + LongArray lengths; // = { 1, 1 }; + LongArray offsets_1D; // = { 0 }; + LongArray lengths_1D; // = { 1 }; + + offsets.add(0); + offsets.add(0); + lengths.add(1); + lengths.add(1); + offsets_1D.add(0); + lengths_1D.add(1); for(int i_start=0; i_start NC_BUFFER_SIZE_32K) @@ -821,10 +828,14 @@ void NetcdfObsVars::read_header_data(MetPointHeader &hdr_data) { bool NetcdfObsVars::read_obs_data(int buf_size, int offset, int qty_len, float *obs_arr, int *qty_idx_arr, char *obs_qty_buf) { bool result = true; - long offsets[2] = { offset, 0 }; - long lengths[2] = { buf_size, 1 }; + LongArray offsets; // = { offset, 0 }; + LongArray lengths; // = { buf_size, 1 }; const char *method_name = "read_obs_data() -> "; + offsets.add(offset); + offsets.add(0); + lengths.add(buf_size); + lengths.add(1); if (IS_VALID_NC(obs_arr_var)) { // Read the current observation message lengths[1] = OBS_ARRAY_LEN; @@ -921,8 +932,8 @@ void NetcdfObsVars::read_pb_hdr_data(MetPointHeader &hdr_data) { return; } - long offsets[1] = { 0 }; - long lengths[1] = { 1 }; + LongArray offsets; // = { 0 }; + LongArray lengths; // = { 1 }; bool has_hdr_prpt_typ_var = !IS_INVALID_NC(hdr_prpt_typ_var); bool has_hdr_irpt_typ_var = !IS_INVALID_NC(hdr_irpt_typ_var); bool has_hdr_inst_typ_var = !IS_INVALID_NC(hdr_inst_typ_var); @@ -931,6 +942,9 @@ void NetcdfObsVars::read_pb_hdr_data(MetPointHeader &hdr_data) { if (has_hdr_irpt_typ_var) hdr_data.irpt_typ_array.extend(pb_hdr_count); if (has_hdr_inst_typ_var) hdr_data.inst_typ_array.extend(pb_hdr_count); + offsets.add(0); + lengths.add(1); + // Read PB report type int buf_size = ((pb_hdr_count > NC_BUFFER_SIZE_32K) ? NC_BUFFER_SIZE_32K : (pb_hdr_count)); diff --git a/src/libcode/vx_nc_util/nc_utils.cc b/src/libcode/vx_nc_util/nc_utils.cc index 87fcd8bece..443caa837d 100644 --- a/src/libcode/vx_nc_util/nc_utils.cc +++ b/src/libcode/vx_nc_util/nc_utils.cc @@ -1278,7 +1278,7 @@ float get_float_var(NcVar * var, const int index) { //////////////////////////////////////////////////////////////////////// -bool get_nc_data(NcVar *var, int *data, const long *curs) { +bool get_nc_data(NcVar *var, int *data, const LongArray &curs) { bool return_status = get_nc_data_(var, data, bad_data_int, curs); return(return_status); @@ -1307,7 +1307,7 @@ bool get_nc_data(NcVar *var, int *data, const long dim, const long cur) { //////////////////////////////////////////////////////////////////////// -bool get_nc_data(NcVar *var, int *data, const long *dims, const long *curs) { +bool get_nc_data(NcVar *var, int *data, const LongArray &dims, const LongArray &curs) { bool return_status = get_nc_data_(var, data, bad_data_int, dims, curs); return(return_status); @@ -1315,7 +1315,7 @@ bool get_nc_data(NcVar *var, int *data, const long *dims, const long *curs) { //////////////////////////////////////////////////////////////////////// -bool get_nc_data(NcVar *var, short *data, const long *curs) { +bool get_nc_data(NcVar *var, short *data, const LongArray &curs) { bool return_status = get_nc_data_(var, data, (short)bad_data_int, curs); return(return_status); @@ -1323,7 +1323,7 @@ bool get_nc_data(NcVar *var, short *data, const long *curs) { //////////////////////////////////////////////////////////////////////// -bool get_nc_data(NcVar *var, short *data, const long *dims, const long *curs) { +bool get_nc_data(NcVar *var, short *data, const LongArray &dims, const LongArray &curs) { bool return_status = get_nc_data_(var, data, (short)bad_data_int, dims, curs); return(return_status); @@ -1421,13 +1421,13 @@ bool get_nc_data(NcVar *var, float *data) { for (int idx=0; idxgetDim(dim_count-2); NcDim str_dim = var->getDim(dim_count-1); int count = get_dim_size(&count_dim); int str_len = get_dim_size(&str_dim); - lengths[1] = str_len; char str_buffer[str_len+1]; + + offsets.add(0); + offsets.add(0); + lengths.add(1); + lengths.add(str_len); + result = true; for (int idx=0; idx -bool get_nc_data_(netCDF::NcVar *var, T *data, T bad_data, const long *dims, const long *curs) { +bool get_nc_data_(netCDF::NcVar *var, T *data, T bad_data, const LongArray &dims, const LongArray &curs) { bool return_status = false; const char *method_name = "get_nc_data_(T, *dims, *curs) "; @@ -313,9 +313,16 @@ bool get_nc_data_(netCDF::NcVar *var, T *data, T bad_data, const long *dims, con std::vector start; std::vector count; + int idx =0; int data_size = 1; int dimC = get_dim_count(var); - for (int idx = 0 ; idx < dimC; idx++) { + int dim_cnt = dims.n_elements(); + int off_cnt = curs.n_elements(); + int in_cnt = (dim_cnt > off_cnt) ? off_cnt : dim_cnt; + + // madis2nc shares the same dims & curs for 1D, 2D and 3D + if (in_cnt > dimC) in_cnt = dimC; + for (idx = 0 ; idx < in_cnt; idx++) { int dim_size = get_dim_size(var, idx); if ((curs[idx]+dims[idx]) > dim_size) { netCDF::NcDim nc_dim = get_nc_dim(var, idx); @@ -331,6 +338,12 @@ bool get_nc_data_(netCDF::NcVar *var, T *data, T bad_data, const long *dims, con count.push_back((size_t)dims[idx]); data_size *= dims[idx]; } + for (; idx < dimC; idx++) { + int dim_size = get_dim_size(var, idx); + start.push_back((size_t)0); + count.push_back((size_t)dim_size); + data_size *= dim_size; + } for (int idx1=0; idx1 -bool get_nc_data_(netCDF::NcVar *var, T *data, T bad_data, const long *curs) { +bool get_nc_data_(netCDF::NcVar *var, T *data, T bad_data, const LongArray &curs) { bool return_status = false; const char *method_name = "get_nc_data_(*curs) "; if (IS_VALID_NC_P(var)) { int dimC = get_dim_count(var); - long dims[dimC]; + + LongArray dims; for (int idx = 0 ; idx < dimC; idx++) { - dims[idx] = 1; + dims.add(1); } // Retrieve the NetCDF value from the NetCDF variable. @@ -520,7 +534,7 @@ void copy_nc_data_t(netCDF::NcVar *var, float *data, const T *packed_data, << " - " << max_value << "]\n"; } } - mlog << Debug(7) << method_name << "took " + mlog << Debug(7) << method_name << "took " << (clock()-start_clock)/double(CLOCKS_PER_SEC) << " seconds\n"; return; } diff --git a/src/libcode/vx_seeps/seeps.cc b/src/libcode/vx_seeps/seeps.cc index 1be8d2d8ad..ff94441ea1 100644 --- a/src/libcode/vx_seeps/seeps.cc +++ b/src/libcode/vx_seeps/seeps.cc @@ -836,8 +836,8 @@ void SeepsClimoGrid::read_seeps_scores(ConcatString filename) { s31_buf = new double[nx*ny]; s32_buf = new double[nx*ny]; - long curs[3] = { month-1, 0, 0 }; - long dims[3] = { 1, ny, nx }; + LongArray curs; // = { month-1, 0, 0 }; + LongArray dims; // = { 1, ny, nx }; NcVar var_p1_00 = get_nc_var(nc_file, var_name_p1_00); NcVar var_p2_00 = get_nc_var(nc_file, var_name_p2_00); NcVar var_t1_00 = get_nc_var(nc_file, var_name_t1_00); @@ -849,6 +849,13 @@ void SeepsClimoGrid::read_seeps_scores(ConcatString filename) { NcVar var_s31_00 = get_nc_var(nc_file, var_name_s31_00); NcVar var_s32_00 = get_nc_var(nc_file, var_name_s32_00); + curs.add(month-1); + curs.add(0); + curs.add(0); + dims.add(1); + dims.add(ny); + dims.add(nx); + if (IS_INVALID_NC(var_p1_00) || !get_nc_data(&var_p1_00, p1_buf, dims, curs)) { mlog << Error << "\n" << method_name << "Did not get p1_00\n\n"; diff --git a/src/libcode/vx_shapedata/set.cc b/src/libcode/vx_shapedata/set.cc index 82c3bf0307..26985475a0 100644 --- a/src/libcode/vx_shapedata/set.cc +++ b/src/libcode/vx_shapedata/set.cc @@ -169,7 +169,7 @@ if ( s.n_fcst_alloc > 0 ) { } - + if ( s.n_obs_alloc > 0 ) { extend_obs (s.n_obs_alloc); @@ -239,7 +239,7 @@ u = new int [k]; if ( a ) memcpy(u, a, n_alloc*sizeof(int)); -for (j=n_alloc; j BUFFER_SIZE) ? BUFFER_SIZE: (my_rec_end - rec_beg); buf_size = (my_rec_end - rec_beg); // read all int levels[buf_size]; @@ -3308,8 +3312,6 @@ void process_madis_acarsProfiles(NcFile *&f_in) { for(i_hdr=0; i_hdr BUFFER_SIZE) ? BUFFER_SIZE: (my_rec_end - i_hdr_s); @@ -3356,16 +3359,18 @@ void process_madis_acarsProfiles(NcFile *&f_in) { get_nc_data(&in_hdr_lon_var, (float *)hdr_lon_arr, dim, cur); get_filtered_nc_data_2d(in_hdr_elv_var, (float *)hdr_elv_arr, dim, cur, "elevation"); + + data_cnt = buf_size * maxLevels; if (IS_VALID_NC(in_temperatureQty_var)) get_nc_data(&in_temperatureQty_var, (char *)&temperatureQty_arr, dim, cur); - else memset(temperatureQty_arr, 0, buf_size*dim[1]*sizeof(char)); + else memset(temperatureQty_arr, 0, data_cnt*sizeof(char)); if (IS_VALID_NC(in_dewpointQty_var)) get_nc_data(&in_dewpointQty_var, (char *)&dewpointQty_arr, dim, cur); - else memset(dewpointQty_arr, 0, buf_size*dim[1]*sizeof(char)); + else memset(dewpointQty_arr, 0, data_cnt*sizeof(char)); if (IS_VALID_NC(in_windDirQty_var)) get_nc_data(&in_windDirQty_var, (char *)&windDirQty_arr, dim, cur); - else memset(windDirQty_arr, 0, buf_size*dim[1]*sizeof(char)); + else memset(windDirQty_arr, 0, data_cnt*sizeof(char)); if (IS_VALID_NC(in_windSpeedQty_var)) get_nc_data(&in_windSpeedQty_var, (char *)&windSpeedQty_arr, dim, cur); - else memset(windSpeedQty_arr, 0, buf_size*dim[1]*sizeof(char)); + else memset(windSpeedQty_arr, 0, data_cnt*sizeof(char)); if (IS_VALID_NC(in_altitudeQty_var)) get_nc_data(&in_altitudeQty_var, (char *)&altitudeQty_arr, dim, cur); - else memset(altitudeQty_arr, 0, buf_size*dim[1]*sizeof(char)); + else memset(altitudeQty_arr, 0, data_cnt*sizeof(char)); get_filtered_nc_data_2d(in_hdr_tob_var, (int *)&obsTimeOfDay_arr, dim, cur, "obsTimeOfDay"); get_filtered_nc_data_2d(in_temperature_var, (float *)&temperature_arr, dim, cur, "temperature"); @@ -3376,9 +3381,6 @@ void process_madis_acarsProfiles(NcFile *&f_in) { dim[1] = hdr_sid_len; get_nc_data(&in_hdr_sid_var, (char *)hdr_sid_arr, dim, cur); - dim[0] = 1; - dim[1] = 1; - // // Process the header type. // For ACARS, store as AIRCFT. @@ -3390,12 +3392,6 @@ void process_madis_acarsProfiles(NcFile *&f_in) { i_hdr = i_hdr_s + i_idx; mlog << Debug(3) << "Record Number: " << i_hdr << "\n"; - // - // Use cur to index into the NetCDF variables. - // - cur[0] = i_hdr; - cur[1] = 0; - // // Process the station i.e. airport name. // @@ -3544,8 +3540,8 @@ void process_madis_acarsProfiles(NcFile *&f_in) { // // Cleanup // - if(cur) { delete [] cur; cur = (long *) 0; } - if(dim) { delete [] dim; dim = (long *) 0; } + cur.clear(); + dim.clear(); return; } diff --git a/src/tools/other/mode_graphics/mode_nc_output_file.cc b/src/tools/other/mode_graphics/mode_nc_output_file.cc index c3be3fcbd3..fd20806ca0 100644 --- a/src/tools/other/mode_graphics/mode_nc_output_file.cc +++ b/src/tools/other/mode_graphics/mode_nc_output_file.cc @@ -449,8 +449,14 @@ int x, y, n, k; n = 0; int v[Ny][Nx]; -long offsets[2] = { 0, 0}; // NOT (x, y)! -long lengths[2] = {Ny, Nx}; +LongArray offsets; // { 0, 0}; +LongArray lengths; // {Ny, Nx}; // NOT (x, y)! + +offsets.add(0); +offsets.add(0); +lengths.add(Ny); +lengths.add(Nx); + if (get_nc_data(var, (int *)&v, lengths, offsets)) { for (x=0; x= Nx) || (y < 0) || (y >= Ny) ) { int i[2]; int status; -long offsets[2] = {y, x}; // NOT (x, y)! -long lengths[2] = {1,1}; +LongArray offsets; // {y, x}; // NOT (x, y)! +LongArray lengths; // {1,1}; + +offsets.add(y); +offsets.add(x); +lengths.add(1); +lengths.add(1); //status = var->set_cur(y, x); // @@ -537,8 +548,13 @@ if ( (x < 0) || (x >= Nx) || (y < 0) || (y >= Ny) ) { float ff[2]; int status; -long offsets[2] = {y, x}; // NOT (x, y)! -long lengths[2] = {1,1}; +LongArray offsets; // {y, x}; // NOT (x, y)! +LongArray lengths; // {1,1}; + +offsets.add(y); +offsets.add(x); +lengths.add(1); +lengths.add(1); //status = var->set_cur(y, x); // NOT (x, y)! // diff --git a/src/tools/other/mode_time_domain/fo_graph.cc b/src/tools/other/mode_time_domain/fo_graph.cc index bac9eed6fc..1890ff01d6 100644 --- a/src/tools/other/mode_time_domain/fo_graph.cc +++ b/src/tools/other/mode_time_domain/fo_graph.cc @@ -141,7 +141,9 @@ N_nodes = N*N; TheGraph = new FO_Node [N_nodes]; -memcpy(TheGraph, g.TheGraph, N_nodes*sizeof(FO_Node)); +for (int idx=0; idx 0 ) { } -delete [] W; W = 0; +delete [] W; W = nullptr; -delete [] F; F = 0; +delete [] F; F = nullptr; -delete [] A; A = 0; +delete [] A; A = nullptr; W = ww; @@ -222,11 +222,11 @@ F = ff; A = aa; -ww = 0; +ww = nullptr; -ff = 0; +ff = nullptr; -aa = 0; +aa = nullptr; // // done diff --git a/src/tools/other/mode_time_domain/mtd_file_float.cc b/src/tools/other/mode_time_domain/mtd_file_float.cc index 794c4a3311..f0c70f509f 100644 --- a/src/tools/other/mode_time_domain/mtd_file_float.cc +++ b/src/tools/other/mode_time_domain/mtd_file_float.cc @@ -669,8 +669,15 @@ var = get_nc_var(&f, data_field_name); // //} -long offsets[3] = {0,0,0}; -long lengths[3] = {Nt, Ny, Nx}; +LongArray offsets; // {0,0,0}; +LongArray lengths; // {Nt, Ny, Nx}; + +offsets.add(0); +offsets.add(0); +offsets.add(0); +lengths.add(Nt); +lengths.add(Ny); +lengths.add(Nx); //if ( ! get_nc_data(&var, Data, (long *){Nt, Ny, Nx}, (long *){0,0,0}) ) { if ( ! get_nc_data(&var, Data, lengths, offsets) ) { @@ -775,8 +782,15 @@ data_var = get_nc_var(&f, data_field_name); // //} -long offsets[3] = {0,0,0}; -long lengths[3] = {Nt, Ny, Nx}; +LongArray offsets; // {0,0,0}; +LongArray lengths; // {Nt, Ny, Nx}; + +offsets.add(0); +offsets.add(0); +offsets.add(0); +lengths.add(Nt); +lengths.add(Ny); +lengths.add(Nx); //if ( ! get_nc_data(&data_var, Data, (long *){Nt, Ny, Nx}, (long *){0,0,0}) ) { if ( ! get_nc_data(&data_var, Data, lengths, offsets) ) { diff --git a/src/tools/other/mode_time_domain/mtd_file_int.cc b/src/tools/other/mode_time_domain/mtd_file_int.cc index 339b583ce6..8ba42b427c 100644 --- a/src/tools/other/mode_time_domain/mtd_file_int.cc +++ b/src/tools/other/mode_time_domain/mtd_file_int.cc @@ -461,8 +461,15 @@ var = get_nc_var(&f, data_field_name); // //} -long offsets[3] = {0,0,0}; -long lengths[3] = {Nt, Ny, Nx}; +LongArray offsets; // {0,0,0}; +LongArray lengths; // {Nt, Ny, Nx}; + +offsets.add(0); +offsets.add(0); +offsets.add(0); +lengths.add(Nt); +lengths.add(Ny); +lengths.add(Nx); //if ( ! get_nc_data(&var, Data, (long *){Nt, Ny, Nx}, (long *){0,0,0}) ) { if ( ! get_nc_data(&var, Data, lengths, offsets) ) { @@ -566,8 +573,15 @@ data_var = add_var(&f, data_field_name, ncInt, nt_dim, ny_dim, nx_dim); //data_var = get_nc_var(&f, data_field_name); -long offsets[3] = {0,0,0}; -long lengths[3] = {Nt, Ny, Nx}; +LongArray offsets; // {0,0,0}; +LongArray lengths; // {Nt, Ny, Nx}; + +offsets.add(0); +offsets.add(0); +offsets.add(0); +lengths.add(Nt); +lengths.add(Ny); +lengths.add(Nx); if ( ! put_nc_data(&data_var, Data, lengths, offsets) ) { diff --git a/src/tools/other/mode_time_domain/mtd_partition.cc b/src/tools/other/mode_time_domain/mtd_partition.cc index f90b1884ab..ce6a73f91c 100644 --- a/src/tools/other/mode_time_domain/mtd_partition.cc +++ b/src/tools/other/mode_time_domain/mtd_partition.cc @@ -467,7 +467,7 @@ void Mtd_Partition::extend(int n) if ( n <= Nalloc ) return; -EquivalenceClass ** u = (EquivalenceClass **) 0; +EquivalenceClass ** u = (EquivalenceClass **) nullptr; n = mtd_partition_alloc_inc*((n + mtd_partition_alloc_inc - 1)/mtd_partition_alloc_inc); @@ -479,7 +479,7 @@ if ( C ) { memcpy(u, C, Nelements*(sizeof(EquivalenceClass *))); - delete [] C; C = (EquivalenceClass **) 0; + delete [] C; C = (EquivalenceClass **) nullptr; }