function [UVtot,UVtrans,U2tot,U2trans,V2tot,V2trans,errFlag]=calc2ndmom(u,v,usq,vsq,uv); % [UVtot,UVtrans,U2tot,U2trans,V2tot,V2trans,errFlag]=calc2ndmom(u,v,usq,vsq,uv); % Compute UV, U2 and V2 (at cubed-sphere A grid points) using cubed-sphere input % u = time averaged u-wind on cubed sphere grid at u-points % v = time averaged v-wind on cubed sphere grid at v-points % usq = time averaged square of u-wind on cubed sphere grid at u-points % vsq = time averaged square of v-wind on cubed sphere grid at v-points % uv = time averaged product of u-wind and v-wind on cubed sphere grid at mass points % fprintf('Entering calc2ndmom: \n'); errFlag=0; % nc=size(u,2); ncx=6*nc; nPg=ncx*nc; nz=size(u,3); % %Check size of input arrays. if read by rdmnc, remove column and row % if read by rdmds, leave alone % if wrong size altogether, get out with error % NN = size(u); if NN(1) == 6*nc+1, fprintf('Need to remove a column \n'); utmp = u(1:6*nc,:); u2tmp = usq(1:6*nc,:); elseif NN(1) == 6*nc, fprintf('No U reshaping needed \n'); utmp = u; u2tmp = usq; else fprintf('Error in U-point CS-dim: %i %i %i \n',NN); return end % NN = size(v); if NN(2) == nc+1, fprintf('Need to remove a row '); vtmp = v(:,1:nc); v2tmp = vsq(:,1:nc); elseif NN(2) == nc, fprintf('No V reshaping needed \n'); vtmp = v; v2tmp = vsq; else fprintf('Error in V-point CS-dim: %i %i %i \n',NN); return end % %Get ready to do the exchange % U=reshape(utmp,[nc 6 nc nz]); U2=reshape(u2tmp,[nc 6 nc nz]); V=reshape(vtmp,[nc 6 nc nz]); V2=reshape(v2tmp,[nc 6 nc nz]); % uu=zeros(nc+1,6,nc,nz); uu2=zeros(nc+1,6,nc,nz); vv=zeros(nc,6,nc+1,nz); vv2=zeros(nc,6,nc+1,nz); % for ifc=1:6; uu(1:nc,ifc,:,:)=U(:,ifc,:,:); uu2(1:nc,ifc,:,:)=U2(:,ifc,:,:); vv(:,ifc,1:nc,:)=V(:,ifc,:,:); vv2(:,ifc,1:nc,:)=V2(:,ifc,:,:); end % % do the exchange for k=1:nz; uu(nc+1,1:2:6,:,k)=uu(1,2:2:6,:,k); uu(nc+1,2:2:6,:,k)=vv(nc:-1:1,[4:2:6 2:2:3],1,k)'; uu2(nc+1,1:2:6,:,k)=uu2(1,2:2:6,:,k); uu2(nc+1,2:2:6,:,k)=vv2(nc:-1:1,[4:2:6 2:2:3],1,k)'; vv(:,2:2:6,nc+1,k)=vv(:,[3:2:6 1],1,k); vv(:,1:2:6,nc+1,k)=squeeze(uu(1,[3:2:6 1],nc:-1:1,k))'; vv2(:,2:2:6,nc+1,k)=vv2(:,[3:2:6 1],1,k); vv2(:,1:2:6,nc+1,k)=squeeze(uu2(1,[3:2:6 1],nc:-1:1,k))'; end % % Interp to mass points ui=(uu(1:nc,:,:,:)+uu(2:nc+1,:,:,:))/2; ub2i=(uu(1:nc,:,:,:).*uu(1:nc,:,:,:)+uu(2:nc+1,:,:,:).*uu(2:nc+1,:,:,:))/2; u2i=(uu2(1:nc,:,:,:)+uu2(2:nc+1,:,:,:))/2; vj=(vv(:,:,1:nc,:)+vv(:,:,2:nc+1,:))/2; vb2j=(vv(:,:,1:nc,:).*vv(:,:,1:nc,:)+vv(:,:,2:nc+1,:).*vv(:,:,2:nc+1,:))/2; v2j=(vv2(:,:,1:nc,:)+vv2(:,:,2:nc+1,:))/2; % ui=reshape(ui,[nPg nz]); u2i=reshape(u2i,[nPg nz]); ub2i=reshape(u2i,[nPg nz]); vj=reshape(vj,[nPg nz]); v2j=reshape(v2j,[nPg nz]); vb2j=reshape(v2j,[nPg nz]); UV=reshape(uv,[nPg nz]); % % Read cos and sin of rotation angle Rac='/u/u2/jmc/'; namfil=['proj_cs',int2str(nc),'_2uEvN.bin']; cosalpha=zeros(nPg); sinalpha=zeros(nPg); fid=fopen([Rac,namfil],'r','b'); cosalpha=fread(fid,nPg,'real*8'); sinalpha=fread(fid,nPg,'real*8'); fclose(fid); % UVtrans=zeros(nPg,nz); UVtot=zeros(nPg,nz); U2trans=zeros(nPg,nz); U2tot=zeros(nPg,nz); V2trans=zeros(nPg,nz); V2tot=zeros(nPg,nz); % for k=1:nz; UVtrans(:,k)=( (u2i(:,k)-ub2i(:,k)) - (v2j(:,k)-vb2j(:,k))) .* cosalpha .* sinalpha ... + ( UV(:,k) - ui(:,k).*vj(:,k) ) .* (cosalpha.*cosalpha - sinalpha.*sinalpha); UVtot(:,k)=UVtrans(:,k) + ( ui(:,k).*ui(:,k) - vj(:,k).*vj(:,k) ) .* cosalpha .* sinalpha ... + ui(:,k).*vj(:,k).*(cosalpha.*cosalpha - sinalpha.*sinalpha); % UVtot(:,k) = (u2i(:,k)-v2j(:,k)).* sinalpha.*cosalpha + ... % UV(:,k).*(cosalpha.*cosalpha - sinalpha.*sinalpha); % UVtrans(:,k) = UVtot(:,k) - ... % ( (ui(:,k).*ui(:,k)-vj(:,k).*vj(:,k)).* sinalpha.*cosalpha + ... % ui(:,k).*vj(:,k).*(cosalpha.*cosalpha - sinalpha.*sinalpha) ); U2tot(:,k) = u2i(:,k) .* cosalpha.*cosalpha + v2j(:,k).*sinalpha.*sinalpha ... - 2.* UV(:,k) .*cosalpha .* sinalpha; U2trans(:,k) = U2tot(:,k) - ... ( ui(:,k).*ui(:,k).*cosalpha.*cosalpha + vj(:,k).*vj(:,k).*sinalpha.*sinalpha ... - 2.* ui(:,k).*vj(:,k) .*cosalpha .* sinalpha); V2tot(:,k) = u2i(:,k) .* sinalpha.*sinalpha + v2j(:,k).*cosalpha.*cosalpha ... + 2.* UV(:,k) .*cosalpha .* sinalpha; V2trans(:,k) = V2tot(:,k) - ... ( ui(:,k).*ui(:,k).*sinalpha.*sinalpha + vj(:,k).*vj(:,k).*cosalpha.*cosalpha ... + 2.* ui(:,k).*vj(:,k) .*cosalpha .* sinalpha); end % UVtot=reshape(UVtot,[6*nc nc nz]); UVtrans=reshape(UVtrans,[6*nc nc nz]); U2tot=reshape(U2tot,[6*nc nc nz]); U2trans=reshape(U2trans,[6*nc nc nz]); V2tot=reshape(V2tot,[6*nc nc nz]); V2trans=reshape(V2trans,[6*nc nc nz]); % clear sinalpha cosalpha