@@ -4,6 +4,8 @@ abstract type AbstractDofManager{
44} end
55
66struct DofManager{
7+ Condensed, # boolean flag for whether or not to seperate data between unknowns and constrained dofs
8+ # when creating unknowns
79 IT,
810 IDs <: AbstractArray{IT, 1} ,
911 Var <: AbstractFunction
1517
1618# method that initializes dof manager
1719# with all dofs unknown
18- function DofManager (var:: AbstractFunction )
20+ function DofManager (var:: AbstractFunction ; use_condensed :: Bool = false )
1921 dirichlet_dofs = zeros (Int, 0 )
2022 unknown_dofs = 1 : size (var. fspace. coords, 2 ) * length (names (var)) |> collect
21- return DofManager (dirichlet_dofs, unknown_dofs, var)
23+ return DofManager{
24+ use_condensed,
25+ eltype (dirichlet_dofs),
26+ typeof (dirichlet_dofs),
27+ typeof (var)
28+ }(dirichlet_dofs, unknown_dofs, var)
2229end
2330
2431_field_type (dof:: DofManager ) = eval (typeof (dof. var. fspace. coords). name. name)
32+ _is_condensed (dof:: DofManager{C, IT, IDs, V} ) where {C, IT, IDs, V} = C
2533
2634Base. length (dof:: DofManager ) = length (dof. dirichlet_dofs) + length (dof. unknown_dofs)
2735
@@ -57,29 +65,69 @@ function create_field(dof::DofManager)
5765 return _field_type (dof)(field)
5866end
5967
60- function create_unknowns (dof:: DofManager )
68+ function create_unknowns (dof:: DofManager{false, IT, IDs, Var} ) where {IT, IDs, Var}
6169 backend = KA. get_backend (dof)
6270 return KA. zeros (backend, Float64, length (dof. unknown_dofs))
6371end
6472
73+ function create_unknowns (dof:: DofManager{true, IT, IDs, Var} ) where {IT, IDs, Var}
74+ backend = KA. get_backend (dof)
75+ return KA. zeros (backend, Float64, length (dof))
76+ end
77+
6578# COV_EXCL_START
66- KA. @kernel function _extract_field_unknowns_kernel! (Uu:: V , dof:: DofManager , U:: AbstractField ) where V <: AbstractVector{<:Number}
79+ KA. @kernel function _extract_field_unknowns_kernel! (
80+ Uu:: V ,
81+ dof:: DofManager{false, IT, IDs, Var} ,
82+ U:: AbstractField
83+ ) where {V <: AbstractVector{<:Number} , IT, IDs, Var}
6784 N = KA. @index (Global)
6885 @inbounds Uu[N] = U[dof. unknown_dofs[N]]
6986end
7087# COV_EXCL_STOP
7188
72- function _extract_field_unknowns! (Uu:: V , dof:: DofManager , U:: AbstractField , backend:: KA.Backend ) where V <: AbstractVector{<:Number}
89+ # COV_EXCL_START
90+ KA. @kernel function _extract_field_unknowns_kernel! (
91+ Uu:: V ,
92+ dof:: DofManager{true, IT, IDs, Var} ,
93+ U:: AbstractField
94+ ) where {V <: AbstractVector{<:Number} , IT, IDs, Var}
95+ N = KA. @index (Global)
96+ @inbounds Uu[dof. unknown_dofs[N]] = U[dof. unknown_dofs[N]]
97+ end
98+ # COV_EXCL_STOP
99+
100+ function _extract_field_unknowns! (
101+ Uu:: V ,
102+ dof:: DofManager ,
103+ U:: AbstractField ,
104+ backend:: KA.Backend
105+ ) where V <: AbstractVector{<:Number}
73106 kernel! = _extract_field_unknowns_kernel! (backend)
74107 kernel! (Uu, dof, U, ndrange = length (Uu))
75108 return nothing
76109end
77110
78- function _extract_field_unknowns! (Uu:: V , dof:: DofManager , U:: AbstractField , :: KA.CPU ) where V <: AbstractVector{<:Number}
111+ function _extract_field_unknowns! (
112+ Uu:: V ,
113+ dof:: DofManager{false, IT, IDs, Var} ,
114+ U:: AbstractField ,
115+ :: KA.CPU
116+ ) where {V <: AbstractVector{<:Number} , IT, IDs, Var}
79117 @views Uu .= U[dof. unknown_dofs]
80118 return nothing
81119end
82120
121+ function _extract_field_unknowns! (
122+ Uu:: V ,
123+ dof:: DofManager{true, IT, IDs, Var} ,
124+ U:: AbstractField ,
125+ :: KA.CPU
126+ ) where {V <: AbstractVector{<:Number} , IT, IDs, Var}
127+ @views Uu[dof. unknown_dofs] .= U[dof. unknown_dofs]
128+ return nothing
129+ end
130+
83131function extract_field_unknowns! (
84132 Uu:: V ,
85133 dof:: DofManager ,
@@ -96,7 +144,7 @@ function function_space(dof::DofManager)
96144 return dof. var. fspace
97145end
98146
99- function update_dofs! (dof:: DofManager , dirichlet_dofs)
147+ function update_dofs! (dof:: DofManager , dirichlet_dofs:: V ) where V <: AbstractArray{<:Integer, 1}
100148 ND, NI = size (dof)
101149 Base. resize! (dof. dirichlet_dofs, length (dirichlet_dofs))
102150 Base. resize! (dof. unknown_dofs, ND * NI)
@@ -114,24 +162,59 @@ function update_dofs!(dof::DofManager, dirichlet_dofs)
114162end
115163
116164# COV_EXCL_START
117- KA. @kernel function _update_field_unknowns_kernel! (U:: AbstractField , dof:: DofManager , Uu:: V ) where V <: AbstractVector{<:Number}
165+ KA. @kernel function _update_field_unknowns_kernel! (
166+ U:: AbstractField ,
167+ dof:: DofManager{false, IT, IDs, Var} ,
168+ Uu:: V
169+ ) where {V <: AbstractVector{<:Number} , IT, IDs, Var}
118170 N = KA. @index (Global)
119171 @inbounds U[dof. unknown_dofs[N]] = Uu[N]
120172end
121173# COV_EXCL_STOP
174+
175+ # COV_EXCL_START
176+ KA. @kernel function _update_field_unknowns_kernel! (
177+ U:: AbstractField ,
178+ dof:: DofManager{true, IT, IDs, Var} ,
179+ Uu:: V
180+ ) where {V <: AbstractVector{<:Number} , IT, IDs, Var}
181+ N = KA. @index (Global)
182+ @inbounds U[dof. unknown_dofs[N]] = Uu[dof. unknown_dofs[N]]
183+ end
184+ # COV_EXCL_STOP
122185
123- function _update_field_unknowns! (U:: AbstractField , dof:: DofManager , Uu:: T , backend:: KA.Backend ) where T <: AbstractVector{<:Number}
186+ function _update_field_unknowns! (
187+ U:: AbstractField ,
188+ dof:: DofManager ,
189+ Uu:: T ,
190+ backend:: KA.Backend
191+ ) where T <: AbstractVector{<:Number}
124192 kernel! = _update_field_unknowns_kernel! (backend)
125193 kernel! (U, dof, Uu, ndrange = length (Uu))
126194 return nothing
127195end
128196
129197# Need a seperate CPU method since CPU is basically busted in KA
130- function _update_field_unknowns! (U:: AbstractField , dof:: DofManager , Uu:: T , :: KA.CPU ) where T <: AbstractVector{<:Number}
198+ function _update_field_unknowns! (
199+ U:: AbstractField ,
200+ dof:: DofManager{false, IT, IDs, Var} ,
201+ Uu:: T ,
202+ :: KA.CPU
203+ ) where {T <: AbstractVector{<:Number} , IT, IDs, Var}
131204 U[dof. unknown_dofs] .= Uu
132205 return nothing
133206end
134207
208+ function _update_field_unknowns! (
209+ U:: AbstractField ,
210+ dof:: DofManager{true, IT, IDs, Var} ,
211+ Uu:: T ,
212+ :: KA.CPU
213+ ) where {T <: AbstractVector{<:Number} , IT, IDs, Var}
214+ @views U[dof. unknown_dofs] .= Uu[dof. unknown_dofs]
215+ return nothing
216+ end
217+
135218function update_field_unknowns! (
136219 U:: AbstractField ,
137220 dof:: DofManager ,
@@ -140,6 +223,7 @@ function update_field_unknowns!(
140223 backend = KA. get_backend (dof)
141224 @assert KA. get_backend (U) == backend
142225 @assert KA. get_backend (Uu) == backend
226+ # @assert length(dof.unknown_dofs) == length(Uu)
143227 _update_field_unknowns! (U, dof, Uu, backend)
144228 return nothing
145229end
0 commit comments