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

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

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


Revision 1.8 - (hide annotations) (download)
Wed Jan 31 21:47:55 2007 UTC (17 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58w_post, checkpoint58x_post, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint59j, checkpoint59, checkpoint58y_post, checkpoint58v_post
Changes since 1.7: +2 -7 lines
set maximum size of array to write to "numLevels" (consistent with
length of level list that is read from data.diagnostics)

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

  ViewVC Help
Powered by ViewVC 1.1.22