39 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
40 phiprof::initializeTimer(
"copyMomentsToOutflow loop"), technical,
41 [&](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
43 if (technical[stencil.ooo()].sysBoundaryFlag !=
sysboundarytype::OUTFLOW || technical[stencil.ooo()].sysBoundaryLayer > 2) {
47 int distance = numeric_limits<int>::max();
48 array<int,3> closestCellOffset = {numeric_limits<int>::max(), numeric_limits<int>::max(), numeric_limits<int>::max()};
50 for (
int kk=-2; kk<3; kk++) {
51 for (
int jj=-2; jj<3; jj++) {
52 for (
int ii=-2; ii<3 ; ii++) {
53 if( stencil.cellExists(ii,jj,kk)
56 if(distance > ii*ii + jj*jj + kk*kk) {
57 distance = ii*ii + jj*jj + kk*kk;
58 closestCellOffset = {ii, jj, kk};
65 if (closestCellOffset[0] == numeric_limits<int>::max()) {
71 moments[stencil.ooo()][e] = moments[stencil.indexFromOffset(closestCellOffset[0], closestCellOffset[1], closestCellOffset[2])][
fsgrids::moments::RHOM+e];
80void filterMoments(fsgrid::FsData<std::array<Real, fsgrids::moments::N_MOMENTS>>& moments,
84 constexpr int kernelOffset = 2;
85 constexpr Real inverseKernelSum = 1.0 / 729.0;
86 constexpr Real kernel[5][5][5] = {
87 {{1 * inverseKernelSum, 2 * inverseKernelSum, 3 * inverseKernelSum, 2 * inverseKernelSum, 1 * inverseKernelSum},
88 {2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum},
89 {3 * inverseKernelSum, 6 * inverseKernelSum, 9 * inverseKernelSum, 6 * inverseKernelSum, 3 * inverseKernelSum},
90 {2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum},
91 {1 * inverseKernelSum, 2 * inverseKernelSum, 3 * inverseKernelSum, 2 * inverseKernelSum, 1 * inverseKernelSum}},
93 {{2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum},
94 {4 * inverseKernelSum, 8 * inverseKernelSum, 12 * inverseKernelSum, 8 * inverseKernelSum, 4 * inverseKernelSum},
95 {6 * inverseKernelSum, 12 * inverseKernelSum, 18 * inverseKernelSum, 12 * inverseKernelSum, 6 * inverseKernelSum},
96 {4 * inverseKernelSum, 8 * inverseKernelSum, 12 * inverseKernelSum, 8 * inverseKernelSum, 4 * inverseKernelSum},
97 {2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum}},
99 {{3 * inverseKernelSum, 6 * inverseKernelSum, 9 * inverseKernelSum, 6 * inverseKernelSum, 3 * inverseKernelSum},
100 {6 * inverseKernelSum, 12 * inverseKernelSum, 18 * inverseKernelSum, 12 * inverseKernelSum, 6 * inverseKernelSum},
101 {9 * inverseKernelSum, 18 * inverseKernelSum, 27 * inverseKernelSum, 18 * inverseKernelSum, 9 * inverseKernelSum},
102 {6 * inverseKernelSum, 12 * inverseKernelSum, 18 * inverseKernelSum, 12 * inverseKernelSum, 6 * inverseKernelSum},
103 {3 * inverseKernelSum, 6 * inverseKernelSum, 9 * inverseKernelSum, 6 * inverseKernelSum, 3 * inverseKernelSum}},
105 {{2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum},
106 {4 * inverseKernelSum, 8 * inverseKernelSum, 12 * inverseKernelSum, 8 * inverseKernelSum, 4 * inverseKernelSum},
107 {6 * inverseKernelSum, 12 * inverseKernelSum, 18 * inverseKernelSum, 12 * inverseKernelSum, 6 * inverseKernelSum},
108 {4 * inverseKernelSum, 8 * inverseKernelSum, 12 * inverseKernelSum, 8 * inverseKernelSum, 4 * inverseKernelSum},
109 {2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum}},
111 {{1 * inverseKernelSum, 2 * inverseKernelSum, 3 * inverseKernelSum, 2 * inverseKernelSum, 1 * inverseKernelSum},
112 {2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum},
113 {3 * inverseKernelSum, 6 * inverseKernelSum, 9 * inverseKernelSum, 6 * inverseKernelSum, 3 * inverseKernelSum},
114 {2 * inverseKernelSum, 4 * inverseKernelSum, 6 * inverseKernelSum, 4 * inverseKernelSum, 2 * inverseKernelSum},
115 {1 * inverseKernelSum, 2 * inverseKernelSum, 3 * inverseKernelSum, 2 * inverseKernelSum, 1 * inverseKernelSum}}};
118 fsgrid::FsData<std::array<Real, fsgrids::moments::N_MOMENTS>> blurred(moments.size());
121 fsgrid.updateGhostCells(moments.view());
126 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
127 phiprof::initializeTimer(
"Filtering loop"), technical,
128 [&](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
129 const auto refLevel = technical[stencil.ooo()].refLevel;
130 auto& blurCell = blurred[stencil.ooo()];
134 blurCell = moments[stencil.ooo()];
141 for (
int c = -kernelOffset;
c <= kernelOffset;
c++) {
142 for (
int b = -kernelOffset; b <= kernelOffset; b++) {
143 for (
int a = -kernelOffset; a <= kernelOffset; a++) {
144 const auto& cell = moments[stencil.indexFromOffset(a,b,
c)];
147 blurCell[e] += cell[e] * kernel[kernelOffset + a][kernelOffset + b][kernelOffset +
c];
156 swap(moments, blurred);
157 fsgrid.updateGhostCells(moments.view());
161 fsgrid.updateGhostCells(moments.view());
166 const std::vector<CellID>& cells,
167 fsgrid::FsData<std::array<Real, fsgrids::moments::N_MOMENTS>>& moments,
172 std::vector<CellID> dccrgCells = cells;
173 std::sort(dccrgCells.begin(), dccrgCells.end());
176 std::map<int, std::vector<Real>> receivedData;
179 std::map<int, std::vector<Real>> sendData;
182 std::vector<MPI_Request> sendRequests;
183 std::vector<MPI_Request> receiveRequests;
189 int process = receives.first;
190 int count = receives.second.size();
193 MPI_BYTE, process, 1, MPI_COMM_WORLD, &(receiveRequests[ii++]));
200 int targetProc = snd.first;
201 auto& sendBuffer = sendData[targetProc];
202 for (
CellID sendCell : snd.second) {
204 auto cellParams = mpiGrid[sendCell]->get_cell_parameters();
225 MPI_Isend(sendBuffer.data(), sendBuffer.size() *
sizeof(
Real),
226 MPI_BYTE, targetProc, 1, MPI_COMM_WORLD, &(sendRequests[ii]));
230 MPI_Waitall(receiveRequests.size(), receiveRequests.data(), MPI_STATUSES_IGNORE);
233 int process = receives.first;
234 Real* receiveBuffer = receivedData[process].data();
235 for (
auto const& cell : receives.second) {
238 auto& moment = moments[
static_cast<size_t>(lid)];
240 moment[l] = receiveBuffer[l];
248 MPI_Waitall(sendRequests.size(), sendRequests.data(), MPI_STATUSES_IGNORE);
252 phiprof::Timer filteringTimer{
"AMR Filtering-Triangle-3D"};
262 dccrg::Dccrg<SpatialCell, dccrg::Cartesian_Geometry>& mpiGrid,
263 const std::vector<CellID>& cells) {
265 const auto& gridSpacing =
fsgrid.getGridSpacing();
277 this->cells += rhs.cells;
279 this->sums[
i] += rhs.sums[
i];
287 std::vector<CellID> dccrgCells = cells;
288 std::sort(dccrgCells.begin(), dccrgCells.end());
291 std::map<int, std::vector<Average>> receivedData;
294 std::map<int, std::vector<Average>> sendData;
297 std::map<CellID, Average> aggregatedResult;
300 std::vector<MPI_Request> sendRequests;
301 std::vector<MPI_Request> receiveRequests;
307 int remoteRank = rcv.first;
308 int count = rcv.second.size();
309 auto& receiveBuffer = receivedData[remoteRank];
311 receiveBuffer.resize(count);
312 MPI_Irecv(receiveBuffer.data(), count *
sizeof(Average),
313 MPI_BYTE, remoteRank, 1, MPI_COMM_WORLD, &(receiveRequests[ii++]));
318 int remoteRank = snd.first;
319 int count = snd.second.size();
320 auto& sendBuffer = sendData[remoteRank];
321 sendBuffer.resize(count);
324 for (
auto const dccrgCell : snd.second) {
327 for (
auto const fsgridCell : fsgridCells) {
339 const std::array<Real, fsgrids::volfields::N_VOL>& volcell = volumefields[fsgridCell];
340 const std::array<Real, fsgrids::bgbfield::N_BGB>& bgcell = bgb[fsgridCell];
341 const std::array<Real, fsgrids::egradpe::N_EGRADPE>& egradpecell = egradpe[fsgridCell];
342 const std::array<Real, fsgrids::dmoments::N_DMOMENTS>& dMomentscell = dmoments[fsgridCell];
378 sendBuffer[ii].cells++;
388 int remoteRank = sends.first;
389 int count = sends.second.size();
390 MPI_Isend(sendData[remoteRank].data(), count *
sizeof(Average),
391 MPI_BYTE, remoteRank, 1, MPI_COMM_WORLD, &(sendRequests[ii++]));
394 MPI_Waitall(receiveRequests.size(), receiveRequests.data(), MPI_STATUSES_IGNORE);
399 int remoteRank = rcv.first;
400 std::vector<Average>& receiveBuffer = receivedData[remoteRank];
402 for (
CellID dccrgCell : rcv.second) {
404 aggregatedResult[dccrgCell] += receiveBuffer[ii++];
409 for (
auto const& cellAggregate : aggregatedResult) {
410 auto cellParams = mpiGrid[cellAggregate.first]->get_cell_parameters();
411 if (cellAggregate.second.cells > 0) {
483 MPI_Waitall(sendRequests.size(), sendRequests.data(), MPI_STATUSES_IGNORE);
517 const std::vector<CellID>& cells,
521 std::vector<CellID> dccrgCells = cells;
522 std::sort(dccrgCells.begin(), dccrgCells.end());
525 std::map<int, std::vector<int>> receivedData;
528 std::map<int, std::vector<int>> sendData;
531 std::vector<MPI_Request> sendRequests;
532 std::vector<MPI_Request> receiveRequests;
538 int process = receives.first;
539 int count = receives.second.size();
540 receivedData[process].resize(count);
541 MPI_Irecv(receivedData[process].data(), count *
sizeof(
int),
542 MPI_BYTE, process, 1, MPI_COMM_WORLD, &(receiveRequests[ii++]));
549 int targetProc = snd.first;
550 auto& sendBuffer = sendData[targetProc];
551 for (
CellID sendCell : snd.second) {
553 sendBuffer.push_back(mpiGrid[sendCell]->sysBoundaryFlag);
555 MPI_Isend(sendBuffer.data(), sendBuffer.size() *
sizeof(
int),
556 MPI_BYTE, targetProc, 1, MPI_COMM_WORLD, &(sendRequests[ii]));
560 MPI_Waitall(receiveRequests.size(), receiveRequests.data(), MPI_STATUSES_IGNORE);
563 int process = receives.first;
564 int* receiveBuffer = receivedData[process].data();
565 for (
auto const& cell : receives.second) {
569 technical[lid].sysBoundaryFlag = receiveBuffer[0];
576 MPI_Waitall(sendRequests.size(), sendRequests.data(), MPI_STATUSES_IGNORE);