PROGRAM SPADNT2 * * This program creates data files holding data on pass pairs * for plotting by IDL PRO SPADPLOT2. SPADPLOT2 plots isobaric * height (Zp), radial wind, tangential * wind, temp., dew point, vertical wind and liquid water, as functions * of radius from storm center, for several double passes. This is part of * the final check on the post-season processing of flight-level aircraft * data taken from AOC standard tapes. SPADNT2 reads the data from .APF files * into PFLARRAY1 and PFLARRAY2. * * Pr. SPADNT2 writes a file for each pass pair. The file names have the form * SPAD2_xxx.TXT and are not directly related to the global or local * pass numbers; they are sequential and increase by one. SPADNT2 keeps track * of the max. wind, max. and min. isob.ht, max temp and min. dewpoint for each * flight keeping these in FLIGHT_ARRAY2, which is parallel to FLIGHT_ARRAY. * At the end of the program the data which are common to all the pass pairs, * including the data in FLIGHT_ARRAY2, are written to a file called. SPADNT2.TXT. * The data from FLIGHT_ARRAY2 will tell the program SPADPLOT2 what the plot axes * should be for each pass pair. * * The .APF files must have been generated before SPADNT2 can be run. * * Written by Edrahn, Dec. 1997 using some code borrowed from * WINDPRESSURE4 written by William P. Barry jr, * and the original SPAD written by Hugh Willoughby * Revised by Edrahn, Dec. 2002 for use under NT. * PARAMETER ( LUIDX = 67, LUPFL = 66, MAXFLIGHTS = 100 ) PARAMETER ( NBIN = 300, NVAR = 14, LUAPF = 76 ) CHARACTER MONTH0STR*3, DEFNAME*64, STORMNAME*16, ACHAR*1, & FID_ARRAY( MAXFLIGHTS )*12, LOCATION1*3, FID*12, & TEMPNAME*64, LOCATION2*3, APFNAME*64, STRING3*3 REAL PFLARRAY1( NBIN, NVAR ), PFLARRAY2( NBIN, NVAR ), & NEARTIME1, NEARTIME2, ARRZP( NBIN*2 ), & ARRTEMP( NBIN*2 ), ARRRADWIND( NBIN*2 ), & ARRTANWIND( NBIN*2 ), ARRVERTWIND( NBIN*2 ), & ARRH2O( NBIN*2 ), ARRDEWPT( NBIN*2 ), & FLIGHT_ARRAY2( MAXFLIGHTS, 5 ) INTEGER FLIGHT_ARRAY( MAXFLIGHTS, 3 ), APFARRAY( NBIN-1, 10 ) INTEGER MAXWINDS( MAXFLIGHTS ), MAXZPS( MAXFLIGHTS ), & MINZPS( MAXFLIGHTS ), MAXTEMPS( MAXFLIGHTS ), & MINDPS( MAXFLIGHTS ), FILENUM LOGICAL TEST4YNQ, OK, DONE, INWARD, INWARD2 * * Display data on the storm to the user, initialize * FLIGHT_ARRAY2: CALL SHOWSTORM( LUIDX, DEFNAME, NUMFLIGHTS, NUMPFL, DR, & IDAY0, MONTH0, IYEAR0, FLIGHT_ARRAY, & FID_ARRAY, STORMNAME, MONTH0STR, & FLIGHT_ARRAY2 ) * * Loop over profiles * IFILENUM = 0 DONE = .FALSE. DO WHILE( .NOT.( DONE ) ) IFILENUM = IFILENUM + 1 * * Choose the pass pair to be plotted, find standard pr. and * FID for this pair: CALL DATA4THISPAIR( NUMPFL, NUMFLIGHTS, FLIGHT_ARRAY, & FID_ARRAY, IFIRSTPFL, ISTD_PR, FID, & DONE ) IF( DONE ) GO TO 100 * IFIRSTPFL is the global pass # of the first pass in the * chosen pair * TEMPNAME = DEFNAME WRITE( STRING3, '( I3.3 )') IFIRSTPFL NAMELEN = INDEX( STORMNAME, ' ' ) - 1 APFNAME = STORMNAME(1:NAMELEN) // '_' // & STRING3 CALL GET_APFARRAY( APFNAME, LUAPF, APFARRAY, OK ) !* From POSTLIB *! IF( .NOT.( OK ) )THEN WRITE(6,*)'Failure to open first .APF file' WRITE(6,'( 1X, A64 )') APFNAME WRITE(6,*)'Program terminated' STOP END IF CALL APF2PFLARRAY( APFARRAY, PFLARRAY1 ) !* From POSTLIB *! WRITE( STRING3, '( I3.3 )') IFIRSTPFL+1 APFNAME = STORMNAME(1:NAMELEN) // '_' // & STRING3 CALL GET_APFARRAY( APFNAME, LUAPF, APFARRAY, OK ) IF( .NOT.( OK ) )THEN WRITE(6,*)'Failure to open second .APF file' WRITE(6,'( 1X, A64 )') APFNAME WRITE(6,*)'Program terminated' STOP END IF CALL APF2PFLARRAY( APFARRAY, PFLARRAY2 ) !* From POSTLIB *! CALL LOCATE_PASS2( PFLARRAY1, LOCATION1 ) !* From POSTLIB *! CALL LOCATE_PASS2( PFLARRAY2, LOCATION2 ) CALL TIME_LIMITS( 0.0, PFLARRAY1, NEARTIME1, FARTIME1, & INWARD ) !* From POSTLIB *! CALL TIME_LIMITS( 0.0, PFLARRAY2, NEARTIME2, FARTIME2, & INWARD2 ) * * NOTE: NEARTIME1, FARTIME1, NEARTIME2 and FARTIME2 are in seconds relative to * the zerotime for the storm. * CALL LOAD_1D_ARRAYS( PFLARRAY1, PFLARRAY2, LEFTPLOT, ARRZP, & ARRTEMP, ARRRADWIND, ARRTANWIND, & ARRVERTWIND, ARRH2O, ARRDEWPT ) CALL UPDATE_FLIGHT_ARRAY2( IFIRSTPFL, NUMFLIGHTS, & FLIGHT_ARRAY, ARRZP, & ARRRADWIND, ARRTANWIND, & ARRTEMP, & ARRDEWPT, FLIGHT_ARRAY2 ) * * Write the data for the current pass pair to a file: * CALL WRITE_SPAD2( IFILENUM, STORMNAME, FID, ISTD_PR, DR, & LOCATION1, LOCATION2, NUMFLIGHTS, & NUMPFL, ARRZP, ARRRADWIND, ARRTANWIND, & ARRVERTWIND, ARRH2O, ARRTEMP, ARRDEWPT, & IFIRSTPFL, NEARTIME1, FARTIME1, & NEARTIME2, FARTIME2, & IDAY0, MONTH0, IYEAR0 ) END DO !* WHILE( .NOT.( DONE ) ) *! * 100 CONTINUE write(6,*)'FLIGHT_ARRAY2:' do i = 1, numflights write(6, '( 5(1x, f10.2) )') flight_array2(i,1), & flight_array2(i,2), flight_array2(i,3), & flight_array2(i,4), flight_array2(i,5) end do write(6,*)'return 2 continue' read(5,*) CALL CALC_PLOT_AXES( NUMFLIGHTS, FLIGHT_ARRAY2, MAXWINDS, & MAXZPS, MINZPS, MAXTEMPS, MINDPS ) * * Write out the data that is relevant to all pass pairs to the * SPADNT2.TXT file: * CALL WRITE_SPADNT2( STORMNAME, DR, NUMFLIGHTS, & NUMPFL, NUMFILES, FLIGHT_ARRAY, & FID_ARRAY, MAXWINDS, & MAXZPS, MINZPS, MAXTEMPS, MINDPS, & IDAY0, MONTH0, IYEAR0, MONTH0STR ) STOP END !* Program SPADNT2 *! * * *********1*********2*********3*********4*********5*********6*********7** * * SUBROUTINE SHOWSTORM( LUIDX, DEFNAME, NUMFLIGHTS, NUMPFL, DR, & IDAY0, MONTH0, IYEAR0, FLIGHT_ARRAY, & FID_ARRAY, STORMNAME, MONTH0STR, & FLIGHT_ARRAY2 ) * PARAMETER ( MAXFLIGHTS = 100 ) CHARACTER FID_ARRAY( MAXFLIGHTS )*12, STORMNAME*16, DEFNAME*64, & MONTH0STR*3, FID*12, ACHAR*1 INTEGER FLIGHT_ARRAY( MAXFLIGHTS, 3 ) REAL FLIGHT_ARRAY2( MAXFLIGHTS, 5 ) * WRITE(6,*)'Enter the .IDX file name, without extension' READ(5,'(A64)') DEFNAME CALL GETINDEXDATA( DEFNAME, LUIDX, NUMFLIGHTS, NUMPFL, DR, & IDAY0, MONTH0, IYEAR0, FLIGHT_ARRAY, & FID_ARRAY, STORMNAME ) !* From POSTLIB *! CALL IMON2ALPHAMON( MONTH0, MONTH0STR ) !* From TRAKLIB3 *! * * User chooses the block of passes to be plotted: * IF( NUMFLIGHTS .EQ. 1 )THEN WRITE(6,'('' For the storm '', A16, '' there is one'', & '' flight listed, with '', I4, ''passes'')') & STORMNAME, NUMPFL WRITE(6,'('' The starting date is '', A3, I3, '', '' I4 )') & MONTH0STR, IDAY0, IYEAR0 IFIRSTPFL = 1 LASTPFL = NUMPFL ISTD_PR = FLIGHT_ARRAY( 1, 3 ) ELSE WRITE(6,'('' For the storm '', A16, '' there are '', I3, & '' flights listed, with '', I4, ''passes'')') & STORMNAME, NUMPFL WRITE(6,'('' The starting date is '', A3, I3, '', '' I4 )') & MONTH0STR, IDAY0, IYEAR0 WRITE(6,*)'The FIDs, global start and end passes, and ', & 'standard pressures are:' DO I = 1, NUMFLIGHTS WRITE(6,'( 3X, I3, 5X, A12, 5X, I3, 2X, I3, 5X, I4 )') & I, FID_ARRAY(I), (FLIGHT_ARRAY(I,J), J = 1, 3) END DO END IF * * Initialize FLIGHT_ARRAY2: * DO I = 1, NUMFLIGHTS FLIGHT_ARRAY2( I, 1 ) = -999.9 FLIGHT_ARRAY2( I, 2 ) = -999.9 FLIGHT_ARRAY2( I, 3 ) = 999999.9 FLIGHT_ARRAY2( I, 4 ) = -999.9 FLIGHT_ARRAY2( I, 5 ) = 9999.9 END DO * RETURN END !* Subroutine SHOWSTORM *! * * *********1*********2*********3*********4*********5*********6*********7** * * SUBROUTINE DATA4THISPAIR( NUMPFL, NUMFLIGHTS, FLIGHT_ARRAY, & FID_ARRAY, IFIRSTPFL, ISTD_PR, FID, & DONE ) * PARAMETER ( MAXFLIGHTS = 100 ) CHARACTER FID_ARRAY( MAXFLIGHTS )*12, STORMNAME*16, DEFNAME*64, & MONTH0STR*3, FID*12, ACHAR*1 INTEGER FLIGHT_ARRAY( MAXFLIGHTS, 3 ) LOGICAL DONE * 100 CONTINUE WRITE(6,*)'Enter the global pass number of the first pass in', & ' the pair' WRITE(6,'('' as an integer from 1 to'', I4, '', or 0 to quit'')') & NUMPFL-1 READ(5,*,ERR=100) IFIRSTPFL IF( IFIRSTPFL .LT. 0 )THEN WRITE(6,*)'First pass cannot be a negative number' GO TO 100 ELSE IF( IFIRSTPFL .GT. NUMPFL-1 )THEN WRITE(6,*)'First pass must be less than the total number', & ' of passes' GO TO 100 ELSE IF( IFIRSTPFL .EQ. 0 )THEN DONE = .TRUE. ELSE CONTINUE END IF * * This subr. gets the standard pressure for the first pass. CALL INDEXDATA4ONEPASS( IFIRSTPFL, NUMFLIGHTS, & FLIGHT_ARRAY, FID_ARRAY, LOCALPASS, & ISTD_PR, FID ) * RETURN END !* Subroutine DATA4THISPAIR *! * * *********1*********2*********3*********4*********5*********6*********7** * * SUBROUTINE WRITE_SPAD2( IFILENUM, STORMNAME, FID, ISTD_PR, DR, & LOCATION1, LOCATION2, NUMFLIGHTS, & NUMPFL, ARRZP, ARRRADWIND, ARRTANWIND, & ARRVERTWIND, ARRH2O, ARRTEMP, ARRDEWPT, & IFIRSTPFL, NEARTIME1, FARTIME1, & NEARTIME2, FARTIME2, & IDAY0, MONTH0, IYEAR0 ) * * Writen by Edrahn, December 2002. * * Writes the SPAD2_xxx.TXT file which holds the data for the plotting of * one double pass. * PARAMETER ( NBIN = 300, NVAR = 14, LUOUT = 61 ) LOGICAL ok CHARACTER OUTFILENAME*64, STORMNAME*16, STORMLABEL*17, & GRAPHNAME*64, IPROFSTR*3, LOCATION1*3, / LOCATION2*3, HR1*2, HR2*2, MIN1*2, MIN2*2, / DAY*2, MON*3, YEAR*4, AC*2, SEC*2, PS1*2, PS2*2, / LABELA*21, STRING3*3, FID*12, EXT*4, & TIMELABEL1*5, TIMELABEL2*13, PRSTR*8, STRING4*4, & PASSLABEL1*16, PASSLABEL2*16, HRIN*2, MININ*2, & HROUT*2, MINOUT*2, PASSTIMES*13, FILENUMSTR*3, & NOW*21 REAL NEARTIME1, NEARTIME2, ARRZP( NBIN*2 ), & ARRTEMP( NBIN*2 ), & ARRRADWIND( NBIN*2 ), ARRTANWIND( NBIN*2 ), & ARRVERTWIND( NBIN*2 ), ARRH2O( NBIN*2 ), & ARRDEWPT( NBIN*2 ), ARRRADS( NBIN*2 ) * WRITE( FILENUMSTR,'( I3.3 )') IFILENUM OUTFILENAME = ' ' OUTFILENAME = 'SPAD2_' // FILENUMSTR EXT = 'TXT ' CALL OPENFILE1( OUTFILENAME, EXT, LUOUT, 'NEW', OK ) IF(.NOT.( OK ))THEN WRITE(6,'('' Failure to open '', A64 )') OUTFILENAME WRITE(6,*)'Program terminated, press RETURN' STOP END IF WRITE( LUOUT, '( 1X, A16 )' ) STORMNAME WRITE( LUOUT, '( 1X, A12 )' ) FID WRITE( LUOUT, '( 1X, I4, 12X, ''! Std Pr'' )' ) ISTD_PR WRITE( LUOUT, '( 1X, F4.2, 12X, ''! DR'' )') DR WRITE( LUOUT, '( 1X, I4, 12X, ''! Global pass # of '', & ''inward pass'' )') IFIRSTPFL WRITE( LUOUT, '( 1X, A3, 13X, ''! Location of inward pass'' )') & LOCATION1 WRITE( LUOUT, '( 1X, A3, 13X, ''! Location of outward pass'' )') & LOCATION2 CALL SEC2GMT( FARTIME1, IDAY0, MONTH0, IYEAR0, / SEC, MIN1, HR1, DAY, MON, YEAR) CALL SEC2GMT( NEARTIME1, IDAY0, MONTH0, IYEAR0, / SEC, MIN2, HR2, DAY, MON, YEAR) WRITE( LUOUT, '( 1X, A2, A2, 12X, ''! Start time for inward '', & ''pass, HHMM'' )') HR1, MIN1 WRITE( LUOUT, '( 1X, A2, A2, 12X, ''! End time for inward '', & ''pass, HHMM'' )') HR2, MIN2 CALL SEC2GMT( NEARTIME2, IDAY0, MONTH0, IYEAR0, / SEC, MIN1, HR1, DAY, MON, YEAR) CALL SEC2GMT( FARTIME2, IDAY0, MONTH0, IYEAR0, / SEC, MIN2, HR2, DAY, MON, YEAR) WRITE( LUOUT, '( 1X, A2, A2, 12X, ''! Start time for outward '', & ''pass, HHMM'' )') HR1, MIN1 WRITE( LUOUT, '( 1X, A2, A2, 12X, ''! End time for outward '', & ''pass, HHMM'' )') HR2, MIN2 CALL GETCURRTIME( NOW ) WRITE( LUOUT, '( 1X, A21 )' ) NOW WRITE( LUOUT, * ) WRITE( LUOUT, * )'Radius, ZP, Radwind, Tanwind, Temp, DP, H20,', & ' Vertwind' WRITE( LUOUT, * ) MINRADIUS = -0.5 * DR * NBIN DO I = 2, NBIN RADIUS = MINRADIUS + ( (I-1) * 0.5 * DR ) WRITE( LUOUT, '( 1X, F7.2, 7(1X, F8.2) )') RADIUS, & ARRZP( I ), ARRRADWIND( I ), ARRTANWIND( I ), & ARRTEMP( I ), ARRDEWPT( I ), ARRH2O( I ), & ARRVERTWIND( I ) END DO DO I = NBIN+1, 2*NBIN - 1 RADIUS = (I - NBIN) * DR * 0.5 WRITE( LUOUT, '( 1X, F7.2, 7(1X, F8.2) )') RADIUS, & ARRZP( I ), ARRRADWIND( I ), ARRTANWIND( I ), & ARRTEMP( I ), ARRDEWPT( I ), ARRH2O( I ), & ARRVERTWIND( I ) END DO CLOSE( LUOUT ) * RETURN END !* Subroutine WRITE_SPAD2 *! * * *********1*********2*********3*********4*********5*********6*********7** * * SUBROUTINE WRITE_SPADNT2( STORMNAME, DR, NUMFLIGHTS, & NUMPFL, NUMFILES, FLIGHT_ARRAY, & FID_ARRAY, MAXWINDS, & MAXZPS, MINZPS, MAXTEMPS, MINDPS, & IDAY0, MONTH0, IYEAR0, MONTH0STR ) * * Writes the SPADNT2.TXT file, the summary file which holds the data * that relates to the plotting of all the double passes. * PARAMETER ( NBIN = 300, NVAR = 14, LUOUT = 61 ) PARAMETER ( MAXFLIGHTS = 100 ) CHARACTER DEFNAME*64, STORMNAME*16, OUTFILENAME*64, / FID*12, FID_ARRAY( MAXFLIGHTS )*12, EXT*4, & MONTH0STR*3 REAL ARRZP( NBIN*2 ), & ARRTEMP( NBIN*2 ), & ARRRADWIND( NBIN*2 ), ARRTANWIND( NBIN*2 ), & ARRVERTWIND( NBIN*2 ), ARRH2O( NBIN*2 ), & ARRDEWPT( NBIN*2 ), ARRRADS( NBIN*2 ) INTEGER MAXWINDS( MAXFLIGHTS ), MAXZPS( MAXFLIGHTS ), & MINZPS( MAXFLIGHTS ), MAXTEMPS( MAXFLIGHTS ), & MINDPS( MAXFLIGHTS ) INTEGER FLIGHT_ARRAY( MAXFLIGHTS, 3 ) LOGICAL OK * OUTFILENAME = 'SPADNT2 ' EXT = 'TXT ' CALL OPENFILE1( OUTFILENAME, EXT, LUOUT, 'NEW', OK ) IF(.NOT.( OK ))THEN WRITE(6,'('' Failure to open '', A64 )') OUTFILENAME WRITE(6,*)'Program terminated, press RETURN' STOP END IF * WRITE( LUOUT, '( 1X, A16 )' ) STORMNAME WRITE( LUOUT, '( 1X, A2, 1X, A2, 1X, A4, 5X, & ''! Start date in MM DD YYYY'' )' ) MONTH0, & IDAY0, IYEAR0 WRITE( LUOUT, '( 1X, A3, 12X, ''! Start month'' )') MONTH0STR WRITE( LUOUT, '( 1X, I4, 11X, ''! Total flights for this '', & ''storm '')' ) NUMFLIGHTS WRITE( LUOUT, '( 1X, F4.0, 11X, ''! DR '' )') DR WRITE( LUOUT, '( 1X, I4, 11X, ''! Total number of passes'' )' ) & NUMPFL WRITE( LUOUT, '( 1X, I4, 11X, ''! Number of pass pairs to be'', & '' plotted '' )' ) NUMFILES WRITE( LUOUT, * ) WRITE( LUOUT, '('' FIDs,'' )') WRITE( LUOUT, '('' start and end global pass numbers, '', & ''max winds, maxZPs, minZPs, maxtemps'', & '' and minDPs for each storm'' )') WRITE( LUOUT, * ) DO I = 1, NUMFLIGHTS WRITE( LUOUT, '( 1X, A12 )' ) FID_ARRAY(I) WRITE( LUOUT, '( 1X, 2(I3, 1X), 5( 1X, 5I ) )' ) & FLIGHT_ARRAY(I,1), FLIGHT_ARRAY(I,2), MAXWINDS(I), & MAXZPS(I), MINZPS(I), MAXTEMPS(I), MINDPS(I) END DO CLOSE( LUOUT ) * RETURN END !* Subroutine WRITE_SPADNT2 *! * * *********1*********2*********3*********4*********5*********6*********7** * * SUBROUTINE LOAD_1D_ARRAYS( PFLARRAY1, PFLARRAY2, LEFTPLOT, ARRZP, & ARRTEMP, ARRRADWIND, ARRTANWIND, & ARRVERTWIND, ARRH2O, ARRDEWPT ) * PARAMETER ( NBIN = 300, NVAR = 14 ) REAL PFLARRAY1( NBIN, NVAR ), PFLARRAY2( NBIN, NVAR ), & ARRZP( NBIN*2 ), & ARRTEMP( NBIN*2 ), ARRRADWIND( NBIN*2 ), & ARRTANWIND( NBIN*2 ), ARRVERTWIND( NBIN*2 ), & ARRH2O( NBIN*2 ), ARRDEWPT( NBIN*2 ) * * 1-dimensional arrays are a little more convenient to plot from, * so decompose 2-D arrays into separate 1-D arrays, for passing * to plotting subroutine: * K = NBIN DO I = 1, NBIN ARRZP( K ) = PFLARRAY1( I, 1 ) ARRTEMP( K ) = PFLARRAY1( I, 2 ) ARRRADWIND( K ) = PFLARRAY1( I, 3 ) ARRTANWIND( K ) = PFLARRAY1( I, 4 ) ARRVERTWIND( K ) = PFLARRAY1( I, 5 ) ARRH2O( K ) = PFLARRAY1( I, 6 ) ARRDEWPT( K ) = PFLARRAY1( I, 10 ) - 0.07 K = K - 1 END DO K = NBIN DO I = 1, NBIN K = K + 1 ARRZP( K ) = PFLARRAY2( I, 1 ) ARRTEMP( K ) = PFLARRAY2( I, 2 ) ARRRADWIND( K ) = PFLARRAY2( I, 3 ) ARRTANWIND( K ) = PFLARRAY2( I, 4 ) ARRVERTWIND( K ) = PFLARRAY2( I, 5 ) ARRH2O( K ) = PFLARRAY2( I, 6 ) ARRDEWPT( K ) = PFLARRAY2( I, 10 ) - 0.07 END DO * RETURN END !* Subroutine LOAD_1D_ARRAYS *! * * *********1*********2*********3*********4*********5*********6*********7** * * SUBROUTINE UPDATE_FLIGHT_ARRAY2( IFIRSTPFL, NUMFLIGHTS, & FLIGHT_ARRAY, ARRZP, & ARRRADWIND, ARRTANWIND, & ARRTEMP, & ARRDEWPT, FLIGHT_ARRAY2 ) * * Written by Edrahn, Dec. 5, 2002. * * Keeps track of the current max wind, max and min isob ht, max * temp and min dewpoint. * * Once all the pairs of passes have been processed, each line * of FLIGHT_ARRAY2 will hold max. horizontal wind, max. and min. isob.ht, * max temp and min. dewpoint for one flight, in the order given here. * It is parallel to FLIGHT_ARRAY. * The data in FLIGHT_ARRAY2 will be placed in the summary file * SPADNT2, to be used to set the axes for plotting ZP, horizontal wind, * temp. and DP for the double passes. (Axes for H2O and vert. wind are * fixed.) * PARAMETER ( MAXFLIGHTS = 100, NBIN = 300 ) REAL FLIGHT_ARRAY2( MAXFLIGHTS, 5 ), ARRZP( NBIN*2 ), & ARRTEMP( NBIN*2 ), ARRRADWIND( NBIN*2 ), & ARRTANWIND( NBIN*2 ), & ARRDEWPT( NBIN*2 ) INTEGER FLIGHT_ARRAY( MAXFLIGHTS, 3 ) * * Find which flight the current inward pass (number IFIRSTPFL) * belongs to. * DO I = 1, NUMFLIGHTS IF(( FLIGHT_ARRAY(I,1) .LE. IFIRSTPFL ) .AND. & ( IFIRSTPFL .LE. FLIGHT_ARRAY(I,2) ))THEN IFLIGHT = I GO TO 100 END IF END DO 100 CONTINUE * * Update the max. and min. data for IFLIGHT, if a current min. is * less than the min. value held in line IFLIGHT of FLIGHT_ARRAY2, or the * max is greater than the max. value held in line IFLIGHT. Remember that * the parallel arrays: * LASTBIN = 2*NBIN-1 DO I = 2, LASTBIN * Update current max. wind, if necessary: IF(( ARRRADWIND(I) .GT. FLIGHT_ARRAY2( IFLIGHT, 1 ) ) .AND. & ( ARRRADWIND(I) .LT. 9999.0 )) & FLIGHT_ARRAY2( IFLIGHT, 1 ) = ARRRADWIND(I) IF(( ARRTANWIND(I) .GT. FLIGHT_ARRAY2( IFLIGHT, 1 ) ) .AND. & ( ARRTANWIND(I) .LT. 9999.0 )) & FLIGHT_ARRAY2( IFLIGHT, 1 ) = ARRTANWIND(I) * Update max. ZP, if necessary: IF(( ARRZP(I) .GT. FLIGHT_ARRAY2( IFLIGHT, 2 ) ) .AND. & ( ARRZP(I) .LT. 9999.0 )) & FLIGHT_ARRAY2( IFLIGHT, 2 ) = ARRZP(I) * Update min. ZP: IF( ARRZP(I) .LT. FLIGHT_ARRAY2( IFLIGHT, 3 ) ) & FLIGHT_ARRAY2( IFLIGHT, 3 ) = ARRZP(I) * Update max. temp: IF(( ARRTEMP(I) .GT. FLIGHT_ARRAY2( IFLIGHT, 4 ) ) .AND. & ( ARRTEMP(I) .LT. 9999.0 )) & FLIGHT_ARRAY2( IFLIGHT, 4 ) = ARRTEMP(I) * Update min. dew point: IF( ARRDEWPT(I) .LT. FLIGHT_ARRAY2( IFLIGHT, 5 ) ) & FLIGHT_ARRAY2( IFLIGHT, 5 ) = ARRDEWPT(I) END DO * RETURN END !* Subroutine UPDATE_FLIGHT_ARRAY2 *! * * *********1*********2*********3*********4*********5*********6*********7** * * SUBROUTINE CALC_PLOT_AXES( NUMFLIGHTS, FLIGHT_ARRAY2, MAXWINDS, & MAXZPS, MINZPS, MAXTEMPS, MINDPS ) * * Written by Edrahn, Dec. 6, 2002. * * Extracts the max. and min. values for wind, ZP, temp. and DP from * FLIGHT_ARRAY2 and rounds to even 20 units (for wind), 100 units * (for max. and min. ZP) 5 units (for temp. and DP). This data will * be passed to Subr. WRITE_SPADNT2, which will write it into the * SPADNT2 file. The data will be extracted from that file by * SPADPLOT2, the IDL program that will plot the double passes, and * used to set the azes for the plots. * PARAMETER ( MAXFLIGHTS = 100 ) REAL FLIGHT_ARRAY2( MAXFLIGHTS, 5 ) INTEGER MAXWINDS( MAXFLIGHTS ), MAXZPS( MAXFLIGHTS ), & MINZPS( MAXFLIGHTS ), MAXTEMPS( MAXFLIGHTS ), & MINDPS( MAXFLIGHTS ) * DO I = 1, NUMFLIGHTS RMAXWIND = FLIGHT_ARRAY2( I, 1 ) MAXWIND = IFIX( RMAXWIND ) MAXWINDS(I) = MAXWIND + ( 20 - MOD( MAXWIND, 20 ) ) * RMAXZP = FLIGHT_ARRAY2( I, 2 ) MAXZP = IFIX( RMAXZP ) MAXZPS(I) = MAXZP + ( 100 - MOD( MAXZP, 100 ) ) * RMINZP = FLIGHT_ARRAY2( I, 3 ) MINZP = IFIX( RMINZP ) MINZPS(I) = MINZP - MOD( MINZP, 100 ) * RMAXTEMP = FLIGHT_ARRAY2( I, 4 ) MAXTEMP = IFIX( RMAXTEMP ) MAXTEMPS(I) = MAXTEMP + ( 5 - MOD( MAXTEMP, 5 ) ) * RMINDP = FLIGHT_ARRAY2( I, 5 ) MINDP = IFIX( RMINDP ) IF ( MINDP .LT. 0 )THEN MINDPS(I) = MINDP - (5 + MOD( MINDP, 5 ) ) ELSE MINDPS(I) = MINDP - MOD( MINDP, 5 ) END IF END DO * RETURN END !* Subroutine CALC_PLOT_AXES *!