63def cea_eval(Pcg, MRg, epsg, cstar, Cf, Tc, gam, Rt, Mt, Cfvac, MR, Pc, eps):
64 Pc_c =
_clip(Pc, Pcg[0], Pcg[-1]); MR_c =
_clip(MR, MRg[0], MRg[-1]); eps_c =
_clip(eps, epsg[0], epsg[-1])
65 npc = Pcg.shape[0]; nmr = MRg.shape[0]; nep = epsg.shape[0]
66 ip = np.searchsorted(Pcg, Pc_c, side=
"left"); ip = 1
if ip < 1
else (npc-1
if ip > npc-1
else ip)
67 im = np.searchsorted(MRg, MR_c, side=
"left"); im = 1
if im < 1
else (nmr-1
if im > nmr-1
else im)
68 ie = np.searchsorted(epsg, eps_c, side=
"left"); ie = 1
if ie < 1
else (nep-1
if ie > nep-1
else ie)
69 Pc0, Pc1 = Pcg[ip-1], Pcg[ip]; MR0, MR1 = MRg[im-1], MRg[im]; e0, e1 = epsg[ie-1], epsg[ie]
70 wx = (Pc_c-Pc0)/(Pc1-Pc0)
if Pc1 != Pc0
else 0.0
71 wy = (MR_c-MR0)/(MR1-MR0)
if MR1 != MR0
else 0.0
72 wz = (eps_c-e0)/(e1-e0)
if e1 != e0
else 0.0
73 w0=(1-wx)*(1-wy)*(1-wz); w1=wx*(1-wy)*(1-wz); w2=(1-wx)*wy*(1-wz); w3=wx*wy*(1-wz)
74 w4=(1-wx)*(1-wy)*wz; w5=wx*(1-wy)*wz; w6=(1-wx)*wy*wz; w7=wx*wy*wz
75 return (
_tri(cstar,ip,im,ie,w0,w1,w2,w3,w4,w5,w6,w7),
76 _tri(Cf,ip,im,ie,w0,w1,w2,w3,w4,w5,w6,w7),
77 _tri(Tc,ip,im,ie,w0,w1,w2,w3,w4,w5,w6,w7),
78 _tri(gam,ip,im,ie,w0,w1,w2,w3,w4,w5,w6,w7),
79 _tri(Rt,ip,im,ie,w0,w1,w2,w3,w4,w5,w6,w7),
80 _tri(Mt,ip,im,ie,w0,w1,w2,w3,w4,w5,w6,w7),
81 _tri(Cfvac,ip,im,ie,w0,w1,w2,w3,w4,w5,w6,w7))
166def _bern(mdot_seed, dP, Pi, rho, area, dhyd, mu, Tin, cd_cap,
167 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu):
169 c0 =
_cd_from_re(0.0, Pi, Tin, dhyd, cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu)
170 return 0.0, c0
if c0 < cd_cap
else cd_cap
171 cdlo =
_cd_from_re(0.0, Pi, Tin, dhyd, cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu)
172 cdlo = cdlo
if cdlo < cd_cap
else cd_cap
173 m = mdot_seed
if mdot_seed > 1e-18
else cdlo*area*np.sqrt(2.0*rho*dP)
177 u = m/(rho*area)
if area > 0.0
else 0.0
179 cd =
_cd_from_re(Re, Pi, Tin, dhyd, cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu)
180 cd = cd
if cd < cd_cap
else cd_cap
181 m = cd*area*np.sqrt(2.0*rho*dP)
182 denom = np.abs(m_was)
if np.abs(m_was) > 1e-18
else 1e-18
183 if np.abs(m - m_was)/denom < 1e-12:
189def _stream_state(m, Pc, P_tank, rho, A, dh, mu, Tin, cd_cap, AH, K0, K1, PHI, KX, DEX,
190 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu, pv, cc):
191 dpf =
_dpf(m, rho, AH, K0, K1, PHI, P_tank, KX, DEX)
193 u = m/(rho*A)
if A > 0.0
else 0.0
195 cd =
_cd_from_re(Re, Pi, Tin, dh, cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu)
196 cd = cd
if cd < cd_cap
else cd_cap
197 if cc > 0.0
and pv == pv
and Pi > Pc:
199 K = (Pi - pv)/(Pi - Pc)
200 cdc = cc*np.sqrt(K
if K > 0.0
else 0.0)
201 cd = cd
if cd < cdc
else cdc
203 mb = cd*A*np.sqrt(2.0*rho*dpi)
if dpi > 0.0
else 0.0
204 return m - mb, cd, Pi, dpf, (dpi
if dpi > 0.0
else 0.0)
208def _stream_flow(Pc, P_tank, rho, A, dh, mu, Tin, cd_cap, AH, K0, K1, PHI, KX, DEX,
209 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu, pv, cc):
210 """Mirrors impinging._stream_flow: Illinois false position on [0, Cd_cap A sqrt(2 rho (P_tank - Pc))]."""
211 if not (A > 0.0)
or not (P_tank > Pc):
212 g, cd, Pi, dpf, dpi =
_stream_state(0.0, Pc, P_tank, rho, A, dh, mu, Tin, cd_cap, AH, K0, K1, PHI, KX, DEX,
213 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu, pv, cc)
214 return 0.0, cd, Pi, dpf, dpi
215 hi = cd_cap*A*np.sqrt(2.0*rho*(P_tank - Pc))
217 ga =
_stream_state(a, Pc, P_tank, rho, A, dh, mu, Tin, cd_cap, AH, K0, K1, PHI, KX, DEX,
218 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu, pv, cc)[0]
219 gb =
_stream_state(b, Pc, P_tank, rho, A, dh, mu, Tin, cd_cap, AH, K0, K1, PHI, KX, DEX,
220 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu, pv, cc)[0]
230 m = (a*gb - b*ga)/(gb - ga)
231 gm =
_stream_state(m, Pc, P_tank, rho, A, dh, mu, Tin, cd_cap, AH, K0, K1, PHI, KX, DEX,
232 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu, pv, cc)[0]
233 if abs(gm) <= tol
or b - a <= tol:
245 g, cd, Pi, dpf, dpi =
_stream_state(m, Pc, P_tank, rho, A, dh, mu, Tin, cd_cap, AH, K0, K1, PHI, KX, DEX,
246 cdinf, aRe, cdmin, geom, dref, dmin, exps, logg, cdmax, cdfloor, upc, Pref, aP, utc, Tref, aT, lod, beta, cdu, pv, cc)
247 return m, cd, Pi, dpf, dpi
262 """impinging._stream_flow.cd_of for one stream: Cd(Re, P_in) capped, then the Nurick limit."""
264 cd =
_cd_from_re(Re, P_in, P[T_O], P[DJO], P[DO_CDINF], P[DO_ARE], P[DO_CDMIN], P[DO_GEOM],
265 P[DO_DREF], P[DO_DMIN], P[DO_EXPS], P[DO_LOGG], P[DO_CDMAX], P[DO_CDFLOOR],
266 P[DO_UPC], P[DO_PREF], P[DO_AP], P[DO_UTC], P[DO_TREF], P[DO_AT], P[DO_LOD],
267 P[DO_BETA], P[DO_CDU])
268 pv = P[VP_O]; cc = P[CC_O]
270 cd =
_cd_from_re(Re, P_in, P[T_F], P[DJF], P[DF_CDINF], P[DF_ARE], P[DF_CDMIN], P[DF_GEOM],
271 P[DF_DREF], P[DF_DMIN], P[DF_EXPS], P[DF_LOGG], P[DF_CDMAX], P[DF_CDFLOOR],
272 P[DF_UPC], P[DF_PREF], P[DF_AP], P[DF_UTC], P[DF_TREF], P[DF_AT], P[DF_LOD],
273 P[DF_BETA], P[DF_CDU])
274 pv = P[VP_F]; cc = P[CC_F]
275 cd = cd
if cd < cd_cap
else cd_cap
276 if cc > 0.0
and pv == pv
and P_in > Pc:
277 K = (P_in - pv)/(P_in - Pc)
278 cdc = cc*np.sqrt(K
if K > 0.0
else 0.0)
279 cd = cd
if cd < cdc
else cdc
441 """Returns (ok, mdot_O, mdot_F, u_O, u_F, D32_O, D32_F, mom_R, Cd_O, Cd_F,
442 Pi_O, Pi_F, dpi_O, dpi_F, A_geom_O, A_geom_F,
443 dpf_O, dpf_F, We_O, We_F, u_rel, x_star, constraints_ok, n_iter).
446 The trailing eight are already computed by the solve; they are returned so the
447 diagnostics dict can be assembled here instead of by a second solve in C.
449 rho_O = P[RHO_O]; mu_O = P[MU_O]; sig_O = P[SIG_O]; tO = P[T_O]
450 rho_F = P[RHO_F]; mu_F = P[MU_F]; sig_F = P[SIG_F]; tF = P[T_F]
451 djo = P[DJO]; djf = P[DJF]; nO = int(P[NO]); nF = int(P[NF])
452 A_O = nO*PI*(djo*0.5)**2; A_F = nF*PI*(djf*0.5)**2
453 Cd_O_eff =
_cd_inf_orifice(djo, P[DO_CDINF], P[DO_GEOM], P[DO_DREF], P[DO_DMIN], P[DO_EXPS], P[DO_LOGG], P[DO_CDMAX], P[DO_CDFLOOR])
454 Cd_F_eff =
_cd_inf_orifice(djf, P[DF_CDINF], P[DF_GEOM], P[DF_DREF], P[DF_DMIN], P[DF_EXPS], P[DF_LOGG], P[DF_CDMAX], P[DF_CDFLOOR])
455 imp_sep =
_clip(P[ANG_O] + P[ANG_F], 1.0, 179.0)
456 imp_angle = imp_sep*PI/180.0
458 mdot_O = 0.1; mdot_F = 0.1
459 Cd_O = 0.0; Cd_F = 0.0; Pi_O = P_tank_O; Pi_F = P_tank_F
460 dpi_O = 0.0; dpi_F = 0.0
461 We_O = 0.0; We_F = 0.0; D32_O = 0.0; D32_F = 0.0; u_rel = 0.0
462 dpf_O = 0.0; dpf_F = 0.0; x_star = 0.0; n_iter = 0
463 ti_O = 0.1; ti_F = 0.1
467 holes_O = np.zeros(int(P[NET_O_H])
if P[NET_O] > 0.0
else 0)
468 holes_F = np.zeros(int(P[NET_F_H])
if P[NET_F] > 0.0
else 0)
474 for iteration
in range(1):
475 n_iter = iteration + 1
477 mo, Cd_O, Pi_O, dpf_O, dpi_O =
_stream_flow_net(Pc, P_tank_O, 0, A_O, Cd_O_eff, P, holes_O)
480 Pc, P_tank_O, rho_O, A_O, djo, mu_O, tO, Cd_O_eff,
481 P[FO_AH], P[FO_K0], P[FO_K1], P[FO_PHI], P[FO_KX], P[FO_DEX],
482 P[DO_CDINF], P[DO_ARE], P[DO_CDMIN], P[DO_GEOM], P[DO_DREF], P[DO_DMIN], P[DO_EXPS], P[DO_LOGG], P[DO_CDMAX], P[DO_CDFLOOR], P[DO_UPC], P[DO_PREF], P[DO_AP], P[DO_UTC], P[DO_TREF], P[DO_AT], P[DO_LOD], P[DO_BETA], P[DO_CDU], P[VP_O], P[CC_O])
484 mf, Cd_F, Pi_F, dpf_F, dpi_F =
_stream_flow_net(Pc, P_tank_F, 1, A_F, Cd_F_eff, P, holes_F)
487 Pc, P_tank_F, rho_F, A_F, djf, mu_F, tF, Cd_F_eff,
488 P[FF_AH], P[FF_K0], P[FF_K1], P[FF_PHI], P[FF_KX], P[FF_DEX],
489 P[DF_CDINF], P[DF_ARE], P[DF_CDMIN], P[DF_GEOM], P[DF_DREF], P[DF_DMIN], P[DF_EXPS], P[DF_LOGG], P[DF_CDMAX], P[DF_CDFLOOR], P[DF_UPC], P[DF_PREF], P[DF_AP], P[DF_UTC], P[DF_TREF], P[DF_AT], P[DF_LOD], P[DF_BETA], P[DF_CDU], P[VP_F], P[CC_F])
490 mdot_O = mo; mdot_F = mf
491 u_O = mdot_O/(rho_O*A_O)
if A_O > 0
else 0.0
492 u_F = mdot_F/(rho_F*A_F)
if A_F > 0
else 0.0
493 u_rel = np.sqrt(u_O*u_O + u_F*u_F - 2.0*u_O*u_F*np.cos(imp_angle))
494 rho_gas = Pc/(P[SP_GASR]*P[SP_GAST]); rho_gas = rho_gas
if rho_gas > 1e-6
else 1e-6
495 if P[SP_SMDMODEL] == SMD_INGEBO:
496 D32_O =
_tn4222(djo, u_O, rho_O, mu_O, sig_O, rho_gas, P[SP_SMDSCALE], P[SP_SMDPROP])
497 D32_F =
_tn4222(djf, u_F, rho_F, mu_F, sig_F, rho_gas, P[SP_SMDSCALE], P[SP_SMDPROP])
499 if P[D32M_O] > 0.0
and u_O > 0.0:
501 if P[D32M_F] > 0.0
and u_F > 0.0:
503 We_O = rho_gas*u_rel*u_rel*djo/sig_O
if sig_O > 0
else np.inf
504 We_F = rho_gas*u_rel*u_rel*djf/sig_F
if sig_F > 0
else np.inf
507 uo_ =
max(u_O, 0.0); uf_ =
max(u_F, 0.0); ur_ =
max(u_rel, 0.0)
508 ue_O = np.sqrt(uo_*uo_ + (alpha*ur_)**2); ue_F = np.sqrt(uf_*uf_ + (alpha*ur_)**2)
509 We_O = rho_O*ue_O*ue_O*djo/sig_O
if sig_O > 0
else np.inf
510 We_F = rho_F*ue_F*ue_F*djf/sig_F
if sig_F > 0
else np.inf
511 weO = We_O; weF = We_F
512 if P[SP_SMDWECORR] > 0
and np.isfinite(P[SP_SMDWECORR]):
513 weO =
min(We_O, P[SP_SMDWECORR]); weF =
min(We_F, P[SP_SMDWECORR])
515 D32_O =
_lefebvre(djo, weO, Oh_O, P[SP_SMDC], P[SP_SMDM], P[SP_SMDP])
516 D32_F =
_lefebvre(djf, weF, Oh_F, P[SP_SMDC], P[SP_SMDM], P[SP_SMDP])
520 te_O =
_tau_evap(D32_O, rho_O, P[LAT_O], P[RHO_O_BOIL], _Tc_ev, Pc, rho_gas,
521 P[EV_CPGAS], P[EV_CEVAP], P[EV_MODEL], P[SP_EVAPK])
522 te_F =
_tau_evap(D32_F, rho_F, P[LAT_F], P[RHO_F_BOIL], _Tc_ev, Pc, rho_gas,
523 P[EV_CPGAS], P[EV_CEVAP], P[EV_MODEL], P[SP_EVAPK])
528 _mt = mdot_O + mdot_F
530 _u_ax = (mdot_O*u_O*np.cos(np.deg2rad(P[ANG_O]))
531 + mdot_F*u_F*np.cos(np.deg2rad(P[ANG_F])))/_mt
534 if not np.isfinite(_u_ax)
or _u_ax <= 0.0:
536 x_star =
max(_u_ax*te_O, _u_ax*te_F)
538 if We_O < P[SP_WEMIN]
or We_F < P[SP_WEMIN]:
540 if P[SP_EVAPUSE] != 0
and x_star >= P[SP_EVAPXLIM]:
547 ti_O =
_clip(0.16*(_reO**(-0.125))
if _reO > 0
else 0.1, 0.02, 0.3)
548 ti_F =
_clip(0.16*(_reF**(-0.125))
if _reF > 0
else 0.1, 0.02, 0.3)
551 A_jet_O = PI*(djo*0.5)**2; A_jet_F = PI*(djf*0.5)**2
552 n_O = nO
if nO >= 1
else 1; n_F = nF
if nF >= 1
else 1
553 den_O = rho_O*n_O*A_jet_O; den_F = rho_F*n_F*A_jet_F
554 v_O = mdot_O/den_O
if den_O > 0
else np.nan
555 v_F = mdot_F/den_F
if den_F > 0
else np.nan
557 if rho_O > 0
and rho_F > 0
and np.isfinite(v_O)
and np.isfinite(v_F)
and v_F != 0.0:
558 num = rho_O*v_O*v_O; den = rho_F*v_F*v_F
559 if den > 0
and num >= 0:
560 mom_R = np.sqrt(num/den)
561 if not (np.isfinite(mdot_O)
and np.isfinite(mdot_F))
or mdot_F <= 0.0:
562 return (0.0, mdot_O, mdot_F, u_O, u_F, D32_O, D32_F, mom_R, Cd_O, Cd_F, Pi_O, Pi_F, dpi_O, dpi_F, A_O, A_F, dpf_O, dpf_F, We_O, We_F, u_rel, x_star, float(constraints_ok), float(n_iter), ti_O, ti_F, holes_O, holes_F)
563 return (1.0, mdot_O, mdot_F, u_O, u_F, D32_O, D32_F, mom_R, Cd_O, Cd_F, Pi_O, Pi_F, dpi_O, dpi_F, A_O, A_F, dpf_O, dpf_F, We_O, We_F, u_rel, x_star, float(constraints_ok), float(n_iter), ti_O, ti_F, holes_O, holes_F)
579 """Pintle branch flows. Same 24-tuple shape as injector_solve.
581 Ports what PintleInjector.solve actually EXECUTES. Two things in that
582 function do not run and are deliberately not reproduced:
583 * the `if feed_iter < 2:` quick-update block is dead -- `feed_iter` is 2
584 once the `for feed_iter in range(3)` loop exits, so the condition is
585 never true (confirmed by counting cd_from_re calls: 2/iteration, not 4);
586 * that 3-iteration feed loop recomputes delta_p_feed from an unchanged
587 mdot, so its 6 calls all return the same two values.
588 Mass flow therefore converges through the outer Cd-relaxation loop alone.
590 mom_R is left NaN: pintle has no momentum_ratio_R (see _eta_advanced).
592 rho_O = P[RHO_O]; mu_O = P[MU_O]; sig_O = P[SIG_O]; tO = P[T_O]
593 rho_F = P[RHO_F]; mu_F = P[MU_F]; sig_F = P[SIG_F]; tF = P[T_F]
594 A_O = P[PIN_AO]; A_F = P[PIN_AF]
595 dh_O = P[PIN_DHO]; dh_F = P[PIN_DHF]
596 d_orif = P[PIN_DORIF]; h_gap = P[PIN_HGAP]
597 max_iter = int(P[SV_CLMAX]); Cd_red = P[SV_CLCDRED]
598 Cd_O_eff = P[DO_CDINF]; Cd_F_eff = P[DF_CDINF]
600 mdot_O = 0.1; mdot_F = 0.1
601 Cd_O = 0.0; Cd_F = 0.0; Pi_O = P_tank_O; Pi_F = P_tank_F
602 dpi_O = 0.0; dpi_F = 0.0; dpf_O = 0.0; dpf_F = 0.0
603 We_O = 0.0; We_F = 0.0; D32 = 0.0; u_O = 0.0; u_F = 0.0
604 V_rel = 0.0; x_star = 0.0; constraints_ok = 0; n_iter = 0
605 ti_O = 0.1; ti_F = 0.1
607 for iteration
in range(max_iter):
608 n_iter = iteration + 1
609 dpf_bal_O =
_dpf(mdot_O, rho_O, P[FO_AH], P[FO_K0], P[FO_K1], P[FO_PHI], P_tank_O, P[FO_KX], P[FO_DEX])
610 dpf_bal_F =
_dpf(mdot_F, rho_F, P[FF_AH], P[FF_K0], P[FF_K1], P[FF_PHI], P_tank_F, P[FF_KX], P[FF_DEX])
611 Pi_O = P_tank_O - dpf_bal_O
612 Pi_F = P_tank_F - dpf_bal_F
613 dpi_O = Pi_O - Pc
if Pi_O - Pc > 0.0
else 0.0
614 dpi_F = Pi_F - Pc
if Pi_F - Pc > 0.0
else 0.0
620 u_O = mdot_O/(rho_O*A_O)
if A_O > 0
else 0.0
621 u_F = mdot_F/(rho_F*A_F)
if A_F > 0
else 0.0
624 cO =
_cd_from_re(Re_O, Pi_O, tO, dh_O, P[DO_CDINF], P[DO_ARE], P[DO_CDMIN], P[DO_GEOM],
625 P[DO_DREF], P[DO_DMIN], P[DO_EXPS], P[DO_LOGG], P[DO_CDMAX], P[DO_CDFLOOR],
626 P[DO_UPC], P[DO_PREF], P[DO_AP], P[DO_UTC], P[DO_TREF], P[DO_AT], P[DO_LOD], P[DO_BETA], P[DO_CDU])
627 cF =
_cd_from_re(Re_F, Pi_F, tF, dh_F, P[DF_CDINF], P[DF_ARE], P[DF_CDMIN], P[DF_GEOM],
628 P[DF_DREF], P[DF_DMIN], P[DF_EXPS], P[DF_LOGG], P[DF_CDMAX], P[DF_CDFLOOR],
629 P[DF_UPC], P[DF_PREF], P[DF_AP], P[DF_UTC], P[DF_TREF], P[DF_AT], P[DF_LOD], P[DF_BETA], P[DF_CDU])
630 Cd_O = cO
if cO < Cd_O_eff
else Cd_O_eff
631 Cd_F = cF
if cF < Cd_F_eff
else Cd_F_eff
633 mdot_O = Cd_O*A_O*np.sqrt(2.0*rho_O*dpi_O)
if dpi_O > 0
else 0.0
634 mdot_F = Cd_F*A_F*np.sqrt(2.0*rho_F*dpi_F)
if dpi_F > 0
else 0.0
635 u_O = mdot_O/(rho_O*A_O)
if A_O > 0
else 0.0
636 u_F = mdot_F/(rho_F*A_F)
if A_F > 0
else 0.0
638 We_O = rho_O*u_O*u_O*d_orif/sig_O
if sig_O > 0
else np.inf
639 We_F = rho_F*u_F*u_F*dh_F/sig_F
if sig_F > 0
else np.inf
641 V_rel = np.sqrt(u_O*u_O + u_F*u_F)
642 D32 =
_smd_pintle(h_gap, V_rel, rho_F, mu_F, sig_F,
643 P[PIN_SMDC], P[PIN_SMDB], P[PIN_SMDN], P[PIN_SMDP])
649 ti_O = 0.16*(Re_O**(-0.125))
if Re_O > 0
else 0.1
650 ti_F = 0.16*(Re_F**(-0.125))
if Re_F > 0
else 0.1
651 ti_O =
_clip(ti_O, 0.02, 0.3); ti_F =
_clip(ti_F, 0.02, 0.3)
657 te = P[SP_EVAPK]*(D32**2)
659 if P[SP_USETURB] != 0.0:
660 v_tot = u_O + u_F
if u_O + u_F > 1e-6
else 1e-6
661 ti_mix =
_clip((ti_O*u_O + ti_F*u_F)/v_tot, 0.02, 0.35)
662 x_star *=
_clip(1.0/(1.0 + P[SP_PENGAIN]*ti_mix), 0.3, 1.0)
669 dpf_O =
_dpf(mdot_O, rho_O, P[FO_AH], P[FO_K0], P[FO_K1], P[FO_PHI], P_tank_O, P[FO_KX], P[FO_DEX])
670 dpf_F =
_dpf(mdot_F, rho_F, P[FF_AH], P[FF_K0], P[FF_K1], P[FF_PHI], P_tank_F, P[FF_KX], P[FF_DEX])
673 if We_O < P[SP_WEMIN]
or We_F < P[SP_WEMIN]:
675 if P[SP_EVAPUSE] != 0
and x_star >= P[SP_EVAPXLIM]:
679 Cd_O_eff *= Cd_red; Cd_F_eff *= Cd_red
680 if Cd_O_eff < P[DO_CDMIN]: Cd_O_eff = P[DO_CDMIN]
681 if Cd_F_eff < P[DF_CDMIN]: Cd_F_eff = P[DF_CDMIN]
683 if not (np.isfinite(mdot_O)
and np.isfinite(mdot_F)
and mdot_F > 0.0):
684 return (0.0, mdot_O, mdot_F, u_O, u_F, D32, D32, np.nan, Cd_O, Cd_F, Pi_O, Pi_F,
685 dpi_O, dpi_F, A_O, A_F, dpf_O, dpf_F, We_O, We_F, V_rel, x_star,
686 float(constraints_ok), float(n_iter), ti_O, ti_F, np.zeros(0), np.zeros(0))
687 return (1.0, mdot_O, mdot_F, u_O, u_F, D32, D32, np.nan, Cd_O, Cd_F, Pi_O, Pi_F,
688 dpi_O, dpi_F, A_O, A_F, dpf_O, dpf_F, We_O, We_F, V_rel, x_star,
689 float(constraints_ok), float(n_iter), ti_O, ti_F, np.zeros(0), np.zeros(0))