Пример #1
0
int f_grib(ARG1) {
    unsigned long int size;
    int i;
    unsigned char s[8];

    if (mode == -1) {
        if ((*local = (void *) ffopen(arg1, file_append ? "ab" : "wb")) == NULL) {
	    fatal_error("Could not open %s", arg1);
	}
    }
    else if (mode >= 0) {
        /* figure out size of grib file */
        size = (unsigned long int) GB2_Sec0_size + GB2_Sec1_size(sec) + GB2_Sec2_size(sec) + 
          + GB2_Sec3_size(sec) + GB2_Sec4_size(sec) + GB2_Sec5_size(sec) + GB2_Sec6_size(sec) 
          + GB2_Sec7_size(sec) + GB2_Sec8_size;

        /* section 0 */
        fwrite((void *) sec[0], sizeof(char), 8, (FILE *) *local);
        uint8_char(size, s);
        fwrite((void *) s, sizeof(char), 8, (FILE *) *local);
        for (i = 1; i <= 7; i++) {
            if (sec[i]) {
                size = uint4(sec[i]);
                fwrite((void *) sec[i], sizeof(char), size, (FILE *) *local);
            }
        }
        s[0] = s[1] = s[2] = s[3] = 55; /* s = "7777" */
        fwrite((void *) s, sizeof(char), 4, (FILE *) *local);
//      fwrite((void *) "7777", sizeof(char), 4, (FILE *) *local);

        if (flush_mode) fflush((FILE *) *local);
    }
    return 0;
}
Пример #2
0
int f_hybrid(ARG0) {
    int pdtsize, n, secsize, k;
    if (mode >= 0) {
	pdtsize =  prod_def_temp_size(sec);     // size of PDT with no extra vert coordinates
	secsize = GB2_Sec4_size(sec);		// size of PDT + vert coordinatese + extras
        n = uint2(&(sec[4][5]));                // number of vert coordinate values
	if (n % 2 != 0) fatal_error_i("vertical coordinate parameters should be in pairs, n=%d", n);
	if (n == 0) return 0;
	if (pdtsize + 4*n > secsize) 
	    fatal_error("not enough space allocated for vertical coordinate data","");
	sprintf(inv_out,"Hybrid levels=%d", n/2);
	inv_out += strlen(inv_out);
	for (k = 1; k <= n/2; k++) {
	    sprintf(inv_out," %d=(%9.6f,%9.6f)", k, (double) ieee2flt(sec[4]+pdtsize+k*8-8),
		(double) ieee2flt(sec[4]+pdtsize+k*8-4));
	    inv_out += strlen(inv_out);
	}
    }
    return 0;
}
Пример #3
0
Файл: JMA.c Проект: erget/wgrib2
/*
 * HEADER:400:JMA:inv:0:inventory for JMA locally defined PDT
 */
