1 |
function [Kux,Kuy,Kvx,Kvy]=diffrotated(kLarge,kSmall,fldRef); |
2 |
% |
3 |
%object: compute slanted diffusive operator coefficients |
4 |
% |
5 |
%input: dxLarge,dySmall smoothing scale in direction of |
6 |
% weak,strong fldRef gradient |
7 |
% fldRef tracer field which gradient defines |
8 |
% directions of strong,weak smoothing |
9 |
%output:Kux,Kuy,Kvx,Kvy slanted diffusion operator coefficients |
10 |
% |
11 |
%asumption: dxLarge/dxSmall are given at tracer points (not U/V points) |
12 |
|
13 |
|
14 |
gcmfaces_global; |
15 |
|
16 |
%compute the direction of main axis: |
17 |
%=================================== |
18 |
|
19 |
%1) gradient at cell center |
20 |
[dTdxAtT,dTdyAtT]=calc_T_grad(fldRef,1); |
21 |
[dTdxAtT,dTdyAtT]=exch_UV_N(dTdxAtT,dTdyAtT); |
22 |
%2) diffusion coefficients at cell center |
23 |
kLargeAtT=exch_T_N(kLarge); kSmallAtT=exch_T_N(kSmall); |
24 |
%3) interpolate to U/V points |
25 |
dTdxAtU=gcmfaces; dTdxAtV=gcmfaces; |
26 |
dTdyAtU=gcmfaces; dTdyAtV=gcmfaces; |
27 |
kLargeAtU=gcmfaces; kLargeAtV=gcmfaces; |
28 |
kSmallAtU=gcmfaces; kSmallAtV=gcmfaces; |
29 |
for iF=1:mygrid.nFaces; |
30 |
|
31 |
dTdxAtU{iF}=0.5*(dTdxAtT{iF}(1:end-2,2:end-1)+dTdxAtT{iF}(2:end-1,2:end-1)); |
32 |
dTdyAtU{iF}=0.5*(dTdyAtT{iF}(1:end-2,2:end-1)+dTdyAtT{iF}(2:end-1,2:end-1)); |
33 |
kLargeAtU{iF}=0.5*(kLargeAtT{iF}(1:end-2,2:end-1)+kLargeAtT{iF}(2:end-1,2:end-1)); |
34 |
kSmallAtU{iF}=0.5*(kSmallAtT{iF}(1:end-2,2:end-1)+kSmallAtT{iF}(2:end-1,2:end-1)); |
35 |
|
36 |
dTdxAtV{iF}=0.5*(dTdxAtT{iF}(2:end-1,1:end-2)+dTdxAtT{iF}(2:end-1,2:end-1)); |
37 |
dTdyAtV{iF}=0.5*(dTdyAtT{iF}(2:end-1,1:end-2)+dTdyAtT{iF}(2:end-1,2:end-1)); |
38 |
kLargeAtV{iF}=0.5*(kLargeAtT{iF}(2:end-1,1:end-2)+kLargeAtT{iF}(2:end-1,2:end-1)); |
39 |
kSmallAtV{iF}=0.5*(kSmallAtT{iF}(2:end-1,1:end-2)+kSmallAtT{iF}(2:end-1,2:end-1)); |
40 |
|
41 |
end; |
42 |
|
43 |
|
44 |
%compute diffusion operator : (rotated to the direction of main axis) |
45 |
%=========================== |
46 |
|
47 |
%at U points |
48 |
dFLDn=sqrt(dTdxAtU.^2+dTdyAtU.^2); |
49 |
cs=dTdyAtU; sn=-dTdxAtU; |
50 |
cs(dFLDn>0)=cs(dFLDn>0)./dFLDn(dFLDn>0); |
51 |
sn(dFLDn>0)=sn(dFLDn>0)./dFLDn(dFLDn>0); |
52 |
if 1; |
53 |
FLDangleU=gcmfaces; |
54 |
for iF=1:mygrid.nFaces; FLDangleU{iF}=atan2(sn{iF},cs{iF}); end; |
55 |
end; |
56 |
Kux=cs.*cs.*kLargeAtU+sn.*sn.*kSmallAtU; |
57 |
Kuy=cs.*sn.*(-kLargeAtU+kSmallAtU); |
58 |
%at V points |
59 |
dFLDn=sqrt(dTdxAtV.^2+dTdyAtV.^2); |
60 |
cs=dTdyAtV; sn=-dTdxAtV; |
61 |
cs(dFLDn>0)=cs(dFLDn>0)./dFLDn(dFLDn>0); |
62 |
sn(dFLDn>0)=sn(dFLDn>0)./dFLDn(dFLDn>0); |
63 |
if 1; |
64 |
FLDangleV=fldRef; |
65 |
for iF=1:mygrid.nFaces; FLDangleV{iF}=atan2(sn{iF},cs{iF}); end; |
66 |
end; |
67 |
Kvy=sn.*sn.*kLargeAtV+cs.*cs.*kSmallAtV; |
68 |
Kvx=cs.*sn.*(-kLargeAtV+kSmallAtV); |
69 |
|