22 CH_TIME(
"MFHelmholtzOp::computeOperatorLoads");
27 CH_assert(a_numApply > 0);
28 CH_assert(a_phi.ghostVect() == m_ghostPhi);
30 LevelData<MFCellFAB> Lphi;
31 this->create(Lphi, a_phi);
33 const DisjointBoxLayout& dbl = a_phi.disjointBoxLayout();
34 const DataIterator& dit = dbl.dataIterator();
36 Vector<long long> loads(dbl.size(), 0LL);
38 const int nbox = dit.size();
40#pragma omp parallel for schedule(runtime)
41 for (
int mybox = 0; mybox < nbox; mybox++) {
42 const DataIndex& din = dit[mybox];
43 const int intCode = din.intCode();
45 const auto t0 = std::chrono::steady_clock::now();
47 for (
int i = 0; i < a_numApply; i++) {
51 for (
auto& op : m_helmOps) {
52 const int iphase = op.first;
54 RefCountedPtr<EBMultigridInterpolator>& phaseInterpolator = m_interpolator.getInterpolator(iphase);
56 EBCellFAB& phi = (EBCellFAB&)a_phi[din].getPhase(iphase);
58 phaseInterpolator->coarseFineInterpH(phi, Interval(m_comp, m_comp), din);
64 m_jumpBC->matchBC((*m_jump)[din], a_phi[din],
true, din);
68 for (
auto& op : m_helmOps) {
69 const Box cellBox = Lphi.disjointBoxLayout()[din];
71 const int iphase = op.first;
73 EBCellFAB& Lph = Lphi[din].getPhase(iphase);
74 EBCellFAB& phi = a_phi[din].getPhase(iphase);
76 const EBCellFAB& Acoef = (*m_Acoef)[din].getPhase(iphase);
77 const EBFluxFAB& Bcoef = (*m_Bcoef)[din].getPhase(iphase);
78 const BaseIVFAB<Real>& BcoefIrreg = *(*m_BcoefIrreg)[din].getPhasePtr(iphase);
80 op.second->applyOp(Lph, phi, Acoef, Bcoef, BcoefIrreg, cellBox, din,
true);
84 const auto t1 = std::chrono::steady_clock::now();
85 const auto duration = (std::chrono::duration_cast<Duration>(t1 - t0));
87 loads[intCode] = (
long long)duration.count();
Vector< long long > computeOperatorLoads(LevelData< MFCellFAB > &a_phi, const int a_numApply) noexcept
Time the applyOp routine. Template parameter is std::chrono duration. E.g. std::chrono::microseconds.
Definition CD_MFHelmholtzOpImplem.H:20
Real sum(const Real &a_value) noexcept
Compute the sum across all MPI ranks.
Definition CD_ParallelOpsImplem.H:354