|
271 | 271 |
|
272 | 272 | """
|
273 | 273 | ```julia
|
274 |
| -function DiffEqBase.ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys), |
| 274 | +function ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys), |
275 | 275 | ps = parameters(sys);
|
276 | 276 | version = nothing, tgrad=false,
|
277 | 277 | jac = false,
|
@@ -384,6 +384,50 @@ function ODEFunctionExpr(sys::AbstractODESystem, args...; kwargs...)
|
384 | 384 | ODEFunctionExpr{true}(sys, args...; kwargs...)
|
385 | 385 | end
|
386 | 386 |
|
| 387 | +""" |
| 388 | +```julia |
| 389 | +function DAEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys), |
| 390 | + ps = parameters(sys); |
| 391 | + version = nothing, tgrad=false, |
| 392 | + jac = false, |
| 393 | + sparse = false, |
| 394 | + kwargs...) where {iip} |
| 395 | +``` |
| 396 | +
|
| 397 | +Create a Julia expression for an `ODEFunction` from the [`ODESystem`](@ref). |
| 398 | +The arguments `dvs` and `ps` are used to set the order of the dependent |
| 399 | +variable and parameter vectors, respectively. |
| 400 | +""" |
| 401 | +struct DAEFunctionExpr{iip} end |
| 402 | + |
| 403 | +struct DAEFunctionClosure{O, I} <: Function |
| 404 | + f_oop::O |
| 405 | + f_iip::I |
| 406 | +end |
| 407 | +(f::DAEFunctionClosure)(du, u, p, t) = f.f_oop(du, u, p, t) |
| 408 | +(f::DAEFunctionClosure)(out, du, u, p, t) = f.f_iip(out, du, u, p, t) |
| 409 | + |
| 410 | +function DAEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys), |
| 411 | + ps = parameters(sys), u0 = nothing; |
| 412 | + version = nothing, tgrad=false, |
| 413 | + jac = false, |
| 414 | + linenumbers = false, |
| 415 | + sparse = false, simplify=false, |
| 416 | + kwargs...) where {iip} |
| 417 | + f_oop, f_iip = generate_function(sys, dvs, ps; expression=Val{true}, implicit_dae = true, kwargs...) |
| 418 | + fsym = gensym(:f) |
| 419 | + _f = :($fsym = $DAEFunctionClosure($f_oop, $f_iip)) |
| 420 | + ex = quote |
| 421 | + $_f |
| 422 | + ODEFunction{$iip}($fsym,) |
| 423 | + end |
| 424 | + !linenumbers ? striplines(ex) : ex |
| 425 | +end |
| 426 | + |
| 427 | +function DAEFunctionExpr(sys::AbstractODESystem, args...; kwargs...) |
| 428 | + DAEFunctionExpr{true}(sys, args...; kwargs...) |
| 429 | +end |
| 430 | + |
387 | 431 | for P in [:ODEProblem, :DAEProblem]
|
388 | 432 | @eval function DiffEqBase.$P(sys::AbstractODESystem, args...; kwargs...)
|
389 | 433 | $P{true}(sys, args...; kwargs...)
|
|
440 | 484 |
|
441 | 485 | """
|
442 | 486 | ```julia
|
443 |
| -function DiffEqBase.ODEProblemExpr{iip}(sys::AbstractODESystem,u0map,tspan, |
| 487 | +function ODEProblemExpr{iip}(sys::AbstractODESystem,u0map,tspan, |
444 | 488 | parammap=DiffEqBase.NullParameters();
|
445 | 489 | version = nothing, tgrad=false,
|
446 | 490 | jac = false,
|
@@ -478,6 +522,53 @@ function ODEProblemExpr(sys::AbstractODESystem, args...; kwargs...)
|
478 | 522 | ODEProblemExpr{true}(sys, args...; kwargs...)
|
479 | 523 | end
|
480 | 524 |
|
| 525 | +""" |
| 526 | +```julia |
| 527 | +function DAEProblemExpr{iip}(sys::AbstractODESystem,u0map,tspan, |
| 528 | + parammap=DiffEqBase.NullParameters(); |
| 529 | + version = nothing, tgrad=false, |
| 530 | + jac = false, |
| 531 | + checkbounds = false, sparse = false, |
| 532 | + linenumbers = true, parallel=SerialForm(), |
| 533 | + skipzeros=true, fillzeros=true, |
| 534 | + simplify=false, |
| 535 | + kwargs...) where iip |
| 536 | +``` |
| 537 | +
|
| 538 | +Generates a Julia expression for constructing an ODEProblem from an |
| 539 | +ODESystem and allows for automatically symbolically calculating |
| 540 | +numerical enhancements. |
| 541 | +""" |
| 542 | +struct DAEProblemExpr{iip} end |
| 543 | + |
| 544 | +function DAEProblemExpr{iip}(sys::AbstractODESystem,du0map,u0map,tspan, |
| 545 | + parammap=DiffEqBase.NullParameters(); |
| 546 | + kwargs...) where iip |
| 547 | + f, du0, u0, p = process_DEProblem( |
| 548 | + DAEFunctionExpr{iip}, sys, u0map, parammap; |
| 549 | + implicit_dae=true, du0map=du0map, kwargs... |
| 550 | + ) |
| 551 | + linenumbers = get(kwargs, :linenumbers, true) |
| 552 | + diffvars = collect_differential_variables(sys) |
| 553 | + sts = states(sys) |
| 554 | + differential_vars = map(Base.Fix2(in, diffvars), sts) |
| 555 | + |
| 556 | + ex = quote |
| 557 | + f = $f |
| 558 | + u0 = $u0 |
| 559 | + du0 = $du0 |
| 560 | + tspan = $tspan |
| 561 | + p = $p |
| 562 | + differential_vars = $differential_vars |
| 563 | + DAEProblem{$iip}(f,du0,u0,tspan,p;differential_vars=differential_vars,$(kwargs...)) |
| 564 | + end |
| 565 | + !linenumbers ? striplines(ex) : ex |
| 566 | +end |
| 567 | + |
| 568 | +function DAEProblemExpr(sys::AbstractODESystem, args...; kwargs...) |
| 569 | + DAEProblemExpr{true}(sys, args...; kwargs...) |
| 570 | +end |
| 571 | + |
481 | 572 |
|
482 | 573 | ### Enables Steady State Problems ###
|
483 | 574 | function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem, args...; kwargs...)
|
|
0 commit comments