跳转至

WENO

Compact Weighted ENO

  • Compact Reconstruction Schemes with Weighted ENO Limiting for Hyperbolic Conservation Laws

code

PyWENO

PyWENO contains two modules to help authors generate WENO codes

FEST-3D FEST-3D (Finite-volume Explicit STructured 3-Dimensional) is computational fluid dynamic solver written in Fortran 90 for solving the Navier-Stokes equations on structured grids using state-of-the-art finite-volume methods. It is a modular, multiblock, finite-volume code developed to solve flow problems in the field of aerodynamics.

折叠表达式(Fold Expressions,C++17 引入)

C++
1
2
3
4
5
6
7
8
template<typename... Args>
auto sum(Args... args) {
    return (... + args); // 使用折叠表达式求和
}
int main() {
    std::cout << sum(1, 2, 3, 4, 5) << std::endl; // 输出:15
    return 0;
}
\[ \left\{\begin{matrix} \cfrac{\partial u_{i}}{\partial t}+u_{i}\cfrac{u^{L}_{i+1/2}-u^{L}_{i-1/2}}{\Delta x}=0,& if \quad u_{i}>0\\ \cfrac{\partial u_{i}}{\partial t}+u_{i}\cfrac{u^{R}_{i+1/2}-u^{R}_{i-1/2}}{\Delta x}=0,& \text{otherwise}\\ \end{matrix}\right. \]

which can be combined into a more compact upwind/downwind notation as follows

\[ \cfrac{\partial u_{i}}{\partial t} +u^{+}_{i}\cfrac{u^{L}_{i+1/2}-u^{L}_{i-1/2}}{\Delta x} +u^{-}_{i}\cfrac{u^{R}_{i+1/2}-u^{R}_{i-1/2}}{\Delta x} =0 \]
C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
      x=0                 ui+1/2,L             x=L
o   o  o  ...   *   *   *  |   *    *    ...    o    o    o
-2 -1 i=1      i-2 i-1  i  |  i+1  i+2         i=N+1 N+2 N+3

      x=0                 ui+1/2,R             x=L
o   o  o  ...   o   *   *  |   *    *   *   ...  o    o    o
-2 -1 i=1      i-2 i-1  i  |  i+1  i+2  i+3    i=N+1 N+2 N+3

i=1,..,N+1
-2,-1,1,2,...,N-1,N,N+1,N+2,N+3

boundary ghost point left:-2,-1,right:N+2,N+3
left:
u(-2)=3u(1)-2u(2)
u(-1)=2u(1)-u(2)
right:
u(N+3)=3u(N+1)-2u(N)
u(N+2)=2u(N+1)-u(N)

      x=0              x=L
o   o  *  o  o ...  o   *    o    o
-2 -1  1  2  3      N-1 N   N+1  N+2

i=1,..,N

-2,-1,1,2,...,N-1,N,N+1,N+2
boundary ghost point left:-2,-1,right:N+1,N+2
left:
u(-2)=3u(1)-2u(2)
u(-1)=2u(1)-u(2)
right:
u(N+2)=3u(N)-2u(N-1)
u(N+1)=2u(N)-u(N-1)

Continuous Subscript

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
       x=0              x=L
 o   o  *  o  o ...  o   *    o    o
-1   0  1  2  3      N-1 N   N+1  N+2

-1,0,1,2,...,N-1,N,N+1,N+2
boundary ghost point left:-1,0,right:N+1,N+2
left:
u(-1)=3u(1)-2u(2)
u(0 )=2u(1)- u(2)
right:
u(N+2)=3u(N)-2u(N-1)
u(N+1)=2u(N)- u(N-1)

uL Index List

\[ \begin{array}{l} u^{L}_{i-1/2}=List(i-3,i-2,i-1,i,i+1)\\ u^{L}_{i+1/2}=List(i-2,i-1,i,i+1,i+2)\\ \text{Inner point form i=2 to i=N-1}\\ \text{i=2: } \\ u^{L}_{i-1/2}=u^{L}_{3/2}=List(i-3,i-2,i-1,i,i+1)=List(-1,0,1,2,3)\\ u^{L}_{i+1/2}=u^{L}_{5/2}=List(i-2,i-1,i,i+1,i+2)=List(0,1,2,3,4)\\ TotalList=(-1,0,1,2,3,4)\\ \text{i=N-1: } \\ u^{L}_{i-1/2}=u^{L}_{N-3/2}=List(i-3,i-2,i-1,i,i+1)\\ u^{L}_{i+1/2}=u^{L}_{N-1/2}=List(i-2,i-1,i,i+1,i+2)\\ u^{L}_{N-3/2}=List(N-4,N-3,N-2,N-1,N)\\ u^{L}_{N-1/2}=List(N-3,N-2,N-1,N,N+1)\\ TotalList=(N-4,N-3,N-2,N-1,N,N+1)\\ \end{array} \]

uR Index List

\[ \begin{array}{l} u^{R}_{i-1/2}=List(i-2,i-1,i,i+1,i+2)\\ u^{R}_{i+1/2}=List(i-1,i,i+1,i+2,i+3)\\ \text{Inner point form i=2 to i=N-1}\\ \text{i=2: } \\ u^{R}_{i-1/2}=u^{R}_{3/2}=List(i-2,i-1,i,i+1,i+2)=List(0,1,2,3,4)\\ u^{R}_{i+1/2}=u^{R}_{5/2}=List(i-1,i,i+1,i+2,i+3)=List(1,2,3,4,5)\\ TotalList=(0,1,2,3,4,5)\\ \text{i=N-1: } \\ u^{R}_{i-1/2}=u^{R}_{N-3/2}=List(i-2,i-1,i,i+1,i+2)\\ u^{R}_{i+1/2}=u^{R}_{N-1/2}=List(i-1,i,i+1,i+2,i+3)\\ u^{R}_{N-3/2}=List(N-3,N-2,N-1,N,N+1)\\ u^{R}_{N-1/2}=List(N-2,N-1,N,N+1,N+2)\\ TotalList=(N-3,N-2,N-1,N,N+1,N+2)\\ \end{array} \]

C or python array index starts from zero:

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
       x=0              x=L
 o   o  *  o  o ...  o   *    o   o
-2  -1  0  1  2      N-2 N-1  N  N+1

-2,-1,0,1,2,...,N-1,N,N+1
boundary ghost point left:-2,-1,right:N,N+1
left:
u(-2)=3u(0)-2u(1)
u(-1)=2u(0)- u(1)
right:
u(N+1)=3u(N-1)-2u(N-2)
u(N  )=2u(N-1)- u(N-2)

uL Index List index starts from zero:

\[ \begin{array}{l} u^{L}_{i-1/2}=List(i-3,i-2,i-1,i,i+1)\\ u^{L}_{i+1/2}=List(i-2,i-1,i,i+1,i+2)\\ \text{Inner point form i=1 to i=N-2}\\ \text{i=1: } \\ u^{L}_{i-1/2}=u^{L}_{1/2}=List(i-3,i-2,i-1,i,i+1)=List(-2,-1,0,1,2)\\ u^{L}_{i+1/2}=u^{L}_{3/2}=List(i-2,i-1,i,i+1,i+2)=List(-1,0,1,2,3)\\ TotalList=(-2,-1,0,1,2,3)\\ \text{i=N-2: } \\ u^{L}_{i-1/2}=u^{L}_{N-5/2}=List(i-3,i-2,i-1,i,i+1)\\ u^{L}_{i+1/2}=u^{L}_{N-3/2}=List(i-2,i-1,i,i+1,i+2)\\ u^{L}_{N-5/2}=List(N-5,N-4,N-3,N-2,N-1)\\ u^{L}_{N-3/2}=List(N-4,N-3,N-2,N-1,N)\\ TotalList=(N-5,N-4,N-3,N-2,N-1,N)\\ \end{array} \]

uR Index List index starts from zero:

\[ \begin{array}{l} u^{R}_{i-1/2}=List(i-2,i-1,i,i+1,i+2)\\ u^{R}_{i+1/2}=List(i-1,i,i+1,i+2,i+3)\\ \text{Inner point form i=1 to i=N-2}\\ \text{i=1: } \\ u^{R}_{i-1/2}=u^{R}_{1/2}=List(i-2,i-1,i,i+1,i+2)=List(-1,0,1,2,3)\\ u^{R}_{i+1/2}=u^{R}_{3/2}=List(i-1,i,i+1,i+2,i+3)=List(0,1,2,3,4)\\ TotalList=(-1,0,1,2,3,4)\\ \text{i=N-2: } \\ u^{R}_{i-1/2}=u^{R}_{N-5/2}=List(i-2,i-1,i,i+1,i+2)\\ u^{R}_{i+1/2}=u^{R}_{N-3/2}=List(i-1,i,i+1,i+2,i+3)\\ u^{R}_{N-5/2}=List(N-4,N-3,N-2,N-1,N)\\ u^{R}_{N-3/2}=List(N-3,N-2,N-1,N,N+1)\\ TotalList=(N-4,N-3,N-2,N-1,N,N+1)\\ \end{array} \]
Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def rhs( nx, dx, u, r ):
    uL = np.zeros( nx     )
    uR = np.zeros( nx + 1 )

    wenoL( nx, u, uL )
    wenoR( nx, u, uR ) 

    for i in range(1, nx):
        if ( u[i] >= 0.0 ):
            r[i] = - u[i] * ( uL[i] - uL[i-1] ) / dx
        else:
            r[i] = - u[i] * ( uR[i+1] - uR[i] ) / dx

fluxL

\[ \begin{array}{l} \cfrac{\partial u_{i}}{\partial t} +u^{+}_{i}\cfrac{u^{L}_{i+1/2}-u^{L}_{i-1/2}}{\Delta x} +u^{-}_{i}\cfrac{u^{R}_{i+1/2}-u^{R}_{i-1/2}}{\Delta x} =0\\ \text{Total point form i=0 to i=N-1,nPoint=N}\\ \text{Inner point form i=1 to i=N-2}\\ \text{Interface bound from i=1 to i=N-2}\\ fluxListL:\\ {u^{L}_{1/2},u^{L}_{3/2},\cdots,u^{L}_{i-1/2},u^{L}_{i+1/2},\cdots,u^{L}_{N-5/2},u^{L}_{N-3/2}}\\ indexList(1/2,3/2,\cdots,i+1/2,\cdots,N-5/2,N-3/2)\\ indexList(0+1/2,1+1/2,\cdots,i+1/2,\cdots,N-3+1/2,N-2+1/2)\\ \text{Interface iface}(0,1,\cdots,N-2),\text{array len=N-1}\\ \end{array} \]
C++
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
reference
{
nx=200
nx+1=201
for i in range(1, nx):
    ut[i] = un[i] + dt*r[i]
1,2,...,nx-1
1,2,...,199
boundary point: (0, nx=200)
//1,2,...,nx-1
//1,2,...,199
//uL:0,1,...,nx-1,len=nx
//uR:1,...,nx,len=nx
//uL:0,1,...,199,len=200
//uR:1,2,...,200,len=200
for i in range(1, nx):
    if ( u[i] >= 0.0 ):
        r[i] = - u[i] * ( uL[i] - uL[i-1] ) / dx
    else:
        r[i] = - u[i] * ( uR[i+1] - uR[i] ) / dx

def wenoL(nx,u,f):
    //nx=200
    a = np.zeros(nx)
    b = np.zeros(nx)
    c = np.zeros(nx)
    r = np.zeros(nx)

    i = 0
    v1 = 3.0*u[i] - 2.0*u[i+1]
    v2 = 2.0*u[i] - u[i+1]
    v3 = u[i]
    v4 = u[i+1]
    v5 = u[i+2]
    f[i] = wcL(v1,v2,v3,v4,v5)

    i = 1
    v1 = 2.0*u[i-1] - u[i]
    v2 = u[i-1]
    v3 = u[i]
    v4 = u[i+1]
    v5 = u[i+2]
    f[i] = wcL(v1,v2,v3,v4,v5)
    //2,3,...,nx-2
    //2,3,...,198
    for i in range(2, nx-1):
        v1 = u[i-2]
        v2 = u[i-1]
        v3 = u[i]
        v4 = u[i+1]
        v5 = u[i+2]
        f[i] = wcL(v1,v2,v3,v4,v5)

    i = nx-1
    //nx-1=199
    v1 = u[i-2]
    v2 = u[i-1]
    v3 = u[i]
    v4 = u[i+1]
    v5 = 2.0*u[i+1]-u[i]
    f[i] = wcL(v1,v2,v3,v4,v5)
    //f:0,1,...,nx-1,len=nx
    //f:0,1,...,199,len=200

def wenoR(n,u,f):
    a = np.zeros(nx+1)
    b = np.zeros(nx+1)
    c = np.zeros(nx+1)
    r = np.zeros(nx+1)    

    i = 1
    v1 = 2.0*u[i-1] - u[i]
    v2 = u[i-1]
    v3 = u[i]
    v4 = u[i+1]
    v5 = u[i+2]
    f[i] = wcR(v1,v2,v3,v4,v5)

    for i in range(2, nx-1):
        v1 = u[i-2]
        v2 = u[i-1]
        v3 = u[i  ]
        v4 = u[i+1]
        v5 = u[i+2]
        f[i] = wcR(v1,v2,v3,v4,v5)

    i = nx-1
    //i = nx-1=199
    v1 = u[i-2]
    v2 = u[i-1]
    v3 = u[i]
    v4 = u[i+1]
    v5 = 2.0*u[i+1] - u[i]
    f[i] = wcR(v1,v2,v3,v4,v5)

    i = nx
    //i = nx=200
    v1 = u[i-2]
    v2 = u[i-1]
    v3 = u[i]
    v4 = 2.0*u[i] - u[i-1]
    v5 = 3.0*u[i] - 2.0*u[i-1]
    f[i] = wcR(v1,v2,v3,v4,v5)
    //f:1,2,...,nx,len=nx


u = np.zeros( (nx+1, ns+1 ) )
len=201
u:0,1,...,200
}
N=201
boundary point: (0, N-1=200)
ist=1
ied=N-2=199

fluxR

\[ \begin{array}{l} \cfrac{\partial u_{i}}{\partial t} +u^{+}_{i}\cfrac{u^{L}_{i+1/2}-u^{L}_{i-1/2}}{\Delta x} +u^{-}_{i}\cfrac{u^{R}_{i+1/2}-u^{R}_{i-1/2}}{\Delta x} =0\\ \text{Total point form i=0 to i=N-1,nPoint=N}\\ \text{Inner point form i=1 to i=N-2}\\ \text{Interface bound from i=1 to i=N-2}\\ fluxListR:\\ {u^{R}_{1/2},u^{R}_{3/2},\cdots,u^{R}_{i-1/2},u^{R}_{i+1/2},\cdots,u^{R}_{N-5/2},u^{R}_{N-3/2}}\\ indexList(1/2,3/2,\cdots,i+1/2,\cdots,N-5/2,N-3/2)\\ indexList(0+1/2,1+1/2,\cdots,i+1/2,\cdots,N-3+1/2,N-2+1/2)\\ \text{Interface iface}(0,1,\cdots,N-2),\text{array len=N-1}\\ \end{array} \]
C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
       x=0              x=L
 o   o  *  o  o ...  o   *    o   o
-2  -1  0  1  2      N-2 N-1  N  N+1
N=201
N-2=199
//0,1,...,N-2
//0,1,...,199,len=200=N-1
//ui-1/2,R=List(i-2,i-1,i,i+1,i+2)
//i=1
//u1/2,R=List(-1,0,1,2,3)
//i=N-1
//uN-1-1/2,R=uN-3/2,R=List(N-3,N-2,N-1,N,N+1)
//i=1,2,...,N-1
for ( int i = 1; i <= N - 1; ++ i )
{
    int ii = i - 1;
    v1 = u[ i - 2 ];
    v2 = u[ i - 1 ];
    v3 = u[ i ];
    v4 = u[ i + 1 ];
    v5 = u[ i + 2 ];
    f[ ii ] = wcR( v1, v2, v3, v4, v5 );
}
C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
       x=0              x=L
 o   o  *  o  o ...  o   *    o   o
-2  -1  0  1  2      N-2 N-1  N  N+1
N=201
N-2=199
//0,1,...,N-2
//0,1,...,199,len=200=N-1
//ui-1/2,R=List(i-2,i-1,i,i+1,i+2)
//i=1
//u1/2,R=List(-1,0,1,2,3)
//i=N-1
//uN-1-1/2,R=uN-3/2,R=List(N-3,N-2,N-1,N,N+1)
//i=1,2,...,N-1

i = 1;
ii = i - 1;
v1 = 2.0 * u[ i - 1 ] - u[ i ];
v2 = u[ i - 1 ];
v3 = u[ i ];
v4 = u[ i + 1 ];
v5 = u[ i + 2 ];
f[ ii ] = wcR( v1, v2, v3, v4, v5 );
for ( int i = 2; i <= N - 3; ++ i )
{
    int ii = i - 1;
    v1 = u[ i - 2 ];
    v2 = u[ i - 1 ];
    v3 = u[ i ];
    v4 = u[ i + 1 ];
    v5 = u[ i + 2 ];
    f[ ii ] = wcR( v1, v2, v3, v4, v5 );
}

i = N-2;
ii = i - 1;
v1 = u[ i - 2 ];
v2 = u[ i - 1 ];
v3 = u[ i ];
v4 = u[ i + 1 ];
v5 = 2.0 * u[ i + 1 ] - u[ i ];
f[ ii ] = wcR( v1, v2, v3, v4, v5 );

i = N-1;
ii = i - 1;
v1 = u[ i - 2 ];
v2 = u[ i - 1 ];
v3 = u[ i ];
v4 = 2.0 * u[ i ] - u[ i - 1 ];
v5 = 3.0 * u[ i ] - 2.0 * u[ i - 1 ];
f[ ii ] = wcR( v1, v2, v3, v4, v5 );
C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
       x=0              x=L
 o   o  *  o  o ...  o   *    o   o
-2  -1  0  1  2      N-2 N-1  N  N+1
N=201
N-2=199
//0,1,...,N-2
//0,1,...,199,len=200=N-1
//ui-1/2,R=List(i-2,i-1,i,i+1,i+2)
//i=1
//u1/2,R=List(-1,0,1,2,3)
//i=N-1
//uN-1-1/2,R=uN-3/2,R=List(N-3,N-2,N-1,N,N+1)
//i=1,2,...,N-1

ist=1
ied=N-1

-2,-1,0,1,...,N-1,N  ,N+1,len=N+4
0 , 1,2,3,...,N+1,N+2,N+3

igL = 2;
igR = 2;
ist = igL; // 2
ied = ist+N-1; //202

ied-(ist + 1)+1=N-1

for ( int i = ist + 1; i <= ied; ++ i )
{
    int ii = i - ist - 1;
    v1 = u[ i - 2 ];
    v2 = u[ i - 1 ];
    v3 = u[ i ];
    v4 = u[ i + 1 ];
    v5 = u[ i + 2 ];
    f[ ii ] = wcR( v1, v2, v3, v4, v5 );
}

ui-1/2,L

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
       x=0              x=L
 o   o  *  o  o ...  o   *    o   o
-2  -1  0  1  2      N-2 N-1  N  N+1
N=201
N-2=199
//0,1,...,N-2
//0,1,...,199,len=200=N-1
//ui+1/2,L=List(i-2,i-1,i,i+1,i+2)
//i=0
//u1/2,L=List(-2,-1,0,1,2)
//i=N-2
//ui+1/2,L=List(i-2,i-1,i,i+1,i+2)
//uN-2+1/2,L=uN-3/2,L=List(N-4,N-3,N-2,N-1,N)

//i=0,1,2,...,N-2
for ( int i = 0; i <= N - 2; ++ i )
{
    int ii = i - 1;
    v1 = u[ i - 2 ];
    v2 = u[ i - 1 ];
    v3 = u[ i ];
    v4 = u[ i + 1 ];
    v5 = u[ i + 2 ];
    f[ ii ] = wcL( v1, v2, v3, v4, v5 );
}

-2,-1,0,1,...,N-1,N  ,N+1,len=N+4
0 , 1,2,3,...,N+1,N+2,N+3

igL = 2;
igR = 2;
ist = igL; // 2
ied = ist+N-1; //202

ied-(ist + 1)+1=N-1

for ( int i = ist; i <= ied - 1; ++ i )
{
    int ii = i - ist;
    v1 = u[ i - 2 ];
    v2 = u[ i - 1 ];
    v3 = u[ i ];
    v4 = u[ i + 1 ];
    v5 = u[ i + 2 ];
    f[ ii ] = wcL( v1, v2, v3, v4, v5 );
}

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
int main( int argc, char ** argv )
{
    int nx = 200;
    int ns = 10;
    double dt = 0.0001;
    double tm = 0.25;

    double dx = 1.0 / nx;
    //int nt = int( tm / dt );
    int nt = std::round( tm / dt );
    double ds = tm / ns;

    std::print( "nx={}\n", nx );
    std::print( "ns={}\n", ns );
    std::print( "dt={}\n", dt );
    std::print( "tm={}\n", tm );
    std::print( "dx={}\n", dx );
    std::print( "nt={}\n", nt );

    return 0;
}

output

Text Only
1
2
3
4
5
6
nx=200
ns=10
dt=1e-04
tm=0.25
dx=0.005
nt=2500

ui+1/2,LR

Text Only
1
2
3
4
5
6
7
      x=0                 ui+1/2,L             x=L
o   o  o  ...   *   *   *  |   *    *    ...    o    o    o
-2 -1 i=1      i-2 i-1  i  |  i+1  i+2         i=N+1 N+2 N+3

      x=0                 ui+1/2,R             x=L
o   o  o  ...   o   *   *  |   *    *   *   ...  o    o    o
-2 -1 i=1      i-2 i-1  i  |  i+1  i+2  i+3    i=N+1 N+2 N+3

ui+1/2,LR index from zero

Text Only
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
      x=0                 ui+1/2,L             x=L
o   o  o  ...   *   *   *  |   *    *    ...    o    o   o
-2 -1 i=0      i-2 i-1  i  |  i+1  i+2         i=N  N+1 N+2

      x=0                 ui+1/2,R             x=L
o   o  o  ...   o   *   *  |   *    *   *   ...  o   o   o
-2 -1 i=0      i-2 i-1  i  |  i+1  i+2         i=N  N+1 N+2

void wenoL( int nx, vec1d & u, vec1d & f )
{
    for ( int i = 0; i <= nx - 1; ++ i )
    {
        double v1 = u[ i - 2 ];
        double v2 = u[ i - 1 ];
        double v3 = u[ i ];
        double v4 = u[ i + 1 ];
        double v5 = u[ i + 2 ];
        f[ i ] = wcL( v1, v2, v3, v4, v5 );
    }
}

ui+1/2,L=List(i-2,i-1,i,i+1,i+2)
ui+1/2,R=List(    i-1,i,i+1,i+2,i+3)

ui+1/2,LR index from zero,npoints = N

Text Only
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
      x=0                ui+1/2,L             x=L
 o  o  o   ...  *   *   *  |   *    *  ...     o    o   o
-2 -1 i=0      i-2 i-1  i  |  i+1  i+2       i=N-1  N  N+1

      x=0                ui+1/2,R              x=L
 o  o  o  ...       *   *  |   *    *   *  ...  o   o   o
-2 -1 i=0      i-2 i-1  i  |  i+1  i+2        i=N-1 N  N+1

         x=0                ui+1/2,L             x=L
 o  o  o  o   ...  *   *   *  |   *    *  ...     o    o   o   o
-3 -2 -1 i=0      i-2 i-1  i  |  i+1  i+2       i=N-1  N  N+1 N+2

         x=0                ui+1/2,R              x=L
 o  o  o  o  ...       *   *  |   *    *   *  ...  o   o   o   o
-3 -2 -1 i=0      i-2 i-1  i  |  i+1  i+2        i=N-1 N  N+1  N+2

int nx = 200;
int ns = 10;
double dt = 0.0001;
double tm = 0.25;
double dx = 1.0 / nx;
int N = nx + 1 = 201
double dx = 1.0 ( N - 1 );

void boundary( int N, vec1d & u )
{
    //left bc
    int i = 0;
    u[ i ] = 0.0;
    u[ i - 1 ] = 2.0 * u[ i ] - u[ i + 1 ]; 
    u[ i - 2 ] = 3.0 * u[ i ] - 2.0 * u[ i + 1 ];   
    u[ i - 3 ] = 2 * u[ i - 2 ] - u[ i - 1 ]
               = 4.0 * u[ i ] - 3.0 * u[ i + 1 ];

    //right bc
    i = N - 1;
    u[ i ] = 0.0;
    u[ i + 1 ] = 2.0 * u[ i ] - u[ i - 1 ];
    u[ i + 2 ] = 3.0 * u[ i ] - 2.0 * u[ i - 1 ];
    u[ i + 3 ] = 4.0 * u[ i ] - 3.0 * u[ i - 1 ];
}

ui+1/2,L=List(i-2,i-1,i,i+1,i+2)
ui+1/2,R=List(    i-1,i,i+1,i+2,i+3)

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
std::valarray<double> a,b,c;
a.resize( 3 );
b.resize( 3 );
for ( int i = 0; i < a.size(); ++ i )
{
    a[ i ] = i;
    b[ i ] = i * 10;
}
c = a + b;
for ( int i = 0; i < c.size(); ++ i )
{
    std::print( "{}+{}={}\n", a[ i ], b[ i ], c[ i ] );
}

Third order TVD Runge-Kutta method

\[ \begin{array}{l} u^{(1)}=u^{n}+\Delta tL(u^{n})\\ u^{(2)}=\cfrac{3}{4}u^{n}+\cfrac{1}{4}u^{(1)}+\cfrac{1}{4}\Delta tL(u^{(1)})\\ u^{n+1}=\cfrac{1}{3}u^{n}+\cfrac{2}{3}u^{(2)}+\cfrac{2}{3}\Delta tL(u^{(2)})\\ \end{array} \]

RungeKutta3

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void Field::RungeKutta3Stage0( Zone * zone )
{
    int ist = 1;
    int ied = ni;

    this->Rhs( this->un, this->r );

    for ( int i = ist; i <= ied; ++ i )
    {
        u[ i ] = un[ i ] + dt * r[ i ];
    }
}

void Field::RungeKutta3Stage1( Zone * zone )
{
    int ist = 1;
    int ied = ni;

    this->Rhs( this->u1, this->r );

    for ( int i = ist; i <= ied; ++ i )
    {
        u[ i ] = 0.75 * un[ i ] + 0.25 * u1[ i ] + 0.25 * dt * r[ i ];
    }
}

void Field::RungeKutta3Stage2( Zone * zone )
{
    int ist = 1;
    int ied = ni;

    this->Rhs( this->u, this->r );

    double c1 = 1.0 / 3.0;
    double c2 = 2.0 / 3.0;
    double c3 = 2.0 / 3.0;

    for ( int i = ist; i <= ied; ++ i )
    {
        u[ i ] = c1 * un[ i ] + c2 * u[ i ] + c3 * dt * r[ i ];
    }
}

runge_kutta_stage weno

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void runge_kutta_stage1( int N, vec1d & un, vec1d & ut, vec1d & res, double dx, double dt )
{
    rhs( N, dx, un, res );
    for ( int i = 0; i < N; ++ i )
    {
        ut[ i ] = un[ i ] + dt * res[ i ];
    }
    boundary( N, ut );
}

void runge_kutta_stage2( int N, vec1d & un, vec1d & ut, vec1d & res, double dx, double dt )
{
    rhs( N, dx, ut, res );

    for ( int i = 0; i < N; ++ i )
    {
        ut[ i ] = 0.75 * un[ i ] + 0.25 * ut[ i ] + 0.25 * dt * res[ i ];
    }
    boundary( N, ut );
}

void runge_kutta_stage3( int N, vec1d & un, vec1d & ut, vec1d & res, double dx, double dt )
{
    rhs( N, dx, ut, res );

    for ( int i = 0; i < N; ++ i )
    {
        un[ i ] = ( 1.0 / 3.0 ) * un[ i ] + ( 2.0 / 3.0 ) * ut[ i ] + ( 2.0 / 3.0 ) * dt * res[ i ];
    }
    boundary( N, un );
}

void Field::InitHeatEquation( Grid * grid )

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void Field::InitHeatEquation( Grid * grid )
{
    this->ni = grid->x.size();
    std::cout << "ni = " << ni << "\n";

    std::vector<double> & x = grid->x;
    this->dx = std::abs( x[ 1 ] - x[ 0 ] );
    this->dt = dx / 10.0;
    this->total_time = 1.0;
    this->nt = std::round( total_time / dt );

    //double total_time = nt * dt;

    std::cout << "this->dt   = " << this->dt << "\n";
    std::cout << "this->total_time  = " << this->total_time << "\n";
    std::cout << "this->nt   = " << this->nt << "\n";
    std::cout << "this->ni   = " << this->ni << "\n";
    std::cout << "nt * dt = " << nt * dt << "\n";

    Global::nt = nt;

    this->alpha = 1 / ( std::numbers::pi * std::numbers::pi );
    this->beta = this->alpha * dt / ( dx * dx );

    int nghost = 2;
    int ni_total = ni + nghost;

    int N = this->ni;

    u_e.Allocate( 0, ni_total - 1 );
    u.Allocate( 0, ni_total - 1 );
    un.Allocate( 0, ni_total - 1 );
    r.Allocate( 0, ni_total - 1 );

    // 0 1 2 ... ni-1 ni ni+1
    int ist = 1;
    int ied = ni;

    for ( int i = ist; i <= ied; ++ i )
    {
        double xm = x[ i - ist ];
        u_e[ i ] = - std::exp( -total_time ) * std::sin( std::numbers::pi * xm ); //theory solution
        u[ i ] = - std::sin( std::numbers::pi * xm ); //initial condition @ t=0
    }
}

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
o  |  *  *      *    *   |   o  
0  1  2  3 ... ni-2 ni-1 ni ni+1

int N = this->ni;
int nghost = 2;
int ni_total = N + nghost;

u_e.Allocate( 0, ni_total - 1 );
u.Allocate( 0, ni_total - 1 );
un.Allocate( 0, ni_total - 1 );
r.Allocate( 0, ni_total - 1 );

 o  |  *  *      *    *    |   o  
-1  0  1  2 ... ni-3 ni-2 ni-1 ni

//ist=0;
//ied=N-1;

int ighost = 1;
int iist = 0 - ighost;
int iied = N - 1 + ighost;
u_e.Allocate( iist, iied );
u.Allocate( iist, iied );
un.Allocate( iist, iied );
res.Allocate( 0, N, 0 ); //N+1

MyWenoPlot.py

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import numpy as np
import matplotlib.pyplot as plt
import csv

with open('field_final0.csv', newline='') as csvfile:
    readCSV = csv.reader(csvfile, delimiter= ' ')
    icount = 0
    for row in readCSV:
        icount += 1

ni = icount
print("ni=",ni)

ns = 10

u = np.zeros( (ni, ns + 1 ) )
x = np.zeros( (ni) )

for j in range(ns+1):
    filename = 'field_final'+str((j)*250)+'.csv'
    print('filename=',filename)
    with open(filename, newline='') as csvfile:
        readCSV = csv.reader(csvfile, delimiter= ' ')
        i = 0
        for row in readCSV:
            x[i] = float(row[0])
            u[i][j] = float(row[1])
            i += 1

print("u.shape=",u.shape)
n1 = u.shape[0]
n2 = u.shape[1]
print(f"n1={n1},n2={n2}")
#exit()
#x = np.linspace(0,1, num=ni) 

tm = 0.25

plt.figure("OneFLOW-CFD Solver", figsize=(6, 4), dpi=100)
for k in range(0, ns+1):
    plt.plot(x, u[:,k], linewidth=1.0, label="t="+format(tm*k/ns, ".4f"))
plt.xlabel("$x$")
plt.ylabel("$u$")
plt.title("Inviscid Burgers Equation: Non-Conservative Form-WENO-5 Scheme")
plt.legend(loc='upper right', fontsize='6')
plt.show()

void Solver::DownloadInterfaceField()

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void Solver::DownloadInterfaceField()
{
    for ( int iZone = 0; iZone < LocalZone::nZones; ++ iZone )
    {
        Interface * interface = Global::interfaces[ iZone ];
        Field * field = Global::fields[ iZone ];

        int nInterFaces = interface->data_recv.size();

        int index_dim = 1;
        for ( int iFace = 0; iFace < nInterFaces; ++ iFace )
        {
            int ijkpos = index_dim * iFace * nghost;
            int data_pos = iFace * nghost;
            for ( int ig = 0; ig < nghost; ++ ig )
            {
                int ig_cell = interface->ijk_ghosts[ ijkpos + ig ];

                double donor_value = interface->data_recv[ data_pos + ig ];
                field->u[ ig_cell ] = donor_value;
            }
        }
    }
}

void Interface::SendGeom( int zone, std::vector & donorfaces )

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void Interface::SendGeom( int zone, std::vector<int> & donorfaces )
{
    Interface * interface = this;

    std::vector<int> & send_to_zones = interface->send_to_zones;

    send_to_zones.push_back( zone );
    interface->donorfaces_for_send.push_back( donorfaces );

    int nface = donorfaces.size();
    std::vector<int> sub_donorijk;
    int index_dim = 1;
    for ( int i = 0; i < nface; ++ i )
    {
        int global_faceid = donorfaces[ i ];
        int local_faceid = interface->global_local_face_map[ global_faceid ];
        int ijkpos = index_dim * local_faceid;
        int i_donor_cell = interface->ijk_donors[ ijkpos + 0 ];
        sub_donorijk.push_back( i_donor_cell );
        int kkk = 1;
    }

    interface->donorijk_for_send.push_back( sub_donorijk );

    std::vector<double> sub_donordata( sub_donorijk.size() );
    interface->donordata_for_send.push_back( sub_donordata );
}
C++
1
2
    Global::interfaceTopo.InitNeighborInfo();
    Global::interfaceTopo.SwapNeighborInfo();

void InterfaceTopo::InitNeighborInfo()

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
void InterfaceTopo::InitNeighborInfo()
{
    this->linkmap.resize( ZoneState::nZones );

    for ( int iZone = 0; iZone < ZoneState::nZones; ++ iZone )
    {
        if ( ! ZoneState::IsValid( iZone ) ) continue;

        int local_zoneid = ZoneState::g2lzoneids[ iZone ];

        Interface * interface = Global::interfaces[ local_zoneid ];

        std::vector<int> & t = this->linkmap[ iZone ];
        t = interface->neighbor_donor_zones;
    }
}

void InterfaceTopo::SwapNeighborInfo()

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
void InterfaceTopo::SwapNeighborInfo()
{
    for ( int iZone = 0; iZone < ZoneState::nZones; ++ iZone )
    {
        int pid = ZoneState::pids[ iZone ];

        std::vector<int> & donor_zones = this->linkmap[ iZone ];
        int nNeighbor = donor_zones.size();

        HXBcastData( &nNeighbor, 1, pid );

        donor_zones.resize( nNeighbor );

        HXBcastData( donor_zones.data(), donor_zones.size(), pid );
    }

    this->SwapNeighborDonorfaces();
}

void InterfaceTopo::SwapNeighborDonorfaces()

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void InterfaceTopo::SwapNeighborDonorfaces()
{
    int gl = 0;
    for ( int iZone = 0; iZone < ZoneState::nZones; ++ iZone )
    {
        int send_pid = ZoneState::pids[ iZone ];

        std::vector<int> & donor_zones = this->linkmap[ iZone ];
        int ndonor_zones = donor_zones.size();

        for ( int iNei = 0; iNei < ndonor_zones; ++ iNei )
        {
            int donor_zone = donor_zones[ iNei ];
            int recv_pid = ZoneState::pids[ donor_zone ];
            int nInterFaces = 0;
            std::vector<int> donorfaces;

            if ( Parallel::pid == send_pid )
            {
                int local_zoneid = ZoneState::g2lzoneids[ iZone ];

                Interface * interface = Global::interfaces[ local_zoneid ];

                std::vector<std::vector<int>> & neighbor_donorfaces = interface->neighbor_donorfaces;

                std::vector<int> & neighbor_donorface = neighbor_donorfaces[ iNei ];

                nInterFaces = neighbor_donorface.size();

                donorfaces = neighbor_donorface;
            }

            HXSendRecvData( &nInterFaces, 1, send_pid, recv_pid );

            if ( Parallel::pid == recv_pid && send_pid != recv_pid )
            {
                donorfaces.resize( nInterFaces );
            }

            HXSendRecvData( donorfaces.data(), donorfaces.size(), send_pid, recv_pid );

            if ( Parallel::pid == recv_pid )
            {
                int local_donor_zoneid = ZoneState::g2lzoneids[ donor_zone ];
                Interface * interface_recv = Global::interfaces[ local_donor_zoneid ];
                interface_recv->SendGeom( iZone, donorfaces );
            }
        }
    }
}

void Interface::SendGeom( int zone, std::vector & donorfaces )

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void Interface::SendGeom( int zone, std::vector<int> & donorfaces )
{
    Interface * interface = this;

    std::vector<int> & send_to_zones = interface->send_to_zones;

    send_to_zones.push_back( zone );
    interface->donorfaces_for_send.push_back( donorfaces );

    int nface = donorfaces.size();
    std::vector<int> sub_donorijk;
    int index_dim = 1;
    for ( int i = 0; i < nface; ++ i )
    {
        int global_faceid = donorfaces[ i ];
        int local_faceid = interface->global_local_face_map[ global_faceid ];
        int ijkpos = index_dim * local_faceid;
        int i_donor_cell = interface->ijk_donors[ ijkpos + 0 ];
        sub_donorijk.push_back( i_donor_cell );
        int kkk = 1;
    }

    interface->donorijk_for_send.push_back( sub_donorijk );

    std::vector<double> sub_donordata( sub_donorijk.size() );
    interface->donordata_for_send.push_back( sub_donordata );
}

Interface::CalcInterface

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void Interface::CalcInterface( Transform * transform, std::vector<int> & start, std::vector<int> & end, int donor_zoneid )
{
    int ist = start[ 0 ];
    int ied = end[ 0 ];
    int dim = start.size();
    std::vector<int> index1( dim );
    std::vector<int> index2( dim );

    int icount = this->zoneList.size();
    for ( int i = ist; i <= ied; ++ i )
    {
        int faceid = icount;
        this->zoneList.push_back( donor_zoneid );
        this->local_faceids.push_back( faceid );
        index1[ 0 ] = i;
        transform->MapIndex( index1, index2 );
        Face face;
        face.zone = zoneid;
        face.i = i;

        int i_donor = index2[ 0 ];

        Face face_donor;
        face_donor.zone = donor_zoneid;
        face_donor.i = i_donor;

        FacePair facePair;
        facePair.AddPair( face, face_donor );

        Global::facePairList.push_back( facePair );
        int nSize = Global::facePairList.size();
        this->proc_global_faceids.push_back( nSize - 1 );

        int i_ghost_cell = i + 1;
        int i_local_donor_cell = i - 1;

        if ( i == 1 )
        {
            i_ghost_cell = i - 1;
            i_local_donor_cell = i + 1;
        }
        ijk_ghosts.push_back( i_ghost_cell );
        ijk_donors.push_back( i_local_donor_cell );

        icount ++;
    }
}

CRWENO(Compact Reconstruction)WENO

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
         x=0                ui+1/2,L             x=L
 o  o  o  o   ...  *   *   *  |   *    *  ...     o    o   o   o
-3 -2 -1 i=0      i-2 i-1  i  |  i+1  i+2       i=N-1  N  N+1 N+2

         x=0                ui+1/2,R              x=L
 o  o  o  o  ...       *   *  |   *    *   *  ...  o   o   o   o
-3 -2 -1 i=0      i-2 i-1  i  |  i+1  i+2        i=N-1 N  N+1  N+2

 |    o   |  o  |  o  |       o    |    o   |     o   |
-3/2 -1 -1/2 0 1/2 1 3/2 ... N-2 N-3/2 N-1 N-1/2  N  N+1/2

-3/2 -1  -1/2
-1/2  0   1/2
N-3/2 N-1 N-1/2
N-1/2 N   N+1/2

-1,0,1,...,N-1,N (Len=N+2)
-3/2,-1/2  ,1/2  ,3/2  ,...,N-3/2,N-1/2,N+1/2 (Len=N+3)
-2+1/2,-1+1/2,0+1/2,1+1/2,...,N-2+1/2,N-1+1/2,N+1/2 (Len=N+3)
-2,-1,0,...,N-1,N(Len=N+3)


  -3/2   -1/2,  1/2,...,N-3/2  ,N-1/2  ,N+1/2
-2+1/2,-1+1/2,0+1/2,...,N-2+1/2,N-1+1/2,N+1/2
-2    ,-1    ,0    ,...,N-2    ,N-1    ,N  (Len=N+3)

a*fi-1/2+b*fi+1/2+c*fi+3/2=di
ai*fi-1+1/2+bi*fi+1/2+ci*fi+1+1/2=di
------------------------------------------
a(-1)*f(-3/2)+b(-1)*f(-1/2)+c(-1)*f(1/2)=d(-1)
a0*f-1/2+b0*f1/2+c0*f3/2=d0
a1*f1/2+b1*f3/2+c0*f5/2=d1
...
ai*fi-1+1/2+bi*fi+1/2+ci*fi+1+1/2=di
...
aN-3*fN-7/2+bN-3*fN-5/2+cN-3*fN-3/2=dN-3
aN-2*fN-5/2+bN-2*fN-3/2+cN-2*fN-1/2=dN-2
aN-1*fN-3/2+bN-1*fN-1/2+cN-1*fN+1/2=dN-1
------------------------------------------
equation(0,1,...,N-2)(nEquations=N-1)

------------------------------------------
b(-1)*f(-1/2)+c(-1)*f(1/2)=d(-1)-a(-1)*f(-3/2)
a0*f-1/2+b0*f1/2+c0*f3/2=d0
a1*f1/2+b1*f3/2+c0*f5/2=d1
...
ai*fi-1+1/2+bi*fi+1/2+ci*fi+1+1/2=di
...
aN-3*fN-7/2+bN-3*fN-5/2+cN-3*fN-3/2=dN-3
aN-2*fN-5/2+bN-2*fN-3/2+cN-2*fN-1/2=dN-2
aN-1*fN-3/2+bN-1*fN-1/2=dN-1-cN-1*fN+1/2
------------------------------------------
\[ \begin{bmatrix} b_{-1}&c_{-1}& \\ a_{0}&b_{0}&c_{0}& & \\ & \ddots&\ddots &\ddots \\ &&a_{i}&b_{i}&c_{i} \\ &&&\ddots&\ddots &\ddots \\ &&&&a_{N-2}&b_{N-2}&c_{N-2} \\ &&&&&a_{N-1}&b_{N-1} \end{bmatrix} \begin{bmatrix} {f}_{-1/2}\\ {f}_{1/2}\\ \vdots\\ {f}_{i+1/2}\\ \vdots\\ {f}_{N-3/2}\\ {f}_{N-1/2}\\ \end{bmatrix} =\begin{bmatrix} {d}_{-1}-{a}_{-1}{f}_{-3/2}\\ {d}_{0}\\ \vdots\\ {d}_{i}\\ \vdots\\ {d}_{N-2}\\ {d}_{N-1}-{c}_{N-1}{f}_{N+1/2}\\ \end{bmatrix} \]
\[ \begin{array}{l} a_{i}=\cfrac{2}{3}\omega^{L}_{1}+\cfrac{1}{3}\omega^{L}_{2}\\ b_{i}=\cfrac{1}{3}\omega^{L}_{1}+\cfrac{2}{3}(\omega^{L}_{2}+\omega^{L}_{3})\\ c_{i}=\cfrac{1}{3}\omega^{L}_{3}\\ d_{i}=\cfrac{\omega^{L}_{1}}{6}{u}_{i-1} +\cfrac{5(\omega^{L}_{1}+\omega^{L}_{2})+\omega^{L}_{3}}{6}{u}_{i} +\cfrac{\omega^{L}_{2}+5\omega^{L}_{3}}{6}{u}_{i+1} \end{array} \]
\[ \underbrace{\overset{\otimes}{-3},\overset{\otimes}{-2}, \overset{\otimes}{-1}}_{\text{ghost points}} \underbrace{\overset{|}{-1/2}}_{\text{face}} \underbrace{\overset{\otimes}{0}}_{\text{bc}} \underbrace{\overset{|}{1/2}}_{\text{face}} \underbrace{,\overset{\otimes}{1},\overset{\otimes}{2},\cdots,\overset{\otimes}{N-2},}_{\text{inner points}} \underbrace{\overset{|}{N-3/2}}_{\text{face}} \underbrace{\overset{\otimes}{N-1}}_{\text{bc}} \underbrace{\overset{|}{N-1/2}}_{\text{face}} \underbrace{,\overset{\otimes}{N},\overset{\otimes}{N+1},\overset{\otimes}{N+2}}_{\text{ghost points}} \]
C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
         x=0                ui+1/2,L             x=L
 o  o  o  o   ...  *   *   *  |   *    *  ...     o    o   o   o
-3 -2 -1 i=0      i-2 i-1  i  |  i+1  i+2       i=N-1  N  N+1 N+2

         x=0                ui+1/2,R              x=L
 o  o  o  o  ...       *   *  |   *    *   *  ...  o   o   o   o
-3 -2 -1 i=0      i-2 i-1  i  |  i+1  i+2        i=N-1 N  N+1  N+2

ui-1/2,R=List(i-2,i-1,i,i+1,i+2        )
ui+1/2,R=List(    i-1,i,i+1,i+2,i+3    )
ui+3/2,R=List(        i,i+1,i+2,i+3,i+4)
a(i)*ui-1/2,R+b(i)*ui+1/2,R+c(i)*ui+3/2,R=d(i)
d(i)=b1*u(i-1)+b2*u(i)+b3*u(i+1)

coef L

\[ \begin{array}{l} \beta_{0}=\cfrac{13}{12}(u_{i-2}-2u_{i-1}+u_{i})^2+\cfrac{1}{4}(u_{i-2}-4u_{i-1}+3u_{i})^2\\ \beta_{1}=\cfrac{13}{12}(u_{i-1}-2u_{i}+u_{i+1})^2+\cfrac{1}{4}(u_{i-1}-u_{i+1})^2\\ \beta_{2}=\cfrac{13}{12}(u_{i}-2u_{i+1}+u_{i+2})^2+\cfrac{1}{4}(3u_{i}-4u_{i+1}+u_{i+2})^2 \end{array} \]
\[ \begin{array}{l} (v_{1},v_{2},v_{3},v_{4},v_{5})=(u_{i-2},u_{i-1},u_{i},u_{i+1},u_{i+2})\\ \beta_{0}=\cfrac{13}{12}(v_{1}-2v_{2}+v_{3})^2+\cfrac{1}{4}(v_{1}-4v_{2}+3v_{3})^2\\ \beta_{1}=\cfrac{13}{12}(v_{2}-2v_{3}+v_{4})^2+\cfrac{1}{4}(v_{2}-v_{4})^2\\ \beta_{2}=\cfrac{13}{12}(v_{3}-2v_{4}+v_{5})^2+\cfrac{1}{4}(3v_{3}-4v_{4}+v_{5})^2 \end{array} \]

coef R

\[ \begin{array}{l} \beta_{0}=\cfrac{13}{12}(u_{i-1}-2u_{i}+u_{i+1})^2+\cfrac{1}{4}(u_{i-1}-4u_{i}+3u_{i+1})^2\\ \beta_{1}=\cfrac{13}{12}(u_{i}-2u_{i+1}+u_{i+2})^2+\cfrac{1}{4}(u_{i}-u_{i+2})^2\\ \beta_{2}=\cfrac{13}{12}(u_{i+1}-2u_{i+2}+u_{i+3})^2+\cfrac{1}{4}(3u_{i+1}-4u_{i+2}+u_{i+3})^2 \end{array} \]
\[ \begin{array}{l} (v_{1},v_{2},v_{3},v_{4},v_{5})=(u_{i-1},u_{i},u_{i+1},u_{i+2},u_{i+3})\\ \beta_{0}=\cfrac{13}{12}(v_{1}-2v_{2}+v_{3})^2+\cfrac{1}{4}(v_{1}-4v_{2}+3v_{3})^2\\ \beta_{1}=\cfrac{13}{12}(v_{2}-2v_{3}+v_{4})^2+\cfrac{1}{4}(v_{2}-v_{4})^2\\ \beta_{2}=\cfrac{13}{12}(v_{3}-2v_{4}+v_{5})^2+\cfrac{1}{4}(3v_{3}-4v_{4}+v_{5})^2 \end{array} \]
\[ \begin{array}{l} \alpha_{k}=\cfrac{d_{k}^{L}}{(\beta_{k}+\epsilon )^2},\quad k=0,1,2\\ \omega_{k}^{L}=\cfrac{\alpha_{k}}{\alpha_{0}+\alpha_{1}+\alpha_{2}},\quad k=0,1,2\\ \end{array} \]
\[ \begin{array}{l} \alpha_{k}=\cfrac{d_{k}^{R}}{(\beta_{k}+\epsilon )^2},\quad k=0,1,2\\ \omega_{k}^{R}=\cfrac{\alpha_{k}}{\alpha_{0}+\alpha_{1}+\alpha_{2}},\quad k=0,1,2\\ \end{array} \]
C++
1
2
3
4
5
6
7
         x=0                    ui+1/2,L                 x=L
 o  o  o  o  o  o ...  *   *   *  |   *    *       ...    o    o   o   o
-3 -2 -1 i=0 1  2     i-2 i-1  i  |  i+1  i+2 i+3       i=N-1  N  N+1 N+2

         x=0                    ui+1/2,R                 x=L
 o  o  o  o  o  o ...      *   *  |   *    *    *  ...    o    o   o   o
-3 -2 -1 i=0 1  2     i-2 i-1  i  |  i+1  i+2  i+3      i=N-1  N  N+1 N+2
\[ \begin{array}{l} u_{i+\frac{1}{2},L}^{(0)}=\frac{1}{3}\bar{u}_{i-2}-\frac{7}{6}\bar{u}_{i-1}+\frac{11}{6}\bar{u}_{i}\\ u_{i+\frac{1}{2},L}^{(1)}=-\frac{1}{6}\bar{u}_{i-1}+\frac{5}{6}\bar{u}_{i}+\frac{1}{3}\bar{u}_{i+1}\\ u_{i+\frac{1}{2},L}^{(2)}=\frac{1}{3}\bar{u}_{i}+\frac{5}{6}\bar{u}_{i+1}-\frac{1}{6}\bar{u}_{i+2}\\ u_{i+\frac{1}{2}}^{L}=\omega_{0}^{L}u_{i+\frac{1}{2},L}^{(0)}+ \omega_{1}^{L}u_{i+\frac{1}{2},L}^{(1)}+\omega_{2}^{L}u_{i+\frac{1}{2},L}^{(2)} \end{array} \]
\[ \begin{array}{l} u_{i+\frac{1}{2},R}^{(0)}=\frac{1}{3}\bar{u}_{i+1}+\frac{5}{6}\bar{u}_{i}-\frac{1}{6}\bar{u}_{i-1}\\ u_{i+\frac{1}{2},R}^{(1)}=-\frac{1}{6}\bar{u}_{i+2}+\frac{5}{6}\bar{u}_{i+1}+\frac{1}{3}\bar{u}_{i}\\ u_{i+\frac{1}{2},R}^{(2)}=\frac{1}{3}\bar{u}_{i+3}-\frac{7}{6}\bar{u}_{i+2}+\frac{11}{6}\bar{u}_{i+1}\\ u_{i+\frac{1}{2}}^{R}=\omega_{0}^{R}u_{i+\frac{1}{2},R}^{(0)}+ \omega_{1}^{R}u_{i+\frac{1}{2},R}^{(1)}+\omega_{2}^{R}u_{i+\frac{1}{2},R}^{(2)} \end{array} \]
\[ \begin{array}{l} (\cfrac{2}{3}\omega^{L}_{1}+\cfrac{1}{3}\omega^{L}_{2}){u}^{L}_{i-1/2} +\left[\cfrac{1}{3}\omega^{L}_{1}+\cfrac{2}{3}(\omega^{L}_{2}+\omega^{L}_{3})\right]{u}^{L}_{i+1/2} +\cfrac{1}{3}\omega^{L}_{3}{u}^{L}_{i+3/2}\\ =\cfrac{\omega^{L}_{1}}{6}{u}_{i-1} +\cfrac{5(\omega^{L}_{1}+\omega^{L}_{2})+\omega^{L}_{3}}{6}{u}_{i} +\cfrac{\omega^{L}_{2}+5\omega^{L}_{3}}{6}{u}_{i+1} \end{array} \]

???

\[ \begin{array}{l} \cfrac{1}{3}\omega^{R}_{1}{u}^{R}_{i-1/2} +\left[\cfrac{1}{3}\omega^{R}_{3}+\cfrac{2}{3}(\omega^{R}_{2}+\omega^{R}_{1})\right]{u}^{R}_{i+1/2} +(\cfrac{2}{3}\omega^{R}_{3}+\cfrac{1}{3}\omega^{R}_{2}){u}^{R}_{i+3/2}\\ =\cfrac{\omega^{R}_{2}+5\omega^{R}_{1}}{6}{u}_{i-1} +\cfrac{5(\omega^{R}_{3}+\omega^{R}_{2})+\omega^{R}_{1}}{6}{u}_{i} +\cfrac{\omega^{R}_{3}}{6}{u}_{i+1} \end{array} \]

guess?

\[ \begin{array}{l} \cfrac{1}{3}\omega^{R}_{1}{u}^{R}_{i-1/2} +\left[\cfrac{1}{3}\omega^{R}_{3}+\cfrac{2}{3}(\omega^{R}_{2}+\omega^{R}_{1})\right]{u}^{R}_{i+1/2} +(\cfrac{2}{3}\omega^{R}_{3}+\cfrac{1}{3}\omega^{R}_{2}){u}^{R}_{i+3/2}\\ =\cfrac{\omega^{R}_{2}+5\omega^{R}_{1}}{6}{u}_{i} +\cfrac{5(\omega^{R}_{3}+\omega^{R}_{2})+\omega^{R}_{1}}{6}{u}_{i+1} +\cfrac{\omega^{R}_{3}}{6}{u}_{i+2} \end{array} \]

Only Calc InnerPoint

\[ \begin{array}{l} a_{i}u_{i-\frac{1}{2}}^{L}+b_{i}u_{i+\frac{1}{2}}^{L}+c_{i}u_{i+\frac{3}{2}}^{L}=d_{i}=List(i-2,i-1,i,i+1,i+2)\\ a_{0}u_{-\frac{1}{2}}^{L}+b_{0}u_{\frac{1}{2}}^{L}+c_{0}u_{\frac{3}{2}}^{L}=d_{0}=List(-2,-1,0,1,2)\\ \cdots \\ a_{N-2}u_{N-\frac{5}{2}}^{L}+b_{N-2}u_{N-\frac{3}{2}}^{L}+c_{N-2}u_{N-\frac{1}{2}}^{L}=d_{N-2}\\ =List(N-4,N-3,N-2,N-1,N)\\ nEqu=Len(0,1,...,N-2)=N-1 \end{array} \]

???

\[ \begin{array}{l} a_{i}u_{i-\frac{1}{2}}^{R}+b_{i}u_{i+\frac{1}{2}}^{R}+c_{i}u_{i+\frac{3}{2}}^{R}=d_{i}=List(i-1,i,i+1,i+2,i+3)\\ a_{0}u_{-\frac{1}{2}}^{R}+b_{0}u_{\frac{1}{2}}^{R}+c_{0}u_{\frac{3}{2}}^{R}=d_{0}=List(-1,0,1,2,3)\\ \cdots \\ a_{N-2}u_{N-\frac{5}{2}}^{R}+b_{N-2}u_{N-\frac{3}{2}}^{R}+c_{N-2}u_{N-\frac{1}{2}}^{R}=d_{N-2}\\ =List(N-3,N-2,N-1,N,N+1)\\ nEqu=Len(0,1,...,N-2)=N-1 \end{array} \]

guess

\[ \begin{array}{l} a_{i}u_{i-\frac{1}{2}}^{R}+b_{i}u_{i+\frac{1}{2}}^{R}+c_{i}u_{i+\frac{3}{2}}^{R}=d_{i+1}=List(i,i+1,i+2)\\ a_{0}u_{-\frac{1}{2}}^{R}+b_{0}u_{\frac{1}{2}}^{R}+c_{0}u_{\frac{3}{2}}^{R}=d_{1}\\ a_{1}u_{\frac{1}{2}}^{R}+b_{1}u_{\frac{3}{2}}^{R}+c_{1}u_{\frac{5}{2}}^{R}=d_{2}\\ \cdots \\ a_{N-2}u_{N-\frac{5}{2}}^{R}+b_{N-2}u_{N-\frac{3}{2}}^{R}+c_{N-2}u_{N-\frac{1}{2}}^{R}=d_{N-1}\\ nEqu=Len(0,1,...,N-2)=N-1 \end{array} \]

Calc Boundary Point

\[ \begin{array}{l} a_{i}u_{i-\frac{1}{2}}^{L}+b_{i}u_{i+\frac{1}{2}}^{L}+c_{i}u_{i+\frac{3}{2}}^{L}=d_{i}=List(i-2,i-1,i,i+1,i+2)\\ a_{-1}u_{-\frac{3}{2}}^{L}+b_{-1}u_{-\frac{1}{2}}^{L}+c_{-1}u_{\frac{1}{2}}^{L}=d_{-1}=List(-3,-2,-1,0,1)\\ a_{0}u_{-\frac{1}{2}}^{L}+b_{0}u_{\frac{1}{2}}^{L}+c_{0}u_{\frac{3}{2}}^{L}=d_{0}\\ \cdots \\ a_{N-1}u_{N-\frac{3}{2}}^{L}+b_{N-1}u_{N-\frac{1}{2}}^{L}+c_{N-1}u_{N+\frac{1}{2}}^{L}=d_{N-1}\\ =List(N-3,N-2,N-1,N,N+1)\\ nEqu=Len(-1,0,1,...,N-1)=N+1 \end{array} \]

???

\[ \begin{array}{l} a_{i}u_{i-\frac{1}{2}}^{R}+b_{i}u_{i+\frac{1}{2}}^{R}+c_{i}u_{i+\frac{3}{2}}^{R}=d_{i}=List(i-1,i,i+1,i+2,i+3)\\ a_{-1}u_{-\frac{3}{2}}^{R}+b_{-1}u_{-\frac{1}{2}}^{R}+c_{-1}u_{\frac{1}{2}}^{R}=d_{-1}=List(-2,-1,0,1,2)\\ a_{0}u_{-\frac{1}{2}}^{R}+b_{0}u_{\frac{1}{2}}^{R}+c_{0}u_{\frac{3}{2}}^{R}=d_{0}\\ \cdots \\ a_{N-1}u_{N-\frac{3}{2}}^{R}+b_{N-1}u_{N-\frac{1}{2}}^{R}+c_{N-1}u_{N+\frac{1}{2}}^{R}=d_{N-1}\\ =List(N-2,N-1,N,N+1,N+2)\\ nEqu=Len(-1,0,1,...,N-1)=N+1 \end{array} \]

guess

\[ \begin{array}{l} a_{i}u_{i-\frac{1}{2}}^{R}+b_{i}u_{i+\frac{1}{2}}^{R}+c_{i}u_{i+\frac{3}{2}}^{R}=d_{i+1}=List(i,i+1,i+2)\\ a_{-1}u_{-\frac{3}{2}}^{R}+b_{-1}u_{-\frac{1}{2}}^{R}+c_{-1}u_{\frac{1}{2}}^{R}=d_{0}\\ a_{0}u_{-\frac{1}{2}}^{R}+b_{0}u_{\frac{1}{2}}^{R}+c_{0}u_{\frac{3}{2}}^{R}=d_{1}\\ a_{1}u_{\frac{1}{2}}^{R}+b_{1}u_{\frac{3}{2}}^{R}+c_{1}u_{\frac{5}{2}}^{R}=d_{2}\\ \cdots \\ a_{N-2}u_{N-\frac{5}{2}}^{R}+b_{N-2}u_{N-\frac{3}{2}}^{R}+c_{N-2}u_{N-\frac{1}{2}}^{R}=d_{N-1}\\ a_{N-1}u_{N-\frac{3}{2}}^{R}+b_{N-1}u_{N-\frac{1}{2}}^{R}+c_{N-1}u_{N+\frac{1}{2}}^{R}=d_{N}\\ nEqu=Len(-1,0,1,...,N-2,N-1)=N+1 \end{array} \]

1D Euler equation solver written in Python

Note that the Godunov Riemann solver is rewritten from this repository: ToroExact. Other approximate Riemann solvers mainly refers to Toro's book: Riemann Solvers a n d Numerical Methods for Fluid Dynamics and this MATLAB code: Approximate Riemann Solvers.

1D Euler Equations - Lax Shock Tube

Approximate Riemann Solvers

Shu-Osher Shock Tube

AEROFLO Sample Problems

Applied & Computational Methods