/[MITgcm]/MITgcm/model/src/set_ref_state.F
ViewVC logotype

Annotation of /MITgcm/model/src/set_ref_state.F

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


Revision 1.2 - (hide annotations) (download)
Sat Sep 6 17:42:27 2008 UTC (15 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61d
Changes since 1.1: +8 -11 lines
change FIND_RHO_SCALAR : return rho (instead of rho - rhoConst)

1 jmc 1.2 C $Header: /u/gcmpack/MITgcm/model/src/set_ref_state.F,v 1.1 2008/09/05 20:15:28 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "CPP_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: SET_REF_STATE
8     C !INTERFACE:
9     SUBROUTINE SET_REF_STATE(
10     I myThid )
11     C !DESCRIPTION: \bv
12     C *==========================================================*
13     C | SUBROUTINE SET_REF_STATE
14     C | o Set reference potential at level center and
15     C | level interface, using tRef,sRef profiles.
16     C | note: use same discretisation as in calc_phi_hyd
17     C | o Set also reference stratification here (for implicit
18     C | Internal Gravity Waves) and units conversion factor
19     C | for vertical velocity (for Non-Hydrostatic in p)
20     C | since both use also the same reference density.
21     C *==========================================================*
22     C \ev
23    
24     C !USES:
25     IMPLICIT NONE
26     C == Global variables ==
27     #include "SIZE.h"
28     #include "EEPARAMS.h"
29     #include "PARAMS.h"
30     #include "GRID.h"
31     #include "EOS.h"
32    
33     C !INPUT/OUTPUT PARAMETERS:
34     C == Routine arguments ==
35     INTEGER myThid
36    
37     C !LOCAL VARIABLES:
38     C == Local variables ==
39     C msgBuf :: Informational/error meesage buffer
40     CHARACTER*(MAX_LEN_MBUF) msgBuf
41     INTEGER k, ks, stdUnit
42     _RL rHalf(2*Nr+1)
43     _RL rhoRef(Nr)
44     _RL pLoc, rhoUp, rhoDw, rhoLoc
45     _RL ddPI, conv_theta2T, thetaLoc
46     CEOP
47    
48     _BEGIN_MASTER( myThid )
49    
50     C-- Initialise:
51     DO k=1,2*Nr
52     phiRef(k) = 0.
53     ENDDO
54     stdUnit = standardMessageUnit
55    
56     DO k=1,Nr
57     rhoRef(k) = 0.
58     dBdrRef(k) = 0.
59     rHalf(2*k-1) = rF(k)
60     rHalf(2*k) = rC(k)
61     ENDDO
62     rHalf(2*Nr+1) = rF(Nr+1)
63    
64     DO k=1,Nr+1
65     rVel2wUnit(k) = 1. _d 0
66     wUnit2rVel(k) = 1. _d 0
67     ENDDO
68    
69     C-- Initialise density factor for anelastic formulation:
70     DO k=1,Nr
71     rhoFacC(k) = 1. _d 0
72     recip_rhoFacC(k) = 1. _d 0
73     ENDDO
74     DO k=1,Nr+1
75     rhoFacF(k) = 1. _d 0
76     recip_rhoFacF(k) = 1. _d 0
77     ENDDO
78    
79     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
80     IF ( eosType.EQ.'POLY3' ) THEN
81     IF ( implicitIntGravWave ) THEN
82     WRITE(msgBuf,'(2A)') 'SET_REF_STATE:',
83     & ' need to compute reference density for Impl.IGW'
84     CALL PRINT_ERROR( msgBuf , myThid )
85     WRITE(msgBuf,'(2A)') 'SET_REF_STATE:',
86     & ' but FIND_RHO_SCALAR(EOS="POLY3") not (yet) implemented'
87     CALL PRINT_ERROR( msgBuf , myThid )
88     STOP 'ABNORMAL END: S/R SET_REF_STATE'
89     ELSEIF ( nonHydrostatic .AND.
90     & buoyancyRelation .EQ. 'OCEANICP' ) THEN
91     WRITE(msgBuf,'(2A)') 'SET_REF_STATE:',
92     & ' need to compute reference density for Non-Hyd'
93     CALL PRINT_ERROR( msgBuf , myThid )
94     WRITE(msgBuf,'(2A)') 'SET_REF_STATE:',
95     & ' but FIND_RHO_SCALAR(EOS="POLY3") not (yet) implemented'
96     CALL PRINT_ERROR( msgBuf , myThid )
97     STOP 'ABNORMAL END: S/R SET_REF_STATE'
98     ELSE
99     WRITE(msgBuf,'(2A)') 'SET_REF_STATE:',
100     & ' Unable to compute reference stratification'
101     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
102     & SQUEEZE_RIGHT , myThid )
103     WRITE(msgBuf,'(2A)') 'SET_REF_STATE:',
104     & ' with EOS="POLY3" ; set dBdrRef(1:Nr) to zeros'
105     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
106     & SQUEEZE_RIGHT , myThid)
107     ENDIF
108     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
109     ELSEIF (buoyancyRelation .EQ. 'OCEANIC') THEN
110    
111     C-- Compute reference density profile and reference stratification
112     DO k=1,Nr
113     pLoc = -rhoConst*rC(k)*gravity
114     CALL FIND_RHO_SCALAR(
115     I tRef(k), sRef(k), pLoc,
116     O rhoRef(k), myThid )
117     ENDDO
118    
119     C-- Compute reference stratification: N^2 = -(g/rho_c) * d.rho/dz @ const. p
120     dBdrRef(1) = 0. _d 0
121     DO k=2,Nr
122     pLoc = -rhoConst*rF(k)*gravity
123     CALL FIND_RHO_SCALAR(
124     I tRef(k-1), sRef(k-1), pLoc,
125     O rhoUp, myThid )
126     CALL FIND_RHO_SCALAR(
127     I tRef(k), sRef(k), pLoc,
128     O rhoDw, myThid )
129     dBdrRef(k) = (rhoDw - rhoUp)*recip_drC(k)
130     & *recip_rhoConst*gravity
131     IF (eosType .EQ. 'LINEAR') THEN
132     C- get more precise values (differences from above are due to machine round-off)
133     dBdrRef(k) = ( sBeta *(sRef(k)-sRef(k-1))
134     & -tAlpha*(tRef(k)-tRef(k-1))
135     & )*recip_drC(k)
136     & *rhoNil*recip_rhoConst*gravity
137     ENDIF
138     ENDDO
139    
140     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
141     ELSEIF (buoyancyRelation .EQ. 'OCEANICP') THEN
142    
143     C-- Compute reference density profile
144     DO k=1,Nr
145     pLoc = rC(k)
146     CALL FIND_RHO_SCALAR(
147     I tRef(k), sRef(k), pLoc,
148     O rhoRef(k), myThid )
149     ENDDO
150    
151     C-- Compute reference stratification: -d.alpha/dp @ constant p
152     dBdrRef(1) = 0. _d 0
153     DO k=1,Nr+1
154     pLoc = rF(k)
155     IF ( k.GE.2 ) CALL FIND_RHO_SCALAR(
156     I tRef(k-1), sRef(k-1), pLoc,
157     O rhoDw, myThid )
158     IF ( k.LE.Nr ) CALL FIND_RHO_SCALAR(
159     I tRef(k), sRef(k), pLoc,
160     O rhoUp, myThid )
161     IF ( k.GE.2 .AND. k.LE.Nr ) THEN
162     dBdrRef(k) = (rhoDw - rhoUp)*recip_drC(k)
163 jmc 1.2 & / (rhoDw*rhoUp)
164     rhoLoc = ( rhoDw + rhoUp )*0.5 _d 0
165 jmc 1.1 ELSEIF ( k.EQ.1 ) THEN
166 jmc 1.2 rhoLoc = rhoUp
167 jmc 1.1 ELSE
168 jmc 1.2 rhoLoc = rhoDw
169 jmc 1.1 ENDIF
170     C-- Units convertion factor for vertical velocity:
171     C wUnit2rVel = gravity*rhoRef : rVel [Pa/s] = wSpeed [m/s] * wUnit2rVel
172     C rVel2wUnit = 1/rVel2wUnit : wSpeed [m/s] = rVel [Pa/s] * rVel2wUnit
173     C note: wUnit2rVel & rVel2wUnit replace horiVertRatio & recip_horiVertRatio
174     wUnit2rVel(k) = gravity*rhoLoc
175     rVel2wUnit(k) = 1. _d 0 / wUnit2rVel(k)
176     ENDDO
177    
178     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
179     ELSEIF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN
180    
181     C-- Compute reference stratification: -d.alpha/dp @ constant p
182     dBdrRef(1) = 0. _d 0
183     DO k=2,Nr
184     conv_theta2T = (rF(k)/atm_Po)**atm_kappa
185     c dBdrRef(k) = (tRef(k) - tRef(k-1))*recip_drC(k)
186     c & * conv_theta2T*atm_Rd/rF(k)
187     ddPI=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa)
188     & -((rC( k )/atm_Po)**atm_kappa) )
189     dBdrRef(k) = (tRef(k) - tRef(k-1))*recip_drC(k)
190     & * ddPI*recip_drC(k)
191     ENDDO
192    
193     C-- Units convertion factor for vertical velocity:
194     C wUnit2rVel = gravity/alpha : rVel [Pa/s] = wSpeed [m/s] * wUnit2rVel
195     C rVel2wUnit = alpha/gravity : wSpeed [m/s] = rVel [Pa/s] * rVel2wUnit
196     C with alpha = 1/rhoRef = (R.T/p) (ideal gas)
197     C note: wUnit2rVel & rVel2wUnit replace horiVertRatio & recip_horiVertRatio
198     DO k=1,Nr+1
199     IF ( k.EQ.1 ) THEN
200     thetaLoc = tRef(k)
201     ELSEIF ( k.GT.Nr ) THEN
202     thetaLoc = tRef(k-1)
203     ELSE
204     thetaLoc = (tRef(k) + tRef(k-1))*0.5 _d 0
205     ENDIF
206     IF ( thetaLoc.GT.0. _d 0 .AND. rF(k).GT.0. _d 0 ) THEN
207     conv_theta2T = (rF(k)/atm_Po)**atm_kappa
208     wUnit2rVel(k) = gravity
209     & * rF(k)/(atm_Rd*conv_theta2T*thetaLoc)
210     rVel2wUnit(k) = 1. _d 0 / wUnit2rVel(k)
211     ENDIF
212     ENDDO
213    
214     C- Compute Reference Geopotential at Half levels :
215     C Tracer level: phiRef(2k) ; Interface_W level: phiRef(2k+1)
216    
217     phiRef(1) = 0. _d 0
218    
219     IF (integr_GeoPot.EQ.1) THEN
220     C- Finite Volume Form, linear by half level :
221     DO k=1,2*Nr
222     ks = (k+1)/2
223     ddPI=atm_Cp*( ((rHalf( k )/atm_Po)**atm_kappa)
224     & -((rHalf(k+1)/atm_Po)**atm_kappa) )
225     phiRef(k+1) = phiRef(k)+ddPI*tRef(ks)
226     ENDDO
227     C------
228     ELSE
229     C- Finite Difference Form, linear between Tracer level :
230     C works with integr_GeoPot = 0, 2 or 3
231     k = 1
232     ddPI=atm_Cp*( ((rF(k)/atm_Po)**atm_kappa)
233     & -((rC(k)/atm_Po)**atm_kappa) )
234     phiRef(2*k) = phiRef(1) + ddPI*tRef(k)
235     DO k=1,Nr-1
236     ddPI=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa)
237     & -((rC(k+1)/atm_Po)**atm_kappa) )
238     phiRef(2*k+1) = phiRef(2*k) + ddPI*0.5*tRef(k)
239     phiRef(2*k+2) = phiRef(2*k)
240     & + ddPI*0.5*(tRef(k)+tRef(k+1))
241     ENDDO
242     k = Nr
243     ddPI=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa)
244     & -((rF(k+1)/atm_Po)**atm_kappa) )
245     phiRef(2*k+1) = phiRef(2*k) + ddPI*tRef(k)
246     C------
247     ENDIF
248    
249     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
250     ELSE
251     STOP 'SET_REF_STATE: Bad value of buoyancyRelation !'
252     C-- endif buoyancyRelation
253     ENDIF
254    
255     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
256    
257     IF ( usingZCoords .AND. rhoRefFile .NE. ' ' ) THEN
258     C-- anelastic formulation : set density factor from reference density profile
259     C surface-interface rho-factor has to be 1:
260     rhoFacF(1) = 1. _d 0
261     C rhoFac(k) = density ratio between layer k and top interface
262     DO k=1,Nr
263     rhoFacC(k) = rho1Ref(k)/rhoConst
264     ENDDO
265     DO k=2,Nr
266 jmc 1.2 rhoFacF(k) = (rhoFacC(k-1)*drF(k)+rhoFacC(k)*drF(k-1))
267     & / (drF(k)+drF(k-1))
268 jmc 1.1 ENDDO
269     C extrapolate down to the bottom:
270     rhoFacF(Nr+1)= 2. _d 0*rhoFacC(Nr) - rhoFacF(Nr)
271     C- set reciprocal rho-factor:
272     DO k=1,Nr
273     recip_rhoFacC(k) = 1. _d 0/rhoFacC(k)
274     ENDDO
275     DO k=1,Nr+1
276     recip_rhoFacF(k) = 1. _d 0/rhoFacF(k)
277     ENDDO
278     ENDIF
279    
280     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
281    
282     C-- Write to check :
283     IF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN
284     WRITE(msgBuf,'(A)') ' '
285     CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid )
286     WRITE(msgBuf,'(A)')
287     & 'SET_REF_STATE: PhiRef/g [m] at level Center (integer)'
288     CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid )
289     WRITE(msgBuf,'(A)')
290     & ' and at level Interface (half-int.) :'
291     CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid )
292     DO k=1,2*Nr+1
293 jmc 1.2 WRITE(msgBuf,'(A,F5.1,A,F15.1,A,F13.3)')
294 jmc 1.1 & ' K=',k*0.5,' ; r=',rHalf(k),' ; phiRef/g=',
295     & phiRef(k)*recip_gravity
296     CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid )
297     ENDDO
298     ENDIF
299    
300     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
301    
302     _END_MASTER( myThid )
303     _BARRIER
304    
305     RETURN
306     END

  ViewVC Help
Powered by ViewVC 1.1.22