10000 REM ******************* cx routine 06/06/98 ********************* 10010 REM MKII/MKIII/MKIV DS,ZS,FM and FZ Ozone CREX encoder routine 10020 REM 10030 REM (Martin Stanek, Czech Republic, June 1998) 10040 REM 10060 REM ************************************************************* 10070 REM 10080 REM CREX encoder routine for real-time exchange of Brewer 10090 REM ozone measurements 10100 REM 10110 REM 10120 REM 10130 REM { Global Variables Referenced: 10140 REM TC() TQ() 10150 REM A1 B1 10160 REM CL$ DC$ DD$ JD$ L0$ L1$ L2$ NO$ YE$ MO$ DA$ H$} 10170 REM 10180 REM { Exits: 15030, 31020} 10190 REM 10200 REM { Uses: 3100, 5400, 7220, 9650} 10210 REM 10220 REM ************************************************************** 10230 REM CX.DAY 10240 REM CX_JDYR.### - Bulletin of averaged ozone measurements 10250 REM CREX.DAT - Bulletin of individual ozone measurement 10260 REM AVGS,AVGZ,AVGM,AVGF - Value (average) of the ozone measurement 10270 REM DS0,ZS0,FM0,FZ0 - Number of measurements 10280 REM STDS,STDZ,STDM,STDF - Standard deviation of the ozone measurement 10290 REM AMUS,AMUZ,AMUM,AMUF - Value (harmonic mean) of the air-mass 10300 REM B02144 - Light source type ("00" DS,"03" FM,"04" FZ,"06" ZS) 10310 REM B07001$ - Heigth of station 10320 REM GA1$ - Geographical area designator 10330 REM EE$ - CREX edition number 10340 REM VV$ - CREX table version number 10350 REM ************************************************************** 11000 ' 11005 ' *** Setup *** 11010 ' 11015 DATA cx 11020 B07001$="285": REM Heigth of station 11025 B01001$="11": REM WMO block number 11030 B01002$="649": REM WMO station number 11035 II1$="40": REM Type of bulletins distribution (CX_JDYR.###) 11040 II2$="40": REM Type of bulletins distribution (CREX.DAT) 11045 CCC$="OKOH": REM Indicative of station 11050 B02143$="001": REM Ozone instrument type - Brewer spectrophotometer 11055 THOUR$=LEFT$(TIME$,2) 11060 TMIN$=RIGHT$(LEFT$(TIME$,5),2) 11065 B02144S$=" 00":B02144Z$=" 06":B02144F$=" 04":B02144M$=" 03": 11070 LOCREX$=LEFT$(LO$+" ",20) 11075 B02142$=STR$(VAL(NO$)) 11080 IF MID$(B02142$,1,1)=" " THEN B02142$=MID$(B02142$,2,LEN(B02142$)-1) 11085 B02142$=LEFT$(B02142$+" ",4) 11090 JJJ=4:RRR=CINT(VAL(L1$)*100):GOSUB 28000:L1CREX$=SS$ 11095 JJJ=5:RRR=CINT(VAL(L2$)*-100):GOSUB 28000:L2CREX$=SS$ 11100 IF VAL(YE$)>50 then YECREX$="19"+YE$ 11105 IF VAL(YE$)<=50 then YECREX$="20"+YE$ 11110 I=1:GOSUB 5400:REM temp coeffs 11115 DS0=0:ZS0=0:FM0=0:FZ0=0:AMUS=0:AMUZ=0:AMUM=0:AMUF=0:DS3=0:ZS3=0:FZ3=0:FM3=0 11120 DS2=0:ZS2=0:FZ2=0:FM2=0 11125 JJJ=5:RRR=VAL(B07001$):GOSUB 28000:B07001$=SS$ 11130 GA1$="D" 11135 EE$="01" 11140 VV$="01" 12000 ' 12001 ' *** Open Brewer Data File and Print Header for CREX *** 12002 ' 12010 ON ERROR GOTO 30000:CLOSE 8 12020 OPEN DD$+"B"+JD$+YE$+"."+NO$ FOR INPUT AS 8 12030 ON ERROR GOTO 31000 12040 IF EOF(8) THEN 12070 12050 INPUT#8,A$:IF A$="ds" OR A$="zs" OR A$="fm" OR A$="fz" THEN 12500 12060 GOTO 12040 12070 PRINT "No ozone data available for this day.":GOSUB 7220 12080 ON ERROR GOTO 3100:CLOSE 8:RETURN 12500 CLOSE 8:OPEN DD$+"B"+JD$+YE$+"."+NO$ FOR INPUT AS 8 12510 PRINT CL$:PRINT "Position paper to top of page":GOSUB 9650 12520 PRINT#4,:PRINT#4,"CREX code of Brewer ozone measurements for ";DC$;" (";JD$;")" 12530 PRINT#4, 12540 PRINT#4,"KUL";GA1$;II1$;" ";CCC$;" ";DA$;THOUR$;TMIN$ 12550 PRINT#4,"CREX++" 12560 PRINT#4,"T00";EE$;VV$;" A008 D07042++" 13000 ' 13001 ' *** Process Brewer DS/ZS/FZ/FM Ozone Data *** 13002 ' 13003 T%=0 13010 IF EOF(8) THEN 14000 13110 INPUT#8,A$:IF A$="inst" THEN GOSUB 25000 13120 IF A$<>"summary" THEN 13010 13130 INPUT#8,H$,A$,A$,A$,ZA,MU,TQ,TY$,FL$ 13140 IF TQ=-30 THEN 13010 13150 IF TY$<>"ds" AND TY$<>"zs" AND TY$<>"fm" AND TY$<>"fz" THEN 13010 13170 INPUT#8,A$,A$,A$,A$,R5,R6,SO,OZ 13180 INPUT#8,A$,A$,A$,A$,A$,A$,ES,EO 13190 IF TY$="zs" THEN 13300 13195 OZ=((R6-B1+T%*TQ*(TQ(1)-TC(1)))/MU/A1)/10 13200 IF TY$="fm" THEN 13400 13205 IF TY$="fz" THEN 13500 13235 HS$=H$:GOSUB 20000:GOTO 13010 13300 HZ$=H$:GOSUB 20200:GOTO 13010 13400 HM$=H$:GOSUB 20600:GOTO 13010 13500 HF$=H$:GOSUB 20400:GOTO 13010 14000 ' 14001 ' *** Close Brewer File and Print Out Summary Data *** 14002 ' 14010 CLOSE 8:CLOSE 6:GOSUB 21500 14020 IF DS0+ZS0+FM0+FZ0>0 THEN GOSUB 23000 14030 IF DS0>0 OR ZS0>0 OR FM0>0 OR FZ0>0 THEN GOTO 15000 14100 PRINT#4, 14110 PRINT#4,"*** Insufficient data to code ***" 14120 PRINT#4,"*** CREX message for this day's observations. ***" 15000 ' 15001 ' *** Clean Up and Exit *** 15002 ' 15010 ON ERROR GOTO 3100 15020 RETURN 15030 ' 15500 MDS$=MID$(HS$,4,2) 15505 HDS$=LEFT$(HS$,2) 15510 RETURN 15600 MZS$=MID$(HZ$,4,2) 15605 HZS$=LEFT$(HZ$,2) 15610 RETURN 15700 MFZ$=MID$(HF$,4,2) 15705 HFZ$=LEFT$(HF$,2) 15710 RETURN 15800 MFM$=MID$(HM$,4,2) 15805 HFM$=LEFT$(HM$,2) 15810 RETURN 20000 ' 20001 ' *** Include DS Ozone Observation in Calculations *** 20002 ' 20010 IF OZ<0 OR MU>4 OR EO>2.5 THEN RETURN 20015 DS0=DS0+1:IF DS0=1 THEN GOSUB 15500 20020 DS2=DS2+OZ:DS3=DS3+OZ*OZ:AMUS=AMUS+(1/MU) 20025 JJJ=3:RRR=CINT((100*DS0)/AMUS):GOSUB 28000:AMUS$=SS$ 20030 JJJ=4:RRR=CINT(DS2/DS0):GOSUB 28000:AVGS$=SS$ 20035 JJJ=5:RRR=DS0:GOSUB 28000:DS0$=SS$ 20040 JJJ=4:RRR=VAL(LEFT$(HS$,2))*60+VAL(MID$(HS$,4,2))-VAL(HDS$)*60-VAL(MDS$):GOSUB 28000:TPDS$=SS$ 20045 HL$=LEFT$(HS$,2):ML$=MID$(HS$,4,2):B02144$=" 00" 20050 JJJ=4:RRR=CINT(OZ):GOSUB 28000:AVG$=SS$ 20055 JJJ=3:RRR=CINT(100*MU):GOSUB 28000:AMU$=SS$ 20060 RETURN 20200 ' 20201 ' *** Include ZS Ozone Observation in Calculations *** 20202 ' 20210 IF OZ<0 OR MU>4 OR EO>2.5 THEN RETURN 20215 ZS0=ZS0+1:IF ZS0=1 THEN GOSUB 15600 20220 ZS2=ZS2+OZ:ZS3=ZS3+OZ*OZ:AMUZ=AMUZ+(1/MU) 20225 JJJ=3:RRR=CINT((100*ZS0)/AMUZ):GOSUB 28000:AMUZ$=SS$ 20230 JJJ=4:RRR=CINT(ZS2/ZS0):GOSUB 28000:AVGZ$=SS$ 20235 JJJ=5:RRR=ZS0:GOSUB 28000:ZS0$=SS$ 20240 JJJ=4:RRR=VAL(LEFT$(HZ$,2))*60+VAL(MID$(HZ$,4,2))-VAL(HZS$)*60-VAL(MZS$):GOSUB 28000:TPZS$=SS$ 20245 HL$=LEFT$(HZ$,2):ML$=MID$(HZ$,4,2):B02144$=" 06" 20250 JJJ=4:RRR=CINT(OZ):GOSUB 28000:AVG$=SS$ 20255 JJJ=3:RRR=CINT(100*MU):GOSUB 28000:AMU$=SS$ 20260 RETURN 20400 ' 20401 ' *** Include FZ Ozone Observation in Calculations *** 20402 ' 20410 IF OZ<0 OR MU>8 OR EO>2.5 THEN RETURN 20415 FZ0=FZ0+1:IF FZ0=1 THEN GOSUB 15700 20420 FZ2=FZ2+OZ:FZ3=FZ3+OZ*OZ:AMUF=AMUF+(1/MU) 20425 JJJ=3:RRR=CINT((100*FZ0)/AMUF):GOSUB 28000:AMUF$=SS$ 20430 JJJ=4:RRR=CINT(FZ2/FZ0):GOSUB 28000:AVGF$=SS$ 20435 JJJ=5:RRR=FZ0:GOSUB 28000:FZ0$=SS$ 20440 JJJ=4:RRR=VAL(LEFT$(HF$,2))*60+VAL(MID$(HF$,4,2))-VAL(HFZ$)*60-VAL(MFZ$):GOSUB 28000:TPFZ$=SS$ 20445 HL$=LEFT$(HF$,2):ML$=MID$(HF$,4,2):B02144$=" 04" 20450 JJJ=4:RRR=CINT(OZ):GOSUB 28000:AVG$=SS$ 20455 JJJ=3:RRR=CINT(100*MU):GOSUB 28000:AMU$=SS$ 20460 RETURN 20600 ' 20601 ' *** Include FM Ozone Observation in Calculations *** 20602 ' 20610 IF OZ<0 OR MU>3.2 OR EO>5 THEN RETURN 20615 FM0=FM0+1:IF FM0=1 THEN GOSUB 15800 20620 FM2=FM2+OZ:FM3=FM3+OZ*OZ:AMUM=AMUM+(1/MU) 20625 JJJ=3:RRR=CINT((100*FM0)/AMUM):GOSUB 28000:AMUM$=SS$ 20630 JJJ=4:RRR=CINT(FM2/FM0):GOSUB 28000:AVGM$=SS$ 20635 JJJ=5:RRR=FM0:GOSUB 28000:FM0$=SS$ 20640 JJJ=4:RRR=VAL(LEFT$(HM$,2))*60+VAL(MID$(HM$,4,2))-VAL(HFM$)*60-VAL(MFM$):GOSUB 28000:TPFM$=SS$ 20645 HL$=LEFT$(HM$,2):ML$=MID$(HM$,4,2):B02144$=" 03" 20650 JJJ=4:RRR=CINT(OZ):GOSUB 28000:AVG$=SS$ 20655 JJJ=3:RRR=CINT(100*MU):GOSUB 28000:AMU$=SS$ 20660 RETURN 21500 ' 21501 ' *** Print CREX Message *** 21502 ' 21505 IF DS0=0 THEN GOTO 21600 21510 IF DS0=1 THEN DS3=0 21515 IF DS0>1 THEN IF (DS0*DS3-DS2*DS2)/DS0/(DS0-1)>-1 THEN DS3=CINT(SQR((DS0*DS3-DS2*DS2)/DS0/(DS0-1))) 21520 JJJ=4:RRR=CINT(DS3):GOSUB 28000:STDS$=SS$: 21525 PRINT#4,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HDS$ 21530 PRINT#4," ";MDS$;" 08";TPDS$;" ";B02143$;" ";B02142$;B02144S$;DS0$; 21535 PRINT#4," 04";AVGS$;" 09";STDS$;" 11";AMUS$;"++" 21545 PRINT#4,"7777"; 21550 GOTO 21900 21600 IF ZS0=0 THEN GOTO 21700 21605 IF ZS0=1 THEN ZS3=0 21610 IF ZS0>1 THEN IF (ZS0*ZS3-ZS2*ZS2)/ZS0/(ZS0-1)>-1 THEN ZS3=CINT(SQR((ZS0*ZS3-ZS2*ZS2)/ZS0/(ZS0-1))) 21615 JJJ=4:RRR=CINT(ZS3):GOSUB 28000:STDZ$=SS$ 21620 PRINT#4,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HZS$ 21625 PRINT#4," ";MZS$;" 08";TPZS$;" ";B02143$;" ";B02142$;B02144Z$;ZS0$; 21630 PRINT#4," 04";AVGZ$;" 09";STDZ$;" 11";AMUZ$;"++" 21640 PRINT#4,"7777"; 21650 GOTO 21900 21700 IF FZ0=0 THEN GOTO 21800 21705 IF FZ0=1 THEN FZ3=0 21710 IF FZ0>1 THEN IF (FZ0*FZ3-FZ2*FZ2)/FZ0/(FZ0-1)>-1 THEN FZ3=CINT(SQR((FZ0*FZ3-FZ2*FZ2)/FZ0/(FZ0-1))) 21715 JJJ=4:RRR=CINT(FZ3):GOSUB 28000:STDF$=SS$ 21720 PRINT#4,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HFZ$ 21725 PRINT#4," ";MFZ$;" 08";TPFZ$;" ";B02143$;" ";B02142$;B02144F$;FZ0$; 21730 PRINT#4," 04";AVGF$;" 09";STDF$;" 11";AMUF$;"++" 21740 PRINT#4,"7777"; 21750 GOTO 21900 21800 IF FM0=0 THEN GOTO 21900 21805 IF FM0=1 THEN FM3=0 21810 IF FM0>1 THEN IF (FM0*FM3-FM2*FM2)/FM0/(FM0-1)>-1 THEN FM3=CINT(SQR((FM0*FM3-FM2*FM2)/FM0/(FM0-1))) 21815 JJJ=4:RRR=CINT(FM3):GOSUB 28000:STDM$=SS$ 21820 PRINT#4,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HFM$ 21825 PRINT#4," ";MFM$;" 08";TPFM$;" ";B02143$;" ";B02142$;B02144M$;FM0$; 21830 PRINT#4," 04";AVGM$;" 09";STDM$;" 11";AMUM$;"++" 21840 PRINT#4,"7777"; 21850 GOTO 21900 21900 IF DS0=0 AND ZS0=0 AND FZ0=0 AND FM0=0 THEN PRINT#4,"nil" 21910 PRINT#4, 21920 PRINT#4, 21930 PRINT#4, 21950 RETURN 23000 ' 23001 ' *** Add CREX Values to Files *** 23002 ' 23010 ON ERROR GOTO 32000 23020 CREXFILE1$="CX"+JD$+YE$+"."+NO$ 23100 CLOSE 6 23105 OPEN DD$+CREXFILE1$ FOR OUTPUT AS #6 23110 PRINT#6,"KUL";GA1$;II1$;" ";CCC$;" ";DA$;THOUR$;TMIN$ 23115 PRINT#6,"CREX++" 23120 PRINT#6,"T00";EE$;VV$;" A008 D07042++" 23135 IF DS0=0 THEN GOTO 23200 23140 PRINT#6,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HDS$ 23145 PRINT#6," ";MDS$;" 08";TPDS$;" ";B02143$;" ";B02142$;B02144S$;DS0$; 23150 PRINT#6," 04";AVGS$;" 09";STDS$;" 11";AMUS$;"++" 23160 PRINT#6,"7777"; 23165 GOTO 23500 23200 IF ZS0=0 THEN GOTO 23300 23205 PRINT#6,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HZS$ 23210 PRINT#6," ";MZS$;" 08";TPZS$;" ";B02143$;" ";B02142$;B02144Z$;ZS0$; 23215 PRINT#6," 04";AVGZ$;" 09";STDZ$;" 11";AMUZ$;"++" 23225 PRINT#6,"7777"; 23230 GOTO 23500; 23300 IF FZ0=0 THEN GOTO 23400 23305 PRINT#6,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HFZ$ 23310 PRINT#6," ";MFZ$;" 08";TPFZ$;" ";B02143$;" ";B02142$;B02144F$;FZ0$; 23315 PRINT#6," 04";AVGF$;" 09";STDF$;" 11";AMUF$;"++" 23325 PRINT#6,"7777"; 23330 GOTO 23500; 23400 IF FM0=0 THEN GOTO 23430 23405 PRINT#6,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HFM$ 23410 PRINT#6," ";MFM$;" 08";TPFM$;" ";B02143$;" ";B02142$;B02144M$;FM0$; 23415 PRINT#6," 04";AVGM$;" 09";STDM$;" 11";AMUM$;"++" 23425 PRINT#6,"7777"; 23430 IF DS0=0 AND ZS0=0 AND FZ0=0 AND FM0=0 THEN PRINT#6,"nil" 23500 CLOSE 6 23505 ON ERROR GOTO 31000 23510 CREXFILE2$="CREX.DAT" 23515 CLOSE 6:OPEN DD$+CREXFILE2$ FOR OUTPUT AS #6 23520 PRINT#6,"KUL";GA1$;II2$;" ";CCC$;" ";DA$;THOUR$;TMIN$ 23525 PRINT#6,"CREX++" 23530 PRINT#6,"T00";EE$;VV$;" A008 D07041++" 23540 IF DS0=0 AND ZS0=0 AND FZ0=0 AND FM0=0 THEN GOTO 23565 23545 PRINT#6,B01001$;" ";B01002$;" ";LOCREX$;L1CREX$;L2CREX$;B07001$;" ";YECREX$;" ";MO$;" ";DA$;" ";HL$ 23550 PRINT#6," ";ML$;" ";B02143$;" ";B02142$;B02144$;AVG$;AMU$;"++" 23555 PRINT#6,"7777"; 23560 GOTO 23570 23565 PRINT#6,"nil" 23570 CLOSE 6 23575 ON ERROR GOTO 31000 24000 CREXFILE3$="CX.DAY" 24005 CLOSE 6:OPEN DD$+CREXFILE3$ FOR OUTPUT AS #6 24010 PRINT#6,DD$+CREXFILE1$ 24015 CLOSE 6 24020 ON ERROR GOTO 31000 24100 RETURN 25000 ' 25001 ' *** Reads in Temperature Coefficients when Data was Recorded *** 25002 ' 25010 FOR I=2 TO 6:INPUT#8,TQ(I):NEXT:FOR I=1 TO 19:INPUT#8,A$:NEXT 25020 INPUT#8,TQ(7) 25030 TQ(1)=TQ(3)-TQ(5)-.5*(TQ(4)-TQ(5))-1.7*(TQ(5)-TQ(6)) 25040 T%=1:RETURN 28000 ' 28001 ' *** Format the output 28002 ' 28010 SIG$=" ":IF SGN(RRR)=-1 THEN SIG$=" -" 28020 SS$=RIGHT$("00000"+STR$(RRR),JJJ) 28030 FOR III=1 TO JJJ 28040 IF MID$(SS$,III,1)=" " THEN MID$(SS$,III)="0" 28050 NEXT 28060 SS$=SIG$+SS$ 28070 RETURN 30000 ' 30001 ' *** Error Handler on File Open *** 30002 ' 30010 PRINT "No Brewer (B) file available for this day." 30020 RESUME 30030 30030 X=1:GOSUB 7220:ON ERROR GOTO 3100:CLOSE 8:RETURN 31000 ' 31001 ' *** Generic Error Handler *** 31002 ' 31010 GOTO 3100 32000 ' 32001 ' *** Error Handler for CREX File *** 32002 ' 32010 IF ERR=53 AND ERL=23040 THEN RESUME 23100 32020 GOTO 31000 65529 REM proper last line