/[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.6 - (show annotations) (download)
Sun Nov 19 22:03:13 2006 UTC (17 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: mitgcm_mapl_00, checkpoint58s_post
Changes since 1.5: +2 -2 lines
rename some diagnostics:
s/'PRESSURE'/'RCENTER '/g
s/'TICE    '/'oceFreez'/g
s/'TAUX    '/'oceTAUX '/g
s/'TAUY    '/'oceTAUY '/g
s/'SWFLUX  '/'oceQsw  '/g
s/DIFx/DFxE/g
s/DIFy/DFyE/g

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_interp_vert.F,v 1.5 2005/11/18 20:25:18 molod 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,
13 U nlevsout,
14 U qtmp1,
15 I undef,
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 #ifdef ALLOW_FIZHI
34 #include "fizhi_SIZE.h"
35 #else
36 INTEGER Nrphys
37 PARAMETER (Nrphys=0)
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 nlevsout:: number of levels
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
54 INTEGER nlevsout
55 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
56 _RL undef
57 _RL myTime
58 INTEGER myIter, myThid
59 CEOP
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,Nr+Nrphys,nSx,nSy)
67 _RL getcon
68 EXTERNAL getcon
69 integer nplevs1, nplevs2, nplevs3
70 parameter(nplevs1 = 16)
71 parameter(nplevs2 = 16)
72 parameter(nplevs3 = 17)
73 _RL plevs1(nplevs1)
74 data plevs1/ 1000.0 _d 2, 925.0 _d 2, 850.0 _d 2, 700.0 _d 2,
75 . 600.0 _d 2, 500.0 _d 2, 400.0 _d 2, 300.0 _d 2,
76 . 250.0 _d 2, 200.0 _d 2, 150.0 _d 2, 100.0 _d 2,
77 . 70.0 _d 2, 50.0 _d 2, 30.0 _d 2, 20.0 _d 2/
78 _RL plevs2(nplevs2)
79 data plevs2/ 1000.0 _d 2, 950.0 _d 2, 900.0 _d 2, 850.0 _d 2,
80 . 800.0 _d 2, 750.0 _d 2, 700.0 _d 2, 600.0 _d 2,
81 . 500.0 _d 2, 400.0 _d 2, 300.0 _d 2, 250.0 _d 2,
82 . 200.0 _d 2, 150.0 _d 2, 100.0 _d 2, 50.0 _d 2/
83 _RL plevs3(nplevs3)
84 data plevs3/ 1000.0 _d 2, 925.0 _d 2, 850.0 _d 2, 700.0 _d 2,
85 . 600.0 _d 2, 500.0 _d 2, 400.0 _d 2, 300.0 _d 2,
86 . 250.0 _d 2, 200.0 _d 2, 150.0 _d 2, 100.0 _d 2,
87 . 70.0 _d 2, 50.0 _d 2, 30.0 _d 2, 20.0 _d 2,
88 . 10.0 _d 2/
89 C Use the biggest of nplevs 1-3 (or any others) for the size of qprs
90 _RL qprs(sNx,sNy,nplevs3)
91 _RL qinp(sNx,sNy,Nr+Nrphys)
92 _RL pkz(sNx,sNy,Nr+Nrphys)
93 _RL pksrf(sNx,sNy)
94 _RL p
95 _RL kappa
96 _RL oneRL
97 #ifdef NONLIN_FRSURF
98 INTEGER jpoint1,ipoint1
99 INTEGER jpoint2,ipoint2
100 logical foundp
101 data foundp /.false./
102 #endif
103 CHARACTER*(MAX_LEN_MBUF) msgBuf
104
105 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
106
107 IF(fflags(listId)(2:2).eq.'P') then
108 kappa = getcon('KAPPA')
109 oneRL = 1. _d 0
110
111 c If nonlinear free surf is active, need averaged pressures
112 #ifdef NONLIN_FRSURF
113 if(select_rStar.GT.0)then
114 call diagnostics_get_pointers('RSURF ',ipoint1,jpoint1,
115 . myThid)
116 call diagnostics_get_pointers('RCENTER ',ipoint2,jpoint2,
117 . myThid)
118 C if fizhi is being used, may need to get physics grid pressures
119 #ifdef ALLOW_FIZHI
120 if(gdiag(ndId)(10:10) .EQ. 'L')then
121 call diagnostics_get_pointers('FIZPRES ',ipoint2,jpoint2,
122 . myThid)
123 endif
124 #endif
125 if( jpoint1.ne.0 .and. jpoint2.ne.0) then
126 foundp = .true.
127 else
128 foundp = .false.
129 endif
130
131 if(.not. foundp) then
132 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_INTERP_VERT: ',
133 . ' Have asked for pressure interpolation but have not ',
134 . ' Activated surface and 3D pressure diagnostic, ',
135 . ' RSURF and PRESSURE'
136 CALL PRINT_ERROR( msgBuf , myThid )
137 STOP 'ABNORMAL END: S/R DIAGNOSTICS_INTERP_VERT'
138 endif
139
140 DO bj = myByLo(myThid), myByHi(myThid)
141 DO bi = myBxLo(myThid), myBxHi(myThid)
142 call getdiag(oneRL,undef,qtmpsrf(1-OLx,1-OLy,bi,bj),
143 . jpoint1,0,ipoint1,0,bi,bj,myThid)
144 ENDDO
145 ENDDO
146 DO bj = myByLo(myThid), myByHi(myThid)
147 DO bi = myBxLo(myThid), myBxHi(myThid)
148 DO k = 1,nlevels(listId)
149 call getdiag(levs(k,listId),undef,
150 . qtmp2(1-OLx,1-OLy,k,bi,bj),jpoint2,0,ipoint2,0,
151 . bi,bj,myThid)
152 ENDDO
153 ENDDO
154 ENDDO
155 endif
156 #else
157 C If nonlinear free surf is off, get pressures from rC and rF arrays
158 DO bj = myByLo(myThid), myByHi(myThid)
159 DO bi = myBxLo(myThid), myBxHi(myThid)
160 DO j = 1-OLy,sNy+OLy
161 DO i = 1-OLx,sNx+OLx
162 qtmpsrf(i,j,bi,bj) = rF(1)
163 ENDDO
164 ENDDO
165 DO j = 1-OLy,sNy+OLy
166 DO i = 1-OLx,sNx+OLx
167 DO k = 1,nlevels(listId)
168 qtmp2(i,j,k,bi,bj) = rC(k)
169 ENDDO
170 ENDDO
171 ENDDO
172 ENDDO
173 ENDDO
174 #endif
175 C Load p to the kappa into a temporary array
176 DO bj = myByLo(myThid), myByHi(myThid)
177 DO bi = myBxLo(myThid), myBxHi(myThid)
178 DO j = 1,sNy
179 DO i = 1,sNx
180 pksrf(i,j) = qtmpsrf(i,j,bi,bj) ** kappa
181 DO k = 1,nlevels(listId)
182 if(gdiag(ndId)(10:10).eq.'R') then
183 if(hFacC(i,j,nlevels(listId)-k+1,bi,bj).ne.0.) then
184 qinp(i,j,k) = qtmp1(i,j,nlevels(listId)-k+1,bi,bj)
185 else
186 qinp(i,j,k) = undef
187 endif
188 pkz(i,j,k) = qtmp2(i,j,nlevels(listId)-k+1,bi,bj)**kappa
189 elseif(gdiag(ndId)(10:10).eq.'L') then
190 qinp(i,j,k) = qtmp1(i,j,k,bi,bj)
191 pkz(i,j,k) = qtmp2(i,j,k,bi,bj)**kappa
192 endif
193 ENDDO
194 ENDDO
195 ENDDO
196
197 if(fflags(listId)(3:3).eq.'1') then
198 nlevsout = nplevs1
199 DO k = 1,nplevs1
200 p = plevs1(k)
201 call prestopres(qprs(1,1,k),qinp,pkz,pksrf,0.,p,sNx,sNy,
202 . nlevels(listId),myThid )
203 ENDDO
204 elseif(fflags(listId)(3:3).eq.'2')then
205 nlevsout = nplevs2
206 DO k = 1,nplevs2
207 p = plevs2(k)
208 call prestopres(qprs(1,1,k),qinp,pkz,pksrf,0.,p,sNx,sNy,
209 . nlevels(listId),myThid )
210 ENDDO
211 elseif(fflags(listId)(3:3).eq.'3')then
212 nlevsout = nplevs3
213 DO k = 1,nplevs3
214 p = plevs3(k)
215 call prestopres(qprs(1,1,k),qinp,pkz,pksrf,0.,p,sNx,sNy,
216 . nlevels(listId),myThid )
217 ENDDO
218 endif
219
220 DO j = 1,sNy
221 DO i = 1,sNx
222 DO k = 1,nlevsout
223 qtmp1(i,j,k,bi,bj) = qprs(i,j,k)
224 if(qtmp1(i,j,k,bi,bj).eq.undef) qtmp1(i,j,k,bi,bj) = 0.
225 ENDDO
226 ENDDO
227 ENDDO
228
229 ENDDO
230 ENDDO
231
232 ENDIF
233
234 RETURN
235 END

  ViewVC Help
Powered by ViewVC 1.1.22