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

Contents of /MITgcm/model/src/ini_reference_state.F

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


Revision 1.3 - (show annotations) (download)
Fri Sep 5 20:15:28 2008 UTC (15 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +1 -1 lines
FILE REMOVED
- add initialisation of deepFac if using Pcoords (new S/R set_grid_factors)
- move things around:
  ini_phiref.F          --> set_ref_state.F  (+ set anelastic factors)
  ini_reference_state.F --> load_ref_files.F (- set anelastic factors)

1 C $Header: /u/gcmpack/MITgcm/model/src/ini_reference_state.F,v 1.2 2006/12/05 05:25:08 jmc Exp $
2 C $Name: $
3
4 c #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 CBOP
8 C !ROUTINE: INI_REFERENCE_STATE
9 C !INTERFACE:
10 SUBROUTINE INI_REFERENCE_STATE( myThid )
11 C !DESCRIPTION: \bv
12 C *==========================================================*
13 C | SUBROUTINE INI_REF_STATE
14 C | o Initialise reference vertical profile for state
15 C | variables (Pot.Temp., Salinity/Specif.Humid., ....)
16 C *==========================================================*
17 C \ev
18
19 C !USES:
20 IMPLICIT NONE
21 C === Global variables ===
22 #include "SIZE.h"
23 #include "EEPARAMS.h"
24 #include "PARAMS.h"
25 c #include "GRID.h"
26
27 C !INPUT/OUTPUT PARAMETERS:
28 C == Routine arguments ==
29 C myThid :: my Thread Id number
30 INTEGER myThid
31
32 C !LOCAL VARIABLES:
33 C == Local variables ==
34 C k :: loop index
35 C msgBuf :: Informational/error message buffer
36 C tmp4vRef :: temporary arrays to read in ref. vertical profile
37 C tmp8vRef :: temporary arrays to read in ref. vertical profile
38 C iUnit :: Work variable for IO unit number
39 REAL*4 tmp4vRef(Nr)
40 REAL*8 tmp8vRef(Nr)
41 _RL rhoRef(Nr)
42 _RL tracerDefault
43 INTEGER ILNBLNK
44 EXTERNAL ILNBLNK
45 INTEGER k, kLen, iUnit
46 CHARACTER*(MAX_LEN_MBUF) msgBuf
47 CEOP
48
49 _BEGIN_MASTER( myThid )
50
51 C-- Set reference Potential Temperature
52 IF ( tRefFile .EQ. ' ' ) THEN
53 C- set default vertical profile for temperature: tRef
54 tracerDefault = 20.
55 IF ( fluidIsAir ) tracerDefault = 300.
56 DO k=1,Nr
57 IF (tRef(k).EQ.UNSET_RL) tRef(k) = tracerDefault
58 tracerDefault = tRef(k)
59 ENDDO
60 ELSE
61 C- check for multiple definitions:
62 DO k=1,Nr
63 IF (tRef(k).NE.UNSET_RL) THEN
64 WRITE(msgBuf,'(A,I4,A)')
65 & 'S/R INI_PARMS: Cannot set both tRef(k=',k,') and tRefFile'
66 CALL PRINT_ERROR( msgBuf, myThid )
67 STOP 'ABNORMAL END: S/R INI_PARMS'
68 ENDIF
69 ENDDO
70 ENDIF
71 C- read from file:
72 IF ( tRefFile .NE. ' ' ) THEN
73 CALL MDSFINDUNIT( iUnit, myThid )
74 kLen = ILNBLNK(tRefFile)
75 IF (readBinaryPrec.EQ.precFloat32) THEN
76 OPEN(iUnit, FILE=tRefFile(1:kLen), STATUS='OLD',
77 & FORM='UNFORMATTED',ACCESS='DIRECT',RECL=WORDLENGTH*Nr)
78 READ(iUnit,rec=1) tmp4vRef
79 CLOSE(iUnit)
80 #ifdef _BYTESWAPIO
81 CALL MDS_BYTESWAPR4( Nr, tmp4vRef )
82 #endif
83 DO k=1,Nr
84 tRef(k) = tmp4vRef(k)
85 ENDDO
86 ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
87 OPEN(iUnit, FILE=tRefFile(1:kLen), STATUS='OLD',
88 & FORM='UNFORMATTED',ACCESS='DIRECT',RECL=WORDLENGTH*2*Nr)
89 READ(iUnit,rec=1) tmp8vRef
90 CLOSE(iUnit)
91 #ifdef _BYTESWAPIO
92 CALL MDS_BYTESWAPR8( Nr, tmp8vRef )
93 #endif
94 DO k=1,Nr
95 tRef(k) = tmp8vRef(k)
96 ENDDO
97 ENDIF
98 WRITE(msgBuf,'(3A)') 'S/R INI_REFERENCE_STATE:',
99 & ' tRef loaded from file: ', tRefFile(1:kLen)
100 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
101 & SQUEEZE_RIGHT , myThid )
102 ENDIF
103
104 C-- Set reference Salinity/Specific Humidity
105 IF ( sRefFile .EQ. ' ' ) THEN
106 C- set default vertical profile for salinity/water-vapour: sRef
107 tracerDefault = 30.
108 IF ( fluidIsAir ) tracerDefault = 0.
109 DO k=1,Nr
110 IF (sRef(k).EQ.UNSET_RL) sRef(k) = tracerDefault
111 tracerDefault = sRef(k)
112 ENDDO
113 ELSE
114 C- check for multiple definitions:
115 DO k=1,Nr
116 IF (sRef(k).NE.UNSET_RL) THEN
117 WRITE(msgBuf,'(A,I4,A)')
118 & 'S/R INI_PARMS: Cannot set both sRef(k=',k,') and sRefFile'
119 CALL PRINT_ERROR( msgBuf, myThid )
120 STOP 'ABNORMAL END: S/R INI_PARMS'
121 ENDIF
122 ENDDO
123 ENDIF
124 C- read from file:
125 IF ( sRefFile .NE. ' ' ) THEN
126 CALL MDSFINDUNIT( iUnit, myThid )
127 kLen = ILNBLNK(sRefFile)
128 IF (readBinaryPrec.EQ.precFloat32) THEN
129 OPEN(iUnit, FILE=sRefFile(1:kLen), STATUS='OLD',
130 & FORM='UNFORMATTED',ACCESS='DIRECT',RECL=WORDLENGTH*Nr)
131 READ(iUnit,rec=1) tmp4vRef
132 CLOSE(iUnit)
133 #ifdef _BYTESWAPIO
134 CALL MDS_BYTESWAPR4( Nr, tmp4vRef )
135 #endif
136 DO k=1,Nr
137 sRef(k) = tmp4vRef(k)
138 ENDDO
139 ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
140 OPEN(iUnit, FILE=sRefFile(1:kLen), STATUS='OLD',
141 & FORM='UNFORMATTED',ACCESS='DIRECT',RECL=WORDLENGTH*2*Nr)
142 READ(iUnit,rec=1) tmp8vRef
143 CLOSE(iUnit)
144 #ifdef _BYTESWAPIO
145 CALL MDS_BYTESWAPR8( Nr, tmp8vRef )
146 #endif
147 DO k=1,Nr
148 sRef(k) = tmp8vRef(k)
149 ENDDO
150 ENDIF
151 WRITE(msgBuf,'(3A)') 'S/R INI_REFERENCE_STATE:',
152 & ' sRef loaded from file: ', sRefFile(1:kLen)
153 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
154 & SQUEEZE_RIGHT , myThid )
155 ENDIF
156
157 C-- Set reference Density
158 IF ( rhoRefFile .NE. ' ' ) THEN
159 C- read from file:
160 CALL MDSFINDUNIT( iUnit, myThid )
161 kLen = ILNBLNK(rhoRefFile)
162 IF (readBinaryPrec.EQ.precFloat32) THEN
163 OPEN(iUnit, FILE=rhoRefFile(1:kLen), STATUS='OLD',
164 & FORM='UNFORMATTED',ACCESS='DIRECT',RECL=WORDLENGTH*Nr)
165 READ(iUnit,rec=1) tmp4vRef
166 CLOSE(iUnit)
167 #ifdef _BYTESWAPIO
168 CALL MDS_BYTESWAPR4( Nr, tmp4vRef )
169 #endif
170 DO k=1,Nr
171 rhoRef(k) = tmp4vRef(k)
172 ENDDO
173 ELSEIF (readBinaryPrec.EQ.precFloat64) THEN
174 OPEN(iUnit, FILE=rhoRefFile(1:kLen), STATUS='OLD',
175 & FORM='UNFORMATTED',ACCESS='DIRECT',RECL=WORDLENGTH*2*Nr)
176 READ(iUnit,rec=1) tmp8vRef
177 CLOSE(iUnit)
178 #ifdef _BYTESWAPIO
179 CALL MDS_BYTESWAPR8( Nr, tmp8vRef )
180 #endif
181 DO k=1,Nr
182 rhoRef(k) = tmp8vRef(k)
183 ENDDO
184 ENDIF
185 WRITE(msgBuf,'(3A)') 'S/R INI_REFERENCE_STATE:',
186 & ' rhoRef loaded from file: ', rhoRefFile(1:kLen)
187 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
188 & SQUEEZE_RIGHT , myThid)
189 ENDIF
190
191 C-- Initialise density factor for anelastic formulation:
192 DO k=1,Nr
193 rhoFacC(k) = 1. _d 0
194 recip_rhoFacC(k) = 1. _d 0
195 ENDDO
196 DO k=1,Nr+1
197 rhoFacF(k) = 1. _d 0
198 recip_rhoFacF(k) = 1. _d 0
199 ENDDO
200
201 IF ( usingZCoords .AND. rhoRefFile .NE. ' ' ) THEN
202 C-- anelastic formulation : set density factor from reference density profile
203 C surface-interface rho-factor has to be 1:
204 rhoFacF(1) = 1. _d 0
205 C rhoFac(k) = density ratio between layer k and top interface
206 DO k=1,Nr
207 rhoFacC(k) = rhoRef(k)/rhoConst
208 ENDDO
209 DO k=2,Nr
210 rhoFacF(k) = (rhoFacC(k-1)*delR(k)+rhoFacC(k)*delR(k-1))
211 & / (delR(k)+delR(k-1))
212 ENDDO
213 C extrapolate down to the bottom:
214 rhoFacF(Nr+1)= 2. _d 0*rhoFacC(Nr) - rhoFacF(Nr)
215 C- set reciprocal rho-factor:
216 DO k=1,Nr
217 recip_rhoFacC(k) = 1. _d 0/rhoFacC(k)
218 ENDDO
219 DO k=1,Nr+1
220 recip_rhoFacF(k) = 1. _d 0/rhoFacF(k)
221 ENDDO
222 ENDIF
223
224 _END_MASTER(myThid)
225 C-- Everyone else must wait for the parameters to be loaded
226 _BARRIER
227
228 RETURN
229 END

  ViewVC Help
Powered by ViewVC 1.1.22