Line data Source code
1 : #ifndef MODEL_INTERFACE_GB_SH_H 2 : #define MODEL_INTERFACE_GB_SH_H 3 : 4 : #include <iostream> 5 : #include <fstream> 6 : 7 : #include "AMReX.H" 8 : #include "GB.H" 9 : #include "Set/Set.H" 10 : #include "Util/Util.H" 11 : 12 : #define PI 3.14159265 13 : 14 : namespace Model 15 : { 16 : namespace Interface 17 : { 18 : namespace GB 19 : { 20 : /// 21 : /// A 2D interface model class. Under construction 22 : /// 23 : /// Here are some useful trig identities for reference: 24 : /// 25 : /// \f{align}{\sin(2 \arcsin x) &= 2 x \sqrt{1-x^2} & 26 : /// \cos(2 \arcsin x) &= 1 - 2 x^2 \\ % 27 : /// \sin(2 \arccos x) &= 2 x \sqrt{1-x^2} & 28 : /// \cos(2 \arccos x) &= 2 x^2 - 1 \\ % 29 : /// \sin(2 \arctan x) &= \frac{2 x}{1 + x^2} & 30 : /// \cos(2 \arctan x) &= \frac{1-x^2}{1+x^2} \f} 31 : /// Specializing for tangent: 32 : /// \f{align}{\sin(2 \arctan y/x) &= \frac{2 x y}{x^2 + y^2} & 33 : /// \cos(2 \arctan y/x) &= \frac{x^2-y^2}{x^2+y^2} \f} 34 : /// 35 : class SH : public GB 36 : { 37 : public: 38 : static constexpr const char* name = "sh"; 39 : 40 : SH(){}; 41 : SH(IO::ParmParse &pp){pp_queryclass(*this);}; 42 0 : SH(IO::ParmParse &pp,std::string name){pp_queryclass(name,*this);}; 43 12222 : SH(const amrex::Real a_theta0, const amrex::Real a_phi0, const amrex::Real a_sigma0, const amrex::Real a_sigma1) 44 12222 : { 45 12222 : Define(a_theta0,a_phi0,a_sigma0,a_sigma1); 46 12222 : }; 47 12222 : void Define(const amrex::Real a_theta0, const amrex::Real a_phi0, const amrex::Real a_sigma0, const amrex::Real a_sigma1) 48 : { 49 12222 : theta0 = a_theta0; 50 12222 : phi0 = a_phi0; 51 12222 : sigma0 = a_sigma0; 52 12222 : sigma1 = a_sigma1; 53 12222 : }; 54 : void Randomize() 55 : { 56 : theta0 = Util::Random()*Set::Constant::Pi; 57 : sigma0 = Util::Random(); 58 : sigma1 = Util::Random(); 59 : }; 60 0 : Set::Scalar W(const Set::Scalar a_theta, const Set::Scalar a_phi) const 61 : { 62 0 : return sigma0 + sigma1*(1.0 - (cos(2*(a_phi))*cos(2*(a_phi)) * sin(2*(a_theta))*sin(2*(a_theta)))); 63 : }; 64 : std::array<Set::Scalar,2> DW(const Set::Scalar a_theta, const Set::Scalar a_phi) const 65 : { 66 : return {- sigma1 * 4.0 * cos(2*a_phi) * cos(2*a_phi) * sin(2*a_theta) * cos(2*a_theta), 67 : + sigma1 * 4.0 * sin(2*a_phi) * cos(2*a_phi) * sin(2*a_theta) * sin(2*a_theta)} ; 68 : }; 69 : 70 0 : virtual Set::Scalar W(const Set::Vector &a_n) const override 71 : { 72 0 : Set::Vector n = a_n / a_n.lpNorm<2>(); 73 0 : Set::Scalar theta = std::acos(n(0)); 74 0 : Set::Scalar phi = std::atan2(n(2),n(1)); 75 0 : return W(theta,phi); 76 : }; 77 0 : virtual Set::Scalar DW(const Set::Vector &a_n, const Set::Vector &t_n) const override 78 : { 79 0 : const Set::Scalar alpha = 1E-4; 80 0 : return (W(a_n + alpha*t_n) - W(a_n - alpha*t_n)) / 2.0 / alpha; 81 : }; 82 0 : virtual Set::Scalar DDW(const Set::Vector &a_n, const Set::Vector &t_n) const override 83 : { 84 0 : const Set::Scalar alpha = 1E-4; 85 0 : return (W(a_n + alpha*t_n) - 2.0*W(a_n) + W(a_n - alpha*t_n)) / alpha / alpha; 86 : }; 87 : 88 : 89 0 : Set::Scalar W(const Set::Scalar ) const override {return NAN;}; 90 0 : Set::Scalar DW(const Set::Scalar ) const override {return NAN;}; 91 0 : Set::Scalar DDW(const Set::Scalar ) const override {return NAN;}; 92 : 93 : private: 94 : Set::Scalar theta0 = NAN, phi0 = NAN, sigma0 = NAN, sigma1 = NAN; 95 : 96 : public: 97 0 : static void Parse(SH & value, amrex::ParmParse & pp) 98 : { 99 0 : pp_query("theta0",value.theta0); // Theta offset (degrees) 100 0 : value.theta0 *= 0.01745329251; // convert degrees into radians 101 0 : pp_query("phi0",value.phi0); // Phi offset (radians) 102 0 : value.phi0 *= 0.01745329251; // convert degrees into radians 103 0 : pp_query("sigma0",value.sigma0); // Minimum energy value 104 0 : pp_query("sigma1",value.sigma1); // Energy multiplier 105 : 106 0 : std::string reg_str = "wilhelm"; 107 0 : pp_query("regularization",reg_str); // Type of regularization to use: {wilhelm,k23} 108 0 : if (reg_str == "wilhelm") value.regularization = Regularization::Wilhelm; 109 0 : else if (reg_str == "k23") value.regularization = Regularization::K23; 110 0 : else Util::Abort(INFO,"Invalid regularization string ",reg_str); 111 0 : } 112 : 113 : }; 114 : } 115 : } 116 : } 117 : #endif