예제 #1
0
/******************************************************************************
 *                                                                            *
 ******************************************************************************/
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);
}
예제 #2
0
파일: aed_csv.c 프로젝트: GLEON/GLM-source
/******************************************************************************
 *                                                                            *
 *                                                                            *
 ******************************************************************************/
void find_day(int csv, int time_idx, int jday)
{
    int y,m,d;
    AED_REAL tr;

    if ( !check_it(csv, time_idx) ) {
        fprintf(stderr, "Fatal error in find_day: file %d index %d\n", csv, time_idx);
#if DEBUG
        CRASH("find_day");
#else
        exit(1);
#endif
    }

    while( (tr = get_csv_val_r(csv, time_idx)) < jday) {
        if ( !load_csv_line(csv) ) {
            calendar_date(jday, &y, &m, &d);
            fprintf(stderr,"Day %d (%d-%02d-%02d) not found\n", jday, y, m, d);
#if DEBUG
            CRASH("find_day");
#else
            exit(1);
#endif
        }
    }
}
예제 #3
0
/******************************************************************************
 *                                                                            *
 ******************************************************************************/
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);
    }
}
예제 #4
0
/******************************************************************************
 *                                                                            *
 ******************************************************************************/
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]);
        }
    }
}
예제 #5
0
/******************************************************************************
 *                                                                            *
 ******************************************************************************/
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];
}