Exemple #1
0
// --------------------------------------------------------------------
//  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_;
  }
}
Exemple #2
0
// --------------------------------------------------------------------
//  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;
}
Exemple #3
0
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;

    }
}