// -------------------------------------------------------------------- // add_rhs_influence // -------------------------------------------------------------------- void LinearSolver::add_rhs_influence() { if (! initializedMatrix_ ) partition_matrix(); // rhs = rhs + K_free,fixed * x_fixed int nbcs = bcs_->size(); if (nbcs == 0) { // no bcs to handle b_ = rhs_; } else { DENS_VEC & b = rhsDense_; if ( ! homogeneousBCs_ ){ DENS_VEC xFixed(nbcs); BC_SET::const_iterator itr; int i = 0; for (itr = bcs_->begin(); itr != bcs_->end(); itr++,i++) { double v = itr->second; xFixed(i,0) = -v; } b = matrixFreeFixed_*xFixed; // matrix and bcs have same ordering } else { b.reset(matrixFreeFixed_.nRows()); } const VECTOR & r = *rhs_; set<int>::const_iterator iter; int i = 0; for (iter = freeSet_.begin(); iter != freeSet_.end(); iter++,i++) { b(i) += r(*iter); } b_ = &rhsDense_; } }
// -------------------------------------------------------------------- // initialize_matrix // -------------------------------------------------------------------- void LinearSolver::initialize_matrix(void) { if ( initializedMatrix_ ) return; if (constraintHandlerType_ == PENALIZE_CONSTRAINTS) { add_matrix_penalty(); } else if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) { partition_matrix(); } initializedMatrix_ = true; }
matrix_t matrix_multiplication_strassen(matrix_t mat_a, matrix_t mat_b, matrix_t mat_c, int min_thres) { int len = mat_a.row_end - mat_a.row_start + 1; matrix_t p1, p2, p3, p4, p5, p6, p7; matrix_t c_copy = mat_c; /* if (len != pow(2, log2(len))) { */ /* printf("Strassen Algorithm not applicable\n"); */ /* return mat_c; */ /* } */ if (len <= min_thres) { return matrix_multiplication(mat_a, mat_b, mat_c); } else { printf("Divide and Conquer\n"); matrix_init(&p1, &p2, &p3, &p4, &p5, &p6, &p7, len/2); matrix_multiplication_strassen(partition_matrix(mat_a, 1, 1), matrix_subtraction(partition_matrix(mat_b, 1, 2), partition_matrix(mat_b, 2, 2), p1), p1, min_thres); matrix_multiplication_strassen(partition_matrix(mat_b, 2, 2), matrix_addition(partition_matrix(mat_a, 1, 1), partition_matrix(mat_a, 1, 2), p2), p2, min_thres); matrix_multiplication_strassen(partition_matrix(mat_b, 1, 1), matrix_addition(partition_matrix(mat_a, 2, 1), partition_matrix(mat_a, 2, 2), p3), p3, min_thres); matrix_multiplication_strassen(partition_matrix(mat_a, 2, 2), matrix_subtraction(partition_matrix(mat_b, 2, 1), partition_matrix(mat_b, 1, 1), p3), p3, min_thres); matrix_addition(matrix_multiplication_strassen(partition_matrix(mat_a, 1, 1), matrix_addition(partition_matrix(mat_b, 1, 1), partition_matrix(mat_b, 2, 2), p5), p5, min_thres), matrix_multiplication_strassen(partition_matrix(mat_a, 2, 2), matrix_addition(partition_matrix(mat_b, 1, 1), partition_matrix(mat_b, 2, 2), p5), p5, min_thres), p5); matrix_subtraction(matrix_multiplication_strassen(partition_matrix(mat_a, 1, 2), matrix_addition(partition_matrix(mat_b, 2, 1), partition_matrix(mat_b, 2, 2), p6), p6, min_thres), matrix_multiplication_strassen(partition_matrix(mat_a, 2, 2), matrix_addition(partition_matrix(mat_b, 2, 1), partition_matrix(mat_b, 2, 2), p6), p6, min_thres), p6); matrix_subtraction(matrix_multiplication_strassen(partition_matrix(mat_a, 1, 1), matrix_addition(partition_matrix(mat_b, 1, 1), partition_matrix(mat_b, 1, 2), p7), p7, min_thres), matrix_multiplication_strassen(partition_matrix(mat_a, 2, 1), matrix_addition(partition_matrix(mat_b, 1, 1), partition_matrix(mat_b, 1, 2), p7), p7, min_thres), p7); matrix_addition(matrix_addition(p5, p4, partition_matrix(mat_c, 1, 1)), matrix_subtraction(p6, p2, partition_matrix(mat_c, 1, 1)), partition_matrix(mat_c, 1, 1)); matrix_addition(p1, p2, partition_matrix(mat_c, 1, 2)); matrix_addition(p3, p4, partition_matrix(mat_c, 2, 1)); matrix_subtraction(matrix_addition(p5, p1, partition_matrix(mat_c, 2, 2)), matrix_addition(p3, p7, partition_matrix(mat_c, 2, 2)), partition_matrix(mat_c, 2, 2)); mat_c.row_start = c_copy.row_start; mat_c.row_end = c_copy.row_end; mat_c.column_start = c_copy.column_start; mat_c.column_end = c_copy.column_end; print_matrix(mat_c); return mat_c; } }