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

Annotation 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 - (hide annotations) (download)
Sun Oct 25 21:24:03 2009 UTC (15 years, 8 months ago) by gforget
Branch: MAIN
CVS Tags: HEAD
Renovated pkg/smooth. Ready for MITgcm/pkg check in?

1 gforget 1.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