/algorithms_for_tapenade/fortran_code/inv_b.f
http://github.com/b45ch1/hpsc_hanoi_2009_walter · FORTRAN Legacy · 79 lines · 53 code · 0 blank · 26 comment · 0 complexity · 63f57b025270c75988d7c079c9bac788 MD5 · raw file
- C Generated by TAPENADE (INRIA, Tropics team)
- C Tapenade 3.4 (r3375) - 10 Feb 2010 15:08
- C
- C Differentiation of inv in reverse (adjoint) mode:
- C gradient of useful results: qt
- C with respect to varying inputs: qt a
- C RW status of diff variables: qt:in-out a:out
- SUBROUTINE INV_B(a, ab, qt, qtb, r, na)
- IMPLICIT NONE
- C Hint: SIZE1OFrbINinv should be the value of na*na
- INTEGER*4 na
- REAL*8 a(na*na), qt(na*na), r(na*na)
- REAL*8 ab(na*na), qtb(na*na)
- INTEGER*4 n, m, k
- REAL*8 tmp
- REAL*8 tmpb
- REAL*8 tmp0
- INTEGER ad_from
- REAL*8 tmp0b
- REAL*8 rb(na*na)
- INTEGER ii1
- CALL PUSHREAL8ARRAY(r, na**2)
- CALL PUSHREAL8ARRAY(qt, na**2)
- CALL QR(a, qt, r, na)
- DO n=na-1,0,-1
- CALL PUSHREAL8(tmp)
- tmp = r(n*na+n+1)
- DO m=0,na-1
- CALL PUSHREAL8(r(n*na+m+1))
- r(n*na+m+1) = r(n*na+m+1)/tmp
- CALL PUSHREAL8(qt(n*na+m+1))
- qt(n*na+m+1) = qt(n*na+m+1)/tmp
- ENDDO
- ad_from = n + 1
- DO m=ad_from,na-1
- CALL PUSHREAL8(tmp)
- tmp = r(n*na+m+1)
- r(n*na+m+1) = 0
- DO k=0,na-1
- tmp0 = qt(n*na+k+1) - qt(m*na+k+1)*tmp
- CALL PUSHREAL8(qt(n*na+k+1))
- qt(n*na+k+1) = tmp0
- ENDDO
- ENDDO
- CALL PUSHINTEGER4(ad_from)
- ENDDO
- DO ii1=1,na*na
- rb(ii1) = 0.0
- ENDDO
- DO n=0,na-1,1
- CALL POPINTEGER4(ad_from)
- DO m=na-1,ad_from,-1
- tmpb = 0.0
- DO k=na-1,0,-1
- CALL POPREAL8(qt(n*na+k+1))
- tmp0b = qtb(n*na+k+1)
- qtb(n*na+k+1) = tmp0b
- qtb(m*na+k+1) = qtb(m*na+k+1) - tmp*tmp0b
- tmpb = tmpb - qt(m*na+k+1)*tmp0b
- ENDDO
- rb(n*na+m+1) = tmpb
- CALL POPREAL8(tmp)
- ENDDO
- tmpb = 0.0
- DO m=na-1,0,-1
- CALL POPREAL8(qt(n*na+m+1))
- CALL POPREAL8(r(n*na+m+1))
- tmpb = tmpb - r(n*na+m+1)*rb(n*na+m+1)/tmp**2 - qt(n*na+m+1)*
- + qtb(n*na+m+1)/tmp**2
- qtb(n*na+m+1) = qtb(n*na+m+1)/tmp
- rb(n*na+m+1) = rb(n*na+m+1)/tmp
- ENDDO
- CALL POPREAL8(tmp)
- rb(n*na+n+1) = rb(n*na+n+1) + tmpb
- ENDDO
- CALL POPREAL8ARRAY(qt, na**2)
- CALL POPREAL8ARRAY(r, na**2)
- CALL QR_B(a, ab, qt, qtb, r, rb, na)
- END