subroutine template() use OpenAD_checkpoints use OpenAD_tape use OpenAD_rev !$TEMPLATE_PRAGMA_DECLARATIONS integer :: cp_loop_variable_1,cp_loop_variable_2, + cp_loop_variable_3,cp_loop_variable_4 type(modeType) :: our_orig_mode integer iaddr external iaddr INTEGER numItersHelper INTEGER myThidHelper character*(80):: indentation=' + ' our_indent=our_indent+1 write(*, +'(A,A,A,A,L,A,L,A,L,A,L,A,L,A,L,A,I8,A,I8)') +'JU:',indentation(1:our_indent), 'enter __SRNAME__:', +' As:',our_rev_mode%arg_store, +' Ar:',our_rev_mode%arg_restore, +' Pl:',our_rev_mode%plain, +' Ta:',our_rev_mode%tape, +' Ad:',our_rev_mode%adjoint, +' Sw:',our_rev_mode%switchedToCheckpoint, +' TD:',double_tape_pointer, +' TI:',integer_tape_pointer if (our_rev_mode%plain) then write(*,'(A,A,A)') +'JU:',indentation(1:our_indent), +' __SRNAME__: entering plain' c set up for plain execution our_orig_mode=our_rev_mode our_rev_mode%arg_store=.FALSE. our_rev_mode%arg_restore=.FALSE. our_rev_mode%plain=.TRUE. our_rev_mode%tape=.FALSE. our_rev_mode%adjoint=.FALSE. write(*,'(A,A,A)') +'JU:',indentation(1:our_indent), +' __SRNAME__: runninng plain / down plain' !$PLACEHOLDER_PRAGMA$ id=1 c reset the mode our_rev_mode=our_orig_mode end if if (our_rev_mode%tape) then numItersHelper=numiters mythidHelper=mythid write(*,'(A,A,A)') +'JU:',indentation(1:our_indent), +' __SRNAME__: entering tape' c set up for plain execution our_orig_mode=our_rev_mode our_rev_mode%arg_store=.FALSE. our_rev_mode%arg_restore=.FALSE. our_rev_mode%plain=.TRUE. our_rev_mode%tape=.FALSE. our_rev_mode%adjoint=.FALSE. write(*,'(A,A,A)') +'JU:',indentation(1:our_indent), +' __SRNAME__: runninng plain / down plain' !$PLACEHOLDER_PRAGMA$ id=1 c reset the mode our_rev_mode=our_orig_mode if (integer_tape_size .lt. integer_tape_pointer) then allocate(integer_tmp_tape(integer_tape_size)) integer_tmp_tape = integer_tape deallocate(integer_tape) allocate(integer_tape(integer_tape_size*2)) print *,"IT+" integer_tape(1:integer_tape_size) = integer_tmp_tape deallocate(integer_tmp_tape) integer_tape_size = integer_tape_size*2 end if integer_tape(integer_tape_pointer) = numItersHelper integer_tape_pointer = integer_tape_pointer+1 if (integer_tape_size .lt. integer_tape_pointer) then allocate(integer_tmp_tape(integer_tape_size)) integer_tmp_tape = integer_tape deallocate(integer_tape) allocate(integer_tape(integer_tape_size*2)) print *,"IT+" integer_tape(1:integer_tape_size) = integer_tmp_tape deallocate(integer_tmp_tape) integer_tape_size = integer_tape_size*2 end if integer_tape(integer_tape_pointer) = mythidHelper integer_tape_pointer = integer_tape_pointer+1 end if if (our_rev_mode%adjoint) then write(*,'(A,A,A)') +'JU:',indentation(1:our_indent), +' __SRNAME__: entering adjoint' integer_tape_pointer = integer_tape_pointer-1 mythid = integer_tape(integer_tape_pointer) integer_tape_pointer = integer_tape_pointer-1 numiters = integer_tape(integer_tape_pointer) c selfadjoint: c the original is called with c cg2d(b,x,...) c in the adjoint context if we c use the same code base c we call with c cg2d(x_bar,bh,... c where afterwards c b_bar+=bh and x_bar=0 do cp_loop_variable_1=1-OLx,sNx+OLx do cp_loop_variable_2=1-OLy,sNy+OLy do cp_loop_variable_3=1,nSx do cp_loop_variable_4=1,nSy c the adjoint second formal argument cg2d_x should be c the values of the first argument: cg2d_b(cp_loop_variable_1, + cp_loop_variable_2, + cp_loop_variable_3, + cp_loop_variable_4)%v= + cg2d_x(cp_loop_variable_1, + cp_loop_variable_2, + cp_loop_variable_3, + cp_loop_variable_4)%d c the first formal argument cg2d_b should hold c the increment, i.e. we nullify the second formal c argument (cg2d_x) value: cg2d_x(cp_loop_variable_1, + cp_loop_variable_2, + cp_loop_variable_3, + cp_loop_variable_4)%v=0.0 end do end do end do end do c set up for plain execution our_orig_mode=our_rev_mode our_rev_mode%arg_store=.FALSE. our_rev_mode%arg_restore=.FALSE. our_rev_mode%plain=.TRUE. our_rev_mode%tape=.FALSE. our_rev_mode%adjoint=.FALSE. write(*,'(A,A,A)') +'JU:',indentation(1:our_indent), +' __SRNAME__: runninng self adjoint / down plain' !$PLACEHOLDER_PRAGMA$ id=1 c reset the mode our_rev_mode=our_orig_mode c now the adjoint result is the increment c contained in the second formal argument do cp_loop_variable_1=1-OLx,sNx+OLx do cp_loop_variable_2=1-OLy,sNy+OLy do cp_loop_variable_3=1,nSx do cp_loop_variable_4=1,nSy cg2d_b(cp_loop_variable_1, + cp_loop_variable_2, + cp_loop_variable_3, + cp_loop_variable_4)%d= + cg2d_b(cp_loop_variable_1, + cp_loop_variable_2, + cp_loop_variable_3, + cp_loop_variable_4)%d+ + cg2d_x(cp_loop_variable_1, + cp_loop_variable_2, + cp_loop_variable_3, + cp_loop_variable_4)%v cg2d_x%d=0.0 end do end do end do end do end if write(*, +'(A,A,A,A,L,A,L,A,L,A,L,A,L,A,L,A,I8,A,I8)') +'JU:',indentation(1:our_indent), 'leave __SRNAME__:', +' As:',our_rev_mode%arg_store, +' Ar:',our_rev_mode%arg_restore, +' Pl:',our_rev_mode%plain, +' Ta:',our_rev_mode%tape, +' Ad:',our_rev_mode%adjoint, +' Sw:',our_rev_mode%switchedToCheckpoint, +' TD:',double_tape_pointer, +' TI:',integer_tape_pointer our_indent=our_indent-1 end subroutine template