sandbox/YiDai/BASI/invis_burgers_DS2.c

    solve inviscid burgers equation

    Here presenting a different initial condition, check out the method description here

    #include "grid/cartesian1D.h"
    // #include "grid/bitree.h"
    #include "run.h"
    
    scalar T[], Ts[], dT[];
    double dt;
    #define vis 1.0
    int j;
    
    void solve_LF(scalar T, double dt)
    {
        foreach ()
            T[] = 0.5 * (T[1] + T[-1]) - dt * 0.5 * (sq(T[1]) - sq(T[-1])) / (2 * Delta);
    }
    
    void solve_MC(scalar T, double dt)
    {
        scalar Ts[];
        foreach ()
        {
            Ts[] = T[] - dt * 0.5 * (sq(T[1]) - sq(T[0])) / Delta;
            T[] = 0.5 * (T[] + Ts[]) - dt * 0.5 * (sq(Ts[]) - sq(Ts[-1])) / (2 * Delta);
        }
    }
    
    void solve_GD(scalar T, double dt)
    {
        foreach ()
        {
            T[] = T[] - dt * (((T[] >= T[1]) ? \ 
            (((T[] + T[1]) / 2 > 0) ? (sq(T[]) / 2) : (sq(T[1]) / 2))
                                             : \ 
            ((T[] > 0) ? (sq(T[]) / 2) : ((T[1] < 0) ? (sq(T[1]) / 2) : 0))) \ 
            - ((T[-1] >= T[]) ? (((T[-1] + T[]) / 2 > 0) ? (sq(T[-1]) / 2) : (sq(T[]) / 2)) : ((T[-1] > 0) ? (sq(T[-1]) / 2) : ((T[] < 0) ? (sq(T[]) / 2) : 0)))) /
                            Delta;
        }
    }
    
    int main()
    {
        L0 = 4;
        X0 = -1.;
        N = 1 << 9;
        // DT = sq(L0/N)/4;
        DT = 2e-4;
        for (j = 1; j < 4; j++)
            run();
    }
    
    T[left] = dirichlet(0.);
    T[right] = dirichlet(0.);
    
    event init(t = 0)
    {
        foreach ()
        {
            T[] = exp(-sq(2 * (x - 1)));
        }
        boundary({T});
    }
    
    event integration(i++)
    {
        // DT = sq(L0/(1 << grid->maxdepth))/3.;    // smaller time step when the grid is refined
        double dt = DT;
        dt = dtnext(dt);
        // centeral difference
        if (j == 1)
        {
            solve_LF(T, dt);
        }
    
        if (j == 2)
        {
            solve_MC(T, dt);
        }
    
        if (j == 3)
        {
            solve_GD(T, dt);
        }
        boundary({T});
    }
    
    // event printdata (t = 0; t <= 1000 * DT; t += 100 * DT) {
    // event printdata (t = 0; t <= 1; t += 0.01) {
    
    event printdata(t = {0, 0.2, 0.5, 1, 1.5, 2})
    {
        char name[80];
        if (j == 1)
            sprintf(name, "BG_LF%g", t * 10);
        if (j == 2)
            sprintf(name, "BG_MC%g", t * 10);
        if (j == 3)
            sprintf(name, "BG_GD%g", t * 10);
        FILE *fp = fopen(name, "w");
        foreach ()
            fprintf(fp, "%g %g %g\n", x, T[], t);
        fprintf(fp, "\n\n");
        fclose(fp);
    }
    
    
    event end(t = 2) {}
    reset
    file1="BG_LF"
    file2="BG_MC"
    file3="BG_GD"
    set terminal svg size 1200,600 enhanced font 'Times-Roman,12'
    set key samplen 2 spacing 1.5 font 'Times-Roman,12'
    
    set key bottom right
    set multiplot layout 1,3
    set key right top
    plot[][-0.05:1.4] file1.'0'  u ($1):($2) t "t=0"   w lp, \
    file1.'2'  u ($1):($2) t "t=0.2" w lp, \
    file1.'5'  u ($1):($2) t "t=0.5" w lp, \
    file1.'10' u ($1):($2) t "t=1.0" w lp, \
    file1.'15' u ($1):($2) t "t=1.5" w lp, \
    file1.'20' u ($1):($2) t "t=2.0" w lp
    
    set nokey
    plot[][-0.05:1.4] file2.'0'  u ($1):($2)  w lp, \
    file2.'2'  u ($1):($2) w lp, \
    file2.'5'  u ($1):($2) w lp, \
    file2.'10' u ($1):($2) w lp, \
    file2.'15' u ($1):($2) w lp, \
    file2.'20' u ($1):($2) w lp
    
    set nokey
    plot[][-0.05:1.4] file3.'0'  u ($1):($2)  w lp, \
    file3.'2'  u ($1):($2) w lp, \
    file3.'5'  u ($1):($2) w lp, \
    file3.'10' u ($1):($2) w lp, \
    file3.'15' u ($1):($2) w lp, \
    file3.'20' u ($1):($2) w lp
    unset multiplot
    (script)

    (script)