/algorithms_for_tapenade/c_code/inv_b.c
http://github.com/b45ch1/hpsc_hanoi_2009_walter · C · 108 lines · 98 code · 1 blank · 9 comment · 8 complexity · dce60ff27967c900523946897f8f3956 MD5 · raw file
- /* Generated by TAPENADE (INRIA, Tropics team)
- Tapenade 3.4 (r3375) - 10 Feb 2010 15:08
- */
- #include "GlobalDeclarations_b.c"
- /*
- Differentiation of inv in reverse (adjoint) mode:
- gradient of useful results: *qt
- with respect to varying inputs: *qt *a
- RW status of diff variables: *qt:in-out *a:out
- */
- void inv_b(double *a, double *ab, double *qt, double *qtb, double *r, double *
- rb, int na) {
- int n, m, k;
- double rnn, rnm;
- double rnnb, rnmb;
- int res;
- int res0;
- int res1;
- double tmp;
- int res2;
- int res3;
- double tmp0;
- int res4;
- int res5;
- int res6;
- int res7;
- int res8;
- double tmp1;
- int adFrom;
- double tmpb;
- double tmp0b;
- double tmp1b;
- pushreal8_(*r);
- pushreal8_(*qt);
- qr(a, qt, r, na);
- for (n = na-1; n >= 0; --n) {
- res = myindex(n, n, na);
- pushreal8_(rnn);
- rnn = r[res];
- for (m = 0; m <= na-1; ++m) {
- res0 = myindex(n, m, na);
- res1 = myindex(n, m, na);
- tmp = r[res1]/rnn;
- pushreal8_(r[res0]);
- r[res0] = tmp;
- res2 = myindex(n, m, na);
- res3 = myindex(n, m, na);
- tmp0 = qt[res3]/rnn;
- pushreal8_(qt[res2]);
- qt[res2] = tmp0;
- }
- adFrom = n + 1;
- for (m = adFrom; m <= na-1; ++m) {
- res4 = myindex(n, m, na);
- pushreal8_(rnm);
- rnm = r[res4];
- res5 = myindex(n, m, na);
- pushreal8_(r[res5]);
- r[res5] = 0;
- for (k = 0; k <= na-1; ++k) {
- res6 = myindex(n, k, na);
- res7 = myindex(n, k, na);
- res8 = myindex(m, k, na);
- tmp1 = qt[res7] - qt[res8]*rnm;
- pushreal8_(qt[res6]);
- qt[res6] = tmp1;
- }
- }
- pushinteger4_(adFrom);
- }
- *rb = 0.0;
- for (n = 0; n <= na-1; ++n) {
- popinteger4_(&adFrom);
- for (m = na-1; m >= adFrom; --m) {
- rnmb = 0.0;
- for (k = na-1; k >= 0; --k) {
- popreal8_(&qt[res6]);
- tmp1b = qtb[res6];
- qtb[res6] = 0.0;
- qtb[res7] = qtb[res7] + tmp1b;
- qtb[res8] = qtb[res8] - rnm*tmp1b;
- rnmb = rnmb - qt[res8]*tmp1b;
- }
- popreal8_(&r[res5]);
- rb[res5] = 0.0;
- popreal8_(&rnm);
- rb[res4] = rb[res4] + rnmb;
- }
- rnnb = 0.0;
- for (m = na-1; m >= 0; --m) {
- popreal8_(&qt[res2]);
- tmp0b = qtb[res2];
- qtb[res2] = 0.0;
- qtb[res3] = qtb[res3] + tmp0b/rnn;
- popreal8_(&r[res0]);
- tmpb = rb[res0];
- rnnb = rnnb - r[res1]*tmpb/(rnn*rnn) - qt[res3]*tmp0b/(rnn*rnn);
- rb[res0] = 0.0;
- rb[res1] = rb[res1] + tmpb/rnn;
- }
- popreal8_(&rnn);
- rb[res] = rb[res] + rnnb;
- }
- popreal8_(qt);
- popreal8_(r);
- qr_b(a, ab, qt, qtb, r, rb, na);
- }