1 |
C $Header: /u/gcmpack/MITgcm/model/src/solve_for_pressure.F,v 1.72 2009/11/30 19:20:07 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "PACKAGES_CONFIG.h" |
5 |
#include "CPP_OPTIONS.h" |
6 |
|
7 |
CBOP |
8 |
C !ROUTINE: POST_CG3D |
9 |
C !INTERFACE: |
10 |
SUBROUTINE POST_CG3D( |
11 |
I zeroPsNH, zeroMeanPnh, |
12 |
I myTime, myIter, myThid ) |
13 |
|
14 |
C !DESCRIPTION: |
15 |
C Called from SOLVE_FOR_PRESSURE, after 3-D solver (cg3d): |
16 |
C Finish computation of Non-hydrostatic pressure from 3-D solver solution |
17 |
|
18 |
C !USES: |
19 |
IMPLICIT NONE |
20 |
C == Global variables |
21 |
#include "SIZE.h" |
22 |
#include "EEPARAMS.h" |
23 |
#include "PARAMS.h" |
24 |
#include "GRID.h" |
25 |
#include "SURFACE.h" |
26 |
c#include "FFIELDS.h" |
27 |
#include "DYNVARS.h" |
28 |
#ifdef ALLOW_NONHYDROSTATIC |
29 |
#include "NH_VARS.h" |
30 |
#endif |
31 |
|
32 |
C === Functions ==== |
33 |
c LOGICAL DIFFERENT_MULTIPLE |
34 |
c EXTERNAL DIFFERENT_MULTIPLE |
35 |
|
36 |
C !INPUT/OUTPUT PARAMETERS: |
37 |
C == Routine arguments == |
38 |
C zeroPsNH :: account for Hyd.component of cg3d_x by updating NH & Surf.Press |
39 |
C zeroMeanPnh :: account for Hyd.component of cg3d_x by updating NH & Surf.Press |
40 |
C myTime :: Current time in simulation |
41 |
C myIter :: Current iteration number in simulation |
42 |
C myThid :: My Thread Id. number |
43 |
LOGICAL zeroPsNH, zeroMeanPnh |
44 |
_RL myTime |
45 |
INTEGER myIter |
46 |
INTEGER myThid |
47 |
|
48 |
#ifdef ALLOW_NONHYDROSTATIC |
49 |
C !LOCAL VARIABLES: |
50 |
C == Local variables == |
51 |
INTEGER i,j,k,bi,bj |
52 |
INTEGER ks |
53 |
c INTEGER ioUnit |
54 |
c CHARACTER*10 sufx |
55 |
c CHARACTER*(MAX_LEN_MBUF) msgBuf |
56 |
_RL tmpVar(1-Olx:sNx+Olx,1-Oly:sNy+Oly) |
57 |
CEOP |
58 |
|
59 |
c IF ( use3Dsolver ) THEN |
60 |
C-- Update surface pressure (account for NH-p @ surface level) and NH pressure: |
61 |
IF ( zeroPsNH .OR. zeroMeanPnh ) THEN |
62 |
DO bj=myByLo(myThid),myByHi(myThid) |
63 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
64 |
|
65 |
IF ( zeroPsNH .AND. usingZCoords ) THEN |
66 |
C- Z coordinate: assume surface @ level k=1 |
67 |
DO j=1-OLy,sNy+OLy |
68 |
DO i=1-OLx,sNx+OLx |
69 |
tmpVar(i,j) = phi_nh(i,j,1,bi,bj) |
70 |
ENDDO |
71 |
ENDDO |
72 |
ELSEIF ( zeroPsNH ) THEN |
73 |
C- Other than Z coordinate: no assumption on surface level index |
74 |
DO j=1-OLy,sNy+OLy |
75 |
DO i=1-OLx,sNx+OLx |
76 |
ks = ksurfC(i,j,bi,bj) |
77 |
IF ( ks.LE.Nr ) THEN |
78 |
tmpVar(i,j) = phi_nh(i,j,ks,bi,bj) |
79 |
ELSE |
80 |
tmpVar(i,j) = 0. |
81 |
ENDIF |
82 |
ENDDO |
83 |
ENDDO |
84 |
#ifdef NONLIN_FRSURF |
85 |
ELSE |
86 |
C zeroMeanPnh : transfert vertical average of P_NH to EtaN |
87 |
DO j=1-OLy,sNy+OLy |
88 |
DO i=1-OLx,sNx+OLx |
89 |
tmpVar(i,j) = 0. |
90 |
ENDDO |
91 |
ENDDO |
92 |
DO k=1,Nr |
93 |
DO j=1-OLy,sNy+OLy |
94 |
DO i=1-OLx,sNx+OLx |
95 |
tmpVar(i,j) = tmpVar(i,j) |
96 |
& + phi_nh(i,j,k,bi,bj)*drF(k)*h0FacC(i,j,k,bi,bj) |
97 |
ENDDO |
98 |
ENDDO |
99 |
ENDDO |
100 |
DO j=1-OLy,sNy+OLy |
101 |
DO i=1-OLx,sNx+OLx |
102 |
tmpVar(i,j) = tmpVar(i,j)*recip_Rcol(i,j,bi,bj) |
103 |
ENDDO |
104 |
ENDDO |
105 |
#endif /* NONLIN_FRSURF */ |
106 |
ENDIF |
107 |
DO k=1,Nr |
108 |
DO j=1-OLy,sNy+OLy |
109 |
DO i=1-OLx,sNx+OLx |
110 |
phi_nh(i,j,k,bi,bj) = ( phi_nh(i,j,k,bi,bj) |
111 |
& - tmpVar(i,j) |
112 |
& )*maskC(i,j,k,bi,bj) |
113 |
ENDDO |
114 |
ENDDO |
115 |
ENDDO |
116 |
DO j=1-OLy,sNy+OLy |
117 |
DO i=1-OLx,sNx+OLx |
118 |
etaN(i,j,bi,bj) = etaN(i,j,bi,bj) |
119 |
& + recip_Bo(i,j,bi,bj)*tmpVar(i,j) |
120 |
ENDDO |
121 |
ENDDO |
122 |
|
123 |
ENDDO |
124 |
ENDDO |
125 |
ENDIF |
126 |
|
127 |
c ENDIF |
128 |
#endif /* ALLOW_NONHYDROSTATIC */ |
129 |
|
130 |
RETURN |
131 |
END |