1 |
C $Header: /u/gcmpack/MITgcm/pkg/autodiff/autodiff_readparms.F,v 1.12 2015/03/23 21:06:13 gforget Exp $ |
2 |
C $Name: BASE $ |
3 |
|
4 |
#include "AUTODIFF_OPTIONS.h" |
5 |
|
6 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
7 |
CBOP 0 |
8 |
C !ROUTINE: AUTODIFF_READPARMS |
9 |
|
10 |
C !INTERFACE: |
11 |
SUBROUTINE AUTODIFF_READPARMS( myThid ) |
12 |
|
13 |
C !DESCRIPTION: |
14 |
C Initialize AUTODIFF variables and constants. |
15 |
|
16 |
C !USES: |
17 |
IMPLICIT NONE |
18 |
#include "SIZE.h" |
19 |
#include "EEPARAMS.h" |
20 |
#include "PARAMS.h" |
21 |
#include "AUTODIFF_PARAMS.h" |
22 |
|
23 |
C !INPUT PARAMETERS: |
24 |
INTEGER myThid |
25 |
CEOP |
26 |
|
27 |
#ifdef ALLOW_AUTODIFF |
28 |
|
29 |
C !LOCAL VARIABLES: |
30 |
C msgBuf :: Informational/error message buffer |
31 |
C iUnit :: Work variable for IO unit number |
32 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
33 |
INTEGER iUnit |
34 |
INTEGER errCount |
35 |
|
36 |
NAMELIST /AUTODIFF_PARM01/ |
37 |
& dumpAdVarExch, mon_AdVarExch, |
38 |
& dumpAdByRec, |
39 |
& useKPPinAdMode, useGGL90inAdMode, |
40 |
& useGMRediInAdMode, useSALT_PLUMEinAdMode, |
41 |
& useSEAICEinAdMode, useSmoothCorrel2DinAdMode, |
42 |
& inAdExact, SEAICEapproxLevInAd, viscFacInAd, |
43 |
& SEAICEuseFREEDRIFTswitchInAd, SEAICEuseDYNAMICSswitchInAd |
44 |
|
45 |
IF ( .NOT.useAUTODIFF ) THEN |
46 |
C- pkg AUTODIFF is not used |
47 |
_BEGIN_MASTER(myThid) |
48 |
C- Track pkg activation status: |
49 |
C print a (weak) warning if data.autodiff is found |
50 |
CALL PACKAGES_UNUSED_MSG( 'useAUTODIFF', ' ', ' ' ) |
51 |
_END_MASTER(myThid) |
52 |
RETURN |
53 |
ENDIF |
54 |
|
55 |
_BEGIN_MASTER(myThid) |
56 |
errCount = 0 |
57 |
|
58 |
C-- Default values for AUTODIFF |
59 |
dumpAdVarExch = 2 |
60 |
mon_AdVarExch = 2 |
61 |
C- to recover old ad-monitor & ad-dump behaviour: |
62 |
c dumpAdVarExch = 1 |
63 |
c mon_AdVarExch = 0 |
64 |
C-- default : write one file per record |
65 |
dumpAdByRec = .FALSE. |
66 |
useKPPinAdMode = .TRUE. |
67 |
useGMRediInAdMode = .TRUE. |
68 |
useSEAICEinAdMode = .TRUE. |
69 |
useGGL90inAdMode = .TRUE. |
70 |
useSALT_PLUMEinAdMode = .TRUE. |
71 |
inAdExact = .TRUE. |
72 |
SEAICEapproxLevInAd = 0 |
73 |
viscFacInAd = 1. _d 0 |
74 |
|
75 |
C-- pkg/seaice related switches |
76 |
SEAICEuseFREEDRIFTswitchInAd = .FALSE. |
77 |
SEAICEuseDYNAMICSswitchInAd = .FALSE. |
78 |
useSmoothCorrel2DinAdMode = .TRUE. |
79 |
|
80 |
WRITE(msgBuf,'(A)') 'AUTODIFF_READPARMS: opening data.autodiff' |
81 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
82 |
& SQUEEZE_RIGHT, myThid ) |
83 |
CALL OPEN_COPY_DATA_FILE( |
84 |
I 'data.autodiff', 'AUTODIFF_READPARMS', |
85 |
O iUnit, |
86 |
I myThid ) |
87 |
|
88 |
C Read parameters from open data file |
89 |
READ(UNIT=iUnit,NML=AUTODIFF_PARM01) |
90 |
WRITE(msgBuf,'(A)') |
91 |
& 'AUTODIFF_READPARMS: finished reading data.autodiff' |
92 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
93 |
& SQUEEZE_RIGHT, myThid ) |
94 |
C Close the open data file |
95 |
#ifdef SINGLE_DISK_IO |
96 |
CLOSE(iUnit) |
97 |
#else |
98 |
CLOSE(iUnit,STATUS='DELETE') |
99 |
#endif /* SINGLE_DISK_IO */ |
100 |
|
101 |
C-- Flag for approximate adjoint |
102 |
IF ( inAdExact ) THEN |
103 |
inAdTrue = .FALSE. |
104 |
inAdFalse = .FALSE. |
105 |
ELSE |
106 |
inAdTrue = .TRUE. |
107 |
inAdFalse = .FALSE. |
108 |
ENDIF |
109 |
inAdMode = .FALSE. |
110 |
|
111 |
C-- packages which can be switched off in adjoint mode (approximate adjoint): |
112 |
C store value of usePKG as it will be reset in S/R ADAUTODIFF_INADMODE_UNSET |
113 |
useKPPinFwdMode = useKPP |
114 |
useGMRediInFwdMode = useGMRedi |
115 |
useSEAICEinFwdMode = useSEAICE |
116 |
useGGL90inFwdMode = useGGL90 |
117 |
useSALT_PLUMEinFwdMode = useSALT_PLUME |
118 |
|
119 |
C store value of usePKG as it will be set in S/R ADAUTODIFF_INADMODE_SET |
120 |
useKPPinAdMode = useKPPinAdMode .AND. useKPP |
121 |
useGMRediInAdMode = useGMRediInAdMode .AND. useGMRedi |
122 |
useSEAICEinAdMode = useSEAICEinAdMode .AND. useSEAICE |
123 |
useGGL90inAdMode = useGGL90inAdMode .AND. useGGL90 |
124 |
useSALT_PLUMEinAdMode = useSALT_PLUMEinAdMode .AND. useSALT_PLUME |
125 |
|
126 |
#ifdef ALLOW_SEAICE |
127 |
c level of approximation in seaice thermodynamics adjoint |
128 |
if (useSEAICEinFwdMode.AND.(.NOT.useSEAICEinAdMode)) |
129 |
& SEAICEapproxLevInAd=MIN(SEAICEapproxLevInAd,0) |
130 |
if (useSEAICEinAdMode) |
131 |
& SEAICEapproxLevInAd=MAX(SEAICEapproxLevInAd,0) |
132 |
#endif |
133 |
|
134 |
C-- Print out some kee parameters : |
135 |
WRITE(msgBuf,'(A)') '// ===================================' |
136 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
137 |
& SQUEEZE_RIGHT, myThid ) |
138 |
WRITE(msgBuf,'(A)') '// AUTODIFF parameters :' |
139 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
140 |
& SQUEEZE_RIGHT, myThid ) |
141 |
WRITE(msgBuf,'(A)') '// ===================================' |
142 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
143 |
& SQUEEZE_RIGHT, myThid ) |
144 |
CALL WRITE_0D_L( inAdExact, INDEX_NONE, |
145 |
& 'inAdExact =', ' /* get an exact adjoint (no approximation) */') |
146 |
CALL WRITE_0D_L( useKPPinAdMode, INDEX_NONE, |
147 |
& 'useKPPinAdMode =', ' /* use KPP in adjoint mode */') |
148 |
CALL WRITE_0D_L( useGMRediInAdMode, INDEX_NONE, |
149 |
& 'useGMRediInAdMode =', ' /* use GMRedi in adjoint mode */') |
150 |
CALL WRITE_0D_L( useSEAICEinAdMode, INDEX_NONE, |
151 |
& 'useSEAICEinAdMode =', ' /* use SEAICE in adjoint mode */') |
152 |
CALL WRITE_0D_L( useGGL90inAdMode, INDEX_NONE, |
153 |
& 'useGGL90inAdMode =', ' /* use GGL90 in adjoint mode */') |
154 |
CALL WRITE_0D_L( useSALT_PLUMEinAdMode, INDEX_NONE, |
155 |
& 'useSALT_PLUMEinAdMode =', |
156 |
& ' /* use SALT_PLUME in adjoint mode */') |
157 |
#ifdef ALLOW_SEAICE |
158 |
CALL WRITE_0D_L( SEAICEuseDYNAMICSswitchInAd, INDEX_NONE, |
159 |
& 'SEAICEuseDYNAMICSswitchInAd =', |
160 |
& ' /* switch On/Off SEAICE Dyn in AD mode */') |
161 |
CALL WRITE_0D_L( SEAICEuseFREEDRIFTswitchInAd, INDEX_NONE, |
162 |
& 'SEAICEuseFREEDRIFTswitchInAd=', |
163 |
& ' /* switch On/Off Free-Drift in AD mode */') |
164 |
CALL WRITE_0D_I( SEAICEapproxLevInAd, INDEX_NONE, |
165 |
& 'SEAICEapproxLevInAd =', |
166 |
& ' /* -1:SEAICE_FAKE, >0:other adjoint approximation */') |
167 |
#endif /* ALLOW_SEAICE */ |
168 |
CALL WRITE_0D_I( dumpAdVarExch, INDEX_NONE, |
169 |
& 'dumpAdVarExch =', ' /* control adexch before dumpinp */') |
170 |
CALL WRITE_0D_I( mon_AdVarExch, INDEX_NONE, |
171 |
& 'mon_AdVarExch =', ' /* control adexch before monitor */') |
172 |
CALL WRITE_0D_RL( viscFacInAd, INDEX_NONE, |
173 |
& 'viscFacInAd =', ' /* viscosity factor for adjoint */') |
174 |
WRITE(msgBuf,'(A)') ' ' |
175 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
176 |
& SQUEEZE_RIGHT, myThid ) |
177 |
|
178 |
C-- Check parameters : |
179 |
#ifdef ALLOW_SEAICE |
180 |
IF ( SEAICEuseFREEDRIFTswitchInAd .AND. .NOT.useSEAICE ) THEN |
181 |
WRITE(msgBuf,'(2A)') 'AUTODIFF_READPARMS: ', |
182 |
& 'SEAICEuseFREEDRIFTswitchInAd not usable without useSEAICE' |
183 |
CALL PRINT_ERROR( msgBuf, myThid ) |
184 |
errCount = errCount + 1 |
185 |
ENDIF |
186 |
IF ( SEAICEuseDYNAMICSswitchInAd .AND. .NOT.useSEAICE ) THEN |
187 |
WRITE(msgBuf,'(2A)') 'AUTODIFF_READPARMS: ', |
188 |
& 'SEAICEuseDYNAMICSswitchInAd not usable without useSEAICE' |
189 |
CALL PRINT_ERROR( msgBuf, myThid ) |
190 |
errCount = errCount + 1 |
191 |
ENDIF |
192 |
#else /* ALLOW_SEAICE */ |
193 |
SEAICEuseFREEDRIFTswitchInAd = .FALSE. |
194 |
SEAICEuseDYNAMICSswitchInAd = .FALSE. |
195 |
#endif /* ALLOW_SEAICE */ |
196 |
|
197 |
IF ( errCount.GE.1 ) THEN |
198 |
WRITE(msgBuf,'(A,I3,A)') |
199 |
& 'AUTODIFF_READPARMS: detected', errCount,' fatal error(s)' |
200 |
CALL PRINT_ERROR( msgBuf, myThid ) |
201 |
CALL ALL_PROC_DIE( 0 ) |
202 |
STOP 'ABNORMAL END: S/R AUTODIFF_READPARMS' |
203 |
ENDIF |
204 |
|
205 |
_END_MASTER(myThid) |
206 |
|
207 |
C-- Everyone else must wait for the parameters to be loaded |
208 |
_BARRIER |
209 |
|
210 |
#endif /* ALLOW_AUTODIFF */ |
211 |
|
212 |
RETURN |
213 |
END |