/* Generated by TAPENADE (INRIA, Ecuador team) Tapenade 3.10 (r5717) - 30 Jul 2015 16:03 */ #include "cstd.h" /* Differentiation of acd_2d_d in forward (tangent) mode: variations of useful results: **upd **up with respect to varying inputs: **ucd **upd **csq **uc **up RW status of diff variables: **ucd:in **upd:in-out **csq:in **uc:in **up:in-out Plus diff mem management of: ucd:in *ucd:in lap:in upd:in *upd:in lapd:in csq:in *csq:in uc:in *uc:in up:in *up:in */ void acd_2d_d_d(float **uc, float **ucd0, float **ucd, float **ucdd, float ** up, float **upd0, float **upd, float **updd, float **csq, float ** csqd0, float **csqd, int *s, int *e, float **c, int k, int *lbc, int * rbc, float *lap, float *lapd0, float *lapd, float *lapdd) { int i0, i1, ioff; int s0 = s[0]; int e0 = e[0]; float c0 = c[0][0] + c[1][0]; for (i1 = s[1]; i1 < e[1]+1; ++i1) { // offset independent part of stencil //#pragma ivdep for (i0 = s0; i0 < e0+1; ++i0) { updd[i1][i0] = 2.0*ucdd[i1][i0] - updd[i1][i0]; upd[i1][i0] = 2.0*ucd[i1][i0] - upd[i1][i0]; upd0[i1][i0] = 2.0*ucd0[i1][i0] - upd0[i1][i0]; up[i1][i0] = 2.0*uc[i1][i0] - up[i1][i0]; lapdd[i0] = c0*ucdd[i1][i0]; lapd[i0] = c0*ucd[i1][i0]; lapd0[i0] = c0*ucd0[i1][i0]; lap[i0] = c0*uc[i1][i0]; } // offset dependent part of stencil for (ioff = 1; ioff < k+1; ++ioff) //#pragma ivdep for (i0 = s0; i0 < e0+1; ++i0) { lapdd[i0] = lapdd[i0] + c[0][ioff]*(ucdd[i1][i0+ioff]+ucdd[i1] [i0-ioff]) + c[1][ioff]*(ucdd[i1+ioff][i0]+ucdd[i1-ioff][ i0]); lapd[i0] = lapd[i0] + c[0][ioff]*(ucd[i1][i0+ioff]+ucd[i1][i0- ioff]) + c[1][ioff]*(ucd[i1+ioff][i0]+ucd[i1-ioff][i0]); lapd0[i0] = lapd0[i0] + c[0][ioff]*(ucd0[i1][i0+ioff]+ucd0[i1] [i0-ioff]) + c[1][ioff]*(ucd0[i1+ioff][i0]+ucd0[i1-ioff][ i0]); lap[i0] += c[0][ioff]*(uc[i1][i0+ioff]+uc[i1][i0-ioff]) + c[1] [ioff]*(uc[i1+ioff][i0]+uc[i1-ioff][i0]); } for (i0 = s0; i0 < e0+1; ++i0) { updd[i1][i0] = updd[i1][i0] + csqd[i1][i0]*lapd0[i0] + csqd0[i1][ i0]*lapd[i0] + csq[i1][i0]*lapdd[i0]; upd[i1][i0] = upd[i1][i0] + csqd[i1][i0]*lap[i0] + csq[i1][i0]* lapd[i0]; upd0[i1][i0] = upd0[i1][i0] + csqd0[i1][i0]*lap[i0] + csq[i1][i0]* lapd0[i0]; up[i1][i0] += csq[i1][i0]*lap[i0]; } } /* boundary conditions - note that uc[-1][i]=0 etc. */ if (lbc[1]) for (ioff = 0; ioff < k-1; ++ioff) //#pragma ivdep for (i0 = s0; i0 < e0+1; ++i0) { updd[s[1] - ioff - 2][i0] = -updd[s[1]+ioff][i0]; upd[s[1] - ioff - 2][i0] = -upd[s[1]+ioff][i0]; upd0[s[1] - ioff - 2][i0] = -upd0[s[1]+ioff][i0]; up[s[1] - ioff - 2][i0] = -up[s[1]+ioff][i0]; } if (rbc[1]) for (ioff = 0; ioff < k-1; ++ioff) //#pragma ivdep for (i0 = s0; i0 < e0+1; ++i0) { updd[e[1] + 2 + ioff][i0] = -updd[e[1]-ioff][i0]; upd[e[1] + 2 + ioff][i0] = -upd[e[1]-ioff][i0]; upd0[e[1] + 2 + ioff][i0] = -upd0[e[1]-ioff][i0]; up[e[1] + 2 + ioff][i0] = -up[e[1]-ioff][i0]; } if (lbc[0]) for (i1 = s[1]; i1 < e[1]+1; ++i1) for (ioff = 0; ioff < k-1; ++ioff) { updd[i1][s[0] - ioff - 2] = -updd[i1][s[0]+ioff]; upd[i1][s[0] - ioff - 2] = -upd[i1][s[0]+ioff]; upd0[i1][s[0] - ioff - 2] = -upd0[i1][s[0]+ioff]; up[i1][s[0] - ioff - 2] = -up[i1][s[0]+ioff]; } if (rbc[0]) for (i1 = s[1]; i1 < e[1]+1; ++i1) for (ioff = 0; ioff < k-1; ++ioff) { updd[i1][e[0] + ioff + 2] = -updd[i1][e[0]-ioff]; upd[i1][e[0] + ioff + 2] = -upd[i1][e[0]-ioff]; upd0[i1][e[0] + ioff + 2] = -upd0[i1][e[0]-ioff]; up[i1][e[0] + ioff + 2] = -up[i1][e[0]-ioff]; } }