1 |
C $Header: /u/gcmpack/MITgcm_contrib/gael/pkg/smooth2/smooth_diff2D.F,v 1.1 2009/10/24 23:27:24 gforget Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "CPP_OPTIONS.h" |
5 |
|
6 |
subroutine smooth_diff2D ( |
7 |
U fld_in,mask_in,nbt_in,mythid) |
8 |
|
9 |
C *==========================================================* |
10 |
C | SUBROUTINE smooth_diff2D |
11 |
C | o Routine that smoothes a 2D field, using diffusion |
12 |
C *==========================================================* |
13 |
|
14 |
IMPLICIT NONE |
15 |
#include "SIZE.h" |
16 |
#include "EEPARAMS.h" |
17 |
#include "GRID.h" |
18 |
#include "PARAMS.h" |
19 |
#ifdef ALLOW_AUTODIFF_TAMC |
20 |
#include "tamc.h" |
21 |
#include "tamc_keys.h" |
22 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
23 |
#include "smooth.h" |
24 |
|
25 |
integer i,j,k, bi, bj |
26 |
integer itlo,ithi |
27 |
integer jtlo,jthi |
28 |
integer myThid,myIter(nSx,nSy),key_in |
29 |
|
30 |
_RL smooth2Dmask(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
31 |
|
32 |
_RL mask_in(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nR,nSx,nSy) |
33 |
_RL fld_in(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
34 |
_RL gt_in(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
35 |
_RL gtm1_in(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
36 |
integer nbt_in |
37 |
|
38 |
integer iloop, ilev_1, ilev_2, ilev_3 |
39 |
integer max_lev2, max_lev3 |
40 |
_RL ab15,ab05 |
41 |
_RL gt_tmp |
42 |
character*( 80) fnamegeneric |
43 |
|
44 |
|
45 |
c for now: useless, because level 3 is recomputed anyway |
46 |
c but : if level3 was computed during the fwd loop by callung |
47 |
c mdsmooth_diff3D (assumes that it would be called |
48 |
c directly by the_main_loop) then I would need to pass key_in |
49 |
c as a parameter, with different values for T, S, ... |
50 |
c in order not to overwrite the same tape |
51 |
key_in=0 |
52 |
|
53 |
jtlo = mybylo(mythid) |
54 |
jthi = mybyhi(mythid) |
55 |
itlo = mybxlo(mythid) |
56 |
ithi = mybxhi(mythid) |
57 |
|
58 |
DO bj = jtlo,jthi |
59 |
DO bi = itlo,ithi |
60 |
DO j = 1,sNy |
61 |
DO i = 1,sNx |
62 |
gt_in(i,j,bi,bj) = 0. _d 0 |
63 |
gtm1_in(i,j,bi,bj) = 0. _d 0 |
64 |
smooth2Dmask(i,j,bi,bj) = mask_in(i,j,1,bi,bj) |
65 |
ENDDO |
66 |
ENDDO |
67 |
ENDDO |
68 |
ENDDO |
69 |
|
70 |
_EXCH_XY_RL ( fld_in , myThid ) |
71 |
_EXCH_XY_RL ( gt_in , myThid ) |
72 |
_EXCH_XY_RL ( gtm1_in , myThid ) |
73 |
_EXCH_XY_RL ( smooth2Dmask , myThid ) |
74 |
|
75 |
#ifdef ALLOW_TAMC_CHECKPOINTING |
76 |
|
77 |
c checkpointing: |
78 |
max_lev3=nbt_in/(nchklev_1*nchklev_2)+1 |
79 |
max_lev2=nbt_in/nchklev_1+1 |
80 |
#ifdef ALLOW_AUTODIFF_TAMC |
81 |
CADJ INIT tape_smooth2D_lev3 = USER |
82 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
83 |
do ilev_3 = 1,nchklev_3 |
84 |
if(ilev_3.le.max_lev3) then |
85 |
#ifdef ALLOW_AUTODIFF_TAMC |
86 |
CADJ STORE fld_in = tape_smooth2D_lev3 , |
87 |
CADJ & key = key_in*max_lev3 + ilev_3 |
88 |
CADJ STORE gTm1_in = tape_smooth2D_lev3 , |
89 |
CADJ & key = key_in*max_lev3 + ilev_3 |
90 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
91 |
#ifdef ALLOW_AUTODIFF_TAMC |
92 |
CADJ INIT tape_smooth2D_lev2 = USER |
93 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
94 |
|
95 |
do ilev_2 = 1,nchklev_2 |
96 |
if(ilev_2.le.max_lev2) then |
97 |
#ifdef ALLOW_AUTODIFF_TAMC |
98 |
CADJ STORE fld_in = tape_smooth2D_lev2 , |
99 |
CADJ & key = key_in*nchklev_2 + ilev_2 |
100 |
CADJ STORE gTm1_in = tape_smooth2D_lev2 , |
101 |
CADJ & key = key_in*nchklev_2 + ilev_2 |
102 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
103 |
#ifdef ALLOW_AUTODIFF_TAMC |
104 |
CADJ INIT tape_smooth2D_lev1 = COMMON, |
105 |
CADJ & nchklev_1*nsx*nsy*nthreads_chkpt |
106 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
107 |
|
108 |
do ilev_1 = 1,nchklev_1 |
109 |
iloop = (ilev_2 - 1)*nchklev_1 + ilev_1 |
110 |
& + (ilev_3 - 1)*nchklev_2*nchklev_1 |
111 |
if ( iloop .le. nbt_in ) then |
112 |
#ifdef ALLOW_AUTODIFF_TAMC |
113 |
c needed?? CADJ STORE fld_in = tape_smooth2D_lev1 , |
114 |
c CADJ & key = key_in*nchklev_1 + ilev_1 |
115 |
CADJ STORE gtm1_in = tape_smooth2D_lev1 , |
116 |
CADJ & key = key_in*nchklev_1 + ilev_1 |
117 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
118 |
|
119 |
|
120 |
#else /* ALLOW_TAMC_CHECKPOINTING */ |
121 |
do iloop=1,nbt_in |
122 |
#endif |
123 |
|
124 |
DO bj = jtlo,jthi |
125 |
DO bi = itlo,ithi |
126 |
DO j = 1,sNy |
127 |
DO i = 1,sNx |
128 |
|
129 |
gt_in(i,j,bi,bj)=0. |
130 |
|
131 |
gt_in(i,j,bi,bj)=gt_in(i,j,bi,bj)+ |
132 |
& smooth2D_Kux(i,j,bi,bj)*dyG(i,j,bi,bj)* |
133 |
& smooth2Dmask(i,j,bi,bj)*smooth2Dmask(i-1,j,bi,bj)* |
134 |
& (fld_in(i,j,bi,bj)-fld_in(i-1,j,bi,bj))*recip_dxC(i,j,bi,bj) |
135 |
|
136 |
gt_in(i,j,bi,bj)=gt_in(i,j,bi,bj)+ |
137 |
& smooth2D_Kux(i+1,j,bi,bj)*dyG(i+1,j,bi,bj)* |
138 |
& smooth2Dmask(i,j,bi,bj)*smooth2Dmask(i+1,j,bi,bj)* |
139 |
& (fld_in(i,j,bi,bj)-fld_in(i+1,j,bi,bj))*recip_dxC(i+1,j,bi,bj) |
140 |
|
141 |
gt_in(i,j,bi,bj)=gt_in(i,j,bi,bj)+ |
142 |
& smooth2D_Kvy(i,j,bi,bj)*dxG(i,j,bi,bj)* |
143 |
& smooth2Dmask(i,j,bi,bj)*smooth2Dmask(i,j-1,bi,bj)* |
144 |
& (fld_in(i,j,bi,bj)-fld_in(i,j-1,bi,bj))*recip_dyC(i,j,bi,bj) |
145 |
|
146 |
gt_in(i,j,bi,bj)=gt_in(i,j,bi,bj)+ |
147 |
& smooth2D_Kvy(i,j+1,bi,bj)*dxG(i,j+1,bi,bj)* |
148 |
& smooth2Dmask(i,j,bi,bj)*smooth2Dmask(i,j+1,bi,bj)* |
149 |
& (fld_in(i,j,bi,bj)-fld_in(i,j+1,bi,bj))*recip_dyC(i,j+1,bi,bj) |
150 |
|
151 |
ENDDO |
152 |
ENDDO |
153 |
ENDDO |
154 |
ENDDO |
155 |
|
156 |
do bj = jtlo,jthi |
157 |
do bi = itlo,ithi |
158 |
c Adams-Bashforth timestepping |
159 |
myIter(bi,bj)=iloop-1 |
160 |
IF ( myIter(bi,bj).EQ.0 ) THEN |
161 |
ab15=1.0 |
162 |
ab05=0.0 |
163 |
ELSE |
164 |
ab15=1.5+abEps |
165 |
ab05=-(0.5+abEps) |
166 |
ENDIF |
167 |
DO j = 1,sNy |
168 |
DO i = 1,sNx |
169 |
c Compute effective G-term with Adams-Bashforth |
170 |
gt_tmp = ab15*gt_in(i,j,bi,bj) |
171 |
& + ab05*gtm1_in(i,j,bi,bj) |
172 |
gtm1_in(i,j,bi,bj) = gt_in(i,j,bi,bj) |
173 |
gt_in(i,j,bi,bj) = gt_tmp |
174 |
c time step: |
175 |
fld_in(i,j,bi,bj)=fld_in(i,j,bi,bj) |
176 |
& -gt_in(i,j,bi,bj)*recip_rA(i,j,bi,bj)*smooth2DdelTime |
177 |
gt_in(i,j,bi,bj)=0 |
178 |
ENDDO |
179 |
ENDDO |
180 |
ENDDO |
181 |
ENDDO |
182 |
|
183 |
_EXCH_XY_RL ( gt_in , myThid ) |
184 |
_EXCH_XY_RL ( fld_in , myThid ) |
185 |
_EXCH_XY_RL ( gtm1_in , myThid ) |
186 |
|
187 |
#ifdef ALLOW_TAMC_CHECKPOINTING |
188 |
endif |
189 |
enddo |
190 |
endif |
191 |
enddo |
192 |
endif |
193 |
enddo |
194 |
#else /* ALLOW_TAMC_CHECKPOINTING */ |
195 |
enddo |
196 |
#endif |
197 |
|
198 |
end |