コード例 #1
0
ファイル: rkocp2.c プロジェクト: r-barnes/ocp
// 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;
}
コード例 #2
0
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);
}
コード例 #3
0
ファイル: blu_parallel.c プロジェクト: jys673/Synergy
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;
}
コード例 #4
0
ファイル: blu_seq.c プロジェクト: jys673/Synergy
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;
}