/[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.37 - (hide annotations) (download)
Wed Aug 15 23:05:48 2012 UTC (11 years, 9 months ago) by jmc
Branch: MAIN
Changes since 1.36: +15 -24 lines
- change format of TLM output (for testreport)
- remove all BARRIER calls (most were not needed; to check in multi-threads)

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

  ViewVC Help
Powered by ViewVC 1.1.22