SUBROUTINE FCST90(KFILDO,KFIL10,IP12,KFILFC,KFILX,CFILX, 1 KFILRA,RACESS,NUMRA, 2 NDATE,ICALL,CCALL,ISDATA,XDATA,ND1,NSTA, 3 ICALLD,CCALLD,IPACK,IWORK,DATA,ND5, 4 LSTORE,ND9,LITEMS,CORE,ND10, 5 NBLOCK,NSTORE,NFETCH, 6 IS0,IS1,IS2,IS4,ND7, 7 KGP,NGP,LGP,MTRMS,MTANDS,ICAT, 8 ID,IDPARS,TRESHL,JD,ITAU,IUSED, 9 CONSTV,AVG,CORR,COEF,ND2,ND3, A IDTAND,IDTPAR,LOCSTA,ND13, B FCST,INITF, C IPLAIN,PLAIN,ISCALD,MINPK,NREPLA,NCHECK, D IP16,IP17,IP18,NTOTBY,NTOTRC, E L3264B,L3264W,ISTOP,IER) C$$$ SUBPROGRAM DOCUMENTATION BLOCK C . . . . C SUBPROGRAM: FCST90 C PRGMMR: GLAHN ORG: W/OSD211 DATE: 99-02-01 C C ABSTRACT: TO MAKE FORECASTS FOR ALL PREDICTANDS FOR ONE DATE/TIME C IN U900. PREDICTORS ARE IDENTIFIED IN ID( , , ). C AVAILABLE VARIABLES ARE INDICATED IN LSTORE( , ). C VARIABLES MAY BE OBTAINED FROM CORE( ) OR FROM DISK C IN THE INTERNAL MOS-2000 STORAGE SYSTEM AS INDICATED C IN LSTORE( , ). DATA NEEDED MUST BE ON PACKED SEQUENTIAL C FILES OR CAN BE OBTAINED THROUGH OPTX, WHICH CAN ACCESS C FIVE MOS-2000 EXTERNAL RANDOM ACCESS FILES. BINARIES CAN BE C AVAILABLE ON INPUT OR COMPUTED WITHIN U900. IT IS ASSUMED C THE PRIMARY MISSING VALUE = 9999. IT IS ALSO ASSUMED C THE SECONDARY MISSING VALUE = 9997. FORECASTS ARE WRITTEN C TO A MOS-2000 PACKED SEQUENTIAL FILE AND/OR A MOS-2000 C RANDOM ACCESS FILE. C C PROGRAM HISTORY LOG: C 99-09-21 GLAHN C 00-05-16 CARROLL ADDED NCEP DOCBLOCK. C 00-06-26 ALLEN PUT BACK THE ABSTRACT IN THE DOCBLOCK. C 05-08-10 WIEDENFELD ADDED CALLS TO CONST SO LAMP FORECAST CAN BE USED FROM C THE RANDOM ACCESS FILE. C 06-06-20 WIEDENFELD ADDED CALL TO CAT2 FOR PARTIAL INFLATION. C C USAGE: CALL FCST90(KFILDO,KFIL10,IP12,KFILFC,KFILX,CFILX,KFILRA,RACESS, C NUMRA,NDATE,ICALL,CCALL,ISDATA,XDATA,ND1,NSTA, C ICALLD,CCALLD,IPACK,IWORK,DATA,ND5,LSTORE,ND9,LITEMS, C CORE,ND10,NBLOCK,NSTORE,NFETCH,IS0,IS1,IS2,IS4,ND7, C KGP,NGP,LGP,MTRMS,MTANDS,ICAT,ID,IDPARS,TRESHL,JD, C ITAU,IUSED,CONSTV,AVG,CORR,COEF,ND2,ND3,IDTAND,IDTPAR, C LOCSTA,ND13,FCST,INITF,IPLAIN,PLAIN,ISCALD,MINPK, C NREPLA,NCHECK,IP16,IP17,IP18,NTOTBY,NTOTRC,L3264B, C ISTOP,IER) C INPUT ARGUMENT LIST: C KFIL10 - UNIT NUMBER OF TDL MOS-2000 FILE SYSTEM ACCESS. C (INPUT-OUTPUT) C KFILFC - UNIT NUMBER FOR WRITING THE SEQUENTIAL C FORECAST OUTPUT. WHEN KFILFC = 0, PACKED C FORECASTS WILL NOT BE WRITTEN. (INPUT) C KFILX - UNIT NUMBER FOR WRITING MOS-2000 EXTERNAL C RANDOM ACCESS FILE. (INPUT) C CFILX - FILE NAME FOR MOS-2000 EXTERNAL RANDOM ACCESS C FILE FOR WRITING FORECASTS. (CHARACTER*60) C (INPUT) C KFILRA(J) - UNIT NUMBERS FOR READING MOS-2000 EXTERNAL C RANDOM ACCESS FILES (J=1,NUMRA). (INPUT) C RACESS(J) - FILE NAMES FOR MOS-2000 EXTERNAL RANDOM ACCESS C FILES HOLDING CONSTANT DATA READ ON UNIT NOS. C KFILRA(J) IN OPTX (J=1,NUMRA). (CHARACTER*60) C (INPUT) C NUMRA - NUMBER OF VALUES IN KFILRA( ) AND RACESS( ). C (INPUT) C NDATE - THE DATE/TIME FOR WHICH FORECASTS ARE TO BE C MADE ON THIS CALL TO FCST90. (INPUT) C ICALL(L,K) - 8-CHARACTER STATION CALL LETTERS AS CHARACTERS C IN AN INTEGER VARIABLE (L=1,L3264W). C EQUIVALENCED TO CCALL( ). C CCALL(K) - 8-CHARACTER STATION CALL LETTERS (OR GRIDPOINT C LOCATIONS FOR GRID DEVELOPMENT) TO PROVIDE C OUTPUT FOR (K=1,NSTA). ALL STATION C DATA ARE KEYED TO THIS LIST. THIS LIST IS USED C FOR PRINTING ONLY. EQUIVALENCED TO ICALL( , ). C (CHARACTER*8) (INPUT) C ND1 - MAXIMUM NUMBER OF STATIONS THAT CAN BE DEALT C WITH. USED AS DIMENSION OF SEVERAL VARIABLES. C (INPUT) C NSTA - THE NUMBER OF STATIONS IN CCALL( ). (INPUT) C ICALLD(L,K) - 8-CHARACTER STATION CALL LETTERS AS CHARACTERS C IN AN INTEGER VARIABLE (L=1,L3264W) (K=1,ND5). C NOTE THAT THIS REQUIRES TWO 32-BIT WORDS TO HOLD C THE DESCRIPTION BUT ONLY ONE 64-BIT WORD. C NEEDED IN CONST6 FOR ARGUMENT TO RDTDLM. C EQUIVALENCED TO CCALLD( ). (INPUT) C CCALLD(K) - 8-CHARACTER STATION CALL LETTERS (K=1,ND5). C THIS LIST IS USED IN OPTX. C EQUIVALENCED TO ICALLD( ). (INPUT) C ND5 - DIMENSION OF IPACK( , ), IWORK( ), AND DATA( ). C IN THE DRIVER, IT IS ASSURED THAT ND5 GE ND1. C IT MUST BE LARGE ENOUGH TO ACCOMMODATE THE C DATA READ FROM EXTERNAL SOURCES. (INPUT) C LSTORE(L,J) - THE ARRAY HOLDING INFORMATION ABOUT THE DATA C STORED IN THE MOS-2000 INTERNAL STORAGE SYSTEM C (L=1,12) (J=1,LITEMS). (INPUT-OUTPUT) C L=1,4--THE 4 ID'S FOR THE DATA. C L=5 --LOCATION OF STORED DATA. WHEN IN CORE, C THIS IS THE LOCATION IN CORE( ) WHERE C THE DATA START. WHEN ON DISK, C THIS IS MINUS THE RECORD NUMBER WHERE C THE DATA START. C L=6 --THE NUMBER OF 4-BYTE WORDS STORED. C L=7 --2 FOR DATA PACKED IN TDL GRIB, 1 FOR NOT. C L=8 --THE DATE/TIME OF THE DATA IN FORMAT C YYYYMMDDHH. C L=9 --NUMBER OF TIMES DATA HAVE BEEN RETRIEVED. C L=10 --NOT USED. C L=11 --SET TO 7777. C L=12 --NOT USED. C ND9 - THE SECOND DIMENSION OF LSTORE( , ). (INPUT) C LITEMS - THE NUMBER OF ITEMS (COLUMNS) IN LSTORE( , ) C THAT HAVE BEEN USED FOR THIS DATE/TIME. (INPUT) C CORE(J) - THE ARRAY TO STORE OR RETIREVE THE DATA C IDENTIFIED IN LSTORE( , ) (J=1,ND10). WHEN C CORE( ) IS FULL DATA ARE STORED ON DISK. C (INPUT) C ND10 - DIMENSION OF CORE( ). (INPUT) C NBLOCK - THE BLOCK SIZE IN WORDS OF THE INTERNAL C MOS-2000 RANDOM DISK FILE. (INPUT) C ND7 - DIMENSION OF IS0( ), IS1( ), IS2( ), AND IS4( ). C NOT ALL LOCATIONS ARE USED. (INPUT) C KGP - THE NUMBER OF GROUPS FOR THE SET OF EQUATIONS C BEING EVALUATED IN THIS CALL. (INPUT) C NGP(L) - THE NUMBER OF EQUATIONS IN EACH GROUP L C (L=1,KGP). (INPUT) C LGP(L) - FOR EACH EQUATION (L=1,KGP), THE LOCATION C IN LOCSTA ( ) OF WHERE THE FIRST STATION C IN THE GROUP IS. (INPUT) C MTRMS(L) - THE NUMBER OF TERMS IN EACH GROUP L (L=1,KGP). C (INPUT) C MTANDS - THE NUMBER OF PREDICTANDS FOR THIS EQUATION C SET. (INPUT) C ICAT(NN) - THE POSTPROCESSING INDICATOR FOR THE EQUATION C GROUP BEING PROCESSED FOR PREDICTAND NN C (NN=1,MTANDS). FOR EXAMPLE, THE C VALUE 1 WOULD REFER TO SUBROUTINE CAT1, WHICH C IS USED FOR INFLATION. POSTPROCESSING C IS VERY LIMITED IN U900, AND MAY ONLY C APPLY TO INFLATION. (INPUT) C ID(J,L,M) - THE 4-WORD ID (J=1,7) FOR EACH PREDICTOR C (M=1,MTRMS(L)) IN EACH EQUATION (L=1,KGP) OF THE C GROUP BEING PROCESSED. VALUES OF J=5-7 NOT USED; C DIMENSION IS 7 RATHER THAN 4 TO ACCOMMODATE C RDEQN, WHICH IS ALSO USED FOR U700. (INPUT) C IDPARS(J,L,M) - THE PARSED, INDIVIDUAL COMPONENTS OF THE C VARIABLE ID'S CORRESPONDING TO ID( ,L,M) (J=1,15), C (L=1,KGP) (M=1,MTRMS(L)). C J=1--CCC (CLASS OF VARIABLE), C J=2--FFF (SUBCLASS OF VARIABLE), C J=3--B (BINARY INDICATOR), C 0 = NOT BINARY, C 1 = CUMULATIVE FROM ABOVE, VALUES GE LOWER C THRESHOLD TRESHL = 1, C 2 = CUMULATIVE FROM BELOW, VALUES LT UPPER C THRESHOLD TRESHU = 1. C 3 = DISCRETE BINARY. VALUES GE LOWER C THRESHOLD AND LT UPPER THRESHOLD = 1. C 5 = GRID BINARY. VALUES GE LOWER THRESHOLD C ONLY THE VALUE OF 0, 1, OR 5 SHOULD BE USED C FOR PREDICTORS; C 0, 1, 2, OR 3 CAN BE USED FOR PREDICTANDS. C J=4--DD (DATA SOURCE, MODEL NUMBER), C J=5--V (VERTICAL APPLICATION), C J=6--LBLBLBLB (BOTTOM OF LAYER, 0 IF ONLY C 1 LAYER), C J=7--LTLTLTLT (TOP OF LAYER), C J=8--T (TRANSFORMATION), C J=9--RR (RUN TIME OFFSET, ALWAYS + AND BACK C IN TIME), C J=10--OT (TIME APPLICATION), C J=11--OH (TIME PERIOD IN HOURS), C J=12--TAU (PROJECTION IN HOURS), C J=13--I (INTERPOLATION TYPE), C J=14--S (SMOOTHING INDICATOR), AND C J=15--G (GRID INDICATOR). C TRESHL(L,M) - THE LOWER BINARY THRESHOLD CORRESPONDING TO C IDPARS( ,L,M) (M=1,MTRMS(L)), (L=1,KGP). C FOR U900, THE UPPER THRESHOLD IS ALWAYS LARGE. C THAT IS, THE PREDICTORS CARRY WITH THEM ONLY C ONE THRESHOLD, THE LOWER ONE. C JD(J,L,M) - THE BASIC INTEGER VARIABLE ID'S (J=1,4) C (M=1,MTRMS(L)), (L=1,KGP). THIS IS THE SAME C AS ID(J,L,M), EXCEPT THAT THE FOLLOWING PORTIONS C ARE OMITTED: C B = IDPARS(3, , ), C G = IDPARS(15, , ), AND C TRESHL( , ). C THE "G" VARIABLE HAS NO MEANING IN U900, C IT BEING ONLY FOR POSSIBLE USE IN U201. C ITAU(L,M) - THE NUMBER OF HOURS TO ADD TO NDATE TO GET C THE VARIABLE ID( ,L,M) (M=1,MTRMS(L)), (L=1,KGP). C THIS IS THE "LOOKAHEAD" FEATURE. (INPUT) C CONSTV(L,NN) - THE EQUATION CONSTANTS FOR GROUP L (L=1,KGP), C PREDICTAND NN (NN=1,MTANDS). (INPUT) C AVG(L,NN) - THE PREDICTAND MEANS FOR GROUP L (L=1,KGP), C PREDICTAND NN (NN=1,MTANDS). (INPUT) C CORR(L,NN) - THE MULTIPLE CORRELATIONS FOR GROUP L C (L=1,KGP), PREDICTAND NN (NN=1,MTANDS). C (INPUT) C COEF(L,M,NN) - THE COEFFICIENTS FOR GROUP L (L=1,KGP), C TERM M (M=1,MTRMS(L), PREDICTAND NN C (NN=1,MTANDS). (INPUT) C ND2 - MAXIMUM NUMBER OF TERMS IN ANY EQUATION. C THIRD DIMENSION OF ID( , , ) AND C SECOND DIMENSION OF COEF( , , ). (INPUT) C ND3 - MAXIMUM NUMBER OF PREDICTANDS IN ANY EQUATION. C USED AS DIMENSION OF SEVERAL VARIABLES. C (INPUT) C IDTAND(J,NN) - THE PREDICTAND ID'S (J=1,4) FOR PREDICTAND NN C (NN=1,MTANDS). (INPUT) C IDTPAR(J,NN) - THE PARSED PREDICTAND ID'S (J=1,15), FOR C PREDICTAND NN (NN=1,MTANDS). (INPUT) C LOCSTA(K) - THE LOCATION IN FCST( ,NN) (NN=1,MTANDS) C OF WHERE TO PUT THE FORECAST, WHERE K IS IN C ORDER OF THE EQUATIONS AS READ. (INPUT) C ND13 - MAXIMUM NUMBER OF DIFFERENT EQUATIONS. C THIS WOULD = ND1 FOR SINGLE STATION EQUATIONS, C BUT MIGHT BE ON THE ORDER OF 30 FOR REGIONAL C EQUATIONS. DIMENSION OF SEVERAL VARIABLES. C (INPUT) C INITF - 0 WHEN EVERY STATION IN THE LIST IN CCALL( ) C HAS AN EQUATION AND INITIALIZATION OF C FCST( , ) DOES NOT HAVE TO BE DONE. C - 1 OTHERWISE. C (INPUT) C PLAIN(L,J,NN) - 32 CHARACTERS (L=1,L3264W) (J=1,4) OF PLAIN C LANGUAGE DESCRIPTION OF THE PREDICTAND C NN (NN=1,MTANDS). NOTE THAT THIS REQUIRES C TWO 32-BIT WORDS TO HOLD THE DESCRIPTION C BUT ONLY ONE 64-BIT WORD. EQUIVALENCED C TO PLAIN( , ). (INPUT) C PLAIN(NN) - THE PLAIN LANGUAGE DESCRIPTION OF THE C PREDICTAND NN (NN=1,MTANDS). EQUIVALENCED TO C IPLAIN( , , ). (CHARACTER*32) (INPUT) C ISCALD(NN) - THE DECIMAL SCALING CONSTANT TO USE WHEN C PACKING THE FORECASTS FOR PREDICTAND NN C (NN=1,MTANDS). ISCALD( , ) COMES FROM THE C VARIABLE CONSTANT FILE,. C ZERO WHEN NOT FOUND IN THE FILE. (INPUT) C MINPK - MINIMUM GROUP SIZE WHEN PACKING THE C INTERPOLATED VALUES. (INPUT) C NREPLA - RECORD REPLACEMENT FLAG FOR WRITING RANDOM C ACCESS FILE. C 0 = NOT REPLACING RECORD. C 1 = REPLACING, ERROR IF RECORD NOT FOUND TO C REPLACE. C 2 = REPLACING, WRITE NEW RECORD IF RECORD NOT C FOUND TO REPLACE. C (INPUT) C NCHECK - IDENTIFICATION CHECKING FLAG FOR WRITING C RANDOM ACCESS FILE. C 0 = DON'T CHECK FOR DUPLICATES. C 1 = CHECK FOR DUPLICATES, ERROR IF FOUND. C (INPUT) C IP16 - INDICATES WHETHER (>0) OR NOT (=0) INPUT DATA C WILL BE PRINTED ON UNIT IP16. (INPUT) C IP17 - INDICATES WHETHER (>0) OR NOT (=0) FORECASTS C WILL BE PRINTED ON UNIT IP17. (INPUT) C IP18 - INDICATES WHETHER (>0) OR NOT (=0) FORECASTS C WILL BE PRINTED ON UNIT IP18 TO THE ACCURACY C PACKED. (INPUT) C NTOTBY - THE NUMBER OF BYTES PROCESSED ON THE OUTPUT C FILE KFILFC. (INPUT/OUTPUT) C NTOTRC - THE NUMBER OF RECORDS PROCESSED ON THE C OUTPUT FILE KFILFC. (INPUT/OUTPUT) C L3264B - INTEGER WORD LENGTH IN BITS OF MACHINE BEING C USED (EITHER 32 OR 64). (INPUT) C L3264W - NUMBER OF WORDS IN 64 BITS (EITHER 1 OR 2). C (INPUT) C ISTOP(J) - FOR J=1, ISTOP( ) IS INCREMENTED BY 1 EACH TIME C AN ERROR OCCURRS THAT MAY BE FATAL. C FOR J=2, ISTOP( ) IS INCREMENTED BY 1 WHENEVER AN C INPUT DATA RECORD IS NOT FOUND. (INPUT-OUTPUT) C IER - STATUS RETURN. C 0 = GOOD RETURN. C 39 = NWORDS FROM GFETCH DO NOT EQUAL NSTA. C OUTPUT ARGUMENT LIST: C KFILDO - UNIT NUMBER OF OUTPUT (PRINT) FILE. (OUTPUT) C KFIL10 - UNIT NUMBER OF TDL MOS-2000 FILE SYSTEM ACCESS. C (INPUT-OUTPUT) C LSTORE(L,J) - THE ARRAY HOLDING INFORMATION ABOUT THE DATA C STORED IN THE MOS-2000 INTERNAL STORAGE SYSTEM C (L=1,12) (J=1,LITEMS). (INPUT-OUTPUT) C L=1,4--THE 4 ID'S FOR THE DATA. C L=5 --LOCATION OF STORED DATA. WHEN IN CORE, C THIS IS THE LOCATION IN CORE( ) WHERE C THE DATA START. WHEN ON DISK, C THIS IS MINUS THE RECORD NUMBER WHERE C THE DATA START. C L=6 --THE NUMBER OF 4-BYTE WORDS STORED. C L=7 --2 FOR DATA PACKED IN TDL GRIB, 1 FOR NOT. C L=8 --THE DATE/TIME OF THE DATA IN FORMAT C YYYYMMDDHH. C L=9 --NUMBER OF TIMES DATA HAVE BEEN RETRIEVED. C L=10 --NOT USED. C L=11 --SET TO 7777. C L=12 --NOT USED. C NSTORE - COUNTS THE NUMBER OF TIMES GSTORE HAS BEEN C ENTERED. (OUTPUT) C NFETCH - COUNTS THE NUMBER OF TIMES GFETCH HAS BEEN C ENTERED. (OUTPUT) C FCST(K,NN) - THE FORECASTS FOR STATION K (K=1,KSTA), C PREDICTAND NN (NN=1,MTANDS). (OUTPUT) C NTOTBY - THE NUMBER OF BYTES PROCESSED ON THE OUTPUT C FILE KFILFC. (INPUT/OUTPUT) C NTOTRC - THE NUMBER OF RECORDS PROCESSED ON THE C OUTPUT FILE KFILFC. (INPUT/OUTPUT) C ISTOP(J) - FOR J=1, ISTOP( ) IS INCREMENTED BY 1 EACH TIME C AN ERROR OCCURRS THAT MAY BE FATAL. C FOR J=2, ISTOP( ) IS INCREMENTED BY 1 WHENEVER AN C INPUT DATA RECORD IS NOT FOUND. (INPUT-OUTPUT) C IER - STATUS RETURN. C 0 = GOOD RETURN. C 39 = NWORDS FROM GFETCH DO NOT EQUAL NSTA. C SEE OTHER ROUTINES FOR OTHER VALUES. C C DATA SET USE C INPUT FILES: (DELETE IF NO INPUT FILES IN SUBPROGRAM) C FORT.xx - INDICATE NAME & PURPOSE C C OUTPUT FILES: (DELETE IF NO OUTPUT FILES IN SUBPROGRAM) C FORT.xx - INDICATE NAME & PURPOSE C C VARIABLES C ISDATA(K) - SCRATCH ARRAY (K=1,ND1). (INTERNAL) C XDATA(K) - THE DATA FOR THE NSTA STATIONS OF THE VARIABLE C BEING PROCESSED (K=1,NSTA). (INTERNAL) C IPACK(J) - WORK ARRAY (J=1,ND5). (INTERNAL) C IWORK(J) - WORK ARRAY (J=1,ND5). (INTERNAL) C DATA(J) - WORK ARRAY (J=1,ND5). (INTERNAL) C IS0(J) - MOS-2000 GRIB SECTION 0 ID'S (J=1,3). C (INTERNAL) C IS1(J) - MOS-2000 GRIB SECTION 1 ID'S (J=1,22+). C (INTERNAL) C IS2(J) - MOS-2000 GRIB SECTION 2 ID'S (J=1,12). C (INTERNAL) C IS4(J) - MOS-2000 GRIB SECTION 4 ID'S (J=1,4). C (INTERNAL) C IUSED(L,M) - WORK ARRAY ASSOCIATED WITH EACH PREDICTOR C (M=1,MTRMS(L)) IN EACH EQUATION (L=1,KGP). C INITIALLY SET TO ZERO; SET TO 1 WHEN THE C TERM HAS BEEN EVALUATED. (INTERNAL) C ITIME - 0 TO FURNISH TO GFETCH TO INDICATE NO TIME C OFFSET IS TO BE MADE BECAUSE OF RR. (INTERNAL) C NWORDS - NUMBER OF WORDS IN XDATA( ) RETURNED FROM GFETCH. C (INTERNAL) C LWORDS - NUMBER OF WORDS IN IPACK( ) RETURNED FROM PACKV. C (INTERNAL) C NTIMES - THE NUMBER OF TIMES, INCLUDING THIS ONE, THAT C THE DATA HAVE BEEN FETCHED. THIS IS STORED IN C LSTORE(9, ) AND RETURNED BY GFETCH. (INTERNAL) C NSOURC - THE "MODEL NUMBER" OR SOURCE OF DATA TAKEN FROM C LSTORE(10, ) BY GFETCH. (INTERNAL) C ISTAB - 1 WHEN THE VARIABLE RETRIEVED FROM OPTX IS BINARY; C 0 OTHERWISE. C NOT ACTUALLY USED. (INTERNAL) C ISCALE - BINARY SCALING FOR PACKING = 0. (INTERNAL) C JP(J) - CONTROLS PRINTING OF FORECASTS (J=3). C 1 = PRINT, 0 = DON'T PRINT. (J=1,2) NOT USED. C NEEDED FOR PACKV. INITIALIZED FROM IP18. C (INTERNAL) C N - DUMMY VARIABLE FOR CALL TO GFETCH. (INTERNAL) C MDATE - NDATE UPDATED WITH ITAU( , ). (INTERNAL) C NCAT - 0 FOR CALL TO OPTX. MEANINGLESS FOR U900. C C SUBPROGRAMS CALLED: C UNIQUE: - OPTX C C LIBRARY: C W3LIB - C MDLLIB90 - TIMPR,DOY,GTFETCH,BINARY,CAT1,SETMIS,PACKV C C EXIT STATES: C COND = 0 - SUCCESSFUL RUN C 39 - NWORDS FROM GFETCH DO NOT EQUAL NSTA. C C REMARKS: NONE C C ATTRIBUTES: C LANGUAGE: FORTRAN 90 (xlf90 compiler) C MACHINE: IBM SP C C$$$ C CHARACTER*8 CCALL(ND1), 1 CCALLD(ND5) CHARACTER*32 PLAIN(ND3) CHARACTER*60 RACESS(NUMRA),CFILX C DIMENSION ICALL(L3264W,ND1),ISDATA(ND1),XDATA(ND1) DIMENSION IPACK(ND5),ICALLD(L3264W,ND5), 1 IWORK(ND5),DATA(ND5) DIMENSION IS0(ND7),IS1(ND7),IS2(ND7),IS4(ND7) DIMENSION LSTORE(12,ND9) DIMENSION CORE(ND10) DIMENSION NGP(ND13),LGP(ND13),MTRMS(ND13) DIMENSION ID(7,ND13,ND2),IDPARS(15,ND13,ND2),TRESHL(ND13,ND2), 1 JD(4,ND13,ND2),ITAU(ND13,ND2),IUSED(ND13,ND2) DIMENSION CONSTV(ND13,ND3), 1 AVG(ND13,ND3), 2 CORR(ND13,ND3) DIMENSION COEF(ND13,ND2,ND3) DIMENSION ISCALD(ND3),ICAT(ND3) DIMENSION IDTAND(4,ND3),IDTPAR(15,ND3) DIMENSION IPLAIN(L3264W,4,ND3) DIMENSION LOCSTA(ND1) DIMENSION FCST(ND1,ND3) DIMENSION KFILRA(NUMRA) DIMENSION JP(3),ISTOP(2) C DATA ITIME/0/ DATA ISCALE/0/ DATA JP/3*0/ DATA NCAT/0/ C D CALL TIMPR(KFILDO,KFILDO,'START FCST90 ') C IER=0 JFLAG=0 IF(IP18.NE.0)JP(3)=1 C JP(3) IS USED IN PACKV. CALL DOY(NDATE,NYR,NMO,NDA,NHR,MDOY) C C INITIALIZE THE FORECAST ARRAY TO 9999 WHEN ONE OR MORE C STATIONS HAS NO EQUATION. C IF(INITF.EQ.0)GO TO 101 C DO 1001 NN=1,MTANDS DO 1000 K=1,NSTA FCST(K,NN)=9999. 1000 CONTINUE 1001 CONTINUE C C INITIALIZE THE FORECAST ARRAY TO THE EQUATION CONSTANTS. C NOTE THAT NGP( ) CAN BE ZERO, BUT UNLESS THE "ONE TRIP" C COMPILER DIRECTIVE IS ON, THE LOOP WILL CORRECTLY NOT C EXECUTE. C 101 DO 104 L=1,KGP C DO 103 KK=1,NGP(L) K=LOCSTA(LGP(L)+KK-1) C DO 102 NN=1,MTANDS FCST(K,NN)=CONSTV(L,NN) D WRITE(KFILDO,1010)L,KK,NN,K,CONSTV(L,NN) D1010 FORMAT(' IN FCST90 AT 101,L,KK,NN,K,CONSTV(L,NN)', D 1 4I6,F10.4) 102 CONTINUE C 103 CONTINUE C 104 CONTINUE C C INITIALIZE IUSED( , ) C DO 110 L=1,KGP C DO 109 M=1,MTRMS(L) IUSED(L,M)=0 109 CONTINUE C 110 CONTINUE C C FIND ALL VARIABLES AND MAKE FORECASTS. C DO 400 L=1,KGP C DO 399 M=1,MTRMS(L) LL=L C LL MAY BE CHANGED DURING THE LOOP. MM=M C MM MAY BE CHANGED DURING THE LOOP. D WRITE(KFILDO,115)L,M,IUSED(L,M) D115 FORMAT(' FCST90 AT 105--L,M,IUSED(L,M)'3I4) C IF(IUSED(L,M).EQ.1)GO TO 399 C C ADJUST NDATE FOR ITAU( , ). C IF(ITAU(L,M).EQ.0)THEN MDATE=NDATE ELSE CALL UPDAT(NDATE,ITAU(L,M),MDATE) ENDIF C C LOOK FIRST FOR FULL ID. NORMALLY, FOR U900, MOST OR C ALL COMPUTATIONS WILL HAVE BEEN MADE. IF(INT(IDPARS(1,L,M)/100).EQ.2.AND.(IDPARS(4,L,M).EQ.05.OR. 1 IDPARS(4,L,M).EQ.15.OR. 2 IDPARS(4,L,M).EQ.25).AND. 3 IDPARS(3,L,M).EQ.0)THEN CALL CONST(KFILDO,KFIL10,IP12, 1 ID(1,L,M),IDPARS(1,L,M),JD(1,L,M),NDATE, 2 KFILRA,RACESS,NUMRA, 3 CCALL,ICALLD,CCALLD, 4 ISDATA,XDATA,ND1,NSTA, 5 IPACK,IWORK,DATA,ND5, 6 LSTORE,ND9,LITEMS,CORE,ND10,LASTL, 7 NBLOCK,LASTD,NSTORE,NFETCH, 8 IS0,IS1,IS2,IS4,ND7, 9 ISTAV,L3264B,L3264W,IER) JFLAG=1 ELSE CALL GFETCH(KFILDO,KFIL10,ID(1,L,M),7777,LSTORE,ND9,LITEMS, 1 IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,XDATA,ND5, 2 NWORDS,NPACK,MDATE,NTIMES,CORE,ND10, 3 NBLOCK,NFETCH,NSOURC,MISSP,MISSS,L3264B,ITIME, 4 IER) JFLAG=2 ENDIF C C AN ERROR IN GFETCH WILL GENERATE A DIAGNOSTIC. MOST VALUES C OF IER SHOULD BE NEAR FATAL. ISTOP(1) IS INCREMENTED, EXCEPT C WHEN IER = 47, WHICH JUST MEANS DATA COULD NOT BE FOUND. C ONLY POINT BINARY TRANSFORMATIONS CAN BE MADE DIRECTLY C (NOT USING OPTX) FROM U900. IF THE VARIABLE IS NOT PRESENT, C THE BASIC VARIABLE IS LOOKED FOR. C IF(IER.EQ.0)THEN C IF(JFLAG.EQ.1.AND.IS4(3).NE.NSTA)THEN WRITE(KFILDO,131)IS4(3),NSTA IER=39 ISTOP(1)=ISTOP(1)+1 C DO 123 K=1,NSTA XDATA(K)=9999. 123 CONTINUE C GO TO 350 ELSEIF(JFLAG.EQ.2.AND.NWORDS.NE.NSTA)THEN WRITE(KFILDO,133)NWORDS,NSTA IER=39 ISTOP(1)=ISTOP(1)+1 C DO 124 K=1,NSTA XDATA(K)=9999. 124 CONTINUE C GO TO 350 C ENDIF C GO TO 350 C WHEN FULL ID IS FOUND, IF VARIABLE IS BINARY, IT IS C ALREADY BINARY, SO DON'T GO THERE. C ELSEIF(IER.EQ.47)THEN C JUST MISSING DATA, A NOT UNEXPECTED EVENT. GO TO OPTX, C DO NOT COUNT THIS AS AN ERROR. GO TO 128 C ELSE ISTOP(1)=ISTOP(1)+1 C FATAL ERROR FOR THIS VARIABLE. IT WAS FOUND BY GFETCH, BUT C COULD NOT BE RETURNED. ALL VALUES WILL BE MISSING. C GO TO 350 C ENDIF C C TRY TO FIND BASIC VARIABLE IN LSTORE AND RETURN IT C IN XDATA( ), UNLESS ID( , , ) AND JD( , , ) ARE THE C SAME. C 128 IF(JD(1,L,M).EQ.ID(1,L,M).AND. 1 JD(2,L,M).EQ.ID(2,L,M).AND. 2 JD(3,L,M).EQ.ID(3,L,M).AND. 3 JD(4,L,M).EQ.ID(4,L,M))GO TO 134 C IF(INT(IDPARS(1,L,M)/100).EQ.2.AND.(IDPARS(4,L,M).EQ.05.OR. 1 IDPARS(4,L,M).EQ.15.OR. 2 IDPARS(4,L,M).EQ.25))THEN CALL CONST(KFILDO,KFIL10,IP12, 1 JD(1,L,M),IDPARS(1,L,M),JD(1,L,M),NDATE, 2 KFILRA,RACESS,NUMRA, 3 CCALL,ICALLD,CCALLD, 4 ISDATA,XDATA,ND1,NSTA, 5 IPACK,IWORK,DATA,ND5, 6 LSTORE,ND9,LITEMS,CORE,ND10,LASTL, 7 NBLOCK,LASTD,NSTORE,NFETCH, 8 IS0,IS1,IS2,IS4,ND7, 9 ISTAV,L3264B,L3264W,IER) JFLAG=1 ELSE CALL GFETCH(KFILDO,KFIL10,JD(1,L,M),7777,LSTORE,ND9,LITEMS, 1 IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,XDATA,ND5, 2 NWORDS,NPACK,MDATE,NTIMES,CORE,ND10, 3 NBLOCK,NFETCH,NSOURC,MISSP,MISSS,L3264B,ITIME, 4 IER) JFLAG=2 ENDIF C NOTE THAT JD( ), NOT ID( ) IS USED IN THE ABOVE CALL. C IF(IER.EQ.0)THEN C IF(JFLAG.EQ.1.AND.IS4(3).NE.NSTA)THEN WRITE(KFILDO,131)IS4(3),NSTA 131 FORMAT(/' ****ERROR IN FCST90 RETURNING FROM CONST.', 1 ' IER = 0, BUT IS4(3) =',I5, 2 ' NOT EQUAL TO NSTA =',I5,'.') IER=39 ISTOP(1)=ISTOP(1)+1 C DO 132 K=1,NSTA XDATA(K)=9999. 132 CONTINUE C GO TO 350 ELSEIF(JFLAG.EQ.2.AND.NWORDS.NE.NSTA)THEN WRITE(KFILDO,133)NWORDS,NSTA 133 FORMAT(/' ****ERROR IN FCST90 RETURNING FROM GFETCH.', 1 ' IER = 0, BUT NWORDS =',I5, 2 ' NOT EQUAL TO NSTA =',I5,'.') IER=39 ISTOP(1)=ISTOP(1)+1 C DO 1335 K=1,NSTA XDATA(K)=9999. 1335 CONTINUE C GO TO 350 C ENDIF C GO TO 206 C IF THE BASIC VARIABLE IS THE ONE FOUND, GIVE BINARY C A CHANCE. C ELSEIF(IER.EQ.47)THEN C JUST MISSING DATA, A NOT UNEXPECTED EVENT. GO TO OPTX, C DO NOT COUNT THIS AS AN ERROR. GO TO 134 C ELSE ISTOP(1)=ISTOP(1)+1 C FATAL ERROR FOR THIS VARIABLE. IT WAS FOUND BY GFETCH, BUT C COULD NOT BE RETURNED. ALL VALUES WILL BE MISSING. C GO TO 350 C ENDIF C C MUST COMPUTE THIS VARIABLE. C NOTE THAT 9997 AS WELL AS 9999 MUST BE HANDLED. C THE DATA WILL BE RETURNED READY TO USE, EXCEPT C FOR POSSIBLE BINARY FORMULATION, IN XDATA( ). C 134 CALL OPTX(KFILDO,KFIL10,IP12,KFILRA,RACESS,NUMRA, 1 ID(1,L,M),IDPARS(1,L,M),TRESHL(L,M),JD(1,L,M),ITAU(L,M), 2 NDATE,MDATE,CCALL,ISDATA,XDATA,ND1,NCAT,NSTA, 3 ICALLD,CCALLD,IPACK,IWORK,DATA,ND5, 4 LSTORE,ND9,LITEMS,CORE,ND10, 5 LASTL,LASTD,NBLOCK,NSTORE,NFETCH, 6 IS0,IS1,IS2,IS4,ND7, 7 L3264B,L3264W,ISTAB,IER) C IT IS ASSUMED THAT ANY VARIABLE COMPUTED IN OPTX IS NOT C BINARY. C IF(IER.NE.0)THEN C IF(IER.EQ.120)THEN ISTOP(1)=ISTOP(1)+1 C IER = 120 FROM FINDST IN CONST IN OPTX MEANS ONE OR MORE C STATIONS NOT FOUND IN THE DIRECTORY. ELSE ISTOP(2)=ISTOP(2)+1 C AN ERROR IN OPTX WILL GENERATE A DIAGNOSTIC AND DATA IN C XDATA( ) HAVE BEEN SET TO 9999. ISTOP(2) IS INCREMENTED, C EVEN WHEN IER = 47, WHICH JUST MEANS DATA COULD NOT C BE FOUND. (IT IS POSSIBLE THAT ERRORS OTHER THAN JUST C MISSING DATA OCCURRED.) GO TO 350 ENDIF ENDIF C 206 IF(IDPARS(3,L,M).NE.1)GO TO 207 C IT IS NOT A BINARY. C CALL BINARY(KFILDO,ID(1,L,M),IDPARS(3,L,M),TRESHL(L,M), 1 XDATA,NSTA,IER) IF(IER.NE.0)ISTOP(1)=ISTOP(1)+1 C IF IER NE 0, BINARY WILL HAVE WRITTEN A DIAGNOSTIC C AND SET XDATA( ) = 9999. 207 CONTINUE C 350 IF(IP16.NE.0)THEN WRITE(IP16,351)(ID(J,L,M),J=1,4),NDATE 351 FORMAT(/,' DATA FOR VARIABLE ',3(1X,I9.9),1X,I10.3, 1 ' FOR DATE',I12) WRITE(IP16,352)(CCALL(K),XDATA(K),K=1,NSTA) 352 FORMAT((' ',A8,1X,F12.6)) ENDIF C C 353 DO 360 KK=1,NGP(LL) K=LOCSTA(LGP(LL)+KK-1) C IF(XDATA(K).NE.9999.)THEN C DO 355 NN=1,MTANDS IF(FCST(K,NN).EQ.9999.)GO TO 355 D WRITE(KFILDO,354)LL,MM,KK,NGP(LL),LGP(LL),K,NN, D 1 FCST(K,NN),COEF(LL,MM,NN),XDATA(K) D354 FORMAT(' FCST90 AT 354--LL,MM,KK,NGP(LL),LGP(LL),K,NN,', D 1 'FCST(K,NN),COEF(LL,MM,NN),XDATA(K)'/ D 2 ' '7I6,3F8.2) FCST(K,NN)=FCST(K,NN)+COEF(LL,MM,NN)*XDATA(K) 355 CONTINUE C ELSE C DO 357 NN=1,MTANDS FCST(K,NN)=9999. 357 CONTINUE C ENDIF C 360 CONTINUE C IUSED(LL,MM)=1 C C THE FOLLOWING LOOPS DETERMINE WHETHER OR NOT THIS C VARIABLE IS NEEDED FOR SOME OTHER EQUATION. IF SO, C THE LL,MM COMBINATION IS USED IN THE LOOP ABOVE. SINCE C THE NUMBER OF EQUATIONS WILL USUALLY BE MUCH LESS C THAN THE NUMBER OF VARIABLES IN LSTORE( ), THE SEARCH C TIME SHOULD BE LESS THAN IF GFETCH WERE ENTERED FOR C EVERY TERM IN EVERY EQUATION. C DO 370 LLL=LL,KGP C DO 365 MMM=MM,MTRMS(LLL) D WRITE(KFILDO,361)LL,MM,LLL,MMM D361 FORMAT(' FCST90 AT 361--LL,MM,LLL,MMM'4I4) IF(IUSED(LLL,MMM).EQ.1)GO TO 365 C THE ABOVE TEST IS FOR SAFETY AND TO SKIP THE C LL = L, MM = M CASE. C C THIS ID( ,LL,MM) HAS NOT BEEN USED. C D WRITE(KFILDO,362)(ID(J,L,M),J=1,4),ITAU(L,M), D 1 (ID(J,LLL,MMM),J=1,4),ITAU(LLL,MMM) D362 FORMAT(' FCST90 AT 362'2(I15,2I11,2I4)) C IF(ID(1,LLL,MMM).NE.ID(1,L,M).OR. 1 ID(2,LLL,MMM).NE.ID(2,L,M).OR. 2 ID(3,LLL,MMM).NE.ID(3,L,M).OR. 3 ID(4,LLL,MMM).NE.ID(4,L,M).OR. 4 ITAU(LLL,MMM).NE.ITAU(L,M))GO TO 365 C THIS IS THE SAME PREDICTOR. LL=LLL MM=MMM GO TO 353 C 365 CONTINUE C 370 CONTINUE C 399 CONTINUE C 400 CONTINUE C C PRINT FORECASTS IF DESIRED. C IF(IP17.EQ.0)GO TO 435 WRITE(IP17,420)NDATE 420 FORMAT(/' FORECASTS FOR STATIONS FOR',I12) C DO 429 K=1,NSTA WRITE(IP17,427)CCALL(K),(FCST(K,NN),NN=1,MTANDS) 427 FORMAT(' ',A8,1X,12F10.4/(10X,12F10.4)) 429 CONTINUE C C POSTPROCESS THE FORECASTS. INFLATION NEEDS TO BE C DONE HERE BECAUSE CORRELATIONS AND AVERAGE ARE C AVAILABLE HERE AND ARE NOT CARRIED FORWARD. OTHER C POST PROCESSING COULD BE DONE, BUT MOST IS RESERVED C FOR POST PROCESSING ROUTINES THAT MAY NEED DATA AND C FORECASTS FROM MORE THAN ONE SET OF EQUATIONS. IF C DONE HERE, THE ORDER OF EQUATION EVALUATION MIGHT C BE AN ISSUE. CAT1/CAT2 IS ENTERED FOR EACH CATEGORY. C 435 DO 437 NN=1,MTANDS C IF(ICAT(NN).EQ.1)THEN CALL CAT1(KFILDO,FCST(1,NN),AVG(1,NN),CORR(1,NN), 1 LOCSTA,ND1,ND3,ND13,NSTA, 2 KGP,NGP,LGP,MTANDS, 2 ICAT(NN),IER) IF(IER.NE.0)ISTOP(1)=ISTOP(1)+1 ELSEIF(ICAT(NN).EQ.2)THEN CALL CAT2(KFILDO,FCST(1,NN),AVG(1,NN),CORR(1,NN), 1 LOCSTA,ND1,ND3,ND13,NSTA, 2 KGP,NGP,LGP,MTANDS, 3 ICAT(NN),IER) IF(IER.NE.0)ISTOP(1)=ISTOP(1)+1 C IF IER NE 0, CAT1 OR CAT2 WILL HAVE WRITTEN A DIAGNOSTIC. C XDATA( ) IS NOT MODIFIED. ELSEIF(ICAT(1).NE.0.AND.ICAT(1).NE.1.AND.ICAT(1).NE.2)THEN WRITE(KFILDO,436)ICAT(1) 436 FORMAT(/,' ****ICAT(1) =',I4,' NOT RECOGNIZABLE IN FCST90.', 1 ' CONTINUING.') ISTOP(1)=ISTOP(1)+1 ENDIF C 437 CONTINUE C C WRITE IF DESIRED. C IF(KFILFC.EQ.0.AND.KFILX.EQ.0)GO TO 500 C DO 440 NN=1,MTANDS C C SET XMISSS = 0 OR 9997, RESPECTIVELY, DEPENDING ON C WHETHER OR NOT A 9997 OCCURS IN THE DATA TO BE C PACKED. SET XMISSP = 0 OR 9999, RESPECTIVELY, DEPENDING ON C WHETHER A 9997 OR 9999 OCCURS IN THE DATA. C CALL SETMIS(KFILDO,FCST(1,NN),NSTA,XMISSP,XMISSS) C C PACK THE DATA AND WRITE TO SEQUENTAL FILE WHEN DESIRED. C THE PACKED DATA ARE RETURNED IN IPACK( ) AND CAN BE C WRITTEN TO THE RANDOM ACCESS FILE. PACKV WRITES C THE PACKED DATA ONLY WHEN KFILX NE 0. C NBYT=NTOTBY CALL PACKV(KFILDO,KFILFC,IDTAND(1,NN),IDTPAR(1,NN), 1 JP,ISCALD(NN),ISCALE, 2 IPLAIN(1,1,NN),PLAIN(NN),NDATE,NYR,NMO,NDA,NHR, 3 CCALL,ISDATA,FCST(1,NN),ND1,NSTA,IPACK,ND5,MINPK, 4 IS0,IS1,IS2,IS4,ND7,XMISSP,XMISSS, 5 IP18,LWORDS,NTOTBY,NTOTRC, 6 L3264B,L3264W,ISTOP(1),IER) C AN ERROR IN PACKV WILL PRINT A DIAGNOSTIC AND INCREMENT C ISTOP(1). C IF(KFILX.EQ.0)GO TO 440 CALL WRTDLR(KFILDO,KFILX,CFILX,IS1(9),ICALL,CCALL,ND1,NSTA, 1 ICALLD,CCALLD,ND5,IPACK,LWORDS, 2 NREPLA,NCHECK,L3264B,L3264W,IER) IF(IER.EQ.0)GO TO 440 ISTOP(1)=ISTOP(1)+1 C AN ERROR IN WRTDLR WILL PRINT A DIAGNOSTIC. 440 CONTINUE C 500 RETURN END