// form H = (1/h) W (x) I - I (x) J // get the L, U, p factors of H int _formIRKmatrixZ(RKOCP r, Vector y, Vector u, Vector p, double t, double h, Matrix L, Matrix U, int *P) { int n = r->n_states+1; int s = r->rk_stages; double **W = r->rk_w->e; int err = 0; int i, j, k, l; Matrix H = MatrixNew(n*s, n*s); Matrix J = MatrixNew(n, n); // get Fy, Fu, Fp, Ly, Lu, Lp if (r->ocp->Ddifferential_equations == NULL) { OCPFDfL(r->ocp, y, u, p, t, r->Fy, r->Fu, r->Fp, r->Ly, r->Lu, r->Lp); } else { r->ocp->Ddifferential_equations(y, u, p, t, r->Fy, r->Fu, r->Fp, r->Ly, r->Lu, r->Lp); } for (i = 0; i < r->n_states; i ++) { for (j = 0; j < r->n_states; j++) { J->e[i][j] = r->Fy->e[i][j]; } J->e[r->n_states][i] = r->Ly->e[i]; } // H = (1/h) W (x) I - I (x) J for (i = 0; i < s; i++) { for (j = 0; j < s; j++) { double wij_h = W[i][j] / h; for (k = 0; k < n; k++) { H->e[i*n + k][j*n + k] += wij_h; } } for (k = 0; k < n; k++) { for (l = 0; l < n; l++) { H->e[i*n + k][i*n + l] -= J->e[k][l]; } } } err = LUFactor(H, L, U, P); MatrixDelete(J); MatrixDelete(H); return err; }
void FixedEndPointsGVI::InitializeContractionMatrix(){ int i, j, k; i = 0; j = 0; k = 0; double Pauser; Pauser = 0.0; for(i = 0; i < myMethodOrder; i++){ for(j = 0; j < myMethodOrder; j++){ ContractionMatrix[i][j] = 0.0; for(k = 0; k < myQuadratureOrder; k++){ ContractionMatrix[i][j] += QuadratureWeights[k]*DerivativePointValuesAtQuadraturePoints[i][k]*DerivativePointValuesAtQuadraturePoints[j][k]; } } } for(i = 0; i < myMethodOrder; i++){ DerivativeInnerProducts[i] = ContractionMatrix[myMethodOrder - 1][i]; ContractionMatrix[myMethodOrder - 1][i] = 0.0; ContractionMatrix[0][i] = 0.0; } ContractionMatrix[myMethodOrder - 1][myMethodOrder - 1] = 1.0; ContractionMatrix[0][0] = 1.0; LUFactor(ContractionMatrix, myMethodOrder); }
int main(int argc, char **argv[]) { /* <reference> */ float inSubMat[M][M], outSubMat[M][M], LU[M][M], L[M][M], U[M][M]; int subdist, rowdist, coldist; int i, j, dist, k1, k2, p1, p2, q1, q2, q3; /* </reference> */ double t0, t1; t0 = wall_clock(); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (i == j) { outMat[i][j] = N; } else { outMat[i][j] = 1; } } } /* <master id="234567"> */ _distributor = _open_space("distributor", 0, "234567"); _constructor = _open_space("constructor", 0, "234567"); i = 0; while (i < N) { j = i + M - 1; dist = M; if (j > N-1) { j = N-1; dist = N - i; } /* LU factors for submatrix */ for (k1 = 0; k1 < dist; k1++) { for (k2 = 0; k2 < dist; k2++) { inSubMat[k1][k2] = outMat[i+k1][i+k2]; } } LUFactor(inSubMat, outSubMat, dist); /* update */ for (k1 = 0; k1 < dist; k1++) { for (k2 = 0; k2 < dist; k2++) { outMat[i+k1][i+k2] = outSubMat[k1][k2]; LU[k1][k2] = outSubMat[k1][k2]; } } /* Solve triangles, LZ and WU */ for (k1 = j+1; k1 < N; k1 = k1+M) { k2 = k1 + M - 1; subdist = M; if (k2 > N-1) { k2 = N - 1; subdist = N - k1; } /* Solve LZ */ for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { inSubMat[p1-i][p2-k1] = outMat[p1][p2]; } } TriangleSolver(LU, inSubMat, outSubMat, subdist, 1); /* update */ for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { outMat[p1][p2] = outSubMat[p1-i][p2-k1]; } } /* Solve WU */ for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { inSubMat[p2-k1][p1-i] = outMat[p2][p1]; } } TriangleSolver(LU, inSubMat, outSubMat, subdist, 2); /* update */ for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { outMat[p2][p1] = outSubMat[p2-k1][p1-i]; } } } _cleanup_space(_distributor, "234567"); _cleanup_space(_constructor, "234567"); /* <token action="SET" idxset="(k1)"/> */ sprintf(_tp_name, "token#%s", "234567"); sprintf(_tp_token, "=(k1:%d~%d,%d:#%d)", j+1, N, 1, M); _tp_size = sizeof(_tp_token); _tokens = _set_token(_distributor, _tp_name, (char *)_tp_token, _tp_size); if (_tokens < 0) exit(-1); /* <send var="i" type="int"/> */ sprintf(_tp_name, "int:i#%s", "234567"); _tp_size = sizeof(int); _tp_i_234567 = &i; _status = _send_data(_distributor, _tp_name, (char *)_tp_i_234567, _tp_size); if (_status < 0) exit(-1); /* <send var="j" type="int"/> */ sprintf(_tp_name, "int:j#%s", "234567"); _tp_size = sizeof(int); _tp_j_234567 = &j; _status = _send_data(_distributor, _tp_name, (char *)_tp_j_234567, _tp_size); if (_status < 0) exit(-1); /* <send var="outMat" type="float[N(i~N)][N(i~N)]"/> */ sprintf(_tp_name, "float(%d)(%d):outMat#%s[%d~%d,%d][%d~%d,%d]@%d", (N), (N), "234567", (i), (N), 1, (i), (N), 1, sizeof(float)); _tp_size = (((N) - (i)) * ((N) - (i))) * sizeof(float); _tp_outMat_234567 = (float *)malloc(_tp_size); for (_x0_234567 = (i), _y0_234567 =0; _x0_234567 < (N); _x0_234567 +=1, _y0_234567 ++) { for (_x1_234567 = (i), _y1_234567 =0; _x1_234567 < (N); _x1_234567 +=1, _y1_234567 ++) { _tp_outMat_234567[_y0_234567 * ((N) - (i)) + _y1_234567] = outMat[_x0_234567][_x1_234567]; } } _status = _send_data(_distributor, _tp_name, (char *)_tp_outMat_234567, _tp_size); if (_status < 0) exit(-1); free(_tp_outMat_234567); /* <read var="outMat" type="float[N(j+1~N)][N(j+1~N)]"/> */ sprintf(_tp_name, "float(%d)(%d):outMat#%s[%d~%d,%d][%d~%d,%d]@%d", (N), (N), "234567", (j+1), (N), 1, (j+1), (N), 1, sizeof(float)); _tp_size = (((N) - (j+1)) * ((N) - (j+1))) * sizeof(float); _tp_outMat_234567 = (float *)malloc(_tp_size); _tp_size = _read_data(_constructor, _tp_name, (char *)_tp_outMat_234567, _tp_size); if (_tp_size < 0) exit(-1); for (_x0_234567 = (j+1), _y0_234567 =0; _x0_234567 < (N); _x0_234567 +=1, _y0_234567 ++) { for (_x1_234567 = (j+1), _y1_234567 =0; _x1_234567 < (N); _x1_234567 +=1, _y1_234567 ++) { outMat[_x0_234567][_x1_234567] = _tp_outMat_234567[_y0_234567 * ((N) - (j+1)) + _y1_234567]; } } free(_tp_outMat_234567); i = i + M; } _close_space(_constructor, "234567", 1); _close_space(_distributor, "234567", 1); /* </master> */ /* for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("%6.3f ", outMat[i][j]); } printf("\n"); } */ t1 = wall_clock() - t0; if (t1>0) printf(" (%f) MFLOPS.\n", (float) 2*N*N*N/3/t1); else printf(" MFLOPS: Not measured.\n"); printf("elapse time = %10.6f\n", t1/1000000); return 0; }
int main() { /* <reference> */ int i, j, dist, k1, k2, p1, p2, q1, q2, q3; int subdist, rowdist, coldist; float inSubMat[M][M], outSubMat[M][M], LU[M][M], L[M][M], U[M][M]; /* </reference> */ double t0, t1; t0 = wall_clock(); for (i=0; i<N; i++) { for (j=0; j<N; j++) { if (i==j) { outMat[i][j] = N; } else { outMat[i][j] = 1; } } } /* <master id="123456"> */ for (i = 0; i < N; i = i + M) { j = i + M - 1; dist = M; if (j > N-1) { j = N-1; dist = N - i; } // LU factors for submatrix for (k1 = 0; k1 < dist; k1++) { for (k2 = 0; k2 < dist; k2++) { inSubMat[k1][k2] = outMat[i+k1][i+k2]; } } LUFactor(inSubMat, outSubMat, dist); //update for (k1 = 0; k1 < dist; k1++) { for (k2 = 0; k2 < dist; k2++) { outMat[i+k1][i+k2] = outSubMat[k1][k2]; LU[k1][k2] = outSubMat[k1][k2]; } } for (k1 = j + 1; k1 < N; k1 = k1 + M) { k2 = k1 + M - 1; subdist = M; if (k2 > N-1) { k2 = N - 1; subdist = N - k1; } //Solve LZ for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { inSubMat[p1-i][p2-k1] = outMat[p1][p2]; } } TriangleSolver(LU, inSubMat, outSubMat, subdist, 1); //update for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { outMat[p1][p2] = outSubMat[p1-i][p2-k1]; } } //Solve WU for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { inSubMat[p2-k1][p1-i] = outMat[p2][p1]; } } TriangleSolver(LU, inSubMat, outSubMat, subdist, 2); //update for (p1 = i; p1 < i+M; p1++) { for (p2 = k1; p2 <= k2; p2++) { outMat[p2][p1] = outSubMat[p2-k1][p1-i]; } } } /* <send var="i" type="int"/> */ /* <send var="outMat" type="float[N(i~N) ][N(i~N) ]"/> */ /* <worker> */ /* <read var="i" type="int"/> */ /* <read var="outMat" type="float[N(i~i+M)][N(i~N) ]"/> */ /* <read var="outMat" type="float[N(k1) ][N(i~N) ]"/> */ //A = A - WZ /* <target index="k1" limits="(i+M,N,M)" chunk="M" order="1"> */ for (k1 = i + M; k1 < N; k1 = k1 + M) /* </target> */ { k2 = k1 + M - 1; rowdist = M; if (k2 > N-1) { k2 = N - 1; rowdist = N - k1; } for (p1 = i + M; p1 < N; p1 = p1 + M) { p2 = p1 + M - 1; coldist = M; if (p2 > N-1) { p2 = N - 1; coldist = N - p1; } /* * matrix multiplication * outMat[k1:k2][p1:p2] = outMat[k1:k2][p1:p2] - outMat[k1:k2][i:i+M-1] * outMat[i:i+M-1][k1:k2]; */ for (q1 = k1; q1 <= k2; q1++) { for (q2 = p1; q2 <= p2; q2++) { for (q3 = 0; q3 < M; q3++) { outMat[q1][q2] = outMat[q1][q2] - outMat[q1][i+q3]*outMat[i+q3][q2]; } } } } } /* <send var="outMat" type="float[N(k1) ][N(i+M~N)]"/> */ /* </worker> */ /* <read var="outMat" type="float[N(i+M~N) ][N(i+M~N)]"/> */ } /* </master> */ /* for (i=0; i<N; i++) { for (j=0; j<N; j++) { printf("%6.3f ", outMat[i][j]); } printf("\n"); } */ t1 = wall_clock() - t0; if (t1>0) printf(" (%f) MFLOPS.\n", (float) 2*N*N*N/3/t1); else printf(" MFLOPS: Not measured.\n"); printf("elapse time = %10.6f\n", t1/1000000); return 0; }