From 4dea0e15042a06a00e82ca90023a664c772b9602 Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Wed, 13 May 2009 08:08:01 +0000 Subject: [PATCH] Better solution to create element matrices for assembling on different meshes. --- AMDiS/bin/Makefile.am | 1 - AMDiS/src/Assembler.cc | 50 ++++++++++++-------- AMDiS/src/DOFIterator.h | 31 ++++++------ AMDiS/src/DOFVector.cc | 30 ++++++------ AMDiS/src/DOFVector.h | 6 ++- AMDiS/src/DualTraverse.cc | 15 ++++-- AMDiS/src/ElInfo.cc | 11 ++--- AMDiS/src/ElInfo.h | 46 +++++++++--------- AMDiS/src/ElInfo1d.cc | 65 ++++++++++++++------------ AMDiS/src/ElInfo1d.h | 13 ++++-- AMDiS/src/ElInfo2d.cc | 32 +------------ AMDiS/src/ElInfo2d.h | 7 --- AMDiS/src/ElInfo3d.cc | 2 + AMDiS/src/ElInfo3d.h | 7 --- AMDiS/src/FirstOrderAssembler.cc | 26 ++++------- AMDiS/src/Operator.cc | 78 ++++++++++++------------------- AMDiS/src/Operator.h | 56 +++++++--------------- AMDiS/src/ProblemVec.cc | 34 +++++--------- AMDiS/src/SecondOrderAssembler.cc | 38 +++++++-------- AMDiS/src/Traverse.cc | 19 ++++---- AMDiS/src/Traverse.h | 3 +- AMDiS/src/ZeroOrderAssembler.cc | 5 +- 22 files changed, 245 insertions(+), 330 deletions(-) diff --git a/AMDiS/bin/Makefile.am b/AMDiS/bin/Makefile.am index 04ad127f..22e25027 100644 --- a/AMDiS/bin/Makefile.am +++ b/AMDiS/bin/Makefile.am @@ -16,7 +16,6 @@ if USE_PARALLEL_AMDIS $(PARALLEL_DIR)/MeshStructure_ED.h \ $(PARALLEL_DIR)/ParallelError.h $(PARALLEL_DIR)/ParallelError.hh \ $(PARALLEL_DIR)/ParallelProblem.h $(PARALLEL_DIR)/ParallelProblem.cc \ - $(PARALLEL_DIR)/ParallelDomainProblem.h $(PARALLEL_DIR)/ParallelDomainProblem.cc \ $(PARALLEL_DIR)/ParMetisPartitioner.h $(PARALLEL_DIR)/ParMetisPartitioner.cc \ $(PARALLEL_DIR)/PartitionElementData.h PARALLEL_INCLUDES = -I/work/home7/witkowsk/local/include \ diff --git a/AMDiS/src/Assembler.cc b/AMDiS/src/Assembler.cc index 50a4f276..6f816dab 100644 --- a/AMDiS/src/Assembler.cc +++ b/AMDiS/src/Assembler.cc @@ -109,22 +109,35 @@ namespace AMDiS { ElementMatrix& mat = rememberElMat ? elementMatrix : userMat; - TEST_EXIT(zeroOrderAssembler)("Not yet implemented for not zero order assembler!\n"); - - if (secondOrderAssembler) + if (secondOrderAssembler) { secondOrderAssembler->calculateElementMatrix(smallElInfo, mat); - if (firstOrderAssemblerGrdPsi) + + ElementMatrix m(nRow, nRow); + smallElInfo->getSubElemCoordsMat_so(m, rowFESpace->getBasisFcts()->getDegree()); + ElementMatrix tmpMat(nRow, nRow); + tmpMat = m * mat; + mat = tmpMat; + } + + if (firstOrderAssemblerGrdPsi) { + ERROR_EXIT("Not yet implemented for not zero order assembler!\n"); firstOrderAssemblerGrdPsi->calculateElementMatrix(smallElInfo, mat); - if (firstOrderAssemblerGrdPhi) + } + + if (firstOrderAssemblerGrdPhi) { + ERROR_EXIT("Not yet implemented for not zero order assembler!\n"); firstOrderAssemblerGrdPhi->calculateElementMatrix(smallElInfo, mat); - if (zeroOrderAssembler) - zeroOrderAssembler->calculateElementMatrix(smallElInfo, mat); + } - const mtl::dense2D<double>& m = smallElInfo->getSubElemCoordsMat(); - ElementMatrix tmpMat(nRow, nRow); - tmpMat = m * mat; - mat = tmpMat; + if (zeroOrderAssembler) { + zeroOrderAssembler->calculateElementMatrix(smallElInfo, mat); + ElementMatrix m(nRow, nRow); + smallElInfo->getSubElemCoordsMat(m, rowFESpace->getBasisFcts()->getDegree()); + ElementMatrix tmpMat(nRow, nRow); + tmpMat = m * mat; + mat = tmpMat; + } if (rememberElMat) userMat += factor * elementMatrix; @@ -240,23 +253,20 @@ namespace AMDiS { FUNCNAME("Assembler::matVecAssemble()"); Element *el = elInfo->getElement(); - const BasisFunction *basFcts = rowFESpace->getBasisFcts(); - int nBasFcts = basFcts->getNumber(); - double *uhOldLoc = new double[nBasFcts]; + double *uhOldLoc = new double[nRow]; operat->uhOld->getLocalVector(el, uhOldLoc); if (el != lastMatEl) calculateElementMatrix(elInfo, elementMatrix); - for (int i = 0; i < nBasFcts; i++) { + for (int i = 0; i < nRow; i++) { double val = 0.0; - for (int j = 0; j < nBasFcts; j++) { + for (int j = 0; j < nRow; j++) { val += elementMatrix[i][j] * uhOldLoc[j]; } vec[i] += val; - } - + } delete [] uhOldLoc; } @@ -283,7 +293,8 @@ namespace AMDiS { operat->uhOld->getLocalVector(auxEl, uhOldLoc); - const mtl::dense2D<double>& m = smallElInfo->getSubElemCoordsMat(); + mtl::dense2D<double> m(nRow, nRow); + smallElInfo->getSubElemCoordsMat(m, rowFESpace->getBasisFcts()->getDegree()); for (int i = 0; i < nBasFcts; i++) { uhOldLoc2[i] = 0.0; @@ -306,7 +317,6 @@ namespace AMDiS { vec[i] += val; } - delete [] uhOldLoc; delete [] uhOldLoc2; } diff --git a/AMDiS/src/DOFIterator.h b/AMDiS/src/DOFIterator.h index 6be65ae1..a61d3e01 100644 --- a/AMDiS/src/DOFIterator.h +++ b/AMDiS/src/DOFIterator.h @@ -72,14 +72,13 @@ namespace AMDiS { virtual void reset() { position = 0; dofFreeIterator = dofFree->begin(); - if(dofFreeIterator == dofFree->end()) { + if (dofFreeIterator == dofFree->end()) return; - } + goToBeginOfIteratedObject(); - if(type != ALL_DOFS) { - if(*dofFreeIterator == (type == USED_DOFS)) + if (type != ALL_DOFS) + if (*dofFreeIterator == (type == USED_DOFS)) operator++(); - } } /** \brief @@ -196,14 +195,20 @@ namespace AMDiS { virtual void decObjectIterator() {} protected: - DOFAdmin *dofAdmin; /**< DOFAdmin which contains - * the dofFree vector - */ - int position; /**< current position index */ - std::vector<bool> *dofFree; /**< stores which DOFs are used - */ - std::vector<bool>::iterator dofFreeIterator; /**< iterator for dofFree */ - const DOFIteratorType type; /**< type of this iterator */ + /// DOFAdmin which contains the dofFree vector. + DOFAdmin *dofAdmin; + + /// Current position index. + int position; + + /// Stores which DOFs are used. + std::vector<bool> *dofFree; + + /// Iterator for dofFree. + std::vector<bool>::iterator dofFreeIterator; + + /// Type of this iterator. + const DOFIteratorType type; }; diff --git a/AMDiS/src/DOFVector.cc b/AMDiS/src/DOFVector.cc index 38be5c24..f90020f5 100644 --- a/AMDiS/src/DOFVector.cc +++ b/AMDiS/src/DOFVector.cc @@ -1,5 +1,4 @@ #include <boost/numeric/mtl/mtl.hpp> - #include "DOFVector.h" #include "Traverse.h" #include "DualTraverse.h" @@ -314,10 +313,8 @@ namespace AMDiS { TEST_EXIT_DBG(quad || quadFast)("neither quad nor quadFast defined\n"); - if (quad && quadFast) { - TEST_EXIT_DBG(quad == quadFast->getQuadrature()) - ("quad != quadFast->quadrature\n"); - } + if (quad && quadFast) + TEST_EXIT_DBG(quad == quadFast->getQuadrature())("quad != quadFast->quadrature\n"); TEST_EXIT_DBG(!quadFast || quadFast->getBasisFunctions() == feSpace->getBasisFcts()) ("invalid basis functions"); @@ -335,29 +332,29 @@ namespace AMDiS { delete [] grd; grd = new WorldVector<double>[nPoints]; - for (int i = 0; i < nPoints; i++) { + for (int i = 0; i < nPoints; i++) grd[i].set(0.0); - } + result = grd; } double *localVec = localVectors[myRank]; getLocalVector(largeElInfo->getElement(), localVec); - const mtl::dense2D<double> m = smallElInfo->getSubElemCoordsMat(); + + const BasisFunction *basFcts = feSpace->getBasisFcts(); + mtl::dense2D<double> m(nBasFcts, nBasFcts); + smallElInfo->getSubElemCoordsMat(m, basFcts->getDegree()); DimVec<double> &grd1 = *grdTmp[myRank]; int parts = Global::getGeo(PARTS, dim); const DimVec<WorldVector<double> > &grdLambda = largeElInfo->getGrdLambda(); - - const BasisFunction *basFcts = feSpace->getBasisFcts(); DimVec<double>* grdPhi = grdPhis[myRank]; DimVec<double> tmp(dim, DEFAULT_VALUE, 0.0); for (int i = 0; i < nPoints; i++) { - for (int j = 0; j < dim + 1; j++) { + for (int j = 0; j < dim + 1; j++) grd1[j] = 0.0; - } for (int j = 0; j < nBasFcts; j++) { @@ -368,16 +365,14 @@ namespace AMDiS { *grdPhi += tmp; } - for (int k = 0; k < parts; k++) { + for (int k = 0; k < parts; k++) grd1[k] += (*grdPhi)[k] * localVec[j]; - } } for (int l = 0; l < dow; l++) { result[i][l] = 0.0; - for (int k = 0; k < parts; k++) { + for (int k = 0; k < parts; k++) result[i][l] += grdLambda[k][l] * grd1[k]; - } } } @@ -804,7 +799,8 @@ namespace AMDiS { double *localVec = localVectors[omp_get_thread_num()]; getLocalVector(largeElInfo->getElement(), localVec); - const mtl::dense2D<double> m = smallElInfo->getSubElemCoordsMat(); + mtl::dense2D<double> m(nBasFcts, nBasFcts); + smallElInfo->getSubElemCoordsMat(m, basFcts->getDegree()); for (int i = 0; i < nPoints; i++) { result[i] = 0.0; diff --git a/AMDiS/src/DOFVector.h b/AMDiS/src/DOFVector.h index ac16ebd9..123c8c49 100644 --- a/AMDiS/src/DOFVector.h +++ b/AMDiS/src/DOFVector.h @@ -290,11 +290,11 @@ namespace AMDiS { {} DOFVector<T> *create() { - return NEW DOFVector<T>(feSpace, ""); + return new DOFVector<T>(feSpace, ""); } void free(DOFVector<T> *vec) { - DELETE vec; + delete vec; } private: @@ -493,12 +493,14 @@ namespace AMDiS { void interpol(DOFVector<T> *v, double factor); + /// Writes the data of the DOFVector to an output stream. void serialize(std::ostream &out) { unsigned int size = vec.size(); out.write(reinterpret_cast<const char*>(&size), sizeof(unsigned int)); out.write(reinterpret_cast<const char*>(&(vec[0])), size * sizeof(T)); } + /// Reads data of an DOFVector from an input stream. void deserialize(std::istream &in) { unsigned int size; in.read(reinterpret_cast<char*>(&size), sizeof(unsigned int)); diff --git a/AMDiS/src/DualTraverse.cc b/AMDiS/src/DualTraverse.cc index aed16a83..95811279 100644 --- a/AMDiS/src/DualTraverse.cc +++ b/AMDiS/src/DualTraverse.cc @@ -170,12 +170,19 @@ namespace AMDiS { if (!fillSubElemMat) return; - mtl::dense2D<double>& subCoordsMat = - const_cast<mtl::dense2D<double>&>(elInfoSmall->getSubElemCoordsMat()); +// mtl::dense2D<double>& subCoordsMat = +// const_cast<mtl::dense2D<double>&>(elInfoSmall->getSubElemCoordsMat()); +// mtl::dense2D<double>& subCoordsMat_so = +// const_cast<mtl::dense2D<double>&>(elInfoSmall->getSubElemCoordsMat_so()); + if (elInfo1 == elInfoSmall) { - stack1.getCoordsInElem(elInfo2, basisFcts, subCoordsMat); +// stack1.getCoordsInElem(elInfo2, basisFcts, subCoordsMat); +// stack1.getCoordsInElem_so(elInfo2, basisFcts, subCoordsMat_so); + stack1.fillRefinementPath(*elInfoSmall, *elInfo2); } else { - stack2.getCoordsInElem(elInfo1, basisFcts, subCoordsMat); +// stack2.getCoordsInElem(elInfo1, basisFcts, subCoordsMat); +// stack2.getCoordsInElem_so(elInfo1, basisFcts, subCoordsMat_so); + stack2.fillRefinementPath(*elInfoSmall, *elInfo1); } } } diff --git a/AMDiS/src/ElInfo.cc b/AMDiS/src/ElInfo.cc index 7431e21c..bfc2430c 100644 --- a/AMDiS/src/ElInfo.cc +++ b/AMDiS/src/ElInfo.cc @@ -29,7 +29,8 @@ namespace AMDiS { neighbourCoord_(mesh_->getDim(), NO_INIT), oppVertex_(mesh_->getDim(), NO_INIT), grdLambda(mesh_->getDim(), NO_INIT), - subElemCoordsMat(2, 2) + refinementPath(0), + refinementPathLength(0) { projection_.set(NULL); @@ -46,14 +47,12 @@ namespace AMDiS { WorldVector<double>& w) const { - int dim = l.getSize() - 1; - double c = l[0]; for (int j = 0; j < dimOfWorld; j++) w[j] = c * coord_[0][j]; - int vertices = Global::getGeo(VERTEX, dim); + int vertices = Global::getGeo(VERTEX, l.getSize() - 1); for (int i = 1; i < vertices; i++) { c = l[i]; @@ -62,10 +61,6 @@ namespace AMDiS { } } - /****************************************************************************/ - /* compute volume of an element */ - /****************************************************************************/ - double ElInfo::calcDet() const { testFlag(Mesh::FILL_COORDS); diff --git a/AMDiS/src/ElInfo.h b/AMDiS/src/ElInfo.h index 4a9fe862..45b3bc92 100644 --- a/AMDiS/src/ElInfo.h +++ b/AMDiS/src/ElInfo.h @@ -205,13 +205,11 @@ namespace AMDiS { return parametric_; } - /** \brief - * Returns the element transformation matrix \ref subElemCoordsMat . - * This value is set only during dual traverse. - */ - inline const mtl::dense2D<double>& getSubElemCoordsMat() const { - return subElemCoordsMat; - } + virtual void getSubElemCoordsMat(mtl::dense2D<double>& mat, + int basisFctsDegree) const {} + + virtual void getSubElemCoordsMat_so(mtl::dense2D<double>& mat, + int basisFctsDegree) const {} /** \} */ @@ -279,14 +277,18 @@ namespace AMDiS { parametric_ = param; } - /** \brief - * Sets the element transformation matrix \ref subElemCoordsMat . - * This value is used only during dual traverse. - */ -// inline void setSubElemCoordsMat(DimMat<double> *mat) { -// subElemCoordsMat = mat; -// } - + /// Set \ref refinementPath + inline void setRefinementPath(unsigned long rPath) + { + refinementPath = rPath; + } + + /// Set \ref refinementPathLength + inline void setRefinementPathLength(int length) + { + refinementPathLength = length; + } + /** \} */ @@ -372,14 +374,6 @@ namespace AMDiS { return(0.0); } - virtual void getRefSimplexCoords(const BasisFunction *basisFcts, - mtl::dense2D<double>& coords) const = 0; - - virtual void getSubElementCoords(const BasisFunction *basisFcts, - int iChild, - mtl::dense2D<double>& coords) const = 0; - - protected: /// Pointer to the current mesh Mesh *mesh_; @@ -471,6 +465,10 @@ namespace AMDiS { /// Stores the world dimension. int dimOfWorld; + unsigned long refinementPath; + + int refinementPathLength; + /** \brief * This is a transformation matrix used during dual traverse. It is set, if * the current element is the smaller element of an element pair in the traverse. @@ -480,6 +478,8 @@ namespace AMDiS { */ mtl::dense2D<double> subElemCoordsMat; + mtl::dense2D<double> subElemCoordsMat_so; + public: /** \brief * child_vertex[el_type][child][i] = father's local vertex index of new diff --git a/AMDiS/src/ElInfo1d.cc b/AMDiS/src/ElInfo1d.cc index 060a038f..0e631c07 100644 --- a/AMDiS/src/ElInfo1d.cc +++ b/AMDiS/src/ElInfo1d.cc @@ -40,6 +40,10 @@ namespace AMDiS { {1.0, 0.75, 0.0}, {0.0, 0.375, 1.0}}; mtl::dense2D<double> ElInfo1d::mat_d2_right(mat_d2_right_val); + + double ElInfo1d::test1_val[2][2] = {{1.0, 0.0}, + {0.0, 1.0}}; + mtl::dense2D<double> ElInfo1d::test2_val(test1_val); void ElInfo1d::fillMacroInfo(const MacroElement * mel) @@ -122,11 +126,10 @@ namespace AMDiS { if (adet2 < 1.0E-15) { MSG("det*det = %lf\n", adet2); - for (int i = 0; i <= 1; i++) - grd_lam[i] = 0.0; + grd_lam[0] = grd_lam[1] = 0.0; } else { grd_lam[1] = e * (1.0 / adet2); - grd_lam[0] = grd_lam[1] * (-1.0); + grd_lam[0] = grd_lam[1] * -1.0; } return sqrt(adet2); @@ -296,48 +299,52 @@ namespace AMDiS { } } - void ElInfo1d::getRefSimplexCoords(const BasisFunction *basisFcts, - mtl::dense2D<double>& coords) const + void ElInfo1d::getSubElemCoordsMat(mtl::dense2D<double>& mat, int basisFctsDegree) const { - FUNCNAME("ElInfo1d::getRefSimplexCoords()"); - - switch (basisFcts->getDegree()) { + switch (basisFctsDegree) { case 1: - coords = mat_d1; + mat = mat_d1; + + for (int i = 0; i < refinementPathLength; i++) { + if (refinementPath & (1 << i)) + mat *= mat_d1_left; + else + mat *= mat_d1_right; + } + break; + case 2: - coords = mat_d2; + mat = mat_d2; + + for (int i = 0; i < refinementPathLength; i++) { + if (refinementPath & (1 << i)) + mat *= mat_d2_left; + else + mat *= mat_d2_right; + } + break; + default: - ERROR_EXIT("Not implemented for basis function with degree %d!\n",\ - basisFcts->getDegree()); + ERROR_EXIT("Not supported for basis function degree: %d\n", basisFctsDegree); } } - void ElInfo1d::getSubElementCoords(const BasisFunction *basisFcts, - int iChild, - mtl::dense2D<double>& coords) const + void ElInfo1d::getSubElemCoordsMat_so(mtl::dense2D<double>& mat, int basisFctsDegree) const { - FUNCNAME("ElInfo1d::getSubElementCoords()"); - - switch (basisFcts->getDegree()) { + switch (basisFctsDegree) { case 1: - if (iChild == 0) - coords *= mat_d1_left; - else - coords *= mat_d1_right; + mat = test2_val; - break; - case 2: - if (iChild == 0) - coords *= mat_d2_left; - else - coords *= mat_d2_right; + for (int i = 0; i < refinementPathLength; i++) + mat *= 0.5; break; default: - ERROR_EXIT("Not yet implemented!\n"); + ERROR_EXIT("Not supported for basis function degree: %d\n", basisFctsDegree); } } + } diff --git a/AMDiS/src/ElInfo1d.h b/AMDiS/src/ElInfo1d.h index 11294a3a..e91edfba 100644 --- a/AMDiS/src/ElInfo1d.h +++ b/AMDiS/src/ElInfo1d.h @@ -61,12 +61,11 @@ namespace AMDiS { return (i + 1) % 2; } - void getRefSimplexCoords(const BasisFunction *basisFcts, - mtl::dense2D<double>& coords) const; + void getSubElemCoordsMat(mtl::dense2D<double>& mat, + int basisFctsDegree) const; - void getSubElementCoords(const BasisFunction *basisFcts, - int iChild, - mtl::dense2D<double>& coords) const; + void getSubElemCoordsMat_so(mtl::dense2D<double>& mat, + int basisFctsDegree) const; protected: static double mat_d1_val[2][2]; @@ -93,6 +92,10 @@ namespace AMDiS { static mtl::dense2D<double> mat_d2_right; + static double test1_val[2][2]; + + static mtl::dense2D<double> test2_val; + }; } diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc index 5524fa4b..8bcea08e 100644 --- a/AMDiS/src/ElInfo2d.cc +++ b/AMDiS/src/ElInfo2d.cc @@ -58,9 +58,8 @@ namespace AMDiS { fillFlag_.isSet(Mesh::FILL_GRD_LAMBDA)) { int vertices = mesh_->getGeo(VERTEX); - for (int i = 0; i < vertices; i++) { + for (int i = 0; i < vertices; i++) coord_[i] = mel->coord[i]; - } } int neighbours = mesh_->getGeo(NEIGH); @@ -619,33 +618,4 @@ namespace AMDiS { return det; } - void ElInfo2d::getRefSimplexCoords(const BasisFunction *basisFcts, - mtl::dense2D<double>& coords) const - { - TEST_EXIT(basisFcts->getDegree() == 1)("Wrong basis function degree!\n"); - - coords = mat_d1; - } - - void ElInfo2d::getSubElementCoords(const BasisFunction *basisFcts, - int iChild, - mtl::dense2D<double>& coords) const - { - FUNCNAME("ElInfo1d::getSubElementCoords()"); - - switch (basisFcts->getDegree()) { - case 1: - if (iChild == 0) - coords *= mat_d1_left; - else - coords *= mat_d1_right; - - break; - case 2: - break; - default: - ERROR_EXIT("Not yet implemented!\n"); - } - } - } diff --git a/AMDiS/src/ElInfo2d.h b/AMDiS/src/ElInfo2d.h index 29a1ca26..797597ef 100644 --- a/AMDiS/src/ElInfo2d.h +++ b/AMDiS/src/ElInfo2d.h @@ -58,13 +58,6 @@ namespace AMDiS { /// 2-dimensional realisation of ElInfo's getElementNormal method. double getElementNormal(WorldVector<double> &normal) const; - void getRefSimplexCoords(const BasisFunction *basisFcts, - mtl::dense2D<double>& coords) const; - - void getSubElementCoords(const BasisFunction *basisFcts, - int iChild, - mtl::dense2D<double>& coords) const; - protected: /// Temp vectors for function \ref calcGrdLambda. WorldVector<double> *e1, *e2, *normal; diff --git a/AMDiS/src/ElInfo3d.cc b/AMDiS/src/ElInfo3d.cc index d8ae8dab..55567f35 100644 --- a/AMDiS/src/ElInfo3d.cc +++ b/AMDiS/src/ElInfo3d.cc @@ -609,6 +609,7 @@ namespace AMDiS { } } +#if 0 void ElInfo3d::getRefSimplexCoords(const BasisFunction *basisFcts, mtl::dense2D<double>& coords) const { @@ -670,4 +671,5 @@ namespace AMDiS { // (*coords)[3][3] = c3; } +#endif } diff --git a/AMDiS/src/ElInfo3d.h b/AMDiS/src/ElInfo3d.h index 9cd217f2..b4412a08 100644 --- a/AMDiS/src/ElInfo3d.h +++ b/AMDiS/src/ElInfo3d.h @@ -87,13 +87,6 @@ namespace AMDiS { orientation = o; } - void getRefSimplexCoords(const BasisFunction *basisFcts, - mtl::dense2D<double>& coords) const; - - void getSubElementCoords(const BasisFunction *basisFcts, - int iChild, - mtl::dense2D<double>& coords) const; - protected: /// \ref el 's type. Is Filled automatically by the traversal routines. unsigned char el_type; diff --git a/AMDiS/src/FirstOrderAssembler.cc b/AMDiS/src/FirstOrderAssembler.cc index 7df4bcb2..dcb19c3c 100644 --- a/AMDiS/src/FirstOrderAssembler.cc +++ b/AMDiS/src/FirstOrderAssembler.cc @@ -38,19 +38,17 @@ namespace AMDiS { bool optimized) { std::vector<SubAssembler*> *subAssemblers = - optimized ? - (type == GRD_PSI ? - &optimizedSubAssemblersGrdPsi : - &optimizedSubAssemblersGrdPhi) : - (type == GRD_PSI ? - &standardSubAssemblersGrdPsi : - &standardSubAssemblersGrdPhi); - + optimized ? + (type == GRD_PSI ? + &optimizedSubAssemblersGrdPsi : + &optimizedSubAssemblersGrdPhi) : + (type == GRD_PSI ? + &standardSubAssemblersGrdPsi : + &standardSubAssemblersGrdPhi); + int myRank = omp_get_thread_num(); std::vector<OperatorTerm*> opTerms - = (type == GRD_PSI) ? - op->firstOrderGrdPsi[myRank] : - op->firstOrderGrdPhi[myRank]; + = (type == GRD_PSI) ? op->firstOrderGrdPsi[myRank] : op->firstOrderGrdPhi[myRank]; // check if a assembler is needed at all if (opTerms.size() == 0) @@ -62,16 +60,12 @@ namespace AMDiS { // check if a new assembler is needed for (int i = 0; i < static_cast<int>( subAssemblers->size()); i++) { - std::vector<OperatorTerm*> assTerms = *((*subAssemblers)[i]->getTerms()); sort(assTerms.begin(), assTerms.end()); - if ((opTerms == assTerms) && - ((*subAssemblers)[i]->getQuadrature() == quad)) { - + if (opTerms == assTerms && (*subAssemblers)[i]->getQuadrature() == quad) return dynamic_cast<FirstOrderAssembler*>((*subAssemblers)[i]); - } } // check if all terms are pw_const diff --git a/AMDiS/src/Operator.cc b/AMDiS/src/Operator.cc index 427bf073..79ca035a 100644 --- a/AMDiS/src/Operator.cc +++ b/AMDiS/src/Operator.cc @@ -227,11 +227,9 @@ namespace AMDiS { { const int dimOfWorld = Global::getGeo(WORLD); int dim = LALt.getNumRows() - 1; - - double val = 0.0; for (int i = 0; i <= dim; i++) { - val = 0.0; + double val = 0.0; for (int k = 0; k < dimOfWorld; k++) val += Lambda[i][k] * Lambda[i][k]; val *= factor; @@ -307,9 +305,8 @@ namespace AMDiS { { int myRank = omp_get_thread_num(); - if (!assembler[myRank]) { + if (!assembler[myRank]) initAssembler(myRank, NULL, NULL, NULL, NULL); - } assembler[myRank]->calculateElementMatrix(elInfo, userMat, factor); } @@ -321,9 +318,8 @@ namespace AMDiS { { int myRank = omp_get_thread_num(); - if (!assembler[myRank]) { + if (!assembler[myRank]) initAssembler(myRank, NULL, NULL, NULL, NULL); - } assembler[myRank]->calculateElementMatrix(rowElInfo, colElInfo, smallElInfo, largeElInfo, @@ -336,9 +332,8 @@ namespace AMDiS { { int myRank = omp_get_thread_num(); - if (!assembler[myRank]) { + if (!assembler[myRank]) initAssembler(myRank, NULL, NULL, NULL, NULL); - } assembler[myRank]->calculateElementVector(elInfo, userVec, factor); } @@ -350,9 +345,8 @@ namespace AMDiS { { int myRank = omp_get_thread_num(); - if (!assembler[myRank]) { + if (!assembler[myRank]) initAssembler(myRank, NULL, NULL, NULL, NULL); - } assembler[myRank]->calculateElementVector(mainElInfo, auxElInfo, smallElInfo, largeElInfo, @@ -370,15 +364,13 @@ namespace AMDiS { #endif { if (optimized) { - assembler[rank] = - NEW OptimizedAssembler(this, - quad2, quad1GrdPsi, quad1GrdPhi, quad0, - rowFESpace, colFESpace); + assembler[rank] = new OptimizedAssembler(this, + quad2, quad1GrdPsi, quad1GrdPhi, quad0, + rowFESpace, colFESpace); } else { - assembler[rank] = - NEW StandardAssembler(this, - quad2, quad1GrdPsi, quad1GrdPhi, quad0, - rowFESpace, colFESpace); + assembler[rank] = new StandardAssembler(this, + quad2, quad1GrdPsi, quad1GrdPhi, quad0, + rowFESpace, colFESpace); } } } @@ -1194,83 +1186,72 @@ namespace AMDiS { void MatrixFct_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*matrixFct)(vecAtQPs[iq]), *(LALt[iq]), symmetric, 1.0); - } } void VecAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq])); - } } void Vec2AtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs1[iq], vecAtQPs2[iq])); - } } void CoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, (*LALt[iq]), (*g)(coordsAtQPs[iq])); - } } void MatrixGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*f)(gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); - } } void FctGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(gradAtQPs[iq])); - } } void VecAndGradientAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq])); - } } void VecMatrixGradientAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*f)(vecAtQPs[iq], gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); - } } void VecAndCoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], coordsAtQPs[iq])); - } } void MatrixGradientAndCoords_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lalt(Lambda, (*f)(gradAtQPs[iq], coordsAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); - } } void VecGradCoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq])); - } } void VecAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { @@ -2924,9 +2905,9 @@ namespace AMDiS { Quadrature *quad) { int size = static_cast<int>(vecs.size()); - for (int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) gradsAtQPs[i] = getGradientsAtQPs(vecs[i], elInfo, subAssembler, quad); - } + vecAtQPs = getVectorAtQPs(vec, elInfo, subAssembler, quad); } @@ -2937,9 +2918,9 @@ namespace AMDiS { std::vector<WorldVector<double>*> arg(size); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) arg[i] = &(gradsAtQPs[i][iq]); - } + C[iq] += (*f)(vecAtQPs[iq], arg); } } @@ -2955,9 +2936,9 @@ namespace AMDiS { std::vector<WorldVector<double>*> arg(size); for (int iq = 0; iq < nPoints; iq++) { - for (int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) arg[i] = &(gradsAtQPs[i][iq]); - } + result[iq] += fac * (*f)(vecAtQPs[iq], arg) * uhAtQP[iq]; } } @@ -2982,9 +2963,8 @@ namespace AMDiS { void VecGrad_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) lb(Lambda, (*vecFct)(vecAtQPs[iq], gradAtQPs[iq]), Lb[iq], 1.0); - } } void VecGrad_FOT::eval(int nPoints, diff --git a/AMDiS/src/Operator.h b/AMDiS/src/Operator.h index 530a2744..6378e98b 100644 --- a/AMDiS/src/Operator.h +++ b/AMDiS/src/Operator.h @@ -157,11 +157,8 @@ namespace AMDiS { DimMat<double>& LALt, double factor); - /** \brief - * Evaluation of \f$ \Lambda \cdot A \cdot \Lambda^t\f$ for A equal to the - * identity. - */ - static void l1lt(const DimVec<WorldVector<double> >& Lambda, + /// Evaluation of \f$ \Lambda \cdot A \cdot \Lambda^t\f$ for A equal to the identity. + static void l1lt(const DimVec<WorldVector<double> >& Lambda, DimMat<double>& LALt, double factor); @@ -171,10 +168,7 @@ namespace AMDiS { DimVec<double>& Lb, double factor); - /** \brief - * Evaluation of \f$ \Lambda \cdot b\f$ if b contains the value 1.0 in - * each component. - */ + /// Evaluation of \f$ \Lambda \cdot b\f$ if b contains the value 1.0 in each component. static void l1(const DimVec<WorldVector<double> >& Lambda, DimVec<double>& Lb, double factor) @@ -185,9 +179,9 @@ namespace AMDiS { for (int i = 0; i <= dim; i++) { double val = 0.0; - for (int j = 0; j < dimOfWorld; j++) { + for (int j = 0; j < dimOfWorld; j++) val += Lambda[i][j]; - } + val *= factor; Lb[i] += val; } @@ -219,10 +213,6 @@ namespace AMDiS { friend class Operator; }; - // ============================================================================ - // ===== class SecondOrderTerm =============================================== - // ============================================================================ - /** * \ingroup Assembler * @@ -237,22 +227,16 @@ namespace AMDiS { : OperatorTerm(deg) {} - /** \brief - * Destructor. - */ + /// Destructor. virtual ~SecondOrderTerm() {} - /** \brief - * Evaluation of \f$ \Lambda A \Lambda^t \f$ at all quadrature points. - */ + /// Evaluation of \f$ \Lambda A \Lambda^t \f$ at all quadrature points. virtual void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **result) const = 0; - /** \brief - * Evaluation of \f$ A \nabla u(\vec{x}) \f$ at all quadrature points. - */ + /// Evaluation of \f$ A \nabla u(\vec{x}) \f$ at all quadrature points. virtual void weakEval(int nPoints, const WorldVector<double> *grdUhAtQP, WorldVector<double> *result) const = 0; @@ -275,24 +259,19 @@ namespace AMDiS { setSymmetric(true); } - /** \brief - * Implenetation of SecondOrderTerm::getLALt(). - */ + /// Implenetation of SecondOrderTerm::getLALt(). inline void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) l1lt(Lambda, *(LALt[iq]), 1.0); - } } - /** \brief - * Implementation of SecondOrderTerm::eval(). - */ + /// Implementation of SecondOrderTerm::eval(). inline void eval(int nPoints, - const double * , // uhAtQP - const WorldVector<double> * , // grdUhAtQP + const double *, + const WorldVector<double> *, const WorldMatrix<double> *D2UhAtQP, double *result, double factor) const @@ -310,17 +289,14 @@ namespace AMDiS { } } - /** \brief - * Implenetation of SecondOrderTerm::weakEval(). - */ + /// Implenetation of SecondOrderTerm::weakEval(). void weakEval(int nPoints, const WorldVector<double> *grdUhAtQP, WorldVector<double> *result) const { if (grdUhAtQP) { - for (int iq = 0; iq < nPoints; iq++) { + for (int iq = 0; iq < nPoints; iq++) result[iq] += grdUhAtQP[iq]; - } } } }; @@ -1467,7 +1443,7 @@ namespace AMDiS { FactorSimple_FOT(double f) : FirstOrderTerm(0) { - factor = NEW double; + factor = new double; *factor = f; } diff --git a/AMDiS/src/ProblemVec.cc b/AMDiS/src/ProblemVec.cc index 43c563ea..e59fe7c9 100644 --- a/AMDiS/src/ProblemVec.cc +++ b/AMDiS/src/ProblemVec.cc @@ -687,6 +687,7 @@ namespace AMDiS { for (int i = 0; i < nComponents; i++) { for (int j = 0; j < nComponents; j++) { + // Only if this variable is true, the current matrix will be assembled. bool assembleMatrix = true; // The DOFMatrix which should be assembled (or not, if assembleMatrix @@ -695,18 +696,12 @@ namespace AMDiS { // If the matrix was assembled before and it is marked to be assembled // only once, it will not be assembled. - if (assembleMatrixOnlyOnce[i][j] && assembledMatrix[i][j]) { + if (assembleMatrixOnlyOnce[i][j] && assembledMatrix[i][j]) assembleMatrix = false; - } // If there is no DOFMatrix, e.g., if it is completly 0, do not assemble. - if (!matrix) { + if (!matrix || !assembleMatrix) assembleMatrix = false; - } - - if (!asmMatrix) { - assembleMatrix = false; - } // If the matrix should not be assembled, the rhs vector has to be considered. // This will be only done, if i == j. So, if both is not true, we can jump @@ -1055,23 +1050,20 @@ namespace AMDiS { #pragma omp barrier #endif while (elInfo) { - if (useGetBound) { + if (useGetBound) basisFcts->getBound(elInfo, bound); - } if (matrix) { tmpMatrix->assemble(1.0, elInfo, bound); // Take the matrix boundary manager from the public matrix, // but assemble the boundary conditions on the thread private matrix. - if (matrix->getBoundaryManager()) { - matrix->getBoundaryManager()->fillBoundaryConditions(elInfo, tmpMatrix); - } + if (matrix->getBoundaryManager()) + matrix->getBoundaryManager()->fillBoundaryConditions(elInfo, tmpMatrix); } - if (vector) { + if (vector) tmpVector->assemble(1.0, elInfo, bound, NULL); - } elInfo = stack.traverseNext(elInfo); } @@ -1098,9 +1090,8 @@ namespace AMDiS { #pragma omp master #endif { - if (matrix) { + if (matrix) matrix->startInsertion(); - } } if (matrix) { @@ -1160,15 +1151,12 @@ namespace AMDiS { if (matrix) { matrix->assemble(1.0, rowElInfo, colElInfo, smallElInfo, largeElInfo, bound); - if (matrix->getBoundaryManager()) { - matrix->getBoundaryManager()-> - fillBoundaryConditions(rowElInfo, matrix); - } + if (matrix->getBoundaryManager()) + matrix->getBoundaryManager()->fillBoundaryConditions(rowElInfo, matrix); } - if (vector) { + if (vector) vector->assemble(1.0, rowElInfo, bound); - } cont = dualTraverse.traverseNext(&rowElInfo, &colElInfo, &smallElInfo, &largeElInfo); diff --git a/AMDiS/src/SecondOrderAssembler.cc b/AMDiS/src/SecondOrderAssembler.cc index 603b9f19..1a9e6ed8 100644 --- a/AMDiS/src/SecondOrderAssembler.cc +++ b/AMDiS/src/SecondOrderAssembler.cc @@ -36,11 +36,11 @@ namespace AMDiS { SecondOrderAssembler *newAssembler; std::vector<SubAssembler*> *subAssemblers = - optimized ? - &optimizedSubAssemblers : - &standardSubAssemblers; + optimized ? + &optimizedSubAssemblers : + &standardSubAssemblers; - std::vector<OperatorTerm*> opTerms = op->zeroOrder[myRank]; + std::vector<OperatorTerm*> opTerms = op->zeroOrder[myRank]; sort(opTerms.begin(), opTerms.end()); @@ -50,11 +50,8 @@ namespace AMDiS { sort(assTerms.begin(), assTerms.end()); - if ((opTerms == assTerms) && - ((*subAssemblers)[i]->getQuadrature() == quad)) { - + if (opTerms == assTerms && (*subAssemblers)[i]->getQuadrature() == quad) return dynamic_cast<SecondOrderAssembler*>((*subAssemblers)[i]); - } } // check if all terms are pw_const @@ -68,12 +65,12 @@ namespace AMDiS { // create new assembler if (!optimized) { - newAssembler = NEW Stand2(op, assembler, quad); + newAssembler = new Stand2(op, assembler, quad); } else { if (pwConst) { - newAssembler = NEW Pre2(op, assembler, quad); + newAssembler = new Pre2(op, assembler, quad); } else { - newAssembler = NEW Quad2(op, assembler, quad); + newAssembler = new Quad2(op, assembler, quad); } } @@ -89,8 +86,8 @@ namespace AMDiS { quadrature); tmpLALt.resize(omp_get_overall_max_threads()); for (int i = 0; i < omp_get_overall_max_threads(); i++) { - tmpLALt[i] = NEW DimMat<double>*; - *(tmpLALt[i]) = NEW DimMat<double>(dim, NO_INIT); + tmpLALt[i] = new DimMat<double>*; + *(tmpLALt[i]) = new DimMat<double>(dim, NO_INIT); } } @@ -186,9 +183,9 @@ namespace AMDiS { int myRank = omp_get_thread_num(); if (firstCall) { - tmpLALt[myRank] = NEW DimMat<double>*[nPoints]; + tmpLALt[myRank] = new DimMat<double>*[nPoints]; for (int j = 0; j < nPoints; j++) { - tmpLALt[myRank][j] = NEW DimMat<double>(dim, NO_INIT); + tmpLALt[myRank][j] = new DimMat<double>(dim, NO_INIT); } const BasisFunction *basFcts = owner->getRowFESpace()->getBasisFcts(); @@ -262,9 +259,9 @@ namespace AMDiS { int nPoints = quadrature->getNumPoints(); - DimMat<double> **LALt = NEW DimMat<double>*[nPoints]; + DimMat<double> **LALt = new DimMat<double>*[nPoints]; for (int iq = 0; iq < nPoints; iq++) { - LALt[iq] = NEW DimMat<double>(dim, NO_INIT); + LALt[iq] = new DimMat<double>(dim, NO_INIT); LALt[iq]->set(0.0); } @@ -280,12 +277,12 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { (*LALt[iq]) *= elInfo->getDet(); - for (int i = 0; i < nCol; i++) { + for (int i = 0; i < nCol; i++) (*(phi->getGrdPhi(i)))(quadrature->getLambda(iq), grdPhi[i]); - } for (int i = 0; i < nRow; i++) { (*(psi->getGrdPhi(i)))(quadrature->getLambda(iq), grdPsi); + mat[i][i] += quadrature->getWeight(iq) * (grdPsi * ((*LALt[iq]) * grdPhi[i])); @@ -301,9 +298,8 @@ namespace AMDiS { for (int iq = 0; iq < nPoints; iq++) { (*LALt[iq]) *= elInfo->getDet(); - for (int i = 0; i < nCol; i++) { + for (int i = 0; i < nCol; i++) (*(phi->getGrdPhi(i)))(quadrature->getLambda(iq), grdPhi[i]); - } for (int i = 0; i < nRow; i++) { (*(psi->getGrdPhi(i)))(quadrature->getLambda(iq), grdPsi); diff --git a/AMDiS/src/Traverse.cc b/AMDiS/src/Traverse.cc index b972ec70..6dee2f61 100644 --- a/AMDiS/src/Traverse.cc +++ b/AMDiS/src/Traverse.cc @@ -1068,18 +1068,17 @@ namespace AMDiS { dynamic_cast<ElInfo3d*>(elinfo_stack[i])->update(); } - void TraverseStack::getCoordsInElem(const ElInfo *upperElInfo, - const BasisFunction *basisFcts, - mtl::dense2D<double>& coords) + void TraverseStack::fillRefinementPath(ElInfo& elInfo, const ElInfo& upperElInfo) { - int levelDif = elinfo_stack[stack_used]->getLevel() - upperElInfo->getLevel(); + int levelDif = elinfo_stack[stack_used]->getLevel() - upperElInfo.getLevel(); + unsigned long rPath = 0; - upperElInfo->getRefSimplexCoords(basisFcts, coords); - - for (int i = 1; i <= levelDif; i++) - upperElInfo->getSubElementCoords(basisFcts, - elinfo_stack[stack_used - levelDif + i]->getIChild(), - coords); + for (int i = 1; i <= levelDif; i++) + if (elinfo_stack[stack_used - levelDif + i]->getIChild()) + rPath = rPath | (1 << (i - 1)); + + elInfo.setRefinementPath(rPath); + elInfo.setRefinementPathLength(levelDif); } } diff --git a/AMDiS/src/Traverse.h b/AMDiS/src/Traverse.h index 56c86ead..c95695b1 100644 --- a/AMDiS/src/Traverse.h +++ b/AMDiS/src/Traverse.h @@ -114,8 +114,7 @@ namespace AMDiS { /// Only for 3d: Calls update of all ElInfo3d onjects in \ref elinfo_stack void update(); - void getCoordsInElem(const ElInfo *upperElInfo, const BasisFunction *basisFcts, - mtl::dense2D<double>& coords); + void fillRefinementPath(ElInfo& elInfo, const ElInfo& upperElInfo); /// Is used for parallel mesh traverse. inline void setMyThreadId(int myThreadId) { diff --git a/AMDiS/src/ZeroOrderAssembler.cc b/AMDiS/src/ZeroOrderAssembler.cc index b93e7b73..e3d26969 100644 --- a/AMDiS/src/ZeroOrderAssembler.cc +++ b/AMDiS/src/ZeroOrderAssembler.cc @@ -26,8 +26,10 @@ namespace AMDiS { Quadrature *quad, bool optimized) { + int myRank = omp_get_thread_num(); + // check if a assembler is needed at all - if (op->zeroOrder.size() == 0) + if (op->zeroOrder[myRank].size() == 0) return NULL; ZeroOrderAssembler *newAssembler; @@ -35,7 +37,6 @@ namespace AMDiS { std::vector<SubAssembler*> *subAssemblers = optimized ? &optimizedSubAssemblers : &standardSubAssemblers; - int myRank = omp_get_thread_num(); std::vector<OperatorTerm*> opTerms = op->zeroOrder[myRank]; sort(opTerms.begin(), opTerms.end()); -- GitLab