1 |
C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diag_calc_psivel.F,v 1.1 2011/07/01 18:50:00 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "DIAG_OPTIONS.h" |
5 |
|
6 |
CBOP |
7 |
C !ROUTINE: DIAG_CALC_PSIVEL |
8 |
C !INTERFACE: |
9 |
SUBROUTINE DIAG_CALC_PSIVEL( |
10 |
I k, iPsi0, jPsi0, uTrans, vTrans, |
11 |
O psiVel, psiLoc, |
12 |
U myTIme, myIter, myThid ) |
13 |
C !DESCRIPTION: \bv |
14 |
C *==========================================================* |
15 |
C | SUBROUTINE DIAG_CALC_PSIVEL |
16 |
C | o Calculate horizontal transport stream-function |
17 |
C | from non-divergent horizontal transport. |
18 |
C *==========================================================* |
19 |
C *==========================================================* |
20 |
C \ev |
21 |
|
22 |
C !USES: |
23 |
IMPLICIT NONE |
24 |
C === Global data === |
25 |
#include "SIZE.h" |
26 |
#include "EEPARAMS.h" |
27 |
#include "PARAMS.h" |
28 |
c#include "GRID.h" |
29 |
c#include "SURFACE.h" |
30 |
|
31 |
C !INPUT/OUTPUT PARAMETERS: |
32 |
C === Routine arguments === |
33 |
C k :: current level |
34 |
C i,jPsi0 :: indices of grid-point location where Psi == 0 |
35 |
C uTrans :: horizontal transport, u-component |
36 |
C vTrans :: horizontal transport, u-component |
37 |
C psiVel :: horizontal stream-function |
38 |
C psiLoc :: horizontal stream-function at special location |
39 |
C myTime :: current time of simulation (s) |
40 |
C myIter :: current iteration number |
41 |
C myThid :: my Thread Id number |
42 |
INTEGER k |
43 |
INTEGER iPsi0(nSx,nSy) |
44 |
INTEGER jPsi0(nSx,nSy) |
45 |
_RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
46 |
_RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
47 |
_RL psiVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
48 |
_RL psiLoc(2) |
49 |
_RL myTime |
50 |
INTEGER myIter |
51 |
INTEGER myThid |
52 |
|
53 |
C !LOCAL VARIABLES: |
54 |
C === Local variables ==== |
55 |
C bi, bj :: tile indices |
56 |
C i, j :: loop indices |
57 |
C dPsiX :: tile stream-function increment along X-dir |
58 |
C dPsiY :: tile stream-function increment along Y-dir |
59 |
C psiOri :: stream-function value at tile origin |
60 |
INTEGER bi, bj |
61 |
INTEGER i, j |
62 |
_RL dPsiX (nSx,nSy) |
63 |
_RL dPsiY (nSx,nSy) |
64 |
_RL psiOri(nSx,nSy) |
65 |
_RL offSet |
66 |
LOGICAL zeroPsi |
67 |
c CHARACTER*(MAX_LEN_MBUF) msgBuf |
68 |
CEOP |
69 |
|
70 |
C-- Initialise |
71 |
zeroPsi = iPsi0(1,1).GE.0 |
72 |
psiLoc(1) = 0. |
73 |
psiLoc(2) = 0. |
74 |
|
75 |
C-- step.1 : compute Psi over each tile separately |
76 |
DO bj=myByLo(myThid),myByHi(myThid) |
77 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
78 |
dPsiX (bi,bj) = 0. |
79 |
dPsiY (bi,bj) = 0. |
80 |
psiOri(bi,bj) = 0. |
81 |
psiVel(1,1,bi,bj) = psiOri(bi,bj) |
82 |
j = 1 |
83 |
DO i=1,sNx |
84 |
psiVel(i+1,j,bi,bj) = psiVel(i,j,bi,bj) |
85 |
& + vTrans(i,j,bi,bj) |
86 |
ENDDO |
87 |
C- note: can vectorise inner loop |
88 |
DO j=1,sNy |
89 |
DO i=1,sNx+1 |
90 |
psiVel(i,j+1,bi,bj) = psiVel(i,j,bi,bj) |
91 |
& - uTrans(i,j,bi,bj) |
92 |
ENDDO |
93 |
ENDDO |
94 |
dPsiX (bi,bj) = psiVel(1+sNx,1,bi,bj) |
95 |
dPsiY (bi,bj) = psiVel(1,1+sNy,bi,bj) |
96 |
ENDDO |
97 |
ENDDO |
98 |
|
99 |
CALL CUMULSUM_Z_TILE_RL( |
100 |
O psiOri, psiLoc, |
101 |
I dPsiX, dPsiY, myThid ) |
102 |
|
103 |
C-- step.2 : account for Psi @ tile origin |
104 |
offSet = 0. |
105 |
DO bj=myByLo(myThid),myByHi(myThid) |
106 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
107 |
DO j=1,sNy+1 |
108 |
DO i=1,sNx+1 |
109 |
psiVel(i,j,bi,bj) = psiVel(i,j,bi,bj) + psiOri(bi,bj) |
110 |
ENDDO |
111 |
ENDDO |
112 |
IF ( iPsi0(bi,bj)*jPsi0(bi,bj).GT.0 ) |
113 |
& offSet = -psiVel(iPsi0(bi,bj),jPsi0(bi,bj),bi,bj) |
114 |
ENDDO |
115 |
ENDDO |
116 |
|
117 |
IF ( zeroPsi ) THEN |
118 |
C-- step.3 : shift stream-function to satisfy Psi == 0 @ a particular location |
119 |
_GLOBAL_SUM_RL( offSet, myThid ) |
120 |
psiLoc(1) = psiLoc(1) + offSet |
121 |
psiLoc(2) = psiLoc(2) + offSet |
122 |
DO bj=myByLo(myThid),myByHi(myThid) |
123 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
124 |
DO j=1,sNy+1 |
125 |
DO i=1,sNx+1 |
126 |
psiVel(i,j,bi,bj) = psiVel(i,j,bi,bj) + offSet |
127 |
ENDDO |
128 |
ENDDO |
129 |
ENDDO |
130 |
ENDDO |
131 |
ENDIF |
132 |
|
133 |
RETURN |
134 |
END |