/[MITgcm]/MITgcm/pkg/diagnostics/diagnostics_set_calc.F
ViewVC logotype

Contents of /MITgcm/pkg/diagnostics/diagnostics_set_calc.F

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


Revision 1.3 - (show annotations) (download)
Wed Nov 26 20:48:32 2014 UTC (9 years, 5 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, HEAD
Changes since 1.2: +41 -2 lines
fix setting of location where Psi=0 when using OBCS

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_calc.F,v 1.2 2011/07/06 15:28:24 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7
8 CBOP 0
9 C !ROUTINE: DIAGNOSTICS_SET_CALC
10
11 C !INTERFACE:
12 SUBROUTINE DIAGNOSTICS_SET_CALC( myThid )
13
14 C !DESCRIPTION:
15 C *==========================================================*
16 C | S/R DIAGNOSTICS_SET_CALC
17 C | Set parameters and variables used in post-processing
18 C | diagnostics
19 C *==========================================================*
20
21 C !USES:
22 IMPLICIT NONE
23 #include "EEPARAMS.h"
24 #include "SIZE.h"
25 #include "PARAMS.h"
26 #include "GRID.h"
27 #include "DIAGNOSTICS_CALC.h"
28 #ifdef ALLOW_OBCS
29 # include "OBCS_GRID.h"
30 #endif /* ALLOW_OBCS */
31
32 C !INPUT PARAMETERS:
33 C myThid :: my thread Id number
34 INTEGER myThid
35 CEOP
36
37 C !LOCAL VARIABLES:
38 INTEGER bi, bj
39 INTEGER i, j
40 INTEGER biG, bjG
41 _RL dxLoc, dyLoc, d2Loc, d2Min
42 _RL xLine, xy0, xyLoc, xyMin
43 CHARACTER*(MAX_LEN_MBUF) msgBuf
44 #ifdef ALLOW_OBCS
45 LOGICAL kPsi(1:sNx+1,1:sNy+1,nSx,nSy)
46 #endif /* ALLOW_OBCS */
47
48 C-- Set indices of grid-point location where Psi == 0
49 IF ( xPsi0.EQ.UNSET_RS .OR. yPsi0.EQ.UNSET_RS ) THEN
50 C- Set indices to (-1,0) = disabled value
51 DO bj=myByLo(myThid),myByHi(myThid)
52 DO bi=myBxLo(myThid),myBxHi(myThid)
53 iPsi0(bi,bj) = -1
54 jPsi0(bi,bj) = 0
55 ENDDO
56 ENDDO
57 ELSE
58 #ifdef ALLOW_OBCS
59 C- set flag where Psi is computed
60 DO bj=myByLo(myThid),myByHi(myThid)
61 DO bi=myBxLo(myThid),myBxHi(myThid)
62 DO j = 1,sNy+1
63 DO i = 1,sNx+1
64 kPsi(i,j,bi,bj) = .TRUE.
65 ENDDO
66 ENDDO
67 IF ( useOBCS ) THEN
68 DO j = 1,sNy+1
69 DO i = 1,sNx+1
70 kPsi(i,j,bi,bj) = OBCS_insideMask( i , j ,bi,bj).EQ.oneRS
71 & .OR. OBCS_insideMask(i-1, j ,bi,bj).EQ.oneRS
72 & .OR. OBCS_insideMask( i ,j-1,bi,bj).EQ.oneRS
73 & .OR. OBCS_insideMask(i-1,j-1,bi,bj).EQ.oneRS
74 ENDDO
75 ENDDO
76 ENDIF
77 ENDDO
78 ENDDO
79 #endif /* ALLOW_OBCS */
80 C- find minimum distance:
81 d2Min = -1. _d 0
82 DO bj=myByLo(myThid),myByHi(myThid)
83 DO bi=myBxLo(myThid),myBxHi(myThid)
84 DO j = 1,sNy+1
85 DO i = 1,sNx+1
86 dxLoc = xG(i,j,bi,bj)-xPsi0
87 dyLoc = yG(i,j,bi,bj)-yPsi0
88 d2Loc = dxLoc*dxLoc + dyLoc*dyLoc
89 #ifdef ALLOW_OBCS
90 IF ((d2Loc.LT.d2Min .OR. d2Min.EQ.-1. _d 0)
91 & .AND. kPsi(i,j,bi,bj) ) d2Min = d2Loc
92 #else
93 IF ( d2Loc.LT.d2Min .OR. d2Min.EQ.-1. _d 0 ) d2Min = d2Loc
94 #endif
95 ENDDO
96 ENDDO
97 ENDDO
98 ENDDO
99 d2Min = -d2Min
100 _GLOBAL_MAX_RL( d2Min, myThid )
101 d2Min = -d2Min
102 C- find list of grid-points at minimum distance:
103 xyMin = 0.
104 xLine = (sNx+1)*nSx*nPx
105 DO bj=myByLo(myThid),myByHi(myThid)
106 DO bi=myBxLo(myThid),myBxHi(myThid)
107 iPsi0(bi,bj) = 0
108 jPsi0(bi,bj) = 0
109 biG = bi-1+(myXGlobalLo-1)/sNx
110 bjG = bj-1+(myYGlobalLo-1)/sNy
111 xy0 = biG*(sNx+1) + bjG*(sNy+1)*xLine
112 DO j = 1,sNy+1
113 DO i = 1,sNx+1
114 dxLoc = xG(i,j,bi,bj)-xPsi0
115 dyLoc = yG(i,j,bi,bj)-yPsi0
116 d2Loc = dxLoc*dxLoc + dyLoc*dyLoc
117 #ifdef ALLOW_OBCS
118 IF ( d2Loc.EQ.d2Min .AND. kPsi(i,j,bi,bj) ) THEN
119 #else
120 IF ( d2Loc.EQ.d2Min ) THEN
121 #endif
122 xyLoc = xy0 + i + (j-1)*xLine
123 IF ( xyMin.EQ.0. _d 0 ) THEN
124 xyMin = xyLoc
125 ELSE
126 xyMin = MIN( xyMin, xyLoc )
127 ENDIF
128 iPsi0(bi,bj) = i
129 jPsi0(bi,bj) = j
130 ENDIF
131 ENDDO
132 ENDDO
133 ENDDO
134 ENDDO
135 xyLoc = (sNx+1)*(sNy+1)*nSx*nSy*nPx*nPy + 2.
136 IF ( xyMin.EQ.0. _d 0 ) xyMin = xyLoc
137 xyMin = -xyMin
138 _GLOBAL_MAX_RL( xyMin, myThid )
139 xyMin = -xyMin
140 C- select only one (based on minimum global-map index)
141 _BARRIER
142 _BEGIN_MASTER( myThid )
143 WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_SET_CALC: ',
144 & 'setting indices iPsi0,jPsi0 where Psi == 0 :'
145 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
146 & SQUEEZE_RIGHT, myThid )
147 WRITE(msgBuf,'(A,1P1E19.6,A,0PF16.3)')
148 & 'DIAGNOSTICS_SET_CALC: d2Min=',d2Min, ', ijMin=',xyMin
149 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
150 & SQUEEZE_RIGHT, myThid )
151 IF ( xyMin.EQ.xyLoc ) THEN
152 WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_SET_CALC: ',
153 & 'Fail to find the minimum distance => use Default'
154 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
155 & SQUEEZE_RIGHT, myThid )
156 DO bj=1,nSy
157 DO bi=1,nSx
158 iPsi0(bi,bj) = -1
159 jPsi0(bi,bj) = 0
160 ENDDO
161 ENDDO
162 ELSE
163 DO bj=1,nSy
164 DO bi=1,nSx
165 IF ( iPsi0(bi,bj).GT.0 ) THEN
166 biG = bi-1+(myXGlobalLo-1)/sNx
167 bjG = bj-1+(myYGlobalLo-1)/sNy
168 xy0 = biG*(sNx+1) + bjG*(sNy+1)*xLine
169 xyLoc = xy0 + iPsi0(bi,bj) + (jPsi0(bi,bj)-1)*xLine
170 d2Loc = ABS( xyLoc - xyMin )
171 IF ( d2Loc.GE.0.5 _d 0 ) THEN
172 WRITE(msgBuf,'(2(A,2I5),A,F16.3)')
173 & ' discard: bi,bj=',bi,bj,
174 & ' ; i,j=',iPsi0(bi,bj),jPsi0(bi,bj),' ; ijLoc=',xyLoc
175 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
176 & SQUEEZE_RIGHT, myThid )
177 iPsi0(bi,bj) = 0
178 jPsi0(bi,bj) = 0
179 ELSE
180 WRITE(msgBuf,'(2(A,2I5),A,F16.3)')
181 & ' SELECT : bi,bj=',bi,bj,
182 & ' ; i,j=',iPsi0(bi,bj),jPsi0(bi,bj),' ; ijLoc=',xyLoc
183 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
184 & SQUEEZE_RIGHT, myThid )
185 ENDIF
186 ENDIF
187 c WRITE(standardMessageUnit,'(2(A,2I5))')
188 c & ' bi,bj=',bi,bj,' i,jPsi0=', iPsi0(bi,bj),jPsi0(bi,bj)
189 ENDDO
190 ENDDO
191 ENDIF
192 WRITE(msgBuf,'(2A)')
193 & '------------------------------------------------------------'
194 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
195 & SQUEEZE_RIGHT, myThid )
196 _END_MASTER( myThid )
197 _BARRIER
198 ENDIF
199
200 RETURN
201 END

  ViewVC Help
Powered by ViewVC 1.1.22