Commit 1500f6ae authored by Thomas Witkowski's avatar Thomas Witkowski
Browse files

* Dies und jenes

* OpenMP-Versuche aus Vorkonditionierern und Loesern geloescht
parent afc60495
...@@ -331,7 +331,7 @@ link_all_deplibs=unknown ...@@ -331,7 +331,7 @@ link_all_deplibs=unknown
sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
# Run-time system search path for libraries # Run-time system search path for libraries
sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/qt-3.3/lib " sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
# Fix the shell variable $srcfile for the compiler. # Fix the shell variable $srcfile for the compiler.
fix_srcfile_path="" fix_srcfile_path=""
...@@ -7550,7 +7550,7 @@ link_all_deplibs=unknown ...@@ -7550,7 +7550,7 @@ link_all_deplibs=unknown
sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
# Run-time system search path for libraries # Run-time system search path for libraries
sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/qt-3.3/lib " sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
# Fix the shell variable $srcfile for the compiler. # Fix the shell variable $srcfile for the compiler.
fix_srcfile_path="" fix_srcfile_path=""
...@@ -7861,7 +7861,7 @@ link_all_deplibs=unknown ...@@ -7861,7 +7861,7 @@ link_all_deplibs=unknown
sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../ /lib/i386-redhat-linux/3.4.6/ /lib/ /usr/lib/i386-redhat-linux/3.4.6/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../ /lib/i386-redhat-linux/3.4.6/ /lib/ /usr/lib/i386-redhat-linux/3.4.6/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
# Run-time system search path for libraries # Run-time system search path for libraries
sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/qt-3.3/lib " sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
# Fix the shell variable $srcfile for the compiler. # Fix the shell variable $srcfile for the compiler.
fix_srcfile_path="" fix_srcfile_path=""
......
...@@ -497,6 +497,7 @@ namespace AMDiS { ...@@ -497,6 +497,7 @@ namespace AMDiS {
int numPoints = quadrature->getNumPoints(); int numPoints = quadrature->getNumPoints();
double *c = GET_MEMORY(double, numPoints); double *c = GET_MEMORY(double, numPoints);
for (int iq = 0; iq < numPoints; iq++) { for (int iq = 0; iq < numPoints; iq++) {
c[iq] = 0.0; c[iq] = 0.0;
} }
...@@ -525,7 +526,7 @@ namespace AMDiS { ...@@ -525,7 +526,7 @@ namespace AMDiS {
} }
} }
} }
} else { /* non symmetric assembling */ } else { // non symmetric assembling
for (int iq = 0; iq < numPoints; iq++) { for (int iq = 0; iq < numPoints; iq++) {
c[iq] *= elInfo->getDet(); c[iq] *= elInfo->getDet();
...@@ -542,6 +543,7 @@ namespace AMDiS { ...@@ -542,6 +543,7 @@ namespace AMDiS {
} }
} }
} }
FREE_MEMORY(c, double, numPoints); FREE_MEMORY(c, double, numPoints);
FREE_MEMORY(phival, double, nCol); FREE_MEMORY(phival, double, nCol);
} }
...@@ -1394,10 +1396,11 @@ namespace AMDiS { ...@@ -1394,10 +1396,11 @@ namespace AMDiS {
Element *el = elInfo->getElement(); Element *el = elInfo->getElement();
checkForNewTraverse(); checkForNewTraverse();
checkQuadratures(); checkQuadratures();
if ((el != lastMatEl && el != lastVecEl) || !operat->isOptimized()) { if ((el != lastMatEl && el != lastVecEl) || !operat->isOptimized()) {
initElement(elInfo); initElement(elInfo);
} }
...@@ -1410,8 +1413,6 @@ namespace AMDiS { ...@@ -1410,8 +1413,6 @@ namespace AMDiS {
} else { } else {
if (rememberElMat) { if (rememberElMat) {
axpy(factor, *elementMatrix, *userMat); axpy(factor, *elementMatrix, *userMat);
//*userMat += *elementMatrix * factor;
//operat->addElementMatrix(elementMatrix, userMat, factor);
return; return;
} }
} }
...@@ -1427,11 +1428,9 @@ namespace AMDiS { ...@@ -1427,11 +1428,9 @@ namespace AMDiS {
if (zeroOrderAssembler) if (zeroOrderAssembler)
zeroOrderAssembler->calculateElementMatrix(elInfo, mat); zeroOrderAssembler->calculateElementMatrix(elInfo, mat);
if(rememberElMat && userMat) { if (rememberElMat && userMat) {
axpy(factor, *elementMatrix, *userMat); axpy(factor, *elementMatrix, *userMat);
//*userMat += *elementMatrix * factor; }
//operat->addElementMatrix(elementMatrix, userMat, factor);
}
} }
void Assembler::calculateElementVector(const ElInfo *elInfo, void Assembler::calculateElementVector(const ElInfo *elInfo,
...@@ -1597,27 +1596,40 @@ namespace AMDiS { ...@@ -1597,27 +1596,40 @@ namespace AMDiS {
ElementMatrix *Assembler::initElementMatrix(ElementMatrix *elMat, ElementMatrix *Assembler::initElementMatrix(ElementMatrix *elMat,
const ElInfo *elInfo) const ElInfo *elInfo)
{ {
if(!elMat) { if (!elMat) {
elMat = NEW ElementMatrix(nRow, nCol); elMat = NEW ElementMatrix(nRow, nCol);
} }
elMat->set(0.0); elMat->set(0.0);
DOFAdmin *rowAdmin = rowFESpace->getAdmin(); DOFAdmin *rowAdmin = rowFESpace->getAdmin();
DOFAdmin *colAdmin = colFESpace->getAdmin(); DOFAdmin *colAdmin = colFESpace->getAdmin();
Element *element = elInfo->getElement(); Element *element = elInfo->getElement();
/*
elMat->rowIndices = elMat->rowIndices =
rowFESpace->getBasisFcts()->getLocalIndices(element, rowFESpace->getBasisFcts()->getLocalIndices(element,
rowAdmin, rowAdmin,
NULL); NULL);
*/
/*
elMat->colIndices = elMat->colIndices =
colFESpace->getBasisFcts()->getLocalIndices(element, colFESpace->getBasisFcts()->getLocalIndices(element,
colAdmin, colAdmin,
NULL); NULL);
*/
rowFESpace->getBasisFcts()->getLocalIndicesVec(element,
rowAdmin,
&(elMat->rowIndices));
colFESpace->getBasisFcts()->getLocalIndicesVec(element,
colAdmin,
&(elMat->colIndices));
return elMat; return elMat;
} }
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <string> #include <string>
#include "Global.h" #include "Global.h"
#include "Boundary.h" #include "Boundary.h"
#include "MatrixVector.h"
namespace AMDiS { namespace AMDiS {
...@@ -318,6 +319,14 @@ namespace AMDiS { ...@@ -318,6 +319,14 @@ namespace AMDiS {
return NULL; return NULL;
}; };
/** \brief
* Returns local dof indices of the element for the given fe space.
*/
virtual void getLocalIndicesVec(const Element*,
const DOFAdmin*,
Vector<DegreeOfFreedom>*) const
{};
/** \brief /** \brief
* Evaluates elements value at barycentric coordinates lambda with local * Evaluates elements value at barycentric coordinates lambda with local
......
...@@ -450,15 +450,14 @@ namespace AMDiS { ...@@ -450,15 +450,14 @@ namespace AMDiS {
FUNCNAME("DOFMatrix::assemble()"); FUNCNAME("DOFMatrix::assemble()");
if (!op && operators.size() == 0) { if (!op && operators.size() == 0) {
//WARNING("no operator\n");
return NULL; return NULL;
} }
Operator *operat = op ? op : operators[0]; Operator *operat = op ? op : operators[0];
elementMatrix = elementMatrix =
operat->getAssembler()->initElementMatrix(elementMatrix, elInfo); operat->getAssembler()->initElementMatrix(elementMatrix, elInfo);
if (op) { if (op) {
op->getElementMatrix(elInfo, elementMatrix); op->getElementMatrix(elInfo, elementMatrix);
} else { } else {
...@@ -472,10 +471,11 @@ namespace AMDiS { ...@@ -472,10 +471,11 @@ namespace AMDiS {
elementMatrix, elementMatrix,
*factorIt ? **factorIt : 1.0); *factorIt ? **factorIt : 1.0);
} }
} }
addElementMatrix(factor, *elementMatrix, bound); addElementMatrix(factor, *elementMatrix, bound);
return elementMatrix; return elementMatrix;
} }
......
...@@ -1207,61 +1207,29 @@ namespace AMDiS { ...@@ -1207,61 +1207,29 @@ namespace AMDiS {
("a.size = %d too small: admin->sizeUsed = %d\n", ("a.size = %d too small: admin->sizeUsed = %d\n",
a.getSize(), rowAdmin->getUsedSize()); a.getSize(), rowAdmin->getUsedSize());
// This is the old implementation of the mv-multiplication. It have been changed
// because of the OpenMP-parallelization:
// typename DOFVector<T>::Iterator vecIterator(dynamic_cast<DOFIndexed<T>*>(&result), USED_DOFS);
// DOFMatrix::Iterator rowIterator(const_cast<DOFMatrix*>(&a), USED_DOFS);
// for(vecIterator.reset(), rowIterator.reset();
// !rowIterator.end();
// ++rowIterator, ++vecIterator) {
// sum = 0;
// if(!add) *vecIterator = 0.0;
// for(::std::vector<MatEntry>::iterator colIterator = rowIterator->begin();
// colIterator != rowIterator->end();
// colIterator++) {
// jcol = colIterator->col;
// if (jcol >= 0) { // entry used?
// sum += (static_cast<double>(colIterator->entry)) * x[jcol];
// } else {
// if (jcol == DOFMatrix::NO_MORE_ENTRIES)
// break;
// }
// }
// *vecIterator += sum;
// }
int i; typename DOFVector<T>::Iterator vecIterator(dynamic_cast<DOFIndexed<T>*>(&result), USED_DOFS);
int maxI = result.getSize(); DOFMatrix::Iterator rowIterator(const_cast<DOFMatrix*>(&a), USED_DOFS);
for(vecIterator.reset(), rowIterator.reset();
#ifdef _OPENMP !rowIterator.end();
#pragma omp parallel for schedule(dynamic, 25000) default(shared) private(i) ++rowIterator, ++vecIterator) {
#endif
for (i = 0; i < maxI; i++) { double sum = 0;
if (rowAdmin->isDOFFree(i)) { if (!add)
continue; *vecIterator = 0.0;
} for(::std::vector<MatEntry>::iterator colIterator = rowIterator->begin();
colIterator != rowIterator->end();
T sum = 0; colIterator++) {
const ::std::vector<MatEntry> *v = &a[i]; int jcol = colIterator->col;
if (jcol >= 0) { // entry used?
for (int j = 0; j < static_cast<int>(v->size()); j++) { sum += (static_cast<double>(colIterator->entry)) * x[jcol];
const MatEntry *m = &((*v)[j]); } else {
int jcol = m->col; if (jcol == DOFMatrix::NO_MORE_ENTRIES)
break;
if (jcol >= 0) { // entry used? }
sum += (static_cast<double>(m->entry)) * x[jcol]; }
} else { *vecIterator += sum;
if (jcol == DOFMatrix::NO_MORE_ENTRIES)
break;
}
}
if (add) {
result[i] += sum;
} else {
result[i] = sum;
}
} }
} else if (transpose == Transpose) { } else if (transpose == Transpose) {
......
...@@ -235,10 +235,6 @@ namespace AMDiS { ...@@ -235,10 +235,6 @@ namespace AMDiS {
el = elInfo->getElement(); el = elInfo->getElement();
// if (el->getIndex() == 66065) {
// ::std::cout << "UNSER ELEMENT!" << ::std::endl;
// }
double det = elInfo->getDet(); double det = elInfo->getDet();
const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda();
...@@ -246,11 +242,11 @@ namespace AMDiS { ...@@ -246,11 +242,11 @@ namespace AMDiS {
double h2 = h2_from_det(det, dim); double h2 = h2_from_det(det, dim);
for(iq = 0; iq < numPoints; iq++) { for (iq = 0; iq < numPoints; iq++) {
riq[iq] = 0.0; riq[iq] = 0.0;
} }
for(system = 0; system < numSystems; system++) { for (system = 0; system < numSystems; system++) {
if(matrix[system] == NULL) continue; if(matrix[system] == NULL) continue;
......
...@@ -1004,7 +1004,7 @@ namespace AMDiS { ...@@ -1004,7 +1004,7 @@ namespace AMDiS {
GeoIndex posIndex; GeoIndex posIndex;
DegreeOfFreedom* result; DegreeOfFreedom* result;
if (indices) { if (indices) {
result = indices; result = indices;
} else { } else {
...@@ -1014,7 +1014,7 @@ namespace AMDiS { ...@@ -1014,7 +1014,7 @@ namespace AMDiS {
localVecSize = nBasFcts; localVecSize = nBasFcts;
result = localVec; result = localVec;
} }
for (pos = 0, j = 0; pos <= dim; pos++) { for (pos = 0, j = 0; pos <= dim; pos++) {
posIndex = INDEX_OF_DIM(pos, dim); posIndex = INDEX_OF_DIM(pos, dim);
n0 = admin->getNumberOfPreDOFs(posIndex); n0 = admin->getNumberOfPreDOFs(posIndex);
...@@ -1031,10 +1031,21 @@ namespace AMDiS { ...@@ -1031,10 +1031,21 @@ namespace AMDiS {
} }
} }
} }
return result; return result;
} }
void Lagrange::getLocalIndicesVec(const Element* el,
const DOFAdmin *admin,
Vector<DegreeOfFreedom> *indices) const
{
if (indices->getSize() < nBasFcts) {
indices->resize(nBasFcts);
}
getLocalIndices(el, admin, &((*indices)[0]));
}
void Lagrange::l2ScpFctBas(Quadrature *q, void Lagrange::l2ScpFctBas(Quadrature *q,
AbstractFunction<WorldVector<double>, WorldVector<double> >* f, AbstractFunction<WorldVector<double>, WorldVector<double> >* f,
DOFVector<WorldVector<double> >* fh) DOFVector<WorldVector<double> >* fh)
......
...@@ -152,6 +152,11 @@ namespace AMDiS { ...@@ -152,6 +152,11 @@ namespace AMDiS {
const DOFAdmin*, const DOFAdmin*,
DegreeOfFreedom*) const; DegreeOfFreedom*) const;
void getLocalIndicesVec(const Element*,
const DOFAdmin*,
Vector<DegreeOfFreedom>*) const;
/** \brief /** \brief
* Implements BasisFunction::l2ScpFctBas * Implements BasisFunction::l2ScpFctBas
*/ */
......
...@@ -237,11 +237,7 @@ namespace AMDiS { ...@@ -237,11 +237,7 @@ namespace AMDiS {
* Initialisation of the preconditioner * Initialisation of the preconditioner
*/ */
virtual void init() { virtual void init() {
int i; for (int i = 0; i < scalPrecons.getSize(); i++) {
#ifdef _OPENMP
#pragma omp parallel for schedule(static, 1) default(shared) private(i)
#endif
for (i = 0; i < scalPrecons.getSize(); i++) {
scalPrecons[i]->init(); scalPrecons[i]->init();
} }
}; };
...@@ -250,11 +246,7 @@ namespace AMDiS { ...@@ -250,11 +246,7 @@ namespace AMDiS {
* Preconditioning method * Preconditioning method
*/ */
virtual void precon(SystemVector *x) { virtual void precon(SystemVector *x) {
int i; for (int i = 0; i < scalPrecons.getSize(); i++) {
#ifdef _OPENMP
#pragma omp parallel for schedule(static, 1) default(shared) private(i)
#endif
for (i = 0; i < scalPrecons.getSize(); i++) {
scalPrecons[i]->precon(x->getDOFVector(i)); scalPrecons[i]->precon(x->getDOFVector(i));
} }
}; };
...@@ -263,11 +255,7 @@ namespace AMDiS { ...@@ -263,11 +255,7 @@ namespace AMDiS {
* Frees needed memory. * Frees needed memory.
*/ */
virtual void exit() { virtual void exit() {
int i; for (int i = 0; i < scalPrecons.getSize(); i++) {
#ifdef _OPENMP
#pragma omp parallel for schedule(static, 1) default(shared) private(i)
#endif
for (i = 0; i < scalPrecons.getSize(); i++) {
scalPrecons[i]->exit(); scalPrecons[i]->exit();
} }
}; };
......
...@@ -679,10 +679,6 @@ namespace AMDiS { ...@@ -679,10 +679,6 @@ namespace AMDiS {
} }
} }
TraverseStack stack;
DualTraverse dualStack;
ElInfo *elInfo;
for (int i = 0; i < numComponents_; i++) { for (int i = 0; i < numComponents_; i++) {
for (int j = 0; j < numComponents_; j++) { for (int j = 0; j < numComponents_; j++) {
// Only if this variable is true, the current matrix will be assembled. // Only if this variable is true, the current matrix will be assembled.
...@@ -708,19 +704,22 @@ namespace AMDiS { ...@@ -708,19 +704,22 @@ namespace AMDiS {
continue; continue;
} }
if (componentMeshes_[i] != componentMeshes_[j]) { if (componentMeshes_[i] != componentMeshes_[j]) {
ERROR_EXIT("not yet\n"); ERROR_EXIT("not yet\n");
} else { } else {
if (assembleMatrix && matrix->getBoundaryManager()) if (assembleMatrix && matrix->getBoundaryManager())
matrix->getBoundaryManager()->initMatrix(matrix); matrix->getBoundaryManager()->initMatrix(matrix);
elInfo = stack.traverseFirst(componentMeshes_[i], -1, assembleFlag); TraverseStack stack;
ElInfo *elInfo = stack.traverseFirst(componentMeshes_[i], -1, assembleFlag);
while (elInfo) { while (elInfo) {
const BoundaryType *bound = const BoundaryType *bound =
useGetBound_ ? useGetBound_ ?
componentSpaces_[i]->getBasisFcts()->getBound(elInfo, NULL) : componentSpaces_[i]->getBasisFcts()->getBound(elInfo, NULL) :
NULL; NULL;
if (assembleMatrix) { if (assembleMatrix) {
matrix->assemble(1.0, elInfo, bound); matrix->assemble(1.0, elInfo, bound);
if (matrix->getBoundaryManager()) { if (matrix->getBoundaryManager()) {
...@@ -732,12 +731,14 @@ namespace AMDiS { ...@@ -732,12 +731,14 @@ namespace AMDiS {
if (i == j) { if (i == j) {
rhs_->getDOFVector(i)->assemble(1.0, elInfo, bound); rhs_->getDOFVector(i)->assemble(1.0, elInfo, bound);
} }
elInfo = stack.traverseNext(elInfo); elInfo = stack.traverseNext(elInfo);
} }
if (assembleMatrix && matrix->getBoundaryManager()) if (assembleMatrix && matrix->getBoundaryManager())
matrix->getBoundaryManager()->exitMatrix(matrix); matrix->getBoundaryManager()->exitMatrix(matrix);
} }
assembledMatrix_[i][j] = true; assembledMatrix_[i][j] = true;
} }
...@@ -748,7 +749,8 @@ namespace AMDiS { ...@@ -748,7 +749,8 @@ namespace AMDiS {
if (solution_->getDOFVector(i)->getBoundaryManager()) if (solution_->getDOFVector(i)->getBoundaryManager())
solution_->getDOFVector(i)->getBoundaryManager()->initVector(solution_->getDOFVector(i)); solution_->getDOFVector(i)->getBoundaryManager()->initVector(solution_->getDOFVector(i));
elInfo = stack.traverseFirst(componentMeshes_[i], -1, assembleFlag); TraverseStack stack;
ElInfo *elInfo = stack.traverseFirst(componentMeshes_[i], -1, assembleFlag);
while (elInfo) { while (elInfo) {
if(rhs_->getDOFVector(i)->getBoundaryManager()) if(rhs_->getDOFVector(i)->getBoundaryManager())
rhs_->getDOFVector(i)->getBoundaryManager()-> rhs_->getDOFVector(i)->getBoundaryManager()->
...@@ -761,28 +763,11 @@ namespace AMDiS { ...@@ -761,28 +763,11 @@ namespace AMDiS {