int f_JMA(ARG0) {
    int pdt, i, nr;

    int center; 
    if (mode < 0) return 0;
    center = GB2_Center(sec);
    if (center != JMA1 && center != JMA2) return 0;
    pdt = GB2_ProdDefTemplateNo(sec);
    if (pdt < 50000) return 0;
    if (pdt == 51022) {
	sprintf(inv_out,"site=%c%c%c%c", sec[4][24], sec[4][25], sec[4][26], sec[4][27]);
	inv_out += strlen(inv_out);
	if (mode >= 1) {
	    sprintf(inv_out,":site_id#=%u", uint2(sec[4]+28));
	    inv_out += strlen(inv_out);

	    sprintf(inv_out,":site_lon=%lf:site_lat=%lf:site_elev=%.1lfm",int4(sec[4]+18)*1e-6,
		int4(sec[4]+14)*1e-6,int2(sec[4]+22)*0.1) ;
	    inv_out += strlen(inv_out);

	    sprintf(inv_out,":mag_dec=%.2fdeg", int2(sec[4]+30)*0.001);
	    inv_out += strlen(inv_out);

	    sprintf(inv_out,":freq=%ukHz", uint4(sec[4]+32));
	    inv_out += strlen(inv_out);
	    sprintf(inv_out,":pol=%d:opn_mode=%d:reflec=%d", (int) sec[4][36], (int) sec[4][37], (int) sec[4][38]);
	    inv_out += strlen(inv_out);
	    sprintf(inv_out,":qc=%d:cluster_filter=%d", (int) sec[4][39], (int) sec[4][40]);
	    inv_out += strlen(inv_out);
	    sprintf(inv_out,":angle_elev_constant=%.2f", int2(sec[4]+41)*0.01);
	    inv_out += strlen(inv_out);
	}

	nr = GB2_Sec4_size(sec);
	nr = (nr % 4) ? -1 : (nr - 60) / 4;

	if (mode >= 1) {
	    sprintf(inv_out,":Ntheta=%d", nr);
	    inv_out += strlen(inv_out);

	    i = uint_n(sec[4]+55, 3);
	    if (i != 0xffffff) {
	        sprintf(inv_out,":bin_size=%dm", i);
	        inv_out += strlen(inv_out);
	    }
	    if ((sec[4][58] != 255) || (sec[4][59] != 255)) {
	        sprintf(inv_out,":d_theta=%.1lfdeg", int2(sec[4]+58)*0.1);
	        inv_out += strlen(inv_out);
	    }
	}


	if (mode < 2) {
	    sprintf(inv_out,":ele(1)=%.2fdeg", int2(sec[4]+60)*0.01);
	    inv_out += strlen(inv_out);
	    sprintf(inv_out,":ele(%d)=%.2fdeg", nr/2,int2(sec[4]+60+((nr-1)/2)*4)*0.01);
	    inv_out += strlen(inv_out);
	}
	if (mode >= 2) {
	    sprintf(inv_out,"\n:elevation angle(1..Ntheta)=");
	    inv_out += strlen(inv_out);
	    for (i = 0; i < nr; i++) {
		sprintf(inv_out,"%.2f ", int2(sec[4]+60+i*4)*0.01);
		inv_out += strlen(inv_out);
	    }
	    sprintf(inv_out,"\n:pulse repetion freq(1..Ntheta)=");
	    inv_out += strlen(inv_out);
	    for (i = 0; i < nr; i++) {
		sprintf(inv_out,"%.2f ", int2(sec[4]+62+i*4)*0.01);
		inv_out += strlen(inv_out);
	    }
        }
    }
    return 0;
}
Пример #4
0
static int do_ave(struct ave_struct *save) {
    int i, j, n, ndata, pdt;
    float *data;
    unsigned char *p, *sec4;
    double factor;

    sec4 = NULL;
    if (save->has_val == 0) return 0; 
#ifdef DEBUG
printf(" ave nfields=%d missing=%d\n",save->n_fields,save->n_missing);
#endif

    ndata = save->n_sum;
    if ((data = (float *) malloc(sizeof(float) * ndata)) == NULL) fatal_error("ave: memory allocation","");
    factor = 1.0 / save->n_fields;
    for (i = 0; i < ndata; i++) {
    	if (save->n[i] != save->n_fields) data[i] = UNDEFINED;
    	else data[i] = factor * save->sum[i];
#ifdef DEBUG
        if (i < 10) printf("data[%d]=%lf n[%d]=%d, sum[%d]=%lf\n",
	    i,data[i],i,save->n[i],i,save->sum[i]);
#endif
    }

    pdt = GB2_ProdDefTemplateNo(save->first_sec);

    // average of a forecast

    if (pdt == 0) {
        sec4 = (unsigned char *) malloc(58 * sizeof(unsigned char));
	if (sec4 == NULL) fatal_error("fcst_ave: memory allocation","");
	for (i = 0; i < 34; i++) {
	    sec4[i] = save->first_sec[4][i];
	}
	uint_char((unsigned int) 58, sec4);		// length
	sec4[8] = 8;			// pdt
	// verification time
        save_time(save->year2,save->month2,save->day2,save->hour2,save->minute2,save->second2, sec4+34);
	sec4[41] = 1;					// 1 time range
	uint_char(save->n_missing, sec4+42);
	sec4[46] = 0;					// average
	sec4[47] = 2;					// rt=constant, ft++
	sec4[48] = save->dt_unit;					// total length of stat processing
	uint_char(save->dt*(save->n_fields+save->n_missing-1), sec4+49);
	sec4[53] = save->dt_unit;					// time step
	uint_char(save->dt, sec4+54);
    }

    // average of an ensemble forecast, use pdt 4.11

    else if (pdt == 1) {
        sec4 = (unsigned char *) malloc(61 * sizeof(unsigned char));
        if (sec4 == NULL) fatal_error("fcst_ave: memory allocation","");
        for (i = 0; i < 37; i++) {
            sec4[i] = save->first_sec[4][i];
        }
        uint_char((unsigned int) 61, sec4);             // length
        sec4[8] = 11;                    // pdt
        // verification time
        save_time(save->year2,save->month2,save->day2,save->hour2,save->minute2,save->second2, sec4+37);
        sec4[44] = 1;                                   // 1 time range
        uint_char(save->n_missing, sec4+45);
        sec4[49] = 0;                                   // average
        sec4[50] = 2;                                   // rt=constant, ft++
        sec4[51] = save->dt_unit;                                       // total length of stat processing
        uint_char(save->dt*(save->n_fields+save->n_missing-1), sec4+52);
        sec4[56] = save->dt_unit;                                       // time step
        uint_char(save->dt, sec4+57);
    }

    // average of an average or accumulation

    else if (pdt == 8) {
	i = GB2_Sec4_size(save->first_sec);
	n = save->first_sec[4][41];
	if (i != 46 + 12*n) fatal_error("ave: invalid sec4 size for pdt=8","");

        // keep pdt == 8 but make it 12 bytes bigger
        sec4 = (unsigned char *) malloc( (i+12) * sizeof(unsigned char));
	if (sec4 == NULL) fatal_error("fcst_ave: memory allocation","");

	uint_char((unsigned int) i+12, sec4);		// new length

	for (i = 4; i < 34; i++) {			// keep base of pdt
	    sec4[i] = save->first_sec[4][i];
	}
	
	// new verification time
        save_time(save->year2,save->month2,save->day2,save->hour2,save->minute2,save->second2, sec4+34);

	// number of stat-proc loops is increased by 1
	sec4[41] = n + 1;

	// copy old stat-proc loops 
	// for (j = n*12-1;  j >= 0; j--) sec4[58+j] = save->first_sec[4][46+j];
	for (j = 0; j < n*12; j++) sec4[46+12+j] = save->first_sec[4][46+j];

#ifdef DEBUG
printf("save->n_missing =%d save->n_fields=%d\n",save->n_missing,save->n_fields);
#endif
	uint_char(save->n_missing, sec4+42);
	sec4[46] = 0;			// average
	sec4[47] = 2;			// fcst++
	sec4[48] = save->dt_unit;						// total length of stat processing
	uint_char(save->dt*(save->n_fields+save->n_missing-1), sec4+49);	// missing
	sec4[53] = save->dt_unit;						// time step
	uint_char(save->dt, sec4+54);

    }
    else {
	fatal_error_i("ave with pdt %d is not supported",pdt);
    }


    // write grib file
    p = save->first_sec[4];
    save->first_sec[4] = sec4;

    grib_wrt(save->first_sec, data, ndata, save->nx, save->ny, 
	save->use_scale, save->dec_scale, save->bin_scale, 
	save->wanted_bits, save->max_bits, save->grib_type, save->output);

    if (flush_mode) fflush(save->output);
    save->first_sec[4] = p;
    free(data);
    free(sec4);
    return 0;
}