/********************************************************************* SUBROUTINE DEPTHMASK DEPTHMASK MASKS OUT INDIVIDUAL DEPTHS ACCORDING TO INFORMATION IN MASK FILES. **********************************************************************/ /********************************************************************* DEFINE TWOREAD AS A WRITE2 (TWO INTEGER) STRUCTURE. TWOREAD WILL HAVE TWO INTEGERS, TWOREAD.NUM WHICH IS PROFILE RECORD NUMBER AND TWOREAD.REC WHICH IS DEPTH NUMBER. DEFINE GPRESENT AS AN INTEGER ARRAY OF SIZE MAXMASK. THIS WILL HOLD THE PRESENT DEPTH NUMBER. **********************************************************************/ struct write2 tworead; int gpresent[MAXMASK]; depthmask_( int *maxlevel, /* MAXIMUM NUMBER OF LEVELS */ int *jj, /* HEADER RECORD NUMBER */ int *fn, /* FILE IDENTIFICATION NUMBERS FOR MASK FILES */ int *nmask, /* FIRST MASK NUMBER */ int *nmaskd, /* LAST MASK NUMBER */ float *temp, /* PARAMETER DATA */ int *ipn, /* PARAMETER CODE NUMBER FOR EACH MASK */ int *count, /* COUNTS NUMBER OF ALTERED DEPTHS */ int *count2, /* COUNTS NUMBER OF ALTERED PROFILES */ int *endall, /* NUMBER OF ENDS OF FILE MARKERS REACHED */ int *ireqpars, /* REQUESTED PARAMETERS */ int *ip2, /* REQUESTED PARAMETER CODES */ int *numdeps, /* NUMBER OF DEPTHS */ float *missing, /* MISSING VALUE MARKER */ int *paramcalc /* NUMBER OF CALCULATED PARAMETERS */ ) { /********************************************************** PARAMETERS: K - MASK NUMBER I2 - PROPER PARAMETER POSITION FOR ARRAY TEMP I3 - PROPERE PARAMETER POSITION FOR ARRAY COUNT I0 - PARAMETER COUNTER I - PARAMETER CODE IJ - DEPTH COUNTER ***********************************************************/ int k,i2,i3,i0,i,ij,gp,numextra,i2x,ifull=0; int i2max= *maxlevel * *(ip2+ *maxlevel); /*********************************************************** SET ALL ALTERED PROFILE COUNTS TO THEIR NEGATIVE WHEN THEY ARE AGAIN POSITIVE, THE PROFILE HAS BEEN ALTERED FOR THIS PARAMETER ************************************************************/ for ( i0 = 1; i0 <= *ireqpars; i0++) *(count2+*(ip2+i0)) = 0 - *(count2+*(ip2+i0)); /********************************************************** EXAMINE EACH MASK TO SEE ITS PRESENT RECORD NUMBER (JPRESENT) AND IF THIS NUMBER NEEDS TO BE UPDATED (IF IT IS LESS THAN PRESENT RECORD NUMBER). ***********************************************************/ for ( k = *nmask; k < *nmaskd; k++ ) { /********************************************************** EXAMINE A MASK ONLY IF IT HAS NOT YET BEEN ENTIRELY READ IN. ***********************************************************/ if ( !feof( fp[*(fn+k)] ) ) { /********************************************************** READ IN VALUES FROM FILE UNTIL THE PRESENT MASK RECORD NUMBER IS EQUAL TO OR GREATER THAN THE PRESENT PROFILE RECORD NUMBER. ***********************************************************/ while ( jpresent[k] < *jj && !feof( fp[*(fn+k)] ) ) { /*********************************************************** READ IN PROFILE RECORD NUMBER AND DEPTH NUMBER TO BE MASKED ************************************************************/ fread( &tworead, sizeof( struct write2 ), 1, fp[*(fn+k)] ); /*********************************************************** SET PRESENT RECORD NUMBER (JPRESENT) AND DEPTH NUMBER (GPRESENT) TO LAST VALUES READ IN. SUBTRACT ONE FROM DEPTH NUMBER SO IT REFLECTS CORRECT LEVEL. ************************************************************/ jpresent[k] = tworead.num; gpresent[k] = tworead.rec; if ( gpresent[k] != 0 ) gpresent[k] -=1; else gpresent[k] = -999; } /*********************************************************** IF END OF FILE HAS NOT BEEN REACHED, CONTINUE ************************************************************/ if ( !feof( fp[*(fn+k)] )) { /*********************************************************** SET I2 ACCORDING TO THE PARAMETER REPRESENTED BY THE MASK ************************************************************/ i2 = *maxlevel * ( *(ipn+k) - 1 ); i3 = *maxlevel * *(ipn+k); /*********************************************************** IF THE PRESENT RECORD NUMBER EQUALS THE PRESENT MASK RECORD NUMBER AND THE END OF FILE HAS NOT BEEN REACHED, MASK OUT ALL DEPTHS WHICH ARE IN THE MASK FILE FOR THIS PROFILE. THEN READ IN THE NEXT STRUCTURE FROM THE MASK FILE. ************************************************************/ while ( jpresent[k] == *jj && !feof( fp[*(fn+k)] ) ) { if ( gpresent[k] > -999 ) { if ( gpresent[k] < *maxlevel ) { i2x=0; gp= gpresent[k]; } else { numextra= (gpresent[k]/ *maxlevel) * *maxlevel; i2x= (*(ip2 + *maxlevel) + 2 + *paramcalc)*numextra; gp = gpresent[k] - numextra; } /********************************************************** COUNT + I2MAX IS THE TOTAL NUMBER OF HITS FOR THIS PROFILE ***********************************************************/ *(count+i2max) +=1; /*********************************************************** IF THIS MASK REPRESENTS A CERTAIN PARAMETER, ADD ONE TO THE COUNTER OF PROFILES MASKED FOR THIS PARAMETER. ************************************************************/ if ( *(ipn+k) > 0 && *(count2+*(ipn+k)) <= 0 ) { if ( gp <= -1 || *(temp+ i2x+i2+gp ) > *missing ) *(count2+*(ipn+k)) = 0 - *(count2+*(ipn+k)) + 1; } /*********************************************************** IF THIS MASK REPRESENTS ALL PARAMETERS, ADD ONE TO EACH COUNTER ************************************************************/ else if ( *(ipn+k) == 0 ) { for ( i0 = 1; i0 <= *ireqpars; i0++) { if ( *(count2+*(ip2+i0)) <= 0 ) { if ( *(ip2+i0) == 0 || gp <= -1 || *(temp+ i2x+i2+gp) > *missing ) *(count2+*(ip2+i0)) = 0 - *(count2+*(ip2+i0)) + 1; } } } /*********************************************************** THE LAST ALTERNATIVE MASK REPRESENTING BOTH TEMPERATURE AND SALINITY (VALUE OF IPN IS -1). IN THIS CASE ADD ONE TO BOTH TEMPERATURE AND SALINITY COUNTERS. ************************************************************/ else if ( *(ipn + k) < 0 ) { if ( gp <= -1 || *(temp+ i2x + gp) > *missing ) if ( *(count2+1) <=0 ) *(count2+1) = 0 - *(count2+1) + 1; if ( gp <= -1 || *(temp+ *maxlevel + i2x + gp) > *missing ) if ( *(count2+2) <=0) *(count2+2) = 0 - *(count2+2) + 1; } /***************************************************** IF THIS IS A SINGLE PARAMETER MASK, MASK OUT ONLY THE PRESCRIBED VALUES FOR THIS ONE PARAMETER. ******************************************************/ if ( *(ipn+k) > 0 ) { /***************************************************** A VALUE OF -1 OR LESS FOR DEPTH NUMBER MEANS TO MASK THE ENTIRE PROFILE. MASK OUT THE PARAMETER FOR EACH DEPTH AND ADD ONE TO THE INDIVIDUAL DEPTH COUNTER AT EACH DEPTH. ******************************************************/ if ( gp <= -1 ) { ifull = 1; for ( ij = 0; ij < *numdeps; ij++ ) { if ( ij < *maxlevel ) { i2x=0; gp = ij; } else { numextra= (ij/ *maxlevel) * *maxlevel; i2x= (*(ip2 + *maxlevel) + 2 + *paramcalc)*numextra; gp = ij - numextra; } *(temp + ij + i2 +i2x) = *missing; (*(count+ ij + i3 + i2x)) +=1; } } /******************************************************* OTHERWISE MASK OUT ONLY THE VALUE PRESCRIBED IN GPRESENT ********************************************************/ else { *( temp + gp + i2 + i2x) = *missing; (*(count+ gp + i3 + i2x)) +=1; } } /***************************************************** IF THE MASK REPRESENTS ALL PARAMETERS (IPN = 0) MASK OUT EACH PARAMETER. ******************************************************/ else if ( *(ipn+k) == 0 ) { /***************************************************** RUN THROUGH EACH REQUESTED PARAMETER ******************************************************/ for ( i0 = 1; i0 <= *ireqpars; i0++ ) { /***************************************************** SET PROPER PARAMETER CODE AND POSITION MARKER ******************************************************/ i = *(ip2+i0); i2 = *maxlevel * ( i - 1 ); i3 = *maxlevel * i; /***************************************************** MASK OUT PRESCRIBED LEVEL AND ADD ONE TO PROPER COUNTER ******************************************************/ if ( i == 0 ||*( temp + gp + i2 +i2x) > *missing ) { if ( i != 0 ) *( temp + gp + i2 +i2x ) = *missing; *( count+ gp + i2x + i3 ) +=1; } } } /***************************************************** IF IPN IS LESS THAN ZERO, MASK OUT THE PRESCRIBED LEVEL FOR TEMPERATURE AND SALINITY, AND ADD ONE TO EACH COUNTER. *******************************************************/ else { *( temp + gp + i2x + *maxlevel ) = *missing; *( temp + gp + i2x ) = *missing; (*( count + gp + i2x + *maxlevel )) +=1; (*( count + gp + i2x + 2* *maxlevel )) +=1; } } /************************************************************* READ IN THE NEXT RECORD AND DEPTH NUMBER FROM FILE. **************************************************************/ fread( &tworead, sizeof ( struct write2 ), 1, fp[*(fn+k)] ); jpresent[k] = tworead.num; gpresent[k] = tworead.rec; if ( gpresent[k] != 0 ) gpresent[k] -=1; else gpresent[k] = -999; } /************************************************************* IF THIS IS THE END OF FILE, ADD ONE TO END OF FILE COUNTER. **************************************************************/ } if ( feof( fp[*(fn+k)] )) *endall += 1; } } /*********************************************************** RESET COUNTER IF A FULL PARAMETER MASK WAS SET ************************************************************/ if ( ifull == 1 ) { *(count + i2max) *= -1; ifull=0; } /*********************************************************** RESET ALL ALTERED PROFILE COUNTS TO THE POSITIVE ************************************************************/ for ( i0 = 1; i0 <= *ireqpars; i0++) { if ( *(count2+*(ip2+i0)) < 0 ) *(count2+*(ip2+i0)) = 0 - *(count2+*(ip2+i0)); } }