/[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.7 - (show annotations) (download)
Sun Dec 24 20:15:42 2006 UTC (17 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58u_post, checkpoint58t_post
Changes since 1.6: +126 -149 lines
vertical interpolation:
- prestopres.F moved to diagnostics_interp_p2p.F
- more flexible: p-levels are set in data.diagnostics (no longer limited
  to 3 hard coded scales)
- safer (few diagnostics options were not giving the right output).

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_interp_vert.F,v 1.6 2006/11/19 22:03:13 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 I undef,
15 I myTime, myIter, myThid )
16
17 C !DESCRIPTION:
18 C Interpolate vertically a diagnostics field before writing to file.
19 C presently implemented (for Atmospheric fields only):
20 C Interpolation (linear in p^kappa) to standard pressure levels
21 C
22
23 C !USES:
24 IMPLICIT NONE
25 #include "SIZE.h"
26 #include "EEPARAMS.h"
27 #include "PARAMS.h"
28 #include "GRID.h"
29 #include "DIAGNOSTICS_SIZE.h"
30 #include "DIAGNOSTICS.h"
31
32 INTEGER NrMax
33 #ifdef ALLOW_FIZHI
34 #include "fizhi_SIZE.h"
35 PARAMETER( NrMax = Nr+Nrphys )
36 #else
37 PARAMETER( NrMax = Nr )
38 #endif
39
40
41 C !INPUT PARAMETERS:
42 C listId :: Diagnostics list number being written
43 C md :: field number in the list "listId".
44 C ndId :: diagnostics Id number (in available diagnostics list)
45 C ip :: diagnostics pointer to storage array
46 C im :: counter-mate pointer to storage array
47 C lm :: index in the averageCycle
48 C qtmp1 :: diagnostics field output array
49 C undef ::
50 C myTime :: current time of simulation (s)
51 C myIter :: current iteration number
52 C myThid :: my Thread Id number
53 INTEGER listId, md, ndId, ip, im, lm
54 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
55 _RL undef
56 _RL myTime
57 INTEGER myIter, myThid
58 CEOP
59
60 C !LOCAL VARIABLES:
61 C i,j,k :: loop indices
62 INTEGER i, j, k
63 INTEGER bi, bj
64 _RL qtmpsrf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
65 _RL qtmp2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
66 _RL getcon
67 EXTERNAL getcon
68 INTEGER kLev
69 _RL qprs (sNx,sNy)
70 _RL qinp (sNx,sNy,NrMax)
71 _RL pkz (sNx,sNy,NrMax)
72 _RL pksrf(sNx,sNy)
73 _RL pk, pkTop, tmpLev
74 _RL kappa
75 INTEGER jpoint1,ipoint1
76 INTEGER jpoint2,ipoint2
77 LOGICAL pInc
78 CHARACTER*(MAX_LEN_MBUF) msgBuf
79
80 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
81
82 IF (fflags(listId)(2:2).EQ.'P') THEN
83 kappa = getcon('KAPPA')
84 pkTop = 0. _d 0
85
86 C-- If nonlinear free surf is active, need averaged pressures
87 IF (select_rStar.GT.0) THEN
88 CALL DIAGNOSTICS_GET_POINTERS( 'RSURF ', listId,
89 & jpoint1, ipoint1, myThid )
90 C- IF fizhi is being used, may need to get physics grid pressures
91 IF ( useFIZHI .AND.
92 & gdiag(ndId)(10:10) .EQ. 'L') THEN
93 CALL DIAGNOSTICS_GET_POINTERS('FIZPRES ', listId,
94 & jpoint2, ipoint2, myThid )
95 ELSE
96 CALL DIAGNOSTICS_GET_POINTERS('RCENTER ', listId,
97 & jpoint2, ipoint2, myThid )
98 ENDIF
99 IF ( ipoint1.EQ.0 .OR. ipoint2.EQ.0 ) THEN
100 WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_INTERP_VERT: ',
101 & 'fails to interpolate diag.(#', ndId,'): ',flds(md,listId)
102 CALL PRINT_ERROR( msgBuf , myThid )
103 STOP 'ABNORMAL END: S/R DIAGNOSTICS_INTERP_VERT'
104 ENDIF
105 C- averageCycle: move pointer
106 ipoint1 = ipoint1 + kdiag(jpoint1)*(lm-1)
107 ipoint2 = ipoint2 + kdiag(jpoint2)*(lm-1)
108
109 DO bj = myByLo(myThid), myByHi(myThid)
110 DO bi = myBxLo(myThid), myBxHi(myThid)
111 tmpLev = 1. _d 0
112 CALL GETDIAG( tmpLev,undef,
113 O qtmpsrf(1-OLx,1-OLy,bi,bj),
114 I jpoint1,0,ipoint1,0, bi,bj,myThid )
115 c WRITE(0,*) 'rSurf:',bi,bj,qtmpsrf(15,15,bi,bj)
116 DO k = 1,kdiag(jpoint2)
117 tmpLev = k
118 CALL GETDIAG(tmpLev,undef,
119 O qtmp2(1-OLx,1-OLy,k,bi,bj),
120 I jpoint2,0,ipoint2,0, bi,bj,myThid )
121 ENDDO
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)= undef
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 undef,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.undef) 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