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!");
156 virtual void load_mesh(
const int nDim,
const int numNodes,
const int numDofs,
167 ASSERT(
false,
"Function load_mesh is not implemented for linsys type %s \n.",
typeid(*this).name() );
172 ASSERT(
false,
"Function load_diagonal is not implemented for linsys type %s \n.",
typeid(*this).name() );
204 ASSERT(
false,
"Function get_matrix is not implemented for linsys type %s \n.",
typeid(*this).name() );
219 ASSERT(
false,
"Function get_rhs is not implemented for linsys type %s \n.",
typeid(*this).name() );
252 ASSERT(
false,
"Function set_matrix is not implemented for linsys type %s \n.",
typeid(*this).name() );
260 ASSERT(
false,
"Function set_rhs is not implemented for linsys type %s \n.",
typeid(*this).name() );
265 ASSERT(
false,
"Function mat_zero_entries is not implemented for linsys type %s \n.",
typeid(*this).name() );
270 ASSERT(
false,
"Function vec_zero_entries is not implemented for linsys type %s \n.",
typeid(*this).name() );
285 if (sol_array == NULL) {
311 ASSERT(
false,
"Function get_whole_solution is not implemented for linsys type %s \n.",
typeid(*this).name() );
319 ASSERT(
false,
"Function set_whole_solution is not implemented for linsys type %s \n.",
typeid(*this).name() );
327 ASSERT(
false,
"Function start_allocation is not implemented for linsys type %s \n.",
typeid(*this).name() );
335 ASSERT(
false,
"Function start_add_assembly is not implemented for linsys type %s \n.",
typeid(*this).name() );
343 ASSERT(
false,
"Function start_insert_assembly is not implemented for linsys type %s \n.",
typeid(*this).name() );
355 virtual void mat_set_values(
int nrow,
int *rows,
int ncol,
int *cols,
double *vals)=0;
378 inline void set_values(
int nrow,
int *rows,
int ncol,
int *cols,PetscScalar *mat_vals, PetscScalar *rhs_vals)
398 const arma::mat &
matrix,
const arma::vec &
rhs,
399 const arma::vec &row_solution,
const arma::vec &col_solution)
403 arma::vec tmp_rhs =
rhs;
404 bool negative_row =
false;
405 bool negative_col =
false;
407 for(
unsigned int l_row = 0; l_row < row_dofs.size(); l_row++)
408 if (row_dofs[l_row] < 0) {
409 tmp.row(l_row).zeros();
414 for(
unsigned int l_col = 0; l_col < col_dofs.size(); l_col++)
415 if (col_dofs[l_col] < 0) {
416 tmp_rhs -= tmp.col(l_col) * col_solution[l_col];
420 if (negative_row && negative_col) {
422 for(
unsigned int l_row = 0; l_row < row_dofs.size(); l_row++)
423 if (row_dofs[l_row] < 0)
424 for(
unsigned int l_col = 0; l_col < col_dofs.size(); l_col++)
425 if (col_dofs[l_col] < 0 && row_dofs[l_row] == col_dofs[l_col]) {
426 double new_diagonal = fabs(matrix.at(l_row,l_col));
427 if (new_diagonal == 0.0)
428 if (matrix.is_square()) {
429 new_diagonal = arma::sum( abs(matrix.diag())) / matrix.n_rows;
431 new_diagonal = arma::accu( abs(matrix) ) / matrix.n_elem;
433 tmp.at(l_row, l_col) = new_diagonal;
434 tmp_rhs(l_row) = new_diagonal * row_solution[l_row];
440 for(
int &row : row_dofs) row=abs(row);
443 for(
int &col : col_dofs) col=abs(col);
446 mat_set_values(row_dofs.size(),
const_cast<int *
>(&(row_dofs[0])),
447 col_dofs.size(),
const_cast<int *
>(&(col_dofs[0])), tmp.memptr() );
448 rhs_set_values(row_dofs.size(),
const_cast<int *
>(&(row_dofs[0])), tmp_rhs.memptr() );
472 virtual int solve()=0;
572 ASSERT(
false,
"Function view is not implemented for linsys type %s \n.",
typeid(*this).name() );