/[MITgcm]/MITgcm/pkg/autodiff/autodiff_readparms.F
ViewVC logotype

Contents of /MITgcm/pkg/autodiff/autodiff_readparms.F

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


Revision 1.13 - (show annotations) (download)
Wed Aug 9 15:23:39 2017 UTC (6 years, 9 months ago) by mlosch
Branch: MAIN
CVS Tags: checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, HEAD
Changes since 1.12: +6 -2 lines
replace CLOSE(nmlfileUnit) with CLOSE(nmlfileUnit,STATUS='DELETE') to remove
scratchfiles after closing, except for SINGLE_DISK_IO, when everything
stays the same

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

  ViewVC Help
Powered by ViewVC 1.1.22