LCOV - code coverage report
Current view: top level - src/Model/Propellant - FullFeedback.H (source / functions) Coverage Total Hit
Test: coverage_merged.info Lines: 98.1 % 54 53
Test Date: 2025-07-10 18:14:14 Functions: 100.0 % 3 3

            Line data    Source code
       1              : //
       2              : // This SCP model implements the method described in the following paper
       3              : //
       4              : // .. bibliography::
       5              : //    :list: none
       6              : //    :filter: False
       7              : // 
       8              : //    meier2024diffuse
       9              : //
      10              : // This method imitates inheritance :code:`Propellant::Propellant` using static polymorphism
      11              : // 
      12              : 
      13              : #ifndef MODEL_PROPELLANT_FULLFEEDBACK_H
      14              : #define MODEL_PROPELLANT_FULLFEEDBACK_H
      15              : 
      16              : #include "Propellant.H"
      17              : 
      18              : namespace Model
      19              : {
      20              : namespace Propellant
      21              : {
      22              : class FullFeedback
      23              : {
      24              : public:
      25              :     static constexpr const char* name = "fullfeedback";
      26              : 
      27            3 :     FullFeedback() = default;
      28              :     FullFeedback(IO::ParmParse &pp, std::string name) 
      29              :     {
      30              :         pp_queryclass(name,*this);
      31              :     }
      32              : 
      33         2550 :     void set_pressure(const Set::Scalar P) 
      34              :     {
      35         2550 :         this->P = P;
      36              :         
      37         2550 :         zeta_2 = 0.000045 - P * 6.42e-6;
      38         2550 :         if (arrhenius_dependency == 1) zeta_1 = zeta_2;
      39            0 :         else zeta_1 = zeta_0;
      40              : 
      41              :         // Pressure-dependent post calculation variables
      42         2550 :         k1 = a1 * P + b1 - zeta_1 / zeta;
      43         2550 :         k2 = a2 * P + b2 - zeta_1 / zeta;
      44         2550 :         k3 = 4.0 * log((c1 * P * P + a3 * P + b3) - k1 / 2.0 - k2 / 2.0);
      45         2550 :         return;
      46              :     }
      47              :     
      48              :     AMREX_FORCE_INLINE
      49              :     Set::Scalar get_qdot(const Set::Scalar mdot, const Set::Scalar phi) 
      50              :     {
      51              : 
      52      1747840 :         Set::Scalar qflux = k1 * phi +
      53      1747840 :             k2 * (1.0 - phi) +
      54      1747840 :             (zeta_1 / zeta) * exp(k3 * phi * (1.0 - phi));
      55      1747840 :         Set::Scalar mlocal = (mlocal_ap) * phi + (mlocal_htpb) * (1.0 - phi) + mlocal_comb * phi * (1.0 - phi);
      56      1747840 :         Set::Scalar mdota = fabs(mdot);
      57      1747840 :         Set::Scalar mbase = tanh(4.0 * mdota / (mlocal));
      58              : 
      59      1747840 :         return mbase * qflux;
      60              :     }
      61              : 
      62              : 
      63              :     AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
      64              :     Set::Scalar get_K (const Set::Scalar phi)
      65              :     {
      66      1747840 :         return k_ap * phi + k_htpb * (1.0 - phi);
      67              :     }
      68              : 
      69              :     AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
      70              :     Set::Scalar get_rho (const Set::Scalar phi)
      71              :     {
      72      1747840 :         return rho_ap * phi + rho_htpb * (1.0 - phi); 
      73              :     }
      74              : 
      75              :     AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
      76              :     Set::Scalar get_cp (const Set::Scalar phi)
      77              :     {
      78      1747840 :         return cp_ap * phi + cp_htpb * (1.0 - phi);
      79              :     }
      80              : 
      81              :     AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
      82              :     Set::Scalar get_L (Set::Scalar phi, Set::Scalar T) 
      83              :     {
      84      1747840 :         Set::Scalar L = NAN;
      85      1747840 :         if (mob_ap == 1) L = m_ap * P * exp(-E_ap / T) * phi;
      86      1747840 :         else L = m_ap * exp(-E_ap / T) * phi;
      87      1747840 :         L += m_htpb * exp(-E_htpb / T) * (1.0 - phi);
      88      1747840 :         if (T <= bound) L = 0.0;
      89      1747840 :         return L;
      90              :     }
      91              : 
      92              : 
      93            1 :     static void Parse(FullFeedback& value, IO::ParmParse& pp)
      94              :     {
      95              :         // AP/HTPB interface length
      96            6 :         pp_query_default("phi.zeta", value.zeta, 1.0e-5); 
      97              :         // Reference interface length for heat integration
      98            6 :         pp_query_default("phi.zeta_0", value.zeta_0, 1.0e-5); 
      99              :         
     100              :         // Surrogate heat flux model paramater - AP
     101            6 :         pp_query_required("a1", value.a1); 
     102              :         // Surrogate heat flux model paramater - HTPB
     103            6 :         pp_query_required("a2", value.a2); 
     104              :         // Surrogate heat flux model paramater - Total
     105            6 :         pp_query_required("a3", value.a3); 
     106              :         // Surrogate heat flux model paramater - AP
     107            6 :         pp_query_required("b1", value.b1); 
     108              :         // Surrogate heat flux model paramater - HTPB
     109            6 :         pp_query_required("b2", value.b2); 
     110              :         // Surrogate heat flux model paramater - Total
     111            6 :         pp_query_required("b3", value.b3); 
     112              :         // Surrogate heat flux model paramater - Total
     113            6 :         pp_query_required("c1", value.c1); 
     114              : 
     115              :         // Whether to use pressure to determined the reference Zeta 
     116            6 :         pp_query_default("pressure.dependency", value.arrhenius_dependency, true); 
     117              : 
     118              :         // AP mass flux reference value 
     119            6 :         pp_query_default("mlocal_ap", value.mlocal_ap, 0.0); 
     120              :         // HTPB mass flux reference value 
     121            5 :         pp_query_default("mlocal_comb", value.mlocal_comb, 0.0); 
     122              : 
     123            1 :         Set::Scalar massfraction = 0.8;
     124            1 :         value.mlocal_htpb = 685000.0 - 850e3 * massfraction; // Replicating but needs to be revised!
     125              : 
     126              :         // AP Density
     127            6 :         pp_query_required("rho_ap", value.rho_ap);
     128              :         // HTPB Density
     129            6 :         pp_query_required("rho_htpb", value.rho_htpb);
     130              :         // AP Thermal Conductivity
     131            6 :         pp_query_required("k_ap", value.k_ap);
     132              :         // HTPB Thermal Conductivity
     133            6 :         pp_query_required("k_htpb", value.k_htpb);
     134              :         // AP Specific Heat
     135            6 :         pp_query_required("cp_ap", value.cp_ap);
     136              :         //HTPB Specific Heat
     137            6 :         pp_query_required("cp_htpb", value.cp_htpb); 
     138              : 
     139              :         // AP Pre-exponential factor for Arrhenius Law
     140            6 :         pp_query_required("m_ap", value.m_ap); 
     141              :         // HTPB Pre-exponential factor for Arrhenius Law
     142            6 :         pp_query_required("m_htpb", value.m_htpb); 
     143              :         // AP Activation Energy for Arrhenius Law
     144            6 :         pp_query_required("E_ap", value.E_ap); 
     145              :         // HTPB Activation Energy for Arrhenius Law
     146            6 :         pp_query_required("E_htpb", value.E_htpb); 
     147              :         // Whether to include pressure to the arrhenius law [??]
     148            6 :         pp_query_default("mob_ap", value.mob_ap,0); 
     149              :         // HTPB Activation Energy for Arrhenius Law
     150            5 :         pp_query_default("bound", value.bound,0.0); 
     151              : 
     152            1 :     }
     153              : 
     154              :     // IO Variables
     155              :     Set::Scalar zeta = NAN, zeta_0 = NAN; 
     156              :     Set::Scalar a1 = NAN, a2 = NAN, a3 = NAN;
     157              :     Set::Scalar b1 = NAN, b2 = NAN, b3 = NAN;
     158              :     Set::Scalar c1 = NAN;
     159              :     //Set::Scalar h1 = NAN, h2 = NAN;
     160              :     bool arrhenius_dependency = false;
     161              :     Set::Scalar mlocal_ap = NAN, mlocal_comb = NAN, mlocal_htpb = NAN;
     162              : 
     163              :     //Thermal properties
     164              :     Set::Scalar k_ap = NAN, k_htpb = NAN;
     165              :     Set::Scalar rho_ap = NAN, rho_htpb = NAN;
     166              :     Set::Scalar cp_ap = NAN, cp_htpb = NAN;
     167              : 
     168              :     // Regression variables
     169              :     int mob_ap = -1;
     170              :     Set::Scalar m_ap = NAN, m_htpb = NAN, m_comb = NAN;
     171              :     Set::Scalar E_ap = NAN, E_htpb = NAN;
     172              :     Set::Scalar bound = NAN;
     173              : 
     174              :     // Calculated variables
     175              :     Set::Scalar P = NAN;
     176              :     Set::Scalar zeta_1 = NAN, zeta_2 = NAN;
     177              :     Set::Scalar k1=NAN, k2=NAN, k3=NAN, k4=NAN;
     178              : };
     179              : 
     180              : }
     181              : }
     182              : 
     183              : 
     184              : 
     185              : #endif
     186              : 
     187              : 
        

Generated by: LCOV version 2.0-1