@@ -62,6 +62,36 @@ function create_unknowns(dof::DofManager)
6262 return KA. zeros (backend, Float64, length (dof. unknown_dofs))
6363end
6464
65+ # COV_EXCL_START
66+ KA. @kernel function _extract_field_unknowns_kernel! (Uu:: V , dof:: DofManager , U:: AbstractField ) where V <: AbstractVector{<:Number}
67+ N = KA. @index (Global)
68+ @inbounds Uu[N] = U[dof. unknown_dofs[N]]
69+ end
70+ # COV_EXCL_STOP
71+
72+ function _extract_field_unknowns! (Uu:: V , dof:: DofManager , U:: AbstractField , backend:: KA.Backend ) where V <: AbstractVector{<:Number}
73+ kernel! = _extract_field_unknowns_kernel! (backend)
74+ kernel! (Uu, dof, U, ndrange = length (Uu))
75+ return nothing
76+ end
77+
78+ function _extract_field_unknowns! (Uu:: V , dof:: DofManager , U:: AbstractField , :: KA.CPU ) where V <: AbstractVector{<:Number}
79+ @views Uu .= U[dof. unknown_dofs]
80+ return nothing
81+ end
82+
83+ function extract_field_unknowns! (
84+ Uu:: V ,
85+ dof:: DofManager ,
86+ U:: AbstractField
87+ ) where V <: AbstractVector{<:Number}
88+ backend = KA. get_backend (dof)
89+ @assert KA. get_backend (U) == backend
90+ @assert KA. get_backend (Uu) == backend
91+ _extract_field_unknowns! (Uu, dof, U, backend)
92+ return nothing
93+ end
94+
6595function function_space (dof:: DofManager )
6696 return dof. var. fspace
6797end
@@ -84,20 +114,20 @@ function update_dofs!(dof::DofManager, dirichlet_dofs)
84114end
85115
86116# COV_EXCL_START
87- KA. @kernel function _update_field_unknowns_kernel! (U:: H1Field , dof:: DofManager , Uu:: T ) where T <: AbstractArray {<:Number, 1 }
117+ KA. @kernel function _update_field_unknowns_kernel! (U:: AbstractField , dof:: DofManager , Uu:: V ) where V <: AbstractVector {<:Number}
88118 N = KA. @index (Global)
89119 @inbounds U[dof. unknown_dofs[N]] = Uu[N]
90120end
91121# COV_EXCL_STOP
92122
93- function _update_field_unknowns! (U:: H1Field , dof:: DofManager , Uu:: T , backend:: KA.Backend ) where T <: AbstractArray {<:Number, 1 }
123+ function _update_field_unknowns! (U:: AbstractField , dof:: DofManager , Uu:: T , backend:: KA.Backend ) where T <: AbstractVector {<:Number}
94124 kernel! = _update_field_unknowns_kernel! (backend)
95125 kernel! (U, dof, Uu, ndrange = length (Uu))
96126 return nothing
97127end
98128
99129# Need a seperate CPU method since CPU is basically busted in KA
100- function _update_field_unknowns! (U:: H1Field , dof:: DofManager , Uu:: T , :: KA.CPU ) where T <: AbstractArray {<:Number, 1 }
130+ function _update_field_unknowns! (U:: AbstractField , dof:: DofManager , Uu:: T , :: KA.CPU ) where T <: AbstractVector {<:Number}
101131 U[dof. unknown_dofs] .= Uu
102132 return nothing
103133end
0 commit comments