sandbox/BOYD/src/theory_evap/stef_calc.h

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    // double T_inf = 378.15;
    static const double T_inf = T_wall;
    static const double alpha_g = lambda_V / (rho_V * cp_V);
    static const double alpha_l = lambda_L / (rho_L * cp_L);
    #define const_term (cp_V * (T_inf - T_sat) / (hlg * sqrt(M_PI)))
    double beta_guess = 0.0667;
    
    double interface_location_func(double t, double beta) {
        double location = 2.0 * beta * sqrt(alpha_g * t);
        return location;
    }
    
    double time_given_interface_func(double x, double beta) {
        double t = sq(x / (2.0 * beta)) / alpha_g;
        return t;
    }
    
    double T_vap_func_no_lim(double time, double x, double beta) {
        double T_v = T_wall + (T_sat-T_wall)/(erf(beta))*erf(x/(2.0*sqrt(alpha_g*time)));
        return T_v;
    }
    //// SHOA et al 2018
    double T_vap_func(double time, double x, double beta) {
        double T_v = T_vap_func_no_lim(time, x, beta);
        double interface = interface_location_func(time, beta);
        if (x > 1.01*interface || T_v<T_sat) {
            T_v = T_sat;
        }
        return T_v;
    }
    
    double dT_interface_func(double time, double beta) {
        double x2 = interface_location_func(time, beta);
        //printf("%d\n", x1);
        double x1 = x2 - 1.0e-6*x2;
        double T_1 = T_vap_func_no_lim(time, x1, beta);
        double T_2 = T_vap_func_no_lim(time, x2, beta);
        double dT = (T_2 - T_1) / (x2 - x1);
        return dT;
    }
    
    //// SHOA et al 2018
    double suck_term(double x) {
        double erfc1 = erfc(x * (rho_V * sqrt(alpha_g)) / (rho_L * sqrt(alpha_l)));
        double top =
            (T_inf - T_sat) * cp_V * lambda_L * sqrt(alpha_g) *
            exp(-x * x * (rho_V * rho_V * alpha_g) / (rho_L * rho_L * alpha_l));
        double bot = hlg * lambda_V * sqrt(M_PI * alpha_l) * erfc1;
        double y = x - top / bot;
        return y;
    }
    
    // SHOA et al 2018;
    double func_beta(double x) {
        double y = x * exp(x*x) * erf(x) - const_term;
        return y;
    }
    
    #include "../common_functions/bisection.h"
    #include "../common_functions/secant.h"
    
    double find_beta() {
        // double beta = secant(func_beta, 0.5 * beta_guess, 1.5 *
        // beta_guess, 1.0e-6);
        double beta =
            bisection(func_beta, 0.01 * beta_guess, 10.0 * beta_guess, 1.0e-8);
        fprintf(stderr, "beta found to be %g\n", beta);
        // print("found beta ", beta);
        return beta;
    }
    
    double find_start_time(double interface_init, double beta) {
        double time_init = time_given_interface_func(interface_init, beta);
        fprintf(stderr, "time_init found to be %g\n", time_init);
        return time_init;
    }