-
Notifications
You must be signed in to change notification settings - Fork 0
/
valida_days.m
69 lines (60 loc) · 2.71 KB
/
valida_days.m
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
function [output_obs,flag,daily,f_val,interpolated] = valida_days(pos_day,dat,flag,num_obs,level)
%VALIDA_DAYS Evaluates the validity of a daily input data. A day is valid
%if has less than an hour of abnormal data. In that case abnormal data is
%replaced by interpolated data.
% INPUT:
% pos_day: Logical array of the instants between sunrise and sunset
% dat: Array of radiation data of one day (24 h) for validation
% flag: QC flags of the radiation according with second module process
% (0:Non-valid, 1:Rare but possible, 2:Possible and no rare, 3:Coherent value, 4: Valid value)
% num_obs: Number of observations per hour
% level: Defines since which flag value a day is valid according to the
% QC flags. See help QC function.
%
% OUTPUT:
% output_obs: Interpolated values series
% flag: Updated quality control flag in the case of interpolated data
% daily: Value of the daily radiation or NaN if it isn't valid
% f_val: Flag of the dayly validation process 0: Non-valid, 1: Valid, 2: Valid and value different of 0
% interpolated: Number of interpolated data in the day
%
% - F. Mendoza (March 2017) Update
%% Valids & Bads
valids = (flag>=level...
& ~isnan(dat)... % Radiation value different of NaN
& dat~=-999)... % Radiation value different of -999
& pos_day; % During daytime
% Look for the sunrise & sunset in pos_day
val_pos_day = find(pos_day);
val_pos_before_sunrise = val_pos_day(1)-1;
val_pos_after_sunset = val_pos_day(end)+1;
valids(val_pos_before_sunrise) = 1;
valids(val_pos_after_sunset) = 1;
dat(val_pos_before_sunrise) = 0;
dat(val_pos_after_sunset) = 0;
bads = pos_day & ~valids;
%% Day validation and gap filling (interpolation)
interpolated = 0; % Init variable
if sum(bads)==0 % No bads at all
daily = round(sum(dat(pos_day))/num_obs); % W/m2 per hour
f_val = 1; % Valid day
elseif sum(bads) <= num_obs % Less than one not valid hour in the day (Interpolation)
secuence_day = (1:24*num_obs)';
dat(bads) = interp1(secuence_day(valids),dat(valids),secuence_day(bads)); % 1-D interpolation (table lookup)
flag(bads) = 2; % Update of the quality control flag of the interpolated data (Possible and no rare) !!!
% Once interpolated, calculate daily radiation
daily = round(sum(dat(pos_day))/num_obs); % Wh/m2
f_val = 1; % Valid day
interpolated = sum(bads); % Save number of interpolated data
else % More that one not valid hour in the day
daily = NaN;
f_val = 0; % Non-valid day
end
if f_val==1 && daily~=0
f_val = 2; % Valid day and daily value not 0
end
%% Output
output_obs = zeros(24*num_obs,1);
output_obs(pos_day) = dat(pos_day);
flag(~pos_day & flag<2) = 2; % Update of the quality control flag of the data during night
end