Line data Source code
1 : #ifndef IC_RANDOM_H_ 2 : #define IC_RANDOM_H_ 3 : 4 : #include "AMReX_Vector.H" 5 : 6 : #include "IO/ParmParse.H" 7 : #include "IC/IC.H" 8 : #include "Util/Util.H" 9 : #include "Set/Set.H" 10 : #include "IO/ParmParse.H" 11 : 12 : namespace IC 13 : { 14 : /// \brief Set each point to a random value. 15 : class Random : public IC 16 : { 17 : public: 18 : static constexpr const char* name = "random"; 19 : 20 0 : Random (amrex::Vector<amrex::Geometry> &_geom, Set::Scalar a_mult) : 21 0 : IC(_geom), mult(a_mult) 22 0 : {} 23 0 : Random(amrex::Vector<amrex::Geometry>& _geom, IO::ParmParse& pp, std::string name) : IC(_geom) 24 : { 25 0 : pp.queryclass(name, *this); 26 0 : } 27 : 28 0 : void Add(const int &lev, Set::Field<Set::Scalar> &a_field, Set::Scalar) 29 : { 30 0 : for (amrex::MFIter mfi(*a_field[lev], amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) 31 : { 32 0 : amrex::Box bx; 33 0 : amrex::IndexType type = a_field[lev]->ixType(); 34 0 : if (type == amrex::IndexType::TheCellType()) bx = mfi.growntilebox(); 35 0 : else if (type == amrex::IndexType::TheNodeType()) bx = mfi.grownnodaltilebox(); 36 0 : else Util::Abort(INFO, "Unkonwn index type"); 37 : 38 0 : Set::Patch<Set::Scalar> field = a_field.Patch(lev,mfi); 39 0 : for (int n = 0; n < a_field[lev]->nComp(); n++) 40 : { 41 0 : amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) 42 : { 43 0 : field(i,j,k,n) += mult * Util::Random(); 44 0 : }); 45 : } 46 : } 47 0 : } 48 : 49 : using IC::Add; 50 : 51 0 : static void Parse(Random & value, IO::ParmParse & pp) 52 : { 53 0 : pp.query_default("mult",value.mult,1.0); // Multiplier 54 0 : } 55 : 56 : private: 57 : Set::Scalar mult = NAN; 58 : 59 : }; 60 : } 61 : #endif 62 :