Liebe Gitlab-Nutzer, lieber Gitlab-Nutzer, es ist nun möglich sich mittels des ZIH-Logins/LDAP an unserem Dienst anzumelden. Ein Anmelden über dieses erzeugt ein neues Konto. Das alte Konto ist über den Reiter "Standard" erreichbar. Die Administratoren

Dear Gitlab user, it is now possible to log in to our service using the ZIH login/LDAP. Logging in via this will create a new account. The old account can be accessed via the "Standard" tab. The administrators

Commit a9ba2f66 authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

* UMFPack solver can now deal with muliple componets having different number of nodes

parent 493f4b49
......@@ -44,8 +44,22 @@ namespace AMDiS {
// Number of systems.
int nComponents = m->getSize();
// Size of the new composed matrix.
int newMatrixSize = ((*m)[0][0])->getFESpace()->getAdmin()->getUsedSize() * nComponents;
// Calculate size of the new composed matrix.
int newMatrixSize = 0;
std::vector<int> matricesSize(nComponents);
for (int i = 0; i < nComponents; i++) {
for (int j = 0; j < nComponents; j++) {
if ((*m)[i][j]) {
matricesSize[i] = ((*m)[i][j])->getFESpace()->getAdmin()->getUsedSize();
newMatrixSize += matricesSize[i];
break;
}
}
}
// int newMatrixSize = ((*m)[0][0])->getFESpace()->getAdmin()->getUsedSize() * nComponents;
// The new matrix has to be stored in compressed col format, therefore
// the cols are collected.
......@@ -54,34 +68,44 @@ namespace AMDiS {
// Counter for the number of non-zero elements in the new matrix.
int nElements = 0;
for (int stencilRow = 0; stencilRow < nComponents; stencilRow++) {
for (int stencilRow = 0, shiftRow = 0; stencilRow < nComponents; stencilRow++) {
int shiftCol = 0;
for (int stencilCol = 0; stencilCol < nComponents; stencilCol++) {
if (!(*m)[stencilRow][stencilCol]) {
shiftCol += matricesSize[stencilCol];
continue;
}
DOFMatrix::Iterator matrixRow((*m)[stencilRow][stencilCol], USED_DOFS);
int rowIndex = 0;
for (matrixRow.reset(); !matrixRow.end(); matrixRow++, rowIndex++) {
for (int i = 0; i < static_cast<int>((*matrixRow).size()); i++) {
for (int i = 0; i < static_cast<int>((*matrixRow).size()); i++) {
if ((*matrixRow)[i].col >= 0) {
MatEntry me;
me.entry = (*matrixRow)[i].entry;
// The col field is used to store the row number of the new element.
me.col = (rowIndex * nComponents) + stencilRow;
me.col = rowIndex + shiftRow;
// And save the new element in the corresponding column.
cols[((*matrixRow)[i].col * nComponents) + stencilCol].push_back(me);
cols[(*matrixRow)[i].col + shiftCol].push_back(me);
nElements++;
}
}
}
}
}
shiftCol += matricesSize[stencilCol];
}
shiftRow += matricesSize[stencilRow];
}
// Data fields for UMFPack.
int *Ap = (int*)malloc(sizeof(int) * (newMatrixSize + 1));
int *Ai = (int*)malloc(sizeof(int) * nElements);
......@@ -90,15 +114,15 @@ namespace AMDiS {
double *xvec = (double*)malloc(sizeof(double) * newMatrixSize);
// Resort the right hand side of the linear system.
for (int i = 0; i < b->getSize(); i++) {
for (int i = 0, counter = 0; i < b->getSize(); i++) {
DOFVector<double>::Iterator it(b->getDOFVector(i), USED_DOFS);
int counter = 0;
for (it.reset(); !it.end(); ++it, counter++) {
bvec[counter * nComponents + i] = *it;
for (it.reset(); !it.end(); ++it) {
bvec[counter++] = *it;
}
}
// Create fields Ap, Ai and Ax.
int elCounter = 0;
Ap[0] = 0;
......@@ -164,12 +188,11 @@ namespace AMDiS {
// Copy and resort solution.
for (int i = 0; i < x->getSize(); i++) {
for (int i = 0, counter = 0; i < x->getSize(); i++) {
DOFVector<double>::Iterator it(x->getDOFVector(i), USED_DOFS);
int counter = 0;
for (it.reset(); !it.end(); it++, counter++) {
*it = xvec[counter * nComponents + i];
for (it.reset(); !it.end(); it++) {
*it = xvec[counter++];
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment