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

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

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


Revision 1.15 - (hide annotations) (download)
Tue Oct 26 20:10:25 2004 UTC (19 years, 7 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint57m_post, checkpoint57g_pre, checkpoint57b_post, checkpoint57g_post, checkpoint56b_post, checkpoint57d_post, checkpoint57i_post, checkpoint57, checkpoint56, checkpoint55i_post, checkpoint57l_post, checkpoint57f_post, checkpoint57a_post, checkpoint57h_pre, checkpoint57h_post, checkpoint57c_post, checkpoint57c_pre, checkpoint55j_post, checkpoint57e_post, eckpoint57e_pre, checkpoint56a_post, checkpoint57h_done, checkpoint57j_post, checkpoint57f_pre, checkpoint56c_post, checkpoint57a_pre, checkpoint57k_post
Changes since 1.14: +6 -5 lines
Modified objf_state_final

1 edhill 1.10 C
2 heimbach 1.15 C $Header: /u/gcmpack/MITgcm/pkg/grdchk/grdchk_main.F,v 1.14 2004/03/23 19:42:53 heimbach Exp $
3 heimbach 1.11 C $Name: $
4 heimbach 1.2
5 edhill 1.10 #include "AD_CONFIG.h"
6 heimbach 1.2 #include "CPP_OPTIONS.h"
7    
8 heimbach 1.3 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 heimbach 1.2
53 heimbach 1.3 C !DESCRIPTION: \bv
54 heimbach 1.2 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 heimbach 1.4 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 heimbach 1.7 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 heimbach 1.4 c
70 heimbach 1.2 c ==================================================================
71     c SUBROUTINE grdchk_main
72     c ==================================================================
73 heimbach 1.3 C \ev
74 heimbach 1.2
75 heimbach 1.3 C !USES:
76 heimbach 1.2 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 heimbach 1.9 #ifdef ALLOW_TANGENTLINEAR_RUN
85     #include "g_cost.h"
86     #endif
87 heimbach 1.2
88 heimbach 1.3 C !INPUT/OUTPUT PARAMETERS:
89 heimbach 1.2 c == routine arguments ==
90     integer mythid
91    
92 heimbach 1.11 #ifdef ALLOW_GRDCHK
93 heimbach 1.3 C !LOCAL VARIABLES:
94 heimbach 1.2 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 heimbach 1.8 integer obcspos
110 heimbach 1.2 integer itilepos
111     integer jtilepos
112     integer itest
113     integer ierr
114     integer ierr_grdchk
115     _RL gfd
116     _RL fcref
117 heimbach 1.4 _RL fcpertplus, fcpertminus
118 heimbach 1.6 _RL ratio_ad
119     _RL ratio_ftl
120 heimbach 1.2 _RL xxmemo_ref
121     _RL xxmemo_pert
122     _RL adxxmemo
123 heimbach 1.6 _RL ftlxxmemo
124     _RL localEps
125     _RL grdchk_epsfac
126    
127 heimbach 1.7 _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 heimbach 1.12 CHARACTER*(MAX_LEN_MBUF) msgBuf
132    
133 heimbach 1.2 c == end of interface ==
134 heimbach 1.3 CEOP
135 heimbach 1.2
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 heimbach 1.7 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 heimbach 1.2
155 heimbach 1.9 ierr_grdchk = 0
156     cphadmtlm(
157 heimbach 1.2 fcref = fc
158 heimbach 1.15 cphadmtlm fcref = objf_state_final(45,4,1,1,1)
159 heimbach 1.9 cphadmtlm)
160    
161     print *, 'ph-check fcref = ', fcref
162 heimbach 1.2
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 heimbach 1.6 tmpplot3(i,j,k,bi,bj) = 0. _d 0
171 heimbach 1.2 end do
172     end do
173     end do
174     end do
175     end do
176    
177 heimbach 1.4 if ( useCentralDiff ) then
178     grdchk_epsfac = 2. _d 0
179     else
180     grdchk_epsfac = 1. _d 0
181     end if
182    
183 heimbach 1.12 print *, 'grad-res -------------------------------'
184 heimbach 1.7 print ('(2a)'),
185 heimbach 1.12 & ' grad-res proc # i j k fc ref',
186 heimbach 1.7 & ' fc + eps fc - eps'
187     #ifdef ALLOW_TANGENTLINEAR_RUN
188     print ('(2a)'),
189 heimbach 1.12 & ' grad-res proc # i j k tlm grad',
190 heimbach 1.7 & ' fd grad 1 - fd/tlm'
191     #else
192     print ('(2a)'),
193 heimbach 1.12 & ' grad-res proc # i j k adj grad',
194 heimbach 1.7 & ' fd grad 1 - fd/adj'
195     #endif
196    
197 heimbach 1.2 c-- Compute the finite difference approximations.
198     c-- Cycle through all processes doing NINT(nend-nbeg+1)/nstep
199     c-- gradient checks.
200 heimbach 1.14
201     if ( nbeg .EQ. 0 ) call grdchk_get_position( mythid )
202 heimbach 1.2
203 heimbach 1.7 do icomp = nbeg, nend, nstep
204 heimbach 1.2
205 heimbach 1.7 ichknum = (icomp - nbeg)/nstep + 1
206 heimbach 1.2
207 heimbach 1.7 if (ichknum .le. maxgrdchecks ) then
208 heimbach 1.2
209 heimbach 1.7 c-- Determine the location of icomp on the grid.
210     if ( myProcId .EQ. grdchkwhichproc ) then
211     call grdchk_loc( icomp, ichknum,
212 heimbach 1.8 & icvrec, itile, jtile, layer, obcspos,
213 heimbach 1.7 & itilepos, jtilepos, itest, ierr,
214     & mythid )
215     endif
216     _BARRIER
217 heimbach 1.2
218 heimbach 1.6 c******************************************************
219     c-- (A): get gradient component calculated via adjoint
220     c******************************************************
221 heimbach 1.7
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 heimbach 1.4
232 heimbach 1.6 #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 heimbach 1.7 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 heimbach 1.6
250     c--
251     c-- 2. perform tangent linear run
252 heimbach 1.7 mytime = starttime
253     myiter = niter0
254 heimbach 1.9 cphadmtlm(
255 heimbach 1.7 g_fc = 0.
256 heimbach 1.9 cphadmtlm do j=1,sny
257     cphadmtlm do i=1,snx
258 heimbach 1.15 cphadmtlm g_objf_state_final(i,j,1,1,1) = 0.
259     cphadmtlm g_objf_state_final(i,j,1,1,2) = 0.
260 heimbach 1.9 cphadmtlm enddo
261     cphadmtlm enddo
262     cphadmtlm)
263 heimbach 1.7 call g_the_main_loop( mytime, myiter, mythid )
264 heimbach 1.9 cphadmtlm(
265 heimbach 1.7 ftlxxmemo = g_fc
266 heimbach 1.15 cphadmtlm ftlxxmemo = g_objf_state_final(45,4,1,1,1)
267 heimbach 1.9 cphadmtlm)
268 heimbach 1.7 _BARRIER
269 heimbach 1.6 c--
270     c-- 3. reset control vector
271 heimbach 1.7 if ( myProcId .EQ. grdchkwhichproc .AND.
272     & ierr .EQ. 0 ) then
273     call grdchk_setxx( icvrec, TANGENT_SIMULATION,
274     & itile, jtile, layer,
275     & itilepos, jtilepos,
276     & xxmemo_ref, mythid )
277     endif
278     _BARRIER
279    
280     #endif /* ALLOW_TANGENTLINEAR_RUN */
281    
282 heimbach 1.6
283     c******************************************************
284     c-- (C): Get gradient via finite difference perturbation
285     c******************************************************
286    
287 heimbach 1.2 c-- get control vector component from file
288 heimbach 1.7 c-- perturb it and write back to file
289 heimbach 1.6 c-- positive perturbation
290 heimbach 1.7 localEps = abs(grdchk_eps)
291     if ( myProcId .EQ. grdchkwhichproc .AND.
292     & ierr .EQ. 0 ) then
293     call grdchk_getxx( icvrec, FORWARD_SIMULATION,
294     & itile, jtile, layer,
295     & itilepos, jtilepos,
296     & xxmemo_ref, xxmemo_pert, localEps,
297     & mythid )
298     endif
299     _BARRIER
300 heimbach 1.2
301 heimbach 1.4 c-- forward run with perturbed control vector
302 heimbach 1.7 mytime = starttime
303     myiter = niter0
304     call the_main_loop( mytime, myiter, mythid )
305 heimbach 1.9 cphadmtlm(
306 heimbach 1.7 fcpertplus = fc
307 heimbach 1.15 cphadmtlm fcpertplus = objf_state_final(45,4,1,1,1)
308 heimbach 1.9 cphadmtlm)
309 heimbach 1.13 print *, 'ph-check fcpertplus = ', fcpertplus
310 heimbach 1.7 _BARRIER
311 heimbach 1.4
312     c-- Reset control vector.
313 heimbach 1.7 if ( myProcId .EQ. grdchkwhichproc .AND.
314     & ierr .EQ. 0 ) then
315     call grdchk_setxx( icvrec, FORWARD_SIMULATION,
316     & itile, jtile, layer,
317     & itilepos, jtilepos,
318     & xxmemo_ref, mythid )
319     endif
320     _BARRIER
321 heimbach 1.2
322 heimbach 1.7 fcpertminus = fcref
323 heimbach 1.13 print *, 'ph-check fcpertminus = ', fcpertminus
324 heimbach 1.4
325 heimbach 1.7 if ( useCentralDiff ) then
326 heimbach 1.4
327 heimbach 1.6 c-- get control vector component from file
328 heimbach 1.7 c-- perturb it and write back to file
329 heimbach 1.4 c-- repeat the proceedure for a negative perturbation
330 heimbach 1.7 if ( myProcId .EQ. grdchkwhichproc .AND.
331     & ierr .EQ. 0 ) then
332     localEps = - abs(grdchk_eps)
333     call grdchk_getxx( icvrec, FORWARD_SIMULATION,
334     & itile, jtile, layer,
335     & itilepos, jtilepos,
336     & xxmemo_ref, xxmemo_pert, localEps,
337     & mythid )
338     endif
339     _BARRIER
340 heimbach 1.4
341 heimbach 1.2 c-- forward run with perturbed control vector
342 heimbach 1.7 mytime = starttime
343     myiter = niter0
344     call the_main_loop( mytime, myiter, mythid )
345     _BARRIER
346     fcpertminus = fc
347 heimbach 1.2
348 heimbach 1.4 c-- Reset control vector.
349 heimbach 1.7 if ( myProcId .EQ. grdchkwhichproc .AND.
350     & ierr .EQ. 0 ) then
351     call grdchk_setxx( icvrec, FORWARD_SIMULATION,
352     & itile, jtile, layer,
353     & itilepos, jtilepos,
354     & xxmemo_ref, mythid )
355     endif
356     _BARRIER
357    
358     c-- end of if useCentralDiff ...
359     end if
360 heimbach 1.4
361 heimbach 1.6 c******************************************************
362     c-- (D): calculate relative differences between gradients
363     c******************************************************
364    
365 heimbach 1.7 if ( myProcId .EQ. grdchkwhichproc .AND.
366     & ierr .EQ. 0 ) then
367 heimbach 1.2
368 heimbach 1.7 if ( grdchk_eps .eq. 0. ) then
369     gfd = (fcpertplus-fcpertminus)
370     else
371     gfd = (fcpertplus-fcpertminus)
372     & /(grdchk_epsfac*grdchk_eps)
373     endif
374 heimbach 1.2
375 heimbach 1.7 if ( adxxmemo .eq. 0. ) then
376     ratio_ad = abs( adxxmemo - gfd )
377     else
378     ratio_ad = 1. - gfd/adxxmemo
379     endif
380    
381     if ( ftlxxmemo .eq. 0. ) then
382     ratio_ftl = abs( ftlxxmemo - gfd )
383 heimbach 1.2 else
384 heimbach 1.7 ratio_ftl = 1. - gfd/ftlxxmemo
385 heimbach 1.2 endif
386 heimbach 1.7
387     tmpplot1(itilepos,jtilepos,layer,itile,jtile)
388     & = gfd
389     tmpplot2(itilepos,jtilepos,layer,itile,jtile)
390     & = ratio_ad
391     tmpplot3(itilepos,jtilepos,layer,itile,jtile)
392     & = ratio_ftl
393    
394     fcrmem ( ichknum ) = fcref
395     fcppmem ( ichknum ) = fcpertplus
396     fcpmmem ( ichknum ) = fcpertminus
397     xxmemref ( ichknum ) = xxmemo_ref
398     xxmempert ( ichknum ) = xxmemo_pert
399     gfdmem ( ichknum ) = gfd
400     adxxmem ( ichknum ) = adxxmemo
401     ftlxxmem ( ichknum ) = ftlxxmemo
402     ratioadmem ( ichknum ) = ratio_ad
403     ratioftlmem ( ichknum ) = ratio_ftl
404    
405     irecmem ( ichknum ) = icvrec
406     bimem ( ichknum ) = itile
407     bjmem ( ichknum ) = jtile
408     ilocmem ( ichknum ) = itilepos
409     jlocmem ( ichknum ) = jtilepos
410     klocmem ( ichknum ) = layer
411 heimbach 1.8 iobcsmem ( ichknum ) = obcspos
412 heimbach 1.7 icompmem ( ichknum ) = icomp
413     ichkmem ( ichknum ) = ichknum
414     itestmem ( ichknum ) = itest
415     ierrmem ( ichknum ) = ierr
416    
417 heimbach 1.12 print *, 'grad-res -------------------------------'
418     print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
419 heimbach 1.7 & myprocid,ichknum,itilepos,jtilepos,layer,
420     & fcref, fcpertplus, fcpertminus
421     #ifdef ALLOW_TANGENTLINEAR_RUN
422 heimbach 1.12 print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
423 heimbach 1.7 & myprocid,ichknum,ichkmem(ichknum),
424     & icompmem(ichknum),itestmem(ichknum),
425     & ftlxxmemo, gfd, ratio_ftl
426 heimbach 1.12 WRITE(msgBuf,'(A34,2(1PE24.14,X))')
427     & 'precision_grdchk_result TLM ', fcref, ftlxxmemo
428     CALL PRINT_MESSAGE
429     & (msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
430 heimbach 1.7 #else
431 heimbach 1.12 print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
432 heimbach 1.7 & myprocid,ichknum,ichkmem(ichknum),
433     & icompmem(ichknum),itestmem(ichknum),
434     & adxxmemo, gfd, ratio_ad
435 heimbach 1.12 WRITE(msgBuf,'(A34,2(1PE24.14,X))')
436     & 'precision_grdchk_result ADM ', fcref, adxxmemo
437     CALL PRINT_MESSAGE
438     & (msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
439 heimbach 1.7 #endif
440    
441     endif
442    
443     print *, 'ph-grd ierr ---------------------------'
444     print *, 'ph-grd ierr = ', ierr, ', icomp = ', icomp,
445     & ', ichknum = ', ichknum
446    
447     _BARRIER
448    
449     c-- else of if ( ichknum ...
450     else
451     ierr_grdchk = -1
452    
453     c-- end of if ( ichknum ...
454 heimbach 1.2 endif
455    
456 heimbach 1.7 c-- end of do icomp = ...
457     enddo
458 heimbach 1.2
459 heimbach 1.7 if ( myProcId .EQ. grdchkwhichproc ) then
460     CALL WRITE_REC_XYZ_RL(
461     & 'grd_findiff' , tmpplot1, 1, 0, myThid)
462     CALL WRITE_REC_XYZ_RL(
463     & 'grd_ratio_ad' , tmpplot2, 1, 0, myThid)
464     CALL WRITE_REC_XYZ_RL(
465     & 'grd_ratio_ftl' , tmpplot3, 1, 0, myThid)
466     endif
467 heimbach 1.2
468 heimbach 1.7 c-- Everyone has to wait for the component to be reset.
469     _BARRIER
470 heimbach 1.2
471     c-- Print the results of the gradient check.
472     call grdchk_print( ichknum, ierr_grdchk, mythid )
473    
474 heimbach 1.11 #endif /* ALLOW_GRDCHK */
475 heimbach 1.2
476     end

  ViewVC Help
Powered by ViewVC 1.1.22