1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
C SAMPLE.F
C CONVERT YOUR DATA TO A McIDAS GR3D FILE.
C THE MAIN PROGRAM OF YOUR CONVERSION PROGRAM MUST
C BE NAMED SUBROUTINE MAIN0
C
SUBROUTINE MAIN0
C
C THE NEXT TWO COMMENTS ARE PRINTED BY THE 'help sample' COMMAND
C ? SAMPLE program to convert data to 3D grid files
C ? sample gridf#
C
C DIMENSIONS OF 3D GRID
C NOTE NLATS, NLONS AND NHGTS MUST ALL BE AT LEAST 2
PARAMETER (NLATS=31,NLONS=51,NHGTS=16)
C
C NUMBER OF PHYSICAL VARIABLES AND NUMBER OF TIME STEPS
C NOTE EITHER OR BOTH MAY BE EQUAL TO 1. THAT IS, VIS-5D DOES
C NOT FORCE YOU TO HAVE MULTIPLE VARIABLES OR TIME DYNAMICS.
PARAMETER (NVARS=5,NTIMES=100)
C
C ARRAY FOR 3D GRID DATA
REAL*4 G(NLATS, NLONS, NHGTS)
C ARRAYS FOR GRID FILE ID AND GRID DIRECTORY
INTEGER ID(8), IDIR(64)
C ARRAY FOR VARIABLE NAMES
CHARACTER*4 CNAME(NVARS)
C
C LATITUDE, LONGITUDE AND HEIGHT BOUNDS FOR SPATIAL GRID
DATA XLATS/20.0/,XLATN/50.0/
DATA XLONE/70.0/,XLONW/120.0/
DATA XHGTB/0.0/,XHGTT/15.0/
C
C STARTING DATE IN YYDDD AND TIME IN HHMMSS
DATA JDAY/88035/,JTIME/020000/
C TIME STEP IN HHMMSS
DATA JSTEP/000100/
C
C NAMES OF THE FIVE PHYSICAL VARIABLES
DATA CNAME/'U ', 'V ', 'W ', 'T ', 'P '/
C INITIALIZE GRID DIRECTORY TO ZEROS
DATA IDIR/64*0/
C
C READ GRID FILE NUMBER FROM COMMAND LINE. IPP WILL
C CONVERT THE PARAMETER # 1 TO AN INTEGER, WITH A DEFAULT
C VALUE OF 0.
IGRIDF=IPP(1,0)
C IF ILLEGAL GRID FILE NUMBER, PRINT ERROR MESSAGE AND RETURN
IF(IGRIDF .LT. 1 .OR. IGRIDF .GT. 9999) THEN
CALL EDEST('BAD GRID FILE NUMBER ',IGRIDF)
CALL EDEST('MUST BE BETWEEN 1 AND 9999 ',0)
RETURN
ENDIF
C
C CALCULATE GRID INTERVALS
XLATIN=(XLATN-XLATS)/(NLATS-1)
XLONIN=(XLONW-XLONE)/(NLONS-1)
XHGTIN=(XHGTT-XHGTB)/(NHGTS-1)
C
C DATE AND TIME FOR FIRST TIME STEP
C IDAYS CONVERTS YYDDD FORMAT TO DAYS SINCE JAN. 1, 1900
IDAY=IDAYS(JDAY)
C ISECS CONVERTS HHMMSS FORMAT TO SECONDS SINCE MIDNIGHT
ISEC=ISECS(JTIME)
C
C INITIALIZE GRID IDENTIFIER TEXT TO BLANKS
C NOTE LIT CONVERTS A CHARACTER*4 TO AN INTEGER*4
DO 10 I=1,8
10 ID(I)=LIT(' ')
C
C SET UP DIRECTORY ENTRY
C
C DIMENSIONS OF GRID
IDIR(1)=NLATS*NLONS*NHGTS
IDIR(2)=NLATS
IDIR(3)=NLONS
IDIR(4)=NHGTS
C
C LATITUDES AND LONGITUDES IN DEGREES * 10000
IDIR(22)=4
IDIR(23)=NINT(XLATN*10000.)
IDIR(24)=NINT(XLONW*10000.)
IDIR(25)=NINT(XLATIN*10000.0)
IDIR(26)=NINT(XLONIN*10000.0)
C
C HEIGHTS IN METERS
IDIR(31)=1
IDIR(32)=NINT(XHGTT*1000.)
IDIR(33)=NINT(XHGTIN*1000.)
C
C CREATE THE GRID FILE
CALL IGMK3D(IGRIDF, ID, NLATS*NLONS*NHGTS)
C
C LOOP FOR TIME STEPS
DO 200 IT=1,NTIMES
C
C SET DATE AND TIME IN DIRECTORY ENTRY
C IYYDDD CONVERTS DAYS SINCE JAN. 1, 1900 TO OUR YYDDD FORMAT
IDIR(6)=IYYDDD(IDAY)
C IHMS CONVERTS SECONDS SINCE MIDNIGHT TO OUR HHMMSS FORMAT
IDIR(7)=IHMS(ISEC)
C
C LOOP FOR PHYSICAL VARIABLES
DO 190 IV=1,NVARS
C
C SET VARIABLE NAME IN DIRECTORY ENTRY
IDIR(9)=LIT(CNAME(IV))
C
C *************************************************************
C READ YOUR DATA FOR TIME STEP NUMBER IT AND VARIABLE NUMBER IV
C INTO THE ARRAY G HERE.
C NOTE THAT G(1,1,1) IS THE NORTH WEST BOTTOM CORNER AND
C G(NLATS,NLONS,NHGTS) IS THE SOUTH EAST TOP CORNER.
C MARK A GRID POINT AS 'MISSING DATA' BY SETTING IT = 1.0E35
C
C
C
C
C
C
C *************************************************************
C
C CALCULATE 3D GRID NUMBER
IGRID=IV+NVARS*(IT-1)
C WRITE DATA IN G AND DIRECTORY IN IDIR TO 3D GRID
C NOTE WE PASS THE NEGATIVE OF THE GRID NUMBER (I.E. -IGRID)
CALL IGPT3D(IGRIDF,-IGRID,G,NLATS,NLONS,NHGTS,IDIR,IGNO)
C
C END OF PHYSICAL VARIABLE LOOP
190 CONTINUE
C
C INCREMENT DATE AND TIME, CONVERT JSTEP FROM HHMMSS TO SECONDS
ISEC=ISEC+ISECS(JSTEP)
C IF SECONDS CARRY PAST ONE DAY, ADJUST SECONDS AND DAYS
IDAY=IDAY+ISEC/(24*3600)
ISEC=MOD(ISEC,24*3600)
C
C END OF TIME STEP LOOP
200 CONTINUE
C
RETURN
END
|