27 logical ,
parameter::
t=.true.,
f=.false.
40 real(kind_real),
intent(in ):: a,k,plat,plon,pazi,lat,lon
41 real(kind_real),
dimension(2),
intent(out):: xm
42 logical,
intent(out):: ff
43 real(kind_real),
dimension(3,3):: prot,azirot
44 real(kind_real) :: clat,slat,clon,slon,cazi,sazi
45 real(kind_real),
dimension(3) :: xc
47 clat=cos(plat); slat=sin(plat)
48 clon=cos(plon); slon=sin(plon)
49 cazi=cos(pazi); sazi=sin(pazi)
51 azirot(:,1)=(/ cazi, sazi,
zero/)
52 azirot(:,2)=(/-sazi, cazi,
zero/)
55 prot(:,1)=(/ -slon, clon,
zero/)
56 prot(:,2)=(/-slat*clon, -slat*slon, clat/)
57 prot(:,3)=(/ clat*clon, clat*slon, slat/)
58 prot=matmul(prot,azirot)
60 call grtoc(lat,lon,xc)
61 xc=matmul(transpose(prot),xc)
65 subroutine gtoxm_ak_rr_g(A,K,plat,plon,pazi,delx,dely,lat,lon,&! [gtoxm_ak_rr]
74 real(kind_real),
intent(in ):: a,k,plat,plon,pazi,delx,dely,lat,lon
75 real(kind_real),
dimension(2),
intent(out):: xm
76 logical,
intent(out):: ff
78 call gtoxm_ak_rr_m(a,k,plat,plon,pazi,lat,lon,xm,ff);
if(ff)
return
79 xm(1)=xm(1)/delx; xm(2)=xm(2)/dely
83 subroutine gtoxm_ak_dd_g(A,K,pdlat,pdlon,pdazi,delx,dely,&! [gtoxm_ak_dd]
89 real(kind_real),
intent(in ):: a,k,pdlat,pdlon,pdazi,delx,dely,dlat,dlon
90 real(kind_real),
dimension(2),
intent(out):: xm
91 logical,
intent(out):: ff
93 real(kind_real):: plat,plon,pazi,lat,lon
100 call gtoxm_ak_rr_g(a,k,plat,plon,pazi,delx,dely,lat,lon,xm,ff)
110 real(kind_real),
intent(in ):: a,k
111 real(kind_real),
dimension(3),
intent(in ):: xc
112 real(kind_real),
dimension(2),
intent(out):: xm
113 logical,
intent(out):: ff
115 real(kind_real),
dimension(2):: xs,xt
119 call xstoxt(k,xs,xt,ff);
if(ff)
return
128 real(kind_real),
dimension(3),
intent(in ):: xc
129 real(kind_real),
dimension(2),
intent(out):: xs
133 zp=
one+xc(3); xs=xc(1:2)/zp
141 real(kind_real),
intent(in ):: k
142 real(kind_real),
dimension(2),
intent(in ):: xs
143 real(kind_real),
dimension(2),
intent(out):: xt
144 logical,
intent(out):: ff
146 real(kind_real):: s,sc
148 s=k*(xs(1)*xs(1)+xs(2)*xs(2)); sc=
one-s
149 ff=abs(s)>=
one;
if(ff)
return
158 real(kind_real),
intent(in ):: a
159 real(kind_real),
dimension(2),
intent(in ):: xt
160 real(kind_real),
dimension(2),
intent(out):: xm
161 logical ,
intent(out):: ff
165 do i=1,2;
call zttozm(a,xt(i),xm(i),ff);
if(ff)return;
enddo
173 real(kind_real),
intent(in ):: a,zt
174 real(kind_real),
intent(out):: zm
175 logical,
intent(out):: ff
177 real(kind_real):: ra,razt
180 if (a>
zero)then; ra=sqrt( a); razt=ra*zt; zm=atan(razt)/ra
181 elseif(a<
zero)then; ra=sqrt(-a); razt=ra*zt; ff=abs(razt)>=
one;
if(ff)
return
190 real(kind_real),
intent(IN ):: rlat,rlon
191 real(kind_real),
dimension(3),
intent(OUT):: xe
193 real(kind_real) :: sla,cla,slo,clo
195 sla=sin(rlat); cla=cos(rlat)
196 slo=sin(rlon); clo=cos(rlon)
197 xe(1)=cla*clo; xe(2)=cla*slo; xe(3)=sla
Fortran module of helper functions for FV3-LAM ESG grid domain configuration These routines are borro...
subroutine gtoxm_ak_rr_g(A, K, plat, plon, pazi, delx, dely, lat, lon, xm, ff)
subroutine xctoxs(xc, xs)
subroutine zttozm(a, zt, zm, ff)
subroutine xstoxt(k, xs, xt, ff)
subroutine gtoxm_ak_rr_m(A, K, plat, plon, pazi, lat, lon, xm, ff)
subroutine xctoxm_ak(a, k, xc, xm, ff)
subroutine xttoxm(a, xt, xm, ff)
subroutine gtoxm_ak_dd_g(A, K, pdlat, pdlon, pdazi, delx, dely, dlat, dlon, xm, ff)
subroutine dgrtoc(rlat, rlon, xe)
real(kind_real), parameter, public pi
real(kind_real), parameter, public deg2rad
real(kind_real), parameter, public one
real(kind_real), parameter, public zero
real(kind_real), parameter, public two
real(kind_real), parameter, public rad2deg