#include #ifdef _CIVL #include #endif #define UPPER(up, step, offset) \ up % step == offset ? up : \ up % step < offset ? up + (offset - up % step) : up - (up % step - offset) + step #ifdef _CIVL $input int ni,nj; $input int bi,bj; //TODO: bounds of block sizes ? $assume(ni > 1); $assume(nj > 1); $input double uin[ni][nj]; #endif double u1[ni][nj]; double u2[ni][nj]; int main(int argc, char** argv) { int i,j,ir,jr,ib,jb; /* for(i=0;i 2) { i = ni - 1; if (nj > 2) j = nj - 1; else j = 1; } else { i = 1; j = nj; } // blocked loop nest /*@ loop invariant 1 <= i <= UPPER(ni-bi, bi, 1); @ loop invariant \forall int t; 1 <= t < i ==> @ (\forall int k; 1 <= k < UPPER(nj-bj, bj, 1) ==> @ u2[t][k] == uin[t][k]*uin[t][k]); @ loop assigns i, j, ib, jb, u2[1 .. (UPPER(ni-bi, bi, 1)-1)][1 .. (UPPER(nj-bj, bj, 1)-1)]; @*/ for(i=1;i @ (\forall int k; 1 <= k < UPPER(nj-bj, bj, 1) ==> @ u2[i+t][k] == uin[i+t][k]*uin[i+t][k]); @ loop assigns j, ib, jb, u2[i .. i + bi - 1][1 .. (UPPER(nj-bj, bj, 1)-1)]; @*/ for(j=1;j @ (\forall int k; 0 <= k < bj ==> u2[i+t][j+k] == uin[i+t][j+k]*uin[i+t][j+k]); @ loop assigns ib, jb, u2[i .. i + bi - 1][j .. j + bj - 1]; @*/ for(ib=0;ib u2[i+ib][j+k] == uin[i+ib][j+k]*uin[i+ib][j+k]; @ loop assigns jb, u2[i + ib][j .. j + bj - 1]; @*/ for(jb=0;jb