OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
main_tlmgen.f
Go to the documentation of this file.
1 c ===================================================================
2 c Program MKTLM
3 c
4 c Generate TLM_GAC and TLM_LAC files from L0_GAC files
5 c
6 c Written By: BA Franz, GSC, 21 Feb 96
7 c
8 c ===================================================================
9 
10  program mktlm
11 c
12  implicit none
13 c
14  integer*2 frec
15 c#ifndef __sun
16 c parameter (FREC = 4)
17 c#else
18  parameter(frec = 1)
19 c#endif
20 
21  integer*4 mnflen ! # Bytes in L0 minor frame
22  parameter(mnflen = 21504)!
23  integer*4 hdrlen ! # Bytes in L0 header
24  parameter(hdrlen = 512) !
25  integer*2 mnflun ! Input L0 logical unit
26  parameter(mnflun = 10) !
27  integer*2 gtelun ! Output TLM_GAC logical unit
28  parameter(gtelun = 11) !
29  integer*2 ltelun !
30  parameter(ltelun = 12) !
31  integer*2 idbyte ! Byte # in mnf where ID appears
32  parameter(idbyte = 7) !
33  integer*2 gacid ! GAC mnf ID
34  parameter(gacid = 15) !
35  integer*2 lacid ! LAC mnf ID
36  parameter(lacid = 0) !
37 c
38  byte mnf( mnflen ) ! L0 minor frame record
39  byte hdr( hdrlen ) ! L0 header
40 c
41  character*80 mnffile ! L0 filename
42  character*80 gtefile ! GAC TLM filename
43  character*80 ltefile ! LAC TLM filename
44  character*4 type ! GAC or LAC or BOTH
45 c
46  integer*4 mnfcnt ! Minor frame counter
47  integer*4 gaccnt ! GAC mnf counter
48  integer*4 laccnt ! LAC mnf counter
49  integer*2 status ! Status flag (0=OK)
50 c
51  integer*2 getmnf ! Function to buffer input
52  integer*2 mkgactlm ! Function to make GAC TLM records
53  integer*2 mklactlm ! Function to make LAC TLM records
54 
55  logical*1 wantgac
56  logical*1 wantlac
57 
58 c !
59 c ! Initialization
60 c !
61  data mnfcnt / 0 /
62  data gaccnt / 0 /
63  data laccnt / 0 /
64  data wantgac /.false./
65  data wantlac /.false./
66 
67 c !
68 c ! Open input L0 file
69 c !
70  write(*,'(a)') 'Enter input L0 file name: '
71  read(5,'(a)') mnffile
72  open(mnflun,file=mnffile,access='direct',
73  . recl=512/frec,err=900)
74 
75 c !
76 c ! Get Output Type
77 c !
78  write(*,'(a)') 'Output TLM type (GAC, LAC, BOTH): '
79  read(5,'(a)') type
80 
81  if ( type .eq. 'GAC' .or. type .eq. 'BOTH') then
82  wantgac = .true.
83 c !
84 c ! Open output GAC TLM file
85 c !
86  write(*,'(a)') 'Enter output GAC TLM file name: '
87  read(5,'(a)') gtefile
88  open(gtelun,file=gtefile,access='direct',
89  . status='unknown',recl=4/frec,err=901)
90  endif
91 
92 
93  if ( type .eq. 'LAC' .or. type .eq. 'BOTH') then
94  wantlac = .true.
95 c !
96 c ! Open output LAC TLM file
97 c !
98  write(*,'(a)') 'Enter output LAC TLM file name: '
99  read(5,'(a)') ltefile
100  open(ltelun,file=ltefile,access='direct',
101  . status='unknown',recl=4/frec,err=902)
102  endif
103 
104  if (.not. wantgac .and. .not. wantlac) then
105  write(*,*) 'Error: no output will be generated for type=',type
106  stop
107  endif
108 
109 c !
110 c ! Skip header
111 c !
112  read(mnflun, rec=1, err=900) hdr
113 
114 c !
115 c ! Read first record
116 c !
117  status = getmnf( mnflun, mnfcnt, mnf, mnflen)
118  mnfcnt = mnfcnt + 1
119 
120 c !
121 c ! Read through end of file
122 c !
123  dowhile( status .eq. 0 )
124 
125 c !
126 c ! Check mnf type
127 c !
128  if ( wantgac .and. mnf(idbyte) .eq. gacid ) then
129 
130 c !
131 c ! Write GAC TLM record
132 c !
133  status = mkgactlm(gtelun,gaccnt,mnf)
134  gaccnt = gaccnt + 1
135 
136  elseif ( wantlac .and. mnf(idbyte) .ne. gacid ) then
137 
138 c !
139 c ! Write LAC TLM record
140 c !
141  status = mklactlm(ltelun,laccnt,mnf)
142  laccnt = laccnt + 1
143 
144  endif
145 
146 c !
147 c ! Read next record
148 c !
149  status = getmnf( mnflun, mnfcnt, mnf, mnflen)
150  mnfcnt = mnfcnt + 1
151 
152  if (mod(mnfcnt,1000) .eq. 0) then
153  write(*,*) 'Processing minor frame ',mnfcnt
154  endif
155 
156  enddo
157 c
158  write(*,*) ' '
159  write(*,*) 'Total minor frames: ',mnfcnt-1
160  write(*,*) 'GAC frames: ',gaccnt
161  write(*,*) 'LAC frames: ',laccnt
162  write(*,*) ' '
163 c
164  close( mnflun )
165  close( gtelun )
166  close( ltelun )
167 
168  stop
169 c
170  900 write(*,*) 'Error opening input file: ',mnffile
171  goto 1000
172  901 write(*,*) 'Error opening output file: ',gtefile
173  goto 1000
174  902 write(*,*) 'Error opening output file: ',ltefile
175  goto 1000
176 c
177  1000 continue
178  end
179 
180 
181 c ----------------------------------------------------------------------
182 c getmnf - buffers input of L0 minor frame records
183 c ----------------------------------------------------------------------
184  integer*2 function getmnf(lun,mnfcnt,mnf,mnflen)
185 c
186  implicit none
187 c
188  integer*4 buflen
189  parameter(buflen = 512)
190 c
191  byte mnf(*)
192  integer*2 lun
193  integer*4 mnfcnt
194  integer*4 mnflen
195 c
196  byte buf( buflen )
197  integer*4 i, j
198  integer*4 nbuf
199 c
200 c write(*,*) "getmnf"
201 c
202  nbuf = mnflen/buflen
203 c
204  do i=1,nbuf
205  read(lun,rec=mnfcnt*nbuf+i+1,err=10) buf
206  do j=1,buflen
207  mnf( (i-1)*buflen + j ) = buf(j)
208  enddo
209  enddo
210 c
211  getmnf = 0
212  return
213 c
214  10 getmnf = 1
215  return
216 c
217  20 getmnf = 2
218  return
219 c
220  end
221 
222 
223 c ----------------------------------------------------------------------
224 c puttlm - buffers output of GAC or LAC TLM records
225 c ----------------------------------------------------------------------
226  integer*2 function puttlm(lun,cnt,tlm,tlmlen)
227 c
228  implicit none
229 c
230  integer*2 buflen
231  parameter(buflen = 4)
232 c
233  integer*2 lun
234  integer*4 cnt
235  byte tlm(*)
236  integer*4 tlmlen
237 c
238  byte buf(buflen)
239  integer*4 nbuf
240  integer*4 i, j
241 c
242 c write(*,*) "puttlm"
243 c
244  nbuf = tlmlen/buflen
245 c
246  do i=1,nbuf
247  do j=1,buflen
248  buf(j) = tlm( (i-1)*buflen + j )
249  enddo
250  write(lun,rec=cnt*nbuf+i,err=10) buf
251  enddo
252 c
253  puttlm = 0
254  return
255 c
256  10 puttlm = 1
257  return
258 c
259  end
260 
261 
262 c ----------------------------------------------------------------------
263 c mkgactlm - writes one GAC TLM record
264 c
265 c Synopsis:
266 c status = mkgactlm( lun, mnf )
267 c
268 c integer*2 status : 0=success, 1=error, 2=end-of-file
269 c integer*2 lun : GAC TLM file unit number
270 c integer*1 mnf(*) : L0 minor frame as byte array
271 c
272 c Written By:
273 c BA Franz, GSC, 21 Feb 96
274 c
275 c ----------------------------------------------------------------------
276  integer*2 function mkgactlm(lun,cnt,mnf)
277 c
278  implicit none
279 c
280  integer*4 tlmlen ! # Bytes in TLM Record
281  integer*2 nflds ! # Fields in TLM Record
282 
283  parameter(tlmlen = 1308)
284  parameter(nflds = 9)
285 c
286  integer*2 lun ! TLM file unit
287  integer*4 cnt ! Number of logical records
288  byte mnf(*) ! L0 mnf record as byte array
289 
290  integer*4 nbytes ! # Bytes for this field
291  integer*4 tlmoffset ! # Byte offset of field in tlm
292  integer*4 mnfoffset ! # Byte offset of field in mnf
293  integer*4 i, j
294  byte tlm( tlmlen ) ! TLM record as byte array
295  save tlm
296 c
297  logical firstcall
298  save firstcall
299 c
300  integer*2 puttlm ! # Function to buffer output
301 
302 c !
303 c ! Define mapping from input L0 file to output TLM file
304 c ! Format is MNF byte offset, TLM byte offset, # bytes
305 c !
306  integer*2 map( 3, nflds )
307  data map / 4, 1, 4, ! S/C ID
308  . 8, 5, 8, ! S/C Time-Tag
309  . 16, 13, 775, ! SOH TLM
310  . 20951, 789, 440, ! INST TLM
311  . 791, 1229, 16, ! Gain & TDI, Scan #1
312  . 4823, 1245, 16, ! Gain & TDI, Scan #2
313  . 8855, 1261, 16, ! Gain & TDI, Scan #3
314  . 12887, 1277, 16, ! Gain & TDI, Scan #4
315  . 16919, 1293, 16 / ! Gain & TDI, Scan #5
316 
317  data firstcall /.true./
318 
319 c
320 c write(*,*) "mkgactlm"
321 c
322 
323 c !
324 c ! If this is the first time through, initialize output record
325 c !
326  if ( firstcall ) then
327  firstcall = .false.
328  do i=1,tlmlen
329  tlm(i) = 0
330  enddo
331  endif
332 
333 
334 
335 c !
336 c ! Copy MNF Fields to TLM Record
337 c !
338  do i=1, nflds
339  mnfoffset = map(1,i)
340  tlmoffset = map(2,i)
341  nbytes = map(3,i)
342  do j=0,nbytes-1
343  tlm( tlmoffset + j ) = mnf( mnfoffset + j )
344  enddo
345  enddo
346 
347 c !
348 c ! Write TLM record and return status
349 c !
350  mkgactlm = puttlm(lun,cnt,tlm,tlmlen)
351 
352  return
353 c
354  end
355 
356 
357 c ----------------------------------------------------------------------
358 c mklactlm - writes one LAC TLM record
359 c
360 c Synopsis:
361 c status = mklactlm( lun, mnf )
362 c
363 c integer*2 status : 0=success, 1=error, 2=end-of-file
364 c integer*2 lun : LAC TLM file unit number
365 c integer*1 mnf(*) : L0 minor frame as byte array
366 c
367 c Written By:
368 c BA Franz, GSC, 21 Feb 96
369 c
370 c ----------------------------------------------------------------------
371  integer*2 function mklactlm(lun,cnt,mnf)
372 c
373  implicit none
374 c
375  integer*4 tlmlen ! # Bytes in TLM Record
376  integer*2 nflds ! # Fields in TLM Record
377 
378  parameter(tlmlen = 892)
379  parameter(nflds = 5)
380 c
381  integer*2 lun ! TLM file unit
382  integer*4 cnt ! Number of logical records
383  byte mnf(*) ! L0 mnf record as byte array
384 
385  integer*4 nbytes ! # Bytes for this field
386  integer*4 tlmoffset ! # Byte offset of field in tlm
387  integer*4 mnfoffset ! # Byte offset of field in mnf
388  integer*4 i, j
389  byte tlm( tlmlen ) ! TLM record as byte array
390  save tlm
391 c
392  logical firstcall
393  save firstcall
394 c
395  integer*2 puttlm ! # Function to buffer output
396 
397 c !
398 c ! Define mapping from input L0 file to output TLM file
399 c ! Format is MNF byte offset, TLM byte offset, # bytes
400 c !
401  integer*2 map( 3, nflds )
402  data map / 4, 1, 4, ! S/C ID
403  . 8, 5, 8, ! S/C Time-Tag
404  . 16, 13, 775, ! SOH TLM
405  . 791, 789, 88, ! INST TLM
406  . 879, 877, 16/ ! Gain & TDI
407 
408  data firstcall /.true./
409 
410 c
411 c write(*,*) "mklactlm"
412 c
413 
414 c !
415 c ! If this is the first time through, initialize output record
416 c !
417  if ( firstcall ) then
418  firstcall = .false.
419  do i=1,tlmlen
420  tlm(i) = 0
421  enddo
422  endif
423 
424 
425 c !
426 c ! Copy MNF Fields to TLM Record
427 c !
428  do i=1, nflds
429  mnfoffset = map(1,i)
430  tlmoffset = map(2,i)
431  nbytes = map(3,i)
432  do j=0,nbytes-1
433  tlm( tlmoffset + j ) = mnf( mnfoffset + j )
434  enddo
435  enddo
436 
437 c !
438 c ! Write TLM record and return status
439 c !
440  mklactlm = puttlm(lun,cnt,tlm,tlmlen)
441 
442  return
443 c
444  end
445 
446 
integer *2 function getmnf(lun, mnfcnt, mnf, mnflen)
Definition: main_tlmgen.f:185
integer *2 function mklactlm(lun, cnt, mnf)
Definition: main_tlmgen.f:372
README for MOD_PR03(V6.1.0) 2. POINTS OF CONTACT it can be either SDP Toolkit or MODIS Packet for Terra input files The orbit validation configuration parameter(LUN 600281) must be either "TRUE" or "FALSE". It needs to be "FALSE" when running in Near Real Time mode
integer *2 function mkgactlm(lun, cnt, mnf)
Definition: main_tlmgen.f:277
integer *2 function puttlm(lun, cnt, tlm, tlmlen)
Definition: main_tlmgen.f:227
program mktlm
Definition: main_tlmgen.f:10