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','T'); datagrd = rdmnc(gridFiles,'rA','XG','YG','XC','YC','HFacC'); RAC = datagrd.rA; HFacC = datagrd.HFacC; 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','HFacC'); % load('DataPerCpl.mat'); HFacC_Top = HFacC(:,:,1); % 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 % merccube_mod(XG,YG,dataFocnOld.HF); % aaa = dataFocnOld.HF; % sum(aaa(:).*RAC(:))./sum(RAC(:)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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 % merccube_mod(XG,YG,dataCplSelect.HFtave(:,:,end)); % aaa = dataCplSelect.HFtave(:,:,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(mncfld) FocnNew = HFacC_Top.*mean(dataCplSelect.([mncfld{ifield},'tave']),3); FocnNew = DataCorrections(FocnNew,mncfld{ifield},gravity,RAC,HFacC_Top); if FocnOnly Focn = FocnNew; else FocnOld = HFacC_Top.*dataFocnOld.(mncfld{ifield}); if isequal(mncfld{ifield},'FW') FocnOld = DataCorrections(FocnOld,mncfld{ifield},... gravity,RAC,HFacC_Top); end 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 % merccube_mod(XG,YG,dataFocn.HF); % aaa = dataFocn.HF(:,:,end); % sum(aaa(:).*RAC(:))./sum(RAC(:)) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Prepare focn as needed % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Must account for land!!!! if ~FocnOnly years = [iitC:ditC:fitC].*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: ',length(uyrfrc)]); for ifield = 1:length(mncfld) % Make yearly forcing file (usually twelve months). 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 % Account for bathymetry. for itime = 1:size(focn,3) focn(:,:,itime) = HFacC_Top.*focn(:,:,itime); end % Remove time mean from focn, 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); aaa = mean(focn,3); disp(['Number of land cells that do not have zero values: ',... num2str(length(find(aaa(find(~HFacC_Top))~=0)))]); 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; merccube_mod(XG,YG,Focn); colorbar; title(mncfld{ifield}); end end if Inspectfocn for ifield = 1:length(mncfld) figure; 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_mod(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,HFacC_Top) index = find(HFacC_Top); correctdim = size(DataToCorrect); DataToCorrect = DataToCorrect(:); if isequal(CorrectionField,'SIC') CorrectedData(index) = gravity.*DataToCorrect(index); elseif isequal(CorrectionField,'FW') DataToCorrect(index); offset = sum(DataToCorrect(index).*RAC(index))./sum(RAC(index)); CorrectedData(index) = DataToCorrect(index) - offset; else CorrectedData(index) = DataToCorrect(index); end CorrectedData = reshape(CorrectedData,correctdim);