source: CIVL/examples/compare/provesa/ADFirstAidKit/debugAD.f@ bb03188

main test-branch
Last change on this file since bb03188 was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 30.3 KB
Line 
1C PRIMITIVES FOR DEBUGGING THE TANGENT AND ADJOINT CODES GENERATED BY TAPENADE.
2C These primitives are called by the code produced by Tapenade when using
3C the differentiation command-line options -debugTGT and -debugADJ.
4
5C GLOBAL VARIABLES DEFINED IN debugAD.inc:
6C-----------------------------------------
7C dbad_mode is 1 when running divided-differences test to validate the tangent mode
8C -1 when running dot-product test to validate the adjoint mode.
9C dbad_phase is 1 for the 1st executable that is called for the test
10C 2 for the 2nd executable that is called for the test
11C Both tests are run by calling $> exe1 | exe2
12C dbad_file is the file that is used to make exe1 communicate towards exe2
13C by default it is std_out (6) in phase 1, and std_in (5) in phase 2.
14C It's not actually parametrable, but one may change this
15C if std_in or std_out are unavailable.
16C dbad_ddeps is the epsilon used by divided-differences test ONLY.
17C The test 1st order, not centered.
18C dbad_ddeps is not used in the dot-product test.
19C dbad_ddeps is set by DEBUG_TGT_INIT[1,2], as its 1st argument.
20C dbad_epszero is the absolute value under which a derivative is
21C considered to be in fact zero. It is used in both tests
22C to eliminate differences between a zero deriv and an undefined deriv.
23C dbad_epszero is set by DEBUG_TGT_INIT[1,2], as its 2nd argument,
24C and by DEBUG_[F,B]WD_INIT, as its 1st argument.
25C dbad_errormax is the percentage of difference above which a "difference"
26C message is issued. In divided-differences test, this is about
27C the comparison of tgt diff wrt divided-differences.
28C In dot-product mode, this is about the comparison between
29C the (sum of the) bwd Jacobian wrt the (sum of the) tgt Jacobian.
30C dbad_errormax is set by DEBUG_TGT_INIT[1,2], as its 3rd argument,
31C and by DEBUG_[F,B]WD_INIT, as its 2nd argument.
32C dbad_seed is the increment used to "randomize" the X_d and Y_b used in the
33C dot-product test. X_d and Y_d are filled with values in [1.d0 , 2.d0[,
34C starting with 1.d0 and incremented by steps of dbad_seed.
35C dbad_seed is set by DEBUG_[F,B]WD_INIT, as its 3rd argument.
36C dbad_callsz is the max depth of nested calls during execution.
37C It is set by default to 99 in debugAD.inc.
38C It may be changed in debugAD.inc, if needed.
39C dbad_callnames is the stack of the procedure names in the current call stack.
40C These names are stored without the _D or _B extension.
41C dbad_callcodes is a stack of codes of the current call stack.
42C It is currently not used and may disappear sone day.
43C dbad_calltraced is a stack of booleans on the current call stack.
44C "true" means that the current call is being traced.
45C A "false" means not traced, and implies a "false" in all
46C deeper calls. In divided-differences test ONLY, this can be
47C overriden by passing "true" as the 3rd argument of
48C DEBUG_TGT_CALL or DEBUG_TGT_HERE.
49
50 BLOCK DATA DEBUG_AD
51 IMPLICIT NONE
52 INCLUDE 'debugAD.inc'
53 DATA dbad_callindex/0/
54 DATA dbad_sum/0.d0/
55 DATA dbad_coeff/1.d0/
56 DATA dbad_seed/0.137d0/
57 END
58
59C DEBUG PRIMITIVES FOR THE TANGENT MODE (DIVIDED-DIFFERENCES METHOD)
60
61 SUBROUTINE DEBUG_TGT_INIT1(epsilon, ezero, errmax)
62 IMPLICIT NONE
63 REAL*8 epsilon, ezero, errmax
64 INCLUDE 'debugAD.inc'
65 dbad_mode = 1
66 dbad_phase = 1
67 dbad_file = 6
68 dbad_ddeps = epsilon
69 dbad_epszero = ezero
70 dbad_errormax = errmax
71 end
72
73 SUBROUTINE DEBUG_TGT_INIT2(epsilon, ezero, errmax)
74 IMPLICIT NONE
75 REAL*8 epsilon, ezero, errmax
76 INCLUDE 'debugAD.inc'
77 dbad_mode = 1
78 dbad_phase = 2
79 dbad_file = 5
80 dbad_ddeps = epsilon
81 dbad_epszero = ezero
82 dbad_errormax = errmax
83 write (*,'("Starting TGT test, epsilon=",e8.1,
84 + ", zero=",e8.1,", errmax=",f4.1,"%")'),
85 + epsilon,ezero,errmax
86 write (*,
87 +'("===========================================================")')
88 end
89
90 SUBROUTINE DEBUG_TGT_INITREAL4(indep, indepd)
91 IMPLICIT NONE
92 REAL*4 indep, indepd
93 INCLUDE 'debugAD.inc'
94 if (dbad_phase.eq.1) then
95 indep = indep+dbad_ddeps*indepd
96 endif
97 end
98
99 SUBROUTINE DEBUG_TGT_INITREAL4ARRAY(indep, indepd, length)
100 IMPLICIT NONE
101 INTEGER length
102 REAL*4 indep(length), indepd(length)
103 INCLUDE 'debugAD.inc'
104 INTEGER i
105 if (dbad_phase.eq.1) then
106 do i=1,length
107 indep(i) = indep(i)+dbad_ddeps*indepd(i)
108 enddo
109 endif
110 end
111
112 SUBROUTINE DEBUG_TGT_INITREAL8(indep, indepd)
113 IMPLICIT NONE
114 REAL*8 indep, indepd
115 INCLUDE 'debugAD.inc'
116 if (dbad_phase.eq.1) then
117 indep = indep+dbad_ddeps*indepd
118 endif
119 end
120
121 SUBROUTINE DEBUG_TGT_INITREAL8ARRAY(indep, indepd, length)
122 IMPLICIT NONE
123 INTEGER length
124 REAL*8 indep(length), indepd(length)
125 INCLUDE 'debugAD.inc'
126 INTEGER i
127 if (dbad_phase.eq.1) then
128 do i=1,length
129 indep(i) = indep(i)+dbad_ddeps*indepd(i)
130 enddo
131 endif
132 end
133
134 SUBROUTINE DEBUG_TGT_CONCLUDEREAL4(varname, var, vard)
135 IMPLICIT NONE
136 character varname*(*)
137 real*4 var, vard
138 INCLUDE 'debugAD.inc'
139 REAL*4 ddvar, dd, diff, varwr
140 LOGICAL areNaNs
141 if (dbad_phase.eq.1) then
142 write (dbad_file, '(a)') 'final_result'
143 write (dbad_file, *) var
144 else
145 call DDCHECKVARNAME('final_result')
146 call DDPICKTWO4(var, varwr, dbad_file, ddvar, areNaNs)
147 if (.not.areNaNs) then
148 dd = (ddvar-varwr)/dbad_ddeps
149 diff = (abs(vard-dd)*100.0)/ max(abs(vard),abs(dd))
150 write (*,'("Final result",a20,": ",e20.8," (ad)",
151 + f9.5,"% DIFF WITH (dd) ",e20.8)')
152 + varname,vard,diff,dd
153 else
154 write (*, '(a)') 'Final result has NaNs'
155 endif
156 endif
157 write (*,
158 +'("===========================================================")')
159 END
160
161 SUBROUTINE DEBUG_TGT_CONCLUDEREAL4ARRAY
162 + (varname, tvar, tvard, length)
163 IMPLICIT NONE
164 integer length
165 real*4 tvar(length)
166 real*4 tvard(length)
167 character varname*(*)
168 REAL*4 var, vard
169 INTEGER i
170 var = 0.0
171 vard = 0.0
172 DO i=1,length
173 var = var + tvar(i)
174 vard = vard + tvard(i)
175 ENDDO
176 call DEBUG_TGT_CONCLUDEREAL4(varname, var, vard)
177 END
178
179 SUBROUTINE DEBUG_TGT_CONCLUDEREAL8(varname, var, vard)
180 IMPLICIT NONE
181 character varname*(*)
182 real*8 var, vard
183 INCLUDE 'debugAD.inc'
184 REAL*8 ddvar, dd, diff, varwr
185 LOGICAL areNaNs
186 if (dbad_phase.eq.1) then
187 write (dbad_file, '(a)') 'final_result'
188 write (dbad_file, *) var
189 else
190 call DDCHECKVARNAME('final_result')
191 call DDPICKTWO8(var, varwr, dbad_file, ddvar, areNaNs)
192 if (.not.areNaNs) then
193 dd = (ddvar-varwr)/dbad_ddeps
194 diff = (abs(vard-dd)*100.0)/ max(abs(vard),abs(dd))
195 write (*,'("Final result",a20,": ",e24.16," (ad)",
196 + f9.5,"% DIFF WITH (dd) ",e24.16)')
197 + varname,vard,diff,dd
198 else
199 write (*, '(a)') 'Final result has NaNs'
200 endif
201 endif
202 write (*,
203 +'("===========================================================")')
204 END
205
206 SUBROUTINE DEBUG_TGT_CONCLUDEREAL8ARRAY
207 + (varname, tvar, tvard, length)
208 IMPLICIT NONE
209 integer length
210 real*8 tvar(length)
211 real*8 tvard(length)
212 character varname*(*)
213 REAL*8 var, vard
214 INTEGER i
215 var = 0.d0
216 vard = 0.d0
217 DO i=1,length
218 var = var + tvar(i)
219 vard = vard + tvard(i)
220 ENDDO
221 call DEBUG_TGT_CONCLUDEREAL8(varname, var, vard)
222 END
223
224 SUBROUTINE DEBUG_TGT_CALL(unitname, traced, forcetraced)
225 IMPLICIT NONE
226 CHARACTER unitname*(*)
227 LOGICAL traced, forcetraced
228 INCLUDE 'debugAD.inc'
229 dbad_callindex = dbad_callindex+1
230 write (dbad_callnames(dbad_callindex),'(a40)') unitname
231 dbad_calltraced(dbad_callindex) =
232 + ((dbad_callindex.eq.1.OR.
233 + dbad_calltraced(dbad_callindex-1))
234 + .AND.traced) .OR. forcetraced
235 END
236
237 SUBROUTINE DEBUG_TGT_EXIT()
238 IMPLICIT NONE
239 INCLUDE 'debugAD.inc'
240 dbad_callindex = dbad_callindex-1
241 END
242
243 LOGICAL FUNCTION DEBUG_TGT_HERE(placename, forcetraced)
244 IMPLICIT NONE
245 CHARACTER placename*(*)
246 LOGICAL forcetraced
247 INCLUDE 'debugAD.inc'
248 DEBUG_TGT_HERE =
249 + (dbad_callindex.eq.0.OR.dbad_calltraced(dbad_callindex))
250 + .OR.forcetraced
251 RETURN
252 END
253
254 SUBROUTINE DEBUG_TGT_REAL4(varname, var, vard)
255 IMPLICIT NONE
256 character varname*(*)
257 REAL*4 var, vard
258 INCLUDE 'debugAD.inc'
259 REAL*4 ddvar, dd, diff, varwr
260 LOGICAL areNaNs
261 character*12 diffstr
262 character*50 ddvarname
263 if (dbad_phase.eq.1) then
264 WRITE(dbad_file, '(a)') varname
265 WRITE(dbad_file, *) var
266 else if (dbad_phase.eq.2) then
267 call DDCHECKVARNAME(varname)
268 call DDPICKTWO4(var, varwr, dbad_file, ddvar, areNaNs)
269 if (.not.areNaNs) then
270 dd = (ddvar-varwr)/dbad_ddeps
271 if ((abs(vard).gt.dbad_epszero)
272 + .or.(abs(dd).gt.dbad_epszero)) then
273 diff = (abs(vard-dd)*100.0)/max(abs(vard),abs(dd))
274 if (diff.gt.dbad_errormax) then
275 diffstr = 'DIFFERENCE!!'
276 else
277 diffstr = ' '
278 endif
279 write (*,'(" ", a,":",e11.4,
280 + " (dd:",e11.4,") ",a14)')
281 + varname, vard, dd, diffstr
282 endif
283 endif
284 endif
285 END
286
287 SUBROUTINE DEBUG_TGT_REAL4ARRAY (varname, var, vard, length)
288 IMPLICIT NONE
289 integer length
290 real*4 var(length)
291 real*4 vard(length)
292 character varname*(*)
293 INCLUDE 'debugAD.inc'
294 real*4 ddvar, dd, diff, varwr
295 real*4 valbuf(10),ddbuf(10)
296 character*50 ddvarname
297 integer indexbuf1(10)
298 character*14 diffbuf(10)
299 integer i1,j
300 integer ibuf
301 logical notprintedheader
302 LOGICAL areNaNs
303 if (dbad_phase.eq.1) then
304 WRITE(dbad_file, '(a)') varname
305 do i1=1,length
306 WRITE(dbad_file, *) var(i1)
307 enddo
308 else if (dbad_phase.eq.2) then
309 call DDCHECKVARNAME(varname)
310 notprintedheader=.true.
311 ibuf = 1
312 do i1=1,length
313 call DDPICKTWO4(var(i1),varwr,dbad_file,ddvar,areNaNs)
314 if (.not.areNaNs) then
315 dd = (ddvar-varwr)/dbad_ddeps
316 if ((abs(vard(i1)).gt.dbad_epszero)
317 + .or.(abs(dd).gt.dbad_epszero)) then
318 valbuf(ibuf) = vard(i1)
319 ddbuf(ibuf) = dd
320 indexbuf1(ibuf) = i1
321 diff = (abs(vard(i1)-dd)*100.0)
322 + /max(abs(vard(i1)),abs(dd))
323 if (diff.gt.dbad_errormax) then
324 diffbuf(ibuf) = ' DIFFERENCE!!'
325 ibuf = ibuf+1
326 else
327! diffbuf(ibuf) = ' '
328! ibuf = ibuf+1
329 endif
330 endif
331 endif
332 if(ibuf.gt.10.or.(i1.eq.length.and.ibuf.gt.1)) then
333 if (notprintedheader) then
334 write(*,'(" ", a, ":")') varname
335 notprintedheader=.false.
336 endif
337 write (*, '(" ", 10(i4,"->",e11.4))')
338 + (indexbuf1(j),valbuf(j), j=1,ibuf-1)
339 write (*, '(" (dd:)", 10(" (",e11.4,")"))')
340 + (ddbuf(j), j=1,ibuf-1)
341 write (*, '(" ", 10(a16))')
342 + (diffbuf(j), j=1,ibuf-1)
343 ibuf = 1
344 endif
345 end do
346 endif
347 END
348
349 SUBROUTINE DDPICKTWO4(var, varwr, dbad_file, ddvar, areNaNs)
350 IMPLICIT NONE
351 REAL*4 var,varwr,ddvar
352 LOGICAL areNaNs
353 INTEGER dbad_file,stat1,stat2
354 OPEN(38, FILE='ddwrfile')
355 WRITE(38, *) var
356 REWIND(38)
357 READ(38, *,IOSTAT=stat1) varwr
358 CLOSE(38)
359 READ(dbad_file, *,IOSTAT=stat2) ddvar
360 areNaNs = stat1.eq.225.and.stat2.eq.225
361 END
362
363 SUBROUTINE DEBUG_TGT_REAL8(varname, var, vard)
364 IMPLICIT NONE
365 CHARACTER varname*(*)
366 REAL*8 var, vard
367 INCLUDE 'debugAD.inc'
368 REAL*8 ddvar, dd, diff, varwr
369 character*12 diffstr
370 character*50 ddvarname
371 LOGICAL areNaNs
372 if (dbad_phase.eq.1) then
373 WRITE(dbad_file, '(a)') varname
374 WRITE(dbad_file, *) var
375 else if (dbad_phase.eq.2) then
376 call DDCHECKVARNAME(varname)
377 call DDPICKTWO8(var, varwr, dbad_file, ddvar, areNaNs)
378 if (.not.areNaNs) then
379 dd = (ddvar-varwr)/dbad_ddeps
380 if ((abs(vard).gt.dbad_epszero)
381 + .or.(abs(dd).gt.dbad_epszero)) then
382 diff = (abs(vard-dd)*100.0)/ max(abs(vard),abs(dd))
383 if (diff.gt.dbad_errormax) then
384 diffstr = 'DIFFERENCE!!'
385 write (*,'(a20,": ",e24.16," (ad)",
386 + f5.1,"% DIFF WITH (dd) ",e24.16)')
387 + varname, vard, diff, dd
388 else
389 diffstr = ' '
390 endif
391! write (*,*) ddvar,varwr,dd,'=?=',vard,' %',diff,varname
392! write (*,*) varname, vard, 'dd:', dd, diffstr
393 endif
394 endif
395 endif
396 END
397
398 SUBROUTINE DEBUG_TGT_REAL8v(varname, var, vard)
399 IMPLICIT NONE
400 CHARACTER varname*(*)
401 REAL*8 var, vard
402 INCLUDE 'debugAD.inc'
403 REAL*8 ddvar, dd, diff, varwr
404 character*12 diffstr
405 character*50 ddvarname
406 LOGICAL areNaNs
407 if (dbad_phase.eq.1) then
408 WRITE(dbad_file, '(a)') varname
409 WRITE(dbad_file, *) var
410 else if (dbad_phase.eq.2) then
411 call DDCHECKVARNAME(varname)
412 call DDPICKTWO8(var, varwr, dbad_file, ddvar, areNaNs)
413 if (.not.areNaNs) then
414 dd = (ddvar-varwr)/dbad_ddeps
415 if ((abs(vard).gt.dbad_epszero)
416 + .or.(abs(dd).gt.dbad_epszero)) then
417 diff = (abs(vard-dd)*100.0)/ max(abs(vard),abs(dd))
418 if (diff.gt.dbad_errormax) then
419 diffstr = 'DIFFERENCE!!'
420 write (*,'(a20,": ",e24.16," (ad)",
421 + f5.1,"% DIFF WITH (dd) ",e24.16)')
422 + varname, vard, diff, dd
423 else
424 diffstr = ' '
425 endif
426 write (*,*) varname,ddvar,varwr,dd,'=?=',vard,' %',diff
427 else
428 write (*,*) varname,ddvar,varwr,dd,'=?zero?=',vard
429 endif
430 endif
431 endif
432 END
433
434 SUBROUTINE DEBUG_TGT_REAL8ARRAY(varname, var, vard, length)
435 IMPLICIT NONE
436 integer length
437 real*8 var(length)
438 real*8 vard(length)
439 character varname*(*)
440 INCLUDE 'debugAD.inc'
441 LOGICAL areNaNs
442 real*8 ddvar, dd, diff, varwr
443 real*8 valbuf(10),ddbuf(10)
444 character*50 ddvarname
445 integer indexbuf1(10)
446 character*14 diffbuf(10)
447 integer i1,j
448 integer ibuf
449 logical notprintedheader
450 if (dbad_phase.eq.1) then
451 WRITE(dbad_file, '(a)') varname
452 do i1=1,length
453 WRITE(dbad_file, *) var(i1)
454 enddo
455 else if (dbad_phase.eq.2) then
456 call DDCHECKVARNAME(varname)
457 notprintedheader=.true.
458 ibuf = 1
459 do i1=1,length
460 call DDPICKTWO8(var(i1),varwr,dbad_file,ddvar,areNaNs)
461 if (.not.areNaNs) then
462 dd = (ddvar-varwr)/dbad_ddeps
463 if ((abs(vard(i1)).gt.dbad_epszero)
464 + .or.(abs(dd).gt.dbad_epszero)) then
465 valbuf(ibuf) = vard(i1)
466 ddbuf(ibuf) = dd
467 indexbuf1(ibuf) = i1
468 diff = (abs(vard(i1)-dd)*100.0)
469 + /max(abs(vard(i1)),abs(dd))
470 if (diff.gt.dbad_errormax) then
471 diffbuf(ibuf) = ' DIFFERENCE!!'
472 ibuf = ibuf+1
473 else
474! diffbuf(ibuf) = ' '
475! ibuf = ibuf+1
476 endif
477 endif
478 endif
479 if(ibuf.gt.10.or.(i1.eq.length.and.ibuf.gt.1)) then
480 if (notprintedheader) then
481 write(*,'(" ", a, ":")') varname
482 notprintedheader=.false.
483 endif
484 write (*, '(" ", 10(i4,"->",e11.4))')
485 + (indexbuf1(j),valbuf(j), j=1,ibuf-1)
486 write (*, '(" (dd:)", 10(" (",e11.4,")"))')
487 + (ddbuf(j), j=1,ibuf-1)
488 write (*, '(" ", 10(a16))')
489 + (diffbuf(j), j=1,ibuf-1)
490 ibuf = 1
491 endif
492 end do
493 endif
494 END
495
496 SUBROUTINE DDPICKTWO8(var, varwr, dbad_file, ddvar, areNaNs)
497 IMPLICIT NONE
498 REAL*8 var,varwr,ddvar
499 LOGICAL areNaNs
500 INTEGER dbad_file,stat1,stat2
501 OPEN(38, FILE='ddwrfile')
502 WRITE(38, *) var
503 REWIND(38)
504 READ(38, *,IOSTAT=stat1) varwr
505 CLOSE(38)
506 READ(dbad_file, *,IOSTAT=stat2) ddvar
507 areNaNs = stat1.eq.225.and.stat2.eq.225
508 END
509
510 SUBROUTINE DDCHECKVARNAME(varname)
511 IMPLICIT NONE
512 character varname*(*)
513 INCLUDE 'debugAD.inc'
514 character*50 ddvarname
515 integer linesskip
516 linesskip = 0
517 100 CONTINUE
518 if (linesskip.GT.990000) THEN
519 write(*,*)
520 + 'ERROR: Too many lines skipped. Bad DD program control ?'
521 write(*,*) 'Was looking for variable:',varname
522 STOP
523 ENDIF
524 READ(dbad_file, '(a)') ddvarname
525 if (ddvarname.ne.varname) then
526! write(*,*) 'ERROR: mismatch in DD program control !!!',
527! + ' read ', ddvarname, ' expecting ', varname
528 linesskip = linesskip+1
529 GOTO 100
530 endif
531 END
532
533 SUBROUTINE DEBUG_TGT_DISPLAY(placename)
534 IMPLICIT NONE
535 CHARACTER placename*(*)
536 INCLUDE 'debugAD.inc'
537 if (dbad_phase.eq.2) then
538 CALL DEBUG_DISPLAY_LOCATION(placename)
539 endif
540 END
541
542C DEBUG PRIMITIVES FOR THE ADJOINT MODE, BACKWARD SWEEP (DOT-PRODUCT METHOD)
543
544 SUBROUTINE DEBUG_BWD_INIT(ezero, errmax, seed)
545 IMPLICIT NONE
546 REAL*8 ezero, errmax, seed
547 INCLUDE 'debugAD.inc'
548 dbad_mode = -1
549 dbad_phase = 1
550 dbad_file = 6
551 dbad_epszero = ezero
552 dbad_errormax = errmax
553 dbad_seed = seed
554 write(dbad_file,'(i3,a40)') 3, 'StartOfPhase1'
555 END
556
557 SUBROUTINE DEBUG_BWD_CONCLUDE()
558 IMPLICIT NONE
559 INCLUDE 'debugAD.inc'
560 REAL*8 sumd
561 INTEGER*4 smallsize, nbblocks, SMALLSTACKSIZE
562 INTEGER*4 nbreals, i
563 write(dbad_file,'(i3,a40)') -3, 'EndOfPhase1'
564 END
565
566 SUBROUTINE DEBUG_BWD_CALL(unitname, traced)
567 IMPLICIT NONE
568 CHARACTER unitname*(*)
569 LOGICAL traced
570 INCLUDE 'debugAD.inc'
571 dbad_callindex = dbad_callindex+1
572 write (dbad_callnames(dbad_callindex),'(a40)') unitname
573 dbad_calltraced(dbad_callindex) =
574 + (dbad_callindex.eq.1.OR.
575 + dbad_calltraced(dbad_callindex-1))
576 + .AND.traced
577 end
578
579 SUBROUTINE DEBUG_BWD_EXIT()
580 IMPLICIT NONE
581 INCLUDE 'debugAD.inc'
582 IF (dbad_callindex.eq.1 .OR.
583 + dbad_calltraced(dbad_callindex-1)) THEN
584 IF (dbad_calltraced(dbad_callindex)) THEN
585 write(dbad_file,'(i3,a40)')
586 + 2, dbad_callnames(dbad_callindex)
587 ELSE
588 write(dbad_file,'(i3,a40)')
589 + -2, dbad_callnames(dbad_callindex)
590 ENDIF
591 ENDIF
592 dbad_callindex = dbad_callindex-1
593 END
594
595 LOGICAL FUNCTION DEBUG_BWD_HERE(placename)
596 IMPLICIT NONE
597 CHARACTER placename*(*)
598 INCLUDE 'debugAD.inc'
599 DEBUG_BWD_HERE =
600 + (dbad_callindex.eq.0.OR.dbad_calltraced(dbad_callindex))
601 RETURN
602 END
603
604C DEBUG PRIMITIVES FOR THE ADJOINT MODE, FORWARD SWEEP (DOT-PRODUCT METHOD)
605
606 SUBROUTINE DEBUG_FWD_INIT(ezero, errmax, seed)
607 IMPLICIT NONE
608 REAL*8 ezero, errmax, seed
609 INCLUDE 'debugAD.inc'
610 INTEGER label
611 CHARACTER*40 startstring
612 CHARACTER*40 placestring
613 REAL*8 bigsum
614 dbad_mode = -1
615 dbad_phase = 2
616 dbad_file = 5
617 dbad_epszero = ezero
618 dbad_errormax = errmax
619 dbad_seed = seed
620 dbad_nberrors = 0
621 write (*,'("Starting ADJ test, zero=",e8.1,
622 + ", errmax=",f4.1,"%, seed=",f5.3)'),
623 + ezero,errmax,seed
624 write (*,
625 +'("===========================================================")')
626C labels: 3 -> StartOfPhase1
627C -1 -> a debug point, skipped
628C 0 -> a debug point, traced but no associated value.
629C 1 -> a debug point, traced, with an associated value.
630C -2 -> a call, skipped
631C 2 -> a call, traced
632C -3 -> EndOfPhase1
633 100 READ(dbad_file,'(i3,a40)',ERR=200,END=500) label,startstring
634 if (label.eq.3.AND.
635 + startstring.EQ.' StartOfPhase1')
636 + GOTO 300
637 200 GOTO 100
638 300 CALL PUSHINTEGER4(3)
639 400 READ(dbad_file,'(i3,a40)',ERR=500,END=500) label,placestring
640 IF (label.eq.-3) GOTO 500
641 IF (label.eq.1) THEN
642 READ(dbad_file,*) bigsum
643 CALL PUSHREAL8(bigsum)
644 ENDIF
645 CALL PUSHCHARACTERARRAY(placestring, 40)
646 CALL PUSHINTEGER4(label)
647 GOTO 400
648 500 CONTINUE
649C FOR DEBUG OF DEBUG ONLY:
650c CALL LOOKINTEGER4(label)
651c IF (label.eq.3) GOTO 600
652c call LOOKCHARACTERARRAY(placestring, 40)
653c if (label.eq.-2) then
654c write (*,*) 'untraced call ',placestring
655c else if (label.eq.2) then
656c write (*,*) 'TRACED call ',placestring
657c else if (label.eq.-1) then
658c write (*,*) 'untraced place ',placestring
659c else if (label.eq.1) then
660c write (*,*) 'TRACED place ',placestring
661c else if (label.eq.0) then
662c call LOOKREAL8(bigsum)
663c write (*,*) 'TRACED place ',placestring, bigsum
664c endif
665c GOTO 500
666C end FOR DEBUG OF DEBUG ONLY.
667 600 CONTINUE
668 END
669
670 SUBROUTINE DEBUG_FWD_CONCLUDE()
671 IMPLICIT NONE
672 INCLUDE 'debugAD.inc'
673 write (*,'("End of ADJ test.",i2,
674 + " error(s) found. WARNING: testing alters derivatives!")')
675 + dbad_nberrors
676 write (*,
677 +'("===========================================================")')
678 END
679
680 SUBROUTINE DEBUG_FWD_CALL(unitname)
681 IMPLICIT NONE
682 CHARACTER unitname*(*)
683 INCLUDE 'debugAD.inc'
684 INTEGER label
685 CHARACTER*40 refcallstring, herecallstring
686 label = 999
687 IF (dbad_callindex.eq.0.OR.dbad_calltraced(dbad_callindex)) THEN
688 call POPINTEGER4(label)
689 IF (label.ne.2 .AND. label.ne.-2) THEN
690 write(*,*) 'Control mismatch: FWD call ',
691 + unitname,'; BWD ',label
692 STOP
693 ENDIF
694 call POPCHARACTERARRAY(refcallstring, 40)
695 write (herecallstring,'(a40)') unitname
696 IF (refcallstring.NE.herecallstring) THEN
697 write(*,*) 'Control mismatch: FWD call ',
698 + herecallstring,'; BWD call ',refcallstring
699 STOP
700 ENDIF
701 ENDIF
702 dbad_callindex = dbad_callindex+1
703 write (dbad_callnames(dbad_callindex),'(a40)') unitname
704 dbad_calltraced(dbad_callindex) = (label.eq.2)
705 END
706
707 SUBROUTINE DEBUG_FWD_EXIT()
708 IMPLICIT NONE
709 INCLUDE 'debugAD.inc'
710 dbad_callindex = dbad_callindex-1
711 END
712
713 LOGICAL FUNCTION DEBUG_FWD_HERE(placename)
714 IMPLICIT NONE
715 CHARACTER placename*(*)
716 INCLUDE 'debugAD.inc'
717 INTEGER label
718 CHARACTER*40 refplacestring, hereplacestring
719 label = 999
720 IF (dbad_callindex.eq.0.OR.dbad_calltraced(dbad_callindex)) THEN
721 call POPINTEGER4(label)
722 IF (label.ne.1 .AND. label.ne.0 .AND. label.ne.-1) THEN
723 write(*,*) 'Control mismatch: FWD place ',
724 + placename,'; BWD ',label
725 STOP
726 ENDIF
727 call POPCHARACTERARRAY(refplacestring, 40)
728 write (hereplacestring,'(a40)') placename
729 IF (refplacestring.NE.hereplacestring) THEN
730 write(*,*) 'Control mismatch: FWD place ',
731 + hereplacestring,'; BWD place ',refplacestring
732 STOP
733 ENDIF
734 DEBUG_FWD_HERE = (label.NE.-1)
735 IF (label.eq.1) THEN
736 call POPREAL8(dbad_nextrefsum)
737 ENDIF
738 ELSE
739 DEBUG_FWD_HERE = .FALSE.
740 ENDIF
741 RETURN
742 END
743
744C DEBUG PRIMITIVES FOR THE ADJOINT MODE, BOTH SWEEPS (DOT-PRODUCT METHOD)
745
746 SUBROUTINE DEBUG_ADJ_SKIP(placename)
747 IMPLICIT NONE
748 CHARACTER placename*(*)
749 INCLUDE 'debugAD.inc'
750 IF (dbad_phase.eq.1) THEN
751 IF (dbad_callindex.eq.0 .OR.
752 + dbad_calltraced(dbad_callindex)) THEN
753 write(dbad_file,'(i3,a40)') -1, placename
754 ENDIF
755 ENDIF
756 END
757
758 SUBROUTINE DEBUG_ADJ_rwREAL4(vard)
759 IMPLICIT NONE
760 REAL*4 vard
761 INCLUDE 'debugAD.inc'
762 CALL DEBUG_ADJ_INCRCOEFF()
763 dbad_sum = dbad_sum + dbad_coeff*vard
764 vard = dbad_coeff
765 END
766
767 SUBROUTINE DEBUG_ADJ_rREAL4(vard)
768 IMPLICIT NONE
769 REAL*4 vard
770 INCLUDE 'debugAD.inc'
771 CALL DEBUG_ADJ_INCRCOEFF()
772 dbad_sum = dbad_sum + dbad_coeff*vard
773 END
774
775 SUBROUTINE DEBUG_ADJ_wREAL4(vard)
776 IMPLICIT NONE
777 REAL*4 vard
778 INCLUDE 'debugAD.inc'
779 CALL DEBUG_ADJ_INCRCOEFF()
780 vard = dbad_coeff
781 END
782
783 SUBROUTINE DEBUG_ADJ_rwREAL4ARRAY(vard, length)
784 IMPLICIT NONE
785 INTEGER length
786 REAL*4 vard(length)
787 INTEGER i
788 DO i=1,length
789 CALL DEBUG_ADJ_rwREAL4(vard(i))
790 ENDDO
791 END
792
793 SUBROUTINE DEBUG_ADJ_rREAL4ARRAY(vard, length)
794 IMPLICIT NONE
795 INTEGER length
796 REAL*4 vard(length)
797 INTEGER i
798 DO i=1,length
799 CALL DEBUG_ADJ_rREAL4(vard(i))
800 ENDDO
801 END
802
803 SUBROUTINE DEBUG_ADJ_wREAL4ARRAY(vard, length)
804 IMPLICIT NONE
805 INTEGER length
806 REAL*4 vard(length)
807 INTEGER i
808 DO i=1,length
809 CALL DEBUG_ADJ_wREAL4(vard(i))
810 ENDDO
811 END
812
813 SUBROUTINE DEBUG_ADJ_rwREAL8(vard)
814 IMPLICIT NONE
815 REAL*8 vard
816 INCLUDE 'debugAD.inc'
817 CALL DEBUG_ADJ_INCRCOEFF()
818 dbad_sum = dbad_sum + dbad_coeff*vard
819 vard = dbad_coeff
820 END
821
822 SUBROUTINE DEBUG_ADJ_rREAL8(vard)
823 IMPLICIT NONE
824 REAL*8 vard
825 INCLUDE 'debugAD.inc'
826 CALL DEBUG_ADJ_INCRCOEFF()
827 dbad_sum = dbad_sum + dbad_coeff*vard
828 END
829
830 SUBROUTINE DEBUG_ADJ_PRINT()
831 IMPLICIT NONE
832 REAL*8 vard
833 INCLUDE 'debugAD.inc'
834 print *, 'dbad sum:',dbad_sum
835 END
836
837 SUBROUTINE DEBUG_ADJ_wREAL8(vard)
838 IMPLICIT NONE
839 REAL*8 vard
840 INCLUDE 'debugAD.inc'
841 CALL DEBUG_ADJ_INCRCOEFF()
842 vard = dbad_coeff
843 END
844
845 SUBROUTINE DEBUG_ADJ_rwREAL8ARRAY(vard, length)
846 IMPLICIT NONE
847 INTEGER length
848 REAL*8 vard(length)
849 INTEGER i
850 DO i=1,length
851 CALL DEBUG_ADJ_rwREAL8(vard(i))
852 ENDDO
853 END
854
855 SUBROUTINE DEBUG_ADJ_rREAL8ARRAY(vard, length)
856 IMPLICIT NONE
857 INTEGER length
858 REAL*8 vard(length)
859 INTEGER i
860 DO i=1,length
861 CALL DEBUG_ADJ_rREAL8(vard(i))
862 ENDDO
863 END
864
865 SUBROUTINE DEBUG_ADJ_wREAL8ARRAY(vard, length)
866 IMPLICIT NONE
867 INTEGER length
868 REAL*8 vard(length)
869 INTEGER i
870 DO i=1,length
871 CALL DEBUG_ADJ_wREAL8(vard(i))
872 ENDDO
873 END
874
875 SUBROUTINE DEBUG_ADJ_rwDISPLAY(placename, deltaindent)
876 IMPLICIT NONE
877 CHARACTER placename*(*)
878 INTEGER deltaindent
879 INCLUDE 'debugAD.inc'
880 CALL DEBUG_ADJ_rDISPLAY(placename, deltaindent)
881 IF (dbad_phase.eq.2) THEN
882 dbad_refsum = dbad_nextrefsum
883 ENDIF
884 END
885
886 SUBROUTINE DEBUG_ADJ_INCRCOEFF()
887 IMPLICIT NONE
888 INCLUDE 'debugAD.inc'
889 dbad_coeff = dbad_coeff + dbad_seed
890 IF (dbad_coeff.ge.2.d0) dbad_coeff = dbad_coeff - 1.d0
891 END
892
893 SUBROUTINE DEBUG_ADJ_rDISPLAY(placename, deltaindent)
894 IMPLICIT NONE
895 CHARACTER placename*(*)
896 INTEGER deltaindent
897 INCLUDE 'debugAD.inc'
898 REAL diffpercent
899 IF (dbad_phase.eq.1) THEN
900 write(dbad_file,'(i3,a40)') 1, placename
901 write(dbad_file,*) dbad_sum
902 ELSE
903 if (abs(dbad_refsum).le.dbad_epszero
904 + .and.abs(dbad_sum).le.dbad_epszero) then
905 diffpercent = 0.0
906 else
907 diffpercent = abs(dbad_refsum-dbad_sum)*100.0
908 + /max(abs(dbad_refsum),abs(dbad_sum))
909 endif
910 if (diffpercent.le.dbad_errormax) then
911c write (*,'(" ok (",
912c + f4.1,"% ) fwd:",e23.16," bwd:",e23.16)')
913c + diffpercent,dbad_sum,dbad_refsum
914 else
915 dbad_nberrors = dbad_nberrors+1
916 write (*,'(" ", f5.1,
917 + "% DIFFERENCE!! fwd:",e23.16," bwd:",e23.16)')
918 + diffpercent,dbad_sum,dbad_refsum
919 endif
920 IF (deltaindent.eq.0) THEN
921 CALL DEBUG_DISPLAY_LOCATION(placename)
922 ENDIF
923 ENDIF
924 dbad_sum = 0.d0
925 dbad_coeff = 1.d0
926 END
927
928 SUBROUTINE DEBUG_ADJ_wDISPLAY(placename, deltaindent)
929 IMPLICIT NONE
930 CHARACTER placename*(*)
931 INTEGER deltaindent
932 INCLUDE 'debugAD.inc'
933 IF (dbad_phase.eq.1) THEN
934 write(dbad_file,'(i3,a40)') 0, placename
935 ELSE
936 IF (deltaindent.eq.0) THEN
937 CALL DEBUG_DISPLAY_LOCATION(placename)
938 ENDIF
939 dbad_refsum = dbad_nextrefsum
940 ENDIF
941 dbad_sum = 0.d0
942 dbad_coeff = 1.d0
943 END
944
945 SUBROUTINE DEBUG_DISPLAY_LOCATION(placename)
946 IMPLICIT NONE
947 CHARACTER placename*(*)
948 INCLUDE 'debugAD.inc'
949 CHARACTER whites*(50),enclosproc*(40)
950 whites = ' '
951 if (dbad_callindex.EQ.0) then
952 enclosproc = 'Top level'
953 else
954 enclosproc = dbad_callnames(dbad_callindex)
955 endif
956 write(*,*) whites(:2*(dbad_callindex-1)),
957 + ' AT:',placename,' OF ',enclosproc
958 END
Note: See TracBrowser for help on using the repository browser.