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

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

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


Revision 1.3 - (hide 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 jmc 1.3 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_calc.F,v 1.2 2011/07/06 15:28:24 jmc Exp $
2 jmc 1.1 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 jmc 1.3 #include "PARAMS.h"
26 jmc 1.1 #include "GRID.h"
27     #include "DIAGNOSTICS_CALC.h"
28 jmc 1.3 #ifdef ALLOW_OBCS
29     # include "OBCS_GRID.h"
30     #endif /* ALLOW_OBCS */
31 jmc 1.1
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 jmc 1.3 #ifdef ALLOW_OBCS
45     LOGICAL kPsi(1:sNx+1,1:sNy+1,nSx,nSy)
46     #endif /* ALLOW_OBCS */
47 jmc 1.1
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 jmc 1.3 #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 jmc 1.1 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 jmc 1.3 #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 jmc 1.1 IF ( d2Loc.LT.d2Min .OR. d2Min.EQ.-1. _d 0 ) d2Min = d2Loc
94 jmc 1.3 #endif
95 jmc 1.1 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 jmc 1.3 #ifdef ALLOW_OBCS
118     IF ( d2Loc.EQ.d2Min .AND. kPsi(i,j,bi,bj) ) THEN
119     #else
120 jmc 1.1 IF ( d2Loc.EQ.d2Min ) THEN
121 jmc 1.3 #endif
122 jmc 1.1 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 jmc 1.2 xyLoc = (sNx+1)*(sNy+1)*nSx*nSy*nPx*nPy + 2.
136     IF ( xyMin.EQ.0. _d 0 ) xyMin = xyLoc
137 jmc 1.1 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 jmc 1.2 IF ( xyMin.EQ.xyLoc ) THEN
152 jmc 1.1 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 jmc 1.3 c WRITE(standardMessageUnit,'(2(A,2I5))')
188     c & ' bi,bj=',bi,bj,' i,jPsi0=', iPsi0(bi,bj),jPsi0(bi,bj)
189 jmc 1.1 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