/[MITgcm]/MITgcm/model/src/solve_for_pressure.F
ViewVC logotype

Annotation of /MITgcm/model/src/solve_for_pressure.F

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


Revision 1.83 - (hide annotations) (download)
Fri Mar 24 15:41:19 2017 UTC (7 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, HEAD
Changes since 1.82: +5 -10 lines
use 'I10' suffix to simplify debug writing of cg2/3d_b/x (similar to cg3d.F, cg3d_ex0.F)

1 jmc 1.83 C $Header: /u/gcmpack/MITgcm/model/src/solve_for_pressure.F,v 1.82 2016/05/28 23:25:55 jmc Exp $
2 heimbach 1.21 C $Name: $
3 cnh 1.1
4 edhill 1.39 #include "PACKAGES_CONFIG.h"
5 adcroft 1.5 #include "CPP_OPTIONS.h"
6 cnh 1.1
7 cnh 1.27 CBOP
8     C !ROUTINE: SOLVE_FOR_PRESSURE
9     C !INTERFACE:
10 jmc 1.71 SUBROUTINE SOLVE_FOR_PRESSURE( myTime, myIter, myThid )
11 cnh 1.27
12     C !DESCRIPTION: \bv
13     C *==========================================================*
14 jmc 1.58 C | SUBROUTINE SOLVE_FOR_PRESSURE
15     C | o Controls inversion of two and/or three-dimensional
16     C | elliptic problems for the pressure field.
17 cnh 1.27 C *==========================================================*
18     C \ev
19    
20     C !USES:
21 adcroft 1.8 IMPLICIT NONE
22 cnh 1.4 C == Global variables
23     #include "SIZE.h"
24     #include "EEPARAMS.h"
25     #include "PARAMS.h"
26 adcroft 1.12 #include "GRID.h"
27 jmc 1.17 #include "SURFACE.h"
28 jmc 1.28 #include "FFIELDS.h"
29 jmc 1.48 #include "DYNVARS.h"
30     #include "SOLVE_FOR_PRESSURE.h"
31 adcroft 1.9 #ifdef ALLOW_NONHYDROSTATIC
32 adcroft 1.25 #include "SOLVE_FOR_PRESSURE3D.h"
33 jmc 1.48 #include "NH_VARS.h"
34     #endif
35     #ifdef ALLOW_CD_CODE
36     #include "CD_CODE_VARS.h"
37 adcroft 1.12 #endif
38 cnh 1.4
39 jmc 1.32 C === Functions ====
40 jmc 1.46 LOGICAL DIFFERENT_MULTIPLE
41     EXTERNAL DIFFERENT_MULTIPLE
42 jmc 1.82 #ifdef ALLOW_DIAGNOSTICS
43     LOGICAL DIAGNOSTICS_IS_ON
44     EXTERNAL DIAGNOSTICS_IS_ON
45     #endif /* ALLOW_DIAGNOSTICS */
46 jmc 1.32
47 cnh 1.27 C !INPUT/OUTPUT PARAMETERS:
48 cnh 1.1 C == Routine arguments ==
49 jmc 1.58 C myTime :: Current time in simulation
50     C myIter :: Current iteration number in simulation
51     C myThid :: Thread number for this instance of SOLVE_FOR_PRESSURE
52 jmc 1.28 _RL myTime
53     INTEGER myIter
54 jmc 1.29 INTEGER myThid
55 cnh 1.4
56 cnh 1.27 C !LOCAL VARIABLES:
57 adcroft 1.22 C == Local variables ==
58 cnh 1.6 INTEGER i,j,k,bi,bj
59 jmc 1.73 INTEGER ks
60 jmc 1.79 INTEGER numIters, nIterMin
61     _RL firstResidual, minResidualSq, lastResidual
62 jmc 1.36 _RL tmpFac
63 jmc 1.65 _RL sumEmP, tileEmP(nSx,nSy)
64 jmc 1.47 LOGICAL putPmEinXvector
65 jmc 1.73 INTEGER ioUnit
66 adcroft 1.25 CHARACTER*(MAX_LEN_MBUF) msgBuf
67 jmc 1.49 #ifdef ALLOW_NONHYDROSTATIC
68 jmc 1.71 LOGICAL zeroPsNH, zeroMeanPnh, oldFreeSurfTerm
69 jmc 1.63 #else
70     _RL cg3d_b(1)
71 jmc 1.49 #endif
72 jmc 1.82 #ifdef ALLOW_DIAGNOSTICS
73     CHARACTER*8 diagName
74     _RL tmpVar (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
75     #endif /* ALLOW_DIAGNOSTICS */
76 cnh 1.27 CEOP
77 jmc 1.17
78 jmc 1.49 #ifdef ALLOW_NONHYDROSTATIC
79 jmc 1.68 zeroPsNH = .FALSE.
80 jmc 1.71 c zeroPsNH = use3Dsolver .AND. exactConserv
81     c & .AND. select_rStar.EQ.0
82     zeroMeanPnh = .FALSE.
83     c zeroMeanPnh = use3Dsolver .AND. select_rStar.NE.0
84 jmc 1.72 c oldFreeSurfTerm = use3Dsolver .AND. select_rStar.EQ.0
85     c & .AND. .NOT.zeroPsNH
86     oldFreeSurfTerm = use3Dsolver .AND. .NOT.exactConserv
87 jmc 1.63 #else
88     cg3d_b(1) = 0.
89 jmc 1.49 #endif
90    
91 jmc 1.58 C deepAtmosphere & useRealFreshWaterFlux: only valid if deepFac2F(ksurf)=1
92     C anelastic (always Z-coordinate):
93     C 1) assume that rhoFacF(1)=1 (and ksurf == 1);
94     C (this reduces the number of lines of code to modify)
95     C 2) (a) 2-D continuity eq. compute div. of mass transport (<- add rhoFac)
96     C (b) gradient of surf.Press in momentum eq. (<- add 1/rhoFac)
97     C => 2 factors cancel in elliptic eq. for Phi_s ,
98     C but 1rst factor(a) remains in RHS cg2d_b.
99    
100 jmc 1.47 C-- Initialise the Vector solution with etaN + deltaT*Global_mean_PmE
101     C instead of simply etaN ; This can speed-up the solver convergence in
102     C the case where |Global_mean_PmE| is large.
103     putPmEinXvector = .FALSE.
104 jmc 1.64 c putPmEinXvector = useRealFreshWaterFlux.AND.fluidIsWater
105 jmc 1.47
106 jmc 1.71 IF ( myIter.EQ.1+nIter0 .AND. debugLevel .GE. debLevA ) THEN
107     _BEGIN_MASTER( myThid )
108     ioUnit = standardMessageUnit
109     WRITE(msgBuf,'(2A,L5)') 'SOLVE_FOR_PRESSURE:',
110     & ' putPmEinXvector =', putPmEinXvector
111     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
112     #ifdef ALLOW_NONHYDROSTATIC
113     WRITE(msgBuf,'(A,2(A,L5))') 'SOLVE_FOR_PRESSURE:',
114     & ' zeroPsNH=', zeroPsNH, ' , zeroMeanPnh=', zeroMeanPnh
115     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
116     WRITE(msgBuf,'(2A,L5)') 'SOLVE_FOR_PRESSURE:',
117     & ' oldFreeSurfTerm =', oldFreeSurfTerm
118     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
119     #endif
120     _END_MASTER( myThid )
121     ENDIF
122    
123 jmc 1.17 C-- Save previous solution & Initialise Vector solution and source term :
124 jmc 1.47 sumEmP = 0.
125 jmc 1.17 DO bj=myByLo(myThid),myByHi(myThid)
126     DO bi=myBxLo(myThid),myBxHi(myThid)
127     DO j=1-OLy,sNy+OLy
128     DO i=1-OLx,sNx+OLx
129 edhill 1.40 #ifdef ALLOW_CD_CODE
130 jmc 1.17 etaNm1(i,j,bi,bj) = etaN(i,j,bi,bj)
131 jmc 1.26 #endif
132 jmc 1.18 cg2d_x(i,j,bi,bj) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
133 jmc 1.17 cg2d_b(i,j,bi,bj) = 0.
134     ENDDO
135     ENDDO
136 jmc 1.64 IF (useRealFreshWaterFlux.AND.fluidIsWater) THEN
137 jmc 1.78 tmpFac = freeSurfFac*mass2rUnit*implicDiv2DFlow
138 jmc 1.29 DO j=1,sNy
139     DO i=1,sNx
140 jmc 1.58 cg2d_b(i,j,bi,bj) =
141 jmc 1.29 & tmpFac*_rA(i,j,bi,bj)*EmPmR(i,j,bi,bj)/deltaTMom
142 jmc 1.78 & *maskInC(i,j,bi,bj)
143 jmc 1.29 ENDDO
144     ENDDO
145     ENDIF
146 jmc 1.47 IF ( putPmEinXvector ) THEN
147 jmc 1.65 tileEmP(bi,bj) = 0.
148 jmc 1.47 DO j=1,sNy
149     DO i=1,sNx
150 jmc 1.67 tileEmP(bi,bj) = tileEmP(bi,bj)
151 jmc 1.65 & + rA(i,j,bi,bj)*EmPmR(i,j,bi,bj)
152 jmc 1.74 & *maskInC(i,j,bi,bj)
153 jmc 1.47 ENDDO
154     ENDDO
155     ENDIF
156 jmc 1.17 ENDDO
157     ENDDO
158 jmc 1.47 IF ( putPmEinXvector ) THEN
159 jmc 1.65 CALL GLOBAL_SUM_TILE_RL( tileEmP, sumEmP, myThid )
160 jmc 1.47 ENDIF
161 adcroft 1.12
162     DO bj=myByLo(myThid),myByHi(myThid)
163     DO bi=myBxLo(myThid),myBxHi(myThid)
164 jmc 1.47 IF ( putPmEinXvector ) THEN
165     tmpFac = 0.
166 jmc 1.62 IF (globalArea.GT.0.) tmpFac =
167 jmc 1.81 & freeSurfFac*deltaTFreeSurf*mass2rUnit*sumEmP/globalArea
168 jmc 1.47 DO j=1,sNy
169     DO i=1,sNx
170     cg2d_x(i,j,bi,bj) = cg2d_x(i,j,bi,bj)
171     & - tmpFac*Bo_surf(i,j,bi,bj)
172     ENDDO
173     ENDDO
174     ENDIF
175 jmc 1.58 C- RHS: similar to the divergence of the vertically integrated mass transport:
176     C del_i { Sum_k [ rhoFac.(dr.hFac).(dy.deepFac).(u*) ] } / deltaT
177 jmc 1.63 DO k=Nr,1,-1
178 adcroft 1.12 CALL CALC_DIV_GHAT(
179 jmc 1.63 I bi,bj,k,
180     U cg2d_b, cg3d_b,
181     I myThid )
182 adcroft 1.12 ENDDO
183     ENDDO
184     ENDDO
185 cnh 1.4
186 adcroft 1.12 DO bj=myByLo(myThid),myByHi(myThid)
187     DO bi=myBxLo(myThid),myBxHi(myThid)
188 adcroft 1.13 #ifdef ALLOW_NONHYDROSTATIC
189 jmc 1.71 IF ( oldFreeSurfTerm ) THEN
190 jmc 1.73 C-- Add source term arising from w=d/dt (p_s + p_nh)
191 jmc 1.28 DO j=1,sNy
192     DO i=1,sNx
193 jmc 1.77 ks = kSurfC(i,j,bi,bj)
194 jmc 1.51 IF ( ks.LE.Nr ) THEN
195     cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
196 jmc 1.58 & -freeSurfFac*_rA(i,j,bi,bj)*deepFac2F(ks)
197 jmc 1.81 & /deltaTMom/deltaTFreeSurf
198 jmc 1.28 & *( etaN(i,j,bi,bj)
199 jmc 1.59 & +phi_nh(i,j,ks,bi,bj)*recip_Bo(i,j,bi,bj) )
200 jmc 1.51 cg3d_b(i,j,ks,bi,bj) = cg3d_b(i,j,ks,bi,bj)
201 jmc 1.58 & -freeSurfFac*_rA(i,j,bi,bj)*deepFac2F(ks)
202 jmc 1.81 & /deltaTMom/deltaTFreeSurf
203 jmc 1.28 & *( etaN(i,j,bi,bj)
204 jmc 1.59 & +phi_nh(i,j,ks,bi,bj)*recip_Bo(i,j,bi,bj) )
205 jmc 1.51 ENDIF
206 jmc 1.28 ENDDO
207 adcroft 1.12 ENDDO
208 jmc 1.28 ELSEIF ( exactConserv ) THEN
209 adcroft 1.13 #else
210 jmc 1.73 C-- Add source term arising from w=d/dt (p_s)
211 jmc 1.26 IF ( exactConserv ) THEN
212 edhill 1.39 #endif /* ALLOW_NONHYDROSTATIC */
213 jmc 1.26 DO j=1,sNy
214     DO i=1,sNx
215 jmc 1.77 ks = kSurfC(i,j,bi,bj)
216 jmc 1.26 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
217 jmc 1.58 & -freeSurfFac*_rA(i,j,bi,bj)*deepFac2F(ks)
218 jmc 1.81 & /deltaTMom/deltaTFreeSurf
219 jmc 1.26 & * etaH(i,j,bi,bj)
220     ENDDO
221     ENDDO
222     ELSE
223     DO j=1,sNy
224     DO i=1,sNx
225 jmc 1.77 ks = kSurfC(i,j,bi,bj)
226 jmc 1.26 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
227 jmc 1.58 & -freeSurfFac*_rA(i,j,bi,bj)*deepFac2F(ks)
228 jmc 1.81 & /deltaTMom/deltaTFreeSurf
229 jmc 1.26 & * etaN(i,j,bi,bj)
230     ENDDO
231 adcroft 1.12 ENDDO
232 jmc 1.26 ENDIF
233 adcroft 1.12
234     #ifdef ALLOW_OBCS
235 jmc 1.76 C- Note: solver matrix is trivial outside OB region (main diagonal only)
236     C => no real need to reset RHS (=cg2d_b) & cg2d_x, except that:
237     C a) normalisation is fct of Max(RHS), which can be large ouside OB region
238     C (would be different if we were solving for increment of eta/g
239     C instead of directly for eta/g).
240     C => need to reset RHS to ensure that interior solution does not depend
241     C on ouside OB region.
242     C b) provide directly the trivial solution cg2d_x == 0 for outside OB region
243     C (=> no residual => no effect on solver convergence and interior solution)
244 adcroft 1.14 IF (useOBCS) THEN
245 jmc 1.76 DO j=1,sNy
246     DO i=1,sNx
247     cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)*maskInC(i,j,bi,bj)
248     cg2d_x(i,j,bi,bj) = cg2d_x(i,j,bi,bj)*maskInC(i,j,bi,bj)
249 adcroft 1.12 ENDDO
250     ENDDO
251     ENDIF
252 jmc 1.49 #endif /* ALLOW_OBCS */
253     C- end bi,bj loops
254 adcroft 1.12 ENDDO
255     ENDDO
256    
257 edhill 1.42 #ifdef ALLOW_DEBUG
258 jmc 1.77 IF ( debugLevel .GE. debLevD ) THEN
259 adcroft 1.23 CALL DEBUG_STATS_RL(1,cg2d_b,'cg2d_b (SOLVE_FOR_PRESSURE)',
260     & myThid)
261 adcroft 1.24 ENDIF
262 adcroft 1.23 #endif
263 jmc 1.61 IF ( DIFFERENT_MULTIPLE(diagFreq, myTime, deltaTClock) ) THEN
264 jmc 1.83 CALL WRITE_FLD_XY_RL( 'cg2d_b', 'I10', cg2d_b, myIter, myThid )
265 jmc 1.61 ENDIF
266 adcroft 1.12
267 cnh 1.1 C-- Find the surface pressure using a two-dimensional conjugate
268 jmc 1.81 C gradient solver. See CG2D.h for the interface to this routine.
269     C In rare cases of a poor solver convergence, better to select the
270     C solver minimum-residual solution (instead of the last-iter solution)
271     C by setting cg2dUseMinResSol=1 (<-> nIterMin=0 in input)
272 jmc 1.79 numIters = cg2dMaxIters
273 jmc 1.81 nIterMin = cg2dUseMinResSol - 1
274 jmc 1.50 c CALL TIMER_START('CG2D [SOLVE_FOR_PRESSURE]',myThid)
275 jmc 1.80 #ifdef DISCONNECTED_TILES
276     C-- Call the not-self-adjoint version of cg2d
277     CALL CG2D_EX0(
278     U cg2d_b, cg2d_x,
279     O firstResidual, minResidualSq, lastResidual,
280     U numIters, nIterMin,
281     I myThid )
282     #else /* not DISCONNECTED_TILES = default */
283 heimbach 1.56 #ifdef ALLOW_CG2D_NSA
284     C-- Call the not-self-adjoint version of cg2d
285     CALL CG2D_NSA(
286 jmc 1.79 U cg2d_b, cg2d_x,
287     O firstResidual, minResidualSq, lastResidual,
288     U numIters, nIterMin,
289 heimbach 1.56 I myThid )
290     #else /* not ALLOW_CG2D_NSA = default */
291 mlosch 1.69 #ifdef ALLOW_SRCG
292     IF ( useSRCGSolver ) THEN
293     C-- Call the single reduce CG solver
294     CALL CG2D_SR(
295 jmc 1.79 U cg2d_b, cg2d_x,
296     O firstResidual, minResidualSq, lastResidual,
297     U numIters, nIterMin,
298 cnh 1.1 I myThid )
299 mlosch 1.69 ELSE
300     #else
301     IF (.TRUE.) THEN
302     C-- Call the default CG solver
303     #endif /* ALLOW_SRCG */
304     CALL CG2D(
305 jmc 1.79 U cg2d_b, cg2d_x,
306     O firstResidual, minResidualSq, lastResidual,
307     U numIters, nIterMin,
308 mlosch 1.69 I myThid )
309     ENDIF
310 heimbach 1.56 #endif /* ALLOW_CG2D_NSA */
311 jmc 1.80 #endif /* DISCONNECTED_TILES */
312 jmc 1.67 _EXCH_XY_RL( cg2d_x, myThid )
313 jmc 1.50 c CALL TIMER_STOP ('CG2D [SOLVE_FOR_PRESSURE]',myThid)
314 adcroft 1.23
315 edhill 1.42 #ifdef ALLOW_DEBUG
316 jmc 1.77 IF ( debugLevel .GE. debLevD ) THEN
317 adcroft 1.23 CALL DEBUG_STATS_RL(1,cg2d_x,'cg2d_x (SOLVE_FOR_PRESSURE)',
318     & myThid)
319 adcroft 1.24 ENDIF
320 adcroft 1.23 #endif
321 cnh 1.1
322 jmc 1.32 C- dump CG2D output at monitorFreq (to reduce size of STD-OUTPUT files) :
323 jmc 1.46 IF ( DIFFERENT_MULTIPLE(monitorFreq,myTime,deltaTClock)
324 jmc 1.45 & ) THEN
325 heimbach 1.38 IF ( debugLevel .GE. debLevA ) THEN
326     _BEGIN_MASTER( myThid )
327 jmc 1.79 WRITE(msgBuf,'(A20,1PE23.14)') 'cg2d_init_res =',firstResidual
328 heimbach 1.38 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
329 jmc 1.79 WRITE(msgBuf,'(A27,2I8)')
330     & 'cg2d_iters(min,last) =', nIterMin, numIters
331 heimbach 1.38 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
332 jmc 1.79 IF ( minResidualSq.GE.0. ) THEN
333     minResidualSq = SQRT(minResidualSq)
334     WRITE(msgBuf,'(A20,1PE23.14)') 'cg2d_min_res =',minResidualSq
335     CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
336     ENDIF
337     WRITE(msgBuf,'(A20,1PE23.14)') 'cg2d_last_res =',lastResidual
338 heimbach 1.38 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
339 edhill 1.43 _END_MASTER( myThid )
340 heimbach 1.38 ENDIF
341 jmc 1.32 ENDIF
342 jmc 1.17
343 jmc 1.82 #ifdef ALLOW_DIAGNOSTICS
344     C-- Fill diagnostics
345     IF ( useDiagnostics .AND. implicSurfPress.NE.oneRL ) THEN
346     diagName = 'PHI_SURF'
347     IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN
348     DO bj=myByLo(myThid),myByHi(myThid)
349     DO bi=myBxLo(myThid),myBxHi(myThid)
350     DO j=1-OLy,sNy+OLy
351     DO i=1-OLx,sNx+OLx
352     tmpVar(i,j) = implicSurfPress * cg2d_x(i,j,bi,bj)
353     & + (oneRL - implicSurfPress)* Bo_surf(i,j,bi,bj)
354     & * etaN(i,j,bi,bj)
355     ENDDO
356     ENDDO
357     CALL DIAGNOSTICS_FILL( tmpVar,diagName,1,1,2,bi,bj,myThid )
358     ENDDO
359     ENDDO
360     ENDIF
361     ELSEIF ( useDiagnostics ) THEN
362     CALL DIAGNOSTICS_FILL( cg2d_x,'PHI_SURF', 0,1, 0,1,1, myThid )
363     ENDIF
364     #endif /* ALLOW_DIAGNOSTICS */
365    
366 jmc 1.17 C-- Transfert the 2D-solution to "etaN" :
367     DO bj=myByLo(myThid),myByHi(myThid)
368     DO bi=myBxLo(myThid),myBxHi(myThid)
369     DO j=1-OLy,sNy+OLy
370     DO i=1-OLx,sNx+OLx
371 jmc 1.18 etaN(i,j,bi,bj) = recip_Bo(i,j,bi,bj)*cg2d_x(i,j,bi,bj)
372 jmc 1.17 ENDDO
373     ENDDO
374     ENDDO
375     ENDDO
376 adcroft 1.10
377 adcroft 1.9 #ifdef ALLOW_NONHYDROSTATIC
378 jmc 1.53 IF ( use3Dsolver ) THEN
379 jmc 1.67 IF ( DIFFERENT_MULTIPLE(diagFreq, myTime, deltaTClock) ) THEN
380 jmc 1.83 CALL WRITE_FLD_XY_RL( 'cg2d_x','I10', cg2d_x, myIter, myThid )
381 jmc 1.67 ENDIF
382 adcroft 1.9
383     C-- Solve for a three-dimensional pressure term (NH or IGW or both ).
384     C see CG3D.h for the interface to this routine.
385 jmc 1.71
386 jmc 1.73 C-- Finish updating cg3d_b: 1) Add EmPmR contribution to top level cg3d_b:
387     C 2) Update or Add free-surface contribution
388     C 3) increment in horiz velocity due to new cg2d_x
389     C 4) add vertical velocity contribution.
390     CALL PRE_CG3D(
391     I oldFreeSurfTerm,
392     I cg2d_x,
393     U cg3d_b,
394     I myTime, myIter, myThid )
395 adcroft 1.9
396 jmc 1.67 #ifdef ALLOW_DEBUG
397 jmc 1.77 IF ( debugLevel .GE. debLevD ) THEN
398 jmc 1.73 CALL DEBUG_STATS_RL(Nr,cg3d_b,'cg3d_b (SOLVE_FOR_PRESSURE)',
399     & myThid)
400     ENDIF
401 jmc 1.67 #endif
402     IF ( DIFFERENT_MULTIPLE( diagFreq, myTime, deltaTClock) ) THEN
403 jmc 1.83 CALL WRITE_FLD_XYZ_RL('cg3d_b','I10', cg3d_b, myIter,myThid )
404 jmc 1.67 ENDIF
405 jmc 1.49
406 jmc 1.73 firstResidual=0.
407     lastResidual=0.
408     numIters=cg3dMaxIters
409     CALL TIMER_START('CG3D [SOLVE_FOR_PRESSURE]',myThid)
410 jmc 1.80 #ifdef DISCONNECTED_TILES
411     CALL CG3D_EX0(
412     U cg3d_b, phi_nh,
413     O firstResidual, lastResidual,
414     U numIters,
415     I myIter, myThid )
416     #else /* not DISCONNECTED_TILES = default */
417 jmc 1.73 CALL CG3D(
418 jmc 1.79 U cg3d_b, phi_nh,
419     O firstResidual, lastResidual,
420 jmc 1.73 U numIters,
421     I myIter, myThid )
422 jmc 1.80 #endif /* DISCONNECTED_TILES */
423 jmc 1.73 _EXCH_XYZ_RL( phi_nh, myThid )
424     CALL TIMER_STOP ('CG3D [SOLVE_FOR_PRESSURE]',myThid)
425    
426     IF ( DIFFERENT_MULTIPLE(monitorFreq,myTime,deltaTClock)
427     & ) THEN
428     IF ( debugLevel .GE. debLevA ) THEN
429     _BEGIN_MASTER( myThid )
430 jmc 1.79 WRITE(msgBuf,'(A20,1PE23.14)') 'cg3d_init_res =',firstResidual
431 jmc 1.73 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
432 jmc 1.79 WRITE(msgBuf,'(A27,I16)') 'cg3d_iters (last) = ',numIters
433 jmc 1.73 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
434 jmc 1.79 WRITE(msgBuf,'(A20,1PE23.14)') 'cg3d_last_res =',lastResidual
435 jmc 1.73 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
436     _END_MASTER( myThid )
437     ENDIF
438     ENDIF
439 jmc 1.49
440 jmc 1.73 C-- Separate the Hydrostatic Surface Pressure adjusment (=> put it in dPhiNH)
441     C from the Non-hydrostatic pressure (since cg3d_x contains both contribution)
442     IF ( nonHydrostatic .AND. exactConserv ) THEN
443     IF ( DIFFERENT_MULTIPLE( diagFreq, myTime, deltaTClock) ) THEN
444 jmc 1.83 CALL WRITE_FLD_XYZ_RL('cg3d_x','I10', phi_nh, myIter,myThid )
445 jmc 1.73 ENDIF
446     CALL POST_CG3D(
447     I zeroPsNH, zeroMeanPnh,
448     I myTime, myIter, myThid )
449     ENDIF
450 jmc 1.49
451     ENDIF
452     #endif /* ALLOW_NONHYDROSTATIC */
453 cnh 1.1
454 heimbach 1.60 #ifdef ALLOW_SHOWFLOPS
455     CALL SHOWFLOPS_INSOLVE( myThid)
456 ce107 1.52 #endif
457 heimbach 1.60
458 cnh 1.1 RETURN
459     END

  ViewVC Help
Powered by ViewVC 1.1.22