19 use masks, only: dx, dy
20 use ctlblk_mod
, only: im, jsta_2l, jend_2u, jsta_m, jend_m, spval,&
21 ista_2l, iend_2u, ista_m, iend_m
22 use gridspec_mod
, only: gridtype
28 public :: ddvdx, ddudy, uuavg
30 public :: h2u, h2v, u2h, v2h
32 REAL,
ALLOCATABLE :: ddvdx(:,:)
33 REAL,
ALLOCATABLE :: ddudy(:,:)
34 REAL,
ALLOCATABLE :: uuavg(:,:)
41 subroutine dvdxdudy(uwnd,vwnd)
45 REAL,
dimension(ista_2l:iend_2u,jsta_2l:jend_2u),
intent(in) :: uwnd, vwnd
51 INTEGER,
allocatable :: ihe(:),ihw(:)
53 IF(gridtype ==
'A')
THEN
57 IF(vwnd(i+1,j)<spval.AND.vwnd(i-1,j)<spval.AND. &
58 & uwnd(i,j+1)<spval.AND.uwnd(i,j-1)<spval)
THEN
59 r2dx = 1./(2.*dx(i,j))
60 r2dy = 1./(2.*dy(i,j))
61 ddvdx(i,j) = (vwnd(i+1,j)-vwnd(i-1,j))*r2dx
62 ddudy(i,j) = (uwnd(i,j+1)-uwnd(i,j-1))*r2dy
63 uuavg(i,j) = uwnd(i,j)
67 ELSE IF (gridtype ==
'E')
THEN
68 allocate(ihw(jsta_2l:jend_2u), ihe(jsta_2l:jend_2u))
77 IF(vwnd(i+ihe(j),j) < spval.AND.vwnd(i+ihw(j),j) < spval .AND. &
78 & uwnd(i,j+1) < spval .AND.uwnd(i,j-1) < spval)
THEN
79 r2dx = 1./(2.*dx(i,j))
80 r2dy = 1./(2.*dy(i,j))
81 ddvdx(i,j) = (vwnd(i+ihe(j),j)-vwnd(i+ihw(j),j))*r2dx
82 ddudy(i,j) = (uwnd(i,j+1)-uwnd(i,j-1))*r2dy
83 uuavg(i,j) = 0.25*(uwnd(i+ihe(j),j)+uwnd(i+ihw(j),j) &
84 & + uwnd(i,j+1)+uwnd(i,j-1))
89 ELSE IF (gridtype ==
'B')
THEN
95 if(vwnd(i, j)==spval .or. vwnd(i, j-1)==spval .or. &
96 vwnd(i-1,j)==spval .or. vwnd(i-1,j-1)==spval .or. &
97 uwnd(i, j)==spval .or. uwnd(i-1,j )==spval .or. &
98 uwnd(i,j-1)==spval .or. uwnd(i-1,j-1)==spval) cycle
99 ddvdx(i,j) = (0.5*(vwnd(i,j)+vwnd(i,j-1))-0.5*(vwnd(i-1,j) &
100 & + vwnd(i-1,j-1)))*r2dx
101 ddudy(i,j) = (0.5*(uwnd(i,j)+uwnd(i-1,j))-0.5*(uwnd(i,j-1) &
102 & + uwnd(i-1,j-1)))*r2dy
103 uuavg(i,j) = 0.25*(uwnd(i-1,j-1)+uwnd(i-1,j) &
104 & + uwnd(i, j-1)+uwnd(i, j))
109 end subroutine dvdxdudy
113 subroutine h2u(ingrid,outgrid)
117 use ctlblk_mod
, only: spval, jsta, jend, jsta_m, jend_m, me, num_procs, jm,&
118 im, jsta_2l, jend_2u, ista, iend, ista_m, iend_m, ista_2l, iend_2u
119 use gridspec_mod
, only: gridtype
125 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(in)::ingrid
126 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(out)::outgrid
128 if(gridtype ==
'A')
THEN
131 outgrid(i,j)=ingrid(i,j)
134 else IF(gridtype ==
'E')
THEN
135 call exch(ingrid(ista_2l,jsta_2l))
140 outgrid(i,j)=(ingrid(iw,j)+ingrid(ie,j)+ingrid(i,j+1)+ingrid(i,j-1))/4.0
143 ELSE IF(gridtype ==
'B')
THEN
144 call exch(ingrid(ista_2l,jsta_2l))
147 outgrid(i,j)=(ingrid(i,j)+ingrid(i,j+1)+ingrid(i+1,j)+ingrid(i+1,j+1))/4.0
152 outgrid(iend,j)=outgrid(iend-1,j)
154 IF(me == (num_procs-1) .and. jend_2u >= jm)
then
156 outgrid(i,jend) = outgrid(i,jend-1)
159 ELSE IF(gridtype ==
'C')
THEN
162 outgrid(i,j)=(ingrid(i,j)+ingrid(i+1,j))/2.0
171 subroutine h2v(ingrid,outgrid)
174 use ctlblk_mod
, only: spval, jsta, jend, jsta_m, jend_m, im, jsta_2l, jend_2u,&
175 ista, iend, ista_m, iend_m, ista_2l, iend_2u
176 use gridspec_mod
, only: gridtype
180 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(in)::ingrid
181 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(out)::outgrid
183 if(gridtype ==
'A')
THEN
186 outgrid(i,j)=ingrid(i,j)
189 else IF(gridtype ==
'E')
THEN
190 call exch(ingrid(ista_2l,jsta_2l))
195 outgrid(i,j)=(ingrid(iw,j)+ingrid(ie,j)+ingrid(i,j+1)+ingrid(i,j-1))/4.0
198 ELSE IF(gridtype ==
'B')
THEN
199 call exch(ingrid(ista_2l,jsta_2l))
202 outgrid(i,j)=(ingrid(i,j)+ingrid(i,j+1)+ingrid(i+1,j)+ingrid(i+1,j+1))/4.0
205 ELSE IF(gridtype ==
'C')
THEN
206 call exch(ingrid(ista_2l,jsta_2l))
209 outgrid(i,j)=(ingrid(i,j)+ingrid(i,j+1))/2.0
218 subroutine u2h(ingrid,outgrid)
221 use ctlblk_mod
, only: spval, jsta, jend, jsta_m, jend_m, im, jsta_2l, jend_2u,&
222 ista, iend, ista_m, iend_m, ista_2l, iend_2u
223 use gridspec_mod
, only: gridtype
227 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(in)::ingrid
228 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(out)::outgrid
230 if(gridtype ==
'A')
THEN
233 outgrid(i,j)=ingrid(i,j)
236 else IF(gridtype ==
'E')
THEN
237 call exch(ingrid(ista_2l,jsta_2l))
242 outgrid(i,j)=(ingrid(iw,j)+ingrid(ie,j)+ingrid(i,j+1)+ingrid(i,j-1))/4.0
245 ELSE IF(gridtype ==
'B')
THEN
246 call exch(ingrid(ista_2l,jsta_2l))
249 outgrid(i,j)=(ingrid(i-1,j-1)+ingrid(i,j-1)+ingrid(i-1,j)+ingrid(i,j))/4.0
252 ELSE IF(gridtype ==
'C')
THEN
255 outgrid(i,j)=(ingrid(i-1,j)+ingrid(i,j))/2.0
264 subroutine v2h(ingrid,outgrid)
267 use ctlblk_mod
, only: spval, jsta, jend, jsta_m, jend_m, im, jsta_2l, jend_2u,&
268 ista, iend, ista_m, iend_m, ista_2l, iend_2u
269 use gridspec_mod
, only: gridtype
273 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(in)::ingrid
274 real,
dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),
intent(out)::outgrid
276 if(gridtype ==
'A')
THEN
279 outgrid(i,j)=ingrid(i,j)
282 else IF(gridtype ==
'E')
THEN
283 call exch(ingrid(ista_2l,jsta_2l))
288 outgrid(i,j)=(ingrid(iw,j)+ingrid(ie,j)+ingrid(i,j+1)+ingrid(i,j-1))/4.0
291 ELSE IF(gridtype ==
'B')
THEN
292 call exch(ingrid(ista_2l,jsta_2l))
295 outgrid(i,j)=(ingrid(i-1,j-1)+ingrid(i,j-1)+ingrid(i-1,j)+ingrid(i,j))/4.0
298 ELSE IF(gridtype ==
'C')
THEN
299 call exch(ingrid(ista_2l,jsta_2l))
302 outgrid(i,j)=(ingrid(i,j-1)+ingrid(i,j))/2.0
dvdxdudy() computes dudy, dvdx, uwnd