/[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.14 - (hide 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 edhill 1.10 C
2 heimbach 1.14 C $Header: /u/gcmpack/MITgcm/pkg/grdchk/grdchk_main.F,v 1.13 2004/02/23 19:16:16 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.9 cphadmtlm fcref = objf_state_final(45,4,1,1)
159     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     cphadmtlm g_objf_state_final(i,j,1,1) = 0.
259     cphadmtlm enddo
260     cphadmtlm enddo
261     cphadmtlm)
262 heimbach 1.7 call g_the_main_loop( mytime, myiter, mythid )
263 heimbach 1.9 cphadmtlm(
264 heimbach 1.7 ftlxxmemo = g_fc
265 heimbach 1.9 cphadmtlm ftlxxmemo = g_objf_state_final(45,4,1,1)
266     cphadmtlm)
267 heimbach 1.7 _BARRIER
268 heimbach 1.6 c--
269     c-- 3. reset control vector
270 heimbach 1.7 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 heimbach 1.6
282     c******************************************************
283     c-- (C): Get gradient via finite difference perturbation
284     c******************************************************
285    
286 heimbach 1.2 c-- get control vector component from file
287 heimbach 1.7 c-- perturb it and write back to file
288 heimbach 1.6 c-- positive perturbation
289 heimbach 1.7 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 heimbach 1.2
300 heimbach 1.4 c-- forward run with perturbed control vector
301 heimbach 1.7 mytime = starttime
302     myiter = niter0
303     call the_main_loop( mytime, myiter, mythid )
304 heimbach 1.9 cphadmtlm(
305 heimbach 1.7 fcpertplus = fc
306 heimbach 1.9 cphadmtlm fcpertplus = objf_state_final(45,4,1,1)
307     cphadmtlm)
308 heimbach 1.13 print *, 'ph-check fcpertplus = ', fcpertplus
309 heimbach 1.7 _BARRIER
310 heimbach 1.4
311     c-- Reset control vector.
312 heimbach 1.7 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 heimbach 1.2
321 heimbach 1.7 fcpertminus = fcref
322 heimbach 1.13 print *, 'ph-check fcpertminus = ', fcpertminus
323 heimbach 1.4
324 heimbach 1.7 if ( useCentralDiff ) then
325 heimbach 1.4
326 heimbach 1.6 c-- get control vector component from file
327 heimbach 1.7 c-- perturb it and write back to file
328 heimbach 1.4 c-- repeat the proceedure for a negative perturbation
329 heimbach 1.7 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 heimbach 1.4
340 heimbach 1.2 c-- forward run with perturbed control vector
341 heimbach 1.7 mytime = starttime
342     myiter = niter0
343     call the_main_loop( mytime, myiter, mythid )
344     _BARRIER
345     fcpertminus = fc
346 heimbach 1.2
347 heimbach 1.4 c-- Reset control vector.
348 heimbach 1.7 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 heimbach 1.4
360 heimbach 1.6 c******************************************************
361     c-- (D): calculate relative differences between gradients
362     c******************************************************
363    
364 heimbach 1.7 if ( myProcId .EQ. grdchkwhichproc .AND.
365     & ierr .EQ. 0 ) then
366 heimbach 1.2
367 heimbach 1.7 if ( grdchk_eps .eq. 0. ) then
368     gfd = (fcpertplus-fcpertminus)
369     else
370     gfd = (fcpertplus-fcpertminus)
371     & /(grdchk_epsfac*grdchk_eps)
372     endif
373 heimbach 1.2
374 heimbach 1.7 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 heimbach 1.2 else
383 heimbach 1.7 ratio_ftl = 1. - gfd/ftlxxmemo
384 heimbach 1.2 endif
385 heimbach 1.7
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 heimbach 1.8 iobcsmem ( ichknum ) = obcspos
411 heimbach 1.7 icompmem ( ichknum ) = icomp
412     ichkmem ( ichknum ) = ichknum
413     itestmem ( ichknum ) = itest
414     ierrmem ( ichknum ) = ierr
415    
416 heimbach 1.12 print *, 'grad-res -------------------------------'
417     print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
418 heimbach 1.7 & myprocid,ichknum,itilepos,jtilepos,layer,
419     & fcref, fcpertplus, fcpertminus
420     #ifdef ALLOW_TANGENTLINEAR_RUN
421 heimbach 1.12 print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
422 heimbach 1.7 & myprocid,ichknum,ichkmem(ichknum),
423     & icompmem(ichknum),itestmem(ichknum),
424     & ftlxxmemo, gfd, ratio_ftl
425 heimbach 1.12 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 heimbach 1.7 #else
430 heimbach 1.12 print '(a,5I5,2x,3(1x,E15.9))', ' grad-res ',
431 heimbach 1.7 & myprocid,ichknum,ichkmem(ichknum),
432     & icompmem(ichknum),itestmem(ichknum),
433     & adxxmemo, gfd, ratio_ad
434 heimbach 1.12 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 heimbach 1.7 #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 heimbach 1.2 endif
454    
455 heimbach 1.7 c-- end of do icomp = ...
456     enddo
457 heimbach 1.2
458 heimbach 1.7 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 heimbach 1.2
467 heimbach 1.7 c-- Everyone has to wait for the component to be reset.
468     _BARRIER
469 heimbach 1.2
470     c-- Print the results of the gradient check.
471     call grdchk_print( ichknum, ierr_grdchk, mythid )
472    
473 heimbach 1.11 #endif /* ALLOW_GRDCHK */
474 heimbach 1.2
475     end

  ViewVC Help
Powered by ViewVC 1.1.22