/********************************************************* SUBROUTINE READLEVEL READLEVEL READS REAL DATA FROM A STANDARD GRID FILE IN BULK FORM. THE STANDARD GRID FILE IS A THREE DIMENSIONAL GRID, I,J,K WITH I DENOTING LONGITUDINAL, J DENOTING LATITUDINAL, AND K DENOTING DEPTH. WRITELEVEL CAN TAKE AN ARRAY OF ANY SIZE AND WRITE IT TO A FILE SET UP FOR THE SAME GRID SIZE OR ANOTHER GRID SIZE. **********************************************************/ readlevel_( int *iadim, /* STARTING LONGITUDE FOR ARRAY */ int *jadim, /* STARTING LATITUDE FOR ARRAY */ int *k1, /* FIRST DEPTH FOR ARRAY */ int *idims, /* STARTING LONGITUDE GRID */ int *jdims, /* STARTING LATITUDE GRID */ int *idime, /* ENDING LONGITUDE GRID */ int *jdime, /* ENDING LATITUDE GRID */ int *idim, /* MAXIMUM LONGITUDE SPACING FOR FILE */ int *jdim, /* MAXIMUM LATITUDE SPACING FOR FILE */ int *iparm, /* MAXIMUM LONGITUDE SPACING FOR DATA ARRAY */ int *jparm, /* MAXIMUM LATITUDE SPACING FOR DATA ARRAY */ int *ks, /* STARTING DEPTH LEVEL */ int *ke, /* ENDING DEPTH LEVEL */ int *fn, /* FILE IDENTIFICATION NUMBER */ float *temp /* DATA */ ) { /*********************************************************** LEVELSIZE - SIZE OF ONE GRID LEVEL FOR FILE RECORD - POINTER TO CORRECT LEVEL FOR FILE LATITUDE - POINTER TO CORRECT LATITUDE COORDINATE FOR FILE ARRAYSIZE - SIZE OF ONE ARRAY LEVEL ARECORD - POINTER TO CORRECT LEVEL FOR ARRAY ALATITUDE - POINTER TO CORRECT LATITUDE COORDINATE FOR ARRAY K - CURRENT DEPTH POINT FOR FILE J - CURRENT LATITUDE POINT FOR FILE I - CURRENT LONGITUDE POINT FOR FILE KA - CURRENT DEPTH POINT FOR ARRAY JA - CURRENT LATITUDE POINT FOR ARRAY IA - CURRENT LONGITUDE POINT FOR ARRAY *************************************************************/ int levelsize, record, latitude, ll, l, j, k, i; int arraysize, arecord, alatitude, ja, ka, ia; int ist, ied; /************************************************************* CALCULATE LEVEL SIZE AND ARRAY SIZE SET BASE DEPTH FOR ARRAY **************************************************************/ levelsize = *idim * *jdim; arraysize = *iparm * *jparm; ka = *k1-1; if ( *idims > *idime ) ll = 2; else ll=1; /************************************************************* RUN THROUGH K (DEPTH) LEVELS **************************************************************/ for ( k = *ks; k <= *ke; k++ ) { /************************************************************* CALCULATE DEPTH POINTER FOR FILE AND ARRAY SET BASE VALUE FOR ARRAY LATITUDE **************************************************************/ ka +=1; record = ( k-1 ) * levelsize; arecord = ( ka-1 ) * arraysize; ja = *jadim-1; /************************************************************* RUN THROUGH J ( LATITUDE ) POINTS **************************************************************/ for ( j = *jdims; j <= *jdime; j++ ) { /************************************************************* ADJUST LONGITUDE GRID STARTING, ENDING POINTS DEPENDENT ON WHETHER THE GREENWICH MERIDIAN HAS BEEN CROSSED OR NOT **************************************************************/ for ( l = 1; l <= ll; l++ ) { if ( ll == 2 ) { if ( l == 1 ) { ist= *idims; ied= *idim; } else { ist= 1; ied= *idime; } } else { ist= *idims; ied= *idime; } /************************************************************* CALCULATE LATITUDE POINTER FOR FILE AND ARRAY SET BASE VALUE FOR ARRAY LONGITUDE **************************************************************/ if ( l == 1 ) { ja +=1; ia = *iadim-2; } latitude = *idim * (j-1) + ( ist-1 ); alatitude = *iparm * (ja-1); /************************************************************* GO TO CORRECT POINT IN FILE **************************************************************/ fseek( fp[*fn],(record+latitude)*sizeof(float),SEEK_SET); /************************************************************* RUN THROUGH I (LONGITUDE) POINTS **************************************************************/ for ( i = ist -1; i < ied; i++ ) { ia +=1; /************************************************************* READ DATA FROM FILE **************************************************************/ fread( (temp+arecord+alatitude+ia), sizeof(float),1,fp[(*fn)]); } } } } }