130 int lsizeInt =
static_cast<int>( rows_ds->
lsize() );
133 size_ =
static_cast<unsigned>( sizeInt );
149 ASSERT(
false,
"Using copy constructor of LinSys is not allowed!");
182 ASSERT(
false,
"Function get_matrix is not implemented for linsys type %s \n.",
typeid(*this).name() );
197 ASSERT(
false,
"Function get_rhs is not implemented for linsys type %s \n.",
typeid(*this).name() );
230 ASSERT(
false,
"Function set_matrix is not implemented for linsys type %s \n.",
typeid(*this).name() );
238 ASSERT(
false,
"Function set_rhs is not implemented for linsys type %s \n.",
typeid(*this).name() );
246 ASSERT(
false,
"Function mat_zero_entries is not implemented for linsys type %s \n.",
typeid(*this).name() );
254 ASSERT(
false,
"Function vec_zero_entries is not implemented for linsys type %s \n.",
typeid(*this).name() );
269 if (sol_array == NULL) {
295 ASSERT(
false,
"Function get_whole_solution is not implemented for linsys type %s \n.",
typeid(*this).name() );
303 ASSERT(
false,
"Function set_whole_solution is not implemented for linsys type %s \n.",
typeid(*this).name() );
311 ASSERT(
false,
"Function start_allocation is not implemented for linsys type %s \n.",
typeid(*this).name() );
319 ASSERT(
false,
"Function start_add_assembly is not implemented for linsys type %s \n.",
typeid(*this).name() );
327 ASSERT(
false,
"Function start_insert_assembly is not implemented for linsys type %s \n.",
typeid(*this).name() );
339 virtual void mat_set_values(
int nrow,
int *rows,
int ncol,
int *cols,
double *vals)=0;
362 inline void set_values(
int nrow,
int *rows,
int ncol,
int *cols,PetscScalar *mat_vals, PetscScalar *rhs_vals)
382 const arma::mat &
matrix,
const arma::vec &
rhs,
383 const arma::vec &row_solution,
const arma::vec &col_solution)
387 arma::vec tmp_rhs =
rhs;
388 bool negative_row =
false;
389 bool negative_col =
false;
391 for(
unsigned int l_row = 0; l_row < row_dofs.size(); l_row++)
392 if (row_dofs[l_row] < 0) {
393 tmp.row(l_row).zeros();
398 for(
unsigned int l_col = 0; l_col < col_dofs.size(); l_col++)
399 if (col_dofs[l_col] < 0) {
400 tmp_rhs -= tmp.col(l_col) * col_solution[l_col];
404 if (negative_row && negative_col) {
406 for(
unsigned int l_row = 0; l_row < row_dofs.size(); l_row++)
407 if (row_dofs[l_row] < 0)
408 for(
unsigned int l_col = 0; l_col < col_dofs.size(); l_col++)
409 if (col_dofs[l_col] < 0 && row_dofs[l_row] == col_dofs[l_col]) {
410 double new_diagonal = fabs(matrix.at(l_row,l_col));
411 if (new_diagonal == 0.0)
412 if (matrix.is_square()) {
413 new_diagonal = arma::sum( abs(matrix.diag())) / matrix.n_rows;
415 new_diagonal = arma::accu( abs(matrix) ) / matrix.n_elem;
417 tmp.at(l_row, l_col) = new_diagonal;
418 tmp_rhs(l_row) = new_diagonal * row_solution[l_row];
424 for(
int &row : row_dofs) row=abs(row);
427 for(
int &col : col_dofs) col=abs(col);
430 mat_set_values(row_dofs.size(),
const_cast<int *
>(&(row_dofs[0])),
431 col_dofs.size(),
const_cast<int *
>(&(col_dofs[0])), tmp.memptr() );
432 rhs_set_values(row_dofs.size(),
const_cast<int *
>(&(row_dofs[0])), tmp_rhs.memptr() );
456 virtual int solve()=0;
556 ASSERT(
false,
"Function view is not implemented for linsys type %s \n.",
typeid(*this).name() );