void sortify_date(const char *s, int len, string &key) { const char *year_end; const char *year_start = find_year(s, s + len, &year_end); if (!year_start) { // Things without years are often `forthcoming', so it makes sense // that they sort after things with explicit years. key += 'A'; sortify_words(s, s + len, 0, key); return; } int n = year_end - year_start; while (n < 4) { key += '0'; n++; } while (year_start < year_end) key += *year_start++; int m = find_month(s, s + len); if (m < 0) return; key += 'A' + m; const char *day_end; const char *day_start = find_day(s, s + len, &day_end); if (!day_start) return; if (day_end - day_start == 1) key += '0'; while (day_start < day_end) key += *day_start++; }
void addtodate(struct event *e, int year, int month, int day) { struct cal_day *d; d = find_day(year, month, day); e->next = d->events; d->events = e; }
/****************************************************************************** * * ******************************************************************************/ void read_daily_outflow(int julian, int NumOut, AED_REAL *draw) { int csv, i; for (i = 0; i < NumOut; i++) { csv = outf[i].outf; find_day(csv, time_idx, julian); draw[i] = get_csv_val_r(csv,outf[i].draw_idx); } }
/****************************************************************************** * * ******************************************************************************/ void read_bubble_data(int julian, AED_REAL *aFlow, int *nPorts, AED_REAL *bDepth, AED_REAL *bLength) { int csv; csv = bubl.bubf; find_day(csv, time_idx, julian); *aFlow = get_csv_val_r(csv, bubl.flow_idx); *nPorts = get_csv_val_i(csv, bubl.port_idx); *bDepth = get_csv_val_r(csv, bubl.depth_idx); *bLength = get_csv_val_r(csv, bubl.length_idx); }
/****************************************************************************** * * ******************************************************************************/ void read_daily_inflow(int julian, int NumInf, AED_REAL *flow, AED_REAL *temp, AED_REAL *salt, AED_REAL *wq) { int csv; int i,j,k; for (i = 0; i < NumInf; i++) { int n_invars = inf[i].n_vars; csv = inf[i].inf; find_day(csv, time_idx, julian); flow[i] = get_csv_val_r(csv,inf[i].flow_idx); temp[i] = get_csv_val_r(csv,inf[i].temp_idx); salt[i] = get_csv_val_r(csv,inf[i].salt_idx); for (j = 0; j < n_invars; j++) { if (WQ_VarsIdx[j] < 0) k = j; else k = WQ_VarsIdx[j]; if (inf[i].in_vars[k] == -1 ) WQ_INF_(wq, i, k) = 0.; else WQ_INF_(wq, i, k) = get_csv_val_r(csv,inf[i].in_vars[j]); } } }
/****************************************************************************** * * ******************************************************************************/ void read_daily_met(int julian, MetDataType *met) { int csv, i, idx, err = 0; AED_REAL now, tomorrow, t_val, sol; now = julian; tomorrow = now + 1.0; loaded_day = now; dbgprt("read_daily_met (SUBDAY_MET) in\n"); csv = metf; find_day(csv, time_idx, julian); for (i = 0; i < n_steps; i++) memset(&submet[i], 0, sizeof(MetDataType)); i = 0; while ( (t_val = get_csv_val_r(csv, time_idx)) < tomorrow) { if ( i >= n_steps ) { int dd,mm,yy; calendar_date(now,&yy,&mm,&dd); fprintf(stderr, "Warning! Too many steps in met for %4d-%02d-%02d\n", yy,mm,dd); break; } idx = floor((t_val-floor(t_val))*24+1.e-8); // add 1.e-8 to compensate for rounding error // fprintf(stderr, "Read met for %16.8f ; %15.12f (%2d)\n", t_val, (t_val-floor(t_val))*24., idx); if ( idx != i ) { if ( !err ) { int dd,mm,yy; calendar_date(now,&yy,&mm,&dd); fprintf(stderr, "Possible sequence issue in met for day %4d-%02d-%02d\n", yy,mm,dd); } idx = i; err = 1; } if (idx >= n_steps) { int dd,mm,yy; calendar_date(now,&yy,&mm,&dd); fprintf(stderr, "Step error for %4d-%02d-%02d!\n", yy,mm,dd); break; } // Rain is the exception - goes as is submet[idx].Rain = get_csv_val_r(csv, rain_idx) * rain_factor; submet[idx].RelHum = get_csv_val_r(csv, hum_idx) * rh_factor; if ( submet[idx].RelHum > 100. ) submet[idx].RelHum = 100.; if ( lwav_idx != -1 ) submet[idx].LongWave = get_csv_val_r(csv, lwav_idx) * lw_factor; else submet[idx].LongWave = 0.; if ( sw_idx != -1 ) submet[idx].ShortWave = get_csv_val_r(csv, sw_idx) * sw_factor; else submet[idx].ShortWave = 0.; switch ( rad_mode ) { case 0 : // use the value already read. case 1 : case 2 : break; case 3 : case 4 : case 5 : sol = calc_bird(Longitude, Latitude, julian, idx*3600, timezone_m); if ( rad_mode == 4 ) sol = clouded_bird(sol, submet[idx].LongWave); if ( rad_mode == 3 ) submet[idx].LongWave = cloud_from_bird(sol, submet[idx].ShortWave); submet[idx].ShortWave = sol; break; } submet[idx].AirTemp = get_csv_val_r(csv, atmp_idx) * at_factor; submet[idx].WindSpeed = get_csv_val_r(csv, wind_idx) * wind_factor; // Read in rel humidity into svd (%), and convert to satvap submet[idx].SatVapDef = (submet[idx].RelHum/100.) * saturated_vapour(submet[idx].AirTemp); if ( have_snow ) submet[idx].Snow = get_csv_val_r(csv,snow_idx); else submet[idx].Snow = 0. ; if ( have_rain_conc ) { submet[idx].RainConcPO4 = get_csv_val_r(csv, rpo4_idx); submet[idx].RainConcTp = get_csv_val_r(csv, rtp_idx); submet[idx].RainConcNO3 = get_csv_val_r(csv, rno3_idx); submet[idx].RainConcNH4 = get_csv_val_r(csv, rnh4_idx); submet[idx].RainConcTn = get_csv_val_r(csv, rtn_idx); submet[idx].RainConcSi = get_csv_val_r(csv, rsi_idx); } else { submet[idx].RainConcPO4 = 0.; submet[idx].RainConcTp = 0.; submet[idx].RainConcNO3 = 0.; submet[idx].RainConcNH4 = 0.; submet[idx].RainConcTn = 0.; submet[idx].RainConcSi = 0.; } i++; if (!load_csv_line(csv) ) break; } *met = submet[0]; }