Skip to content

Commit 9ddb148

Browse files
committed
Sort method and better docs
1 parent dd17757 commit 9ddb148

File tree

5 files changed

+476
-446
lines changed

5 files changed

+476
-446
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "EpithelialDynamics1D"
22
uuid = "ace8a2d7-7779-48a6-a8a4-cf6831a7e55b"
33
authors = ["Daniel VandenHeuvel <danj.vandenheuvel@gmail.com>"]
4-
version = "1.4.0"
4+
version = "1.5.0"
55

66
[deps]
77
CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"

src/problem.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ Struct for representing a cell simulation problem.
2121
You can solve a `CellProblem` like you would solve a problem from DifferentialEquations.jl, e.g. with
2222
2323
solve(prob, Tsit5(), saveat = 0.1)
24+
25+
The other kwargs for `solve` that we provide are:
26+
27+
- `proliferation::Bool = false`: Whether to include proliferation.
28+
- `rng::AbstractRNG = Random.default_rng()`: The random number generator to use for proliferation.
29+
- `sort::Bool = false`: Whether to sort the cells after each step. This is useful for preventing the cells from becoming unsorted, which can happen due to numerical errors or force laws like `F(q) = k/q^(n+1)`, `n ≥ 0`.
30+
31+
For proliferation problems, `EnsembleProblem` can be useful - see the docs.
2432
"""
2533
Base.@kwdef struct CellProblem{F,Fp,G,Gp}
2634
force_law::F

src/solve.jl

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ function default_prob_func(prob, proliferation, rng)
77
end
88
else
99
(ode_problem, i, repeat) -> (ode_problem)
10-
end
10+
end
1111
return prob_func
1212
end
1313

@@ -16,30 +16,45 @@ function SciMLBase.ODEProblem(prob::CellProblem;
1616
jac_prototype=jacobian_sparsity(prob),
1717
proliferation=false,
1818
rng=Random.default_rng(),
19+
sort=false,
1920
kwargs...) where {S}
2021
initial_time = prob.initial_time
2122
final_time = prob.final_time
2223
time_span = (initial_time, final_time)
2324
initial_condition = prob.initial_condition
25+
sort_callback = DiscreteCallback(
26+
(u, t, integrator) -> true,
27+
integrator -> sort!(integrator.u),
28+
save_positions=(false, false),
29+
initialize=(c, u, t, integrator) -> c.affect!(integrator),
30+
finalize=(c, u, t, integrator) -> c.affect!(integrator))
2431
if proliferation
2532
f = ODEFunction{true,S}(cell_odes!)
2633
callback = build_proliferation_callback(prob, rng)
34+
if sort
35+
callback = CallbackSet(sort_callback, callback)
36+
end
2737
ode_problem = ODEProblem{true,S}(f, initial_condition, time_span, prob; callback=callback, kwargs...)
2838
else
2939
f = ODEFunction{true,S}(cell_odes!; jac_prototype=jac_prototype)
30-
ode_problem = ODEProblem{true,S}(f, initial_condition, time_span, prob; kwargs...)
40+
if sort
41+
ode_problem = ODEProblem{true,S}(f, initial_condition, time_span, prob; callback=sort_callback, kwargs...)
42+
else
43+
ode_problem = ODEProblem{true,S}(f, initial_condition, time_span, prob; kwargs...)
44+
end
3145
end
46+
return ode_problem
3247
end
33-
function SciMLBase.NonlinearProblem(prob::SteadyCellProblem; proliferation=false, rng=Random.default_rng(), kwargs...)
48+
function SciMLBase.NonlinearProblem(prob::SteadyCellProblem; proliferation=false, rng=Random.default_rng(), sort=false, kwargs...)
3449
proliferation && @warn "Cannot compute the steady state of problems with proliferation. Ignoring the proliferation kwarg."
35-
ode_prob = ODEProblem(prob.prob; rng, kwargs...)
50+
ode_prob = ODEProblem(prob.prob; rng, sort, kwargs...)
3651
nl_prob = NonlinearProblem{true}(ode_prob.f, ode_prob.u0, ode_prob.p; kwargs...)
3752
return nl_prob
3853
end
39-
function SciMLBase.EnsembleProblem(prob::CellProblem; proliferation=true, rng=Random.default_rng(),
54+
function SciMLBase.EnsembleProblem(prob::CellProblem; proliferation=true, rng=Random.default_rng(), sort=false,
4055
prob_func=default_prob_func(prob, proliferation, rng), kwargs...)
41-
return EnsembleProblem(ODEProblem(deepcopy(prob); proliferation, rng, kwargs...); prob_func, kwargs...)
56+
return EnsembleProblem(ODEProblem(deepcopy(prob); proliferation, rng, sort, kwargs...); prob_func, kwargs...)
4257
end
4358

44-
CommonSolve.init(prob::CellProblem, alg; proliferation=false, rng=Random.default_rng(), kwargs...) = CommonSolve.init(ODEProblem(prob; proliferation, rng, kwargs...), alg; kwargs...)
45-
CommonSolve.solve(prob::SteadyCellProblem, alg; proliferation=false, rng=Random.default_rng(), kwargs...) = CommonSolve.solve(NonlinearProblem(prob; proliferation, rng, kwargs...), alg; kwargs...)
59+
CommonSolve.init(prob::CellProblem, alg; proliferation=false, rng=Random.default_rng(), sort=false, kwargs...) = CommonSolve.init(ODEProblem(prob; proliferation, rng, sort, kwargs...), alg; kwargs...)
60+
CommonSolve.solve(prob::SteadyCellProblem, alg; proliferation=false, rng=Random.default_rng(), sort=false, kwargs...) = CommonSolve.solve(NonlinearProblem(prob; proliferation, rng, sort, kwargs...), alg; kwargs...)

test/runtests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ end
1717
end
1818
@safetestset "Step Function" begin
1919
include("step_function.jl")
20-
end
20+
end

0 commit comments

Comments
 (0)