| 735 | #endif |
| 736 | |
| 737 | void seissol::initializer::MemoryManager::initializeFaceDisplacements() |
| 738 | { |
| 739 | for (auto& layer : m_ltsTree.leaves(m_lts.faceDisplacements.mask)) { |
| 740 | if (layer.getBucketSize(m_lts.faceDisplacementsBuffer) == 0) { |
| 741 | continue; |
| 742 | } |
| 743 | real* (*displacements)[4] = layer.var(m_lts.faceDisplacements); |
| 744 | real* bucket = static_cast<real*>(layer.bucket(m_lts.faceDisplacementsBuffer)); |
| 745 | real* (*displacementsDevice)[4] = layer.var(m_lts.faceDisplacementsDevice); |
| 746 | real* bucketDevice = static_cast<real*>(layer.bucket(m_lts.faceDisplacementsBuffer, seissol::initializer::AllocationPlace::Device)); |
| 747 | |
| 748 | #ifdef _OPENMP |
| 749 | #pragma omp parallel for schedule(static) default(none) shared(layer, displacements, bucket, displacementsDevice, bucketDevice) |
| 750 | #endif // _OPENMP |
| 751 | for (unsigned cell = 0; cell < layer.getNumberOfCells(); ++cell) { |
| 752 | for (unsigned face = 0; face < 4; ++face) { |
| 753 | if (displacements[cell][face] != nullptr) { |
| 754 | // Remove constant part that was added in deriveDisplacementsBucket. |
| 755 | // We then have the pointer offset that needs to be added to the bucket. |
| 756 | // The final value of this pointer then points to a valid memory address |
| 757 | // somewhere in the bucket. |
| 758 | auto offset = (reinterpret_cast<std::intptr_t>(displacements[cell][face]) - 1); |
| 759 | displacements[cell][face] = bucket + offset; |
| 760 | displacementsDevice[cell][face] = bucketDevice + offset; |
| 761 | for (unsigned dof = 0; dof < tensor::faceDisplacement::size(); ++dof) { |
| 762 | // zero displacements |
| 763 | displacements[cell][face][dof] = static_cast<real>(0.0); |
| 764 | } |
| 765 | } |
| 766 | } |
| 767 | } |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | void seissol::initializer::MemoryManager::initializeMemoryLayout() |
| 772 | { |
nothing calls this directly
no test coverage detected