rda-python-icoads 1.0.7__py3-none-any.whl → 1.0.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rda-python-icoads might be problematic. Click here for more details.

@@ -0,0 +1,612 @@
1
+ !------------------------------------------------------------------------------
2
+ !
3
+ ! Title : msgsubset.f
4
+ ! Author : Zaihua Ji, zji@ucar.edu
5
+ ! Date : 11/16/2010
6
+ ! 2025-02-28 transferred to package rda_python_icoads from
7
+ ! subset.f in https://github.com/NCAR/rda-icoads.git
8
+ ! Purpose : Fortran program Subsetting ICOADS MSG data
9
+ !
10
+ ! Github : https://github.com/NCAR/rda-python-icoads.git
11
+ !
12
+ ! Instruction:
13
+ ! after python -m pip install rda_python_icoads
14
+ ! cd $ENVHOME/bin/
15
+ ! gfortran -o msgsubset $ENVHOME/lib/python3.n*/site-packages/rda_python_icoads/msgsubset.f
16
+ !
17
+ ! *: python 3 release number, for example n = 10 in Python 3.10.12
18
+ ! $ENVHOME: /glade/u/home/rdadata/rdamsenv (venv) on DECS machines, and
19
+ ! /glade/work/rdadata/conda-envs/pg-rda (conda) on DAV;
20
+ !------------------------------------------------------------------------------
21
+ PROGRAM SUBSET
22
+ IMPLICIT INTEGER(A-E,G-Z)
23
+ !
24
+ CHARACTER*15 PROGID
25
+ DATA PROGID/'SUBSET.MSG.01B'/
26
+ C Read and extract MSG data within specified time and region
27
+ c on LINUX machine, compile it as 'gfortran -o subset subset.f'
28
+ C
29
+ DATA UNIT/1/,FMISS/-9999./
30
+ C
31
+ CHARACTER RPT*64
32
+ C
33
+ CHARACTER FORMAT*640
34
+ PARAMETER(NUMBER=49, iout=20)
35
+
36
+ parameter (iomax=500000) !maximum number of records in an output file
37
+
38
+ COMMON /MSG1/FUNITS(NUMBER,3:9),FBASE(NUMBER,3:9),BITS(NUMBER)
39
+ +,OFFSET(NUMBER),FORMAT(3:9),RPTID,INDXCK
40
+ C
41
+ DIMENSION CODED(NUMBER),FTRUE(NUMBER)
42
+ PARAMETER(S1=1,S3=2,S5=3,M=4,N=5,S=6,D=7,H=8,X=9,Y=10)
43
+ REAL YEAR,MONTH,BSZ,BLO,BLA,PID1,PID2,GRP,CK
44
+ COMMON YEAR,MONTH,BSZ,BLO,BLA,PID1,PID2,GRP,CK,FTRUE2(4,Y)
45
+ EQUIVALENCE(FTRUE,YEAR)
46
+ C
47
+ CHARACTER*4 type, vname
48
+ character*120 ierror,formato,header,colhead,kname
49
+ integer index(number),group,nstat,idstr,idend,nfile,jfile
50
+ integer nrecin, nrecout, inlen, outlen, vlen, lennam, resol
51
+ real alatt,alatb,alonl,alonr,alat,alon,xlat,xlon
52
+ character*80 indir, infile, outdir, outfile
53
+
54
+ c read control data
55
+ read(5,'(a)')header
56
+ read(5,'(a)')colhead
57
+ read(5,*)group
58
+ read(5,*)nstat
59
+ read(5,*)(index(i),i=1,nstat)
60
+ read(5,*)ichkmis
61
+ read(5,'(a)')formato
62
+ read(5,*)alatb,alatt,alonl,alonr,idstr,idend
63
+ read(5,'(i1)')resol
64
+ read(5,'(a3)')type
65
+ read(5,'(a2)')vname
66
+ vlen = lentrm(vname)
67
+ read(5, '(a)') indir
68
+ inlen = lentrm(indir) ! input directory string length
69
+ read(5, '(a)') outdir
70
+ outlen = lentrm(outdir) ! output directory string length
71
+ read(5, *) nfile ! number of input msg data files
72
+ C
73
+ C final check of latitudes/longitudes, added by Hua, 05/18/04
74
+ C
75
+ write(*,5)header(:lentrm(header)),group,nstat,ichkmis,
76
+ * formato(:lentrm(formato)),resol,type,vname(:vlen),
77
+ * alatb,alatt,alonl,alonr,idstr,idend,
78
+ * indir(:inlen),outdir(:outlen),nfile
79
+ 5 format(' Control data:'/,
80
+ * ' comment header :',a/,
81
+ * ' group number :',i6/,
82
+ * ' num. stats :',i6/,
83
+ * ' missing data chk :',i6/,
84
+ * ' output format :',a/,
85
+ * ' data resolution :',i1/,
86
+ * ' statistic type :',a3/,
87
+ * ' Variable Name :',a/,
88
+ * ' latitude limits :',2f8.2/,
89
+ * ' longitude limits :',2f8.2/,
90
+ * ' date limits :',2i8/,
91
+ * ' Data Directory :',a/,
92
+ * ' Output Diretory :',a/,
93
+ * ' num. msg files :',i5/)
94
+
95
+ print*,' array index numbers for the variables :'
96
+ write(*,'(20i3)')(index(i),i=1,nstat)
97
+
98
+ nrecout = 0
99
+ nrecin = 0
100
+ jfile = 0 !output file counter
101
+ iorec = 0
102
+
103
+ 50 continue
104
+ if(nfile .le. 0) goto 950 ! all input files are processed
105
+ nfile = nfile - 1
106
+ c
107
+ c get input file name and open it for read
108
+ c
109
+ read(5, '(a)') infile
110
+ lennam=lentrm(infile)
111
+ print *, "Reading MSG file: " // infile(:lennam)
112
+ if(nrecin .gt. 1) then
113
+ print *, "Records In:", nrecin, " & Out:", nrecout
114
+ endif
115
+ print *, "Number of MSG Files Left:", nfile
116
+
117
+ C OPEN TO READ BINARY DATA measures RECL in BYTES!!!!!
118
+ OPEN(UNIT,FORM='UNFORMATTED',ACCESS='DIRECT',RECL=LEN(RPT)
119
+ +,STATUS='OLD',file=indir(:inlen)//infile(:lennam))
120
+
121
+ C INITIALIZE NUMBER OF RECORDS READ
122
+ NREC=1
123
+
124
+ C READ REPORT (MACHINE-DEPENDENT MODIFICATIONS MAY BE NEEDED)
125
+ 100 READ(UNIT,REC=NREC,IOSTAT=EOF)RPT
126
+ C EOF OF ZERO INDICATES A SUCCESSFUL READ
127
+ IF(EOF.NE.0) GOTO 50
128
+ C INCREMENT NUMBER OF RECORDS READ
129
+ NREC=NREC+1
130
+ nrecin = nrecin + 1
131
+ C
132
+ C UNPACK REPORT AND CONVERT CODED TO TRUE VALUES
133
+ GROUP=ICHAR(RPT(8:8))/16
134
+ CALL GETRPT(RPT,CODED,FTRUE,FMISS
135
+ +,FUNITS(1,GROUP),FBASE(1,GROUP),BITS,OFFSET,NUMBER,RPTID,INDXCK)
136
+
137
+ c check for missing data based on key variable
138
+ if(ftrue(ichkmis).eq.-9999.0)go to 100
139
+
140
+ c combine yr/mn into one integer for quick comparison
141
+ iyear = nint(ftrue(1))
142
+ imonth = nint(ftrue(2))
143
+ idate = iyear*100 + imonth
144
+ ibsz = nint(ftrue(3))
145
+ ipid2 = nint(ftrue(7))
146
+ if(ftrue(7).eq.-9999.0)ipid2 = -9 !reset for missing PID
147
+
148
+ c do time window check
149
+ if(idate .lt. idstr .or. idate .gt. idend) goto 100
150
+
151
+ c get latitude and longitude for region checking
152
+ alat = ftrue(5)
153
+ alon = ftrue(4)
154
+ if(alon .ge. 360.0) then
155
+ alon = alon - 360.0 ! just in case
156
+ elseif(alon .lt. 0.0) then
157
+ alon = alon + 360.0 ! in case it between -179.99 and -0.01
158
+ endif
159
+
160
+ c do the area window criteria tests
161
+
162
+ if(alat .lt. alatb .or. alat .ge. alatt) goto 100
163
+
164
+ if(alonl .lt. alonr) then
165
+ if(alon .lt. alonl .or. alon .ge. alonr) goto 100
166
+ else
167
+ if(alon .lt. alonl .and. alon .ge. alonr) goto 100
168
+ endif
169
+ c
170
+ c check file size, close it if it gets too big
171
+ c
172
+ if(iorec .gt. iomax) then
173
+ close(iout)
174
+ iorec = 0
175
+ endif
176
+ c
177
+ c open a new file for output
178
+ c
179
+ if(iorec .eq. 0) then
180
+ jfile = jfile + 1
181
+ write(outfile,
182
+ + "('MSG',i1,'.', a, '.', a3, '.', i6, '.', i6, '_')")
183
+ + resol,vname(:vlen), type, idstr, idend
184
+ lennam = lentrm(outfile)
185
+ if(jfile .le. 9) then
186
+ write(outfile(lentrm(outfile)+1:), '(i1)') jfile
187
+ elseif(jfile .le. 99) then
188
+ write(outfile(lentrm(outfile)+1:), '(i2)') jfile
189
+ else
190
+ write(outfile(lentrm(outfile)+1:), '(i3)') jfile
191
+ endif
192
+ lennam = lentrm(outfile)
193
+ print *, "Open file for Output:",
194
+ + outdir(:outlen)//outfile(:lennam)
195
+ open(iout, file=outdir(:outlen)//outfile(:lennam),
196
+ + form='formatted', status='new')
197
+ c write in the comment header field column headers
198
+ lennam = lentrm(header)
199
+ write(iout,'(a)')header(:lennam)
200
+ lennam = lentrm(colhead)
201
+ write(iout,'(a)')colhead(:lennam)
202
+ endif
203
+
204
+ c write records to output file
205
+
206
+ write(iout,formato)iyear,imonth,ibsz,alon,alat,ipid2,
207
+ * (ftrue(index(ii)),ii=1,nstat)
208
+ iorec = iorec + 1
209
+ nrecout = nrecout + 1
210
+
211
+ if(iorec.le.5) write(*,formato)iyear,imonth,ibsz,alon,alat,ipid2,
212
+ * (ftrue(index(ii)),ii=1,nstat)
213
+ go to 100
214
+ ! END OF FILE
215
+ 950 CONTINUE
216
+ close(iout)
217
+ write(*,"('INRECS: ', i10)") nrecin
218
+ write(*,"('OUTRECS: ', i10)") nrecout
219
+
220
+ stop
221
+ end
222
+ C=============================================================================C
223
+ C WARNING: Code beyond this point should not require any modification. C
224
+ C=============================================================================C
225
+ C-----------------------------------------------------------------------3456789
226
+ BLOCK DATA BDMSG1
227
+ IMPLICIT INTEGER(A-E,G-Z)
228
+ C
229
+ CHARACTER FORMAT*640
230
+ PARAMETER(NUMBER=49)
231
+ COMMON /MSG1/FUNITS(NUMBER,3:9),FBASE(NUMBER,3:9),BITS(NUMBER)
232
+ +,OFFSET(NUMBER),FORMAT(3:9),RPTID,INDXCK
233
+ C
234
+ DATA (FUNITS(I,3),I=1,NUMBER)
235
+ +/1. ,1. ,1. ,.5 ,.5 ,1. ,1. ,1. ,1.
236
+ 1 ,.01 ,.01 ,.01 ,.1
237
+ 3 ,.01 ,.01 ,.01 ,.1
238
+ 5 ,.01 ,.01 ,.01 ,.1
239
+ M ,.01 ,.01 ,.01 ,.1
240
+ N ,1. ,1. ,1. ,1.
241
+ S ,.01 ,.01 ,.01 ,.1
242
+ D ,2. ,2. ,2. ,2.
243
+ H ,.1 ,.1 ,.1 ,.1
244
+ X ,.1 ,.1 ,.1 ,.1
245
+ Y ,.1 ,.1 ,.1 ,.1/
246
+ C
247
+ DATA (FUNITS(I,4),I=1,NUMBER)
248
+ +/1. ,1. ,1. ,.5 ,.5 ,1. ,1. ,1. ,1.
249
+ 1 ,.01 ,.01 ,.01 ,.01
250
+ 3 ,.01 ,.01 ,.01 ,.01
251
+ 5 ,.01 ,.01 ,.01 ,.01
252
+ M ,.01 ,.01 ,.01 ,.01
253
+ N ,1. ,1. ,1. ,1.
254
+ S ,.01 ,.01 ,.01 ,.01
255
+ D ,2. ,2. ,2. ,2.
256
+ H ,.1 ,.1 ,.1 ,.1
257
+ X ,.1 ,.1 ,.1 ,.1
258
+ Y ,.1 ,.1 ,.1 ,.1/
259
+ C
260
+ DATA (FUNITS(I,5),I=1,NUMBER)
261
+ +/1. ,1. ,1. ,.5 ,.5 ,1. ,1. ,1. ,1.
262
+ 1 ,.1 ,.1 ,.1 ,.1
263
+ 3 ,.1 ,.1 ,.1 ,.1
264
+ 5 ,.1 ,.1 ,.1 ,.1
265
+ M ,.1 ,.1 ,.1 ,.1
266
+ N ,1. ,1. ,1. ,1.
267
+ S ,.1 ,.1 ,.1 ,.1
268
+ D ,2. ,2. ,2. ,2.
269
+ H ,.1 ,.1 ,.1 ,.1
270
+ X ,.1 ,.1 ,.1 ,.1
271
+ Y ,.1 ,.1 ,.1 ,.1/
272
+ C
273
+ DATA (FUNITS(I,6),I=1,NUMBER)
274
+ +/1. ,1. ,1. ,.5 ,.5 ,1. ,1. ,1. ,1.
275
+ 1 ,.01 ,.1 ,.01 ,.1
276
+ 3 ,.01 ,.1 ,.01 ,.1
277
+ 5 ,.01 ,.1 ,.01 ,.1
278
+ M ,.01 ,.1 ,.01 ,.1
279
+ N ,1. ,1. ,1. ,1.
280
+ S ,.01 ,.1 ,.01 ,.1
281
+ D ,2. ,2. ,2. ,2.
282
+ H ,.1 ,.1 ,.1 ,.1
283
+ X ,.1 ,.1 ,.1 ,.1
284
+ Y ,.1 ,.1 ,.1 ,.1/
285
+ C
286
+ DATA (FUNITS(I,7),I=1,NUMBER)
287
+ +/1. ,1. ,1. ,.5 ,.5 ,1. ,1. ,1. ,1.
288
+ 1 ,.1 ,.1 ,.1 ,.1
289
+ 3 ,.1 ,.1 ,.1 ,.1
290
+ 5 ,.1 ,.1 ,.1 ,.1
291
+ M ,.1 ,.1 ,.1 ,.1
292
+ N ,1. ,1. ,1. ,1.
293
+ S ,.1 ,.1 ,.1 ,.1
294
+ D ,2. ,2. ,2. ,2.
295
+ H ,.1 ,.1 ,.1 ,.1
296
+ X ,.1 ,.1 ,.1 ,.1
297
+ Y ,.1 ,.1 ,.1 ,.1/
298
+ C
299
+ DATA (FUNITS(I,8),I=1,NUMBER)
300
+ +/1. ,1. ,1. ,.5 ,.5 ,1. ,1. ,1. ,1.
301
+ 1 ,.01 ,.01 ,.1 ,.1
302
+ 3 ,.01 ,.01 ,.1 ,.1
303
+ 5 ,.01 ,.01 ,.1 ,.1
304
+ M ,.01 ,.01 ,.1 ,.1
305
+ N ,1. ,1. ,1. ,1.
306
+ S ,.01 ,.01 ,.1 ,.1
307
+ D ,2. ,2. ,2. ,2.
308
+ H ,.1 ,.1 ,.1 ,.1
309
+ X ,.1 ,.1 ,.1 ,.1
310
+ Y ,.1 ,.1 ,.1 ,.1/
311
+ C
312
+ DATA (FUNITS(I,9),I=1,NUMBER)
313
+ +/1. ,1. ,1. ,.5 ,.5 ,1. ,1. ,1. ,1.
314
+ 1 ,.1 ,.1 ,.5 ,5.
315
+ 3 ,.1 ,.1 ,.5 ,5.
316
+ 5 ,.1 ,.1 ,.5 ,5.
317
+ M ,.1 ,.1 ,.5 ,5.
318
+ N ,1. ,1. ,1. ,1.
319
+ S ,.1 ,.1 ,.5 ,5.
320
+ D ,2. ,2. ,2. ,2.
321
+ H ,.1 ,.1 ,.1 ,.1
322
+ X ,.1 ,.1 ,.1 ,.1
323
+ Y ,.1 ,.1 ,.1 ,.1/
324
+ C
325
+ DATA (FBASE(I,3),I=1,NUMBER)
326
+ +/1799. ,0. ,-1. ,-1. ,-181. ,-1. ,-1. ,0. ,0.
327
+ 1 ,-501. ,-8801. ,-1. ,-1.
328
+ 3 ,-501. ,-8801. ,-1. ,-1.
329
+ 5 ,-501. ,-8801. ,-1. ,-1.
330
+ M ,-501. ,-8801. ,-1. ,-1.
331
+ N ,0. ,0. ,0. ,0.
332
+ S ,-1. ,-1. ,-1. ,-1.
333
+ D ,0. ,0. ,0. ,0.
334
+ H ,-1. ,-1. ,-1. ,-1.
335
+ X ,-1. ,-1. ,-1. ,-1.
336
+ Y ,-1. ,-1. ,-1. ,-1./
337
+ C
338
+ DATA (FBASE(I,4),I=1,NUMBER)
339
+ +/1799. ,0. ,-1. ,-1. ,-181. ,-1. ,-1. ,0. ,0.
340
+ 1 ,-1. ,-10221. ,-10221. ,86999.
341
+ 3 ,-1. ,-10221. ,-10221. ,86999.
342
+ 5 ,-1. ,-10221. ,-10221. ,86999.
343
+ M ,-1. ,-10221. ,-10221. ,86999.
344
+ N ,0. ,0. ,0. ,0.
345
+ S ,-1. ,-1. ,-1. ,-1.
346
+ D ,0. ,0. ,0. ,0.
347
+ H ,-1. ,-1. ,-1. ,-1.
348
+ X ,-1. ,-1. ,-1. ,-1.
349
+ Y ,-1. ,-1. ,-1. ,-1./
350
+ C
351
+ DATA (FBASE(I,5),I=1,NUMBER)
352
+ +/1799. ,0. ,-1. ,-1. ,-181. ,-1. ,-1. ,0. ,0.
353
+ 1 ,-1. ,-1. ,-30001. ,-30001.
354
+ 3 ,-1. ,-1. ,-30001. ,-30001.
355
+ 5 ,-1. ,-1. ,-30001. ,-30001.
356
+ M ,-1. ,-1. ,-30001. ,-30001.
357
+ N ,0. ,0. ,0. ,0.
358
+ S ,-1. ,-1. ,-1. ,-1.
359
+ D ,0. ,0. ,0. ,0.
360
+ H ,-1. ,-1. ,-1. ,-1.
361
+ X ,-1. ,-1. ,-1. ,-1.
362
+ Y ,-1. ,-1. ,-1. ,-1./
363
+ C
364
+ DATA (FBASE(I,6),I=1,NUMBER)
365
+ +/1799. ,0. ,-1. ,-1. ,-181. ,-1. ,-1. ,0. ,0.
366
+ 1 ,-6301. ,-10001. ,-4001. ,-10001.
367
+ 3 ,-6301. ,-10001. ,-4001. ,-10001.
368
+ 5 ,-6301. ,-10001. ,-4001. ,-10001.
369
+ M ,-6301. ,-10001. ,-4001. ,-10001.
370
+ N ,0. ,0. ,0. ,0.
371
+ S ,-1. ,-1. ,-1. ,-1.
372
+ D ,0. ,0. ,0. ,0.
373
+ H ,-1. ,-1. ,-1. ,-1.
374
+ X ,-1. ,-1. ,-1. ,-1.
375
+ Y ,-1. ,-1. ,-1. ,-1./
376
+ C
377
+ DATA (FBASE(I,7),I=1,NUMBER)
378
+ +/1799. ,0. ,-1. ,-1. ,-181. ,-1. ,-1. ,0. ,0.
379
+ 1 ,-20001. ,-20001. ,-10001. ,-10001.
380
+ 3 ,-20001. ,-20001. ,-10001. ,-10001.
381
+ 5 ,-20001. ,-20001. ,-10001. ,-10001.
382
+ M ,-20001. ,-20001. ,-10001. ,-10001.
383
+ N ,0. ,0. ,0. ,0.
384
+ S ,-1. ,-1. ,-1. ,-1.
385
+ D ,0. ,0. ,0. ,0.
386
+ H ,-1. ,-1. ,-1. ,-1.
387
+ X ,-1. ,-1. ,-1. ,-1.
388
+ Y ,-1. ,-1. ,-1. ,-1./
389
+ C
390
+ DATA (FBASE(I,8),I=1,NUMBER)
391
+ +/1799. ,0. ,-1. ,-1. ,-181. ,-1. ,-1. ,0. ,0.
392
+ 1 ,-501. ,-8801. ,-30001. ,-30001.
393
+ 3 ,-501. ,-8801. ,-30001. ,-30001.
394
+ 5 ,-501. ,-8801. ,-30001. ,-30001.
395
+ M ,-501. ,-8801. ,-30001. ,-30001.
396
+ N ,0. ,0. ,0. ,0.
397
+ S ,-1. ,-1. ,-1. ,-1.
398
+ D ,0. ,0. ,0. ,0.
399
+ H ,-1. ,-1. ,-1. ,-1.
400
+ X ,-1. ,-1. ,-1. ,-1.
401
+ Y ,-1. ,-1. ,-1. ,-1./
402
+ C
403
+ DATA (FBASE(I,9),I=1,NUMBER)
404
+ +/1799. ,0. ,-1. ,-1. ,-181. ,-1. ,-1. ,0. ,0.
405
+ 1 ,-10001. ,-10001. ,-1. ,-1.
406
+ 3 ,-10001. ,-10001. ,-1. ,-1.
407
+ 5 ,-10001. ,-10001. ,-1. ,-1.
408
+ M ,-10001. ,-10001. ,-1. ,-1.
409
+ N ,0. ,0. ,0. ,0.
410
+ S ,-1. ,-1. ,-1. ,-1.
411
+ D ,0. ,0. ,0. ,0.
412
+ H ,-1. ,-1. ,-1. ,-1.
413
+ X ,-1. ,-1. ,-1. ,-1.
414
+ Y ,-1. ,-1. ,-1. ,-1./
415
+ C
416
+ DATA BITS
417
+ +/8 ,4 ,3 ,10 ,9 ,3 ,3 ,4 ,4
418
+ 1 ,16 ,16 ,16 ,16
419
+ 3 ,16 ,16 ,16 ,16
420
+ 5 ,16 ,16 ,16 ,16
421
+ M ,16 ,16 ,16 ,16
422
+ N ,16 ,16 ,16 ,16
423
+ S ,16 ,16 ,16 ,16
424
+ D ,4 ,4 ,4 ,4
425
+ H ,4 ,4 ,4 ,4
426
+ X ,4 ,4 ,4 ,4
427
+ Y ,4 ,4 ,4 ,4/
428
+ C
429
+ DATA OFFSET
430
+ +/16 ,24 ,28 ,31 ,41 ,50 ,53 ,56 ,60
431
+ 1 ,64 ,80 ,96 ,112
432
+ 3 ,128 ,144 ,160 ,176
433
+ 5 ,192 ,208 ,224 ,240
434
+ M ,256 ,272 ,288 ,304
435
+ N ,320 ,336 ,352 ,368
436
+ S ,384 ,400 ,416 ,432
437
+ D ,448 ,452 ,456 ,460
438
+ H ,464 ,468 ,472 ,476
439
+ X ,480 ,484 ,488 ,492
440
+ Y ,496 ,500 ,504 ,508/
441
+ C
442
+ DATA FORMAT(3)
443
+ +/"(/' YEAR ',F5.0,' MONTH ',F3.0,' BSZ ',F2.0,' BLO ',F5.1,' BLA '
444
+ +,F5.1,' PID1 ',F6.0,' PID2 ',F6.0,' GRP ',F3.0,' CK ',F6.0/
445
+ +11X,6X,'S1',6X,'S3',6X,'S5',7X,'M',7X,'N',7X,'S',7X,'D',7X,'H'
446
+ +,7X,'X',7X,'Y'/
447
+ +' S ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
448
+ +' A ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
449
+ +' Q ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
450
+ +' R ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1)
451
+ +"/
452
+ C
453
+ DATA FORMAT(4)
454
+ +/"(/' YEAR ',F5.0,' MONTH ',F3.0,' BSZ ',F2.0,' BLO ',F5.1,' BLA '
455
+ +,F5.1,' PID1 ',F6.0,' PID2 ',F6.0,' GRP ',F3.0,' CK ',F6.0/
456
+ +11X,6X,'S1',6X,'S3',6X,'S5',7X,'M',7X,'N',7X,'S',7X,'D',7X,'H'
457
+ +,7X,'X',7X,'Y'/
458
+ +' W ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
459
+ +' U ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
460
+ +' V ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
461
+ +' P ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1)
462
+ +"/
463
+ C
464
+ DATA FORMAT(5)
465
+ +/"(/' YEAR ',F5.0,' MONTH ',F3.0,' BSZ ',F2.0,' BLO ',F5.1,' BLA '
466
+ +,F5.1,' PID1 ',F6.0,' PID2 ',F6.0,' GRP ',F3.0,' CK ',F6.0/
467
+ +11X,6X,'S1',6X,'S3',6X,'S5',7X,'M',7X,'N',7X,'S',7X,'D',7X,'H'
468
+ +,7X,'X',7X,'Y'/
469
+ +' C ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
470
+ +' R ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
471
+ +' X=W*U ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
472
+ +' Y=W*V ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1)
473
+ +"/
474
+ C
475
+ DATA FORMAT(6)
476
+ +/"(/' YEAR ',F5.0,' MONTH ',F3.0,' BSZ ',F2.0,' BLO ',F5.1,' BLA '
477
+ +,F5.1,' PID1 ',F6.0,' PID2 ',F6.0,' GRP ',F3.0,' CK ',F6.0/
478
+ +11X,6X,'S1',6X,'S3',6X,'S5',7X,'M',7X,'N',7X,'S',7X,'D',7X,'H'
479
+ +,7X,'X',7X,'Y'/
480
+ +' D=S-A ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
481
+ +' E=(S-A)*W ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
482
+ +' F=QS-Q ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
483
+ +' G=(QS-Q)*W',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1)
484
+ +"/
485
+ C
486
+ DATA FORMAT(7)
487
+ +/"(/' YEAR ',F5.0,' MONTH ',F3.0,' BSZ ',F2.0,' BLO ',F5.1,' BLA '
488
+ +,F5.1,' PID1 ',F6.0,' PID2 ',F6.0,' GRP ',F3.0,' CK ',F6.0/
489
+ +11X,6X,'S1',6X,'S3',6X,'S5',7X,'M',7X,'N',7X,'S',7X,'D',7X,'H'
490
+ +,7X,'X',7X,'Y'/
491
+ +' I=U*A ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
492
+ +' J=V*A ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
493
+ +' K=U*Q ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
494
+ +' L=V*Q ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1)
495
+ +"/
496
+ C
497
+ DATA FORMAT(8)
498
+ +/"(/' YEAR ',F5.0,' MONTH ',F3.0,' BSZ ',F2.0,' BLO ',F5.1,' BLA '
499
+ +,F5.1,' PID1 ',F6.0,' PID2 ',F6.0,' GRP ',F3.0,' CK ',F6.0/
500
+ +11X,6X,'S1',6X,'S3',6X,'S5',7X,'M',7X,'N',7X,'S',7X,'D',7X,'H'
501
+ +,7X,'X',7X,'Y'/
502
+ +' S ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
503
+ +' A ',F8.2,F8.2,F8.2,F8.2,F8.0,F8.2,F8.0,F8.1,F8.1,F8.1/
504
+ +' X=W*U ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
505
+ +' Y=W*V ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1)
506
+ +"/
507
+ C
508
+ DATA FORMAT(9)
509
+ +/"(/' YEAR ',F5.0,' MONTH ',F3.0,' BSZ ',F2.0,' BLO ',F5.1,' BLA '
510
+ +,F5.1,' PID1 ',F6.0,' PID2 ',F6.0,' GRP ',F3.0,' CK ',F6.0/
511
+ +11X,6X,'S1',6X,'S3',6X,'S5',7X,'M',7X,'N',7X,'S',7X,'D',7X,'H'
512
+ +,7X,'X',7X,'Y'/
513
+ +' M=(QS-Q)*U',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
514
+ +' N=(QS-Q)*V',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
515
+ +' B1=W*W*W ',F8.1,F8.1,F8.1,F8.1,F8.0,F8.1,F8.0,F8.1,F8.1,F8.1/
516
+ +' B2=W*W*W ',F8.0,F8.0,F8.0,F8.0,F8.0,F8.0,F8.0,F8.1,F8.1,F8.1)
517
+ +"/
518
+ C
519
+ DATA RPTID/1/ ,INDXCK/9/
520
+ END
521
+ C-----------------------------------------------------------------------3456789
522
+ SUBROUTINE GETRPT(RPT,CODED,FTRUE,FMISS
523
+ +,FUNITS,FBASE,BITS,OFFSET,NUMBER,RPTID,INDXCK)
524
+ C UNPACK REPORT AND CONVERT CODED TO TRUE VALUES
525
+ C
526
+ IMPLICIT INTEGER(A-E,G-Z)
527
+ CHARACTER*(*) RPT
528
+ DIMENSION CODED(*),FTRUE(*),FUNITS(*),FBASE(*),BITS(*),OFFSET(*)
529
+ C
530
+ IF(MOD(ICHAR(RPT(2:2)),16).NE.RPTID)STOP 'RPTID ERROR'
531
+ CALL UNPACK(RPT,CODED)
532
+ FTRUE(INDXCK)=CODED(INDXCK)
533
+ CODED(INDXCK)=0
534
+ DO 190 I=1,NUMBER
535
+ IF(I.EQ.INDXCK)GOTO 190
536
+ IF(I.GT.NUMBER-8)FUNITS(I)=2**NINT(FTRUE(3))*.05
537
+ IF(CODED(I).EQ.0)THEN
538
+ FTRUE(I)=FMISS
539
+ ELSE
540
+ FTRUE(I)=(CODED(I)+FBASE(I))*FUNITS(I)
541
+ CODED(INDXCK)=CODED(INDXCK)+CODED(I)
542
+ ENDIF
543
+ 190 CONTINUE
544
+ CODED(INDXCK)=MOD(CODED(INDXCK),2**BITS(INDXCK)-1)
545
+ IF(FTRUE(INDXCK).NE.CODED(INDXCK))STOP 'CHECKSUM ERROR'
546
+ END
547
+ C-----------------------------------------------------------------------3456789
548
+ SUBROUTINE UNPACK(RPT,CODED)
549
+ C UNPACK REPORT
550
+ C
551
+ IMPLICIT INTEGER(A-E,G-Z)
552
+ CHARACTER*(*) RPT
553
+ DIMENSION CODED(*)
554
+ C
555
+ CODED(1)=ICHAR(RPT(3:3))
556
+ CODED(2)=ICHAR(RPT(4:4))/16
557
+ CODED(3)=MOD(ICHAR(RPT(4:4)),16)/2
558
+ CODED(4)=(MOD(ICHAR(RPT(4:4)),2)*256+ICHAR(RPT(5:5)))*2
559
+ ++ICHAR(RPT(6:6))/128
560
+ CODED(5)=MOD(ICHAR(RPT(6:6)),128)*4+ICHAR(RPT(7:7))/64
561
+ CODED(6)=MOD(ICHAR(RPT(7:7)),64)/8
562
+ CODED(7)=MOD(ICHAR(RPT(7:7)),8)
563
+ CODED(8)=ICHAR(RPT(8:8))/16
564
+ CODED(9)=MOD(ICHAR(RPT(8:8)),16)
565
+ CODED(10)=ICHAR(RPT(9:9))*256+ICHAR(RPT(10:10))
566
+ CODED(11)=ICHAR(RPT(11:11))*256+ICHAR(RPT(12:12))
567
+ CODED(12)=ICHAR(RPT(13:13))*256+ICHAR(RPT(14:14))
568
+ CODED(13)=ICHAR(RPT(15:15))*256+ICHAR(RPT(16:16))
569
+ CODED(14)=ICHAR(RPT(17:17))*256+ICHAR(RPT(18:18))
570
+ CODED(15)=ICHAR(RPT(19:19))*256+ICHAR(RPT(20:20))
571
+ CODED(16)=ICHAR(RPT(21:21))*256+ICHAR(RPT(22:22))
572
+ CODED(17)=ICHAR(RPT(23:23))*256+ICHAR(RPT(24:24))
573
+ CODED(18)=ICHAR(RPT(25:25))*256+ICHAR(RPT(26:26))
574
+ CODED(19)=ICHAR(RPT(27:27))*256+ICHAR(RPT(28:28))
575
+ CODED(20)=ICHAR(RPT(29:29))*256+ICHAR(RPT(30:30))
576
+ CODED(21)=ICHAR(RPT(31:31))*256+ICHAR(RPT(32:32))
577
+ CODED(22)=ICHAR(RPT(33:33))*256+ICHAR(RPT(34:34))
578
+ CODED(23)=ICHAR(RPT(35:35))*256+ICHAR(RPT(36:36))
579
+ CODED(24)=ICHAR(RPT(37:37))*256+ICHAR(RPT(38:38))
580
+ CODED(25)=ICHAR(RPT(39:39))*256+ICHAR(RPT(40:40))
581
+ CODED(26)=ICHAR(RPT(41:41))*256+ICHAR(RPT(42:42))
582
+ CODED(27)=ICHAR(RPT(43:43))*256+ICHAR(RPT(44:44))
583
+ CODED(28)=ICHAR(RPT(45:45))*256+ICHAR(RPT(46:46))
584
+ CODED(29)=ICHAR(RPT(47:47))*256+ICHAR(RPT(48:48))
585
+ CODED(30)=ICHAR(RPT(49:49))*256+ICHAR(RPT(50:50))
586
+ CODED(31)=ICHAR(RPT(51:51))*256+ICHAR(RPT(52:52))
587
+ CODED(32)=ICHAR(RPT(53:53))*256+ICHAR(RPT(54:54))
588
+ CODED(33)=ICHAR(RPT(55:55))*256+ICHAR(RPT(56:56))
589
+ CODED(34)=ICHAR(RPT(57:57))/16
590
+ CODED(35)=MOD(ICHAR(RPT(57:57)),16)
591
+ CODED(36)=ICHAR(RPT(58:58))/16
592
+ CODED(37)=MOD(ICHAR(RPT(58:58)),16)
593
+ CODED(38)=ICHAR(RPT(59:59))/16
594
+ CODED(39)=MOD(ICHAR(RPT(59:59)),16)
595
+ CODED(40)=ICHAR(RPT(60:60))/16
596
+ CODED(41)=MOD(ICHAR(RPT(60:60)),16)
597
+ CODED(42)=ICHAR(RPT(61:61))/16
598
+ CODED(43)=MOD(ICHAR(RPT(61:61)),16)
599
+ CODED(44)=ICHAR(RPT(62:62))/16
600
+ CODED(45)=MOD(ICHAR(RPT(62:62)),16)
601
+ CODED(46)=ICHAR(RPT(63:63))/16
602
+ CODED(47)=MOD(ICHAR(RPT(63:63)),16)
603
+ CODED(48)=ICHAR(RPT(64:64))/16
604
+ CODED(49)=MOD(ICHAR(RPT(64:64)),16)
605
+ END
606
+ FUNCTION LENTRM(STR)
607
+ C LENGTH OF A STRING MINUS TRAILING BLANKS
608
+ CHARACTER STR*(*)
609
+ DO 190 LENTRM=LEN(STR),1,-1
610
+ IF (STR(LENTRM:LENTRM).NE.' ') RETURN
611
+ 190 CONTINUE
612
+ END