diff --git a/AMDiS/src/DataCollector.cc b/AMDiS/src/DataCollector.cc index eb5299a3201453a429256ec0f29c120a035c8087..b4e6f8f5a555b715fe261a708f6f10ef8f6caafb 100644 --- a/AMDiS/src/DataCollector.cc +++ b/AMDiS/src/DataCollector.cc @@ -116,6 +116,7 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } + // Remove all interpolation marks and, instead, set to each // interpolation point its continous index starting from 0. int i = 0; @@ -126,7 +127,8 @@ namespace AMDiS { } // Traverse elements to create interpolation values. - elInfo = stack.traverseFirst(mesh_, level_, traverseFlag_); + counter = 0; + elInfo = stack.traverseFirst(mesh_, level_, traverseFlag_ | Mesh::FILL_COORDS); while (elInfo) { if (!writeElem_ || writeElem_(elInfo)) addInterpData(elInfo); @@ -268,102 +270,73 @@ namespace AMDiS { { FUNCNAME("DataCollector::addValueData()"); - const DegreeOfFreedom **dof = elInfo->getElement()->getDOF(); - - /* vertex dofs */ - int dof_offset = localAdmin_->getNumberOfPreDOFs(VERTEX); - + const BasisFunction *basisFcts = feSpace_->getBasisFcts(); + const DegreeOfFreedom *localDOFs = basisFcts->getLocalIndices(elInfo->getElement(), localAdmin_, NULL); + const int nBasisFcts = basisFcts->getNumber(); + + for (int i = 0; i < mesh_->getGeo(VERTEX); i++) { - (*interpPointInd_)[dof[i][dof_offset]] = -2; // mark as vertex + (*interpPointInd_)[localDOFs[i]] = -2; // mark as vertex // get coords of this vertex WorldVector<double> vertexCoords = elInfo->getCoord(i); // search for coords at this dof ::std::list<WorldVector<double> >::iterator it = - find((*dofCoords_)[dof[i][dof_offset]].begin(), - (*dofCoords_)[dof[i][dof_offset]].end(), + find((*dofCoords_)[localDOFs[i]].begin(), + (*dofCoords_)[localDOFs[i]].end(), vertexCoords); // coords not yet in list? - if (it == (*dofCoords_)[dof[i][dof_offset]].end()) { + if (it == (*dofCoords_)[localDOFs[i]].end()) { // add new coords to list - (*dofCoords_)[dof[i][dof_offset]].push_back(vertexCoords); + (*dofCoords_)[localDOFs[i]].push_back(vertexCoords); } } + - int nInterpPoints = 0; - const BasisFunction *basisFcts = feSpace_->getBasisFcts(); - - for (int i = 1; i <= dim_; i++) { - int num_dofs = localAdmin_->getNumberOfDOFs(INDEX_OF_DIM(i, dim_)); - int node_offset = mesh_->getNode(INDEX_OF_DIM(i, dim_)); - dof_offset = localAdmin_->getNumberOfPreDOFs(INDEX_OF_DIM(i, dim_)); - - for (int j = 0; j < mesh_->getGeo(INDEX_OF_DIM(i, dim_)); j++) { - int node = node_offset + j; - - for (int k = 0; k < num_dofs; k++) { - int dof_index = dof_offset + k; - - - WorldVector<double> interpolCoords; - elInfo->coordToWorld((*basisFcts->getCoords(mesh_->getGeo(VERTEX) + nInterpPoints)), - &interpolCoords); - - nInterpPoints++; - - if ((*interpPointInd_)[dof[node][dof_index]] == -1) { - // mark as interpolation point - (*interpPointInd_)[dof[node][dof_index]] = -3; - - // search for interpolation point coordinates, and insert them to the - // dof-entry, if not contained in the list - ::std::list<WorldVector<double> >::iterator it = - find((*interpPointCoords_)[dof[node][dof_index]].begin(), - (*interpPointCoords_)[dof[node][dof_index]].end(), + for (int i = mesh_->getGeo(VERTEX); i < nBasisFcts; i++) { + WorldVector<double> interpolCoords; + elInfo->coordToWorld(*basisFcts->getCoords(i), &interpolCoords); + + if ((*interpPointInd_)[localDOFs[i]] == -1) { + // mark as interpolation point + (*interpPointInd_)[localDOFs[i]] = -3; + + // search for interpolation point coordinates, and insert them to the + // dof-entry, if not contained in the list + ::std::list<WorldVector<double> >::iterator it = + find((*interpPointCoords_)[localDOFs[i]].begin(), + (*interpPointCoords_)[localDOFs[i]].end(), interpolCoords); - if (it == (*interpPointCoords_)[dof[node][dof_index]].end()) { - (*interpPointCoords_)[dof[node][dof_index]].push_back(interpolCoords); - } - - - nInterpPoints_++; - } + + if (it == (*interpPointCoords_)[localDOFs[i]].end()) { + (*interpPointCoords_)[localDOFs[i]].push_back(interpolCoords); + nInterpPoints_++; } - } + } } - + return(0); } int DataCollector::addInterpData(ElInfo *elInfo) { FUNCNAME("DataCollector::addInterpData()"); - - const DegreeOfFreedom **dof = elInfo->getElement()->getDOF(); - + ::std::vector<int> elemInterpPoints; elemInterpPoints.clear(); - for (int i = 1; i <= dim_; i++) { - int num_dofs = localAdmin_->getNumberOfDOFs(INDEX_OF_DIM(i, dim_)); - int node_offset = mesh_->getNode(INDEX_OF_DIM(i, dim_)); - int dof_offset = localAdmin_->getNumberOfPreDOFs(INDEX_OF_DIM(i, dim_)); - - for (int j = 0; j < mesh_->getGeo(INDEX_OF_DIM(i, dim_)); j++) { - int node = node_offset + j; + const BasisFunction *basisFcts = feSpace_->getBasisFcts(); + const DegreeOfFreedom *localDOFs = basisFcts->getLocalIndices(elInfo->getElement(), localAdmin_, NULL); + const int nBasisFcts = basisFcts->getNumber(); - for (int k = 0; k < num_dofs; k++) { - int dof_index = dof_offset + k; - - elemInterpPoints.push_back((*interpPointInd_)[dof[node][dof_index]]); - } - } + for (int i = mesh_->getGeo(VERTEX); i < nBasisFcts; i++) { + elemInterpPoints.push_back((*interpPointInd_)[localDOFs[i]]); } interpPoints_.push_back(elemInterpPoints); - + return(0); } diff --git a/AMDiS/src/DataCollector.h b/AMDiS/src/DataCollector.h index a7a23fb19f105c6b7fb8f1c7961491dfc38381ee..0ee307854714abf6be73f5930245a3d23c5a2e5e 100644 --- a/AMDiS/src/DataCollector.h +++ b/AMDiS/src/DataCollector.h @@ -294,6 +294,8 @@ namespace AMDiS { * Pointer to a function which decides whether an element is considered. */ bool (*writeElem_)(ElInfo*); + + int counter; }; } diff --git a/AMDiS/src/Element.cc b/AMDiS/src/Element.cc index 39ba45978e9644cd7d722d0166d0d0386795bc80..6a367857f951fc2bbc47af459d3fd9637a146d07 100644 --- a/AMDiS/src/Element.cc +++ b/AMDiS/src/Element.cc @@ -12,8 +12,11 @@ namespace AMDiS { { ElementRegion_ED* red_; - if (!elementData) return -1; - red_=dynamic_cast<ElementRegion_ED*>(elementData->getElementData(ELEMENT_REGION)); + if (!elementData) + return -1; + + red_ = dynamic_cast<ElementRegion_ED*>(elementData->getElementData(ELEMENT_REGION)); + if (red_) return red_->getRegion(); @@ -22,8 +25,9 @@ namespace AMDiS { void Element::setDOFPtrs() { - FUNCNAME("Element::setDOFPtrs"); + FUNCNAME("Element::setDOFPtrs()"); TEST_EXIT(mesh)("no mesh!\n"); + dof = mesh->createDOFPtrs(); } @@ -33,27 +37,30 @@ namespace AMDiS { index = mesh ? mesh->getNextElementIndex() : -1; - child[0] = NULL; - child[1] = NULL; + child[0] = NULL; + child[1] = NULL; - dof = mesh ? mesh->createDOFPtrs() : NULL; newCoord = NULL; - elementData = NULL; + + if (mesh) { + setDOFPtrs(); + } else { + mesh = NULL; + } } // call destructor through Mesh::freeElement !!! Element::~Element() { - if(child[0]) DELETE child[0]; - if(child[1]) DELETE child[1]; - - //if(elementData) DELETE elementData; + if (child[0]) + DELETE child[0]; + if (child[1]) + DELETE child[1]; - if (newCoord) - { - DELETE newCoord; - } + if (newCoord) { + DELETE newCoord; + } } /****************************************************************************/ @@ -65,7 +72,7 @@ namespace AMDiS { /* CHANGE_DOFS_1 changes old dofs to NEGATIVE new dofs */ #define CHANGE_DOFS_1(el) \ - ldof = el->dof[n0+i] + nd0; \ + ldof = el->dof[n0 + i] + nd0; \ for (j = 0; j < nd; j++) { \ if ((k = ldof[j]) >= 0) { \ /* do it only once! (dofs are visited more than once) */ \ @@ -99,7 +106,7 @@ namespace AMDiS { } } - if(mesh->getDim() > 1) { + if (mesh->getDim() > 1) { if ((nd = admin->getNumberOfDOFs(EDGE))) { nd0 = admin->getNumberOfPreDOFs(EDGE); n0 = admin->getMesh()->getNode(EDGE); @@ -109,7 +116,7 @@ namespace AMDiS { } } - if (3==mesh->getDim()) { + if (mesh->getDim() == 3) { if ((nd = admin->getNumberOfDOFs(FACE))) { nd0 = admin->getNumberOfPreDOFs(FACE); n0 = admin->getMesh()->getNode(FACE); @@ -145,7 +152,7 @@ namespace AMDiS { } } - if(mesh->getDim() > 1) { + if (mesh->getDim() > 1) { if ((nd = admin->getNumberOfDOFs(EDGE))) { nd0 = admin->getNumberOfPreDOFs(EDGE); n0 = admin->getMesh()->getNode(EDGE); @@ -155,7 +162,7 @@ namespace AMDiS { } } - if (3==mesh->getDim()) { + if (mesh->getDim() == 3) { if ((nd = admin->getNumberOfDOFs(FACE))) { nd0 = admin->getNumberOfPreDOFs(FACE); n0 = admin->getMesh()->getNode(FACE); @@ -183,30 +190,30 @@ namespace AMDiS { int Element::oppVertex(FixVec<DegreeOfFreedom*, DIMEN> pdof) const { - int i, j, nv = 0, ov = 0; + int nv = 0, ov = 0; int vertices = mesh->getGeo(VERTEX); int dim = mesh->getDim(); - for (i = 0; i < vertices; i++) - { - if (nv < i-1) return(-1); - - for (j = 0; j < dim; j++) - { - if (dof[i] == pdof[j]) - { - /****************************************************************************/ - /* i is a common vertex */ - /****************************************************************************/ - ov += i; - nv++; - break; - } - } - + for (int i = 0; i < vertices; i++) { + if (nv < i-1) + return(-1); + + for (int j = 0; j < dim; j++) { + if (dof[i] == pdof[j]) { + /****************************************************************************/ + /* i is a common vertex */ + /****************************************************************************/ + ov += i; + nv++; + break; + } } - if (nv != mesh->getDim()) return(-1); + + } + + if (nv != mesh->getDim()) + return(-1); /****************************************************************************/ /* the opposite vertex is 3(6) - (sum of indices of common vertices) in */ /* 2d(3d) */ @@ -243,7 +250,7 @@ namespace AMDiS { newCoord=NULL; }; } - + void Element::serialize(::std::ostream &out) { // write children diff --git a/AMDiS/src/Element.h b/AMDiS/src/Element.h index 2df1b7ff8c605424859313d9c0f437dfe7292cbd..7696a70ecfaa4a818026ca78503b9b9f939aec31 100644 --- a/AMDiS/src/Element.h +++ b/AMDiS/src/Element.h @@ -305,9 +305,9 @@ namespace AMDiS { /** \brief * Sets the pointer to the DOFs of the i-th node of Element */ - DegreeOfFreedom* setDOF(int i, DegreeOfFreedom* p) { - dof[i] = p; - return dof[i]; + DegreeOfFreedom* setDOF(int pos, DegreeOfFreedom* p) { + dof[pos] = p; + return dof[pos]; }; /** \brief diff --git a/AMDiS/src/Lagrange.cc b/AMDiS/src/Lagrange.cc index dcf156e3523fa50d47c9abbdd9c27d38a16d8c87..886d615e56f46a9d011319e4c222d37e23cd9250 100644 --- a/AMDiS/src/Lagrange.cc +++ b/AMDiS/src/Lagrange.cc @@ -360,7 +360,9 @@ namespace AMDiS { } } - Lagrange::Phi::~Phi() { DELETE [] vertices; } + Lagrange::Phi::~Phi() { + DELETE [] vertices; + } Lagrange::GrdPhi::GrdPhi(Lagrange* owner_, @@ -1003,16 +1005,17 @@ namespace AMDiS { DegreeOfFreedom* result; - if(indices) { + if (indices) { result = indices; } else { - if(localVec) FREE_MEMORY(localVec, DegreeOfFreedom, localVecSize); + if (localVec) + FREE_MEMORY(localVec, DegreeOfFreedom, localVecSize); localVec = GET_MEMORY(DegreeOfFreedom, nBasFcts); localVecSize = nBasFcts; result = localVec; } - for(pos=0, j=0; pos <= dim; pos++) { + for (pos = 0, j = 0; pos <= dim; pos++) { posIndex = INDEX_OF_DIM(pos, dim); n0 = admin->getNumberOfPreDOFs(posIndex); node0 = admin->getMesh()->getNode(posIndex); @@ -1032,33 +1035,6 @@ namespace AMDiS { return result; } - // const double* Lagrange::getVec(const Element* el, const DOFVector<double> * dv, - // double * d) const - // { - // static double* localVec = NULL; - // const DOFAdmin* admin = dv->getFESpace()->getAdmin(); - - // int i; - - // double* result; - - // if(d) { - // result = d; - // } else { - // if(localVec) FREE_MEMORY(localVec, double, nBasFcts); - // localVec = GET_MEMORY(double, nBasFcts); - // result = localVec; - // } - - // const DegreeOfFreedom *localIndices = getLocalIndices(el, admin, NULL); - - // for(i = 0; i < nBasFcts; i++) { - // result[i] = (*dv)[localIndices[i]]; - // } - - // return result; - // } - void Lagrange::l2ScpFctBas(Quadrature *q, AbstractFunction<WorldVector<double>, WorldVector<double> >* f, DOFVector<WorldVector<double> >* fh) @@ -1234,12 +1210,13 @@ namespace AMDiS { RCNeighbourList* list, int n, BasisFunction* basFct) { - FUNCNAME("Lagrange::refineInter2_2d"); + FUNCNAME("Lagrange::refineInter2_2d()"); - if (n < 1) return; + if (n < 1) + return; - Element *el; - int node, n0; + Element *el; + int node, n0; DegreeOfFreedom cdof; const DegreeOfFreedom *pdof; const DOFAdmin *admin = drv->getFESpace()->getAdmin(); @@ -1267,7 +1244,7 @@ namespace AMDiS { cdof = el->getChild(0)->getDOF(node, n0); (*drv)[cdof] = - 0.375*(*drv)[pdof[0]] - 0.125*(*drv)[pdof[1]] + 0.75*(*drv)[pdof[5]]; + 0.375 * (*drv)[pdof[0]] - 0.125 * (*drv)[pdof[1]] + 0.75 * (*drv)[pdof[5]]; /****************************************************************************/ /* node in the common edge of child[0] and child[1] */ @@ -1275,8 +1252,8 @@ namespace AMDiS { cdof = el->getChild(0)->getDOF(node+1, n0); (*drv)[cdof] = - -0.125*((*drv)[pdof[0]] + (*drv)[pdof[1]]) + 0.25*(*drv)[pdof[5]] - + 0.5*((*drv)[pdof[3]] + (*drv)[pdof[4]]); + -0.125 * ((*drv)[pdof[0]] + (*drv)[pdof[1]]) + 0.25 * (*drv)[pdof[5]] + + 0.5 * ((*drv)[pdof[3]] + (*drv)[pdof[4]]); /****************************************************************************/ /* midpoint of edge on child[1] at the refinement edge */ @@ -1284,22 +1261,20 @@ namespace AMDiS { cdof = el->getChild(1)->getDOF(node+1, n0); (*drv)[cdof] = - -0.125*(*drv)[pdof[0]] + 0.375*(*drv)[pdof[1]] + 0.75*(*drv)[pdof[5]]; + -0.125 * (*drv)[pdof[0]] + 0.375 * (*drv)[pdof[1]] + 0.75 * (*drv)[pdof[5]]; - if (n > 1) - { - /****************************************************************************/ - /* adjust the value at the midpoint of the common edge of neigh's children */ - /****************************************************************************/ - el = list->getElement(1); - pdof = basFct->getLocalIndices(el, admin, NULL); - - cdof = el->getChild(0)->getDOF(node+1, n0); - (*drv)[cdof] = - -0.125*((*drv)[pdof[0]] + (*drv)[pdof[1]]) + 0.25*(*drv)[pdof[5]] - + 0.5*((*drv)[pdof[3]] + (*drv)[pdof[4]]); - } - return; + if (n > 1) { + /****************************************************************************/ + /* adjust the value at the midpoint of the common edge of neigh's children */ + /****************************************************************************/ + el = list->getElement(1); + pdof = basFct->getLocalIndices(el, admin, NULL); + + cdof = el->getChild(0)->getDOF(node+1, n0); + (*drv)[cdof] = + -0.125 * ((*drv)[pdof[0]] + (*drv)[pdof[1]]) + 0.25 * (*drv)[pdof[5]] + + 0.5 * ((*drv)[pdof[3]] + (*drv)[pdof[4]]); + } } void Lagrange::refineInter2_3d(DOFIndexed<double> *drv, diff --git a/AMDiS/src/Lagrange.h b/AMDiS/src/Lagrange.h index c5d6183ed1fe4a36f91c91278e721635403361ed..51a38f009b0f5c5807d77540d34935a7059a6746 100644 --- a/AMDiS/src/Lagrange.h +++ b/AMDiS/src/Lagrange.h @@ -152,20 +152,6 @@ namespace AMDiS { const DOFAdmin*, DegreeOfFreedom*) const; - /** \brief - * Implements BasisFunction::getVec(). - */ - // const double *getVec(const Element* el, - // const DOFVector<double> * dv, - // double * d) const; - - /** \brief - * Implements BasisFunction::getVec - */ - // const WorldVector<double> *getVec(const Element* el, - // const DOFVector<WorldVector<double> > * dv, - // WorldVector<double> *d) const; - /** \brief * Implements BasisFunction::l2ScpFctBas */ diff --git a/AMDiS/src/MacroReader.cc b/AMDiS/src/MacroReader.cc index 65b2c182f089b5da302e96d25e2223b76386aadb..a513b1278e01a746be1f707f88216ed4f2a2e332 100644 --- a/AMDiS/src/MacroReader.cc +++ b/AMDiS/src/MacroReader.cc @@ -133,16 +133,6 @@ namespace AMDiS { element2->setElementData(ldp2); } - // DimVec<DegreeOfFreedom> periodicDOFsEl1(dim-1, NO_INIT); - // DimVec<DegreeOfFreedom> periodicDOFsEl2(dim-1, NO_INIT); - - // for(j = 0; j < dim; j++) { - // periodicDOFsEl1[element1->getPositionOfVertex(sideEl1, verticesEl1[j])] = - // melVertex[el2][vertexMapEl1[verticesEl1[j]]]; - // periodicDOFsEl2[element2->getPositionOfVertex(sideEl2, verticesEl2[j])] = - // melVertex[el1][vertexMapEl2[verticesEl2[j]]]; - // } - ldp1->addPeriodicInfo(mode, boundaryType, sideEl1, @@ -228,8 +218,9 @@ namespace AMDiS { for (int i = 0; i < mesh->getNumberOfMacros(); i++) { for (int k = 0; k < mesh->getGeo(VERTEX); k++) { (*(mel + i))->setCoord(k, coords[melVertex[i][k]]); + const_cast<Element*>((*(mel+i))->getElement())-> - setDOF(k,dof[melVertex[i][k]]); + setDOF(k, dof[melVertex[i][k]]); } } @@ -963,28 +954,18 @@ namespace AMDiS { getElement()-> getDOF((k+l+1)%(dim+1))); - for (j = i+1; j < mesh->getNumberOfLeaves(); j++) - { - //MacroElement *mel0 = mesh->getMacroElement(i); - //Element *el = const_cast<Element*>(mel0->getElement()); - //m = el->oppVertex(dof); - if ((m = mesh->getMacroElement(j)->getElement()->oppVertex(dof)) != -1) - { - mesh->getMacroElement(i)->setNeighbour(k, mesh->getMacroElement(j)); - mesh->getMacroElement(j)->setNeighbour(m, mesh->getMacroElement(i)); - mesh->getMacroElement(i)->setOppVertex(k, m); - mesh->getMacroElement(j)->setOppVertex(m, k); - break; - } + for (j = i + 1; j < mesh->getNumberOfLeaves(); j++) { + if ((m = mesh->getMacroElement(j)->getElement()->oppVertex(dof)) != -1) { + mesh->getMacroElement(i)->setNeighbour(k, mesh->getMacroElement(j)); + mesh->getMacroElement(j)->setNeighbour(m, mesh->getMacroElement(i)); + mesh->getMacroElement(i)->setOppVertex(k, m); + mesh->getMacroElement(j)->setOppVertex(m, k); + break; } + } + TEST_EXIT(j < mesh->getNumberOfLeaves()) ("could not find neighbour %d of element %d\n", k, i); - // if(j == mesh->getNumberOfLeaves()) { - // ::std::cout << "neighbour " << k << " not found" << ::std::endl; - // mesh->getMacroElement(i)->setBoundary(k, 1111); - // mesh->getMacroElement(i)->setNeighbour(k, NULL); - // mesh->getMacroElement(i)->setOppVertex(k, -1); - // } } } } @@ -1002,13 +983,14 @@ namespace AMDiS { void MacroReader::boundaryDOFs(Mesh *mesh) { - FUNCNAME("Mesh::boundaryDOFs"); - int i, lnode = mesh->getNode(EDGE); - int k, lne = mesh->getNumberOfLeaves(); - int max_n_neigh = 0, n_neigh, ov; + FUNCNAME("Mesh::boundaryDOFs()"); + + int lnode = mesh->getNode(EDGE); + int k, lne = mesh->getNumberOfLeaves(); + int max_n_neigh = 0, n_neigh, ov; ::std::deque<MacroElement*>::iterator mel; const MacroElement* neigh; - DegreeOfFreedom *dof; + DegreeOfFreedom *dof; mesh->setNumberOfEdges(0); mesh->setNumberOfFaces(0); @@ -1017,52 +999,52 @@ namespace AMDiS { switch(dim) { case 2: - for (mel = mesh->firstMacroElement(); mel!=mesh->endOfMacroElements(); mel++) { - + for (mel = mesh->firstMacroElement(); mel != mesh->endOfMacroElements(); mel++) { // check for periodic boundary Element *el = const_cast<Element*>((*mel)->getElement()); ElementData *ed = el->getElementData(PERIODIC); DimVec<bool> periodic(dim, DEFAULT_VALUE, false); - if(ed) { + if (ed) { ::std::list<LeafDataPeriodic::PeriodicInfo> &periodicInfos = dynamic_cast<LeafDataPeriodic*>(ed)->getInfoList(); ::std::list<LeafDataPeriodic::PeriodicInfo>::iterator it; ::std::list<LeafDataPeriodic::PeriodicInfo>::iterator end = periodicInfos.end(); - for(it = periodicInfos.begin(); it != end; ++it) { - if(it->type != 0) { + for (it = periodicInfos.begin(); it != end; ++it) { + if (it->type != 0) { periodic[it->elementSide] = true; } } } - for (i = 0; i < mesh->getGeo(NEIGH); i++) { + for (int i = 0; i < mesh->getGeo(NEIGH); i++) { if (!(*mel)->getNeighbour(i) || - ((*mel)->getNeighbour(i)->getIndex() < (*mel)->getIndex())) - { - mesh->incrementNumberOfEdges(1);; - if (mesh->getNumberOfDOFs(EDGE)) { - dof = el->setDOF(lnode+i, mesh->getDOF(EDGE)); - - if ((*mel)->getNeighbour(i)) { - Element *neigh = - const_cast<Element*>((*mel)->getNeighbour(i)->getElement()); - if (periodic[i]) { - neigh->setDOF(lnode+(*mel)->getOppVertex(i), mesh->getDOF(EDGE)); - } else { - neigh->setDOF(lnode+(*mel)->getOppVertex(i), dof); - } + ((*mel)->getNeighbour(i)->getIndex() < (*mel)->getIndex())) { + + mesh->incrementNumberOfEdges(1); + + if (mesh->getNumberOfDOFs(EDGE)) { + dof = el->setDOF(lnode + i, mesh->getDOF(EDGE)); + + if ((*mel)->getNeighbour(i)) { + Element *neigh = const_cast<Element*>((*mel)->getNeighbour(i)->getElement()); + + if (periodic[i]) { + neigh->setDOF(lnode + (*mel)->getOppVertex(i), mesh->getDOF(EDGE)); + } else { + neigh->setDOF(lnode + (*mel)->getOppVertex(i), dof); } } - } + } + } } } break; case 3: lnode = mesh->getNode(FACE); mel = mesh->firstMacroElement(); - for (i = 0; i < lne; i++) { + for (int i = 0; i < lne; i++) { // check for periodic boundary Element *el = const_cast<Element*>((*(mel+i))->getElement()); @@ -1152,9 +1134,9 @@ namespace AMDiS { default: ERROR_EXIT("invalid dim\n"); } - if (3==dim) + if (3 == dim) { mesh->setMaxEdgeNeigh(::std::max(8, 2*max_n_neigh)); - else { + } else { mesh->setMaxEdgeNeigh(dim-1); } diff --git a/AMDiS/src/Mesh.cc b/AMDiS/src/Mesh.cc index 1743d4e91fd7705765db6e15233ab487800e9de5..05a703cbd457b9f841d54bf87747f05c119e5aa1 100644 --- a/AMDiS/src/Mesh.cc +++ b/AMDiS/src/Mesh.cc @@ -363,161 +363,79 @@ namespace AMDiS { void Mesh::dofCompress() { - FUNCNAME("Mesh::dofCompress"); - int size; - Flag fill_flag; - - // int i; - // for(i = 0; i < periodicAssociations[-2]->getSize(); i++) { - // MSG("asso %d : dof %d -> dof %d\n", - // periodicAssociations[-2], - // i, - // (*periodicAssociations[-2])[i]); - // } - - for (iadmin = 0; iadmin < static_cast<int>(admin.size()); iadmin++) - { - TEST_EXIT((compressAdmin = admin[iadmin])) - ("no admin[%d] in mesh\n", iadmin); - - if ((size = compressAdmin->getSize()) < 1) continue; - if (compressAdmin->getUsedDOFs() < 1) continue; - if (compressAdmin->getHoleCount() < 1) continue; - - newDOF.resize(size); + FUNCNAME("Mesh::dofCompress()"); + int size; + Flag fill_flag; - compressAdmin->compress(newDOF); + for (iadmin = 0; iadmin < static_cast<int>(admin.size()); iadmin++) { + TEST_EXIT((compressAdmin = admin[iadmin])) + ("no admin[%d] in mesh\n", iadmin); + + if ((size = compressAdmin->getSize()) < 1) + continue; + if (compressAdmin->getUsedDOFs() < 1) + continue; + if (compressAdmin->getHoleCount() < 1) + continue; - if (preserveCoarseDOFs) { - fill_flag = Mesh::CALL_EVERY_EL_PREORDER | Mesh::FILL_NOTHING; - } - else { - fill_flag = Mesh::CALL_LEAF_EL | Mesh::FILL_NOTHING; - } - - traverse( -1, fill_flag, newDOFFct1); - traverse( -1, fill_flag, newDOFFct2); - - newDOF.resize(0); + newDOF.resize(size); + + compressAdmin->compress(newDOF); + + if (preserveCoarseDOFs) { + fill_flag = Mesh::CALL_EVERY_EL_PREORDER | Mesh::FILL_NOTHING; + } else { + fill_flag = Mesh::CALL_LEAF_EL | Mesh::FILL_NOTHING; } - - // MSG("\n"); - // for(i = 0; i < periodicAssociations[-2]->getSize(); i++) { - // MSG("asso %d : dof %d -> dof %d\n", - // periodicAssociations[-2], - // i, - // (*periodicAssociations[-2])[i]); - // } - - return; + + traverse( -1, fill_flag, newDOFFct1); + traverse( -1, fill_flag, newDOFFct2); + + newDOF.resize(0); + } } - // /****************************************************************************/ - // /* fill_boundary: */ - // /* fills boundary information for the vertices of the macro triangulation */ - // /* mel_vertex[k][i] = global index of vertex k of element i */ - // /****************************************************************************/ - - // void Mesh::fillBoundary(int **mel_vertex) - // { - // FUNCNAME("Mesh::fillBoundary"); - // ::std::deque<MacroElement*>::const_iterator mel = firstMacroElement(); - // int i, j,k; - // int lne = getNumberOfLeaves(), lnv = getNumberOfVertices(); - // int ned = getNumberOfEdges(); - - // BoundaryType *bound = GET_MEMORY(BoundaryType, lnv+(3==dim)?ned:0); - - // for (i = 0; i < lnv; i++) - // bound[i] = INTERIOR; - - // int facesPlusEdges = - // (*mel)->getElement()->getGeo(FACE) + - // (*mel)->getElement()->getGeo(EDGE); - - // for (i = 0; i < lne; i++) { - // for (k = 0; k < getGeo(NEIGH); k++) { - // //if ((*(mel+i))->getBoundary(k)) { - // if ((*(mel+i))->getBoundary(k) >= DIRICHLET) { - // for (j = 1; j < dim+1; j++) - // bound[mel_vertex[i][(k+j)%(dim+1)]] = DIRICHLET; - // } - // else if ((*(mel+i))->getBoundary(k) <= NEUMANN) { - // for (j = 1; j < dim+1; j++) - // if (bound[mel_vertex[i][(k+j)%(dim+1)]] != DIRICHLET) - // bound[mel_vertex[i][(k+j)%(dim+1)]] = NEUMANN; - // } - // //} - // } - // } - - // for (i = 0; i < lne; i++) - // for (k = 0; k < getGeo(VERTEX); k++) { - // (*(mel+i))->setBoundary(facesPlusEdges + k, - // bound[mel_vertex[i][k]]); - // } - // FREE_MEMORY(bound, BoundaryType, lnv+(3==dim)?ned:0); - - // return; - // }; DegreeOfFreedom *Mesh::getDOF(GeoIndex position) { - FUNCNAME("Mesh::getDOF"); - const DOFAdmin *localAdmin; - DegreeOfFreedom *dof; - int i, j, n, n0, ndof; + FUNCNAME("Mesh::getDOF()"); TEST_EXIT(position >= CENTER && position <= FACE) - ("unknown position %d\n",position); - - ndof = getNumberOfDOFs(position); - if (ndof <= 0) return(NULL); - - dof = GET_MEMORY(DegreeOfFreedom, ndof); + ("unknown position %d\n", position); - for (i = 0; i < getNumberOfDOFAdmin(); i++) - { - localAdmin = &getDOFAdmin(i); - TEST_EXIT(localAdmin)("no admin[%d]\n", i); - - n = localAdmin->getNumberOfDOFs(position); - n0 = localAdmin->getNumberOfPreDOFs(position); + int ndof = getNumberOfDOFs(position); + if (ndof <= 0) + return(NULL); - TEST_EXIT(n+n0 <= ndof)("n=%d, n0=%d too large: ndof=%d\n", n, n0, ndof); + DegreeOfFreedom *dof = GET_MEMORY(DegreeOfFreedom, ndof); - for (j = 0; j < n; j++) - { - dof[n0+j] = const_cast<DOFAdmin*>(localAdmin)->getDOFIndex(); - } + for (int i = 0; i < getNumberOfDOFAdmin(); i++) { + const DOFAdmin *localAdmin = &getDOFAdmin(i); + TEST_EXIT(localAdmin)("no admin[%d]\n", i); + + int n = localAdmin->getNumberOfDOFs(position); + int n0 = localAdmin->getNumberOfPreDOFs(position); + + TEST_EXIT(n + n0 <= ndof)("n=%d, n0=%d too large: ndof=%d\n", n, n0, ndof); + + for (int j = 0; j < n; j++) { + dof[n0 + j] = const_cast<DOFAdmin*>(localAdmin)->getDOFIndex(); } + } return(dof); } - // const Boundary *Mesh::defaultBoundary(int bound) - // { - // static const Boundary dn[2] = {DIRICHLET, NEUMANN}; - // if (bound >= DIRICHLET) - // return(dn); - // else if (bound <= NEUMANN) - // return(dn+1); - // else - // return(NULL); - // } - DegreeOfFreedom **Mesh::createDOFPtrs() { - FUNCNAME("Mesh::createDOFPtrs"); - int i; - DegreeOfFreedom **ptrs; + FUNCNAME("Mesh::createDOFPtrs()"); if (nNodeEl <= 0) return(NULL); - ptrs = GET_MEMORY(DegreeOfFreedom*, nNodeEl); - for (i = 0; i < nNodeEl; i++) + DegreeOfFreedom **ptrs = GET_MEMORY(DegreeOfFreedom*, nNodeEl); + for (int i = 0; i < nNodeEl; i++) ptrs[i] = NULL; return(ptrs); @@ -525,7 +443,7 @@ namespace AMDiS { void Mesh::freeDOFPtrs(DegreeOfFreedom **ptrs) { - FUNCNAME("Mesh::freeDOFPtrs"); + FUNCNAME("Mesh::freeDOFPtrs()"); TEST_EXIT(ptrs)("ptrs=NULL\n"); @@ -650,42 +568,23 @@ namespace AMDiS { } - - - //const Boundary* defaultBoundary(Mesh* m,int i) {return m->defaultBoundary(i);}; - Element* Mesh::createNewElement(Element *parent) { FUNCNAME("Mesh::createNewElement()"); TEST_EXIT(elementPrototype)("no element prototype\n"); Element *el = parent ? parent->clone() : elementPrototype->clone(); - - //el->setIndex(elementIndex++); - //el->setDOFPtrs(); - - // ElementData *elementData = NULL; - - // if(parent && parent->getElementData()) { - // elementData = parent->getElementData()->clone(); - // } else if(elementDataPrototype) { - // elementData = elementDataPrototype->clone(); - // } - if(!parent && elementDataPrototype) { + if (!parent && elementDataPrototype) { el->setElementData(elementDataPrototype->clone()); } else { el->setElementData(NULL); // must be done in ElementData::refineElementData() } - // if(!elementData) { - // WARNING("no element data!\n"); - // } - - return el; } + ElInfo* Mesh::createNewElInfo() { switch(dim) { diff --git a/AMDiS/src/ProblemScal.cc b/AMDiS/src/ProblemScal.cc index 50920aa5cf72442fad399db498b4e95b3a3b032a..cddd6c8dffd725d45395aec29c7bddc1ae844d9e 100644 --- a/AMDiS/src/ProblemScal.cc +++ b/AMDiS/src/ProblemScal.cc @@ -263,11 +263,10 @@ namespace AMDiS { if (feSpace_) { WARNING("feSpace already created\n"); } else { - if (initFlag.isSet(INIT_FE_SPACE) || (initFlag.isSet(INIT_SYSTEM)&&!adoptFlag.isSet(INIT_FE_SPACE))) { + if (initFlag.isSet(INIT_FE_SPACE) || (initFlag.isSet(INIT_SYSTEM) && !adoptFlag.isSet(INIT_FE_SPACE))) { createFESpace(); } - if (adoptProblem && - (adoptFlag.isSet(INIT_FE_SPACE) || adoptFlag.isSet(INIT_SYSTEM))) + if (adoptProblem && (adoptFlag.isSet(INIT_FE_SPACE) || adoptFlag.isSet(INIT_SYSTEM))) { TEST_EXIT(!feSpace_)("feSpace already created"); feSpace_ = dynamic_cast<ProblemScal*>(adoptProblem)->getFESpace(); @@ -554,7 +553,7 @@ namespace AMDiS { void ProblemScal::buildAfterCoarsen(AdaptInfo *adaptInfo, Flag flag) { - FUNCNAME("ProblemScal::buildAfterCoarsen"); + FUNCNAME("ProblemScal::buildAfterCoarsen()"); clock_t first = clock(); diff --git a/AMDiS/src/VtkWriter.cc b/AMDiS/src/VtkWriter.cc index f362f60a353435a33de3cadd7e19e914474cfcac..df47b2ab174ccb5f3260f6d443be7d3bd80c4e54 100644 --- a/AMDiS/src/VtkWriter.cc +++ b/AMDiS/src/VtkWriter.cc @@ -24,6 +24,9 @@ namespace AMDiS { } else if ((dim_ == 2) && (degree_ == 3)) { nVertices += (*dc_)[0]->getNumberInterpPoints(); nElements *= 9; + } else if ((dim_ == 2) && (degree_ == 4)) { + nVertices += (*dc_)[0]->getNumberInterpPoints(); + nElements *= 16; } ::std::ofstream file; @@ -70,12 +73,8 @@ namespace AMDiS { file << " </DataArray>" << ::std::endl; file << " <DataArray type=\"Int32\" Name=\"connectivity\">" << ::std::endl; - if ((dim_ == 2) && (degree_ == 2)) { - writeConnectivity_dim2_degree2(file); - } else { - writeConnectivity(file); - } - + writeConnectivity(file); + file << " </DataArray>" << ::std::endl; file << " </Cells>" << ::std::endl; file << " <PointData>" << ::std::endl; @@ -171,17 +170,25 @@ namespace AMDiS { void VtkWriter::writeConnectivity(::std::ofstream &file) { - ::std::list<ElementInfo> *elements = (*dc_)[0]->getElementInfos(); - ::std::list<ElementInfo>::iterator elementIt; - int vertices = (*dc_)[0]->getMesh()->getGeo(VERTEX); - - for (elementIt = elements->begin(); elementIt != elements->end(); ++elementIt) { - // for all vertices - for (int i = 0; i < vertices; i++) { - file << " " << elementIt->vertexInfo[i]->outputIndex; - } - file << ::std::endl; - } + if ((dim_ == 2) && (degree_ == 2)) { + writeConnectivity_dim2_degree2(file); + } else if ((dim_ == 2) && (degree_ == 3)) { + writeConnectivity_dim2_degree3(file); + } else if ((dim_ == 2) && (degree_ == 4)) { + writeConnectivity_dim2_degree4(file); + } else { + ::std::list<ElementInfo> *elements = (*dc_)[0]->getElementInfos(); + ::std::list<ElementInfo>::iterator elementIt; + int vertices = (*dc_)[0]->getMesh()->getGeo(VERTEX); + + for (elementIt = elements->begin(); elementIt != elements->end(); ++elementIt) { + // for all vertices + for (int i = 0; i < vertices; i++) { + file << " " << elementIt->vertexInfo[i]->outputIndex; + } + file << ::std::endl; + } + } } @@ -219,6 +226,143 @@ namespace AMDiS { } + void VtkWriter::writeConnectivity_dim2_degree3(::std::ofstream &file) + { + ::std::list<ElementInfo> *elements = (*dc_)[0]->getElementInfos(); + ::std::list<ElementInfo>::iterator elementIt; + + ::std::vector< ::std::vector<int> > *interpPoints = (*dc_)[0]->getInterpPoints(); + ::std::vector< ::std::vector<int> >::iterator pointIt; + + int nVertices = (*dc_)[0]->getNumberVertices(); + + for (pointIt = interpPoints->begin(), elementIt = elements->begin(); + pointIt != interpPoints->end(); + ++pointIt, ++elementIt) { + + file << " " << elementIt->vertexInfo[0]->outputIndex + << " " << (*pointIt)[3] + nVertices + << " " << (*pointIt)[4] + nVertices << ::std::endl; + + file << " " << (*pointIt)[4] + nVertices + << " " << (*pointIt)[5] + nVertices + << " " << (*pointIt)[6] + nVertices << ::std::endl; + + file << " " << (*pointIt)[3] + nVertices + << " " << (*pointIt)[4] + nVertices + << " " << (*pointIt)[6] + nVertices << ::std::endl; + + file << " " << (*pointIt)[2] + nVertices + << " " << (*pointIt)[3] + nVertices + << " " << (*pointIt)[6] + nVertices << ::std::endl; + + file << " " << elementIt->vertexInfo[1]->outputIndex + << " " << (*pointIt)[0] + nVertices + << " " << (*pointIt)[5] + nVertices << ::std::endl; + + file << " " << (*pointIt)[0] + nVertices + << " " << (*pointIt)[6] + nVertices + << " " << (*pointIt)[5] + nVertices << ::std::endl; + + file << " " << (*pointIt)[0] + nVertices + << " " << (*pointIt)[1] + nVertices + << " " << (*pointIt)[6] + nVertices << ::std::endl; + + file << " " << (*pointIt)[1] + nVertices + << " " << (*pointIt)[2] + nVertices + << " " << (*pointIt)[6] + nVertices << ::std::endl; + + file << " " << elementIt->vertexInfo[2]->outputIndex + << " " << (*pointIt)[1] + nVertices + << " " << (*pointIt)[2] + nVertices << ::std::endl; + + + } + + } + + + void VtkWriter::writeConnectivity_dim2_degree4(::std::ofstream &file) + { + ::std::list<ElementInfo> *elements = (*dc_)[0]->getElementInfos(); + ::std::list<ElementInfo>::iterator elementIt; + + ::std::vector< ::std::vector<int> > *interpPoints = (*dc_)[0]->getInterpPoints(); + ::std::vector< ::std::vector<int> >::iterator pointIt; + + int nVertices = (*dc_)[0]->getNumberVertices(); + + for (pointIt = interpPoints->begin(), elementIt = elements->begin(); + pointIt != interpPoints->end(); + ++pointIt, ++elementIt) { + + file << " " << elementIt->vertexInfo[0]->outputIndex + << " " << (*pointIt)[5] + nVertices + << " " << (*pointIt)[6] + nVertices << ::std::endl; + + file << " " << (*pointIt)[5] + nVertices + << " " << (*pointIt)[9] + nVertices + << " " << (*pointIt)[6] + nVertices << ::std::endl; + + file << " " << (*pointIt)[6] + nVertices + << " " << (*pointIt)[7] + nVertices + << " " << (*pointIt)[9] + nVertices << ::std::endl; + + file << " " << (*pointIt)[7] + nVertices + << " " << (*pointIt)[9] + nVertices + << " " << (*pointIt)[10] + nVertices << ::std::endl; + + file << " " << (*pointIt)[7] + nVertices + << " " << (*pointIt)[8] + nVertices + << " " << (*pointIt)[10] + nVertices << ::std::endl; + + file << " " << (*pointIt)[0] + nVertices + << " " << (*pointIt)[8] + nVertices + << " " << (*pointIt)[10] + nVertices << ::std::endl; + + file << " " << elementIt->vertexInfo[1]->outputIndex + << " " << (*pointIt)[0] + nVertices + << " " << (*pointIt)[8] + nVertices << ::std::endl; + + file << " " << (*pointIt)[4] + nVertices + << " " << (*pointIt)[5] + nVertices + << " " << (*pointIt)[9] + nVertices << ::std::endl; + + file << " " << (*pointIt)[4] + nVertices + << " " << (*pointIt)[9] + nVertices + << " " << (*pointIt)[11] + nVertices << ::std::endl; + + file << " " << (*pointIt)[9] + nVertices + << " " << (*pointIt)[10] + nVertices + << " " << (*pointIt)[11] + nVertices << ::std::endl; + + file << " " << (*pointIt)[1] + nVertices + << " " << (*pointIt)[10] + nVertices + << " " << (*pointIt)[11] + nVertices << ::std::endl; + + file << " " << (*pointIt)[0] + nVertices + << " " << (*pointIt)[1] + nVertices + << " " << (*pointIt)[10] + nVertices << ::std::endl; + + file << " " << (*pointIt)[3] + nVertices + << " " << (*pointIt)[4] + nVertices + << " " << (*pointIt)[11] + nVertices << ::std::endl; + + file << " " << (*pointIt)[2] + nVertices + << " " << (*pointIt)[3] + nVertices + << " " << (*pointIt)[11] + nVertices << ::std::endl; + + file << " " << (*pointIt)[1] + nVertices + << " " << (*pointIt)[2] + nVertices + << " " << (*pointIt)[11] + nVertices << ::std::endl; + + file << " " << elementIt->vertexInfo[2]->outputIndex + << " " << (*pointIt)[2] + nVertices + << " " << (*pointIt)[3] + nVertices << ::std::endl; + + } + } + int VtkWriter::updateAnimationFile(::std::string valueFilename, ::std::vector< ::std::string > *paraViewAnimationFrames, const char *animationFilename) diff --git a/AMDiS/src/VtkWriter.h b/AMDiS/src/VtkWriter.h index b8aa1db122ff05227e39a12319a0ace1ee15d8e6..3de2e8806384b4ef377be0c776a00ad9f56304f0 100644 --- a/AMDiS/src/VtkWriter.h +++ b/AMDiS/src/VtkWriter.h @@ -80,6 +80,18 @@ namespace AMDiS { void writeConnectivity_dim2_degree2(::std::ofstream &file); + /** \brief + * + */ + void writeConnectivity_dim2_degree3(::std::ofstream &file); + + + /** \brief + * + */ + void writeConnectivity_dim2_degree4(::std::ofstream &file); + + /** \brief * */