|
| 1 | +// Copyright (c) 2018, Lawrence Livermore National Security, LLC and |
| 2 | +// UT-Battelle, LLC. |
| 3 | +// Produced at the Lawrence Livermore National Laboratory and |
| 4 | +// the Oak Ridge National Laboratory |
| 5 | +// LLNL-CODE-747500 |
| 6 | +// All rights reserved. |
| 7 | +// This file is part of AMPE. |
| 8 | +// For details, see https://github.com/LLNL/AMPE |
| 9 | +// Please also read AMPE/LICENSE. |
| 10 | +#include "QuatFaceCoeffs.h" |
| 11 | +#include "QuatFort.h" |
| 12 | + |
| 13 | + |
| 14 | +using namespace SAMRAI; |
| 15 | + |
| 16 | +QuatFaceCoeffs::QuatFaceCoeffs(const int qlen, const double epsilon_q, |
| 17 | + const double gradient_floor, |
| 18 | + const std::string grad_floor_type) |
| 19 | + : d_qlen(qlen), |
| 20 | + d_epsilon_q(epsilon_q), |
| 21 | + d_gradient_floor(gradient_floor), |
| 22 | + d_grad_floor_type(grad_floor_type) |
| 23 | +{ |
| 24 | +} |
| 25 | + |
| 26 | +// Evaluate coefficient eps_q^2+D_q(phi)/|nabla q| |
| 27 | +void QuatFaceCoeffs::computeCoeffs( |
| 28 | + const std::shared_ptr<hier::PatchHierarchy> hierarchy, |
| 29 | + const int diffusion_coef_id, const int grad_q_id, const int face_coef_id) |
| 30 | +{ |
| 31 | + for (int ln = 0; ln <= hierarchy->getFinestLevelNumber(); ++ln) { |
| 32 | + std::shared_ptr<hier::PatchLevel> level = hierarchy->getPatchLevel(ln); |
| 33 | + |
| 34 | + for (hier::PatchLevel::Iterator pi(level->begin()); pi != level->end(); |
| 35 | + pi++) { |
| 36 | + std::shared_ptr<hier::Patch> patch = *pi; |
| 37 | + |
| 38 | + std::shared_ptr<pdat::SideData<double> > diffusion_coef_data( |
| 39 | + SAMRAI_SHARED_PTR_CAST<pdat::SideData<double>, hier::PatchData>( |
| 40 | + patch->getPatchData(diffusion_coef_id))); |
| 41 | + std::shared_ptr<pdat::SideData<double> > grad_q_data( |
| 42 | + SAMRAI_SHARED_PTR_CAST<pdat::SideData<double>, hier::PatchData>( |
| 43 | + patch->getPatchData(grad_q_id))); |
| 44 | + std::shared_ptr<pdat::SideData<double> > face_coef_data( |
| 45 | + SAMRAI_SHARED_PTR_CAST<pdat::SideData<double>, hier::PatchData>( |
| 46 | + patch->getPatchData(face_coef_id))); |
| 47 | + |
| 48 | + assert(diffusion_coef_data->getDepth() == 1); |
| 49 | + computeCoeffs(*patch, *diffusion_coef_data, *grad_q_data, |
| 50 | + *face_coef_data); |
| 51 | + } |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +// face_coef_data: output |
| 56 | +void QuatFaceCoeffs::computeCoeffs(const hier::Patch& patch, |
| 57 | + pdat::SideData<double>& diffusion_coef_data, |
| 58 | + pdat::SideData<double>& grad_q_data, |
| 59 | + pdat::SideData<double>& face_coef_data) |
| 60 | +{ |
| 61 | +#ifdef DEBUG_CHECK_ASSERTIONS |
| 62 | + assert(patch.inHierarchy()); |
| 63 | + assert(diffusion_coef_data.getDepth() == 1); |
| 64 | + assert(grad_q_data.getDepth() == NDIM * d_qlen); |
| 65 | + assert(face_coef_data.getDepth() == d_qlen); |
| 66 | +#endif |
| 67 | + |
| 68 | + const hier::Box& box = patch.getBox(); |
| 69 | + const hier::Index& lower = box.lower(); |
| 70 | + const hier::Index& upper = box.upper(); |
| 71 | + |
| 72 | + const hier::Box& dc_gbox = diffusion_coef_data.getGhostBox(); |
| 73 | + const hier::Index& dcglower = dc_gbox.lower(); |
| 74 | + const hier::Index& dcgupper = dc_gbox.upper(); |
| 75 | + |
| 76 | + const hier::Box& gq_gbox = grad_q_data.getGhostBox(); |
| 77 | + const hier::Index& gqlower = gq_gbox.lower(); |
| 78 | + const hier::Index& gqupper = gq_gbox.upper(); |
| 79 | + |
| 80 | + const hier::Box& d_gbox = face_coef_data.getGhostBox(); |
| 81 | + const hier::Index& dlower = d_gbox.lower(); |
| 82 | + const hier::Index& dupper = d_gbox.upper(); |
| 83 | + |
| 84 | +#if NDIM == 2 |
| 85 | + COMPUTE_FACE_COEF2D(lower[0], upper[0], lower[1], upper[1], d_qlen, |
| 86 | + d_epsilon_q, diffusion_coef_data.getPointer(0), |
| 87 | + dcglower[0], dcgupper[0] + 1, dcglower[1], dcgupper[1], |
| 88 | + diffusion_coef_data.getPointer(1), dcglower[0], |
| 89 | + dcgupper[0], dcglower[1], dcgupper[1] + 1, |
| 90 | + grad_q_data.getPointer(0), gqlower[0], gqupper[0] + 1, |
| 91 | + gqlower[1], gqupper[1], grad_q_data.getPointer(1), |
| 92 | + gqlower[0], gqupper[0], gqlower[1], gqupper[1] + 1, |
| 93 | + face_coef_data.getPointer(0), dlower[0], dupper[0] + 1, |
| 94 | + dlower[1], dupper[1], // output |
| 95 | + face_coef_data.getPointer(1), dlower[0], dupper[0], |
| 96 | + dlower[1], dupper[1] + 1, // output |
| 97 | + d_gradient_floor, d_grad_floor_type.c_str()); |
| 98 | +#endif |
| 99 | +#if NDIM == 3 |
| 100 | + COMPUTE_FACE_COEF3D( |
| 101 | + lower[0], upper[0], lower[1], upper[1], lower[2], upper[2], d_qlen, |
| 102 | + d_epsilon_q, diffusion_coef_data.getPointer(0), dcglower[0], |
| 103 | + dcgupper[0] + 1, dcglower[1], dcgupper[1], dcglower[2], dcgupper[2], |
| 104 | + diffusion_coef_data.getPointer(1), dcglower[0], dcgupper[0], dcglower[1], |
| 105 | + dcgupper[1] + 1, dcglower[2], dcgupper[2], |
| 106 | + diffusion_coef_data.getPointer(2), dcglower[0], dcgupper[0], dcglower[1], |
| 107 | + dcgupper[1], dcglower[2], dcgupper[2] + 1, grad_q_data.getPointer(0), |
| 108 | + gqlower[0], gqupper[0] + 1, gqlower[1], gqupper[1], gqlower[2], |
| 109 | + gqupper[2], grad_q_data.getPointer(1), gqlower[0], gqupper[0], |
| 110 | + gqlower[1], gqupper[1] + 1, gqlower[2], gqupper[2], |
| 111 | + grad_q_data.getPointer(2), gqlower[0], gqupper[0], gqlower[1], |
| 112 | + gqupper[1], gqlower[2], gqupper[2] + 1, face_coef_data.getPointer(0), |
| 113 | + dlower[0], dupper[0] + 1, dlower[1], dupper[1], dlower[2], dupper[2], |
| 114 | + face_coef_data.getPointer(1), dlower[0], dupper[0], dlower[1], |
| 115 | + dupper[1] + 1, dlower[2], dupper[2], face_coef_data.getPointer(2), |
| 116 | + dlower[0], dupper[0], dlower[1], dupper[1], dlower[2], dupper[2] + 1, |
| 117 | + d_gradient_floor, d_grad_floor_type.c_str()); |
| 118 | +#endif |
| 119 | +} |
0 commit comments