@@ -46,19 +46,24 @@ fig_path = normpath(@__DIR__, "..", "docs", "src", "figures")
46
46
47
47
# Test the cell densities
48
48
cell_densities_sol = cell_densities .(sol. u)
49
- node_densities_sol = node_densities .(sol. u)
49
+ node_densities_sol_nonsmooth = node_densities .(sol. u; smooth_boundary= false )
50
+ node_densities_sol_smooth = node_densities .(sol. u; smooth_boundary= true )
50
51
for i in eachindex (sol)
51
52
r = sol. u[i]
52
53
q = cell_densities_sol[i]
53
- nq = node_densities_sol[i]
54
+ nq_ns = node_densities_sol_nonsmooth[i]
55
+ nq_s = node_densities_sol_smooth[i]
54
56
for j in eachindex (r)
55
57
if j == firstindex (r)
56
- @test nq[j] ≈ 1 / (r[j+ 1 ] - r[j])
58
+ @test nq_ns[j] ≈ 1 / (r[j+ 1 ] - r[j])
59
+ @test nq_s[j] ≈ LinearInterpolation ([1 / (r[2 ] - r[1 ]), 2 / (r[3 ] - r[1 ])], [(r[1 ] + r[2 ]) / 2 , r[2 ]])(r[1 ])
57
60
@test q[j] ≈ 1 / (r[j+ 1 ] - r[j])
58
61
elseif j == lastindex (r)
59
- @test nq[j] ≈ 1 / (r[j] - r[j- 1 ])
62
+ @test nq_ns[j] ≈ 1 / (r[j] - r[j- 1 ])
63
+ @test nq_s[j] ≈ LinearInterpolation ([2 / (r[end ] - r[end - 2 ]), 1 / (r[end ] - r[end - 1 ])], [r[end - 1 ], (r[end - 1 ] + r[end ]) / 2 ])(r[end ])
60
64
else
61
- @test nq[j] ≈ 2 / (r[j+ 1 ] - r[j- 1 ])
65
+ @test nq_ns[j] ≈ 2 / (r[j+ 1 ] - r[j- 1 ])
66
+ @test nq_s[j] ≈ 2 / (r[j+ 1 ] - r[j- 1 ])
62
67
@test q[j] ≈ 1 / (r[j+ 1 ] - r[j])
63
68
end
64
69
end
@@ -70,7 +75,7 @@ fig_path = normpath(@__DIR__, "..", "docs", "src", "figures")
70
75
colors = (:red , :blue , :darkgreen , :black , :orange , :magenta , :cyan , :yellow , :brown , :gray , :lightblue )
71
76
ax = Axis (fig[1 , 1 ], xlabel= L " x" , ylabel= L " q(x, t)" ,
72
77
width= 600 , height= 300 )
73
- [lines! (ax, sol. u[i], node_densities_sol [i], color= colors[i], linewidth= 2 ) for i in eachindex (sol)]
78
+ [lines! (ax, sol. u[i], node_densities_sol_smooth [i], color= colors[i], linewidth= 2 ) for i in eachindex (sol)]
74
79
[lines! (ax, x, fvm_sol. u[i], color= colors[i], linewidth= 4 , linestyle= :dashdot ) for i in eachindex (sol)]
75
80
resize_to_layout! (fig)
76
81
fig_path = normpath (@__DIR__ , " .." , " docs" , " src" , " figures" )
@@ -115,19 +120,24 @@ end
115
120
116
121
# Test the cell densities
117
122
cell_densities_sol = cell_densities .(sol. u)
118
- node_densities_sol = node_densities .(sol. u)
123
+ node_densities_sol_nonsmooth = node_densities .(sol. u; smooth_boundary= false )
124
+ node_densities_sol_smooth = node_densities .(sol. u; smooth_boundary= true )
119
125
for i in eachindex (sol)
120
126
r = sol. u[i]
121
127
q = cell_densities_sol[i]
122
- nq = node_densities_sol[i]
128
+ nq_ns = node_densities_sol_nonsmooth[i]
129
+ nq_s = node_densities_sol_smooth[i]
123
130
for j in eachindex (r)
124
131
if j == firstindex (r)
125
- @test nq[j] ≈ 1 / (r[j+ 1 ] - r[j])
132
+ @test nq_ns[j] ≈ 1 / (r[j+ 1 ] - r[j])
133
+ @test nq_s[j] ≈ LinearInterpolation ([1 / (r[2 ] - r[1 ]), 2 / (r[3 ] - r[1 ])], [(r[1 ] + r[2 ]) / 2 , r[2 ]])(r[1 ])
126
134
@test q[j] ≈ 1 / (r[j+ 1 ] - r[j])
127
135
elseif j == lastindex (r)
128
- @test nq[j] ≈ 1 / (r[j] - r[j- 1 ])
136
+ @test nq_ns[j] ≈ 1 / (r[j] - r[j- 1 ])
137
+ @test nq_s[j] ≈ LinearInterpolation ([2 / (r[end ] - r[end - 2 ]), 1 / (r[end ] - r[end - 1 ])], [r[end - 1 ], (r[end - 1 ] + r[end ]) / 2 ])(r[end ])
129
138
else
130
- @test nq[j] ≈ 2 / (r[j+ 1 ] - r[j- 1 ])
139
+ @test nq_ns[j] ≈ 2 / (r[j+ 1 ] - r[j- 1 ])
140
+ @test nq_s[j] ≈ 2 / (r[j+ 1 ] - r[j- 1 ])
131
141
@test q[j] ≈ 1 / (r[j+ 1 ] - r[j])
132
142
end
133
143
end
140
150
ax = Axis (fig[1 , 1 ], xlabel= L " x" , ylabel= L " q(x, t)" ,
141
151
title= L " (a): $q(x, t)$" , titlealign= :left ,
142
152
width= 600 , height= 300 )
143
- [lines! (ax, sol. u[i], node_densities_sol [i], color= colors[i], linewidth= 2 ) for i in eachindex (sol)]
153
+ [lines! (ax, sol. u[i], node_densities_sol_smooth [i], color= colors[i], linewidth= 2 ) for i in eachindex (sol)]
144
154
@views [lines! (ax, x .* mb_sol. u[i][end ], mb_sol. u[i][begin : (end - 1 )], color= colors[i], linewidth= 4 , linestyle= :dashdot ) for i in eachindex (sol)]
145
155
resize_to_layout! (fig)
146
156
fig_path = normpath (@__DIR__ , " .." , " docs" , " src" , " figures" )
@@ -184,26 +194,34 @@ end
184
194
fvm_prob = continuum_limit (prob, 1000 ; proliferation= true )
185
195
fvm_sol = solve (fvm_prob, TRBDF2 (linsolve= KLUFactorization ()), saveat= 0.01 )
186
196
187
- q, r, means, lowers, uppers, knots = node_densities (sol)
197
+ q_s, r, means_s, lowers_s, uppers_s, knots_s = node_densities (sol; smooth_boundary= true )
198
+ q_ns, r_ns, means_ns, lowers_ns, uppers_ns, knots_ns = node_densities (sol; smooth_boundary= false )
199
+ @test r == r_ns
188
200
@inferred node_densities (sol)
189
201
N, N_means, N_lowers, N_uppers = cell_numbers (sol)
190
202
@inferred cell_numbers (sol)
191
203
pde_N = map (eachindex (fvm_sol)) do i
192
204
integrate_pde (fvm_sol, i)
193
205
end
194
- @test all (≈ (LinRange (0 , 30 , 500 )), knots)
206
+ @test all (≈ (LinRange (0 , 30 , 500 )), knots_s)
207
+ @test all (≈ (LinRange (0 , 30 , 500 )), knots_ns)
208
+ @test knots_s == knots_ns
209
+ knots = knots_s
195
210
196
211
# Test the statistics
197
212
for k in rand (1 : length (sol), 20 )
198
213
for j in rand (1 : length (sol[k]), 40 )
199
214
for i in rand (1 : length (sol[k][j]), 60 )
200
215
if i == 1
201
- @test q[k][j][1 ] ≈ 1 / (r[k][j][2 ] - r[k][j][1 ])
216
+ @test q_ns[k][j][1 ] ≈ 1 / (r[k][j][2 ] - r[k][j][1 ])
217
+ @test q_s[k][j][1 ] ≈ LinearInterpolation ([1 / (r[k][j][2 ] - r[k][j][1 ]), 2 / (r[k][j][3 ] - r[k][j][1 ])], [(r[k][j][1 ] + r[k][j][2 ]) / 2 , r[k][j][2 ]])(r[k][j][1 ])
202
218
elseif i == length (sol[k][j])
203
219
n = length (sol[k][j])
204
- @test q[k][j][n] ≈ 1 / (r[k][j][n] - r[k][j][n- 1 ])
220
+ @test q_ns[k][j][n] ≈ 1 / (r[k][j][n] - r[k][j][n- 1 ])
221
+ @test q_s[k][j][n] ≈ LinearInterpolation ([2 / (r[k][j][end ] - r[k][j][end - 2 ]), 1 / (r[k][j][end ] - r[k][j][end - 1 ])], [r[k][j][end - 1 ], (r[k][j][end - 1 ] + r[k][j][end ]) / 2 ])(r[k][j][end ])
205
222
else
206
- @test q[k][j][i] ≈ 2 / (r[k][j][i+ 1 ] - r[k][j][i- 1 ])
223
+ @test q_ns[k][j][i] ≈ 2 / (r[k][j][i+ 1 ] - r[k][j][i- 1 ])
224
+ @test q_s[k][j][i] ≈ 2 / (r[k][j][i+ 1 ] - r[k][j][i- 1 ])
207
225
end
208
226
@test r[k][j][i] == sol[k][j][i]
209
227
end
@@ -220,10 +238,14 @@ end
220
238
0.0 , 30.0
221
239
)
222
240
for i in rand (1 : length (knots[j]), 50 )
223
- all_q = [LinearInterpolation (q[k][j], r[k][j])(knots[j][i]) for k in eachindex (sol)]
224
- @test mean (all_q) ≈ means[j][i]
225
- @test quantile (all_q, 0.025 ) ≈ lowers[j][i]
226
- @test quantile (all_q, 0.975 ) ≈ uppers[j][i]
241
+ all_q = [LinearInterpolation (q_s[k][j], r[k][j])(knots[j][i]) for k in eachindex (sol)]
242
+ @test mean (all_q) ≈ means_s[j][i]
243
+ @test quantile (all_q, 0.025 ) ≈ lowers_s[j][i]
244
+ @test quantile (all_q, 0.975 ) ≈ uppers_s[j][i]
245
+ all_q = [LinearInterpolation (q_ns[k][j], r[k][j])(knots[j][i]) for k in eachindex (sol)]
246
+ @test mean (all_q) ≈ means_ns[j][i]
247
+ @test quantile (all_q, 0.025 ) ≈ lowers_ns[j][i]
248
+ @test quantile (all_q, 0.975 ) ≈ uppers_ns[j][i]
227
249
end
228
250
end
229
251
236
258
ax = Axis (fig[1 , 1 ], xlabel= L " x" , ylabel= L " q(x, t)" ,
237
259
title= L " (a): $q(x, t)$" , titlealign= :left ,
238
260
width= 600 , height= 300 )
239
- [band! (ax, knots[i], lowers [i], uppers [i], color= (colors[j], 0.3 )) for (j, i) in enumerate (plot_idx)]
240
- [lines! (ax, knots[i], means [i], color= colors[j], linewidth= 2 ) for (j, i) in enumerate (plot_idx)]
261
+ [band! (ax, knots[i], lowers_s [i], uppers_s [i], color= (colors[j], 0.3 )) for (j, i) in enumerate (plot_idx)]
262
+ [lines! (ax, knots[i], means_s [i], color= colors[j], linewidth= 2 ) for (j, i) in enumerate (plot_idx)]
241
263
[lines! (ax, fvm_prob. geometry. mesh_points, fvm_sol. u[i], color= colors[j], linewidth= 4 , linestyle= :dashdot ) for (j, i) in enumerate (plot_idx)]
242
264
243
265
ax = Axis (fig[1 , 2 ], xlabel= L " t" , ylabel= L " N(t)" ,
@@ -262,10 +284,10 @@ end
262
284
for j in rand (1 : length (sol[k]), 40 )
263
285
for i in rand (1 : length (sol[k][j]), 60 )
264
286
if i == 1
265
- @test q[enum_k][j][1 ] ≈ 1 / (r[enum_k][j][2 ] - r[enum_k][j][1 ])
287
+ @test q[enum_k][j][1 ] ≈ LinearInterpolation ([ 1 / (r[enum_k][j][2 ] - r[enum_k][j][ 1 ]), 2 / (r[enum_k][j][ 3 ] - r[enum_k][j][ 1 ])], [(r[enum_k][j][ 1 ] + r[enum_k][j][ 2 ]) / 2 , r[enum_k][j][ 2 ]])( r[enum_k][j][1 ])
266
288
elseif i == length (sol[k][j])
267
289
n = length (sol[k][j])
268
- @test q[enum_k][j][n] ≈ 1 / (r[enum_k][j][n ] - r[enum_k][j][n - 1 ])
290
+ @test q[enum_k][j][n] ≈ LinearInterpolation ([ 2 / (r[enum_k][j][ end ] - r[enum_k][j][ end - 2 ]), 1 / (r[enum_k][j][end ] - r[enum_k][j][end - 1 ])], [r[enum_k][j][ end - 1 ], (r[enum_k][j][ end - 1 ] + r[enum_k][j][ end ]) / 2 ])(r[enum_k][j][ end ])
269
291
else
270
292
@test q[enum_k][j][i] ≈ 2 / (r[enum_k][j][i+ 1 ] - r[enum_k][j][i- 1 ])
271
293
end
@@ -300,10 +322,10 @@ end
300
322
for j in rand (1 : length (sol[k]), 40 )
301
323
for i in rand (1 : length (sol[k][j]), 60 )
302
324
if i == 1
303
- @test q[enum_k][j][1 ] ≈ 1 / (r[enum_k][j][2 ] - r[enum_k][j][1 ])
325
+ @test q[enum_k][j][1 ] ≈ LinearInterpolation ([ 1 / (r[enum_k][j][2 ] - r[enum_k][j][ 1 ]), 2 / (r[enum_k][j][ 3 ] - r[enum_k][j][ 1 ])], [(r[enum_k][j][ 1 ] + r[enum_k][j][ 2 ]) / 2 , r[enum_k][j][ 2 ]])( r[enum_k][j][1 ])
304
326
elseif i == length (sol[k][j])
305
327
n = length (sol[k][j])
306
- @test q[enum_k][j][n] ≈ 1 / (r[enum_k][j][n ] - r[enum_k][j][n - 1 ])
328
+ @test q[enum_k][j][n] ≈ LinearInterpolation ([ 2 / (r[enum_k][j][ end ] - r[enum_k][j][ end - 2 ]), 1 / (r[enum_k][j][end ] - r[enum_k][j][end - 1 ])], [r[enum_k][j][ end - 1 ], (r[enum_k][j][ end - 1 ] + r[enum_k][j][ end ]) / 2 ])(r[enum_k][j][ end ])
307
329
else
308
330
@test q[enum_k][j][i] ≈ 2 / (r[enum_k][j][i+ 1 ] - r[enum_k][j][i- 1 ])
309
331
end
322
344
323
345
# Using average leading edge
324
346
_indices = rand (eachindex (sol), 40 )
325
- q, r, means, lowers, uppers, knots = node_densities (sol; indices= _indices, use_extrema= false )
347
+ q, r, means, lowers, uppers, knots = node_densities (sol; indices= _indices, use_extrema= false , smooth_boundary = false )
326
348
@inferred node_densities (sol; indices= _indices, use_extrema= false )
327
349
@test all (≈ (LinRange (0 , 30 , 500 )), knots)
328
350
for (enum_k, k) in enumerate (_indices)
378
400
mb_prob = continuum_limit (prob, 1000 ; proliferation= true )
379
401
mb_sol = solve (mb_prob, TRBDF2 (linsolve= KLUFactorization ()), saveat= 0.01 )
380
402
381
- q, r, means, lowers, uppers, knots = node_densities (sol)
403
+ q, r, means, lowers, uppers, knots = node_densities (sol; smooth_boundary = true )
382
404
@inferred node_densities (sol)
383
405
N, N_means, N_lowers, N_uppers = cell_numbers (sol)
384
406
@inferred cell_numbers (sol)
@@ -404,10 +426,10 @@ end
404
426
for j in rand (1 : length (sol[k]), 40 )
405
427
for i in rand (1 : length (sol[k][j]), 60 )
406
428
if i == 1
407
- @test q[k][j][1 ] ≈ 1 / (r[k][j][2 ] - r[k][j][1 ])
429
+ @test q[k][j][1 ] ≈ LinearInterpolation ([ 1 / (r[k][j][2 ] - r[k][j][ 1 ]), 2 / (r[k][j][ 3 ] - r[k][j][ 1 ])], [(r[k][j][ 1 ] + r[k][j][ 2 ]) / 2 , r[k][j][ 2 ]])( r[k][j][1 ])
408
430
elseif i == length (sol[k][j])
409
431
n = length (sol[k][j])
410
- @test q[k][j][n] ≈ 1 / (r[k][j][n ] - r[k][j][n - 1 ])
432
+ @test q[k][j][n] ≈ LinearInterpolation ([ 2 / (r[k][j][ end ] - r[k][j][ end - 2 ]), 1 / (r[k][j][end ] - r[k][j][end - 1 ])], [r[k][j][ end - 1 ], (r[k][j][ end - 1 ] + r[k][j][ end ]) / 2 ])(r[k][j][ end ])
411
433
else
412
434
@test q[k][j][i] ≈ 2 / (r[k][j][i+ 1 ] - r[k][j][i- 1 ])
413
435
end
469
491
470
492
# Test the statistics when restricting to a specific set of simulation indices
471
493
_indices = rand (eachindex (sol), 20 )
472
- q, r, means, lowers, uppers, knots = node_densities (sol; indices= _indices)
494
+ q, r, means, lowers, uppers, knots = node_densities (sol; indices= _indices, smooth_boundary = false )
473
495
@inferred node_densities (sol; indices= _indices)
474
496
N, N_means, N_lowers, N_uppers = cell_numbers (sol; indices= _indices)
475
497
@inferred cell_numbers (sol; indices= _indices)
@@ -534,10 +556,10 @@ end
534
556
for j in rand (1 : length (sol[k]), 40 )
535
557
for i in rand (1 : length (sol[k][j]), 60 )
536
558
if i == 1
537
- @test q[enum_k][j][1 ] ≈ 1 / (r[enum_k][j][2 ] - r[enum_k][j][1 ])
559
+ @test q[enum_k][j][1 ] ≈ LinearInterpolation ([ 1 / (r[enum_k][j][2 ] - r[enum_k][j][ 1 ]), 2 / (r[enum_k][j][ 3 ] - r[enum_k][j][ 1 ])], [(r[enum_k][j][ 1 ] + r[enum_k][j][ 2 ]) / 2 , r[enum_k][j][ 2 ]])( r[enum_k][j][1 ])
538
560
elseif i == length (sol[k][j])
539
561
n = length (sol[k][j])
540
- @test q[enum_k][j][n] ≈ 1 / (r[enum_k][j][n ] - r[enum_k][j][n - 1 ])
562
+ @test q[enum_k][j][n] ≈ LinearInterpolation ([ 2 / (r[enum_k][j][ end ] - r[enum_k][j][ end - 2 ]), 1 / (r[enum_k][j][end ] - r[enum_k][j][end - 1 ])], [r[enum_k][j][ end - 1 ], (r[enum_k][j][ end - 1 ] + r[enum_k][j][ end ]) / 2 ])(r[enum_k][j][ end ])
541
563
else
542
564
@test q[enum_k][j][i] ≈ 2 / (r[enum_k][j][i+ 1 ] - r[enum_k][j][i- 1 ])
543
565
end
@@ -572,10 +594,10 @@ end
572
594
for j in rand (1 : length (sol[k]), 40 )
573
595
for i in 1 : length (sol[k][j])
574
596
if i == 1
575
- @test q[enum_k][j][1 ] ≈ 1 / (r[enum_k][j][2 ] - r[enum_k][j][1 ])
597
+ @test q[enum_k][j][1 ] ≈ LinearInterpolation ([ 1 / (r[enum_k][j][2 ] - r[enum_k][j][ 1 ]), 2 / (r[enum_k][j][ 3 ] - r[enum_k][j][ 1 ])], [(r[enum_k][j][ 1 ] + r[enum_k][j][ 2 ]) / 2 , r[enum_k][j][ 2 ]])( r[enum_k][j][1 ])
576
598
elseif i == length (sol[k][j])
577
599
n = length (sol[k][j])
578
- @test q[enum_k][j][n] ≈ 1 / (r[enum_k][j][n ] - r[enum_k][j][n - 1 ])
600
+ @test q[enum_k][j][n] ≈ LinearInterpolation ([ 2 / (r[enum_k][j][ end ] - r[enum_k][j][ end - 2 ]), 1 / (r[enum_k][j][end ] - r[enum_k][j][end - 1 ])], [r[enum_k][j][ end - 1 ], (r[enum_k][j][ end - 1 ] + r[enum_k][j][ end ]) / 2 ])(r[enum_k][j][ end ])
579
601
else
580
602
@test q[enum_k][j][i] ≈ 2 / (r[enum_k][j][i+ 1 ] - r[enum_k][j][i- 1 ])
581
603
end
0 commit comments