/[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.11 - (hide annotations) (download)
Sun Jan 10 04:09:31 2010 UTC (14 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62y, checkpoint62x
Changes since 1.10: +2 -2 lines
exactly 1 space  after SUBROUTINE and S/R name in S/R declaration.

1 jmc 1.11 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_interp_vert.F,v 1.10 2008/11/18 21:41:06 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 jmc 1.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 jmc 1.10 C !FUNCTIONS:
56     #ifdef ALLOW_FIZHI
57     _RL getcon
58     EXTERNAL getcon
59     #endif
60    
61 jmc 1.1 C !LOCAL VARIABLES:
62     C i,j,k :: loop indices
63     INTEGER i, j, k
64     INTEGER bi, bj
65 jmc 1.7 _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 jmc 1.1 INTEGER jpoint1,ipoint1
75     INTEGER jpoint2,ipoint2
76 jmc 1.7 LOGICAL pInc
77 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) msgBuf
78    
79     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
80    
81 jmc 1.7 IF (fflags(listId)(2:2).EQ.'P') THEN
82     pkTop = 0. _d 0
83 jmc 1.10 kappa = atm_kappa
84     #ifdef ALLOW_FIZHI
85     IF ( useFIZHI ) kappa = getcon('KAPPA')
86     #endif
87 jmc 1.7
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 jmc 1.9 WRITE(msgBuf,'(2A,I6,2A)') 'DIAGNOSTICS_INTERP_VERT: ',
103 jmc 1.7 & 'fails to interpolate diag.(#', ndId,'): ',flds(md,listId)
104 jmc 1.1 CALL PRINT_ERROR( msgBuf , myThid )
105     STOP 'ABNORMAL END: S/R DIAGNOSTICS_INTERP_VERT'
106 jmc 1.7 ENDIF
107     C- averageCycle: move pointer
108     ipoint1 = ipoint1 + kdiag(jpoint1)*(lm-1)
109     ipoint2 = ipoint2 + kdiag(jpoint2)*(lm-1)
110 jmc 1.1
111 jmc 1.7 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 jmc 1.1 ENDDO
124     ENDDO
125 jmc 1.7 ENDDO
126    
127     ELSE
128     C- If nonlinear free surf is off, get pressures from rC and rF arrays
129    
130 jmc 1.1 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 jmc 1.7 qtmpsrf(i,j,bi,bj) = Ro_surf(i,j,bi,bj)
135 jmc 1.1 ENDDO
136     ENDDO
137 jmc 1.7 DO k = 1,kdiag(ndId)
138     DO j = 1-OLy,sNy+OLy
139     DO i = 1-OLx,sNx+OLx
140 jmc 1.1 qtmp2(i,j,k,bi,bj) = rC(k)
141     ENDDO
142     ENDDO
143     ENDDO
144     ENDDO
145     ENDDO
146 jmc 1.7
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 jmc 1.1 ENDDO
167     ENDDO
168     ENDDO
169 jmc 1.7 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 jmc 1.1 ENDDO
184     ENDDO
185     ENDDO
186 jmc 1.7 ENDIF
187 jmc 1.1
188 jmc 1.7 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 jmc 1.1 ENDDO
206    
207 jmc 1.7 C- end bi,bj loops
208     ENDDO
209     ENDDO
210    
211     ENDIF
212 jmc 1.1
213     RETURN
214     END

  ViewVC Help
Powered by ViewVC 1.1.22