InteriorBoundary.cc 5.46 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
#include "parallel/InteriorBoundary.h"
14
15
#include "FiniteElemSpace.h"
#include "BasisFunction.h"
16
#include "Serializer.h"
17
#include "VertexVector.h"
18
19

namespace AMDiS {
Thomas Witkowski's avatar
Thomas Witkowski committed
20

21
  AtomicBoundary& InteriorBoundary::getNewAtomic(int level, int rank)
Thomas Witkowski's avatar
Thomas Witkowski committed
22
  {
23
24
25
    int size = boundary[level][rank].size();
    boundary[level][rank].resize(size + 1);
    return boundary[level][rank][size];
Thomas Witkowski's avatar
Thomas Witkowski committed
26
27
  }

28

29
30
31
32
  bool InteriorBoundary::operator==(const InteriorBoundary& other) const
  {
    InteriorBoundary& other2 = const_cast<InteriorBoundary&>(other);

33
34
35
36
37
38
39
40
41
42
43
    if (boundary.size() != other2.boundary.size())
      return false;

    for (unsigned int level = 0; level < boundary.size(); level++) {
      for (RankToBoundMap::const_iterator it = boundary[level].begin(); 
	   it != boundary[level].end(); ++it) {
	if (other2.boundary[level].count(it->first) == 0)
	  return false;     
	
	if (other2.boundary[level][it->first].size() != it->second.size())
	  return false;
44
	
45
46
47
48
49
50
51
52
53
	for (unsigned int i = 0; i < it->second.size(); i++) {
	  std::vector<AtomicBoundary>::iterator bIt = 
	    find(other2.boundary[level][it->first].begin(),
		 other2.boundary[level][it->first].end(), it->second[i]);
	  
	  if (bIt == other2.boundary[level][it->first].end())
	    return false;	
	}      
      }
54
55
56
57
58
59
    }

    return true;
  }


60
61
62
63
64
65
66
67
68
69
70
  void InteriorBoundary::reset(int level)
  { 
    FUNCNAME("InteriorBoundary::reset()");

    nLevel = level;

    boundary.clear();
    boundary.resize(nLevel);
  }


71
72
  void InteriorBoundary::serialize(std::ostream &out)
  {
73
74
    FUNCNAME("InteriorBoundary::serialize()");

75
76
77
    ERROR_EXIT("REWRITE TO MULTILEVEL STRUCTURE!\n");

#if 0
78
    int mSize = boundary.size();
79
    SerUtil::serialize(out, mSize);
80
81
    for (RankToBoundMap::iterator it = boundary.begin(); 
	 it != boundary.end(); ++it) {
82
83
      int rank = it->first;
      int boundSize = it->second.size();
84
85
      SerUtil::serialize(out, rank);
      SerUtil::serialize(out, boundSize);
86
87
88
      for (int i = 0; i < boundSize; i++) {
	AtomicBoundary &bound = (it->second)[i];

89
	SerUtil::serialize(out, bound.rankObj.elIndex);
90
	SerUtil::serialize(out, bound.rankObj.elType);
91
92
	SerUtil::serialize(out, bound.rankObj.subObj);
	SerUtil::serialize(out, bound.rankObj.ithObj);
93
	SerUtil::serialize(out, bound.rankObj.reverseMode);
94
	serializeExcludeList(out, bound.rankObj.excludedSubstructures);
95

96
	SerUtil::serialize(out, bound.neighObj.elIndex);
97
	SerUtil::serialize(out, bound.neighObj.elType);
98
99
	SerUtil::serialize(out, bound.neighObj.subObj);
	SerUtil::serialize(out, bound.neighObj.ithObj);
100
	SerUtil::serialize(out, bound.neighObj.reverseMode);
101
	serializeExcludeList(out, bound.neighObj.excludedSubstructures);
102
103

	SerUtil::serialize(out, bound.type);
104
105
      }
    }
106
#endif
107
108
  }

109

110
111
  void InteriorBoundary::deserialize(std::istream &in, 
				     std::map<int, Element*> &elIndexMap)
112
  {
113
114
    FUNCNAME("InteriorBoundary::deserialize()");

115
116
117
    ERROR_EXIT("REWRITE TO MULTILEVEL STRUCTURE!\n");

#if 0
118
    int mSize = 0;
119
    SerUtil::deserialize(in, mSize);
120
121
122
    for (int i = 0; i < mSize; i++) {
      int rank = 0;
      int boundSize = 0;
123
124
      SerUtil::deserialize(in, rank);
      SerUtil::deserialize(in, boundSize);
125
126
127
128
129

      boundary[rank].resize(boundSize);
      for (int i = 0; i < boundSize; i++) {
	AtomicBoundary &bound = boundary[rank][i];

130
	SerUtil::deserialize(in, bound.rankObj.elIndex);
131
	SerUtil::deserialize(in, bound.rankObj.elType);
132
133
	SerUtil::deserialize(in, bound.rankObj.subObj);
	SerUtil::deserialize(in, bound.rankObj.ithObj);
134
	SerUtil::deserialize(in, bound.rankObj.reverseMode);
135
	deserializeExcludeList(in, bound.rankObj.excludedSubstructures);
136

137
	SerUtil::deserialize(in, bound.neighObj.elIndex);
138
	SerUtil::deserialize(in, bound.neighObj.elType);
139
140
	SerUtil::deserialize(in, bound.neighObj.subObj);
	SerUtil::deserialize(in, bound.neighObj.ithObj);
141
	SerUtil::deserialize(in, bound.neighObj.reverseMode);
142
	deserializeExcludeList(in, bound.neighObj.excludedSubstructures);
143

144
145
	SerUtil::deserialize(in, bound.type);

146
147
148
149
	TEST_EXIT_DBG(elIndexMap.count(bound.rankObj.elIndex) == 1)
	  ("Cannot find element with index %d for deserialization!\n", 
	   bound.rankObj.elIndex);

150
151
152
	TEST_EXIT_DBG(elIndexMap[bound.rankObj.elIndex]->getIndex() == 
		      bound.rankObj.elIndex)("Should not happen!\n");

153
	bound.rankObj.el = elIndexMap[bound.rankObj.elIndex];
154

155
156
157
	// For the case of periodic interior boundaries, a rank may have an
	// boundary with itself. In this case, also the pointer to the neighbour
	//  object must be set correctly.
158
159
160
161
	if (elIndexMap.count(bound.neighObj.elIndex))
	  bound.neighObj.el = elIndexMap[bound.neighObj.elIndex];
	else
	  bound.neighObj.el = NULL;
162
163
      }
    }
164
#endif
165
  }
166
167


168
169
  void InteriorBoundary::serializeExcludeList(std::ostream &out, 
					      ExcludeList &list)
170
171
172
173
174
175
176
177
178
179
  {
    int size = list.size();
    SerUtil::serialize(out, size);
    for (int i = 0; i < size; i++) {
      SerUtil::serialize(out, list[i].first);
      SerUtil::serialize(out, list[i].second);
    }
  }


180
181
  void InteriorBoundary::deserializeExcludeList(std::istream &in, 
						ExcludeList &list)
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
  {
    int size = 0;
    SerUtil::deserialize(in, size);
    list.resize(0);
    list.reserve(size);

    for (int i = 0; i < size; i++) {
      GeoIndex a;
      int b;

      SerUtil::deserialize(in, a);
      SerUtil::deserialize(in, b);
      list.push_back(std::make_pair(a, b));
    }
  }

198
}