Skip to content
Snippets Groups Projects
Commit 356c16ab authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

New handling of dirichlet bcs in dof matrix.

parent abf1850c
No related branches found
No related tags found
No related merge requests found
......@@ -147,8 +147,6 @@ namespace AMDiS {
}
}
// ok
DOFMatrix& DOFMatrix::operator=(const DOFMatrix& rhs)
{
TEST_EXIT(rhs.inserter == 0 && inserter == 0)("Cannot copy during insertion");
......@@ -158,6 +156,7 @@ namespace AMDiS {
operators = rhs.operators;
operatorFactor = rhs.operatorFactor;
matrix = rhs.matrix;
coupleMatrix = rhs.coupleMatrix;
if (rhs.boundaryManager) {
boundaryManager = NEW BoundaryManager(*rhs.boundaryManager);
} else {
......@@ -173,7 +172,6 @@ namespace AMDiS {
return *this;
}
void DOFMatrix::addElementMatrix(double sign,
const ElementMatrix &elMat,
const BoundaryType *bound,
......@@ -198,7 +196,7 @@ namespace AMDiS {
if (condition && condition->isDirichlet()) {
if (!coupleMatrix)
ins[row][row]= 1.0;
applyDBCs.insert(static_cast<int>(row));
} else
for (int j = 0; j < n_col; j++) { // for all columns
col = elMat.colIndices[j];
......@@ -211,7 +209,7 @@ namespace AMDiS {
}
}
double DOFMatrix::logAcc(DegreeOfFreedom a,DegreeOfFreedom b) const
double DOFMatrix::logAcc(DegreeOfFreedom a, DegreeOfFreedom b) const
{
return matrix[a][b];
}
......@@ -366,20 +364,9 @@ namespace AMDiS {
return fillFlag;
}
void DOFMatrix::axpy(double a,
const DOFMatrix& x,
const DOFMatrix& y)
void DOFMatrix::axpy(double a, const DOFMatrix& x, const DOFMatrix& y)
{
FUNCNAME("DOFMatrix::axpy");
TEST_EXIT(x.getRowFESpace() == y.getRowFESpace() &&
rowFESpace == x.getRowFESpace())
("row fe-spaces not equal\n");
TEST_EXIT(x.getColFESpace() == y.getColFESpace() &&
colFESpace == x.getColFESpace())
("col fe-spaces not equal\n");
matrix+= a * x.matrix + y.matrix;
}
......@@ -402,21 +389,12 @@ namespace AMDiS {
void DOFMatrix::removeRowsWithDBC(std::set<int> *rows)
{
ERROR_EXIT("TODO: removeRowsWithDBC");
// for (std::set<int>::iterator it = rows->begin();
// it != rows->end();
// ++it) {
// if (coupleMatrix) {
// matrix[*it].resize(0);
// } else {
// matrix[*it].resize(1);
// matrix[*it][0].col = *it;
// matrix[*it][0].entry = 1.0;
// }
// }
// rows->clear();
inserter_type &ins= *inserter;
for (std::set<int>::iterator it = rows->begin(); it != rows->end(); ++it)
ins[*it][*it] = 1.0;
rows->clear();
}
void DOFMatrix::createPictureFile(const char* filename, int dim)
......
......@@ -256,38 +256,26 @@ namespace AMDiS {
const bool& operator[](int i) const {ERROR_EXIT("Shouldn't be used, only fake."); return dummy;}
#endif
/** \brief
* DOFMatrix does not need to be compressed before assembling, when using MTL4.
*/
/// DOFMatrix does not need to be compressed before assembling, when using MTL4.
void compressDOFIndexed(int first, int last, std::vector<DegreeOfFreedom> &newDOF) {}
/** \brief
* Implements DOFIndexedBase::freeDOFContent()
*/
/// Implements DOFIndexedBase::freeDOFContent()
virtual void freeDOFContent(int index);
/** \brief
* Returns \ref coupleMatrix.
*/
/// Returns \ref coupleMatrix.
inline bool isCoupleMatrix() {
return coupleMatrix;
}
/** \brief
* Returns \ref coupleMatrix.
*/
/// Returns \ref coupleMatrix.
inline void setCoupleMatrix(bool c) {
coupleMatrix = c;
}
/** \brief
* a*x + y
*/
/// a * x + y
void axpy(double a, const DOFMatrix& x, const DOFMatrix& y);
/** \brief
* Multiplication with a scalar.
*/
/// Multiplication with a scalar.
void scal(double s);
/** \brief
......@@ -427,7 +415,7 @@ namespace AMDiS {
/// Returns number of rows (\ref matrix.size())
inline int getSize() const {
return num_rows(matrix);
return num_rows(matrix);
}
/** \brief
......@@ -438,7 +426,6 @@ namespace AMDiS {
return rowFESpace->getAdmin()->getUsedSize();
}
// Only fake, shouldn't be called
/** \brief
* Returns number of cols. For that, the function iteratos over all
......@@ -510,6 +497,7 @@ namespace AMDiS {
return boundaryManager;
}
/// Returns a pointer to \ref applyDBCs.
std::set<int>* getApplyDBCs() {
return &applyDBCs;
}
......@@ -621,7 +609,7 @@ namespace AMDiS {
std::string name;
/// Sparse matrix, type is a template parameter by default compressed2D<double>
base_matrix_type matrix;
base_matrix_type matrix;
/// Used while mesh traversal
static DOFMatrix *traversePtr;
......@@ -644,13 +632,22 @@ namespace AMDiS {
///
BoundaryManager *boundaryManager;
///
/** \brief
* If false, the matrix is a diagonal matrix within a matrix of DOF matrices.
* Otherwise the value is true, and the matrix is an off-diagonal matrix.
*/
bool coupleMatrix;
/// Temporary variable used in assemble()
ElementMatrix *elementMatrix;
///
/* \brief
* A set of row indices. When assembling the DOF matrix, all rows, that
* correspond to a dof at a dirichlet boundary, are ignored and the row is
* left blank. After assembling, the diagonal element of the matrix must be
* set to 1. The indices of all rows, where this should be done, are stored
* in this set.
*/
std::set<int> applyDBCs;
#ifdef HAVE_PARALLEL_AMDIS
......@@ -659,7 +656,7 @@ namespace AMDiS {
#endif
/// Inserter object: implemented as pointer, allocated and deallocated as needed
inserter_type *inserter;
inserter_type *inserter;
friend class DOFAdmin;
friend class DOFVector<double>;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment