@@ -376,104 +376,133 @@ const MM_linear =full(Diagonal(0.5ones(4)))
376
376
(:: typeof (mm_linear))(:: Type{Val{:analytic}} ,u0,p,t) = expm (inv (MM_linear)* mm_A* t)* u0
377
377
prob_ode_mm_linear = ODEProblem (mm_linear,rand (4 ),(0.0 ,1.0 ),mass_matrix= MM_linear)
378
378
379
+ """
380
+ 2D Brusselator
381
+
382
+ ```math
383
+ \\ begin{align}
384
+ \\ frac{\\ partial u}{\\ partial t} &= 1 + u^2v - 4.4u + \\ alpha(\f rac{\\ partial^2 u}{\\ partial x^2} + \f rac{\\ partial^2 u}{\\ partial y^2}) + f(x, y, t)
385
+ \\ frac{\\ partial v}{\\ partial t} &= 3.4u - u^2v + \\ alpha(\f rac{\\ partial^2 u}{\\ partial x^2} + \f rac{\\ partial^2 u}{\\ partial y^2})
386
+ \\ end{align}
387
+ ```
388
+
389
+ where
390
+
391
+ ```math
392
+ f(x, y, t) = \\ begin{cases}
393
+ 5 & \\ quad \\ text{if } (x-0.3)^2+(y-0.6)^2 ≤ 0.1^2 \\ text{ and } t ≥ 1.1 \\\\
394
+ 0 & \\ quad \\ text{else}
395
+ \\ end{cases}
396
+ ```
397
+
398
+ and the initial conditions are
399
+
400
+ ```math
401
+ \\ begin{align}
402
+ u(x, y, 0) &= 22\\ cdot y(1-y)^{3/2} \\\\
403
+ v(x, y, 0) &= 27\\ cdot x(1-x)^{3/2}
404
+ \\ end{align}
405
+ ```
406
+
407
+ with the periodic boundary condition
408
+
409
+ ```math
410
+ \\ begin{align}
411
+ u(x+1,y,t) &= u(x,y,t) \\\\
412
+ u(x,y+1,t) &= u(x,y,t)
413
+ \\ end{align}
414
+ ```
415
+
416
+ From Hairer Norsett Wanner Solving Ordinary Differential Equations II - Stiff and Differential-Algebraic Problems Page 152
417
+ """
418
+ brusselator_f (x, y, t) = ifelse ((((x- 0.3 )^ 2 + (y- 0.6 )^ 2 ) <= 0.1 ^ 2 ) &&
419
+ (t >= 1.1 ), 5. , 0. )
420
+ function limit (a, N)
421
+ if a == N+ 1
422
+ return 1
423
+ elseif a == 0
424
+ return N
425
+ else
426
+ return a
427
+ end
428
+ end
379
429
function brusselator_2d_loop (du, u, p, t)
380
430
@inbounds begin
381
- A, B, α, dx, N = p
431
+ A, B, α, xyd, dx, N = p
382
432
α = α/ dx^ 2
383
- # Interior
384
- for i in 2 : N- 1 , j in 2 : N- 1
385
- du[i,j,1 ] = α* (u[i- 1 ,j,1 ] + u[i+ 1 ,j,1 ] + u[i,j+ 1 ,1 ] + u[i,j- 1 ,1 ] - 4 u[i,j,1 ]) +
386
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
387
- end
388
- for i in 2 : N- 1 , j in 2 : N- 1
389
- du[i,j,2 ] = α* (u[i- 1 ,j,2 ] + u[i+ 1 ,j,2 ] + u[i,j+ 1 ,2 ] + u[i,j- 1 ,2 ] - 4 u[i,j,2 ]) +
390
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
391
- end
392
-
393
- # Boundary @ edges
394
- for j in 2 : N- 1
395
- i = 1
396
- du[1 ,j,1 ] = α* (2 u[i+ 1 ,j,1 ] + u[i,j+ 1 ,1 ] + u[i,j- 1 ,1 ] - 4 u[i,j,1 ]) +
397
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
398
- end
399
- for j in 2 : N- 1
400
- i = 1
401
- du[1 ,j,2 ] = α* (2 u[i+ 1 ,j,2 ] + u[i,j+ 1 ,2 ] + u[i,j- 1 ,2 ] - 4 u[i,j,2 ]) +
402
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
403
- end
404
- for j in 2 : N- 1
405
- i = N
406
- du[end ,j,1 ] = α* (2 u[i- 1 ,j,1 ] + u[i,j+ 1 ,1 ] + u[i,j- 1 ,1 ] - 4 u[i,j,1 ]) +
407
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
408
- end
409
- for j in 2 : N- 1
410
- i = N
411
- du[end ,j,2 ] = α* (2 u[i- 1 ,j,2 ] + u[i,j+ 1 ,2 ] + u[i,j- 1 ,2 ] - 4 u[i,j,2 ]) +
412
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
413
- end
414
- for i in 2 : N- 1
415
- j = 1
416
- du[i,1 ,1 ] = α* (u[i- 1 ,j,1 ] + u[i+ 1 ,j,1 ] + 2 u[i,j+ 1 ,1 ] - 4 u[i,j,1 ]) +
417
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
418
- end
419
- for i in 2 : N- 1
420
- j = 1
421
- du[i,1 ,2 ] = α* (u[i- 1 ,j,2 ] + u[i+ 1 ,j,2 ] + 2 u[i,j+ 1 ,2 ] - 4 u[i,j,2 ]) +
422
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
423
- end
424
- for i in 2 : N- 1
425
- j = N
426
- du[i,end ,1 ] = α* (u[i- 1 ,j,1 ] + u[i+ 1 ,j,1 ] + 2 u[i,j- 1 ,1 ] - 4 u[i,j,1 ]) +
427
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
433
+ for I in CartesianRange ((N, N))
434
+ x = xyd[I[1 ]]
435
+ y = xyd[I[2 ]]
436
+ i = I[1 ]
437
+ j = I[2 ]
438
+ ip1 = limit (i+ 1 , N)
439
+ im1 = limit (i- 1 , N)
440
+ jp1 = limit (j+ 1 , N)
441
+ jm1 = limit (j- 1 , N)
442
+ du[i,j,1 ] = α* (u[im1,j,1 ] + u[ip1,j,1 ] + u[i,jp1,1 ] + u[i,jm1,1 ] - 4 u[i,j,1 ]) +
443
+ B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ] + brusselator_f (x, y, t)
428
444
end
429
- for i in 2 : N- 1
430
- j = N
431
- du[i,end ,2 ] = α* (u[i- 1 ,j,2 ] + u[i+ 1 ,j,2 ] + 2 u[i,j- 1 ,2 ] - 4 u[i,j,2 ]) +
445
+ for I in CartesianRange ((N, N))
446
+ i = I[1 ]
447
+ j = I[2 ]
448
+ ip1 = limit (i+ 1 , N)
449
+ im1 = limit (i- 1 , N)
450
+ jp1 = limit (j+ 1 , N)
451
+ jm1 = limit (j- 1 , N)
452
+ du[i,j,2 ] = α* (u[im1,j,2 ] + u[ip1,j,2 ] + u[i,jp1,2 ] + u[i,jm1,2 ] - 4 u[i,j,2 ]) +
432
453
A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
433
454
end
434
-
435
- # Boundary @ four vertexes
436
- i = 1 ; j = 1
437
- du[1 ,1 ,1 ] = α* (2 u[i+ 1 ,j,1 ] + 2 u[i,j+ 1 ,1 ] - 4 u[i,j,1 ]) +
438
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
439
- du[1 ,1 ,2 ] = α* (2 u[i+ 1 ,j,2 ] + 2 u[i,j+ 1 ,2 ] - 4 u[i,j,2 ]) +
440
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
441
-
442
- i = 1 ; j = N
443
- du[1 ,N,1 ] = α* (2 u[i+ 1 ,j,1 ] + 2 u[i,j- 1 ,1 ] - 4 u[i,j,1 ]) +
444
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
445
- du[1 ,N,2 ] = α* (2 u[i+ 1 ,j,2 ] + 2 u[i,j- 1 ,2 ] - 4 u[i,j,2 ]) +
446
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
447
-
448
- i = N; j = 1
449
- du[N,1 ,1 ] = α* (2 u[i- 1 ,j,1 ] + 2 u[i,j+ 1 ,1 ] - 4 u[i,j,1 ]) +
450
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
451
- du[N,1 ,2 ] = α* (2 u[i- 1 ,j,2 ] + 2 u[i,j+ 1 ,2 ] - 4 u[i,j,2 ]) +
452
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
453
-
454
- i = N; j = N
455
- du[end ,end ,1 ] = α* (2 u[i- 1 ,j,1 ] + 2 u[i,j- 1 ,1 ] - 4 u[i,j,1 ]) +
456
- B + u[i,j,1 ]^ 2 * u[i,j,2 ] - (A + 1 )* u[i,j,1 ]
457
- du[end ,end ,2 ] = α* (2 u[i- 1 ,j,2 ] + 2 u[i,j- 1 ,2 ] - 4 u[i,j,2 ]) +
458
- A* u[i,j,1 ] - u[i,j,1 ]^ 2 * u[i,j,2 ]
459
455
end
460
456
end
461
457
function init_brusselator_2d (xyd)
462
- M = length (xyd)
463
- u = zeros (M, M, 2 )
464
- for I in CartesianRange ((M, M))
465
- u[I,1 ] = (2 + 0.25 xyd[I[2 ]])
466
- u[I,2 ] = (1 + 0.8 xyd[I[1 ]])
458
+ N = length (xyd)
459
+ u = zeros (N, N, 2 )
460
+ for I in CartesianRange ((N, N))
461
+ x = xyd[I[1 ]]
462
+ y = xyd[I[2 ]]
463
+ u[I,1 ] = 22 * (y[I]* (1 - y[I]))^ (3 / 2 )
464
+ u[I,2 ] = 27 * (x[I]* (1 - x[I]))^ (3 / 2 )
467
465
end
468
466
u
469
467
end
470
- const N_brusselator_2d = 128
468
+ xyd_brusselator = linspace ( 0 , 1 , 128 )
471
469
prob_ode_brusselator_2d = ODEProblem (brusselator_2d_loop,
472
- init_brusselator_2d (linspace (0 ,1 ,N_brusselator_2d)),
473
- (0. ,1 ),
474
- (3.4 , 1. , 0.002 , 1 / (N_brusselator_2d- 1 ),
475
- N_brusselator_2d))
470
+ init_brusselator_2d (xyd_brusselator),
471
+ (0. ,11.5 ),
472
+ (3.4 , 1. , 0.1 ,
473
+ xyd_brusselator, step (xyd_brusselator),
474
+ length (xyd_brusselator)))
475
+
476
+ """
477
+ 1D Brusselator
478
+
479
+ ```math
480
+ \\ begin{align}
481
+ \\ frac{\\ partial u}{\\ partial t} &= A + u^2v - (B+1)u + \\ alpha\f rac{\\ partial^2 u}{\\ partial x^2}
482
+ \\ frac{\\ partial v}{\\ partial t} &= Bu - u^2v + \\ alpha\f rac{\\ partial^2 u}{\\ partial x^2}
483
+ \\ end{align}
484
+ ```
485
+
486
+ and the initial conditions are
476
487
488
+ ```math
489
+ \\ begin{align}
490
+ u(x,0) &= 1+\\ sin(2π x) \\\\
491
+ v(x,0) &= 3
492
+ \\ end{align}
493
+ ```
494
+
495
+ with the boundary condition
496
+
497
+ ```math
498
+ \\ begin{align}
499
+ u(0,t) &= u(1,t) = 1 \\\\
500
+ v(0,t) &= v(1,t) = 3
501
+ \\ end{align}
502
+ ```
503
+
504
+ From Hairer Norsett Wanner Solving Ordinary Differential Equations II - Stiff and Differential-Algebraic Problems Page 6
505
+ """
477
506
const N_brusselator_1d = 40
478
507
const D_brusselator_u = DerivativeOperator {Float64} (2 ,2 ,1 / (N_brusselator_1d- 1 ),
479
508
N_brusselator_1d,
@@ -510,13 +539,19 @@ prob_ode_brusselator_1d = ODEProblem(brusselator_1d,
510
539
(0. ,10. ),
511
540
(1. , 3. , 1 / 50 , zeros (N_brusselator_1d)))
512
541
542
+ """
543
+ [Orego Problem](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Orego.ipynb)
544
+ """
513
545
orego = @ode_def Orego begin
514
546
dy1 = p1* (y2+ y1* (1 - p2* y1- y2))
515
547
dy2 = (y3- (1 + y1)* y2)/ p1
516
548
dy3 = p3* (y1- y3)
517
549
end p1 p2 p3
518
550
prob_ode_orego = ODEProblem (orego,[1.0 ,2.0 ,3.0 ],(0.0 ,30.0 ),[77.27 ,8.375e-6 ,0.161 ])
519
551
552
+ """
553
+ [Hires Problem](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Hires.ipynb)
554
+ """
520
555
hires = @ode_def Hires begin
521
556
dy1 = - 1.71 * y1 + 0.43 * y2 + 8.32 * y3 + 0.0007
522
557
dy2 = 1.71 * y1 - 8.75 * y2
@@ -533,6 +568,9 @@ u0[1] = 1
533
568
u0[8 ] = 0.0057
534
569
prob_ode_hires = ODEProblem (hires,u0,(0.0 ,321.8122 ))
535
570
571
+ """
572
+ [Pollution Problem](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Pollution.ipynb)
573
+ """
536
574
const k1= .35e0
537
575
const k2= .266e2
538
576
const k3= .123e5
@@ -724,10 +762,9 @@ u0[9] = 0.01
724
762
u0[17 ] = 0.007
725
763
prob_ode_pollution = ODEProblem (pollution,u0,(0.0 ,60.0 ))
726
764
727
- # #####################################################
728
- # Filament
729
- # #####################################################
730
-
765
+ """
766
+ [Filament PDE Discretization](http://nbviewer.jupyter.org/github/JuliaDiffEq/DiffEqBenchmarks.jl/blob/master/StiffODE/Filament.ipynb)
767
+ """
731
768
const T = Float64
732
769
abstract type AbstractFilamentCache end
733
770
abstract type AbstractMagneticForce end
@@ -945,4 +982,4 @@ function filament_prob(::SolverDiffEq; N=20, Cm=32, ω=200, time_end=1.)
945
982
stiffness_matrix! (f)
946
983
prob = ODEProblem (f, r0, (0. , time_end))
947
984
end
948
- prob_ode_filament = filament (SolverDiffEq ())
985
+ prob_ode_filament = filament_prob (SolverDiffEq ())
0 commit comments