/*********************************************************** SUBROUTINE GEOREADTOMASK GEOREAD READS ALL RECORD NUMBERS OF PROFILES IN A USER SPECIFIED GRID BOX. IT DOES THIS BY FIRST GETTING INFORMATION ON THE SPECIFIED GRID BOX ( NUMBER OF PROFILES IN GRID BOX AND LOCATION OF FIRST RECORD NUMBER FOR GRID BOX IN PRIMARY MASK) FROM A SECONDARY MASK FILE. USING THIS INFORMATION, THE ACTUAL PROFILE NUMBERS ARE READ INTO A MASK **************************************************************/ /************************************************************* DEFINE IN AS A TWO INTEGER STRUCTURE. THE FIRST INTEGER, IN.NUM IS THE NUMBER OF PROFILES IN A GRID BOX. THE SECOND INTEGER, IN.REC, IS THE LOCATION IN THE PRIMARY FILE OF THE FIRST PROFILE RECORD NUMBER IN THE SPECIFIED GRID BOX. **************************************************************/ struct write2 in; georeadtomask_( int *lon, /* CHOSEN LONGITUDE */ int *lat, /* CHOSEN LATITUDE */ int *numpros, /* NUMBER OF PROFILES AT A GRID POINT */ int *idim, /* NUMBER OF LONGITUDE SPACINGS */ int *fn1, /* FILE NUMBER OF PRIMARY FILE */ int *fn2, /* FILE NUMBER OF SECONDARY FILE */ int *fnout /* OUTPUT FILE NUMBER */ ) { /********************************************************* PARAMETERS: SEEKNUM - POSITION OF DESIRED INFORMATION IN SECONDARY FILE. THIS NUMBER IS DETERMINED FROM THE INPUT LATITUDE MINUS ONE MULTIPLIED BY THE LONGITUDE SPACING, PLUS THE INPUT LONGITUDE MINUS ONE. IGRIDPOS - STATION POSITIONS READ IN ***********************************************************/ int seeknum,i,igridpos; /********************************************************** CALCULATE SECONDARY MASK POSITION ***********************************************************/ seeknum = *idim * ( *lat - 1 ) + *lon - 1; /********************************************************** MOVE FILE POINTER TO CORRECT POSITION IN SECONDARY FILE. ***********************************************************/ fseek( fp[*fn2], seeknum * sizeof( struct write2 ), SEEK_SET ); /********************************************************** READ NUMBER OF PROFILES IN GRID BOX ( IN.NUM ) AND LOCATION OF FIRST PROFILE ( IN.REC ). ***********************************************************/ fread( &in, sizeof( struct write2 ), 1, fp[*fn2] ); /********************************************************** SET NUMPROS TO THE NUMBER OF PROFILES. ***********************************************************/ *numpros = in.num; /*********************************************************** USE LOCATION OF FIRST PROFILE TO MOVE FILE POINTER TO CORRECT POSITION IN PRIMARY FILE. ************************************************************/ fseek( fp[*fn1], in.rec * sizeof( int ), SEEK_SET ); /*********************************************************** READ IN PROFILE RECORD NUMBERS WRITE OUT TO FILE ************************************************************/ for ( i = 1; i <= in.num; i++ ) { fread( &igridpos, sizeof( int ), 1, fp[*fn1] ); fwrite( &igridpos, sizeof(int ), 1, fp[*fnout]); } }