diff --git a/AMDiS/src/Assembler.cc b/AMDiS/src/Assembler.cc index c516f5cd8d565a9a5961f31363d074e96e897603..b4b540bd74ed111c11b5aaccee8b83cde917eb39 100644 --- a/AMDiS/src/Assembler.cc +++ b/AMDiS/src/Assembler.cc @@ -80,6 +80,7 @@ namespace AMDiS { const ElInfo *colElInfo, const ElInfo *smallElInfo, const ElInfo *largeElInfo, + bool rowColFeSpaceEqual, ElementMatrix& userMat, double factor) { @@ -93,9 +94,9 @@ namespace AMDiS { if ((el != lastMatEl && el != lastVecEl) || !operat->isOptimized()) { if (smallElInfo == colElInfo) - initElement(smallElInfo); + initElement(smallElInfo); else - initElement(smallElInfo, largeElInfo); + initElement(smallElInfo, largeElInfo); } if (el != lastMatEl || !operat->isOptimized()) { @@ -118,65 +119,70 @@ namespace AMDiS { ElementMatrix &m = smallElInfo->getSubElemGradCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); - if (smallElInfo == colElInfo) - tmpMat = m * mat; - else - tmpMat = mat * trans(m); - - mat = tmpMat; + if (!rowColFeSpaceEqual) { + if (smallElInfo == colElInfo) + tmpMat = m * mat; + else + tmpMat = mat * trans(m); + + mat = tmpMat; + } } if (firstOrderAssemblerGrdPsi) { firstOrderAssemblerGrdPsi->calculateElementMatrix(smallElInfo, mat); - if (largeElInfo == rowElInfo) { - ElementMatrix &m = - smallElInfo->getSubElemGradCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); - - tmpMat = m * mat; - } else { - ElementMatrix &m = - smallElInfo->getSubElemCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); + if (!rowColFeSpaceEqual) { + if (largeElInfo == rowElInfo) { + ElementMatrix &m = + smallElInfo->getSubElemGradCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); + + tmpMat = m * mat; + } else { + ElementMatrix &m = + smallElInfo->getSubElemCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); + + tmpMat = mat * trans(m); + } - tmpMat = mat * trans(m); + mat = tmpMat; } - - mat = tmpMat; } if (firstOrderAssemblerGrdPhi) { firstOrderAssemblerGrdPhi->calculateElementMatrix(smallElInfo, mat); - if (largeElInfo == colElInfo) { - ElementMatrix &m = - smallElInfo->getSubElemGradCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); - - tmpMat = mat * trans(m); - } else { - ElementMatrix &m = - smallElInfo->getSubElemCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); + if (!rowColFeSpaceEqual) { + if (largeElInfo == colElInfo) { + ElementMatrix &m = + smallElInfo->getSubElemGradCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); + + tmpMat = mat * trans(m); + } else { + ElementMatrix &m = + smallElInfo->getSubElemCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); + + tmpMat = m * mat; + } - tmpMat = m * mat; + mat = tmpMat; } - - mat = tmpMat; } if (zeroOrderAssembler) { zeroOrderAssembler->calculateElementMatrix(smallElInfo, mat); - - ElementMatrix &m = - smallElInfo->getSubElemCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); - - if (smallElInfo == colElInfo) - tmpMat = m * mat; - else - tmpMat = mat; -// else -// tmpMat = mat * trans(m); - - mat = tmpMat; + if (!rowColFeSpaceEqual) { + ElementMatrix &m = + smallElInfo->getSubElemCoordsMat(rowFeSpace->getBasisFcts()->getDegree()); + + if (smallElInfo == colElInfo) + tmpMat = m * mat; + else + tmpMat = mat * trans(m); + + mat = tmpMat; + } } if (rememberElMat && &userMat != &elementMatrix) @@ -342,7 +348,7 @@ namespace AMDiS { if (mainEl != lastMatEl) { set_to_zero(elementMatrix); calculateElementMatrix(mainElInfo, auxElInfo, smallElInfo, largeElInfo, - elementMatrix); + false, elementMatrix); } for (int i = 0; i < nBasFcts; i++) { diff --git a/AMDiS/src/Assembler.h b/AMDiS/src/Assembler.h index e6e13a214c939bf2aebce84d68cd722f3a2417b2..97e7f904711e6400c92049415d152f8cad666b10 100644 --- a/AMDiS/src/Assembler.h +++ b/AMDiS/src/Assembler.h @@ -69,6 +69,7 @@ namespace AMDiS { const ElInfo *colElInfo, const ElInfo *smallElInfo, const ElInfo *largeElInfo, + bool rowColFeSpaceEqual, ElementMatrix& userMat, double factor = 1.0); diff --git a/AMDiS/src/DOFMatrix.cc b/AMDiS/src/DOFMatrix.cc index 519aa4bb9da22bb7a4fa5e9eb9ebd11f465f3a35..10c05cf502d5b2f02c0eedc6cb7e187e376d2f94 100644 --- a/AMDiS/src/DOFMatrix.cc +++ b/AMDiS/src/DOFMatrix.cc @@ -286,13 +286,16 @@ namespace AMDiS { if (op) { op->getElementMatrix(rowElInfo, colElInfo, smallElInfo, largeElInfo, - elementMatrix); + false, elementMatrix); } else { std::vector<Operator*>::iterator it = operators.begin(); std::vector<double*>::iterator factorIt = operatorFactor.begin(); for (; it != operators.end(); ++it, ++factorIt) - (*it)->getElementMatrix(rowElInfo, colElInfo, - smallElInfo, largeElInfo, + (*it)->getElementMatrix(rowElInfo, + colElInfo, + smallElInfo, + largeElInfo, + false, elementMatrix, *factorIt ? **factorIt : 1.0); } @@ -328,8 +331,11 @@ namespace AMDiS { it != operators.end(); ++it, ++factorIt) { if ((*it)->getNeedDualTraverse()) { - (*it)->getElementMatrix(mainElInfo, auxElInfo, - smallElInfo, largeElInfo, + (*it)->getElementMatrix(mainElInfo, + auxElInfo, + smallElInfo, + largeElInfo, + rowFeSpace == colFeSpace, elementMatrix, *factorIt ? **factorIt : 1.0); } diff --git a/AMDiS/src/DOFVector.cc b/AMDiS/src/DOFVector.cc index 3e4abce1ebc569fd5c11672b9c6a77cf1c6b2e0c..bdc099ae547abc46b8b0732ffee411bc89913c5f 100644 --- a/AMDiS/src/DOFVector.cc +++ b/AMDiS/src/DOFVector.cc @@ -776,7 +776,8 @@ namespace AMDiS { double val = 0.0; for (int k = 0; k < nBasFcts; k++) val += m[j][k] * (*(basFcts->getPhi(k)))(quad->getLambda(i)); - vecAtQPs[i] += val; + + vecAtQPs[i] += localVec[j] * val; } } } diff --git a/AMDiS/src/ElInfo2d.cc b/AMDiS/src/ElInfo2d.cc index 1f8db69b3bc5a8a10187600617303e5e37be6eba..5dbd2c16322ace8fa4e6bcae473c69d4e1fcd950 100644 --- a/AMDiS/src/ElInfo2d.cc +++ b/AMDiS/src/ElInfo2d.cc @@ -108,19 +108,11 @@ namespace AMDiS { ElInfo2d::ElInfo2d(Mesh *aMesh) : ElInfo(aMesh) - { - e1 = new WorldVector<double>; - e2 = new WorldVector<double>; - normal = new WorldVector<double>; - } + {} ElInfo2d::~ElInfo2d() - { - delete e1; - delete e2; - delete normal; - } + {} void ElInfo2d::fillMacroInfo(const MacroElement * mel) @@ -585,7 +577,7 @@ namespace AMDiS { } } - double ElInfo2d::calcGrdLambda(DimVec<WorldVector<double> >& grd_lam) + double ElInfo2d::calcGrdLambda(DimVec<WorldVector<double> >& grd) { FUNCNAME("ElInfo2d::calcGrdLambda()"); @@ -595,31 +587,30 @@ namespace AMDiS { int dim = mesh->getDim(); for (int i = 0; i < dimOfWorld; i++) { - (*e1)[i] = coord[1][i] - coord[0][i]; - (*e2)[i] = coord[2][i] - coord[0][i]; + e1[i] = coord[1][i] - coord[0][i]; + e2[i] = coord[2][i] - coord[0][i]; } if (dimOfWorld == 2) { - double sdet = (*e1)[0] * (*e2)[1] - (*e1)[1] * (*e2)[0]; + double sdet = e1[0] * e2[1] - e1[1] * e2[0]; adet = abs(sdet); if (adet < 1.0E-25) { MSG("abs(det) = %f\n", adet); for (int i = 0; i <= dim; i++) - for (int j = 0; j < dimOfWorld; j++) - grd_lam[i][j] = 0.0; + grd[i].set(0.0); } else { double det1 = 1.0 / sdet; - grd_lam[1][0] = (*e2)[1] * det1; // a11: (a_ij) = A^{-T} - grd_lam[1][1] = -(*e2)[0] * det1; // a21 - grd_lam[2][0] = -(*e1)[1] * det1; // a12 - grd_lam[2][1] = (*e1)[0] * det1; // a22 - grd_lam[0][0] = - grd_lam[1][0] - grd_lam[2][0]; - grd_lam[0][1] = - grd_lam[1][1] - grd_lam[2][1]; + grd[1][0] = e2[1] * det1; // a11: (a_ij) = A^{-T} + grd[1][1] = -e2[0] * det1; // a21 + grd[2][0] = -e1[1] * det1; // a12 + grd[2][1] = e1[0] * det1; // a22 + grd[0][0] = -grd[1][0] - grd[2][0]; + grd[0][1] = -grd[1][1] - grd[2][1]; } } else { - vectorProduct(*e1, *e2, *normal); + vectorProduct(e1, e2, normal); adet = norm(normal); @@ -627,21 +618,21 @@ namespace AMDiS { MSG("abs(det) = %lf\n", adet); for (int i = 0; i <= dim; i++) for (int j = 0; j < dimOfWorld; j++) - grd_lam[i][j] = 0.0; + grd[i][j] = 0.0; } else { - vectorProduct(*e2, *normal, grd_lam[1]); - vectorProduct(*normal, *e1, grd_lam[2]); + vectorProduct(e2, normal, grd[1]); + vectorProduct(normal, e1, grd[2]); double adet2 = 1.0 / (adet * adet); for (int i = 0; i < dimOfWorld; i++) { - grd_lam[1][i] *= adet2; - grd_lam[2][i] *= adet2; + grd[1][i] *= adet2; + grd[2][i] *= adet2; } - grd_lam[0][0] = - grd_lam[1][0] - grd_lam[2][0]; - grd_lam[0][1] = - grd_lam[1][1] - grd_lam[2][1]; - grd_lam[0][2] = - grd_lam[1][2] - grd_lam[2][2]; + grd[0][0] = -grd[1][0] - grd[2][0]; + grd[0][1] = -grd[1][1] - grd[2][1]; + grd[0][2] = -grd[1][2] - grd[2][2]; } } @@ -710,7 +701,7 @@ namespace AMDiS { normal[0] = coord[i1][1] - coord[i0][1]; normal[1] = coord[i0][0] - coord[i1][0]; } else { // dow == 3 - WorldVector<double> e0, e1,e2, elementNormal; + WorldVector<double> e0, elementNormal; e0 = coord[i1]; e0 -= coord[i0]; diff --git a/AMDiS/src/ElInfo2d.h b/AMDiS/src/ElInfo2d.h index 09cb0f88132a42d977592c8d96c1b083428c83dd..f50115c68392c035d08894c1843bfe37a271b390 100644 --- a/AMDiS/src/ElInfo2d.h +++ b/AMDiS/src/ElInfo2d.h @@ -64,7 +64,7 @@ namespace AMDiS { protected: /// Temp vectors for function \ref calcGrdLambda. - WorldVector<double> *e1, *e2, *normal; + WorldVector<double> e1, e2, normal; static double mat_d1_left_val[3][3]; static mtl::dense2D<double> mat_d1_left; diff --git a/AMDiS/src/FirstOrderTerm.cc b/AMDiS/src/FirstOrderTerm.cc index c4c48bb2a70e3816f7e4c7178e29d45b8a22d3ee..c39a63f2fe639a0b6f21d0dad59ceee4068e0ef5 100644 --- a/AMDiS/src/FirstOrderTerm.cc +++ b/AMDiS/src/FirstOrderTerm.cc @@ -44,17 +44,17 @@ namespace AMDiS { void VecAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); if (bOne > -1) { for (int iq = 0; iq < nPoints; iq++) - lb_one(Lambda, Lb[iq], (*f)(vecAtQPs[iq])); + lb_one(grdLambda, Lb[iq], (*f)(vecAtQPs[iq])); } else if (b) { for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, *b, Lb[iq], (*f)(vecAtQPs[iq])); + lb(grdLambda, *b, Lb[iq], (*f)(vecAtQPs[iq])); } else { for (int iq = 0; iq < nPoints; iq++) - l1(Lambda, Lb[iq], (*f)(vecAtQPs[iq])); + l1(grdLambda, Lb[iq], (*f)(vecAtQPs[iq])); } } @@ -92,9 +92,9 @@ namespace AMDiS { void CoordsAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1(Lambda, Lb[iq], (*g)(coordsAtQPs[iq])); + l1(grdLambda, Lb[iq], (*g)(coordsAtQPs[iq])); } void CoordsAtQP_FOT::eval(int nPoints, @@ -130,9 +130,9 @@ namespace AMDiS { void VecCoordsAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, *b, Lb[iq], (*g)(coordsAtQPs[iq])); + lb(grdLambda, *b, Lb[iq], (*g)(coordsAtQPs[iq])); } void VecCoordsAtQP_FOT::eval(int nPoints, @@ -178,13 +178,13 @@ namespace AMDiS { void VectorGradient_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); if (f) { for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, (*f)(gradAtQPs[iq]), Lb[iq], 1.0); + lb(grdLambda, (*f)(gradAtQPs[iq]), Lb[iq], 1.0); } else { for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, gradAtQPs[iq], Lb[iq], 1.0); + lb(grdLambda, gradAtQPs[iq], Lb[iq], 1.0); } } @@ -230,9 +230,9 @@ namespace AMDiS { void VectorFct_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, (*vecFct)(vecAtQPs[iq]), Lb[iq], 1.0); + lb(grdLambda, (*vecFct)(vecAtQPs[iq]), Lb[iq], 1.0); } void VectorFct_FOT::eval(int nPoints, @@ -264,9 +264,9 @@ namespace AMDiS { void VecFctAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, (*g)(coordsAtQPs[iq]), Lb[iq], 1.0); + lb(grdLambda, (*g)(coordsAtQPs[iq]), Lb[iq], 1.0); } void VecFctAtQP_FOT::eval(int nPoints, @@ -322,9 +322,9 @@ namespace AMDiS { void VecGrad_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, (*vecFct)(vecAtQPs[iq], gradAtQPs[iq]), Lb[iq], 1.0); + lb(grdLambda, (*vecFct)(vecAtQPs[iq], gradAtQPs[iq]), Lb[iq], 1.0); } void VecGrad_FOT::eval(int nPoints, @@ -356,9 +356,9 @@ namespace AMDiS { void FctGrad2_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, (*vecFct)(grad1AtQPs[iq], grad2AtQPs[iq]), Lb[iq], 1.0); + lb(grdLambda, (*vecFct)(grad1AtQPs[iq], grad2AtQPs[iq]), Lb[iq], 1.0); } void FctGrad2_FOT::eval(int nPoints, @@ -402,12 +402,12 @@ namespace AMDiS { } void Vec2AndGradAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { if (b) - lb(Lambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq],gradAtQPs1[iq])); + lb(grdLambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq],gradAtQPs1[iq])); else - l1(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], gradAtQPs1[iq])); + l1(grdLambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], gradAtQPs1[iq])); } } @@ -448,12 +448,12 @@ namespace AMDiS { void FctVecAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { if (b) - lb(Lambda, *b, Lb[iq], (*f)(coordsAtQPs[iq], vecAtQPs[iq])); + lb(grdLambda, *b, Lb[iq], (*f)(coordsAtQPs[iq], vecAtQPs[iq])); else - l1(Lambda, Lb[iq], (*f)(coordsAtQPs[iq], vecAtQPs[iq])); + l1(grdLambda, Lb[iq], (*f)(coordsAtQPs[iq], vecAtQPs[iq])); } } @@ -509,17 +509,17 @@ namespace AMDiS { void Vec2AtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); if (bOne > -1) { for (int iq = 0; iq < nPoints; iq++) - lb_one(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); + lb_one(grdLambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); } else if (b) { for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); + lb(grdLambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); } else { for (int iq = 0; iq < nPoints; iq++) - l1(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); + l1(grdLambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq])); } } @@ -584,16 +584,16 @@ namespace AMDiS { void Vec3FctAtQP_FOT::getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); if (bOne > -1) { for (int iq = 0; iq < nPoints; iq++) - lb_one(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); + lb_one(grdLambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); } else { for (int iq = 0; iq < nPoints; iq++) { if (b) - lb(Lambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); + lb(grdLambda, *b, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); else - l1(Lambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); + l1(grdLambda, Lb[iq], (*f)(vec1AtQPs[iq], vec2AtQPs[iq], vec3AtQPs[iq])); } } } @@ -663,7 +663,7 @@ namespace AMDiS { std::vector<double> vecsArg(nVecs); std::vector<WorldVector<double> > gradsArg(nGrads); - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < nVecs; i++) @@ -671,7 +671,7 @@ namespace AMDiS { for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - lb(Lambda, (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg), + lb(grdLambda, (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg), result[iq], 1.0); } } @@ -765,14 +765,15 @@ namespace AMDiS { std::vector<double> vecsArg(nVecs); std::vector<WorldVector<double> > gradsArg(nGrads); - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < nVecs; i++) vecsArg[i] = vecsAtQPs[i][iq]; for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - lb(Lambda, (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg), result[iq], 1.0); + lb(grdLambda, (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg), + result[iq], 1.0); } } diff --git a/AMDiS/src/FirstOrderTerm.h b/AMDiS/src/FirstOrderTerm.h index 6dfb0b1911ee4af394f9830f9deceb05f772ba1a..457fefba7dfc4358283ab24205f8ae92a74f72f5 100644 --- a/AMDiS/src/FirstOrderTerm.h +++ b/AMDiS/src/FirstOrderTerm.h @@ -144,10 +144,10 @@ namespace AMDiS { int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1(Lambda, Lb[iq], 1.0); + l1(grdLambda, Lb[iq], 1.0); } }; @@ -177,10 +177,10 @@ namespace AMDiS { /// Implements FirstOrderTerm::getLb(). inline void getLb(const ElInfo *elInfo, int nPoints, VectorOfFixVecs<DimVec<double> >& Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1(Lambda, Lb[iq], (*factor)); + l1(grdLambda, Lb[iq], (*factor)); } private: @@ -214,14 +214,14 @@ namespace AMDiS { int nPoints, VectorOfFixVecs<DimVec<double> >&Lb) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); if (bOne > -1) { for (int iq = 0; iq < nPoints; iq++) - lb_one(Lambda, Lb[iq], 1.0); + lb_one(grdLambda, Lb[iq], 1.0); } else { for (int iq = 0; iq < nPoints; iq++) - lb(Lambda, *b, Lb[iq], 1.0); + lb(grdLambda, *b, Lb[iq], 1.0); } } diff --git a/AMDiS/src/Operator.cc b/AMDiS/src/Operator.cc index 85c6e04db3396445a5256240ae1f3e78cf2b934b..251d5fd6ba0044e6174f0af2474983ab8352492b 100644 --- a/AMDiS/src/Operator.cc +++ b/AMDiS/src/Operator.cc @@ -115,6 +115,7 @@ namespace AMDiS { void Operator::getElementMatrix(const ElInfo *rowElInfo, const ElInfo *colElInfo, const ElInfo *smallElInfo, const ElInfo *largeElInfo, + bool rowColFeSpaceEqual, ElementMatrix& userMat, double factor) { @@ -125,6 +126,7 @@ namespace AMDiS { assembler[myRank]->calculateElementMatrix(rowElInfo, colElInfo, smallElInfo, largeElInfo, + rowColFeSpaceEqual, userMat, factor); } diff --git a/AMDiS/src/Operator.h b/AMDiS/src/Operator.h index aaf9cbf2b4719b709b12ad9535bc23825f107f0c..ebafa21a28b233dc187a69d13d8eee2ddb312866 100644 --- a/AMDiS/src/Operator.h +++ b/AMDiS/src/Operator.h @@ -101,7 +101,8 @@ namespace AMDiS { const ElInfo *colElInfo, const ElInfo *smallElInfo, const ElInfo *largeElInfo, - ElementMatrix& userMat, + bool rowColFeSpaceEqual, + ElementMatrix& userMat, double factor = 1.0); /** \brief diff --git a/AMDiS/src/ProblemVec.cc b/AMDiS/src/ProblemVec.cc index f4e5eca34175dcfeafd816fca78cd179652f4e0c..cca99909a49721ea2b77b43dc2c357f5a19aeeb7 100644 --- a/AMDiS/src/ProblemVec.cc +++ b/AMDiS/src/ProblemVec.cc @@ -780,7 +780,7 @@ namespace AMDiS { { FUNCNAME("ProblemVec::dualMeshTraverseRequired()"); - TEST_EXIT(meshes.size() <= 2)("More than two mneshes are not supported yet!\n"); + TEST_EXIT(meshes.size() <= 2)("More than two meshes are not yet supported!\n"); return (meshes.size() == 2); } @@ -818,11 +818,22 @@ namespace AMDiS { traverseInfo.updateStatus(); + if (writeAsmInfo) { + MSG("TraverseInfo:\n"); + for (int i = 0; i < nComponents; i++) { + MSG(" component %d: difAuxSpace = %d\n", i, traverseInfo.difAuxSpace(i)); + + for (int j = 0; j < nComponents; j++) { + MSG(" component %d-%d: difAuxSpace = %d\n", + i, j, traverseInfo.difAuxSpace(i, j)); + } + } + } + // Used to calculate the overall number of non zero entries. int nnz = 0; for (int i = 0; i < nComponents; i++) { - MSG("%d DOFs for %s\n", componentSpaces[i]->getAdmin()->getUsedSize(), componentSpaces[i]->getName().c_str()); @@ -927,7 +938,7 @@ namespace AMDiS { elInfo = dualElInfo.colElInfo; - if (elInfo != NULL) { + if (elInfo != NULL) { if (useGetBound) basisFcts->getBound(elInfo, bound); @@ -952,11 +963,12 @@ namespace AMDiS { if (traverseInfo.difAuxSpace(i) && i == j) rhs->getDOFVector(i)->assemble2(1.0, mainElInfo, auxElInfo, - dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound); + dualElInfo.smallElInfo, + dualElInfo.largeElInfo, bound); if (traverseInfo.difAuxSpace(i, j) && matrix) matrix->assemble2(1.0, mainElInfo, auxElInfo, - dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound); + dualElInfo.smallElInfo, dualElInfo.largeElInfo, bound); if (matrix && matrix->getBoundaryManager()) matrix->getBoundaryManager()->fillBoundaryConditions(mainElInfo, matrix); @@ -986,8 +998,8 @@ namespace AMDiS { matrix->getBoundaryManager()->fillBoundaryConditions(rowElInfo, matrix); } - if (i == j) - rhs->getDOFVector(i)->assemble(1.0, rowElInfo, bound); + if (i == j) + rhs->getDOFVector(i)->assemble(1.0, rowElInfo, bound); } } } diff --git a/AMDiS/src/SecondOrderTerm.cc b/AMDiS/src/SecondOrderTerm.cc index e6e7e5aa994ee2a5a8a81a06785345efdf9b9f76..d5a52a17d1d840ade489fbb3dd0cea14543c5a9d 100644 --- a/AMDiS/src/SecondOrderTerm.cc +++ b/AMDiS/src/SecondOrderTerm.cc @@ -86,9 +86,9 @@ namespace AMDiS { void MatrixFct_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lalt(Lambda, (*matrixFct)(vecAtQPs[iq]), *(LALt[iq]), symmetric, 1.0); + lalt(grdLambda, (*matrixFct)(vecAtQPs[iq]), *(LALt[iq]), symmetric, 1.0); } void MatrixFct_SOT::eval(int nPoints, @@ -192,9 +192,9 @@ namespace AMDiS { void VecAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq])); + l1lt(grdLambda, *(LALt[iq]), (*f)(vecAtQPs[iq])); } void VecAtQP_SOT::eval(int nPoints, @@ -254,9 +254,9 @@ namespace AMDiS { void Vec2AtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs1[iq], vecAtQPs2[iq])); + l1lt(grdLambda, *(LALt[iq]), (*f)(vecAtQPs1[iq], vecAtQPs2[iq])); } void Vec2AtQP_SOT::eval(int nPoints, @@ -302,9 +302,9 @@ namespace AMDiS { void CoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, (*LALt[iq]), (*g)(coordsAtQPs[iq])); + l1lt(grdLambda, (*LALt[iq]), (*g)(coordsAtQPs[iq])); } void CoordsAtQP_SOT::eval(int nPoints, @@ -376,9 +376,9 @@ namespace AMDiS { void MatrixGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lalt(Lambda, (*f)(gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); + lalt(grdLambda, (*f)(gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); } void MatrixGradient_SOT::eval(int nPoints, @@ -445,9 +445,9 @@ namespace AMDiS { void FctGradient_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*f)(gradAtQPs[iq])); + l1lt(grdLambda, *(LALt[iq]), (*f)(gradAtQPs[iq])); } void FctGradient_SOT::eval(int nPoints, @@ -508,9 +508,9 @@ namespace AMDiS { void VecMatrixGradientAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lalt(Lambda, (*f)(vecAtQPs[iq], gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); + lalt(grdLambda, (*f)(vecAtQPs[iq], gradAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); } void VecMatrixGradientAtQP_SOT::eval(int nPoints, @@ -575,9 +575,9 @@ namespace AMDiS { void VecGradCoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq])); + l1lt(grdLambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq])); } void VecGradCoordsAtQP_SOT::eval(int nPoints, @@ -635,9 +635,9 @@ namespace AMDiS { void VecAndCoordsAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], coordsAtQPs[iq])); + l1lt(grdLambda, *(LALt[iq]), (*f)(vecAtQPs[iq], coordsAtQPs[iq])); } void VecAndCoordsAtQP_SOT::eval(int nPoints, @@ -699,9 +699,9 @@ namespace AMDiS { void MatrixGradientAndCoords_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lalt(Lambda, (*f)(gradAtQPs[iq], coordsAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); + lalt(grdLambda, (*f)(gradAtQPs[iq], coordsAtQPs[iq]), (*LALt[iq]), symmetric, 1.0); } void MatrixGradientAndCoords_SOT::eval(int nPoints, @@ -777,9 +777,9 @@ namespace AMDiS { void MatrixVec2_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lalt(Lambda, A, *(LALt[iq]), symmetric, (*fct)(vec1AtQPs[iq], vec2AtQPs[iq])); + lalt(grdLambda, A, *(LALt[iq]), symmetric, (*fct)(vec1AtQPs[iq], vec2AtQPs[iq])); } void MatrixVec2_SOT::eval(int nPoints, @@ -871,7 +871,7 @@ namespace AMDiS { std::vector<double> vecsArg(nVecs); std::vector<WorldVector<double> > gradsArg(nGrads); - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < nVecs; i++) @@ -879,7 +879,7 @@ namespace AMDiS { for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - lalt(Lambda, (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg), + lalt(grdLambda, (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg), *(LALt[iq]), symmetric_, 1.0); } } @@ -1004,14 +1004,14 @@ namespace AMDiS { std::vector<double> vecsArg(nVecs); std::vector<WorldVector<double> > gradsArg(nGrads); - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { for (int i = 0; i < nVecs; i++) vecsArg[i] = vecsAtQPs[i][iq]; for (int i = 0; i < nGrads; i++) gradsArg[i] = gradsAtQPs_[i][iq]; - lalt(Lambda, (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg), + lalt(grdLambda, (*f_)(coordsAtQPs_[iq], elementNormal_, vecsArg, gradsArg), *(LALt[iq]), symmetric_, 1.0); } } @@ -1099,9 +1099,9 @@ namespace AMDiS { void VecAndGradAtQP_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq])); + l1lt(grdLambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq])); } void VecAndGradAtQP_SOT::eval(int nPoints, @@ -1149,9 +1149,9 @@ namespace AMDiS { void VecGrad_SOT::getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq])); + l1lt(grdLambda, *(LALt[iq]), (*f)(vecAtQPs[iq], gradAtQPs[iq])); } void VecGrad_SOT::eval(int nPoints, @@ -1254,9 +1254,9 @@ namespace AMDiS { int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) { - lalt_kl(Lambda, xi, xj, *(LALt[iq]), (*f)(vecAtQPs[iq])); + lalt_kl(grdLambda, xi, xj, *(LALt[iq]), (*f)(vecAtQPs[iq])); } } diff --git a/AMDiS/src/SecondOrderTerm.h b/AMDiS/src/SecondOrderTerm.h index 63a87674d771383aee4435070cdac1829ecbce94..0f6b15c5c961fe44ab158ac1c673f47109b52914 100644 --- a/AMDiS/src/SecondOrderTerm.h +++ b/AMDiS/src/SecondOrderTerm.h @@ -120,10 +120,10 @@ namespace AMDiS { /// Implenetation of SecondOrderTerm::getLALt(). inline void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), 1.0); + l1lt(grdLambda, *(LALt[iq]), 1.0); } /// Implementation of SecondOrderTerm::eval(). @@ -188,9 +188,9 @@ namespace AMDiS { /// Implements SecondOrderTerm::getLALt(). inline void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - l1lt(Lambda, *(LALt[iq]), (*factor)); + l1lt(grdLambda, *(LALt[iq]), (*factor)); } /// Implenetation of SecondOrderTerm::eval(). @@ -360,9 +360,9 @@ namespace AMDiS { /// Implements SecondOrderTerm::getLALt(). inline void getLALt(const ElInfo *elInfo, int nPoints, DimMat<double> **LALt) const { - const DimVec<WorldVector<double> > &Lambda = elInfo->getGrdLambda(); + const DimVec<WorldVector<double> > &grdLambda = elInfo->getGrdLambda(); for (int iq = 0; iq < nPoints; iq++) - lalt_kl(Lambda, xi, xj, *(LALt[iq]), (*factor)); + lalt_kl(grdLambda, xi, xj, *(LALt[iq]), (*factor)); } /// Implenetation of SecondOrderTerm::eval(). diff --git a/AMDiS/src/ZeroOrderAssembler.cc b/AMDiS/src/ZeroOrderAssembler.cc index 017115d103dd3d4ab783d8d4271eae7c1a86cbbd..90fc7c0c194b94f03d1e03af5040b9320c08c958 100644 --- a/AMDiS/src/ZeroOrderAssembler.cc +++ b/AMDiS/src/ZeroOrderAssembler.cc @@ -63,9 +63,6 @@ namespace AMDiS { } } - newAssembler = new StandardZOA(op, assembler, quad); - - // create new assembler if (!optimized) { newAssembler = new StandardZOA(op, assembler, quad); @@ -101,7 +98,7 @@ namespace AMDiS { std::vector<OperatorTerm*>::iterator termIt; for (termIt = terms[myRank].begin(); termIt != terms[myRank].end(); ++termIt) (static_cast<ZeroOrderTerm*>((*termIt)))->getC(elInfo, nPoints, c); - + if (symmetric) { TEST_EXIT_DBG(nCol == nRow)("nCol != nRow, but symmetric assembling!\n");