From 70789436f19911be8f2547ddaf4a83a796ff19d1 Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Mon, 22 Jun 2009 15:06:37 +0000 Subject: [PATCH] Work on periodic boundary conditions. --- AMDiS/src/PeriodicBC.cc | 54 +++++++++++++++++++---------------------- AMDiS/src/PeriodicBC.h | 17 +++++++------ 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/AMDiS/src/PeriodicBC.cc b/AMDiS/src/PeriodicBC.cc index 108183ba..a288eb4b 100644 --- a/AMDiS/src/PeriodicBC.cc +++ b/AMDiS/src/PeriodicBC.cc @@ -51,15 +51,13 @@ namespace AMDiS { { FUNCNAME("PeriodicDOFMapping::getDOFPermutation()"); - if(dofPermutation_[vertexPermutation] == NULL) { + if (dofPermutation_[vertexPermutation] == NULL) { //MSG("new dof permutation needed\n"); - int i, j; int dim = basFcts_->getDim(); int num = basFcts_->getNumber(); - int sum = 0; - for(i = 0; i < dim + 1; i++) { + for (int i = 0; i < dim + 1; i++) { sum += i - vertexPermutation[i]; TEST_EXIT(vertexPermutation[i] < dim + 1) ("invalid vertexPermuation\n"); @@ -72,11 +70,11 @@ namespace AMDiS { DegreeOfFreedom *mapping = new DegreeOfFreedom[num]; - for(i = 0; i < num; i++) { + for (int i = 0; i < num; i++) { lambda = basFcts_->getCoords(i); - for(j = 0; j < dim + 1; j++) { + for (int j = 0; j < dim + 1; j++) newLambda[vertexPermutation[j]] = (*lambda)[j]; - } + mapping[i] = indexOfCoords_[newLambda]; } @@ -91,7 +89,7 @@ namespace AMDiS { : BoundaryCondition(type, rowFESpace_, NULL), masterMatrix_(NULL) { - if(rowFESpace->getMesh()->getDim() > 1) { + if (rowFESpace->getMesh()->getDim() > 1) { periodicDOFMapping_ = PeriodicDOFMapping::providePeriodicDOFMapping(rowFESpace_->getBasisFcts()); } else { @@ -111,10 +109,10 @@ namespace AMDiS { Mesh *mesh = matrix->getRowFESpace()->getMesh(); - associated_ = mesh->getPeriodicAssociations()[boundaryType]; + associated = mesh->getPeriodicAssociations()[boundaryType]; - TEST_EXIT(associated_)("no associations for periodic boundary condition %d\n", - boundaryType); + TEST_EXIT(associated)("No associations for periodic boundary condition %d!\n", + boundaryType); const BasisFunction *basFcts = rowFESpace->getBasisFcts(); neighIndices_ = new DegreeOfFreedom[basFcts->getNumber()]; @@ -131,7 +129,6 @@ namespace AMDiS { int dim = rowFESpace->getMesh()->getDim(); if (dim > 1) { - int i, j; DOFAdmin *admin = rowFESpace->getAdmin(); FixVec<int, WORLD> elFace(dim, NO_INIT); @@ -157,24 +154,25 @@ namespace AMDiS { index = element->getVertexOfPosition(sideGeoIndex, side, vertex); - periodicDOFs[vertex] = (*associated_)[dofIndices[index]]; + periodicDOFs[vertex] = (*associated)[dofIndices[index]]; } Element *neigh = elInfo->getNeighbour(side); basFcts->getLocalIndices(neigh, admin, neighIndices_); int oppVertex = 0; - for(i = 0; i < dim + 1; i++) { + for (int i = 0; i < dim + 1; i++) { // get vertex permutation - if(i == side) { + if (i == side) { vertexPermutation[i] = 0; } else { DegreeOfFreedom periodicDOF = periodicDOFs[element->getPositionOfVertex(side, i)]; - for(j = 0; j < dim + 1; j++) { - if(neigh->getDOF(j, 0) == periodicDOF) break; - } + for (int j = 0; j < dim + 1; j++) + if (neigh->getDOF(j, 0) == periodicDOF) + break; + vertexPermutation[i] = j; } oppVertex += i - vertexPermutation[i]; @@ -186,11 +184,9 @@ namespace AMDiS { periodicDOFMapping_->getDOFPermutation(vertexPermutation); // set associated dofs - for(i = 0; i < num; i++) { - if((*(basFcts->getCoords(i)))[side] == 0) { - (*associated_)[dofIndices[i]] = neighIndices_[dofPermutation[i]]; - } - } + for (int i = 0; i < num; i++) + if ((*(basFcts->getCoords(i)))[side] == 0) + (*associated)[dofIndices[i]] = neighIndices_[dofPermutation[i]]; } } } @@ -201,8 +197,6 @@ namespace AMDiS { { FUNCNAME("PeriodicBC::exitMatrix()"); - ERROR_EXIT("Not yet implemented, if you have an idea how to do it, than make it!!!\n"); - TEST_EXIT(matrix)("no matrix\n"); if (matrix == masterMatrix_) { @@ -212,10 +206,12 @@ namespace AMDiS { using namespace mtl; - associated_->print(); + std::cout << "ASSOC = " << std::endl; + for (int i = 0; i < 10; i++) + std::cout << i << " = " << (*associated)[i] << std::endl; // Compute reorder matrix (newRow and newCol yields transposed!!!) - matrix::traits::reorder<>::type R= matrix::reorder(*associated_); + matrix::traits::reorder<>::type R= matrix::reorder(*associated); DOFMatrix::base_matrix_type &A= matrix->getBaseMatrix(), B, D, E, TR; A*= 0.5; @@ -243,12 +239,12 @@ namespace AMDiS { DOFIterator<double> vecIt(vector, USED_DOFS); Mesh *mesh = vector->getFESpace()->getMesh(); - VertexVector *associated_ = mesh->getPeriodicAssociations()[boundaryType]; + VertexVector *associated = mesh->getPeriodicAssociations()[boundaryType]; for (vecIt.reset(); !vecIt.end(); ++vecIt) { dof = vecIt.getDOFIndex(); - newDOF = (*associated_)[dof]; + newDOF = (*associated)[dof]; if (dof < newDOF) { entry = ((*vector)[dof] + (*vector)[newDOF]) * 0.5; diff --git a/AMDiS/src/PeriodicBC.h b/AMDiS/src/PeriodicBC.h index fecbf0cf..ec5de0a7 100644 --- a/AMDiS/src/PeriodicBC.h +++ b/AMDiS/src/PeriodicBC.h @@ -34,7 +34,8 @@ namespace AMDiS { class DimVecLess { public: - bool operator()(const DimVec<T> &v1, const DimVec<T> &v2) { + bool operator()(const DimVec<T> &v1, const DimVec<T> &v2) + { int size = v1.getSize(); for (int i = 0; i < size; i++) { if (v1[i] < v2[i]) @@ -43,7 +44,7 @@ namespace AMDiS { return false; } return false; - }; + } }; class PeriodicDOFMapping @@ -60,7 +61,9 @@ namespace AMDiS { protected: const BasisFunction *basFcts_; + std::map<DimVec<int>, DegreeOfFreedom*, DimVecLess<int> > dofPermutation_; + std::map<DimVec<double>, int, DimVecLess<double> > indexOfCoords_; static std::vector<PeriodicDOFMapping*> mappings_; @@ -83,18 +86,18 @@ namespace AMDiS { void initMatrix(DOFMatrix* matrix); - void fillBoundaryCondition(DOFMatrix *matrix, - ElInfo *elInfo, + void fillBoundaryCondition(DOFMatrix *matrix, + ElInfo *elInfo, const DegreeOfFreedom *dofIndices, - const BoundaryType *localBound, - int nBasFcts); + const BoundaryType *localBound, + int nBasFcts); void exitMatrix(DOFMatrix* matrix); void exitVector(DOFVectorBase<double>* vector); protected: - VertexVector *associated_; + VertexVector *associated; PeriodicDOFMapping *periodicDOFMapping_; -- GitLab