/[MITgcm]/MITgcm_contrib/enderton/PeriodicCoupling/MakePcForcing.m
ViewVC logotype

Contents of /MITgcm_contrib/enderton/PeriodicCoupling/MakePcForcing.m

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download)
Thu Mar 9 00:23:38 2006 UTC (19 years, 4 months ago) by enderton
Branch: MAIN
Changes since 1.1: +13 -8 lines
Created an iteration check to make sure that coupled and atmospheric data sets used to create ocean only forcing files have matching iterations stamps

1 function MakePcForcing(cplFiles,atmFiles,gridFiles,prevFocnFiles,...
2 period,outDir,FocnRoot,focnRoot,iter,...
3 dtC,gWeight,FocnOnly,InspectFocn,Inspectfocn)
4
5 % Make fields for forcing ocean component of periodic coupling.
6
7 rhofw = 1000.;
8
9 fieldscpl = {'TXtave' ,'TYtave' ,'FWtave' ,'HFtave' };
10 fieldsatm = {'THETA' ,'ALBVISDF','RADSWG' ,...
11 'DWNLWG' ,'TS' ,'QS' ,...
12 'WINDS' ,'PRECON' ,'PRECLS'};
13 fieldsall = {'TXtave' ,'TYtave' ,'FWtave' ,'HFtave' ,...
14 'THETA' ,'DWNLWG' ,'TS' ,'QS' ,...
15 'WINDS' ,'DWNSWG' ,'PREC' };
16
17 warning off MATLAB:MKDIR:DirectoryExists;
18 mkdir(outDir);
19
20
21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22 % Load Data %
23 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24
25 datacpl = rdmnc(cplFiles,'iter','HFtave','TXtave','TYtave','FWtave','T');
26 dataatm = rdmnc(atmFiles,'iter','THETA' ,'ALBVISDF','RADSWG' ,...
27 'DWNLWG' ,'TS' ,'QS' ,...
28 'WINDS' ,'PRECON' ,'PRECLS','T');
29 datagrd = rdmnc(gridFiles,'rA','XG','YG','XC','YC','HFacC');
30 % save('DataPerCpl.mat','datacpl','dataatm','datagrd');
31 % load('DataPerCpl.mat');
32 nc = size(datagrd.rA,2);
33 RAC = datagrd.rA;
34 mask = datagrd.HFacC(:,:,1);
35 imask = find(mask);
36 XC = datagrd.XC; XG = datagrd.XG(1:size(RAC,1),1:size(RAC,2));
37 YC = datagrd.YC; YG = datagrd.YG(1:size(RAC,1),1:size(RAC,2));
38
39 % If a new focn is to be calculated, the old Focn must be loaded.
40 if ~FocnOnly
41 for ifield=1:length(fieldsall)
42 fid=fopen([prevFocnFiles,'/',FocnRoot,...
43 '.',fieldsall{ifield},'.bin.',...
44 num2str(period-1)],'r','b');
45 dataFocnOld.(fieldsall{ifield}) = ...
46 reshape(fread(fid,'real*8'),size(RAC));
47 fclose(fid);
48 end
49 end
50 % field = 'HFtave';
51 % merccube_mod(XG,YG,dataFocnOld.(field));
52 % aaa = dataFocnOld.(field)(:,:,end);
53 % sum(aaa(:).*RAC(:))./sum(RAC(:))
54
55
56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57 % Select Coupled Field Data %
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59
60 if ~isequal(datacpl.iter,dataatm.iter./8)
61 disp('datacpl.iter'); datacpl.iter
62 disp('dataatm.iter/8'); dataatm.iter./8
63 error('Iterations for coupled and atmospheric data do not match.');
64 end
65 test = ismember(iter,datacpl.iter);
66 index = ismember(datacpl.iter,iter);
67 if ~isempty(find(test==0))
68 error('Specified indecies not present in cpl_tave.* files.');
69 end
70 for ifield = 1:length(fieldscpl)
71 data.(fieldscpl{ifield}) = ...
72 datacpl.(fieldscpl{ifield})(1:6*nc,1:nc,index);
73 end
74 for ifield = 1:length(fieldsatm)
75 data.(fieldsatm{ifield}) = ...
76 dataatm.(fieldsatm{ifield})(1:6*nc,1:nc,index);
77 end
78 % field = 'PREC';
79 % merccube_mod(XG,YG,dataCplSelect.(field));
80 % aaa = dataCplSelect.(field)(:,:,end);
81 % sum(aaa(:).*RAC(:))./sum(RAC(:))
82
83
84 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
85 % Prepare Focn %
86 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87
88 % What if it is not in year increments? Need a more sophisticated
89 % treatment of finding Focn. Should compute monthly mean before. Test
90 % with various sorts of coupled field outputs.
91 for ifield = 1:length(fieldsall)
92 if isequal(fieldsall{ifield},'PREC')
93 FocnNew = mask.*( mean(data.PRECON,3) ...
94 +mean(data.PRECLS,3))./(1000.*rhofw);
95 elseif isequal(fieldsall{ifield},'DWNSWG')
96 FocnNew = mask.*mean(data.RADSWG,3)./(1-mean(data.ALBVISDF,3));
97 else
98 FocnNew = mask.*mean(data.(fieldsall{ifield}),3);
99 end
100 if FocnOnly
101 Focn = FocnNew;
102 else
103 FocnOld = mask.*dataFocnOld.(fieldsall{ifield});
104 Focn = (gWeight*FocnOld + FocnNew)/(gWeight+1);
105 end
106 if isequal(fieldsall{ifield},'FWtave')
107 offset = sum(Focn(imask).*RAC(imask))./sum(RAC(imask));
108 Focn(imask) = Focn(imask) - offset;
109 end
110 dataFocn.(fieldsall{ifield}) = Focn;
111 fid=fopen([outDir,'/',FocnRoot,'.',...
112 fieldsall{ifield},'.bin.',...
113 num2str(period)],'w','b');
114 fwrite(fid,Focn,'real*8');
115 fclose(fid);
116 end
117 % field = 'PREC';
118 % merccube_mod(XG,YG,dataFocn.(field));
119 % aaa = dataFocn.(field)(:,:,end);
120 % sum(aaa(:).*RAC(:))./sum(RAC(:))
121
122
123 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
124 % Prepare focn as needed %
125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
126
127 if ~FocnOnly
128
129 years = iter.*dtC./31104000;
130 yrfrc = rem(years,floor(years));
131 yrfrc(yrfrc == 0) = 1;
132 uyrfrc = sort(unique(yrfrc));
133 disp(['Cpl. data instances: ',num2str(length(yrfrc))]);
134 disp(['Cpl. data per year forcing: ',num2str(length(uyrfrc))]);
135
136 for ifield = 1:length(fieldsall)
137
138 % Make yearly forcing file (usually twelve months).
139 if isequal(fieldsall{ifield},'PREC')
140 focnFull = (data.PRECON+data.PRECLS)./(1000.*rhofw);
141 elseif isequal(fieldsall{ifield},'DWNSWG')
142 focnFull = (data.RADSWG)./(1-data.ALBVISDF);
143 else
144 focnFull = data.(fieldsall{ifield});
145 end
146 focn = NaN.*zeros([size(RAC,1),size(RAC,2),length(uyrfrc)]);
147 for itime = 1:length(uyrfrc)
148 index = find(uyrfrc(itime) == yrfrc);
149 focn(:,:,itime) = mean(focnFull(:,:,index),3);
150 end
151 if ~isempty(find(isnan(focn(:))))
152 error('NaNs in ocean forcing files!!');
153 end
154
155 % Account for bathymetry.
156 for itime = 1:size(focn,3)
157 focn(:,:,itime) = mask.*focn(:,:,itime);
158 end
159
160 % Remove time mean from focn, add Focn
161 SubMean = mean(focn,3);
162 AddMean = dataFocn.(fieldsall{ifield});
163 for itime = 1:size(focn,3)
164 focn(:,:,itime) = focn(:,:,itime) - SubMean + AddMean;
165 end
166
167 focnmean = mean(focn,3);
168 focnmean = sum(focnmean(:).*RAC(:))./sum(RAC(:));
169 disp([fieldsall{ifield},' mean: ',num2str(focnmean)]);
170
171 fid=fopen([outDir,'/',focnRoot,'.',...
172 fieldsall{ifield},'.bin'],'w','b');
173 fwrite(fid,focn,'real*8');
174 fclose(fid);
175
176 aaa = mean(focn,3);
177 disp(['Number of land cells that do not have zero values: ',...
178 num2str(length(find(aaa(find(~mask))~=0)))]);
179 end
180 end
181
182
183 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
184 % Inspect Focn %
185 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186
187 if InspectFocn
188 for ifield = 1:length(fieldsall)
189 fid=fopen([outDir,'/',FocnRoot,'.',...
190 fieldsall{ifield},'.bin.',...
191 num2str(period)],'r','b');
192 Focn = reshape(fread(fid,'real*8'),size(RAC));
193 fclose(fid);
194 figure; merccube_mod(XG,YG,Focn); colorbar;
195 title(fieldsall{ifield});
196 end
197 end
198
199 if Inspectfocn
200 for ifield = 1:length(fieldsall)
201 fid=fopen([outDir,'/',focnRoot,'.',...
202 fieldsall{ifield},'.bin'],...
203 'r','b');
204 focn = reshape(fread(fid,'real*8'),[size(RAC),12]);
205 fclose(fid);
206 figure;
207 crange = [min(focn(:)),max(focn(:))];
208 for ii = 1:size(focn,3)
209 subplot(4,3,ii); merccube_mod(XG,YG,focn(:,:,ii));
210 shading flat; caxis(crange); colorbar;
211 title([fieldsall{ifield},' month ',num2str(ii)]);
212 end
213 end
214 end

  ViewVC Help
Powered by ViewVC 1.1.22