/***************************************************************** SUBROUTINE READDATA READDATA READS IN PROFILE INFORMATION FROM DIRECT ACCESS C FILES. THERE IS ONE FILE FOR THE HEADER INFORMATION, ONE FILE FOR OBSERVED DEPTHS, AND TWO FILES FOR EACH PARAMETER MEASURED BY THE PROBE TYPE BEING INVESTIGATED, ONE FOR OBSERVED LEVEL DATA AND ONE FOR STANDARD LEVEL DATA. READDATA CAN READ IN ALL PARAMETERS FOR A PROFILE OR A SUBSET OF THE TOTAL NUMBER OF PARAMETERS FOR A PROFILE (WITHOUT READING THE REMAINING PARAMETERS). READDATA CAN READ IN ANY PROFILE NUMBER IN A FILE IMMEDIATELY WITHOUT READING ANY OTHER PROFILES. SUBROUTINE STEPS: 1. SET PRELIMARY VARIABLES 2. READ IN MAIN HEADER INFORMATION, DATE, TIME, AND POSITION OF PROFILE ALONG WITH COUNTRY AND CRUISE CODES IF AVAILABLE. 3. RUN THROUGH ALL REQUESTED PARAMETERS, IF A REQUESTED PARAMETER EXISTS FOR THIS PROBE, READ IN THE DATA FROM THE PROPER FILE. IF THIS IS THE FIRST PARAMETER READ IN AND OBSERVED LEVELS ARE BEING INVESTIGATED, ALSO READ IN DEPTH DATA. 4. ALTER *OLDRECORD TO REFLECT THE PRESENT FILE POINTER POSITION *******************************************************************/ /****************************************************************** MAKE THREEDATA A WRITE3FS STRUCTURE. THIS IS A STRUCTURE WITH TWO INTEGERS (NUM,GEO) AND ONE REAL (REC). THREEDATA IS FOR RECORDING BIOLOGICAL DATA AND SECOND HEADER INFORMATION. NUM IS PARAMETER CODE, GEO IS NUMBER OF SIGNIFICANT FIGURES. THE REAL IS PARAMETER VALUE. GEO IS A SHORT INTEGER. MAKE TWODATA A WRITE2FS STRUCTURE. THIS IS A STRUCTURE WITH ONE SHORT INTEGER (NUM) AND ONE REAL (REC). TWODATA IS FOR RECORDING ALL PARAMETERS EXCEPT BIOLOGICAL AND SECOND HEADER. NUM IS NUMBER OF SIGNIFICANT FIGURES. REC IS THE PARAMETER VALUE *******************************************************************/ struct write2fs twodata2[maxlev]; readdata_( char ccx[], /* HEADER INFORMATION: NODC COUNTRY CODE, CONSISTS OF TWO CHARACTERS. SEE APPENDIX IN OCL DATA SYSTEMS INSTRUCTION MANUAL FOR CODE DESCRIPTIONS. */ float *tempptr, /* PARAMETER DATA: IN FORTRAN THIS IS A TWO DIMENSIONAL ARRAY ARRANGED AS TEMP(MAXLEVELS,MAXPARMS), RECORDING OBSERVATIONS AT EACH DEPTH LEVEL FOR EACH PARAMETER. */ int *ndeps, /* HEADER INFORMATION : NUMBER OF DEPTHS; *NDEPS IS NUMBER OF OBSERVED DEPTHS, *(NDEPS+1) IS NUMBER OF STANDARD DEPTHS FOR A PROFILE */ int *jj, /* HEADER INFORMATION: PROFILE NUMBER; THIS NUMBER IS USED TO FIND THE POSITION IN THE HEADER FILE TO STORE INFORMATION ABOUT THE PROFILE IN QUESTION */ int *year, /* HEADER INFORMATION: YEAR OF PROFILE (FOUR DIGITS; I.E. 1955 ) */ int *month, /* HEADER INFORMATION: MONTH OF PROFILE (ONE OR TWO DIGITS; I.E. 2 IS FEBRUARY ) */ int *day, /* HEADER INFORMATION: DAY OF PROFILE (ONE OR TWO DIGITS) */ float *time, /* HEADER INFORMATION: GREENWICH MEAN TIME OF PROFILE IN HOURS TO THOUSANDTHS */ int *cruise, /* HEADER INFORMATION: NODC CRUISE NUMBER (ONLY FOR NODC ARCHIVE DATA */ float *lat, /* HEADER INFORMATION: LATITUDE OF PROFILE DEGREES TO THOUSANDTHS, NEGATIVE VALUES ARE SOUTHERN LATITUDES */ float *lon, /* HEADER INFORMATION: LONGITUDE OF PROFILE IN DEGREES TO THOUSANDTHS, NEGATIVE VALUES ARE WESTERN LONGITUDES */ int *startpoint, /* PROFILE NUMBER CORRESPONDING TO PRESENT HEADER FILE POINTER POSITION. THIS NUMBER IS INITIALLY SET TO ONE */ float *depthptr, /* DEPTH DATA: ARRAY OF OBSERVED LEVEL DEPTHS */ int *parnum, /* NUMBER OF PARAMETERS MEASURED BY PRESENT PROBE. THIS NUMBER GOVERNS HOW MANY PARAMETER RECORD NUMBERS ARE WRITTEN TO A HEADER */ int *oldrecord, /* ARRAY OF POSITIONS OF PARAMETER FILE POINTERS (ALSO CALLED PRESENT RECORD NUMBERS) */ int *params, /* NUMBER OF USER REQUESTED PARAMETERS. ONLY REQUESTED PARAMETERS ARE WRITTEN (OR REWRITTEN) TO FILE. THIS NUMBER INCLUDES CALCULATED AS WELL AS MEASURED PARAMETERS */ int *p2, /* PARAMETER CODES OF REQUESTED PARAMETERS */ int *soor, /* STANDARD (1) OR OBSERVED (0) LEVELS */ int *maxlevel, /* MAXIMUM NUMBER OF DEPTH LEVELS. THIS NUMBER IS NEEDED TO SET THE CORRECT POSITION FOR THE ARRAY POINTER *TEMPPTR */ int *record, /* HEADER INFORMATION: DESIRED FILE POSITION FOR THE READING IN OF PARAMETER DATA (AN ARRAY). THIS CONTAINS THE RECORD NUMBER (NUMBER OF RECORDS FROM THE BEGINNING OF THE FILE) FOR WRITING THE FIRST LEVEL OF PARAMETER DATA OUT TO FILE. IF THE PARAMETER IS NOT PRESENT, THIS NUMBER IS SET TO -1. *RECORD IS RECORDED IN THE HEADER FILE AND IS THE KEY TO READING THE PROPER DATA FOR THE PROPER PROFILE. */ int *maxcal, /* MAXIMUM NUMBER OF PARAMETERS USEABLE IN SYSTEM. THIS IS NECESSARY TO SET THE CORRECT VALUE OF NREC ( DEFINED BELOW ) */ int *jp, /* PROBE TYPE CODE FOR PROBE BEING INVESTIGATED. ALSO NECESSARY TO SET THE CORRECT VALUE OF NREC (DEFINED BELOW). */ int *nprec, /* ORDER OF RECORDING OF PARAMETER BY PROBE. USED TO SET PROPER POSITION IN THE *RECORD VARIABLE, SINCE *RECORD NUMBER ONE MAY NOT CORRESPOND TO PARAMETER CODE (FOR EXAMPLE, IF ONLY SALINITY IS RECORDED BY A PROBE, *RECORD VALUE NUMBER ONE CORRESPONDS TO PARAMETER NUMBER TWO) */ int *itwo, /* ITWO IS SET TO TWO FOR BIOLOGICAL PARAMETER, ONE FOR SECOND HEADER, AND ZERO FOR ALL OTHER PARAMETER TYPES. */ float *bmiss, /* MISSING VALUE MARKER. THIS IS ONLY USED EXPLICITLY HERE FOR BIOLOGICAL DATA. */ int *second, /* SET TO ONE IF SECOND HEADER IS TO BE READ IN, ZERO OTHERWISE */ int *fnum, /* FILE SET NUMBER. IF MORE THAN ONE SET OF FILES IS BEING INVESTIGATED IN A MAIN PROGRAM, THAT IS, MORE THAN ONE PROBE TYPE BEING LOOKED AT SIMULTANEOUSLY, THE FILE NUMBERING IS OFFSET BY A NUMBER CALCULATED FROM THIS FILE SET NUMBER AND THE NUMBER OF PARAMETERS THE CORRESPONDING PROBE MEASURES. */ int *endpoint, /* END OF FILE MARKER. THIS IS SET TO ONE IF THE END OF THE FILE HAS BEEN REACHED, IT IS ZERO OTHERWISE. */ int *paramcalc, /* NUMBER OF CALCULATED PARAMETERS */ int *signif /* NUMBER OF SIGNIFICANT FIGURES IN A VALUE */ ) { /**************************************************************** PARAMETERS: I - PARAMETER CODE NUMBER I2 - POSITION OF CORRECT PARAMETER DATA IN *TEMPPTR I3 - FILE NUMBER I4 - POSITION OF CORRECT FILE POINTER PLACEMENT NUMBER IN *RECORD. J,J0,I0,IB,ICOUNT - COUNTERS ISO - HOLDS OBSERVED (0) OR STANDARD LEVEL (1) VALUE FOR CALCULATIONS OF PROPER POSITION IN *RECORD NTWO - NUMBER OF SPECIFIC SPECIAL PARAMETERS (INTEGER VALUE) MARKER - SET TO ONE WHEN DEPTH HAS BEEN WRITTEN OUT SIZE - SIZE, IN BYTES OF ONE HEADER RECORD PMARK - SET TO ZERO IF THERE IS ONLY ONE PARAMETER RECORDED PMARKI - SET TO ONE IF THERE IS ONLY ONE PARAMETER RECORDED PSIZE - TOTAL NUMBER OF PARAMETERS *2 (STANDARD AND OBSERVED) + ONE FOR DEPTH (IF THERE IS MORE THAN ONE RECORDED PARAMETER) NUMDEP -NUMBER OF DEPTH LEVELS FSELECT - BASE NUMBER FOR FILE NUMBER DEPENDENT ON WHICH FILE SET IS BEING INVESTIGATED AND THE NUMBER OF PARAMETERS THE PROBE BEING RECORDED MEASURES. TOTPARM - NUMBER OF PARAMETERS REQUESTED. (SAME AS *PARAMS UNLESS DEPTH IS THE ONLY REQUESTED PARAMETER) ICOUNT2 - COUNT OF NUMBER OF TAXA RECORDS NSET - NUMBER OF RECORD SETS NUMDEPA - HOLDER FOR NUMBER OF DEPTHS NUMDEP2 - NUMBER OF DEPTHS DEEPER THAN MAXLEVEL NUMEXTRA - NUMBER OF MULTIPLES OF MAXIMUM DEPTH LEVEL FOUND IN PROFILE ******************************************************************/ struct write3fs threedata; off_t size; int i, j, i2, i3, i4, i5, j0, i0, ntwo, iso, icount, ib=0, n; int marker=0, pmark=1; int numdep; int psize, pmarki=0; int fselect = 2 * (*params * (*fnum-1)) + 3 * (*fnum-1); int totparm = *params; int icount2 = 0, nset, i2x=0, numdepa=0,numdep2=0; int numextra=0,numextra2=0; int pcalc= *paramcalc; off_t xnum; /*************************************************************** IF NUMBER OF CALCULATED PARAMETERS IS NEGATIVE, RESET PCALC ****************************************************************/ if ( *paramcalc < 0 ) pcalc= 0- *paramcalc; /*************************************************************** SET THE TWO ONE PARAMETER MARKERS. IF THERE IS ONLY ONE PARAMETER RECORDED BY A PROBE, THE HEADER STRUCTURE IS SLIGHTLY DIFFERENT THAN IT WOULD BE OTHERWISE, SINCE IT IS NOT NECESSARY TO RECORD A DEPTH FILE POSITION IN THIS CASE, BECAUSE THIS NUMBER IS THE SAME AS THE OBSERVED LEVEL FILE PARAMETER POSITION NUMBER. PMARK AND PMARKI ARE POSITION HOLDERS SET DEPENDING ON THIS CONTINGENCY. ****************************************************************/ if ( *parnum == 1) { pmarki = 1; pmark = 0; } /**************************************************************** IF THE FIRST PARAMETER CODE IS -1, ONLY DEPTH IS REQUESTED, SO SET PNUM TO ONE. *****************************************************************/ if ( *(p2+1) == -1 ) totparm=1; /**************************************************************** COMPUTE RECORD SIZE: SIZE IS THE NUMBER OF BYTES IN AN INTEGER * THE SIZE OF THE HEADER STRUCTURE * (2 TIMES THE NUMBER OF PARAMETERS + ONE IF THERE IS MORE THAN ONE PARAMETER) PSIZE IS 2 TIMES THE NUMBER OF PARAMETERS PLUS ONE IF THERE IS MORE THAN ONE PARAMETER. ****************************************************************/ psize = 2 * *parnum + pmark + 1; size= sizeof( struct headerdata ) + (2 * (*parnum) + pmark + 1) * sizeof( int ); /**************************************************************** POSITION HEADER FILE TO PROPER RECORD. THIS IS ACCOMPLISHED BY MOVING THE FILE POINTER (PRESENT PROFILE NUMBER MINUS LAST INPUT FILE NUMBER) TIMES SIZE (AS CALCULATED ABOVE) UNITS. ****************************************************************/ fseeko( fp[(fselect+1)],( *jj - *startpoint ) * size , SEEK_CUR ); /**************************************************************** ADJUST PRESENT HEADER FILE PROFILE NUMBER (ADD ONE) ****************************************************************/ *startpoint = *jj + 1; /**************************************************************** READ HEADER INFORMATION INTO STRUCTURE HEADER. ****************************************************************/ fread(&header, sizeof( struct headerdata ), 1, fp[fselect+1]); /*************************************************************** IF THIS IS NOT THE END OF THE FILE, SET VARIABLES FOR THE MAIN PROGRAM. ****************************************************************/ if ( !feof(fp[fselect+1]) ) { *lat=header.lat; *lon=header.lon; *year=header.year; *month=header.month; *day=header.day; *time=header.time; *cruise=header.cruise; strncpy(ccx,header.cc,2); *ndeps=header.numdepo; *(ndeps+1)=header.numdeps; numdep = *(ndeps + *soor ); /* printf("%f %f %d %d %d %f %d %s %d %d\n",*lat,*lon, *year,*month,*day,*time,*cruise,ccx,*ndeps,*(ndeps+1));*/ /**************************************************** FIND NUMBER OF SETS OF DEPTH DATA THERE ARE, THAT IS THE NUMBER OF MULTIPLES OF MAXLEVEL ARE IN THE NUMBER OF DEPTHS *****************************************************/ numdepa = numdep; numextra=0; if ( numdep >= *maxlevel ) { numextra= numdep/ (*maxlevel); numdep2= numdep - (numextra * (*maxlevel)); numdepa= *maxlevel; } /**************************************************************** READ OBSERVED AND STANDARD LEVEL PARAMETER RECORD STARTING POSITIONS FROM THE HEADER FILE. ****************************************************************/ fread( (record+pmarki), sizeof( int ), psize, fp[fselect+1]); /************************************************************** START LOOP TO READ IN PARAMETER FROM FILE. IF *RECORD FOR A PARAMETER CONTAINS A -1, THIS PARAMETER IS NOT READ IN. OTHERWISE, THE PARAMETER IS READ FROM THE APPROPRIATE FILE STARTING AT THE FILE POSITION CONTAINED IN *RECORD. THIS LOOP IS RUN THROUGH FOR EACH REQUESTED PARAMETER AND ONCE FOR THE SECOND HEADER (IF REQUESTED) **************************************************************/ for ( i0=1; i0<= totparm + *second; i0++) { /************************************************************* IF ONLY ONE PARAMETER IS RECORDED BY A PROBE, THE DEPTH FILE POINTER AND THE OBSERVED LEVEL PARAMETER FILE POINTER WILL BE THE SAME. *************************************************************/ if ( *soor == 0 && *parnum == 1 && i0 <= totparm ) { *record = *(record+i0); } /************************************************************** ADJUST STORAGE NUMBERS FOR THIS PARAMETER: I IS THE PARAMETER CODE I2 SIMULATES A FORTRAN SECOND DIMENSION TO SET THE ARRAY POINTER TO THE CORRECT POSITION. I3 SETS THE CORRECT FILE NUMBER (I3 +FSELECT IS THE ACTUAL FILE NUMBER, FSELECT BEING DEPENDENT ON WHICH SET OF FILES IS BEING LOOKED AT) I4 IS THE CORRECT ARRAY POINTER POSITION FOR THE FILE POINTER POSITON FOR THE PARAMETER. IF DEPTH IS THE ONLY DESIRED PARAMETER ( I = -1 ) SET I4 TO ZERO SO AS TO SKIP ALL PARAMETER DATA. IF THIS IS A SECIAL PARAMETER ( BIOLOGICAL OR SECOND HEADER ), THERE IS ONLY STANDARD LEVEL DATA, SINCE DEPTH IS NOT A FACTOR FOR THESE PARAMETERS *************************************************************/ i= *(p2+i0); if ( i != -1 ) { if ( i0 > totparm ) i = *(p2 + *maxlevel); if ( *(itwo+i) > 0 ) iso = 1; else iso = *soor; i2 = *maxlevel * (i-1); if ( *(itwo+i) != 1 ) i3 = *params * iso + i0 + 1; else if ( *(p2 + 1) != -1 ) i3 = 2* totparm + 2; else i3 = (2* *parnum) + 2; i4 = *parnum * iso + *(nprec+ (((*jp)-1) * *maxcal ) + i-1 ); i5 = i4; if ( i0 > *params - pcalc ) i5 = 2* *parnum + 1 + (*soor * pcalc) + ( i0 - *params+ pcalc ); } else { i3 = 0; i4 = 0; i5 = 0; } /************************************************************* CHECK IF THIS PARAMETER IS PRESENT IN THIS PROFILE. (IF *RECORD FOR THIS PARAMETER IS A -1, THE PARAMETER WAS NOT RECORDED IN THIS PROBE. *************************************************************/ if ( *(record+i4) > -1 ) { /************************************************************* SPECIAL DATA IS READ SLIGHTLY DIFFERENTLY THAN PHYSICAL AND CHEMICAL DATA. CHECK IF THIS IS A SPECIAL DATA TYPE, THAT IS IF THE PARAMETERS ITWO VALUE IS GREATER THAN ZERO. IF NOT, READ AS NORMAL DATA. NORMAL DATA IS SIMPLY NUMDEPS REAL VALUES STORED IN *TEMPPTR, THE OUTER DIMENSION BEING PARAMETER CODE, THE INNER DIMENSION BEING DEPTH LEVEL. **************************************************************/ if ( i < 0 || *(itwo+i) < 1 ) { /************************************************************* IF OBSERVED LEVELS ARE BEING WRITTEN OUT (*SOOR IS ZERO) DEPTH MUST ALSO BE WRITTEN OUT. *************************************************************/ if ( *soor == 0 ) { /************************************************************* IF DEPTH HAS NOT YET BEEN WRITTEN OUT TO FILE MARKER IS SET TO ZERO. IF THIS IS THE FIRST PARAMETER TO BE WRITTEN OUT, SET MARKER TO ONE AND ALSO READ IN DEPTHS FOR OBSERVED LEVELS **************************************************************/ if ( marker == 0 ) { marker = 1; /************************************************************** MOVE DEPTH FILE POINTER TO PROPER POSITION, WHICH IS THE MOVEMENT OF THE POINTER (DESIRED POSITION MINUS PRESENT POSITION) UNITS. **************************************************************/ xnum= *record - *oldrecord; fseeko( fp[fselect+0], xnum * sizeof(float),SEEK_CUR); /************************************************************** READ DEPTHS IN FROM FILE **************************************************************/ fread( depthptr, sizeof(float), numdepa, fp[fselect+0]); for ( j=1; j< numextra; j++ ) { i2x= ( (*(p2 + *maxlevel)+ pcalc + 2) * j ) * *maxlevel; i2x -= *maxlevel; fread( (tempptr+ i2x), sizeof(float), *maxlevel, fp[fselect+0]); } if ( numdep2 > 0 ) { i2x= ( (*(p2 + *maxlevel)+ pcalc +2) * numextra ) * *maxlevel; i2x -= *maxlevel; fread( (tempptr+ i2x), sizeof(float), numdep2, fp[fselect+0]); } } } /*************************************************************** READ IN PARAMETER DATA IF DEPTH WAS NOT THE ONLY REQUESTED PARAMETER (I4 = 0). ****************************************************************/ if ( i > 0 ) { /*************************************************************** MOVE PARAMETER FILE POINTER TO PROPER POSITION, WHICH IS THE MOVEMENT OF THE POINTER (DESIRED POSITION MINUS PRESENT POSITION) UNITS. ***************************************************************/ xnum= *(record+i4) - *(oldrecord+i5); fseeko( fp[fselect+i3], xnum * sizeof(struct write2fs), SEEK_CUR); /*************************************************************** READ ENTIRE PARAMETER FIELD FROM FILE ***************************************************************/ fread( &twodata2[1], sizeof(struct write2fs), numdepa, fp[fselect+i3]); /*************************************************************** TRANSFER DATA FROM TWODATA TO TEMP ARRAY FOR PARAMETER DATA AND SIGNIF ARRAY FOR NUMBER OF SIGNIFICANT FIGURES ****************************************************************/ for ( n = 0; n < numdepa; n++ ) { *(tempptr +i2 + n) = twodata2[n+1].rec; *(signif + i2 + n) = twodata2[n+1].num; } for ( j=1; j< numextra; j++ ) { fread( &twodata2[1], sizeof(struct write2fs),*maxlevel, fp[fselect+i3]); i2x= (((*(p2+ *maxlevel)+ pcalc +2) * j ) * *maxlevel) + i2; for ( n = 0; n < *maxlevel; n++ ) { *(tempptr +i2x + n) = twodata2[n+1].rec; *(signif + i2x + n) = twodata2[n+1].num; } } if ( numdep2 > 0 ) { fread( &twodata2[1], sizeof(struct write2fs),numdep2, fp[fselect+i3]); i2x= (((*(p2+ *maxlevel)+ pcalc+2) * numextra ) * *maxlevel) + i2; for ( n = 0; n < numdep2; n++ ) { *(tempptr +i2x + n) = twodata2[n+1].rec; *(signif + i2x + n) = twodata2[n+1].num; } } /************************************************************** IF THIS IS A CALCULATED PARAMETER, RESET OLDRECORD TO NEW POSITION ***************************************************************/ if ( i4 != i5 ) *(oldrecord + i5) = *(record+i4) + numdep; } } /************************************************************** IF THIS IS A SPECIAL PARAMETER, READ DATA ACCORDINGLY. THE FORM IS A TWO DIGIT STRUCTURE, THE FIRST IS AN INTEGER CARRYING THE APPROPRIATE PARAMETER CODE, AS LISTED IN PROBEFILE.D, THE SECOND IS THE ACTUAL REAL VALUE OF THE PARAMETER. SPECIAL DATA IS STORED DIFFERENTLY IN THE PARAMETER ARRAY *TEMPPTR. THE PARAMETER CODE PART OF *TEMPPTR IS ALWAYS THE OVERALL SPECIAL CODE WHICH IS THE SAME AS A PARAMETER CODE. THE OTHER DIMENSION, WHICH IS DEPTH LEVEL FOR OTHER DATA, IS THE ACTUAL SPECIFIC PARAMETER CODE. SO FOR INSTANCE, THE VALUE OF BIOLOGICAL PARAMETER NUMBER 27 WOULD BE AT TEMP(27,I) IN FORTRAN, *(TEMPPTR+(I - 1) * *MAXLEVEL + 27) IN C. THE FIRST SPECIFIC PARAMETER IS ALWAYS THE NUMBER OF SPECIFIC PARAMETERS RECORDED IN THIS PROFILE. ****************************************************************/ else { /*************************************************************** MOVE SPECIAL PARAMETER FILE POINTER TO PROPER POSITION, WHICH IS THE MOVEMENT OF THE POINTER (DESIRED POSITION MINUS PRESENT POSITION) UNITS. ***************************************************************/ xnum= *(record+i4) - *(oldrecord+i4); fseeko( fp[fselect+i3], xnum * sizeof(struct write3fs), SEEK_CUR); /*************************************************************** READ NUMBER OF PARAMETERS INTO THE FIRST RECORDS. NOTE THAT THE NUMBER OF SPECIFIC SPECIAL PARAMETERS IS STORED IN NTWO SO IT IS REPRESENTED AS AN INTEGER INSTEAD OF A REAL. ****************************************************************/ fread( &threedata, sizeof(struct write3fs), 1, fp[fselect+i3]); ntwo = threedata.num; *(tempptr+i2) = ntwo; fread( &threedata, sizeof(struct write3fs), 1, fp[fselect+i3]); nset = threedata.num; *(tempptr+i2+1) = nset; /*************************************************************** READ SPECIAL PARAMETER DATA. ****************************************************************/ for ( ib = 1; ib <= ntwo; ib++ ) { fread( &threedata, sizeof(struct write3fs), 1, fp[fselect+i3]); *(tempptr+i2+threedata.num) = threedata.rec; *(signif+i2+threedata.num) = threedata.geo; } /**************************************************************** READ IN SPECIAL PARAMETER SET INFORMATION *****************************************************************/ icount2 = 1; if ( nset > 0 ) { threedata.num = 0; while ( threedata.num != 3 ) { fread( &threedata, sizeof(struct write3fs), 1, fp[fselect+i3]); if ( threedata.num < *maxlevel ) { ib= threedata.num; i2x= i2; } else { numextra2= (threedata.num)/ *maxlevel; ib = threedata.num - ( *maxlevel * numextra2 ); i2x= (((*(p2+ *maxlevel)+ pcalc + 2) * numextra2 ) * *maxlevel) + i2; } *(tempptr+i2x+ib) = threedata.rec; *(signif+i2x+ib) = threedata.geo; icount2 +=1; } } /**************************************************************** SET *OLDRECORD TO PRESENT FILE POINTER POSITION. *****************************************************************/ *(oldrecord+i4) = *(record+i4) + ntwo + icount2 + 1; icount2 = 0; } } } /*************************************************************** SET *OLDRECORD TO POSITION OF FILE POINTER AFTER READING DATA, WHICH WILL BE DESIRED FILE POSITION + NUMBER OF DEPTHS SET STARTING POSITION TO POSITION OF THE FILE POINTER DO THIS FOR OBSERVED AND STANDARD LEVEL RECORDS. DO NOT DO THIS FOR THE SPECIAL PARAMETERS, SINCE THIS HAS ALREADY BEEN DONE. ****************************************************************/ if ( marker == 1 ) { *oldrecord = *record + numdep; } if ( *paramcalc < 0 ) pcalc=0; for ( i0=1; i0<= (*params-pcalc); i0++) { i = *(p2+i0); if ( *(itwo+i) < 1 ) { i4 = *parnum * *soor + *(nprec+ (((*jp)-1) * *maxcal ) + i-1 ); if ( *(record+i4) > -1 ) *(oldrecord+i4)= *(record+i4) + numdep; } } } /****************************************************************** SIGNAL TO THE MAIN PROGRAM THAT THE FILE HAS REACHED IT'S END. *******************************************************************/ else *endpoint = 1; }