function CalcOcnForcingFields(cplFiles,gridFiles,prevFocnFiles,period,... outDir,FocnRoot,focnRoot,iitC,fitC,ditC,... dtC,gWeight,FocnOnly,InspectFocn,Inspectfocn) fields = {'icL','taux','tauy','EmP','Qnet'}; mncfld = {'SIC','TX' ,'TY' ,'FW' ,'HF' }; gravity = 9.81; warning off MATLAB:MKDIR:DirectoryExists; mkdir(outDir); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Load Data % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% datacpl = rdmnc(cplFiles,'iter','HFtave','TXtave',... 'TYtave','FWtave','SICtave'); datagrd = rdmnc(gridFiles,'rA','XG','YG','XC','YC'); RAC = datagrd.rA; 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)); %save('DataPerCpl.mat','datacpl','RAC','XG','YG','XC','YC'); %load('DataPerCpl.mat'); % If a new focn is to be calculated, the old Focn must be loaded. if ~FocnOnly for ifield=1:length(mncfld) filename = [prevFocnFiles,'/',FocnRoot,'.',... fields{ifield},'.bin.',num2str(period-1)]; fid=fopen(filename,'r','b'); dataFocnOld.(mncfld{ifield}) = ... reshape(fread(fid,'real*8'),size(RAC)); fclose(fid); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Select Coupled Field Data % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% test = ismember([iitC:ditC:fitC],datacpl.iter); index = ismember(datacpl.iter,[iitC:ditC:fitC]); if ~isempty(find(test==0)) error('Specified indecies not present in cpl_tave.* files!!'); end for ifield = 1:length(mncfld) dataCplSelect.([mncfld{ifield},'tave']) = ... datacpl.([mncfld{ifield},'tave'])(:,:,index); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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(mncfld) FocnOld = dataFocnOld.(mncfld{ifield}); if isequal(mncfld{ifield},'FW') FocnOld = DataCorrections(FocnOld,mncfld{ifield},gravity,RAC); end FocnNew = mean(dataCplSelect.([mncfld{ifield},'tave']),3); FocnNew = DataCorrections(FocnNew,mncfld{ifield},gravity,RAC); if FocnOnly Focn = FocnNew; else Focn = (gWeight*FocnOld + FocnNew)/(gWeight+1); end fid=fopen([outDir,'/',FocnRoot,'.',fields{ifield},... '.bin.',num2str(period)],'w','b'); fwrite(fid,Focn,'real*8'); fclose(fid); dataFocn.(mncfld{ifield}) = Focn; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Prepare focn as needed % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if ~FocnOnly years = [iitC:ditC:fitC].*dtC./31104000; yrfrc = rem(years,floor(years)); yrfrc(yrfrc == 0) = 1; uyrfrc = sort(unique(yrfrc)); length(yrfrc) length(uyrfrc) for ifield = 1:length(mncfld) % Make yearly forcing file. focnFull = dataCplSelect.([mncfld{ifield},'tave']); 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 % Remove mean, add Focn SubMean = mean(focn,3); AddMean = dataFocn.(mncfld{ifield}); for itime = 1:size(focn,3) focn(:,:,itime) = focn(:,:,itime) - SubMean + AddMean; end % Where ice, make Tau_x, Tau_y equal zero. if isequal(mncfld{ifield},'SIC') iceMask = (focn==0); elseif ismember(mncfld{ifield},{'TX','TY'}) focn = focn.*iceMask; end focnmean = mean(focn,3); focnmean = sum(focnmean(:).*RAC(:))./sum(RAC(:)); disp([mncfld{ifield},' mean: ',num2str(focnmean)]); fid=fopen([outDir,'/',focnRoot,'.',fields{ifield},'.bin'],'w','b'); fwrite(fid,focn,'real*8'); fclose(fid); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Inspect Focn % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if InspectFocn for ifield = 1:length(mncfld) fid=fopen([outDir,'/',FocnRoot,'.',fields{ifield},... '.bin.',num2str(period)],'r','b'); Focn = reshape(fread(fid,'real*8'),size(RAC)); fclose(fid); figure(ifield); merccube(XG,YG,Focn); colorbar; title(mncfld{ifield}); end end if Inspectfocn for ifield = 1:length(mncfld) figure(ifield); orient tall; fid=fopen([outDir,'/',focnRoot,'.',fields{ifield},'.bin'],'r','b'); focn = reshape(fread(fid,'real*8'),[size(RAC),12]); fclose(fid); crange = [min(focn(:)),max(focn(:))]; for ii = 1:size(focn,3) subplot(4,3,ii); merccube(XG,YG,focn(:,:,ii)); shading flat; caxis(crange); colorbar; title([mncfld{ifield},' month ',num2str(ii)]); end end end % Field dependent data corrections. function CorrectedData = ... DataCorrections(DataToCorrect,CorrectionField,gravity,RAC) if isequal(CorrectionField,'SIC') CorrectedData = gravity.*DataToCorrect; elseif isequal(CorrectionField,'FW') offset = sum(DataToCorrect(:).*RAC(:))./sum(RAC(:)); CorrectedData = DataToCorrect - offset; else CorrectedData = DataToCorrect; end