/[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.10 - (show annotations) (download)
Tue Nov 18 21:41:06 2008 UTC (15 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62, checkpoint61f, checkpoint61g, checkpoint61n, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61q, checkpoint61z, checkpoint61x, checkpoint61y
Changes since 1.9: +11 -4 lines
move getcon.F from model/src to pkg/fizhi

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

  ViewVC Help
Powered by ViewVC 1.1.22