LCOV - code coverage report
Current view: top level - src/IC - Constant.H (source / functions) Coverage Total Hit
Test: coverage_merged.info Lines: 66.7 % 33 22
Test Date: 2025-08-12 17:45:17 Functions: 63.6 % 11 7

            Line data    Source code
       1              : //
       2              : // Basic IC that just sets the entire field to a constant value.
       3              : // Works with a single or multiple-component field.
       4              : //
       5              : 
       6              : #ifndef IC_CONSTANT_H_
       7              : #define IC_CONSTANT_H_
       8              : 
       9              : #include "AMReX_Config.H"
      10              : #include "IC/IC.H"
      11              : #include "IO/ParmParse.H"
      12              : #include "Util/Util.H"
      13              : #include "Unit/Unit.H"
      14              : 
      15              : namespace IC
      16              : {
      17              : class Constant : public IC<Set::Scalar>, public IC<Set::Vector>
      18              : {
      19              : public:
      20              :     static constexpr const char* name = "constant";
      21              : 
      22           94 :     virtual ~Constant() = default;
      23              : 
      24              :     Constant (amrex::Vector<amrex::Geometry> &_geom) :
      25              :         IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom) {}
      26              :     Constant (amrex::Vector<amrex::Geometry> &_geom, IO::ParmParse &pp) : 
      27              :         IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom)
      28              :     {pp_queryclass(*this);}
      29           45 :     Constant (amrex::Vector<amrex::Geometry> &_geom, IO::ParmParse &pp, std::string name) : 
      30           45 :         IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom)
      31           45 :     {pp_queryclass(name,*this);}
      32            2 :     Constant (amrex::Vector<amrex::Geometry> &_geom, Unit a_unit, IO::ParmParse &pp, std::string name) : 
      33            2 :         IC<Set::Scalar>(_geom), IC<Set::Vector>(_geom), unit(a_unit)
      34            2 :     {pp_queryclass(name,*this);}
      35              : 
      36              : 
      37         3589 :     virtual void Add(const int &lev, Set::Field<Set::Scalar> &a_field, Set::Scalar /*time*/) override
      38              :     {
      39        25123 :         Util::Assert(INFO,TEST((m_value.size() == 1 || (int)m_value.size() == (int)a_field[lev]->nComp())));
      40         7322 :         for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
      41              :         {
      42         3733 :             const amrex::Box& bx = mfi.growntilebox();
      43         3733 :             amrex::Array4<Set::Scalar> const& field = a_field[lev]->array(mfi);
      44         7483 :             for (int m = 0; m < a_field[lev]->nComp(); m++)
      45         3750 :                 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
      46     10861416 :                 field(i,j,k,m) += m_value.size() == 1 ? m_value[0] : m_value[m];
      47     10861416 :             });  
      48         3589 :         }
      49         3589 :     }
      50              : 
      51            0 :     virtual void Add(const int &lev, Set::Field<Set::Vector> &a_field, Set::Scalar /*time*/) override
      52              :     {
      53            0 :         Util::Assert(INFO,TEST((m_value.size() == 1 || (int)m_value.size() == AMREX_SPACEDIM)));
      54            0 :         for (amrex::MFIter mfi(*a_field[lev],amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
      55              :         {
      56            0 :             const amrex::Box& bx = mfi.growntilebox();
      57            0 :             amrex::Array4<Set::Vector> const& field = a_field[lev]->array(mfi);
      58            0 :             for (int m = 0; m < a_field[lev]->nComp(); m++)
      59            0 :                 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
      60            0 :                     field(i,j,k)(m) += m_value.size() == 1 ? m_value[0] : m_value[m];
      61            0 :             });  
      62            0 :         }
      63            0 :     }
      64              : 
      65           47 :     static void Parse(Constant & value, IO::ParmParse & pp)
      66              :     {
      67              :         // Default: set equal to one everywhere
      68           47 :         value.m_value.clear();
      69              : 
      70              :         // Value (or values if multicomponent) to set field to 
      71           94 :         pp.queryarr_required("value", value.m_value, value.unit); 
      72           47 :     }
      73              : private:
      74              :     std::vector<Set::Scalar> m_value;
      75              :     Unit unit;
      76              : };
      77              : }
      78              : #endif
        

Generated by: LCOV version 2.0-1