/****************************************************************************** Hydrological Regions HyRegion.c A.Kondoh 2001 input 1) Precipitation (BSQ) 2) Water Surplus (BSQ) 3) Water Deficit (BSQ) Regions 1) Region A1: water surplus all year around (ATS>400mm) 2) Region A2: water surplus all yeay around (ATS<400mm) 3) Region B1: water surplus with some months deficit (ATD <200 mm) 4) Region B2: water surplus with some months deficit (ATD >200 mm) 5) Region C1: water deficit with some months surplus (ATD <200 mm) 6) Region C2: water deficit with some months surplus (ATD >200 mm) 7) Region D1: water deficit all year around (ATD <200 mm) 8) Region D2: water deficit all year around (ATD >200 mm) ATS means annual total surplus of water. ATD means annual total deficit of water. ******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FILE_ERR -1 #define SE stderr short Ep[13][360][720]; /* Ep: used as ocean mask */ short Pr[13][360][720]; /* monthly precipitation */ short Surplus[13][360][720]; /* Water surplus */ short Deficit[13][360][720]; /* Water deficit */ unsigned char HyRegion[360][720]; /*----------------------------------------------------------------------------- Main -----------------------------------------------------------------------------*/ void main(argc,argv) int argc; char *argv[]; { int month; int i,j; int fp,fs,fd,fo,fe; int SumSurplus=0; int SumDeficit=0; int CountSurplus=0; int CountDeficit=0; /* open parameter file */ if(argc!=6){ printf("HyRegion [precipitation] [surplus] [deficit] [output] [Ep]\n"); exit(-1); } if( (fp=open(argv[1],O_BINARY | O_RDONLY))==FILE_ERR){ fprintf(SE,"Can't open %s.\n",argv[1]); exit(-1); } if( (fs=open(argv[2],O_BINARY | O_RDONLY))==FILE_ERR){ fprintf(SE,"Can't open %s.\n",argv[2]); exit(-1); } if( (fd=open(argv[3],O_BINARY | O_RDONLY))==FILE_ERR){ fprintf(SE,"Can't open %s.\n",argv[3]); exit(-1); } if( (fo=open(argv[4],O_RDWR | O_TRUNC | O_CREAT | O_BINARY, S_IREAD | S_IWRITE))==FILE_ERR){ fprintf(SE,"Can't open %s.\n",argv[4]); exit(-1); } if( (fe=open(argv[5],O_BINARY | O_RDONLY))==FILE_ERR){ fprintf(SE,"Can't open %s.\n",argv[5]); exit(-1); } /* input */ for(month=1;month<=12;month++){ for(i=0;i<360;i++){ read(fp,Pr[month][i],720*2); read(fs,Surplus[month][i],720*2); read(fd,Deficit[month][i],720*2); read(fe,Ep[month][i],720*2); } } /* calculation */ for(i=0;i<360;i++){ if(!(i%10)){ printf("*"); } for(j=0;j<720;j++){ SumSurplus=0; SumDeficit=0; CountSurplus=0; CountDeficit=0; for(month=1;month<=12;month++){ SumSurplus+=(int)Surplus[month][i][j]; SumDeficit+=(int)Deficit[month][i][j]; if(Surplus[month][i][j]>0) CountSurplus++; if(Deficit[month][i][j]>0) CountDeficit++; } /* Ocean */ if(Ep[1][i][j]<0){ HyRegion[i][j]=0; /* ocean (P=-999) */ continue; } /* note) unit 0.1mm /* Region A1: water surplus all year around (ATS>400mm) */ if( ((CountSurplus==12) || (CountDeficit==0)) && SumSurplus>=4000){ HyRegion[i][j]=1; continue; } /* Region A2: water surplus all yeay around (ATS<400mm) */ if( ((CountSurplus==12) || (CountDeficit==0)) && SumSurplus<4000){ HyRegion[i][j]=2; continue; } /* Region B1: water surplus with some months deficit (ATD <200 mm) */ if(CountSurplus>0 && CountDeficit>0){ if(SumSurplus>=SumDeficit && SumDeficit<2000){ HyRegion[i][j]=3; continue; } } /* Region B2: water surplus with some months deficit (ATD >200 mm) */ if(CountSurplus>0 && CountDeficit>0){ if(SumSurplus>SumDeficit && SumDeficit>=2000){ HyRegion[i][j]=4; continue; } } /* Region C1: water deficit with some months surplus (ATD <200 mm) */ if(CountSurplus>0 && CountDeficit>0){ if(SumSurplus<=SumDeficit && SumDeficit<2000){ HyRegion[i][j]=5; continue; } } /* Region C2: water deficit with some months surplus (ATD >200 mm) */ if(CountSurplus>0 && CountDeficit>0){ if(SumSurplus<=SumDeficit && SumDeficit>=2000){ HyRegion[i][j]=6; continue; } } /* Region D1: water deficit all year around (ATD <200 mm) */ if( (CountDeficit==12) || (CountSurplus==0) ){ if(SumDeficit<2000){ HyRegion[i][j]=7; continue; } } /* Region D2: water deficit all year around (ATD >200 mm) */ if( (CountDeficit==12) || (CountSurplus==0) ){ if(SumDeficit>=2000){ HyRegion[i][j]=8; continue; } } }/* next pixel */ }/* next line */ /* output */ for(i=0;i<360;i++){ write(fo,HyRegion[i],720); } printf("\n"); }/* end of main */