* Program....: Sonic_means.prg * Directory..: d:\sonics\ * Author.....: [Steven Paton] * Last Modified: Oct 25, 2005 CLEAR SET SAFETY OFF SET DATE BRITISH CLOSE TABLES ALL #DEFINE U_ub 10 && These are the anemometer accetable wind data boundary limits #DEFINE U_lb -10 #DEFINE V_ub 10 #DEFINE V_lb -10 #DEFINE W_ub 8 #DEFINE W_lb -8 #DEFINE T_ub 38 #DEFINE T_lb 5 #DEFINE CM3up_ub 2000 && These are the ava accetable radiation data boundary limits #DEFINE CM3up_lb -15 #DEFINE CG3up_ub 100 #DEFINE CG3up_lb -250 #DEFINE CM3dw_ub 500 #DEFINE CM3dw_lb -15 #DEFINE CG3dw_ub 100 #DEFINE CG3dw_lb -250 #DEFINE CNR1T_ub 42 #DEFINE CNR1T_lb 0 #DEFINE Hum_ub 100 && These are the KH20 accetable humidity data boundary limits #DEFINE Hum_lb -1 #DEFINE Cp 1004 && Coefficient of Heat something...?? #DEFINE Al 2500 && Latent heat of evaporation / 1000 #DEFINE TimeInterval 30 && Averaging time interval USE D:\SONICS\INPUT_ZETEK && Open all input files USE D:\SONICS\INPUT_AVARAD IN 0 USE D:\SONICS\INPUT_AVA IN 0 USE D:\SONICS\INPUT_TRIPOD IN 0 CD D:\SONICS\ANALYSIS nFiles = ADIR(FileNames,"*.DAT") && Get the names of all datalogger files in the analysis directory FOR F = 1 TO nFiles && For each file found in this directory GetFile = FileNames[F,1] && Select the name of the current datalogger file ? "Starting "+GetFile+": "+TIME() WAIT NOWAIT WINDOW GetFile cIndexFile = RAND()*1000000 cIndexFile = ALLTRIM(STR(cIndexFile)) IndexFile = "D:\TEMP\"+ cIndexFile DO CASE CASE 'MEANS'$UPPER(Getfile) && Do nothing with a means file CASE 'AVARAD'$UPPER(Getfile) && The current file is from the Ava tower radiation sensor IF !USED('MEANSRAD20') USE D:\SONICS\MEANSRAD20 IN 0 ENDIF SELECT INPUT_AVARAD ZAP GetFile = '"'+GetFile+'"' && Modify the name of the datalogger file so that it can be used in the APPEND command APPEND FROM &GetFile DELIMITED && Append the ASCII data into a VFP data file && replace a number of date and time variables in preparation for later analysis REPLACE ALL DATE WITH CTOD(SUBSTR(DATE_TIME,9,2)+'/'+SUBSTR(DATE_TIME,6,2)+'/'+LEFT(DATE_TIME,4)), HOUR WITH SUBSTR(DATE_TIME,12,10),; HR WITH VAL(SUBSTR(DATE_TIME,12,2)), MIN20 WITH INT(VAL(SUBSTR(DATE_TIME,15,2))/TimeInterval) GOTO TOP Cal_bars_AvaRad() && Calculate the mean value of each variable for each 20-min interval SELECT MEANSRAD20 && Copy the results to a comma delimited file with the dates of the first and GOTO TOP FirstDate=DTOS(DATE) && last dates of the input file added to the name GOTO BOTTOM LastDate=DTOS(DATE) OutputFile = "D:\SONICS\ANALYSIS\Means_AVARAD_"+FirstDate+"_"+LastDate+".dat" COPY ALL TO (OutputFile) DELIMITED CASE 'AVA'$UPPER(Getfile) && The current file is from the Ava tower sonic anemometers IF !USED('MEANS20') USE D:\SONICS\MEANS20 IN 0 ENDIF SELECT INPUT_AVA ZAP GetFile = '"'+GetFile+'"' APPEND FROM &GetFile DELIMITED REPLACE ALL DATE WITH CTOD(SUBSTR(DATE_TIME,9,2)+'/'+SUBSTR(DATE_TIME,6,2)+'/'+LEFT(DATE_TIME,4)), HOUR WITH SUBSTR(DATE_TIME,12,10),; HR WITH VAL(SUBSTR(DATE_TIME,12,2)), MIN20 WITH INT(VAL(SUBSTR(DATE_TIME,15,2))/TimeInterval) INDEX ON DTOS(DATE)+STR(HR,4)+STR(MIN20,1) TO &IndexFile GOTO TOP Cal_bars_Ava() Cal_deviates_Ava() SELECT MEANS20 GOTO TOP FirstDate=DTOS(DATE) GOTO BOTTOM LastDate=DTOS(DATE) OutputFile = "D:\SONICS\ANALYSIS\Means_AVA_"+FirstDate+"_"+LastDate+".dat" COPY ALL TO (OutputFile) DELIMITED CASE 'TRIPOD'$UPPER(Getfile) && The current file is from the Gamboa tripod anemometers IF !USED('MEANS20') USE D:\SONICS\MEANS20 IN 0 ENDIF SELECT INPUT_TRIPOD ZAP GetFile = '"'+GetFile+'"' APPEND FROM &GetFile DELIMITED REPLACE ALL DATE WITH CTOD(SUBSTR(DATE_TIME,9,2)+'/'+SUBSTR(DATE_TIME,6,2)+'/'+LEFT(DATE_TIME,4)), HOUR WITH SUBSTR(DATE_TIME,12,10),; HR WITH VAL(SUBSTR(DATE_TIME,12,2)), MIN20 WITH INT(VAL(SUBSTR(DATE_TIME,15,2))/TimeInterval) INDEX ON DTOS(DATE)+STR(HR,4)+STR(MIN20,1) TO &IndexFile GOTO TOP Cal_bars_Tripod() Cal_deviates_Tripod() SELECT MEANS20 GOTO TOP FirstDate=DTOS(DATE) GOTO BOTTOM LastDate=DTOS(DATE) OutputFile = "D:\SONICS\ANALYSIS\Means_TRIPOD_"+FirstDate+"_"+LastDate+".dat" COPY ALL TO (OutputFile) DELIMITED CASE 'ZETEK'$UPPER(Getfile) && The current file is from the Zetek tower anemometers IF !USED('MEANS20') USE D:\SONICS\MEANS20 IN 0 ENDIF SELECT INPUT_ZETEK ZAP GetFile = '"'+GetFile+'"' APPEND FROM &GetFile DELIMITED REPLACE ALL DATE WITH CTOD(SUBSTR(DATE_TIME,9,2)+'/'+SUBSTR(DATE_TIME,6,2)+'/'+LEFT(DATE_TIME,4)), HOUR WITH SUBSTR(DATE_TIME,12,10),; HR WITH VAL(SUBSTR(DATE_TIME,12,2)), MIN20 WITH INT(VAL(SUBSTR(DATE_TIME,15,2))/TimeInterval) INDEX ON DTOS(DATE)+ALLTRIM(STR(HR,4))+ALLTRIM(STR(MIN20,1)) TO &IndexFile GOTO TOP Cal_bars_Zetek() Cal_deviates_Zetek() SELECT MEANS20 GOTO TOP FirstDate=DTOS(DATE) GOTO BOTTOM LastDate=DTOS(DATE) OutputFile = "D:\SONICS\ANALYSIS\Means_ZETEK_"+FirstDate+"_"+LastDate+".dat" COPY ALL TO (OutputFile) DELIMITED ENDCASE NEXT ? "Ending: "+TIME() * ---------------------------------------------------------------------------------------------- * ---------------------------------------------------------------------------------------------- FUNCTION CAL_BARS_Ava() && CALCULATE THE 20 MINUTES AVERAGES FOR THE OBSERVED VARIABLES (U,V,W,T,HUMIDITY) * For the Ava tower DIMENSION aUs[4], aVs[4], aWs[4], aTs[4], aNs[4] && ARRAYS FOR THE DIFFERENT SONICS SELECT MEANS20 ZAP SELECT INPUT_AVA DO WHILE !EOF() Mins = MIN20 Hora = HR Today= DATE * WAIT NOWAIT WINDOW DTOS(DATE)+' '+STR(HOUR,4)+' '+STR(Mins,1) STORE 0 TO aUs, aVs, aWs, aTs, aNs, Hums, nHums SCAN REST WHILE Mins=MIN20 AND Hora=HR AND Today=DATE IF U1U_lb AND V1V_lb AND W1W_lb AND T1T_lb && INCLUDE RECORD FOR SONIC 1 IF WTHIN VALID RANGE aUs[1] = aUs[1] + U1 && EAST WEST WIND aVs[1] = aVs[1] + V1 && NORTH SOUTH WIND aWs[1] = aWs[1] + W1 && VERTICAL WIND aTs[1] = aTs[1] + T1 && TEMPERATURE aNs[1] = aNs[1] + 1 && GOOD RECODS COUNTER ENDIF IF U2U_lb AND V2V_lb AND W2W_lb AND T2T_lb && INCLUDE RECORD FOR SONIC 2 IF WTHIN VALID RANGE aUs[2] = aUs[2] + U2 aVs[2] = aVs[2] + V2 aWs[2] = aWs[2] + W2 aTs[2] = aTs[2] + T2 aNs[2] = aNs[2] + 1 ENDIF ENDSCAN SELECT MEANS20 IF aNs[1]>0 APPEND BLANK REPLACE SONIC_ID WITH 'AVA1' && SONIC ID - [TOWER CODE]+[SONIC NUMBER] ; SONIC NUMBERING- TOWER TOP = 1 ; IF KH20 EXIST, IT IS ATTACHET TO SONIC 1 REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs[1] REPLACE U_BAR WITH aUs[1]/aNs[1] REPLACE V_BAR WITH aVs[1]/aNs[1] REPLACE W_BAR WITH aWs[1]/aNs[1] REPLACE T_BAR WITH aTs[1]/aNs[1] ENDIF IF aNs[2]>0 APPEND BLANK REPLACE SONIC_ID WITH 'AVA2' REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs[2] REPLACE U_BAR WITH aUs[2]/aNs[2] REPLACE V_BAR WITH aVs[2]/aNs[2] REPLACE W_BAR WITH aWs[2]/aNs[2] REPLACE T_BAR WITH aTs[2]/aNs[2] ENDIF SELECT INPUT_AVA ENDDO SELECT MEANS20 RETURN * -------------------------------------------------------------------------------------------- FUNCTION CAL_DEVIATES_AVA() SELECT MEANS20 GOTO TOP DO WHILE !EOF() SELECT INPUT_AVA SEEK(DTOS(MEANS20.DATE)+STR(MEANS20.HOUR,4)+STR(MEANS20.MIN20,1)) STORE 0 TO U, V, W, T, H STORE 0 TO aUs, aVs, aWs, aTs, aNs, Hums, nHums, aUU, aVV, aWW, aTT, aUW, aVW, aUV, aTW, aHW, aHH * WAIT NOWAIT WINDOW MEANS20.SONIC_ID+' '+DTOS(MEANS20.DATE)+' '+STR(MEANS20.HOUR,4)+' '+STR(MEANS20.MIN20,1) SCAN REST WHILE DATE=MEANS20.DATE AND HR=MEANS20.HOUR AND MIN20=MEANS20.MIN20 DO CASE CASE MEANS20.SONIC_ID='AVA1' AND U1U_lb AND V1V_lb AND W1W_lb AND T1T_lb && INCLUDE RECORD IF WITHIN VALID RANGE U = U1 - MEANS20.U_BAR && CALCULATE DEVIATES FROM MEAN V = V1 - MEANS20.V_BAR W = W1 - MEANS20.W_BAR T = T1 - MEANS20.T_BAR aUU = aUU + U*U && CALCULATE VARIANCE AND COVARIANCE TERMS AND ACCUMULATE THEM (FOR CALCULATING THEIR 20 MINUTES MEAN) aVV = aVV + V*V aWW = aWW + W*W aTT = aTT + T*T aUW = aUW + U*W aVW = aVW + V*W aUV = aUV + U*V aTW = aTW + T*W aNs = aNs + 1 CASE MEANS20.SONIC_ID='AVA2' AND U2U_lb AND V2V_lb AND W2W_lb AND T2T_lb U = U2 - MEANS20.U_BAR V = V2 - MEANS20.V_BAR W = W2 - MEANS20.W_BAR T = T1 - MEANS20.T_BAR aUU = aUU + U*U aVV = aVV + V*V aWW = aWW + W*W aTT = aTT + T*T aUW = aUW + U*W aVW = aVW + V*W aUV = aUV + U*V aTW = aTW + T*W aNs = aNs + 1 ENDCASE ENDSCAN SELECT MEANS20 IF aNs>0 REPLACE UW WITH aUW/aNs && UW COVARIANCE REPLACE UV WITH aUV/aNs && UV COVARIANCE REPLACE VW WITH aVW/aNs && VW COVARIANCE REPLACE SHF WITH aTW/aNs && TW COVARIANCE = SENSIBLE HEAT FLUX REPLACE UU WITH aUU/aNs && UU VARIANCE REPLACE VV WITH aVV/aNs && VV VARIANCE REPLACE TT WITH IIF(aTT/aNs>45,-9,aTT/aNs) && TT VARIANCE REPLACE WW WITH aWW/aNs && WW COVARIANCE ELSE REPLACE UW WITH NULL REPLACE UV WITH NULL REPLACE VW WITH NULL REPLACE SHF WITH NULL REPLACE UU WITH NULL REPLACE VV WITH NULL REPLACE TT WITH NULL REPLACE WW WITH NULL ENDIF SKIP ENDDO * ---------------------------------------------------------------------------------------------- * ---------------------------------------------------------------------------------------------- FUNCTION CAL_BARS_AvaRad() && CALCULATE THE 20 MINUTES AVERAGES FOR THE OBSERVED NEW SOLAR RADIATION AND TEMPERATURE VARIABLES SELECT MEANSRAD20 ZAP SELECT INPUT_AVARAD DO WHILE !EOF() Mins = MIN20 Hora = HR Today= DATE WAIT NOWAIT WINDOW DTOS(DATE)+' '+STR(HR,4)+' '+STR(Mins,1) STORE 0 TO aCMUs, aCGUs, aCMDs, aCGDs, aTs, aNs SCAN REST WHILE Mins=MIN20 AND Hora=HR AND Today=DATE IF CM3UP_AVGCM3up_lb AND CG3UP_AVGCG3up_lb AND; && INCLUDE RECORD FOR DATA WTHIN VALID RANGE CM3DW_AVGCM3dw_lb AND CG3DW_AVGCG3dw_lb AND; CNR1T_AVGCNR1T_lb aCMUs = aCMUs + CM3UP_AVG aCGUs = aCGUs + CG3UP_AVG aCMDs = aCMDs + CM3DW_AVG aCGDs = aCGDs + CG3DW_AVG aTs = aTs + CNR1T_AVG && TEMPERATURE aNs = aNs + 1 && GOOD RECODS COUNTER ENDIF ENDSCAN SELECT MEANSRAD20 IF aNs>0 APPEND BLANK REPLACE SONIC_ID WITH 'AVARAD' REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs REPLACE CM3UP_BAR WITH aCMUs/aNs REPLACE CG3UP_BAR WITH aCGUs/aNs REPLACE CM3DW_BAR WITH aCMDs/aNs REPLACE CG3DW_BAR WITH aCGDs/aNs REPLACE T_BAR WITH aTs/aNs ENDIF SELECT INPUT_AVARAD ENDDO SELECT MEANSRAD20 GOTO TOP RETURN * ---------------------------------------------------------------------------------------------- * ---------------------------------------------------------------------------------------------- FUNCTION CAL_BARS_TRIPOD() && CALCULATE THE 20 MINUTES AVERAGES FOR THE OBSERVED VARIABLES (U,V,W,T,HUMIDITY) && for the Gamboa Tripod DIMENSION aUs[4], aVs[4], aWs[4], aTs[4], aNs[4] && ARRAYS FOR THE DIFFERENT SONICS SELECT MEANS20 ZAP SELECT INPUT_TRIPOD DO WHILE !EOF() Mins = MIN20 Hora = HR Today= DATE WAIT NOWAIT WINDOW DTOS(DATE)+' '+HOUR+' '+STR(Mins,1) STORE 0 TO aUs, aVs, aWs, aTs, aNs, Hums, nHums SCAN REST WHILE Mins=MIN20 AND Hora=HR AND Today=DATE IF U1U_lb AND V1V_lb AND W1W_lb AND T1T_lb && INCLUDE RECORD FOR SONIC 1 IF WTHIN VALID RANGE aUs[1] = aUs[1] + U1 && EAST WEST WIND aVs[1] = aVs[1] + V1 && NORTH SOUTH WIND aWs[1] = aWs[1] + W1 && VERTICAL WIND aTs[1] = aTs[1] + T1 && TEMPERATURE aNs[1] = aNs[1] + 1 && GOOD RECODS COUNTER ENDIF IF U2U_lb AND V2V_lb AND W2W_lb AND T2T_lb && INCLUDE RECORD FOR SONIC 2 IF WTHIN VALID RANGE aUs[2] = aUs[2] + U2 aVs[2] = aVs[2] + V2 aWs[2] = aWs[2] + W2 aTs[2] = aTs[2] + T2 aNs[2] = aNs[2] + 1 ENDIF IF HUMIDITY>Hum_lb AND HUMIDITY<=Hum_ub && check good date range! Hums = Hums + HUMIDITY && HUMIDITY FROM KH20 nHums = nHums + 1 && GOOD RECORD COUNTER FOR HUMIDITY ENDIF ENDSCAN SELECT MEANS20 IF aNs[1]>0 APPEND BLANK REPLACE SONIC_ID WITH 'TRIPOD1' && SONIC ID - [TOWER CODE]+[SONIC NUMBER] ; SONIC NUMBERING- TOWER TOP = 1 ; IF KH20 EXIST, IT IS ATTACHET TO SONIC 1 REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs[1] REPLACE U_BAR WITH aUs[1]/aNs[1] REPLACE V_BAR WITH aVs[1]/aNs[1] REPLACE W_BAR WITH aWs[1]/aNs[1] REPLACE T_BAR WITH aTs[1]/aNs[1] REPLACE HUM_BAR WITH Hums/nHums REPLACE OBS_HUM WITH nHums ENDIF IF aNs[2]>0 APPEND BLANK REPLACE SONIC_ID WITH 'TRIPOD2' REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs[2] REPLACE U_BAR WITH aUs[2]/aNs[2] REPLACE V_BAR WITH aVs[2]/aNs[2] REPLACE W_BAR WITH aWs[2]/aNs[2] REPLACE T_BAR WITH aTs[2]/aNs[2] REPLACE HUM_BAR WITH NULL REPLACE OBS_HUM WITH NULL ENDIF SELECT INPUT_TRIPOD ENDDO SELECT MEANS20 RETURN * -------------------------------------------------------------------------------------------- FUNCTION CAL_DEVIATES_TRIPOD() SELECT MEANS20 GOTO TOP DO WHILE !EOF() SELECT INPUT_TRIPOD SEEK(DTOS(MEANS20.DATE)+STR(MEANS20.HOUR,4)+STR(MEANS20.MIN20,1)) STORE 0 TO U, V, W, T, H STORE 0 TO aUs, aVs, aWs, aTs, aNs, Hums, nHums, aUU, aVV, aWW, aTT, aUW, aVW, aUV, aTW, aHW, aHH * WAIT NOWAIT WINDOW MEANS20.SONIC_ID+' '+DTOS(MEANS20.DATE)+' '+STR(MEANS20.HOUR,4)+' '+STR(MEANS20.MIN20,1) SCAN REST WHILE DATE=MEANS20.DATE AND HR=MEANS20.HOUR AND MIN20=MEANS20.MIN20 DO CASE CASE MEANS20.SONIC_ID='TRIPOD1' AND U1U_lb AND V1V_lb AND W1W_lb AND T1T_lb && INCLUDE RECORD IF WITHIN VALID RANGE U = U1 - MEANS20.U_BAR && CALCULATE DEVIATES FROM MEAN V = V1 - MEANS20.V_BAR W = W1 - MEANS20.W_BAR T = T1 - MEANS20.T_BAR IF HUMIDITY>Hum_lb AND HUMIDITY<=Hum_ub && check good date range! H = HUMIDITY - MEANS20.HUM_BAR aHW = aHW + H*W aHH = aHH + H*H nHums = nHums + 1 ENDIF aUU = aUU + U*U && CALCULATE VARIANCE AND COVARIANCE TERMS AND ACCUMULATE THEM (FOR CALCULATING THEIR 20 MINUTES MEAN) aVV = aVV + V*V aWW = aWW + W*W aTT = aTT + T*T aUW = aUW + U*W aVW = aVW + V*W aUV = aUV + U*V aTW = aTW + T*W aNs = aNs + 1 CASE MEANS20.SONIC_ID='TRIPOD2' AND U2U_lb AND V2V_lb AND W2W_lb AND T2T_lb U = U2 - MEANS20.U_BAR V = V2 - MEANS20.V_BAR W = W2 - MEANS20.W_BAR T = T1 - MEANS20.T_BAR aUU = aUU + U*U aVV = aVV + V*V aWW = aWW + W*W aTT = aTT + T*T aUW = aUW + U*W aVW = aVW + V*W aUV = aUV + U*V aTW = aTW + T*W aNs = aNs + 1 ENDCASE ENDSCAN SELECT MEANS20 IF aNs>0 REPLACE UW WITH aUW/aNs && UW COVARIANCE REPLACE UV WITH aUV/aNs && UV COVARIANCE REPLACE VW WITH aVW/aNs && VW COVARIANCE REPLACE SHF WITH (aTW/aNs)*Cp && TW COVARIANCE = SENSIBLE HEAT FLUX REPLACE UU WITH aUU/aNs && UU VARIANCE REPLACE VV WITH aVV/aNs && VV VARIANCE REPLACE TT WITH aTT/aNs && TT VARIANCE REPLACE WW WITH aWW/aNs && WW COVARIANCE ELSE REPLACE UW WITH NULL REPLACE UV WITH NULL REPLACE VW WITH NULL REPLACE SHF WITH NULL REPLACE UU WITH NULL REPLACE VV WITH NULL REPLACE TT WITH NULL REPLACE WW WITH NULL ENDIF IF nHums>0 REPLACE LHF WITH (aHW/aNs)*Al && HW COVARIANCE = LATENT HEAT FLUX REPLACE HUMHUM WITH aHH/aNs && HH VARIANCE ELSE REPLACE LHF WITH NULL REPLACE HUMHUM WITH NULL ENDIF SKIP ENDDO RETURN * ---------------------------------------------------------------------------------------------- * ---------------------------------------------------------------------------------------------- FUNCTION CAL_BARS_ZETEK() && CALCULATE THE 20 MINUTES AVERAGES FOR THE OBSERVED VARIABLES (U,V,W,T,HUMIDITY) DIMENSION aUs[4], aVs[4], aWs[4], aTs[4], aNs[4] && ARRAYS FOR THE DIFFERENT SONICS SELECT MEANS20 ZAP SELECT INPUT_ZETEK DO WHILE !EOF() Mins = MIN20 Hora = HR Today= DATE WAIT NOWAIT WINDOW DTOS(DATE)+' '+HOUR+' '+STR(Mins,1) STORE 0 TO aUs, aVs, aWs, aTs, aNs, Hums, nHums SCAN REST WHILE Mins=MIN20 AND Hora=HR AND Today=DATE IF U1U_lb AND V1V_lb AND W1W_lb AND T1T_lb && INCLUDE RECORD FOR SONIC 1 IF WTHIN VALID RANGE aUs[1] = aUs[1] + U1 && EAST WEST WIND aVs[1] = aVs[1] + V1 && NORTH SOUTH WIND aWs[1] = aWs[1] + W1 && VERTICAL WIND aTs[1] = aTs[1] + T1 && TEMPERATURE aNs[1] = aNs[1] + 1 && GOOD RECODS COUNTER ENDIF IF U2U_lb AND V2V_lb AND W2W_lb AND T2T_lb && INCLUDE RECORD FOR SONIC 2 IF WTHIN VALID RANGE aUs[2] = aUs[2] + U2 aVs[2] = aVs[2] + V2 aWs[2] = aWs[2] + W2 aTs[2] = aTs[2] + T2 aNs[2] = aNs[2] + 1 ENDIF IF U3U_lb AND V3V_lb AND W3W_lb AND T3T_lb && INCLUDE RECORD FOR SONIC 3 IF WTHIN VALID RANGE aUs[3] = aUs[3] + U3 aVs[3] = aVs[3] + V3 aWs[3] = aWs[3] + W3 aTs[3] = aTs[3] + T3 aNs[3] = aNs[3] + 1 ENDIF IF HUMIDITY>Hum_lb AND HUMIDITY<=Hum_ub && check good date range! Hums = Hums + HUMIDITY && HUMIDITY FROM KH20 nHums = nHums + 1 && GOOD RECORD COUNTER FOR HUMIDITY ENDIF ENDSCAN SELECT MEANS20 IF aNs[1]>0 APPEND BLANK REPLACE SONIC_ID WITH 'ZETEK1' && SONIC ID - [TOWER CODE]+[SONIC NUMBER] ; SONIC NUMBERING- TOWER TOP = 1 ; IF KH20 EXIST, IT IS ATTACHET TO SONIC 1 REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs[1] REPLACE U_BAR WITH aUs[1]/aNs[1] REPLACE V_BAR WITH aVs[1]/aNs[1] REPLACE W_BAR WITH aWs[1]/aNs[1] REPLACE T_BAR WITH aTs[1]/aNs[1] REPLACE HUM_BAR WITH IIF(nHums>0,Hums/nHums,-9) REPLACE OBS_HUM WITH nHums ENDIF IF aNs[2]>0 APPEND BLANK REPLACE SONIC_ID WITH 'ZETEK2' REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs[2] REPLACE U_BAR WITH aUs[2]/aNs[2] REPLACE V_BAR WITH aVs[2]/aNs[2] REPLACE W_BAR WITH aWs[2]/aNs[2] REPLACE T_BAR WITH aTs[2]/aNs[2] REPLACE HUM_BAR WITH NULL REPLACE OBS_HUM WITH NULL ENDIF IF aNs[3]>0 APPEND BLANK REPLACE SONIC_ID WITH 'ZETEK3' REPLACE DATE WITH Today REPLACE HOUR WITH Hora REPLACE MIN20 WITH Mins REPLACE OBS WITH aNs[3] REPLACE U_BAR WITH aUs[3]/aNs[3] REPLACE V_BAR WITH aVs[3]/aNs[3] REPLACE W_BAR WITH aWs[3]/aNs[3] REPLACE T_BAR WITH aTs[3]/aNs[3] REPLACE HUM_BAR WITH NULL REPLACE OBS_HUM WITH NULL ENDIF SELECT INPUT_ZETEK ENDDO SELECT MEANS20 RETURN * -------------------------------------------------------------------------------------------- FUNCTION CAL_DEVIATES_ZETEK() SELECT MEANS20 GOTO TOP DO WHILE !EOF() SELECT INPUT_ZETEK SEEK(DTOS(MEANS20.DATE)+STR(MEANS20.HOUR,4)+STR(MEANS20.MIN20,1)) STORE 0 TO U, V, W, T, H STORE 0 TO aUs, aVs, aWs, aTs, aNs, Hums, nHums, aUU, aVV, aWW, aTT, aUW, aVW, aUV, aTW, aHW, aHH * WAIT NOWAIT WINDOW MEANS20.SONIC_ID+' '+DTOS(MEANS20.DATE)+' '+STR(MEANS20.HOUR,4)+' '+STR(MEANS20.MIN20,1) SCAN REST WHILE DATE=MEANS20.DATE AND HR=MEANS20.HOUR AND MIN20=MEANS20.MIN20 DO CASE CASE MEANS20.SONIC_ID='ZETEK1' AND U1U_lb AND V1V_lb AND W1W_lb AND T1T_lb && INCLUDE RECORD IF WITHIN VALID RANGE U = U1 - MEANS20.U_BAR && CALCULATE DEVIATES FROM MEAN V = V1 - MEANS20.V_BAR W = W1 - MEANS20.W_BAR T = T1 - MEANS20.T_BAR IF HUMIDITY>Hum_lb AND HUMIDITY<=Hum_ub && check good date range! H = HUMIDITY - MEANS20.HUM_BAR aHW = aHW + H*W aHH = aHH + H*H nHums = nHums + 1 ENDIF aUU = aUU + U*U && CALCULATE VARIANCE AND COVARIANCE TERMS AND ACCUMULATE THEM (FOR CALCULATING THEIR 20 MINUTES MEAN) aVV = aVV + V*V aWW = aWW + W*W aTT = aTT + T*T aUW = aUW + U*W aVW = aVW + V*W aUV = aUV + U*V aTW = aTW + T*W aNs = aNs + 1 CASE MEANS20.SONIC_ID='ZETEK2' AND U2U_lb AND V2V_lb AND W2W_lb AND T2T_lb U = U2 - MEANS20.U_BAR V = V2 - MEANS20.V_BAR W = W2 - MEANS20.W_BAR T = T1 - MEANS20.T_BAR aUU = aUU + U*U aVV = aVV + V*V aWW = aWW + W*W aTT = aTT + T*T aUW = aUW + U*W aVW = aVW + V*W aUV = aUV + U*V aTW = aTW + T*W aNs = aNs + 1 ENDCASE ENDSCAN SELECT MEANS20 IF aNs>0 REPLACE UW WITH aUW/aNs && UW COVARIANCE REPLACE UV WITH aUV/aNs && UV COVARIANCE REPLACE VW WITH aVW/aNs && VW COVARIANCE REPLACE SHF WITH (aTW/aNs)*Cp && TW COVARIANCE = SENSIBLE HEAT FLUX REPLACE UU WITH aUU/aNs && UU VARIANCE REPLACE VV WITH aVV/aNs && VV VARIANCE REPLACE TT WITH aTT/aNs && TT VARIANCE REPLACE WW WITH aWW/aNs && WW COVARIANCE ELSE REPLACE UW WITH NULL REPLACE UV WITH NULL REPLACE VW WITH NULL REPLACE SHF WITH NULL REPLACE UU WITH NULL REPLACE VV WITH NULL REPLACE TT WITH NULL REPLACE WW WITH NULL ENDIF IF nHums>0 REPLACE LHF WITH (aHW/aNs)*Al && HW COVARIANCE = LATENT HEAT FLUX REPLACE HUMHUM WITH aHH/aNs && HH VARIANCE ELSE REPLACE LHF WITH NULL REPLACE HUMHUM WITH NULL ENDIF SKIP ENDDO RETURN