ElementDofIterator.cc 2.86 KB
Newer Older
1 2 3 4
#include "ElementDofIterator.h"
#include "Mesh.h"
#include "DOFAdmin.h"
#include "Element.h"
Thomas Witkowski's avatar
Thomas Witkowski committed
5
#include "BasisFunction.h"
6 7 8

namespace AMDiS {

9
  void ElementDofIterator::reset(const Element* el)
10 11 12
  {
    FUNCNAME("ElementDofIterator::reset()");

Thomas Witkowski's avatar
Thomas Witkowski committed
13 14 15 16 17
    TEST_EXIT_DBG(el->getMesh() == mesh)
      ("Mesh and element does not fit together!\n");
    TEST_EXIT_DBG(el)("No element!\n");

    element = el;
18
    dofs = element->getDof();
19 20 21 22 23 24 25 26 27

    // Start with vertices.
    pos = 0;
    elementPos = 0;
    dofPos = 0;

    // Get geo index of vertices in the given dimension.
    posIndex = INDEX_OF_DIM(pos, dim);
    // Get number of dofs per vertex (should be one in all cases).
28
    nDofs = admin->getNumberOfDofs(posIndex);
29 30 31 32

    TEST_EXIT_DBG(nDofs != 0)("Mh, I've to think about this situation!\n");

    // Calculate displacement. Is used if there is more than one dof admin on the mesh.
33
    n0 = admin->getNumberOfPreDofs(posIndex);
34 35 36 37
    // Get first dof index position for vertices.
    node0 = mesh->getNode(posIndex);
    // Get number of vertices in this dimension.
    nElements = Global::getGeo(posIndex, mesh->getDim());
Thomas Witkowski's avatar
Thomas Witkowski committed
38 39 40

    if (inOrder)
      orderPosition = basisFcts->orderOfPositionIndices(element, posIndex, 0);
41 42
  }

43

44 45
  bool ElementDofIterator::next()
  {
46
    // First iterate over the dofs of one element (vertex, edge, face).
47 48 49 50 51 52 53 54 55 56 57
    dofPos++;

    if (dofPos >= nDofs) {
      // We are finished with all dofs of on element. Go to the next one.
      dofPos = 0;
      elementPos++;

      if (elementPos >= nElements) {
	// We are finished with all element.
	elementPos = 0;

58 59 60 61
	// If we have iterated over all positions, we can finish the iteration.
	if (pos >= dim)
	  return false;

62 63 64 65 66 67 68
	// Increase position, i.e., go from vertices to edges to faces and search
	// for the next position with dofs.
	do {
	  pos++;
	  // Get geo index posistion.
	  posIndex = INDEX_OF_DIM(pos, dim);
	  // Get number of dofs in this position.
69
	  nDofs = admin->getNumberOfDofs(posIndex);
70
	} while (nDofs == 0 && pos < dim);
71

72
	if (nDofs > 0 && pos <= dim) {
73 74 75 76 77
	  // We have found on more position with dofs.

	  // Get number of elements in this position, i.e, the number of vertices,.
	  // edges and faces in the given dimension.
	  nElements = Global::getGeo(posIndex, dim);
78

79
	  // Calculate displacement. Is used if there is more than one dof admin on the mesh.
80
	  n0 = admin->getNumberOfPreDofs(posIndex);
81

82 83
	  // Get first dof index position for the geo index position.
	  node0 = mesh->getNode(posIndex);
Thomas Witkowski's avatar
Thomas Witkowski committed
84 85 86 87

	  if (inOrder)
	    orderPosition = basisFcts->orderOfPositionIndices(element, posIndex, 0);

88 89 90 91 92
	} else {
	  // That's all, we jave traversed all dofs of the mesh element.
	  return false;
	}

Thomas Witkowski's avatar
Thomas Witkowski committed
93 94 95 96
      } else {
	if (inOrder)
	  orderPosition = 
	    basisFcts->orderOfPositionIndices(element, posIndex, elementPos);
97 98 99 100
      }
    }

    return true;
Thomas Witkowski's avatar
Thomas Witkowski committed
101 102
  }

103

Thomas Witkowski's avatar
Thomas Witkowski committed
104 105 106 107 108
  bool ElementDofIterator::nextStrict()
  {
    dofPos = nDofs;
    return next();
  }
109
}