/[MITgcm]/MITgcm/pkg/grdchk/grdchk_main.F
ViewVC logotype

Contents of /MITgcm/pkg/grdchk/grdchk_main.F

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


Revision 1.14 - (show annotations) (download)
Tue Mar 23 19:42:53 2004 UTC (20 years, 2 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint54d_post, checkpoint54e_post, checkpoint55, checkpoint54, checkpoint53, checkpoint54f_post, checkpoint55c_post, checkpoint53d_post, checkpoint54b_post, checkpoint52m_post, checkpoint55g_post, checkpoint55d_post, checkpoint54a_pre, checkpoint53c_post, checkpoint55d_pre, checkpoint54a_post, checkpoint55h_post, checkpoint55b_post, checkpoint53a_post, checkpoint55f_post, checkpoint53g_post, checkpoint53f_post, checkpoint52n_post, checkpoint53b_pre, checkpoint55a_post, checkpoint53b_post, checkpoint53d_pre, checkpoint55e_post, checkpoint54c_post
Changes since 1.13: +3 -1 lines
Added functionality to grdchk:
pick global i,j,k position (or nearest wet) where to perform check.

1 C
2 C $Header: /u/gcmpack/MITgcm/pkg/grdchk/grdchk_main.F,v 1.13 2004/02/23 19:16:16 heimbach Exp $
3 C $Name: $
4
5 #include "AD_CONFIG.h"
6 #include "CPP_OPTIONS.h"
7
8 CBOI
9 C
10 C !TITLE: GRADIENT CHECK
11 C !AUTHORS: mitgcm developers ( support@mitgcm.org )
12 C !AFFILIATION: Massachussetts Institute of Technology
13 C !DATE:
14 C !INTRODUCTION: gradient check package
15 c \bv
16 c Compare the gradients calculated by the adjoint model with
17 c finite difference approximations.
18 c
19 C !CALLING SEQUENCE:
20 c
21 c the_model_main
22 c |
23 c |-- ctrl_unpack
24 c |-- adthe_main_loop - unperturbed cost function and
25 c |-- ctrl_pack adjoint gradient are computed here
26 c |
27 c |-- grdchk_main
28 c |
29 c |-- grdchk_init
30 c |-- do icomp=... - loop over control vector elements
31 c |
32 c |-- grdchk_loc - determine location of icomp on grid
33 c |
34 c |-- grdchk_getxx - get control vector component from file
35 c | perturb it and write back to file
36 c |-- grdchk_getadxx - get gradient component calculated
37 c | via adjoint
38 c |-- the_main_loop - forward run and cost evaluation
39 c | with perturbed control vector element
40 c |-- calculate ratio of adj. vs. finite difference gradient
41 c |
42 c |-- grdchk_setxx - Reset control vector element
43 c |
44 c |-- grdchk_print - print results
45 c \ev
46 CEOI
47
48 CBOP
49 C !ROUTINE: grdchk_main
50 C !INTERFACE:
51 subroutine grdchk_main( mythid )
52
53 C !DESCRIPTION: \bv
54 c ==================================================================
55 c SUBROUTINE grdchk_main
56 c ==================================================================
57 c o Compare the gradients calculated by the adjoint model with
58 c finite difference approximations.
59 c started: Christian Eckert eckert@mit.edu 24-Feb-2000
60 c continued&finished: heimbach@mit.edu: 13-Jun-2001
61 c changed: mlosch@ocean.mit.edu: 09-May-2002
62 c - added centered difference vs. 1-sided difference option
63 c - improved output format for readability
64 c - added control variable hFacC
65 c heimbach@mit.edu 24-Feb-2003
66 c - added tangent linear gradient checks
67 c - fixes for multiproc. gradient checks
68 c - added more control variables
69 c
70 c ==================================================================
71 c SUBROUTINE grdchk_main
72 c ==================================================================
73 C \ev
74
75 C !USES:
76 implicit none
77
78 c == global variables ==
79 #include "SIZE.h"
80 #include "EEPARAMS.h"
81 #include "PARAMS.h"
82 #include "grdchk.h"
83 #include "cost.h"
84 #ifdef ALLOW_TANGENTLINEAR_RUN
85 #include "g_cost.h"
86 #endif
87
88 C !INPUT/OUTPUT PARAMETERS:
89 c == routine arguments ==
90 integer mythid
91
92 #ifdef ALLOW_GRDCHK
93 C !LOCAL VARIABLES:
94 c == local variables ==
95 integer myiter
96 _RL mytime
97 integer bi, itlo, ithi
98 integer bj, jtlo, jthi
99 integer i, imin, imax
100 integer j, jmin, jmax
101 integer k
102
103 integer icomp
104 integer ichknum
105 integer icvrec
106 integer jtile
107 integer itile
108 integer layer
109 integer obcspos
110 integer itilepos
111 integer jtilepos
112 integer itest
113 integer ierr
114 integer ierr_grdchk
115 _RL gfd
116 _RL fcref
117 _RL fcpertplus, fcpertminus
118 _RL ratio_ad
119 _RL ratio_ftl
120 _RL xxmemo_ref
121 _RL xxmemo_pert
122 _RL adxxmemo
123 _RL ftlxxmemo
124 _RL localEps
125 _RL grdchk_epsfac
126
127 _RL tmpplot1(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
128 _RL tmpplot2(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
129 _RL tmpplot3(1-olx:snx+olx,1-oly:sny+oly,nr,nsx,nsy)
130
131 CHARACTER*(MAX_LEN_MBUF) msgBuf
132
133 c == end of interface ==
134 CEOP
135
136 c-- Set the loop ranges.
137 jtlo = mybylo(mythid)
138 jthi = mybyhi(mythid)
139 itlo = mybxlo(mythid)
140 ithi = mybxhi(mythid)
141 jmin = 1
142 jmax = sny
143 imin = 1
144 imax = snx
145
146 c-- initialise variables
147 call grdchk_init( mythid )
148
149 c-- Compute the adjoint models' gradients.
150 c-- Compute the unperturbed cost function.
151 cph Gradient via adjoint has already been computed,
152 cph and so has unperturbed cost function,
153 cph assuming all xx_ fields are initialised to zero.
154
155 ierr_grdchk = 0
156 cphadmtlm(
157 fcref = fc
158 cphadmtlm fcref = objf_state_final(45,4,1,1)
159 cphadmtlm)
160
161 print *, 'ph-check fcref = ', fcref
162
163 do bj = jtlo, jthi
164 do bi = itlo, ithi
165 do k = 1, nr
166 do j = jmin, jmax
167 do i = imin, imax
168 tmpplot1(i,j,k,bi,bj) = 0. _d 0
169 tmpplot2(i,j,k,bi,bj) = 0. _d 0
170 tmpplot3(i,j,k,bi,bj) = 0. _d 0
171 end do
172 end do
173 end do
174 end do
175 end do
176
177 if ( useCentralDiff ) then
178 grdchk_epsfac = 2. _d 0
179 else
180 grdchk_epsfac = 1. _d 0
181 end if
182
183 print *, 'grad-res -------------------------------'
184 print ('(2a)'),
185 & ' grad-res proc # i j k fc ref',
186 & ' fc + eps fc - eps'
187 #ifdef ALLOW_TANGENTLINEAR_RUN
188 print ('(2a)'),
189 & ' grad-res proc # i j k tlm grad',
190 & ' fd grad 1 - fd/tlm'
191 #else
192 print ('(2a)'),
193 & ' grad-res proc # i j k adj grad',
194 & ' fd grad 1 - fd/adj'
195 #endif
196
197 c-- Compute the finite difference approximations.
198 c-- Cycle through all processes doing NINT(nend-nbeg+1)/nstep
199 c-- gradient checks.
200
201 if ( nbeg .EQ. 0 ) call grdchk_get_position( mythid )
202
203 do icomp = nbeg, nend, nstep
204
205 ichknum = (icomp - nbeg)/nstep + 1
206
207 if (ichknum .le. maxgrdchecks ) then
208
209 c-- Determine the location of icomp on the grid.
210 if ( myProcId .EQ. grdchkwhichproc ) then
211 call grdchk_loc( icomp, ichknum,
212 & icvrec, itile, jtile, layer, obcspos,
213 & itilepos, jtilepos, itest, ierr,
214 & mythid )
215 endif
216 _BARRIER
217
218 c******************************************************
219 c-- (A): get gradient component calculated via adjoint
220 c******************************************************
221
222 c-- get gradient component calculated via adjoint
223 if ( myProcId .EQ. grdchkwhichproc .AND.
224 & ierr .EQ. 0 ) then
225 call grdchk_getadxx( icvrec,
226 & itile, jtile, layer,
227 & itilepos, jtilepos,
228 & adxxmemo, mythid )
229 endif
230 _BARRIER
231
232 #ifdef ALLOW_TANGENTLINEAR_RUN
233 c******************************************************
234 c-- (B): Get gradient component g_fc from tangent linear run:
235 c******************************************************
236 c--
237 c-- 1. perturb control vector component: xx(i)=1.
238
239 if ( myProcId .EQ. grdchkwhichproc .AND.
240 & ierr .EQ. 0 ) then
241 localEps = 1. _d 0
242 call grdchk_getxx( icvrec, TANGENT_SIMULATION,
243 & itile, jtile, layer,
244 & itilepos, jtilepos,
245 & xxmemo_ref, xxmemo_pert, localEps,
246 & mythid )
247 endif
248 _BARRIER
249
250 c--
251 c-- 2. perform tangent linear run
252 mytime = starttime
253 myiter = niter0
254 cphadmtlm(
255 g_fc = 0.
256 cphadmtlm do j=1,sny
257 cphadmtlm do i=1,snx
258 cphadmtlm g_objf_state_final(i,j,1,1) = 0.
259 cphadmtlm enddo
260 cphadmtlm enddo
261 cphadmtlm)
262 call g_the_main_loop( mytime, myiter, mythid )
263 cphadmtlm(
264 ftlxxmemo = g_fc
265 cphadmtlm ftlxxmemo = g_objf_state_final(45,4,1,1)
266 cphadmtlm)
267 _BARRIER
268 c--
269 c-- 3. reset control vector
270 if ( myProcId .EQ. grdchkwhichproc .AND.
271 & ierr .EQ. 0 ) then
272 call grdchk_setxx( icvrec, TANGENT_SIMULATION,
273 & itile, jtile, layer,
274 & itilepos, jtilepos,
275 & xxmemo_ref, mythid )
276 endif
277 _BARRIER
278
279 #endif /* ALLOW_TANGENTLINEAR_RUN */
280
281
282 c******************************************************
283 c-- (C): Get gradient via finite difference perturbation
284 c******************************************************
285
286 c-- get control vector component from file
287 c-- perturb it and write back to file
288 c-- positive perturbation
289 localEps = abs(grdchk_eps)
290 if ( myProcId .EQ. grdchkwhichproc .AND.
291 & ierr .EQ. 0 ) then
292 call grdchk_getxx( icvrec, FORWARD_SIMULATION,
293 & itile, jtile, layer,
294 & itilepos, jtilepos,
295 & xxmemo_ref, xxmemo_pert, localEps,
296 & mythid )
297 endif
298 _BARRIER
299
300 c-- forward run with perturbed control vector
301 mytime = starttime
302 myiter = niter0
303 call the_main_loop( mytime, myiter, mythid )
304 cphadmtlm(
305 fcpertplus = fc
306 cphadmtlm fcpertplus = objf_state_final(45,4,1,1)
307 cphadmtlm)
308 print *, 'ph-check fcpertplus = ', fcpertplus
309 _BARRIER
310
311 c-- Reset control vector.
312 if ( myProcId .EQ. grdchkwhichproc .AND.
313 & ierr .EQ. 0 ) then
314 call grdchk_setxx( icvrec, FORWARD_SIMULATION,
315 & itile, jtile, layer,
316 & itilepos, jtilepos,
317 & xxmemo_ref, mythid )
318 endif
319 _BARRIER
320
321 fcpertminus = fcref
322 print *, 'ph-check fcpertminus = ', fcpertminus
323
324 if ( useCentralDiff ) then
325
326 c-- get control vector component from file
327 c-- perturb it and write back to file
328 c-- repeat the proceedure for a negative perturbation
329 if ( myProcId .EQ. grdchkwhichproc .AND.
330 & ierr .EQ. 0 ) then
331 localEps = - abs(grdchk_eps)
332 call grdchk_getxx( icvrec, FORWARD_SIMULATION,
333 & itile, jtile, layer,
334 & itilepos, jtilepos,
335 & xxmemo_ref, xxmemo_pert, localEps,
336 & mythid )
337 endif
338 _BARRIER
339
340 c-- forward run with perturbed control vector
341 mytime = starttime
342 myiter = niter0
343 call the_main_loop( mytime, myiter, mythid )
344 _BARRIER
345 fcpertminus = fc
346
347 c-- Reset control vector.
348 if ( myProcId .EQ. grdchkwhichproc .AND.
349 & ierr .EQ. 0 ) then
350 call grdchk_setxx( icvrec, FORWARD_SIMULATION,
351 & itile, jtile, layer,
352 & itilepos, jtilepos,
353 & xxmemo_ref, mythid )
354 endif
355 _BARRIER
356
357 c-- end of if useCentralDiff ...
358 end if
359
360 c******************************************************
361 c-- (D): calculate relative differences between gradients
362 c******************************************************
363
364 if ( myProcId .EQ. grdchkwhichproc .AND.
365 & ierr .EQ. 0 ) then
366
367 if ( grdchk_eps .eq. 0. ) then
368 gfd = (fcpertplus-fcpertminus)
369 else
370 gfd = (fcpertplus-fcpertminus)
371 & /(grdchk_epsfac*grdchk_eps)
372 endif
373
374 if ( adxxmemo .eq. 0. ) then
375 ratio_ad = abs( adxxmemo - gfd )
376 else
377 ratio_ad = 1. - gfd/adxxmemo
378 endif
379
380 if ( ftlxxmemo .eq. 0. ) then
381 ratio_ftl = abs( ftlxxmemo - gfd )
382 else
383 ratio_ftl = 1. - gfd/ftlxxmemo
384 endif
385
386 tmpplot1(itilepos,jtilepos,layer,itile,jtile)
387 & = gfd
388 tmpplot2(itilepos,jtilepos,layer,itile,jtile)
389 & = ratio_ad
390 tmpplot3(itilepos,jtilepos,layer,itile,jtile)
391 & = ratio_ftl
392
393 fcrmem ( ichknum ) = fcref
394 fcppmem ( ichknum ) = fcpertplus
395 fcpmmem ( ichknum ) = fcpertminus
396 xxmemref ( ichknum ) = xxmemo_ref
397 xxmempert ( ichknum ) = xxmemo_pert
398 gfdmem ( ichknum ) = gfd
399 adxxmem ( ichknum ) = adxxmemo
400 ftlxxmem ( ichknum ) = ftlxxmemo
401 ratioadmem ( ichknum ) = ratio_ad
402 ratioftlmem ( ichknum ) = ratio_ftl
403
404 irecmem ( ichknum ) = icvrec
405 bimem ( ichknum ) = itile
406 bjmem ( ichknum ) = jtile
407 ilocmem ( ichknum ) = itilepos
408 jlocmem ( ichknum ) = jtilepos
409 klocmem ( ichknum ) = layer
410 iobcsmem ( ichknum ) = obcspos
411 icompmem ( ichknum ) = icomp
412 ichkmem ( ichknum ) = ichknum
413 itestmem ( ichknum ) = itest
414 ierrmem ( ichknum ) = ierr
415
416 print *, 'grad-res -------------------------------'
417 print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
418 & myprocid,ichknum,itilepos,jtilepos,layer,
419 & fcref, fcpertplus, fcpertminus
420 #ifdef ALLOW_TANGENTLINEAR_RUN
421 print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
422 & myprocid,ichknum,ichkmem(ichknum),
423 & icompmem(ichknum),itestmem(ichknum),
424 & ftlxxmemo, gfd, ratio_ftl
425 WRITE(msgBuf,'(A34,2(1PE24.14,X))')
426 & 'precision_grdchk_result TLM ', fcref, ftlxxmemo
427 CALL PRINT_MESSAGE
428 & (msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
429 #else
430 print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
431 & myprocid,ichknum,ichkmem(ichknum),
432 & icompmem(ichknum),itestmem(ichknum),
433 & adxxmemo, gfd, ratio_ad
434 WRITE(msgBuf,'(A34,2(1PE24.14,X))')
435 & 'precision_grdchk_result ADM ', fcref, adxxmemo
436 CALL PRINT_MESSAGE
437 & (msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
438 #endif
439
440 endif
441
442 print *, 'ph-grd ierr ---------------------------'
443 print *, 'ph-grd ierr = ', ierr, ', icomp = ', icomp,
444 & ', ichknum = ', ichknum
445
446 _BARRIER
447
448 c-- else of if ( ichknum ...
449 else
450 ierr_grdchk = -1
451
452 c-- end of if ( ichknum ...
453 endif
454
455 c-- end of do icomp = ...
456 enddo
457
458 if ( myProcId .EQ. grdchkwhichproc ) then
459 CALL WRITE_REC_XYZ_RL(
460 & 'grd_findiff' , tmpplot1, 1, 0, myThid)
461 CALL WRITE_REC_XYZ_RL(
462 & 'grd_ratio_ad' , tmpplot2, 1, 0, myThid)
463 CALL WRITE_REC_XYZ_RL(
464 & 'grd_ratio_ftl' , tmpplot3, 1, 0, myThid)
465 endif
466
467 c-- Everyone has to wait for the component to be reset.
468 _BARRIER
469
470 c-- Print the results of the gradient check.
471 call grdchk_print( ichknum, ierr_grdchk, mythid )
472
473 #endif /* ALLOW_GRDCHK */
474
475 end

  ViewVC Help
Powered by ViewVC 1.1.22