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 :
|