From 2f62868b8defdc2b23f46ed7a2e46fe10841e967 Mon Sep 17 00:00:00 2001 From: fjebaker Date: Wed, 26 Jul 2023 17:37:27 +0100 Subject: [PATCH 1/3] fix: actually export GradusBase functions --- src/GradusBase/GradusBase.jl | 46 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/GradusBase/GradusBase.jl b/src/GradusBase/GradusBase.jl index e8ee36d5..221a0490 100644 --- a/src/GradusBase/GradusBase.jl +++ b/src/GradusBase/GradusBase.jl @@ -33,28 +33,28 @@ export AbstractMetric, AbstractStaticAxisSymmetric, metric, unpack_solution, - unpack_solution_full -GeodesicPoint, -AbstractGeodesicPoint, -vector_to_local_sky, -AbstractMetric, -geodesic_equation, -constrain, -inner_radius, -metric_type, -metric_components, -inverse_metric_components, -dotproduct, -propernorm, -tetradframe, -lnrbasis, -lnrframe, -lowerindices, -raiseindices, -StatusCodes, -AbstractIntegrationParameters, -IntegrationParameters, -update_integration_parameters!, -restrict_ensemble + unpack_solution_full, + GeodesicPoint, + AbstractGeodesicPoint, + vector_to_local_sky, + AbstractMetric, + geodesic_equation, + constrain, + inner_radius, + metric_type, + metric_components, + inverse_metric_components, + dotproduct, + propernorm, + tetradframe, + lnrbasis, + lnrframe, + lowerindices, + raiseindices, + StatusCodes, + AbstractIntegrationParameters, + IntegrationParameters, + update_integration_parameters!, + restrict_ensemble end # module From 043219ec720048d4ff136a12e31bba15669d6c39 Mon Sep 17 00:00:00 2001 From: fjebaker Date: Wed, 26 Jul 2023 18:19:58 +0100 Subject: [PATCH 2/3] feat: added get/set_status for integration parameters --- src/Gradus.jl | 4 +++- src/GradusBase/GradusBase.jl | 4 +++- src/GradusBase/geodesic-solutions.jl | 19 ++++++++++++++++--- src/corona/profiles/voronoi.jl | 2 +- src/metrics/kerr-newman-ad.jl | 2 +- src/tracing/callbacks.jl | 2 +- src/tracing/charts.jl | 8 ++++---- 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/Gradus.jl b/src/Gradus.jl index d41c5630..2793b3db 100644 --- a/src/Gradus.jl +++ b/src/Gradus.jl @@ -61,7 +61,9 @@ import .GradusBase: IntegrationParameters, update_integration_parameters!, restrict_ensemble, - _fast_dot + _fast_dot, + set_status!, + get_status export AbstractMetric, AbstractTrace, diff --git a/src/GradusBase/GradusBase.jl b/src/GradusBase/GradusBase.jl index 221a0490..3ef2a26d 100644 --- a/src/GradusBase/GradusBase.jl +++ b/src/GradusBase/GradusBase.jl @@ -55,6 +55,8 @@ export AbstractMetric, AbstractIntegrationParameters, IntegrationParameters, update_integration_parameters!, - restrict_ensemble + restrict_ensemble, + set_status!, + get_status end # module diff --git a/src/GradusBase/geodesic-solutions.jl b/src/GradusBase/geodesic-solutions.jl index 619ae3f6..008faa4b 100644 --- a/src/GradusBase/geodesic-solutions.jl +++ b/src/GradusBase/geodesic-solutions.jl @@ -19,6 +19,10 @@ update_integration_parameters!( ::AbstractIntegrationParameters, ) = error("Not implemented for $(typeof(p))") +mutable struct _IntegrationStatus + status::StatusCodes.T +end + mutable struct IntegrationParameters <: AbstractIntegrationParameters status::StatusCodes.T end @@ -27,10 +31,19 @@ function update_integration_parameters!( p::IntegrationParameters, new::IntegrationParameters, ) - p.status = new.status + set_status!(p, new.status) p end +set_status!(params::AbstractIntegrationParameters, status::StatusCodes.T) = + params.status = status + +get_status(params::AbstractIntegrationParameters) = params.status + +set_status!(params::_IntegrationStatus, status::StatusCodes.T) = params.status = status + +get_status(params::_IntegrationStatus) = params.status + """ abstract type AbstractGeodesicPoint @@ -118,7 +131,7 @@ function unpack_solution(::AbstractMetric, sol::SciMLBase.AbstractODESolution{T} # get the auxiliary values if we have any aux = unpack_auxiliary(us[end]) - GeodesicPoint(sol.prob.p.status, t_init, t, x_init, x, v_init, v, aux) + GeodesicPoint(get_status(sol.prob.p), t_init, t, x_init, x, v_init, v, aux) end end @@ -154,7 +167,7 @@ function unpack_solution_full( ui = SVector{4,T}(us[i][1:4]) vi = SVector{4,T}(us[i][5:8]) ti = ts[i] - GeodesicPoint(sol.prob.p.status, t_start, ti, u_start, ui, v_start, vi) + GeodesicPoint(get_status(sol.prob.p), t_start, ti, u_start, ui, v_start, vi) end end end diff --git a/src/corona/profiles/voronoi.jl b/src/corona/profiles/voronoi.jl index e2931612..f36a911a 100644 --- a/src/corona/profiles/voronoi.jl +++ b/src/corona/profiles/voronoi.jl @@ -78,7 +78,7 @@ function VoronoiDiscProfile( VoronoiDiscProfile( m, d, - filter(i -> i.prob.p.status == StatusCodes.IntersectedWithGeometry, simsols.u), + filter(i -> get_status(i.prob.p) == StatusCodes.IntersectedWithGeometry, simsols.u), ) end diff --git a/src/metrics/kerr-newman-ad.jl b/src/metrics/kerr-newman-ad.jl index 25200731..9355a12d 100644 --- a/src/metrics/kerr-newman-ad.jl +++ b/src/metrics/kerr-newman-ad.jl @@ -95,7 +95,7 @@ function geodesic_ode_problem( f, u_init, time_domain, - IntegrationParameters(StatusCodes.NoStatus); + IntegrationParameters(nothing, StatusCodes.NoStatus); callback = callback, ) end diff --git a/src/tracing/callbacks.jl b/src/tracing/callbacks.jl index a8f600aa..7f0b189f 100644 --- a/src/tracing/callbacks.jl +++ b/src/tracing/callbacks.jl @@ -1,6 +1,6 @@ function terminate_with_status!(status::StatusCodes.T) function _terminate_with_status_closure!(integrator) - integrator.p.status = status + set_status!(integrator.p, status) terminate!(integrator) end end diff --git a/src/tracing/charts.jl b/src/tracing/charts.jl index 632ffac5..280540df 100644 --- a/src/tracing/charts.jl +++ b/src/tracing/charts.jl @@ -13,10 +13,10 @@ end function chart_terminate!(integrator) # terminate with status code depending on whether inner or outer boundary if integrator.u[2] ≤ chart.inner_radius - integrator.p.status = StatusCodes.WithinInnerBoundary + set_status!(integrator.p, StatusCodes.WithinInnerBoundary) terminate!(integrator) else - integrator.p.status = StatusCodes.OutOfDomain + set_status!(integrator.p, StatusCodes.OutOfDomain) terminate!(integrator) end end @@ -38,10 +38,10 @@ end # terminate with status code depending on whether inner or outer boundary rmin = chart.shapefunc(integrator.u[3]) if integrator.u[2] ≤ rmin - integrator.p.status = StatusCodes.WithinInnerBoundary + set_status!(integrator.p, StatusCodes.WithinInnerBoundary) terminate!(integrator) else - integrator.p.status = StatusCodes.OutOfDomain + set_status!(integrator.p, StatusCodes.OutOfDomain) terminate!(integrator) end end From 0e176886343adfe81b1c0850052a7a7bdd4643a6 Mon Sep 17 00:00:00 2001 From: fjebaker Date: Thu, 27 Jul 2023 15:26:15 +0100 Subject: [PATCH 3/3] fix: fully adopt new set/get status api --- src/Gradus.jl | 4 +- src/GradusBase/GradusBase.jl | 4 +- src/GradusBase/geodesic-solutions.jl | 73 +++++++++++++------ src/corona/profiles/voronoi.jl | 5 +- src/metrics/kerr-newman-ad.jl | 2 +- src/tracing/callbacks.jl | 2 +- src/tracing/charts.jl | 8 +- .../method-implementations/first-order.jl | 6 +- src/tracing/radiative-transfer-problem.jl | 6 +- test/smoke-tests/disc-profiles.jl | 7 +- 10 files changed, 80 insertions(+), 37 deletions(-) diff --git a/src/Gradus.jl b/src/Gradus.jl index 2793b3db..ff3834de 100644 --- a/src/Gradus.jl +++ b/src/Gradus.jl @@ -62,8 +62,8 @@ import .GradusBase: update_integration_parameters!, restrict_ensemble, _fast_dot, - set_status!, - get_status + set_status_code!, + get_status_code export AbstractMetric, AbstractTrace, diff --git a/src/GradusBase/GradusBase.jl b/src/GradusBase/GradusBase.jl index 3ef2a26d..61d16497 100644 --- a/src/GradusBase/GradusBase.jl +++ b/src/GradusBase/GradusBase.jl @@ -56,7 +56,7 @@ export AbstractMetric, IntegrationParameters, update_integration_parameters!, restrict_ensemble, - set_status!, - get_status + set_status_code!, + get_status_code end # module diff --git a/src/GradusBase/geodesic-solutions.jl b/src/GradusBase/geodesic-solutions.jl index 008faa4b..1d9d7814 100644 --- a/src/GradusBase/geodesic-solutions.jl +++ b/src/GradusBase/geodesic-solutions.jl @@ -11,38 +11,59 @@ abstract type AbstractTrace end Parameters that are made available at each step of the integration, that need not be constant. For example, the turning points or withing-geometry flags. + +The integration parameters should track which spacetime `M` they are parameters for. +Integration parameters must implement +- [`set_status_code!`](@ref) +- [`get_status_code`](@ref) + +For more complex parameters, may also optionally implement +- [`update_integration_parameters!`](@ref) + +See the documentation of each of the above functions for details of their operation. """ abstract type AbstractIntegrationParameters end -update_integration_parameters!( - p::AbstractIntegrationParameters, - ::AbstractIntegrationParameters, -) = error("Not implemented for $(typeof(p))") - -mutable struct _IntegrationStatus - status::StatusCodes.T -end +""" + update_integration_parameters!(old::AbstractIntegrationParameters, new::AbstractIntegrationParameters) -mutable struct IntegrationParameters <: AbstractIntegrationParameters - status::StatusCodes.T -end +Update (mutate) the `old` integration parameters to take the value of the `new`. Function should return +the `old`. +Note this function is practically only used to update any mutable fields in the integration parameters, +such as resetting any changes to an original state. +""" function update_integration_parameters!( - p::IntegrationParameters, - new::IntegrationParameters, + old::AbstractIntegrationParameters, + new::AbstractIntegrationParameters, ) - set_status!(p, new.status) - p + set_status_code!(old, get_status_code(new)) + old end -set_status!(params::AbstractIntegrationParameters, status::StatusCodes.T) = - params.status = status +""" + set_status_code!(p::AbstractIntegrationParameters, status::StatusCodes.T) + +Update the status [`StatusCodes.T`](@ref) in `p` with `status`. +""" +set_status_code!(params::AbstractIntegrationParameters, status::StatusCodes.T) = + error("Not implemented for $(typeof(params))") -get_status(params::AbstractIntegrationParameters) = params.status +""" + get_status_code(p::AbstractIntegrationParameters)::StatusCodes.T -set_status!(params::_IntegrationStatus, status::StatusCodes.T) = params.status = status +Return the status [`StatusCodes.T`](@ref) in `status`. +""" +get_status_code(params::AbstractIntegrationParameters) = + error("Not implemented for $(typeof(params))") -get_status(params::_IntegrationStatus) = params.status +mutable struct IntegrationParameters <: AbstractIntegrationParameters + status::StatusCodes.T +end + +set_status_code!(params::IntegrationParameters, status::StatusCodes.T) = + params.status = status +get_status_code(params::IntegrationParameters) = params.status """ abstract type AbstractGeodesicPoint @@ -131,7 +152,7 @@ function unpack_solution(::AbstractMetric, sol::SciMLBase.AbstractODESolution{T} # get the auxiliary values if we have any aux = unpack_auxiliary(us[end]) - GeodesicPoint(get_status(sol.prob.p), t_init, t, x_init, x, v_init, v, aux) + GeodesicPoint(get_status_code(sol.prob.p), t_init, t, x_init, x, v_init, v, aux) end end @@ -167,7 +188,15 @@ function unpack_solution_full( ui = SVector{4,T}(us[i][1:4]) vi = SVector{4,T}(us[i][5:8]) ti = ts[i] - GeodesicPoint(get_status(sol.prob.p), t_start, ti, u_start, ui, v_start, vi) + GeodesicPoint( + get_status_code(sol.prob.p), + t_start, + ti, + u_start, + ui, + v_start, + vi, + ) end end end diff --git a/src/corona/profiles/voronoi.jl b/src/corona/profiles/voronoi.jl index f36a911a..8ed2b5e0 100644 --- a/src/corona/profiles/voronoi.jl +++ b/src/corona/profiles/voronoi.jl @@ -78,7 +78,10 @@ function VoronoiDiscProfile( VoronoiDiscProfile( m, d, - filter(i -> get_status(i.prob.p) == StatusCodes.IntersectedWithGeometry, simsols.u), + filter( + i -> get_status_code(i.prob.p) == StatusCodes.IntersectedWithGeometry, + simsols.u, + ), ) end diff --git a/src/metrics/kerr-newman-ad.jl b/src/metrics/kerr-newman-ad.jl index 9355a12d..25200731 100644 --- a/src/metrics/kerr-newman-ad.jl +++ b/src/metrics/kerr-newman-ad.jl @@ -95,7 +95,7 @@ function geodesic_ode_problem( f, u_init, time_domain, - IntegrationParameters(nothing, StatusCodes.NoStatus); + IntegrationParameters(StatusCodes.NoStatus); callback = callback, ) end diff --git a/src/tracing/callbacks.jl b/src/tracing/callbacks.jl index 7f0b189f..a9739e15 100644 --- a/src/tracing/callbacks.jl +++ b/src/tracing/callbacks.jl @@ -1,6 +1,6 @@ function terminate_with_status!(status::StatusCodes.T) function _terminate_with_status_closure!(integrator) - set_status!(integrator.p, status) + set_status_code!(integrator.p, status) terminate!(integrator) end end diff --git a/src/tracing/charts.jl b/src/tracing/charts.jl index 280540df..8f8f0d74 100644 --- a/src/tracing/charts.jl +++ b/src/tracing/charts.jl @@ -13,10 +13,10 @@ end function chart_terminate!(integrator) # terminate with status code depending on whether inner or outer boundary if integrator.u[2] ≤ chart.inner_radius - set_status!(integrator.p, StatusCodes.WithinInnerBoundary) + set_status_code!(integrator.p, StatusCodes.WithinInnerBoundary) terminate!(integrator) else - set_status!(integrator.p, StatusCodes.OutOfDomain) + set_status_code!(integrator.p, StatusCodes.OutOfDomain) terminate!(integrator) end end @@ -38,10 +38,10 @@ end # terminate with status code depending on whether inner or outer boundary rmin = chart.shapefunc(integrator.u[3]) if integrator.u[2] ≤ rmin - set_status!(integrator.p, StatusCodes.WithinInnerBoundary) + set_status_code!(integrator.p, StatusCodes.WithinInnerBoundary) terminate!(integrator) else - set_status!(integrator.p, StatusCodes.OutOfDomain) + set_status_code!(integrator.p, StatusCodes.OutOfDomain) terminate!(integrator) end end diff --git a/src/tracing/method-implementations/first-order.jl b/src/tracing/method-implementations/first-order.jl index 89de1408..edb784fd 100644 --- a/src/tracing/method-implementations/first-order.jl +++ b/src/tracing/method-implementations/first-order.jl @@ -96,6 +96,10 @@ end make_parameters(L, Q, sign_θ, ::Type{T}) where {T} = FirstOrderIntegrationParameters{T}(L, Q, -1, sign_θ, [0.0, 0.0], StatusCodes.NoStatus) +set_status_code!(params::FirstOrderIntegrationParameters, status::StatusCodes.T) = + params.status = status +get_status_code(params::FirstOrderIntegrationParameters) = params.status + function update_integration_parameters!( p::FirstOrderIntegrationParameters, new::FirstOrderIntegrationParameters, @@ -104,7 +108,7 @@ function update_integration_parameters!( p.Q = new.Q p.θ = new.θ p.changes = new.changes - p.status = new.status + set_status_code!(p, get_status_code(new)) p end diff --git a/src/tracing/radiative-transfer-problem.jl b/src/tracing/radiative-transfer-problem.jl index 2c6f8011..abd8d662 100644 --- a/src/tracing/radiative-transfer-problem.jl +++ b/src/tracing/radiative-transfer-problem.jl @@ -36,12 +36,16 @@ function _radiative_transfer_integration_parameters(status::StatusCodes.T, geome RadiativeTransferIntegrationParameters(status, within_geometry) end +set_status_code!(params::RadiativeTransferIntegrationParameters, status::StatusCodes.T) = + params.status = status +get_status_code(params::RadiativeTransferIntegrationParameters) = params.status + function update_integration_parameters!( p::RadiativeTransferIntegrationParameters, new::RadiativeTransferIntegrationParameters, ) - p.status = new.status + set_status_code!(p, get_status_code(new)) p.within_geometry .= new.within_geometry p end diff --git a/test/smoke-tests/disc-profiles.jl b/test/smoke-tests/disc-profiles.jl index 789abf69..e459a639 100644 --- a/test/smoke-tests/disc-profiles.jl +++ b/test/smoke-tests/disc-profiles.jl @@ -18,8 +18,11 @@ using StaticArrays sampler = EvenSampler(domain = LowerHemisphere()), ) - intersected_simsols = - filter(i -> i.prob.p.status == StatusCodes.IntersectedWithGeometry, simsols.u) + intersected_simsols = filter( + i -> + Gradus.get_status_code(i.prob.p) == StatusCodes.IntersectedWithGeometry, + simsols.u, + ) sd_endpoints = map(sol -> unpack_solution(m, sol), intersected_simsols) # test ensemble solution constructor