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

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

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


Revision 1.2 - (show annotations) (download)
Fri Oct 16 03:36:34 2009 UTC (15 years, 9 months ago) by gforget
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +7 -7 lines
Error occurred while calculating annotation data.
bring pkg/smooth up to date

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

  ViewVC Help
Powered by ViewVC 1.1.22