|
33 | 33 | dx = 2π/(N-1) |
34 | 34 | x = collect(-pi : dx : pi) |
35 | 35 | u0 = @. -(x - 0.5)^2 + 1/12 |
36 | | - B = CenteredDifference(1,2,dx,N) |
| 36 | + B = CenteredDifference(1,2,dx,N-2) |
37 | 37 | deriv_start, deriv_end = (B*u0)[1], (B*u0)[end] |
38 | 38 |
|
39 | 39 | A = CenteredDifference(2,2,dx,N) |
|
53 | 53 |
|
54 | 54 | # UpwindDifference with equal no. of primay wind and offside points should behave like a CenteredDifference |
55 | 55 | A2 = UpwindDifference(2,1,dx,N,1,offside=1) |
| 56 | + B2 = UpwindDifference(1,2,dx,N-2,1,offside=1) |
| 57 | + deriv_start, deriv_end = (B2*u0)[1], (B2*u0)[end] |
| 58 | + bc = NeumannBC((deriv_start,deriv_end),dx,1) |
| 59 | + |
| 60 | + step(u,p,t) = A2*bc*u |
| 61 | + heat_eqn = ODEProblem(step, u0, (0.,10.)) |
| 62 | + soln = solve(heat_eqn,Tsit5(),dense=false,tstops=0:0.01:10) |
| 63 | + |
| 64 | + for t in 0:0.1:10 |
| 65 | + @test sum(first_order_coeffs_start .* soln(t)[1:4]) ≈ deriv_start atol=1e-1 |
| 66 | + @test sum(first_order_coeffs_end .* soln(t)[end-3:end]) ≈ deriv_end atol=1e-1 |
| 67 | + end |
| 68 | + # Testing for 2 offside points against Standard Vector input |
| 69 | + B3 = UpwindDifference(1,4,dx,N-2,-1,offside=2) |
| 70 | + deriv_start, deriv_end = (-1*B3*u0)[1], (-1*B3*u0)[end] |
| 71 | + bc = NeumannBC((deriv_start,deriv_end),dx,1) |
| 72 | + |
56 | 73 | step(u,p,t) = A2*bc*u |
57 | 74 | heat_eqn = ODEProblem(step, u0, (0.,10.)) |
58 | 75 | soln = solve(heat_eqn,Tsit5(),dense=false,tstops=0:0.01:10) |
|
68 | 85 | dx = 2π/(N-1) |
69 | 86 | x = collect(-pi : dx : pi) |
70 | 87 | u0 = @. -(x - 0.5)^2 + 1/12 |
71 | | - B = CenteredDifference(1,2,dx,N); |
| 88 | + B = CenteredDifference(1,2,dx,N-2); |
72 | 89 | deriv_start, deriv_end = (B*u0)[1], (B*u0)[end] |
73 | 90 | params = [1.0,0.5] |
74 | 91 |
|
|
92 | 109 | end |
93 | 110 |
|
94 | 111 | # UpwindDifference with equal no. of primay wind and offside points should behave like a CenteredDifference |
95 | | - A2 = UpwindDifference(2,1,dx*ones(513),N,1,offside=1); |
96 | | - B2 = UpwindDifference(1,2,dx,N,1,offside=1) |
| 112 | + A2 = UpwindDifference(2,1,dx*ones(N+1),N,1,offside=1) |
| 113 | + B2 = UpwindDifference(1,2,dx*ones(N-1),N-2,1,offside=1) |
97 | 114 | deriv_start, deriv_end = (B2*u0)[1], (B2*u0)[end] |
98 | 115 | left_RBC = params[1]*u0[1] - params[2]*deriv_start |
99 | 116 | right_RBC = params[1]*u0[end] + params[2]*deriv_end |
100 | 117 | bc = RobinBC((params[1],-params[2],left_RBC), (params[1],params[2],right_RBC),dx,1); |
101 | | - |
| 118 | + |
| 119 | + step(u,p,t) = A2*bc*u |
| 120 | + heat_eqn = ODEProblem(step, u0, (0.,10.)); |
| 121 | + soln = solve(heat_eqn,Tsit5(),dense=false,tstops=0:0.01:10); |
| 122 | + |
| 123 | + for t in 0.2:0.1:9.8 |
| 124 | + @test params[1]*soln(t)[1] - params[2]*sum(first_order_coeffs_start .* soln(t)[1:4]) ≈ left_RBC atol=1e-1 |
| 125 | + @test params[1]*soln(t)[end] + params[2]*sum(first_order_coeffs_end .* soln(t)[end-3:end]) ≈ right_RBC atol=1e-1 |
| 126 | + end |
| 127 | + # Testing for 2 offside points against Standard Vector input |
| 128 | + B3 = UpwindDifference(1,4,dx*ones(N-1),N-2,-1,offside=2) |
| 129 | + deriv_start, deriv_end = (-1*B3*u0)[1], (-1*B3*u0)[end] |
| 130 | + left_RBC = params[1]*u0[1] - params[2]*deriv_start |
| 131 | + right_RBC = params[1]*u0[end] + params[2]*deriv_end |
| 132 | + bc = RobinBC((params[1],-params[2],left_RBC), (params[1],params[2],right_RBC),dx,1); |
| 133 | + |
102 | 134 | step(u,p,t) = A2*bc*u |
103 | 135 | heat_eqn = ODEProblem(step, u0, (0.,10.)); |
104 | 136 | soln = solve(heat_eqn,Tsit5(),dense=false,tstops=0:0.01:10); |
|
0 commit comments