1 |
C $Header: /u/gcmpack/MITgcm/pkg/shap_filt/shap_filt_readparms.F,v 1.15 2009/04/28 23:27:24 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "SHAP_FILT_OPTIONS.h" |
5 |
|
6 |
CBOP |
7 |
C !ROUTINE: SHAP_FILT_READPARMS |
8 |
C !INTERFACE: |
9 |
SUBROUTINE SHAP_FILT_READPARMS( myThid ) |
10 |
|
11 |
C !DESCRIPTION: \bv |
12 |
C *==========================================================* |
13 |
C | SUBROUTINE SHAP_FILT_READPARMS |
14 |
C | o Routine to initialize Shapiro Filter parameters |
15 |
C *==========================================================* |
16 |
C *==========================================================* |
17 |
C \ev |
18 |
|
19 |
C !USES: |
20 |
IMPLICIT NONE |
21 |
|
22 |
C === Global variables === |
23 |
#include "SIZE.h" |
24 |
#include "EEPARAMS.h" |
25 |
#include "PARAMS.h" |
26 |
#include "SHAP_FILT.h" |
27 |
|
28 |
C !INPUT/OUTPUT PARAMETERS: |
29 |
C === Routine arguments === |
30 |
INTEGER myThid |
31 |
|
32 |
#ifdef ALLOW_SHAP_FILT |
33 |
|
34 |
C !LOCAL VARIABLES: |
35 |
C === Local variables === |
36 |
C msgBuf :: Informational/error message buffer |
37 |
C iUnit :: Work variable for IO unit number |
38 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
39 |
INTEGER iUnit |
40 |
CEOP |
41 |
|
42 |
NAMELIST /SHAP_PARM01/ |
43 |
& Shap_funct, shap_filt_uvStar, shap_filt_TrStagg, |
44 |
& Shap_alwaysExchUV, Shap_alwaysExchTr, |
45 |
& nShapT,nShapS, nShapTrPhys, Shap_Trtau, Shap_TrLength, |
46 |
& nShapUV, nShapUVPhys, Shap_uvtau, Shap_uvLength, |
47 |
& Shap_noSlip, Shap_diagFreq |
48 |
|
49 |
IF ( .NOT.useSHAP_FILT ) THEN |
50 |
C- pkg SHAP_FILT is not used |
51 |
_BEGIN_MASTER(myThid) |
52 |
C- Track pkg activation status: |
53 |
c SHAPIsOn = .FALSE. |
54 |
C print a (weak) warning if data.shap is found |
55 |
CALL PACKAGES_UNUSED_MSG( 'useSHAP_FILT', ' ', 'shap' ) |
56 |
_END_MASTER(myThid) |
57 |
RETURN |
58 |
ENDIF |
59 |
|
60 |
C-- SHAP_FILT_READPARMS has been called so we know that |
61 |
C the package is active. |
62 |
c SHAPIsOn = .TRUE. |
63 |
|
64 |
_BEGIN_MASTER(myThid) |
65 |
|
66 |
WRITE(msgBuf,'(A)') ' SHAP_FILT_READPARMS: opening data.shap' |
67 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
68 |
& SQUEEZE_RIGHT , 1) |
69 |
|
70 |
CALL OPEN_COPY_DATA_FILE( |
71 |
I 'data.shap', 'SHAP_FILT_READPARMS', |
72 |
O iUnit, |
73 |
I myThid ) |
74 |
|
75 |
C-- Default flags and values for Shapiro Filter |
76 |
Shap_funct = 2 |
77 |
shap_filt_uvStar = .TRUE. |
78 |
shap_filt_TrStagg = .TRUE. |
79 |
Shap_alwaysExchUV = .FALSE. |
80 |
Shap_alwaysExchTr = .FALSE. |
81 |
nShapT = 0 |
82 |
nShapS = -1 |
83 |
nShapUV = 0 |
84 |
nShapTrPhys = 0 |
85 |
nShapUVPhys = 0 |
86 |
Shap_Trtau = dTtracerLev(1) |
87 |
Shap_TrLength = 0. |
88 |
Shap_uvtau = deltaTMom |
89 |
Shap_TrLength = 0. |
90 |
Shap_noSlip = 0. |
91 |
Shap_diagFreq = diagFreq |
92 |
|
93 |
C-- Read parameters from open data file |
94 |
READ(UNIT=iUnit,NML=SHAP_PARM01) |
95 |
|
96 |
WRITE(msgBuf,'(A)') |
97 |
& ' SHAP_FILT_READPARMS: finished reading data.shap' |
98 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
99 |
& SQUEEZE_RIGHT , 1) |
100 |
|
101 |
C-- Close the open data file |
102 |
CLOSE(iUnit) |
103 |
|
104 |
C for backward compatibility: |
105 |
IF (nShapS.EQ.-1) nShapS = nShapT |
106 |
|
107 |
IF (Shap_funct.EQ.20) THEN |
108 |
C use shap-funct S2 with nShap_Phys=nShap |
109 |
C to get exactly the same results as shap-funct S2G. |
110 |
nShapTrPhys = MAX(nShapT,nShapS) |
111 |
nShapUVPhys = nShapUV |
112 |
ENDIF |
113 |
|
114 |
IF ( Shap_funct.EQ.1 .OR. Shap_funct.EQ.4 |
115 |
& .OR. Shap_funct.EQ.21 |
116 |
& ) THEN |
117 |
Shap_alwaysExchUV = .TRUE. |
118 |
ENDIF |
119 |
IF ( Shap_funct.EQ.1 .OR. Shap_funct.EQ.4 |
120 |
& ) THEN |
121 |
Shap_alwaysExchTr = .TRUE. |
122 |
ENDIF |
123 |
|
124 |
C- print out some kee parameters : |
125 |
CALL WRITE_0D_I( Shap_funct, INDEX_NONE, |
126 |
& 'Shap_funct =', |
127 |
& ' /* select Shapiro filter function */') |
128 |
CALL WRITE_0D_I( nShapT , INDEX_NONE, |
129 |
& 'nShapT =', |
130 |
& ' /* power of Shapiro filter for Temperat */') |
131 |
CALL WRITE_0D_I( nShapS , INDEX_NONE, |
132 |
& 'nShapS =', |
133 |
& ' /* power of Shapiro filter for Salinity */') |
134 |
CALL WRITE_0D_I( nShapUV, INDEX_NONE, |
135 |
& 'nShapUV =', |
136 |
& ' /* power of Shapiro filter for momentum */') |
137 |
|
138 |
CALL WRITE_0D_L( shap_filt_uvStar, INDEX_NONE, |
139 |
& 'shap_filt_uvStar =',' /* apply filter before Press. Solver */') |
140 |
CALL WRITE_0D_L( shap_filt_TrStagg, INDEX_NONE, |
141 |
& 'shap_filt_TrStagg =', |
142 |
& ' /* filter T,S before calc PhiHyd (staggerTimeStep) */') |
143 |
CALL WRITE_0D_L( Shap_alwaysExchUV, INDEX_NONE, |
144 |
& 'Shap_alwaysExchUV =',' /* always exch(U,V) nShapUV times*/') |
145 |
CALL WRITE_0D_L( Shap_alwaysExchTr, INDEX_NONE, |
146 |
& 'Shap_alwaysExchTr =',' /* always exch(Tracer) nShapTr times*/') |
147 |
|
148 |
IF (Shap_funct.EQ.2) THEN |
149 |
CALL WRITE_0D_I( nShapTrPhys, INDEX_NONE, |
150 |
& 'nShapTrPhys =', |
151 |
& ' /* power of physical-space filter (Tracer) */') |
152 |
CALL WRITE_0D_I( nShapUVPhys, INDEX_NONE, |
153 |
& 'nShapUVPhys =', |
154 |
& ' /* power of physical-space filter (Momentum) */') |
155 |
ENDIF |
156 |
|
157 |
CALL WRITE_0D_RL( Shap_Trtau, INDEX_NONE, |
158 |
& 'Shap_Trtau =', |
159 |
& ' /* time scale of Shapiro filter (Tracer) */') |
160 |
CALL WRITE_0D_RL( Shap_TrLength, INDEX_NONE, |
161 |
& 'Shap_TrLength =', |
162 |
& ' /* Length scale of Shapiro filter (Tracer) */') |
163 |
CALL WRITE_0D_RL( Shap_uvtau, INDEX_NONE, |
164 |
& 'Shap_uvtau =', |
165 |
& ' /* time scale of Shapiro filter (Momentum) */') |
166 |
CALL WRITE_0D_RL( Shap_uvLength, INDEX_NONE, |
167 |
& 'Shap_uvLength =', |
168 |
& ' /* Length scale of Shapiro filter (Momentum) */') |
169 |
CALL WRITE_0D_RL( Shap_noSlip, INDEX_NONE, |
170 |
& 'Shap_noSlip =', |
171 |
& ' /* No-slip parameter (0=Free-slip ; 1=No-slip)*/') |
172 |
CALL WRITE_0D_RL( Shap_diagFreq, INDEX_NONE, |
173 |
& 'Shap_diagFreq =', |
174 |
& ' /* Frequency^-1 for diagnostic output (s)*/') |
175 |
|
176 |
C-- Check the Options : |
177 |
#ifndef USE_OLD_SHAPIRO_FILTERS |
178 |
#ifdef NO_SLIP_SHAP |
179 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
180 |
WRITE(msgBuf,'(2A)') 'SHAP_FILT: CPP-option NO_SLIP_SHAP', |
181 |
& ' only in OLD_SHAPIRO S/R ;' |
182 |
CALL PRINT_ERROR( msgBuf , 1) |
183 |
WRITE(msgBuf,'(2A)') ' ==> use parameter Shap_noSlip=1. ', |
184 |
& '(in "data.shap") instead' |
185 |
CALL PRINT_ERROR( msgBuf , 1) |
186 |
STOP 'ABNORMAL END: S/R SHAP_FILT_READPARMS' |
187 |
#endif |
188 |
#endif |
189 |
|
190 |
C-- Check the parameters : |
191 |
|
192 |
IF ( .NOT.shap_filt_uvStar ) THEN |
193 |
|
194 |
C- Notes: applying the filter at the end of the time step (after SOLVE_FOR_P) |
195 |
C affects the barotropic flow divergence ; this might not be consistent |
196 |
C with some option of the code. |
197 |
|
198 |
IF ( rigidLid ) THEN |
199 |
WRITE(msgBuf,'(2A)') 'SHAP_FILT with rigidLid ', |
200 |
& 'needs shap_filt_uvStar=.true.' |
201 |
CALL PRINT_ERROR( msgBuf , 1) |
202 |
STOP 'ABNORMAL END: S/R SHAP_FILT_READPARMS' |
203 |
ELSEIF ( .NOT.exactConserv ) THEN |
204 |
WRITE(msgBuf,'(2A)') 'S/R SHAP_FILT_READPARMS: WARNING <<< ', |
205 |
& 'applying Filter after SOLVE_FOR_P (shap_filt_uvStar=FALSE)' |
206 |
CALL PRINT_MESSAGE(msgBuf, errorMessageUnit, SQUEEZE_RIGHT,1) |
207 |
WRITE(msgBuf,'(2A)') 'S/R SHAP_FILT_READPARMS: WARNING <<< ', |
208 |
& 'requires to recompute Eta after ==> turn on exactConserv ' |
209 |
CALL PRINT_MESSAGE(msgBuf, errorMessageUnit, SQUEEZE_RIGHT,1) |
210 |
ENDIF |
211 |
|
212 |
ENDIF |
213 |
|
214 |
C- Some Filters / options are not available on CS-grid: |
215 |
IF (useCubedSphereExchange) THEN |
216 |
IF ( Shap_funct.EQ.1 .OR. Shap_funct.EQ.4 ) THEN |
217 |
WRITE(msgBuf,'(2A,I3)') 'SHAP_FILT on CS-grid ', |
218 |
& 'does not work with Shap_funct=', Shap_funct |
219 |
CALL PRINT_ERROR( msgBuf , 1) |
220 |
STOP 'ABNORMAL END: S/R SHAP_FILT_READPARMS' |
221 |
ELSEIF ( Shap_funct.EQ.21 .AND. nShapUV.GT.0 |
222 |
& .AND. nSx*nSy*nPx*nPy .NE. 6 ) THEN |
223 |
WRITE(msgBuf,'(2A)') 'SHAP_FILT on CS-grid:', |
224 |
& ' multi-tiles / face not implemented with' |
225 |
CALL PRINT_ERROR( msgBuf , 1) |
226 |
WRITE(msgBuf,'(A,I3,A)') ' Shap_funct=', Shap_funct, |
227 |
& ' ; => use instead Shap_funct=2 & nShap[]Phys=0' |
228 |
CALL PRINT_ERROR( msgBuf , 1) |
229 |
STOP 'ABNORMAL END: S/R SHAP_FILT_READPARMS' |
230 |
ENDIF |
231 |
ENDIF |
232 |
|
233 |
_END_MASTER(myThid) |
234 |
|
235 |
C-- Everyone else must wait for the parameters to be loaded |
236 |
_BARRIER |
237 |
|
238 |
#endif /* ALLOW_SHAP_FILT */ |
239 |
RETURN |
240 |
END |