LCOV - code coverage report
Current view: top level - src/IC - Trig2.H (source / functions) Hit Total Coverage
Test: coverage_merged.info Lines: 27 28 96.4 %
Date: 2024-11-18 05:28:54 Functions: 5 5 100.0 %

          Line data    Source code
       1             : #ifndef IC_TRIG2_H_
       2             : #define IC_TRIG2_H_
       3             : 
       4             : #include <complex>
       5             : 
       6             : #include "AMReX_Vector.H"
       7             : #include "IC/IC.H"
       8             : #include "Util/Util.H"
       9             : #include "Set/Set.H"
      10             : 
      11             : namespace IC
      12             : {
      13             : /// \brief Initialize using a trigonometric series
      14             : class Trig2 : public IC
      15             : {
      16             : public:
      17          38 :     Trig2 (amrex::Vector<amrex::Geometry> &_geom,
      18             :         Set::Scalar _alpha = 1.0,
      19             :         AMREX_D_DECL(Set::Scalar _theta1 = 0,
      20             :                 Set::Scalar _theta2 = 0,
      21             :                 Set::Scalar _theta3 = 0),
      22             :         AMREX_D_DECL(int _n1 = 0,
      23             :                 int _n2 = 0,
      24             :                 int _n3 = 0),
      25          38 :         int _dim = AMREX_SPACEDIM) :
      26          38 :         IC(_geom)
      27             :     {
      28          38 :         Define(_alpha,
      29             :                 AMREX_D_DECL(_theta1,_theta2,_theta3),
      30             :                 AMREX_D_DECL(_n1,_n2,_n3),
      31             :                 _dim);
      32          38 :     }
      33             : 
      34             : 
      35          38 :     void Define(Set::Scalar _alpha = 1.0,
      36             :             AMREX_D_DECL(Set::Scalar _theta1 = 0,
      37             :                 Set::Scalar _theta2 = 0,
      38             :                 Set::Scalar _theta3 = 0),
      39             :             AMREX_D_DECL(int _n1 = 0,
      40             :                 int _n2 = 0,
      41             :                 int _n3 = 0),
      42             :             int _dim = AMREX_SPACEDIM)
      43             :     {
      44          38 :         alpha = _alpha;
      45          38 :         AMREX_D_TERM(theta1 = _theta1;, theta2 = _theta2;, theta3 = _theta3;);
      46          38 :         AMREX_D_TERM(n1 = _n1;, n2 = _n2;, n3 = _n3;);
      47          38 :         dim = _dim;
      48          38 :     }
      49             : 
      50             : 
      51          38 :     virtual void Add(const int &lev, Set::Field<Set::Scalar> &field, Set::Scalar)
      52             :     {
      53          38 :         bool cellcentered = (field[0]->boxArray().ixType() == amrex::IndexType(amrex::IntVect::TheCellVector()));
      54             : 
      55          38 :         const std::complex<Set::Scalar> I(0.0,1.0);
      56             : 
      57          38 :         const amrex::Real AMREX_D_DECL(L1 = geom[lev].ProbHi()[0] - geom[lev].ProbLo()[0],
      58             :                             L2 = geom[lev].ProbHi()[1] - geom[lev].ProbLo()[1],
      59             :                             L3 = geom[lev].ProbHi()[2] - geom[lev].ProbLo()[2]);
      60         848 :         for (amrex::MFIter mfi(*field[lev],true); mfi.isValid(); ++mfi)
      61             :         {
      62         810 :             const amrex::Box& box = mfi.validbox();
      63         810 :             amrex::BaseFab<amrex::Real> &field_box = (*field[lev])[mfi];
      64             : 
      65     2564458 :             AMREX_D_TERM(for (int i = box.loVect()[0] - field[lev]->nGrow(); i<=box.hiVect()[0] + field[lev]->nGrow(); i++),
      66             :                     for (int j = box.loVect()[1] - field[lev]->nGrow(); j<=box.hiVect()[1] + field[lev]->nGrow(); j++),
      67             :                     for (int k = box.loVect()[2] - field[lev]->nGrow(); k<=box.hiVect()[2] + field[lev]->nGrow(); k++))
      68             :             {
      69             : 
      70             :                 Set::Scalar AMREX_D_DECL(x1,x2,x3);
      71     2393550 :                 if (cellcentered)
      72             :                 {
      73     2393550 :                     AMREX_D_TERM(x1 = geom[lev].ProbLo()[0] + ((amrex::Real)(i) + 0.5) * geom[lev].CellSize()[0];,
      74             :                             x2 = geom[lev].ProbLo()[1] + ((amrex::Real)(j) + 0.5) * geom[lev].CellSize()[1];,
      75             :                             x3 = geom[lev].ProbLo()[2] + ((amrex::Real)(k) + 0.5) * geom[lev].CellSize()[2];);
      76             :                 }
      77             :                 else
      78             :                 {
      79           0 :                     AMREX_D_TERM(x1 = geom[lev].ProbLo()[0] + ((amrex::Real)(i)) * geom[lev].CellSize()[0];,
      80             :                             x2 = geom[lev].ProbLo()[1] + ((amrex::Real)(j)) * geom[lev].CellSize()[1];,
      81             :                             x3 = geom[lev].ProbLo()[2] + ((amrex::Real)(k)) * geom[lev].CellSize()[2];);
      82             :                 }
      83             : 
      84             :                 
      85     2393550 :                 Set::Scalar trigfn = 1.0;
      86             : #if AMREX_SPACEDIM > 0
      87     2393550 :                 if (dim > 0) trigfn *= std::exp(I*(theta1 + ((amrex::Real)n1)*x1*Set::Constant::Pi / L1)).real();
      88             : 
      89             : #endif
      90             : #if AMREX_SPACEDIM > 1
      91     2393550 :                 if (dim > 1) trigfn *= std::exp(I*(theta2 + ((amrex::Real)n2)*x2*Set::Constant::Pi / L2)).real();
      92             : #endif
      93             : #if AMREX_SPACEDIM > 2
      94     2369250 :                 if (dim > 2) trigfn *= std::exp(I*(theta3 + ((amrex::Real)n3)*x3*Set::Constant::Pi / L3)).real();
      95             : #endif
      96     4787100 :                 field_box(amrex::IntVect(AMREX_D_DECL(i,j,k)),comp) += alpha * trigfn;
      97             : 
      98             :             }
      99             :         }
     100          38 :     }
     101             : 
     102             : private:
     103             :     int dim = AMREX_SPACEDIM;
     104             :     Set::Scalar alpha;
     105             :     int AMREX_D_DECL(n1, n2, n3);
     106             :     Set::Scalar AMREX_D_DECL(theta1, theta2, theta3);
     107             : };
     108             : }
     109             : #endif

Generated by: LCOV version 1.14