[3381] | 1 | function ssi_out = regrid_ssi(ssi_in,wvl_edges_in,wvl_edges_out) |
---|
| 2 | |
---|
| 3 | % Tim Kruschke |
---|
| 4 | % mail: tkruschke[at]geomar.de |
---|
| 5 | % |
---|
| 6 | % Function to regrid spectral solar irradiance. Prepared in context of |
---|
| 7 | % ROMIC-SOLIC project and CMIP6 solar forcing, where SATIRE and NRL data |
---|
| 8 | % are considered. |
---|
| 9 | % |
---|
| 10 | % Input: |
---|
| 11 | % ssi_in: spectral solar irradiance (dimensions wavelengths x time) |
---|
| 12 | % wvl_edges_in: edges of original wavelength bins (dimensions wavelengths x 2) |
---|
| 13 | % wvl_edges_out: edges of target wavelength bins (dimensions wavelengths x 2) |
---|
| 14 | % |
---|
| 15 | % Output: |
---|
| 16 | % ssi_out: spectral solar irradiance fro specified target wavelength bins (bin means) |
---|
| 17 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
| 18 | |
---|
| 19 | ssi_out=zeros(size(wvl_edges_out,1),size(ssi_in,2)); |
---|
| 20 | |
---|
| 21 | for i=1:size(wvl_edges_out,1); |
---|
| 22 | index_in=find(wvl_edges_in(:,2)>wvl_edges_out(i,1) & wvl_edges_in(:,1)<wvl_edges_out(i,2)); |
---|
| 23 | if ~isempty(index_in); |
---|
| 24 | if wvl_edges_in(index_in(1),1)>wvl_edges_out(i,1); % Linear interpolation for part between low edge of target bin |
---|
| 25 | tmp_ssi=ssi_in(index_in(1)-1,:)+ ... % and first original bin found inside |
---|
| 26 | (ssi_in(index_in(1),:)-ssi_in(index_in(1)-1,:))/ ... |
---|
| 27 | (wvl_edges_in(index_in(1),1)-wvl_edges_in(index_in(1)-1,2))* ... |
---|
| 28 | ((wvl_edges_in(index_in(1),1)+wvl_edges_out(i,1))/2-wvl_edges_in(index_in(1)-1,2)); |
---|
| 29 | ssi_out(i,:)=ssi_out(i,:)+tmp_ssi*(wvl_edges_in(index_in(1),1)-wvl_edges_out(i,1)); |
---|
| 30 | end |
---|
| 31 | for ii=1:length(index_in); |
---|
| 32 | lowmarg=(wvl_edges_in(index_in(ii),1)<wvl_edges_out(i,1)); |
---|
| 33 | upmarg=(wvl_edges_in(index_in(ii),2)>wvl_edges_out(i,2)); |
---|
| 34 | if ~lowmarg && ~upmarg; |
---|
| 35 | ssi_out(i,:)=ssi_out(i,:)+ssi_in(index_in(ii),:)* ... |
---|
| 36 | (wvl_edges_in(index_in(ii),2)-wvl_edges_in(index_in(ii),1)); |
---|
| 37 | elseif lowmarg && upmarg; |
---|
| 38 | ssi_out(i,:)=ssi_out(i,:)+ssi_in(index_in(ii),:)*(wvl_edges_out(i,2)-wvl_edges_out(i,1)); |
---|
| 39 | elseif lowmarg |
---|
| 40 | ssi_out(i,:)=ssi_out(i,:)+ssi_in(index_in(ii),:)* ... |
---|
| 41 | (wvl_edges_in(index_in(ii),2)-wvl_edges_out(i,1)); |
---|
| 42 | elseif upmarg |
---|
| 43 | ssi_out(i,:)=ssi_out(i,:)+ssi_in(index_in(ii),:)* ... |
---|
| 44 | (wvl_edges_out(i,2)-wvl_edges_in(index_in(ii),1)); |
---|
| 45 | |
---|
| 46 | else |
---|
| 47 | error('Logical error in function!') |
---|
| 48 | end |
---|
| 49 | if ii~=length(index_in); |
---|
| 50 | if wvl_edges_in(index_in(ii),2)~=wvl_edges_in(index_in(ii)+1,1); % Linear interpolation for gap between original bins |
---|
| 51 | tmp_ssi=(ssi_in(index_in(ii),:)+ssi_in(index_in(ii+1),:))/2; |
---|
| 52 | ssi_out(i,:)=ssi_out(i,:)+tmp_ssi* ... |
---|
| 53 | (wvl_edges_in(index_in(ii+1),1)-wvl_edges_in(index_in(ii),2)); |
---|
| 54 | end |
---|
| 55 | end |
---|
| 56 | end |
---|
| 57 | if wvl_edges_in(index_in(end),2)<wvl_edges_out(i,2); % Linear interpolation for part between high edge of target bin |
---|
| 58 | tmp_ssi=ssi_in(index_in(end),:)+ ... % and last original bin found inside |
---|
| 59 | (ssi_in(index_in(end)+1,:)-ssi_in(index_in(end),:))/ ... |
---|
| 60 | (wvl_edges_in(index_in(end)+1,1)-wvl_edges_in(index_in(end),2))* ... |
---|
| 61 | ((wvl_edges_in(index_in(end),2)+wvl_edges_out(i,2))/2-wvl_edges_in(index_in(end),2)); |
---|
| 62 | ssi_out(i,:)=ssi_out(i,:)+tmp_ssi*(wvl_edges_out(i,2)-wvl_edges_in(index_in(end),2)); |
---|
| 63 | end |
---|
| 64 | else % Linear interpolation between two original bins onto center of empty target bin |
---|
| 65 | index_below=find(wvl_edges_in(:,2)<wvl_edges_out(i,1),1,'last'); |
---|
| 66 | index_above=find(wvl_edges_in(:,1)>wvl_edges_out(i,2),1,'first'); |
---|
| 67 | tmp_ssi=ssi_in(index_below,:)+ ... |
---|
| 68 | (ssi_in(index_above,:)-ssi_in(index_below,:))/ ... |
---|
| 69 | (wvl_edges_in(index_above,1)-wvl_edges_in(index_below,2))* ... |
---|
| 70 | ((wvl_edges_out(i,1)+wvl_edges_out(i,2))/2-wvl_edges_in(index_below,2)); |
---|
| 71 | ssi_out(i,:)=tmp_ssi*(wvl_edges_out(i,2)-wvl_edges_out(i,1)); |
---|
| 72 | end |
---|
| 73 | ssi_out(i,:)=ssi_out(i,:)/(wvl_edges_out(i,2)-wvl_edges_out(i,1)); |
---|
| 74 | end |
---|
| 75 | |
---|
| 76 | return |
---|