@@ -643,6 +643,32 @@ function concrete_getu(indp, syms::AbstractVector)
643643 return Base. Fix1 (reduce, vcat) ∘ getu (indp, split_syms)
644644end
645645
646+ """
647+ $(TYPEDEF)
648+
649+ A callable struct which applies `p_constructor` to possibly nested arrays. It also
650+ ensures that views (including nested ones) are concretized.
651+ """
652+ struct PConstructorApplicator{F}
653+ p_constructor:: F
654+ end
655+
656+ function (pca:: PConstructorApplicator )(x:: AbstractArray )
657+ pca. p_constructor (x)
658+ end
659+
660+ function (pca:: PConstructorApplicator{typeof(identity)} )(x:: SubArray )
661+ collect (x)
662+ end
663+
664+ function (pca:: PConstructorApplicator{typeof(identity)} )(x:: SubArray{<:AbstractArray} )
665+ collect (pca .(x))
666+ end
667+
668+ function (pca:: PConstructorApplicator )(x:: AbstractArray{<:AbstractArray} )
669+ pca. p_constructor (pca .(x))
670+ end
671+
646672"""
647673 $(TYPEDSIGNATURES)
648674
@@ -657,6 +683,7 @@ takes a value provider of `srcsys` and a value provider of `dstsys` and returns
657683"""
658684function get_mtkparameters_reconstructor (srcsys:: AbstractSystem , dstsys:: AbstractSystem ;
659685 initials = false , unwrap_initials = false , p_constructor = identity)
686+ p_constructor = PConstructorApplicator (p_constructor)
660687 # if we call `getu` on this (and it were able to handle empty tuples) we get the
661688 # fields of `MTKParameters` except caches.
662689 syms = reorder_parameters (
@@ -698,15 +725,16 @@ function get_mtkparameters_reconstructor(srcsys::AbstractSystem, dstsys::Abstrac
698725 else
699726 ic = get_index_cache (dstsys)
700727 blockarrsizes = Tuple (map (ic. discrete_buffer_sizes) do bufsizes
701- map (x -> x. length, bufsizes)
728+ p_constructor ( map (x -> x. length, bufsizes) )
702729 end )
703730 # discretes need to be blocked arrays
704731 # the `getu` returns a tuple of arrays corresponding to `p.discretes`
705732 # `Base.Fix1(...)` applies `p_constructor` to each of the arrays in the tuple
706733 # `Base.Fix2(...)` does `BlockedArray.(tuple_of_arrs, blockarrsizes)` returning a
707734 # tuple of `BlockedArray`s
708735 Base. Fix2 (Broadcast. BroadcastFunction (BlockedArray), blockarrsizes) ∘
709- Base. Fix1 (broadcast, p_constructor) ∘ getu (srcsys, syms[3 ])
736+ Base. Fix1 (broadcast, p_constructor) ∘
737+ getu (srcsys, syms[3 ])
710738 end
711739 rest_getters = map (Base. tail (Base. tail (Base. tail (syms)))) do buf
712740 if buf == ()
@@ -1307,7 +1335,7 @@ function process_SciMLProblem(
13071335 if ! (pType <: AbstractArray )
13081336 pType = Array
13091337 end
1310- p = MTKParameters (sys, op; floatT = floatT, container_type = pType, p_constructor)
1338+ p = MTKParameters (sys, op; floatT = floatT, p_constructor)
13111339 else
13121340 p = p_constructor (better_varmap_to_vars (op, ps; tofloat, container_type = pType))
13131341 end
0 commit comments