#include #include #include #include #include #include #include #include using namespace std; using namespace simon; using namespace sbufr; using namespace tctrack; class Jma_Eps_Tc_Bufr : public Sbufr { private: Stime time; string tc_name; string wmo_identifier; Scalar get_scalar (Element& element); string get_string (Element& element); public: Jma_Eps_Tc_Bufr (const string& bufr_file_path, const string& table_b_file_path, const string& table_d_file_path); ~Jma_Eps_Tc_Bufr (); Track_Record* get_track_record_ptr (Index_1D member_id, Index_1D time_id); Tc_Track* get_tc_track_ptr (Index_1D member_id); }; Scalar Jma_Eps_Tc_Bufr::get_scalar (Element& element) { Element_Description& ed = table_b_ptr->get_ed_ref (element.descriptor); if (element.is_missing (ed.width)) { return GSL_NAN; } else { return (element.mpz.get_d () + ed.reference) / exp10 (ed.exponent); } } string Jma_Eps_Tc_Bufr::get_string (Element& element) { Element_Description& ed = table_b_ptr->get_ed_ref (element.descriptor); Size_1D string_length = ed.width/8; char c_hex_string[2*string_length + 1]; mpz_get_str (c_hex_string, 16, element.mpz.get_mpz_t ()); string hex_string (c_hex_string); char c_string[string_length + 1]; for (Index_1D i = 0; i < string_length; i++) { sscanf (hex_string.substr (i*2, 2).c_str (), "%x", &(c_string[i])); } c_string[string_length] = '\0'; string s (c_string); trim (s); return s; } Jma_Eps_Tc_Bufr::Jma_Eps_Tc_Bufr (const string& bufr_file_path, const string& table_b_file_path, const string& table_d_file_path) : Sbufr (bufr_file_path, table_b_file_path, table_d_file_path) { Data_Set& data_set_0 = data_sets[0]; Index_1D year = (data_set_0[8]).mpz.get_ui (); Index_1D month = (data_set_0[9]).mpz.get_ui (); Index_1D day = (data_set_0[10]).mpz.get_ui (); Index_1D hour = (data_set_0[11]).mpz.get_ui (); Index_1D minute = (data_set_0[12]).mpz.get_ui (); this->time = Stime (year, month, day, hour, minute); this->tc_name = get_string (data_set_0[4]); this->wmo_identifier = get_string (data_set_0[3]); } Jma_Eps_Tc_Bufr::~Jma_Eps_Tc_Bufr () { } Track_Record* Jma_Eps_Tc_Bufr::get_track_record_ptr (Index_1D member_id, Index_1D time_id) { Lat_Long lat_long; Stime time_f (time); Data_Set& data_set = data_sets[member_id]; for (Index_1D i = 0; i < time_id; i++) { time_f.t += get_scalar (data_set[14 + time_id * 10]); } Element& mslp_element = data_set[18 + time_id * 10]; Element& max_wind_element = data_set[22 + time_id * 10]; Element& latitude_element = data_set[16 + time_id * 10]; Element& longitude_element = data_set[17 + time_id * 10]; Scalar mslp = get_scalar (mslp_element); Scalar max_wind = get_scalar (max_wind_element); lat_long.latitude = get_scalar (latitude_element); lat_long.longitude = get_scalar (longitude_element); Tuple tuple (max_wind, mslp); return new Track_Record (time_f, lat_long, tuple); } Tc_Track* Jma_Eps_Tc_Bufr::get_tc_track_ptr (Index_1D member_id) { string attribute_string ("max_wind mslp"); string description ("JMA_EPS " + wmo_identifier); description += string_render (" Ensemble#%d", member_id); Data_Set& data_set = data_sets[member_id]; Size_1D number_of_time_steps = (data_set.size () - 13) / 10; Tc_Track* tc_track_ptr = new Tc_Track (description, tc_name, attribute_string); for (Index_1D j = 0; j < number_of_time_steps; j++) { Track_Record* track_record_ptr = get_track_record_ptr (member_id, j); if (track_record_ptr->is_empty ()) { delete track_record_ptr; } else { tc_track_ptr->push_back (track_record_ptr); } } tc_track_ptr->make_splines (); return tc_track_ptr; } int main (int argc, char** argv) { char* file_path = argv[1]; char* table_b_file_path = argv[2]; char* table_d_file_path = argv[3]; Size_1D index = atoi (argv[4]); try { Jma_Eps_Tc_Bufr jetb (file_path, table_b_file_path, table_d_file_path); Tc_Track* tc_track_ptr = jetb.get_tc_track_ptr (index); tc_track_ptr->save (stdout); delete tc_track_ptr; } catch (IO_Exception ioe) { cerr << ioe << endl; } catch (Not_Available_Exception nae) { cerr << nae << endl; } catch (Exception e) { cerr << e << endl; } }