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

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

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


Revision 1.12 - (show annotations) (download)
Sun Jun 12 19:16:09 2011 UTC (12 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint65, checkpoint63, 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, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint62z, HEAD
Changes since 1.11: +16 -18 lines
- declare qtmp2 in diagnostics_out.F and pass it as arg. to diagnostics_interp_vert
- change arguments and name of S/R GETDIAG (now: DIAGNOSTICS_GET_DIAG)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_interp_vert.F,v 1.11 2010/01/10 04:09:31 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7 CBOP 0
8 C !ROUTINE: DIAGNOSTICS_INTERP_VERT
9
10 C !INTERFACE:
11 SUBROUTINE DIAGNOSTICS_INTERP_VERT(
12 I listId, md, ndId, ip, im, lm,
13 U qtmp1,
14 O qtmp2,
15 I undefRL,
16 I myTime, myIter, myThid )
17
18 C !DESCRIPTION:
19 C Interpolate vertically a diagnostics field before writing to file.
20 C presently implemented (for Atmospheric fields only):
21 C Interpolation (linear in p^kappa) to standard pressure levels
22 C
23
24 C !USES:
25 IMPLICIT NONE
26 #include "SIZE.h"
27 #include "EEPARAMS.h"
28 #include "PARAMS.h"
29 #include "GRID.h"
30 #include "DIAGNOSTICS_SIZE.h"
31 #include "DIAGNOSTICS.h"
32
33 INTEGER NrMax
34 PARAMETER( NrMax = numLevels )
35
36
37 C !INPUT PARAMETERS:
38 C listId :: Diagnostics list number being written
39 C md :: field number in the list "listId".
40 C ndId :: diagnostics Id number (in available diagnostics list)
41 C ip :: diagnostics pointer to storage array
42 C im :: counter-mate pointer to storage array
43 C lm :: index in the averageCycle
44 C qtmp1 :: diagnostics field output array
45 C qtmp2 :: temp working array (same size as output array)
46 C undefRL ::
47 C myTime :: current time of simulation (s)
48 C myIter :: current iteration number
49 C myThid :: my Thread Id number
50 INTEGER listId, md, ndId, ip, im, lm
51 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
52 _RL qtmp2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
53 _RL undefRL
54 _RL myTime
55 INTEGER myIter, myThid
56 CEOP
57
58 C !FUNCTIONS:
59 #ifdef ALLOW_FIZHI
60 _RL getcon
61 EXTERNAL getcon
62 #endif
63
64 C !LOCAL VARIABLES:
65 C i,j,k :: loop indices
66 INTEGER i, j, k
67 INTEGER bi, bj
68 _RL qtmpsrf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
69 INTEGER kLev
70 _RL qprs (sNx,sNy)
71 _RL qinp (sNx,sNy,NrMax)
72 _RL pkz (sNx,sNy,NrMax)
73 _RL pksrf(sNx,sNy)
74 _RL pk, pkTop
75 _RL kappa
76 INTEGER jpoint1, ipoint1
77 INTEGER jpoint2, ipoint2
78 LOGICAL pInc
79 CHARACTER*(MAX_LEN_MBUF) msgBuf
80
81 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
82
83 IF (fflags(listId)(2:2).EQ.'P') THEN
84 pkTop = 0. _d 0
85 kappa = atm_kappa
86 #ifdef ALLOW_FIZHI
87 IF ( useFIZHI ) kappa = getcon('KAPPA')
88 #endif
89
90 C-- If nonlinear free surf is active, need averaged pressures
91 IF (select_rStar.GT.0) THEN
92 CALL DIAGNOSTICS_GET_POINTERS( 'RSURF ', listId,
93 & jpoint1, ipoint1, myThid )
94 C- IF fizhi is being used, may need to get physics grid pressures
95 IF ( useFIZHI .AND.
96 & gdiag(ndId)(10:10) .EQ. 'L') THEN
97 CALL DIAGNOSTICS_GET_POINTERS('FIZPRES ', listId,
98 & jpoint2, ipoint2, myThid )
99 ELSE
100 CALL DIAGNOSTICS_GET_POINTERS('RCENTER ', listId,
101 & jpoint2, ipoint2, myThid )
102 ENDIF
103 IF ( ipoint1.EQ.0 .OR. ipoint2.EQ.0 ) THEN
104 WRITE(msgBuf,'(2A,I6,2A)') 'DIAGNOSTICS_INTERP_VERT: ',
105 & 'fails to interpolate diag.(#', ndId,'): ',flds(md,listId)
106 CALL PRINT_ERROR( msgBuf , myThid )
107 STOP 'ABNORMAL END: S/R DIAGNOSTICS_INTERP_VERT'
108 ENDIF
109 C- averageCycle: move pointer
110 ipoint1 = ipoint1 + kdiag(jpoint1)*(lm-1)
111 ipoint2 = ipoint2 + kdiag(jpoint2)*(lm-1)
112
113 DO bj = myByLo(myThid), myByHi(myThid)
114 DO bi = myBxLo(myThid), myBxHi(myThid)
115 CALL DIAGNOSTICS_GET_DIAG( 1, undefRL,
116 O qtmpsrf(1-OLx,1-OLy,bi,bj),
117 I jpoint1,0,ipoint1,0, bi,bj,myThid )
118 c WRITE(0,*) 'rSurf:',bi,bj,qtmpsrf(15,15,bi,bj)
119 CALL DIAGNOSTICS_GET_DIAG( 0, undefRL,
120 O qtmp2(1-OLx,1-OLy,1,bi,bj),
121 I jpoint2,0,ipoint2,0, bi,bj,myThid )
122 ENDDO
123 ENDDO
124
125 ELSE
126 C- If nonlinear free surf is off, get pressures from rC and rF arrays
127
128 DO bj = myByLo(myThid), myByHi(myThid)
129 DO bi = myBxLo(myThid), myBxHi(myThid)
130 DO j = 1-OLy,sNy+OLy
131 DO i = 1-OLx,sNx+OLx
132 qtmpsrf(i,j,bi,bj) = Ro_surf(i,j,bi,bj)
133 ENDDO
134 ENDDO
135 DO k = 1,kdiag(ndId)
136 DO j = 1-OLy,sNy+OLy
137 DO i = 1-OLx,sNx+OLx
138 qtmp2(i,j,k,bi,bj) = rC(k)
139 ENDDO
140 ENDDO
141 ENDDO
142 ENDDO
143 ENDDO
144
145 C- end if nonlinear/linear free-surf
146 ENDIF
147
148 C-- start loops on tile indices bi,bj:
149 DO bj = myByLo(myThid), myByHi(myThid)
150 DO bi = myBxLo(myThid), myBxHi(myThid)
151 C- Load p to the kappa into a temporary array
152 DO j = 1,sNy
153 DO i = 1,sNx
154 pksrf(i,j) = qtmpsrf(i,j,bi,bj)**kappa
155 ENDDO
156 ENDDO
157 IF ( useFIZHI.AND.gdiag(ndId)(10:10).EQ.'L') THEN
158 pInc = .TRUE.
159 DO k = 1,kdiag(ndId)
160 DO j = 1,sNy
161 DO i = 1,sNx
162 qinp(i,j,k) = qtmp1(i,j,k,bi,bj)
163 pkz(i,j,k) = qtmp2(i,j,k,bi,bj)**kappa
164 ENDDO
165 ENDDO
166 ENDDO
167 ELSE
168 DO k = 1,kdiag(ndId)
169 pInc = .TRUE.
170 kLev = kdiag(ndId)-k+1
171 c pInc = .FALSE.
172 c kLev = k
173 DO j = 1,sNy
174 DO i = 1,sNx
175 IF (maskC(i,j,kLev,bi,bj).NE.0.) THEN
176 qinp(i,j,k)= qtmp1(i,j,kLev,bi,bj)
177 ELSE
178 qinp(i,j,k)= undefRL
179 ENDIF
180 pkz(i,j,k) = qtmp2(i,j,kLev,bi,bj)**kappa
181 ENDDO
182 ENDDO
183 ENDDO
184 ENDIF
185
186 C- Interpolate, level per level, and put interpolated field in qprs:
187 DO k = 1,nlevels(listId)
188 pk = levs(k,listId)**kappa
189 CALL DIAGNOSTICS_INTERP_P2P(
190 O qprs,
191 I qinp,pkz,pksrf,pkTop,pk,
192 I undefRL,pInc,sNx*sNy,kdiag(ndId),myThid )
193 C- Transfert qprs to qtmp1:
194 DO j = 1,sNy
195 DO i = 1,sNx
196 IF (qprs(i,j).EQ.undefRL) THEN
197 qtmp1(i,j,k,bi,bj) = 0.
198 ELSE
199 qtmp1(i,j,k,bi,bj) = qprs(i,j)
200 ENDIF
201 ENDDO
202 ENDDO
203 ENDDO
204
205 C- end bi,bj loops
206 ENDDO
207 ENDDO
208
209 ENDIF
210
211 RETURN
212 END

  ViewVC Help
Powered by ViewVC 1.1.22