The documentation for GeneralDomain shows the docstring
GeneralDomain(g, u=nothing; nlsolve=NLSOLVEJL_SETUP(), save=true,
abstol=nothing, scalefactor=nothing, autonomous=numargs(g)==2,
nlopts=Dict(:ftol => 10*eps()))
which should now be
GeneralDomain(g, u = nothing; nlsolve = NLSOLVEJL_SETUP(), save = true,
abstol = nothing, scalefactor = nothing,
autonomous = maximum(SciMLBase.numargs(g)) == 3,
nlopts = Dict(:ftol => 10 * eps()))
Moreover, it initially says that g should be of the form g(u, resid) or g(t, u, resid), and then later says it should be g(resid, u, p) or g(resid, u, p, t). What should it be? It's not exactly clear to me what the "residuals" are either: a vector that tests each component of the solution? A single value testing all components? I thought it would be the former, but the documentation says
- `g`: ... which is zero when the value is in the domain.
which suggests the latter. I guess judging from
|
function isaccepted(u, p, t, abstol, f::GeneralDomainAffect{autonomous, F, T, S, uType}, |
|
resid) where {autonomous, F, T, S, uType} |
|
# calculate residuals |
|
if autonomous |
|
f.g(resid, u, p) |
|
else |
|
f.g(resid, u, p, t) |
|
end |
|
|
|
# accept time step if residuals are smaller than the tolerance |
|
if typeof(abstol) <: Number |
|
all(x -> x < abstol, resid) |
|
else |
|
# element-wise comparison |
|
length(resid) == length(abstol) || |
|
throw(DimensionMismatch("numbers of residuals and tolerances do not match")) |
|
all(x < y for (x, y) in zip(resid, abstol)) |
|
end |
|
end |
it should be that g is g(resid, u, p) or g(resid, u, p, t), and resid could actually be any mutable value, not necessarily with length(resid) == length(u) (doesn't seem like resid can be defined manually directly actually, and typeof(resid) must == typeof(u)).
I'm also guessing that p is just integrator.p, or is there a way to add on extra parameters here without a closure?
The documentation for
GeneralDomainshows the docstringwhich should now be
Moreover, it initially says that
gshould be of the formg(u, resid)org(t, u, resid), and then later says it should beg(resid, u, p)org(resid, u, p, t). What should it be? It's not exactly clear to me what the "residuals" are either: a vector that tests each component of the solution? A single value testing all components? I thought it would be the former, but the documentation sayswhich suggests the latter. I guess judging from
DiffEqCallbacks.jl/src/domain.jl
Lines 192 to 210 in f61c611
it should be that
gisg(resid, u, p)org(resid, u, p, t),and(doesn't seem likeresidcould actually be any mutable value, not necessarily withlength(resid) == length(u)residcan be defined manually directly actually, andtypeof(resid)must== typeof(u)).I'm also guessing that
pis justintegrator.p, or is there a way to add on extra parameters here without a closure?