function MakePcForcing(cplFiles,atmFiles,gridFiles,prevFocnFiles,... period,outDir,FocnRoot,focnRoot,iterO,iterA,... dtC,dtA,gWeight,FocnOnly,InspectFocn,Inspectfocn) % Make fields for forcing ocean component of periodic coupling. rhofw = 1000.; fieldscpl = {'TXtave' ,'TYtave' ,'FWtave' ,'HFtave' }; fieldsatm = {'THETA' ,'ALBVISDF','RADSWG' ,... 'DWNLWG' ,'TS' ,'QS' ,... 'WINDS' ,'PRECON' ,'PRECLS'}; fieldsall = {'TXtave' ,'TYtave' ,'FWtave' ,'HFtave' ,... 'THETA' ,'DWNLWG' ,'TS' ,'QS' ,... 'WINDS' ,'DWNSWG' ,'PREC' }; warning off MATLAB:MKDIR:DirectoryExists; mkdir(outDir); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Load Data % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% datacpl = rdmnc(cplFiles,'iter','HFtave','TXtave','TYtave','FWtave','T'); dataatm = rdmnc(atmFiles,'iter','THETA' ,'ALBVISDF','RADSWG' ,... 'DWNLWG' ,'TS' ,'QS' ,... 'WINDS' ,'PRECON' ,'PRECLS','T'); datagrd = rdmnc(gridFiles,'rA','XG','YG','XC','YC','HFacC'); % save('DataPerCpl.mat','datacpl','dataatm','datagrd'); % load('DataPerCpl.mat'); nc = size(datagrd.rA,2); RAC = datagrd.rA; mask = datagrd.HFacC(:,:,1); imask = find(mask); XC = datagrd.XC; XG = datagrd.XG(1:size(RAC,1),1:size(RAC,2)); YC = datagrd.YC; YG = datagrd.YG(1:size(RAC,1),1:size(RAC,2)); % If a new focn is to be calculated, the old Focn must be loaded. if ~FocnOnly for ifield=1:length(fieldsall) fid=fopen([prevFocnFiles,'/',FocnRoot,... '.',fieldsall{ifield},'.bin.',... num2str(period-1)],'r','b'); dataFocnOld.(fieldsall{ifield}) = ... reshape(fread(fid,'real*8'),size(RAC)); fclose(fid); end end % field = 'HFtave'; % merccube_mod(XG,YG,dataFocnOld.(field)); % aaa = dataFocnOld.(field)(:,:,end); % sum(aaa(:).*RAC(:))./sum(RAC(:)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Select Coupled Field Data % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if ~isequal(datacpl.iter,dataatm.iter./(dtC./dtA)) disp('datacpl.iter'); datacpl.iter disp('dataatm.iter/dt_ratio'); dataatm.iter./(dtC./dtA) error('Iterations for coupled and atmospheric data do not match.'); end test = ismember(iterO,datacpl.iter); indexO = ismember(datacpl.iter,iterO); if ~isempty(find(test==0)) error('Specified indecies not present in cpl_tave.* files.'); else for ifield = 1:length(fieldscpl) data.(fieldscpl{ifield}) = ... datacpl.(fieldscpl{ifield})(1:6*nc,1:nc,indexO); end end test = ismember(iterA,dataatm.iter); indexA = ismember(dataatm.iter,iterA); if ~isempty(find(test==0)) error('Specified indecies not present in DiagAtmForcing.* files.'); else for ifield = 1:length(fieldsatm) data.(fieldsatm{ifield}) = ... dataatm.(fieldsatm{ifield})(1:6*nc,1:nc,indexA); end end % field = 'PREC'; % merccube_mod(XG,YG,dataCplSelect.(field)); % aaa = dataCplSelect.(field)(:,:,end); % sum(aaa(:).*RAC(:))./sum(RAC(:)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Prepare Focn % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % What if it is not in year increments? Need a more sophisticated % treatment of finding Focn. Should compute monthly mean before. Test % with various sorts of coupled field outputs. for ifield = 1:length(fieldsall) if isequal(fieldsall{ifield},'PREC') FocnNew = mask.*( mean(data.PRECON,3) ... +mean(data.PRECLS,3))./(1000.*rhofw); elseif isequal(fieldsall{ifield},'DWNSWG') FocnNew = mask.*mean(data.RADSWG,3)./(1-mean(data.ALBVISDF,3)); else FocnNew = mask.*mean(data.(fieldsall{ifield}),3); end if FocnOnly Focn = FocnNew; else FocnOld = mask.*dataFocnOld.(fieldsall{ifield}); Focn = (gWeight*FocnOld + FocnNew)/(gWeight+1); end if isequal(fieldsall{ifield},'FWtave') offset = sum(Focn(imask).*RAC(imask))./sum(RAC(imask)); Focn(imask) = Focn(imask) - offset; end dataFocn.(fieldsall{ifield}) = Focn; fid=fopen([outDir,'/',FocnRoot,'.',... fieldsall{ifield},'.bin.',... num2str(period)],'w','b'); fwrite(fid,Focn,'real*8'); fclose(fid); end % field = 'PREC'; % merccube_mod(XG,YG,dataFocn.(field)); % aaa = dataFocn.(field)(:,:,end); % sum(aaa(:).*RAC(:))./sum(RAC(:)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Prepare focn as needed % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if ~FocnOnly years = iterO.*dtC./31104000; yrfrc = rem(years,floor(years)); yrfrc(yrfrc == 0) = 1; uyrfrc = sort(unique(yrfrc)); disp(['Cpl. data instances: ',num2str(length(yrfrc))]); disp(['Cpl. data per year forcing: ',num2str(length(uyrfrc))]); for ifield = 1:length(fieldsall) % Make yearly forcing file (usually twelve months). if isequal(fieldsall{ifield},'PREC') focnFull = (data.PRECON+data.PRECLS)./(1000.*rhofw); elseif isequal(fieldsall{ifield},'DWNSWG') focnFull = (data.RADSWG)./(1-data.ALBVISDF); else focnFull = data.(fieldsall{ifield}); end focn = NaN.*zeros([size(RAC,1),size(RAC,2),length(uyrfrc)]); for itime = 1:length(uyrfrc) index = find(uyrfrc(itime) == yrfrc); focn(:,:,itime) = mean(focnFull(:,:,index),3); end if ~isempty(find(isnan(focn(:)))) error('NaNs in ocean forcing files!!'); end % Account for bathymetry. for itime = 1:size(focn,3) focn(:,:,itime) = mask.*focn(:,:,itime); end % Remove time mean from focn, add Focn SubMean = mean(focn,3); AddMean = dataFocn.(fieldsall{ifield}); for itime = 1:size(focn,3) focn(:,:,itime) = focn(:,:,itime) - SubMean + AddMean; end focnmean = mean(focn,3); focnmean = sum(focnmean(:).*RAC(:))./sum(RAC(:)); disp([fieldsall{ifield},' mean: ',num2str(focnmean)]); fid=fopen([outDir,'/',focnRoot,'.',... fieldsall{ifield},'.bin'],'w','b'); fwrite(fid,focn,'real*8'); fclose(fid); aaa = mean(focn,3); disp(['Number of land cells that do not have zero values: ',... num2str(length(find(aaa(find(~mask))~=0)))]); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Inspect Focn % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if InspectFocn for ifield = 1:length(fieldsall) fid=fopen([outDir,'/',FocnRoot,'.',... fieldsall{ifield},'.bin.',... num2str(period)],'r','b'); Focn = reshape(fread(fid,'real*8'),size(RAC)); fclose(fid); figure; merccube_mod(XG,YG,Focn); colorbar; title(fieldsall{ifield}); end end if Inspectfocn for ifield = 1:length(fieldsall) fid=fopen([outDir,'/',focnRoot,'.',... fieldsall{ifield},'.bin'],... 'r','b'); focn = reshape(fread(fid,'real*8'),[size(RAC),12]); fclose(fid); figure; crange = [min(focn(:)),max(focn(:))]; for ii = 1:size(focn,3) subplot(4,3,ii); merccube_mod(XG,YG,focn(:,:,ii)); shading flat; caxis(crange); colorbar; title([fieldsall{ifield},' month ',num2str(ii)]); end end end