source: src/base/interface.cpp@ f003a9

Last change on this file since f003a9 was f003a9, checked in by Julian Iseringhausen <isering@…>, 14 years ago

Refactored vmg in order to separate the core library and the particle simulation part properly.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1798 5161e1c8-67bf-11de-9fd5-51895aff932f

  • Property mode set to 100644
File size: 5.1 KB
Line 
1/**
2 * @file interface.cpp
3 * @author Julian Iseringhausen <isering@ins.uni-bonn.de>
4 * @date Mon Apr 18 12:55:48 2011
5 *
6 * @brief VMG::Interface
7 *
8 */
9
10#ifdef HAVE_CONFIG_H
11#include <config.h>
12#endif
13
14#include <algorithm>
15#include <cmath>
16
17#include "base/helper.hpp"
18#include "base/interface.hpp"
19
20using namespace VMG;
21
22void Interface::InitInterface(const Vector& box_offset, const vmg_float& box_size,
23 const int& coarseningSteps, const vmg_float& alpha)
24{
25 int i;
26 Index num_cells = Helper::intpow(2, levelMax);
27 Index size_factor;
28
29 const Vector box_center = box_offset + 0.5 * box_size;
30
31 for (i=0; i<coarseningSteps; ++i) {
32
33 global.push_back(GlobalIndices());
34 extent.push_back(SpatialExtent());
35
36 for (int j=0; j<3; ++j)
37 size_factor[j] = (bc[j] == Periodic ? 1 : Helper::intpow(2, static_cast<int>(log(pow(alpha, i+1)) / log(2.0) + 1.0)));
38
39 extent.back().Size() = box_size * static_cast<Vector>(size_factor);
40 extent.back().Begin() = box_center - 0.5 * extent.back().Size();
41 extent.back().End() = extent.back().Begin() + extent.back().Size();
42 extent.back().MeshWidth() = pow(2.0, i-levelMax);
43
44 num_cells = Helper::intpow(2,levelMax-i) * size_factor;
45
46 global.back().GlobalSize() = num_cells + 1;
47 global.back().LocalSize() = num_cells + 1;
48 global.back().LocalBegin() = 0;
49 global.back().LocalEnd() = num_cells + 1;
50
51 global.back().FinestAbsSize() = Helper::intpow(2,i) * num_cells + 1;
52 global.back().FinestAbsBegin() = ((global.back().FinestAbsSize()-1) * (1-size_factor)) / (2*size_factor);
53 global.back().FinestAbsEnd() = global.back().FinestAbsBegin() + global.back().FinestAbsSize();
54
55 if (i==0)
56 global.back().GlobalFinerBegin() = (num_cells - Helper::intpow(2, levelMax-i))/2;
57 else
58 global.back().GlobalFinerBegin() = (global.back().FinestAbsSize() - (++global.rbegin())->FinestAbsSize()) / Helper::intpow(2,i+1);
59
60 global.back().GlobalFinerEnd() = global.back().GlobalSize() - global.back().GlobalFinerBegin();
61 global.back().GlobalFinerSize() = global.back().GlobalFinerEnd() - global.back().GlobalFinerBegin();
62
63 global.back().LocalFinerBegin() = global.back().GlobalFinerBegin();
64 global.back().LocalFinerEnd() = global.back().GlobalFinerEnd();
65 global.back().LocalFinerSize() = global.back().GlobalFinerSize();
66 }
67
68 while (global.size() == 0 || global.back().GlobalSize().Min() > Helper::intpow(2, levelMin)+1) {
69
70 if (global.size() > 0)
71 num_cells /= 2;
72
73 global.push_back(GlobalIndices());
74 extent.push_back(SpatialExtent());
75
76 if (global.size() == 1) {
77 extent.back().Size() = box_size;
78 extent.back().Begin() = box_offset;
79 extent.back().End() = box_offset + box_size;
80 extent.back().MeshWidth() = box_size / static_cast<Vector>(num_cells);
81 }else {
82 extent.back().Size() = (++extent.rbegin())->Size();
83 extent.back().Begin() = (++extent.rbegin())->Begin();
84 extent.back().End() = (++extent.rbegin())->End();
85 extent.back().MeshWidth() = 2.0 * (++extent.rbegin())->MeshWidth();
86 }
87
88 global.back().GlobalSize() = num_cells + 1;
89 global.back().LocalSize() = num_cells + 1;
90 global.back().LocalBegin() = 0;
91 global.back().LocalEnd() = num_cells + 1;
92
93 if (global.size() == 1) {
94 global.back().FinestAbsBegin() = 0;
95 global.back().FinestAbsEnd() = global.back().GlobalSize();
96 global.back().FinestAbsSize() = global.back().GlobalSize();
97 }else {
98 global.back().FinestAbsBegin() = (++global.rbegin())->FinestAbsBegin();
99 global.back().FinestAbsEnd() = (++global.rbegin())->FinestAbsEnd();
100 global.back().FinestAbsSize() = (++global.rbegin())->FinestAbsSize();
101 }
102
103 global.back().GlobalFinerBegin() = 0;
104 global.back().GlobalFinerEnd() = global.back().GlobalSize();
105 global.back().GlobalFinerSize() = global.back().GlobalSize();
106
107 global.back().LocalFinerBegin() = global.back().GlobalFinerBegin();
108 global.back().LocalFinerEnd() = global.back().GlobalFinerEnd();
109 global.back().LocalFinerSize() = global.back().GlobalFinerSize();
110
111 }
112
113 for (i=0; i<3; ++i)
114 if (bc[i] == Periodic)
115 for (unsigned int j=0; j<global.size(); ++j) {
116 global[j].GlobalSize()[i] -= 1;
117 global[j].FinestAbsSize()[i] -= Helper::intpow(2, j);
118 global[j].FinestAbsEnd()[i] -= Helper::intpow(2, j);
119 global[j].LocalSize()[i] -= 1;
120 global[j].LocalEnd()[i] -= 1;
121 global[j].GlobalFinerSize()[i] -= 1;
122 global[j].GlobalFinerEnd()[i] -= 1;
123 global[j].LocalFinerSize()[i] -= 1;
124 global[j].LocalFinerEnd()[i] -= 1;
125 }
126
127 levelMin = levelMax - global.size() + 1;
128
129 global.back().BoundaryType() = GlobalCoarsened;
130
131 for (i=global.size()-2; i>=0; --i) {
132 if (global[i].FinestAbsSize().Product() >= global[i+1].FinestAbsSize().Product()) {
133 global[i].BoundaryType() = GlobalCoarsened;
134 }else {
135 global[i].BoundaryType() = LocallyRefined;
136 global[i+1].BoundaryType() = GlobalMax;
137 break;
138 }
139 }
140
141 for (; i>=0; --i)
142 global[i].BoundaryType() = LocallyRefined;
143
144 if (global.front().BoundaryType() != LocallyRefined &&
145 global.front().BoundaryType() != GlobalMax)
146 global.front().BoundaryType() = GlobalMax;
147
148}
Note: See TracBrowser for help on using the repository browser.