| 438 | |
| 439 | |
| 440 | void Radiation::gray_accel(MultiFab& Er_new, MultiFab& Er_pi, |
| 441 | MultiFab& kappa_p, MultiFab& kappa_r, |
| 442 | MultiFab& etaT, MultiFab& eta1, |
| 443 | MultiFab& mugT, |
| 444 | Array<MultiFab, AMREX_SPACEDIM>& lambda, |
| 445 | RadSolve* solver, MGRadBndry& mgbd, |
| 446 | const BoxArray& grids, int level, Real time, |
| 447 | Real delta_t, Real ptc_tau) |
| 448 | { |
| 449 | const Geometry& geom = parent->Geom(level); |
| 450 | auto dx = parent->Geom(level).CellSizeArray(); |
| 451 | const Castro *castro = dynamic_cast<Castro*>(&parent->getLevel(level)); |
| 452 | const DistributionMapping& dmap = castro->DistributionMap(); |
| 453 | |
| 454 | if (nGroups > 1) { |
| 455 | solver->setHypreMulti(1.0); |
| 456 | } |
| 457 | else { |
| 458 | solver->setHypreMulti(0.0); |
| 459 | } |
| 460 | mgbd.setCorrection(); |
| 461 | |
| 462 | MultiFab Er_zero(grids, dmap, 1, 0); |
| 463 | Er_zero.setVal(0.0); |
| 464 | getBndryDataMG_ga(mgbd, Er_zero, level); |
| 465 | |
| 466 | MultiFab spec(grids, dmap, nGroups, 1); |
| 467 | |
| 468 | #ifdef _OPENMP |
| 469 | #pragma omp parallel |
| 470 | #endif |
| 471 | for (MFIter mfi(spec, TilingIfNotGPU()); mfi.isValid(); ++mfi) { |
| 472 | const Box& bx = mfi.tilebox(); |
| 473 | |
| 474 | auto kappa_p_arr = kappa_p[mfi].array(); |
| 475 | auto mugT_arr = mugT[mfi].array(); |
| 476 | auto spec_arr = spec[mfi].array(); |
| 477 | |
| 478 | Real cdt1 = 1.e0_rt / (C::c_light * delta_t); |
| 479 | |
| 480 | amrex::ParallelFor(bx, |
| 481 | [=] AMREX_GPU_HOST_DEVICE (int i, int j, int k) |
| 482 | { |
| 483 | Real epsilon[NGROUPS]; |
| 484 | Real sumeps = 0.0; |
| 485 | for (int g = 0; g < NGROUPS; ++g) { |
| 486 | Real kapt = kappa_p_arr(i,j,k,g) + (1.e0_rt + ptc_tau) * cdt1; |
| 487 | epsilon[g] = mugT_arr(i,j,k,g) / kapt; |
| 488 | sumeps += epsilon[g]; |
| 489 | } |
| 490 | |
| 491 | if (sumeps == 0.e0_rt) { |
| 492 | for (int g = 0; g < NGROUPS; ++g) { |
| 493 | spec_arr(i,j,k,g) = 0.e0_rt; |
| 494 | } |
| 495 | } else { |
| 496 | for (int g = 0; g < NGROUPS; ++g) { |
| 497 | spec_arr(i,j,k,g) = epsilon[g] / sumeps; |
nothing calls this directly
no test coverage detected