Changeset dfed1c for src/grid/multigrid.cpp
- Timestamp:
- Nov 22, 2011, 9:22:10 PM (14 years ago)
- Children:
- facba0
- Parents:
- 66f24d
- File:
-
- 1 edited
-
src/grid/multigrid.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/grid/multigrid.cpp
r66f24d rdfed1c 12 12 #endif 13 13 14 #include <iostream> 15 14 16 #include "base/helper.hpp" 15 17 #include "base/index.hpp" 16 18 #include "comm/comm.hpp" 19 #include "comm/domain_decomposition.hpp" 17 20 #include "grid/grid.hpp" 18 #include "grid/grid_ indexing.hpp"21 #include "grid/grid_properties.hpp" 19 22 #include "grid/multigrid.hpp" 20 23 #include "interface/interface.hpp" … … 24 27 Multigrid::Multigrid(Comm* comm, const Interface* interface) 25 28 { 26 bool active;27 29 Index points, remainder; 28 Index procs_l;29 30 LocalIndices local_l; 30 GlobalIndices global_l; 31 32 const Index& pos = comm->Pos(); 33 const Index& procs = comm->Procs(); 34 const Index points_min = 5 * procs; 31 std::vector<GlobalIndices> global_separated; 32 35 33 const std::vector<GlobalIndices>& global = interface->Global(); 36 34 const std::vector<SpatialExtent>& extent = interface->Extent(); 37 35 36 comm->GetDomainDecomposition().Compute(comm, interface, global_separated); 37 38 38 for (unsigned int i=0; i<global.size(); ++i) { 39 39 40 procs_l = global[i].Size() / points_min; 41 42 active = true; 43 for (int j=0; j<3; ++j) { 44 procs_l[j] = std::max(procs_l[j], 1); 45 procs_l[j] = std::min(procs[j], procs_l[j]); 46 active &= pos[j] < procs_l[j]; 47 } 48 40 /* 41 * Check if this level is the finest global level 42 */ 49 43 if (global[i].BoundaryType() == GlobalMax) 50 44 levelGlobalMax = interface->MaxLevel() - i; 51 45 52 if (active) { 53 54 // Set boundary type 55 global_l.BoundaryType() = global[i].BoundaryType(); 56 57 // Compute global size 58 global_l.Size() = global[i].Size() / procs_l; 59 remainder = global[i].Size() % procs_l; 60 61 for (int j=0; j<3; ++j) 62 if (pos[j] < remainder[j]) 63 ++(global_l.Size()[j]); 64 65 // Compute global begin 66 global_l.Begin() = pos * global_l.Size(); 67 68 for (int j=0; j<3; ++j) 69 if (pos[j] >= remainder[j]) 70 global_l.Begin()[j] += remainder[j]; 71 72 // Compute global end 73 global_l.End() = global_l.Begin() + global_l.Size(); 74 75 // Set alignment 46 47 if (global_separated[i].SizeLocal().Product() > 0) { 48 49 /* 50 * Initialize some properties with zero 51 */ 52 local_l.HaloBegin1() = local_l.HaloEnd1() = 0; 53 local_l.HaloBegin2() = local_l.HaloEnd2() = 0; 54 local_l.BoundaryBegin1() = local_l.BoundaryEnd1() = 0; 55 local_l.BoundaryBegin2() = local_l.BoundaryEnd2() = 0; 56 57 /* 58 * Set boundary dependant properties 59 */ 76 60 for (int j=0; j<3; ++j) { 77 global_l.AlignmentBegin()[j] = std::max(0, global[i].AlignmentBegin()[j] - global_l.Begin()[j]); 78 global_l.AlignmentEnd()[j] = std::min(global_l.Size()[j], global[i].AlignmentEnd()[j] - global_l.Begin()[j]); 61 62 if (comm->BoundaryConditions()[j] == Dirichlet || 63 comm->BoundaryConditions()[j] == Open) { 64 65 local_l.SizeTotal()[j] = global_separated[i].SizeLocal()[j] + 66 (global_separated[i].BoundaryType() == LocallyRefined ? 2 : 0); 67 68 /* 69 * We have a boundary at the ends of the process grids 70 * and halo grid points otherwise 71 */ 72 if (global_separated[i].BeginLocal()[j] == 0) { 73 local_l.BoundaryBegin1()[j] = 0; 74 local_l.BoundaryEnd1()[j] = 1; 75 }else { 76 ++local_l.SizeTotal()[j]; 77 local_l.HaloBegin1()[j] = 0; 78 local_l.HaloEnd1()[j] = 1; 79 } 80 81 if (global_separated[i].EndLocal()[j] == global_separated[i].SizeGlobal()[j]) { 82 local_l.BoundaryBegin2()[j] = local_l.SizeTotal()[j] - 1; 83 local_l.BoundaryEnd2()[j] = local_l.SizeTotal()[j]; 84 }else { 85 ++local_l.SizeTotal()[j]; 86 local_l.HaloBegin2()[j] = local_l.SizeTotal()[j] - 1; 87 local_l.HaloEnd2()[j] = local_l.SizeTotal()[j]; 88 } 89 90 }else if (comm->BoundaryConditions()[j] == Periodic) { 91 92 local_l.SizeTotal()[j] = global_separated[i].SizeLocal()[j] + 2; 93 94 /* 95 * No boundary 96 */ 97 local_l.BoundaryBegin1()[j] = local_l.BoundaryEnd1()[j] = 0; 98 local_l.BoundaryBegin2()[j] = local_l.BoundaryEnd2()[j] = 0; 99 100 /* 101 * Halo grid points on all processes 102 */ 103 local_l.HaloBegin1()[j] = 0; 104 local_l.HaloEnd1()[j] = 1; 105 local_l.HaloBegin2()[j] = local_l.SizeTotal()[j] - 1; 106 local_l.HaloEnd2()[j] = local_l.SizeTotal()[j]; 107 108 } 109 79 110 } 80 111 81 switch (comm->BoundaryConditions()) 82 { 83 case Dirichlet: 84 local_l = InitDirichlet(global_l, extent[i], pos, procs_l); 85 break; 86 case Periodic: 87 local_l = InitPeriodic(global_l, extent[i], pos, procs_l); 88 break; 89 case Quasiperiodic: 90 local_l = InitDirichlet(global_l, extent[i], pos, procs_l); 91 break; 92 } 93 94 grids.push_back(new Grid(global_l, local_l, extent[i])); 112 local_l.Begin() = 1; 113 local_l.End() = local_l.SizeTotal() - 1; 114 115 local_l.Size() = local_l.End() - local_l.Begin(); 116 117 if (i==0) 118 local_l.AlignmentBegin() = (global_separated[i].SizeGlobal() - static_cast<int>( pow(2.0, interface->MaxLevel() ) + 0.5 ) - 1) / 2; 119 else if (global_separated[i].BoundaryType() == LocallyRefined) 120 local_l.AlignmentBegin() = (extent[i].Size() - extent[i-1].Size()) * pow(2.0, interface->MaxLevel()-i-1) + 0.5; 121 else if (global_separated[i].BoundaryType() == GlobalMax) 122 local_l.AlignmentBegin() = (extent[i].Size() - extent[i-1].Size()) * pow(2.0, interface->MaxLevel()-i-1) - 0.5; 123 else 124 local_l.AlignmentBegin() = 0; 125 126 local_l.AlignmentBegin() += local_l.Begin(); 127 local_l.AlignmentEnd() = local_l.AlignmentBegin() + global_separated[i].SizeLocal(); 128 129 local_l.AlignmentBegin().Clamp(local_l.Begin(), local_l.End()); 130 local_l.AlignmentEnd().Clamp(local_l.Begin(), local_l.End()); 131 132 133 grids.push_back(new Grid(global_separated[i], local_l, extent[i], interface->MaxLevel()-i, this)); 95 134 96 135 }else { 97 136 98 global_l.Size() = 0; 99 global_l.Begin() = 0; 100 global_l.End() = 0; 101 global_l.AlignmentBegin() = 0; 102 global_l.AlignmentEnd() = 0; 103 global_l.BoundaryType() = EmptyGrid; 137 global_separated[i].SizeGlobal() = global[i].SizeGlobal(); 138 global_separated[i].BeginFinest() = global[i].BeginFinest(); 139 global_separated[i].EndFinest() = global[i].EndFinest(); 140 global_separated[i].SizeFinest() = global[i].SizeFinest(); 141 global_separated[i].SizeLocal() = 0; 142 global_separated[i].BeginLocal() = 0; 143 global_separated[i].EndLocal() = 0; 144 global_separated[i].BoundaryType() = global[i].BoundaryType(); 104 145 105 146 local_l.Size() = 0; … … 118 159 local_l.AlignmentEnd() = 0; 119 160 120 grids.push_back(new Grid(global_ l, local_l, extent[i]));161 grids.push_back(new Grid(global_separated[i], local_l, extent[i], interface->MaxLevel()-i, this)); 121 162 122 163 } … … 130 171 levelIndex = 0; 131 172 levelCurrent = levelMax; 132 } 133 134 LocalIndices Multigrid::InitDirichlet(const GlobalIndices& global, const SpatialExtent& extent, const Index& pos, const Index& procs) 135 { 136 LocalIndices local; 137 138 local.HaloBegin1() = local.HaloEnd1() = 0; 139 local.HaloBegin2() = local.HaloEnd2() = 0; 140 local.BoundaryBegin1() = local.BoundaryEnd1() = 0; 141 local.BoundaryBegin2() = local.BoundaryEnd2() = 0; 142 143 local.SizeTotal() = global.End() - global.Begin() + (global.BoundaryType() == LocallyRefined ? 2 : 0); 144 145 for (int i=0; i<3; ++i) { 146 147 if (pos[i] == 0) { 148 local.BoundaryBegin1()[i] = 0; 149 local.BoundaryEnd1()[i] = 1; 150 }else { 151 ++local.SizeTotal()[i]; 152 local.HaloBegin1()[i] = 0; 153 local.HaloEnd1()[i] = 1; 154 } 155 156 if (pos[i] == procs[i]-1) { 157 local.BoundaryBegin2()[i] = local.SizeTotal()[i] - 1; 158 local.BoundaryEnd2()[i] = local.SizeTotal()[i]; 159 }else { 160 ++local.SizeTotal()[i]; 161 local.HaloBegin2()[i] = local.SizeTotal()[i] - 1; 162 local.HaloEnd2()[i] = local.SizeTotal()[i]; 163 } 164 165 } 166 167 local.Begin() = 1; 168 local.End() = local.SizeTotal() - 1; 169 170 local.Size() = local.End() - local.Begin(); 171 172 local.AlignmentBegin() = global.AlignmentBegin() + local.Begin(); 173 local.AlignmentEnd() = global.AlignmentEnd() - local.Begin(); 174 175 return local; 176 } 177 178 LocalIndices Multigrid::InitPeriodic(const GlobalIndices& global, const SpatialExtent& extent, const Index& pos, const Index& procs) 179 { 180 LocalIndices local; 181 182 local.SizeTotal() = global.End() - global.Begin() + 2; 183 184 local.BoundaryBegin1() = local.BoundaryEnd1() = 0; 185 local.BoundaryBegin2() = local.BoundaryEnd2() = 0; 186 187 local.HaloBegin1() = 0; 188 local.HaloEnd1() = 1; 189 local.HaloBegin2() = local.SizeTotal() - 1; 190 local.HaloEnd2() = local.SizeTotal(); 191 192 local.Begin() = 1; 193 local.End() = local.SizeTotal() - 1; 194 195 local.Size() = local.End() - local.Begin(); 196 197 local.AlignmentBegin() = global.AlignmentBegin() + local.Begin(); 198 local.AlignmentEnd() = global.AlignmentEnd() + local.Begin(); 199 200 return local; 173 201 174 } 202 175
Note:
See TracChangeset
for help on using the changeset viewer.
