DofComm.cc 4.12 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
//
// Software License for AMDiS
//
// Copyright (c) 2010 Dresden University of Technology 
// All rights reserved.
// Authors: Simon Vey, Thomas Witkowski et al.
//
// This file is part of AMDiS
//
// See also license.opensource.txt in the distribution.


13
14
15
#include "parallel/DofComm.h"
#include "parallel/InteriorBoundary.h"
#include "FiniteElemSpace.h"
16
17
18
19
20

namespace AMDiS {

  using namespace std;

21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

  void DofComm::init(int level, 
		     MeshLevelData &ld,
		     vector<const FiniteElemSpace*> &fe)
  {
    FUNCNAME("DofComm::init()");
    
    meshLevel = level;
    levelData = &ld;
    feSpaces = fe;
    
    nLevel = levelData->getLevelNumber() - meshLevel;
    TEST_EXIT_DBG(nLevel >= 1)("Should not happen!\n");

    sendDofs.clear();
    recvDofs.clear();
    periodicDofs.clear();
    
    sendDofs.resize(nLevel);
    recvDofs.resize(nLevel);
    periodicDofs.resize(nLevel);
  }


45
  void DofComm::create(InteriorBoundary &boundary)
46
  {
47
48
    FUNCNAME("DofComm::create()");

49
50
    createContainer(boundary.getOwn(), sendDofs);
    createContainer(boundary.getOther(), recvDofs);
51
52
53
  }


54
55
  void DofComm::createContainer(RankToBoundMap &boundary,
				LevelDataType &data)
56
  {
57
58
    FUNCNAME("DofComm::createContainer()");

59
60
61
62
63
64
65
66
67
68
    // === Fill data. ===

    for (unsigned int i = 0; i < feSpaces.size(); i++)
      for (int level = 0; level < nLevel; level++)
	for (InteriorBoundary::iterator it(boundary, level); !it.end(); ++it)
	  it->rankObj.el->getAllDofs(feSpaces[i], it->rankObj, 
				     data[level][it.getRank()][feSpaces[i]]);


    // === Remove empty data containers. ===
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

    for (unsigned int i = 0; i < data.size(); i++) {
      DataIter dit = data[i].begin();
      while (dit != data[i].end()) {
	FeMapIter it = dit->second.begin();
	while (it != dit->second.end()) {
	  if (it->second.size() == 0) {
	    const FiniteElemSpace *fe = it->first;
	    ++it;
	    dit->second.erase(fe);
	  } else
	    ++it;
	}
	
	if (dit->second.size() == 0)
	  data[i].erase(dit++);
	else
	  ++dit;
87
88
89
90
      }
    }
  }

91

Thomas Witkowski's avatar
Thomas Witkowski committed
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  void DofComm::serialize(ostream &out)
  {
    FUNCNAME("DofComm:serialize()");

    MSG("MUSS DAS WIRKLICH SEIN????\n");
  }

  
  void DofComm::deserialize(istream &in, 
			    map<const FiniteElemSpace*, map<int, const DegreeOfFreedom*> > dofIndexMap)
  {
    FUNCNAME("DofComm::deserialize()");

    MSG("MUSS DAS WIRKLICH SEIN????\n");
  }


  void DofComm::serialize(LevelDataType &data, ostream &out)
  {
    FUNCNAME("DofComm:serialize()");
  }

   
  void DofComm::deserialize(LevelDataType &data,
			    istream &in, 
			    map<const FiniteElemSpace*, map<int, const DegreeOfFreedom*> > dofIndexMap)
  {
    FUNCNAME("DofComm::deserialize()");
  }


123
124
  int DofComm::getNumberDofs(LevelDataType &data, 
			     int level, 
Thomas Witkowski's avatar
Blub    
Thomas Witkowski committed
125
126
			     const FiniteElemSpace *feSpace,
			     bool countDouble)
127
128
129
130
131
  {
    FUNCNAME("DofComm::getNumberDofs()");

    TEST_EXIT_DBG(level < data.size())("Should not happen!\n");

Thomas Witkowski's avatar
Blub    
Thomas Witkowski committed
132
133
    DofContainerSet dofSet;
    DofContainer dofVec;
134
135
136
137
138
139

    for (DataIter rankIt = data[level].begin(); 
	 rankIt != data[level].end(); ++rankIt)
      for (FeMapIter feIt = rankIt->second.begin();
	   feIt != rankIt->second.end(); ++feIt)
	if (feIt->first == feSpace)
Thomas Witkowski's avatar
Blub    
Thomas Witkowski committed
140
141
142
143
144
145
146
147
	  if (countDouble)
	    dofVec.insert(dofVec.end(), feIt->second.begin(), feIt->second.end());
	  else
	    dofSet.insert(feIt->second.begin(), feIt->second.end());

    if (countDouble)
      return static_cast<int>(dofVec.size());    
    return static_cast<int>(dofSet.size());
148
149
150
  }
  

151
  bool DofComm::Iterator::setNextFeMap()
152
  {
153
154
    FUNCNAME("DofComm::Iterator::setNextFeMap()");

155
    if (dataIter != data[traverseLevel].end()) {
156
157
      TEST_EXIT_DBG(dataIter->second.size())("Should not happen!\n");

158
159
160
      feMapIter = dataIter->second.begin();
      
      if (traverseFeSpace != NULL) {
161
162
	if ((dataIter->second.count(traverseFeSpace) == 0))
	  return false;
163
164
165
166
167
168
169
170
171
172
	
	while (feMapIter->first != traverseFeSpace &&
	       feMapIter != dataIter->second.end())
	  ++feMapIter;
	
	TEST_EXIT_DBG(feMapIter != dataIter->second.end() &&
		      feMapIter->first == traverseFeSpace)
	  ("Should not happen!\n");
      }
      
173
      dofIter = feMapIter->second.begin();      
174
175
      dofCounter = 0;
    }
176
177

    return true;
178
179
180
  }

}