/********************************************************* SUBROUTINE WRITELEVELD WRITELEVELD WRITES OUT REAL DATA TO 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. THIS VERSION TAKES A DOUBLE PRECISION REAL VALUE AND CONVERTS IT TO A SINGLE PRECISION VALUE BEFORE WRITING OUT **********************************************************/ writeleveld_( 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 */ double *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 *************************************************************/ float stemp; int levelsize, record, latitude, j, k, i; int arraysize, arecord, alatitude, ja, ka, ia; /************************************************************* CALCULATE LEVEL SIZE AND ARRAY SIZE SET BASE DEPTH FOR ARRAY **************************************************************/ levelsize = *idim * *jdim; arraysize = *iparm * *jparm; ka = *k1-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++ ) { /************************************************************* CALCULATE LATITUDE POINTER FOR FILE AND ARRAY SET BASE VALUE FOR ARRAY LONGITUDE **************************************************************/ ja +=1; latitude = *idim * (j-1) + ( *idims - 1 ); alatitude = *iparm * (ja-1); ia = *iadim-2; /************************************************************* GO TO CORRECT POINT IN FILE **************************************************************/ fseek( fp[*fn],(record+latitude)*sizeof(float),SEEK_SET); /************************************************************* RUN THROUGH I (LONGITUDE) POINTS **************************************************************/ for ( i = *idims -1; i < *idime; i++ ) { ia +=1; /************************************************************* WRITE DATA OUT TO FILE **************************************************************/ stemp = *(temp+arecord+alatitude+ia); fwrite( &stemp, sizeof(float),1,fp[(*fn)]); } } } }