1 |
heimbach |
1.2 |
#include "CPP_OPTIONS.h" |
2 |
|
|
|
3 |
|
|
subroutine ctrl_smooth ( |
4 |
|
|
U fld ,mask) |
5 |
|
|
|
6 |
|
|
c Apply horizontal smoothing to global _RL 2-D array |
7 |
|
|
|
8 |
|
|
IMPLICIT NONE |
9 |
|
|
#include "SIZE.h" |
10 |
|
|
|
11 |
|
|
c input |
12 |
|
|
c bi, bj : array indices |
13 |
|
|
c k : vertical index used for masking |
14 |
|
|
integer k, bi, bj |
15 |
|
|
integer itlo,ithi |
16 |
|
|
integer jtlo,jthi |
17 |
|
|
|
18 |
|
|
c input/output |
19 |
|
|
c fld : 2-D array to be smoothed |
20 |
|
|
_RL fld( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ,nSx,nSy) |
21 |
|
|
_RL mask( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy,nr,nSx,nSy ) |
22 |
|
|
|
23 |
|
|
|
24 |
|
|
c local |
25 |
|
|
integer i, j, im1, ip1, jm1, jp1 |
26 |
|
|
_RL tempVar |
27 |
|
|
_RL fld_tmp( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy ) |
28 |
|
|
|
29 |
|
|
integer imin , imax , jmin , jmax |
30 |
|
|
parameter(imin=2-OLx, imax=sNx+OLx-1, jmin=2-OLy, jmax=sNy+OLy-1) |
31 |
|
|
|
32 |
|
|
_RL p0 , p5 , p25 , p125 , p0625 |
33 |
|
|
parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 ) |
34 |
|
|
jtlo = 1 |
35 |
|
|
jthi = nsy |
36 |
|
|
itlo = 1 |
37 |
|
|
ithi = nsx |
38 |
|
|
k=1 |
39 |
|
|
do bj = jtlo,jthi |
40 |
|
|
do bi = itlo,ithi |
41 |
|
|
DO j = jmin, jmax |
42 |
|
|
jm1 = j-1 |
43 |
|
|
jp1 = j+1 |
44 |
|
|
DO i = imin, imax |
45 |
|
|
im1 = i-1 |
46 |
|
|
ip1 = i+1 |
47 |
|
|
tempVar = |
48 |
|
|
& p25 * mask(i ,j ,k,bi,bj) + |
49 |
|
|
& p125 * ( mask(im1,j ,k,bi,bj) + |
50 |
|
|
& mask(ip1,j ,k,bi,bj) + |
51 |
|
|
& mask(i ,jm1,k,bi,bj) + |
52 |
|
|
& mask(i ,jp1,k,bi,bj) ) + |
53 |
|
|
& p0625 * ( mask(im1,jm1,k,bi,bj) + |
54 |
|
|
& mask(im1,jp1,k,bi,bj) + |
55 |
|
|
& mask(ip1,jm1,k,bi,bj) + |
56 |
|
|
& mask(ip1,jp1,k,bi,bj) ) |
57 |
|
|
IF ( tempVar .GE. p25 ) THEN |
58 |
|
|
fld_tmp(i,j) = ( |
59 |
|
|
& p25 * fld(i ,j,bi,bj )*mask(i ,j ,k,bi,bj) + |
60 |
|
|
& p125 *(fld(im1,j ,bi,bj )*mask(im1,j ,k,bi,bj) + |
61 |
|
|
& fld(ip1,j ,bi,bj )*mask(ip1,j ,k,bi,bj) + |
62 |
|
|
& fld(i ,jm1,bi,bj)*mask(i ,jm1,k,bi,bj) + |
63 |
|
|
& fld(i ,jp1,bi,bj)*mask(i ,jp1,k,bi,bj))+ |
64 |
|
|
& p0625*(fld(im1,jm1,bi,bj)*mask(im1,jm1,k,bi,bj) + |
65 |
|
|
& fld(im1,jp1,bi,bj)*mask(im1,jp1,k,bi,bj) + |
66 |
|
|
& fld(ip1,jm1,bi,bj)*mask(ip1,jm1,k,bi,bj) + |
67 |
|
|
& fld(ip1,jp1,bi,bj)*mask(ip1,jp1,k,bi,bj))) |
68 |
|
|
& / tempVar |
69 |
|
|
ELSE |
70 |
|
|
fld_tmp(i,j) = fld(i,j,bi,bj) |
71 |
|
|
ENDIF |
72 |
|
|
ENDDO |
73 |
|
|
ENDDO |
74 |
|
|
|
75 |
|
|
c transfer smoothed field to output array |
76 |
|
|
DO j = jmin, jmax |
77 |
|
|
DO i = imin, imax |
78 |
|
|
fld(i,j,bi,bj) = fld_tmp(i,j) |
79 |
|
|
ENDDO |
80 |
|
|
ENDDO |
81 |
|
|
ENDDO |
82 |
|
|
ENDDO |
83 |
|
|
|
84 |
|
|
|
85 |
|
|
return |
86 |
|
|
end |