/[MITgcm]/MITgcm_contrib/gael/pkg/smooth2/smooth_diff2D.F
ViewVC logotype

Contents of /MITgcm_contrib/gael/pkg/smooth2/smooth_diff2D.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Sun Oct 25 21:24:03 2009 UTC (15 years, 8 months ago) by gforget
Branch: MAIN
CVS Tags: HEAD
Error occurred while calculating annotation data.
Renovated pkg/smooth. Ready for MITgcm/pkg check in?

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

  ViewVC Help
Powered by ViewVC 1.1.22