int main(int argc, char *argv[]) { int nrows, ncols; int row, col; struct GModule *module; struct Option *input1, *input2, *input3, *input4, *input5, *input6; struct Option *output1; struct History history; /*metadata */ struct Colors colors; char *result1; /*output raster name */ int infd_fpar, infd_luf, infd_lat; int infd_doy, infd_tsw, infd_wa; int outfd1; char *fpar, *luf, *lat, *doy, *tsw, *wa; void *inrast_fpar, *inrast_luf, *inrast_lat; void *inrast_doy, *inrast_tsw, *inrast_wa; DCELL * outrast1; CELL val1, val2; /************************************/ G_gisinit(argv[0]); module = G_define_module(); G_add_keyword(_("imagery")); G_add_keyword(_("biomass")); G_add_keyword(_("fpar")); G_add_keyword(_("yield")); module->description = _("Computes biomass growth, precursor of crop yield calculation."); /* Define the different options */ input1 = G_define_standard_option(G_OPT_R_INPUT); input1->key = "fpar"; input1->description = _("Name of fPAR raster map"); input2 = G_define_standard_option(G_OPT_R_INPUT); input2->key = "lightuseefficiency"; input2->description = _("Name of light use efficiency raster map (UZB:cotton=1.9)"); input3 = G_define_standard_option(G_OPT_R_INPUT); input3->key = "latitude"; input3->description = _("Name of degree latitude raster map [dd.ddd]"); input4 = G_define_standard_option(G_OPT_R_INPUT); input4->key = "dayofyear"; input4->description = _("Name of Day of Year raster map [1-366]"); input5 = G_define_standard_option(G_OPT_R_INPUT); input5->key = "transmissivitysingleway"; input5->description = _("Name of single-way transmissivity raster map [0.0-1.0]"); input6 = G_define_standard_option(G_OPT_R_INPUT); input6->key = "wateravailability"; input6->description = _("Value of water availability raster map [0.0-1.0]"); output1 = G_define_standard_option(G_OPT_R_OUTPUT); output1->description = _("Name for output daily biomass growth raster map [kg/ha/d]"); /********************/ if (G_parser(argc, argv)) exit(EXIT_FAILURE); fpar = input1->answer; luf = input2->answer; lat = input3->answer; doy = input4->answer; tsw = input5->answer; wa = input6->answer; result1 = output1->answer; /***************************************************/ infd_fpar = Rast_open_old(fpar, ""); inrast_fpar = Rast_allocate_d_buf(); infd_luf = Rast_open_old(luf, ""); inrast_luf = Rast_allocate_d_buf(); infd_lat = Rast_open_old(lat, ""); inrast_lat = Rast_allocate_d_buf(); infd_doy = Rast_open_old(doy, ""); inrast_doy = Rast_allocate_d_buf(); infd_tsw = Rast_open_old(tsw, ""); inrast_tsw = Rast_allocate_d_buf(); infd_wa = Rast_open_old(wa, ""); inrast_wa = Rast_allocate_d_buf(); nrows = Rast_window_rows(); ncols = Rast_window_cols(); outrast1 = Rast_allocate_d_buf(); /* Create New raster files */ outfd1 = Rast_open_new(result1, DCELL_TYPE); /* Process pixels */ for (row = 0; row < nrows; row++) { DCELL d; DCELL d_fpar; DCELL d_luf; DCELL d_lat; DCELL d_doy; DCELL d_tsw; DCELL d_solar; DCELL d_wa; G_percent(row, nrows, 2); /* read input maps */ Rast_get_d_row(infd_fpar, inrast_fpar, row); Rast_get_d_row(infd_luf,inrast_luf,row); Rast_get_d_row(infd_lat, inrast_lat, row); Rast_get_d_row(infd_doy, inrast_doy, row); Rast_get_d_row(infd_tsw, inrast_tsw, row); Rast_get_d_row(infd_wa,inrast_wa,row); /*process the data */ for (col = 0; col < ncols; col++) { d_fpar = ((DCELL *) inrast_fpar)[col]; d_luf = ((DCELL *) inrast_luf)[col]; d_lat = ((DCELL *) inrast_lat)[col]; d_doy = ((DCELL *) inrast_doy)[col]; d_tsw = ((DCELL *) inrast_tsw)[col]; d_wa = ((DCELL *) inrast_wa)[col]; if (Rast_is_d_null_value(&d_fpar) || Rast_is_d_null_value(&d_luf) || Rast_is_d_null_value(&d_lat) || Rast_is_d_null_value(&d_doy) || Rast_is_d_null_value(&d_tsw) || Rast_is_d_null_value(&d_wa)) Rast_set_d_null_value(&outrast1[col], 1); else { d_solar = solar_day(d_lat, d_doy, d_tsw); d = biomass(d_fpar,d_solar,d_wa,d_luf); outrast1[col] = d; } } Rast_put_d_row(outfd1, outrast1); } /* Color table for biomass */ Rast_init_colors(&colors); val1 = 0; val2 = 1; Rast_add_c_color_rule(&val1, 0, 0, 0, &val2, 255, 255, 255, &colors); G_free(inrast_fpar); G_free(inrast_luf); G_free(inrast_lat); G_free(inrast_doy); G_free(inrast_tsw); G_free(inrast_wa); G_free(outrast1); Rast_close(infd_fpar); Rast_close(infd_luf); Rast_close(infd_lat); Rast_close(infd_doy); Rast_close(infd_tsw); Rast_close(infd_wa); Rast_close(outfd1); Rast_short_history(result1, "raster", &history); Rast_command_history(&history); Rast_write_history(result1, &history); exit(EXIT_SUCCESS); }
int main( int argc, char *argv[] ) { if( argc < 7 ) { usage(); return 1; } int row, col; double geomx[6]={0.0}; char *inB1 = argv[1]; //Albedo char *inB2 = argv[2]; //DEM char *inB3 = argv[3]; //e0 31 char *inB4 = argv[4]; //e0 32 char *inB5 = argv[5]; //LST char *rnetdF = argv[6]; float doy = atof( argv[7] ); // printf("\ndoy\t= %7.2f\n\n",doy); // printf("%s %s %s %s %s\n",inB1, inB2, inB3, inB4, inB5); GDALAllRegister(); GDALDatasetH hD1 = GDALOpen(inB1,GA_ReadOnly);//Albedo GDALDatasetH hD2 = GDALOpen(inB2,GA_ReadOnly);//DEM GDALDatasetH hD3 = GDALOpen(inB3,GA_ReadOnly);//E 31 GDALDatasetH hD4 = GDALOpen(inB4,GA_ReadOnly);//E 32 GDALDatasetH hD5 = GDALOpen(inB5,GA_ReadOnly);//LST if(hD1==NULL||hD2==NULL||hD3==NULL||hD4==NULL||hD5==NULL){ printf("One or more input files "); printf("could not be loaded\n"); exit(1); } if(GDALGetGeoTransform(hD1,geomx)==CE_None){ /* Do Nothing */ // printf( "Origin (ULx,ULy) = (%.6f,%.6f)\n", geomx[0], geomx[3] ); // printf( "Pixel Size = (%.6f,%.6f)\n", geomx[1], geomx[5] ); // printf( "Rot0 = (%.6f,%.6f)\n", geomx[2], geomx[4] ); } else { printf("ERROR: Projection acquisition problem from Band1\n"); exit(1); } GDALDriverH hDr2 = GDALGetDatasetDriver(hD2); //RNETD out GDALDatasetH hDOut = GDALCreateCopy( hDr2, rnetdF,hD2,FALSE,NULL,NULL,NULL); GDALRasterBandH hBOut = GDALGetRasterBand(hDOut,1); GDALRasterBandH hB1 = GDALGetRasterBand(hD1,1);//Albedo GDALRasterBandH hB2 = GDALGetRasterBand(hD2,1);//DEM GDALRasterBandH hB3 = GDALGetRasterBand(hD3,1);//E 31 GDALRasterBandH hB4 = GDALGetRasterBand(hD4,1);//E 32 GDALRasterBandH hB5 = GDALGetRasterBand(hD5,1);//LST int nX = GDALGetRasterBandXSize(hB1); int nY = GDALGetRasterBandYSize(hB1); float *mat1 = (float *) malloc(sizeof(float)*nX); float *mat2 = (float *) malloc(sizeof(float)*nX); float *mat3 = (float *) malloc(sizeof(float)*nX); float *mat4 = (float *) malloc(sizeof(float)*nX); float *mat5 = (float *) malloc(sizeof(float)*nX); float *matOut = (float *) malloc(sizeof(float)*nX); /* int i,temp,histogramT[512]; for (i=0;i<512;i++){ histogramT[i]=0; }*/ float solar, rnetd, e0; for(row=0;row<nY;row++){ GDALRasterIO(hB1,GF_Read,0,row,nX,1,mat1,nX,1,GDT_Float32,0,0); GDALRasterIO(hB2,GF_Read,0,row,nX,1,mat2,nX,1,GDT_Float32,0,0); GDALRasterIO(hB3,GF_Read,0,row,nX,1,mat3,nX,1,GDT_Float32,0,0); GDALRasterIO(hB4,GF_Read,0,row,nX,1,mat4,nX,1,GDT_Float32,0,0); GDALRasterIO(hB5,GF_Read,0,row,nX,1,mat5,nX,1,GDT_Float32,0,0); #pragma omp parallel for default(none) \ private(col, solar, rnetd, e0)\ shared( row, doy, geomx,nX, \ mat1, mat2, mat3, mat4, mat5, matOut ) for(col=0;col<nX;col++){ if(mat1[col]==-28768||mat5[col]==-28768||mat5[col]==0){ matOut[col] = -28768; }else { /*temp = (int) (mat1[col]); if(temp>0) histogramT[temp]=histogramT[temp]+1.0;*/ // printf("lat=%f\n", geomx[3]+geomx[4]*col+geomx[5]*row); // printf("%f \n",e0); e0 = 0.5*((mat3[col]*0.002+0.49)+(mat4[col]*0.002+0.49)); solar = solar_day(geomx[3]+geomx[4]*col+geomx[5]*row, doy, mat2[col] ); //rnetd = r_net_d( mat1[col]*0.001, solar, e0, mat5[col]*0.02, mat2[col]); rnetd = r_net_day( mat1[col]*0.001, solar, mat2[col]); matOut[col]=rnetd; } } #pragma omp barrier GDALRasterIO(hBOut,GF_Write,0,row,nX,1,matOut,nX,1,GDT_Float32,0,0); } GDALClose(hDOut); /* for (i=0;i<512;i++){ printf("%i\t%i\n",i,histogramT[i]); }*/ //free memory close unused files if(mat1 != NULL) free(mat1); if(mat2 != NULL) free(mat2); if(mat3 != NULL) free(mat3); if(mat4 != NULL) free(mat4); if(mat5 != NULL) free(mat5); if(matOut != NULL) free(matOut); GDALClose(hD1); GDALClose(hD2); GDALClose(hD3); GDALClose(hD4); GDALClose(hD5); return(EXIT_SUCCESS); }