Skip to content

Commit 82d6cfd

Browse files
committed
working on transient multifield AD
1 parent 28b08d6 commit 82d6cfd

2 files changed

Lines changed: 76 additions & 5 deletions

File tree

src/ODEs.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,19 @@ function ODEs.TransientCellField(f::DistributedMultiFieldCellField,derivatives::
174174
DistributedMultiFieldCellField(field_fe_fun,part_fe_fun,f.metadata)
175175
end
176176

177+
function ODEs.TransientCellField(f::DistributedMultiFieldCellField,derivatives::AbstractArray)
178+
transient_fields = []
179+
for i in 1:num_fields(f)
180+
f_i = f[i]
181+
df_i = map(local_views(derivatives)) do derivatives
182+
Tuple(map(df -> df[i],derivatives))
183+
end
184+
println(typeof(ODEs.TransientCellField(f_i,df_i)))
185+
push!(transient_fields, ODEs.TransientCellField(f_i,df_i))
186+
end
187+
TransientMultiFieldCellField(transient_fields)
188+
end
189+
177190
function ODEs.TransientMultiFieldCellField(fields::AbstractVector{<:ODEs.TransientSingleFieldCellField})
178191
cellfield = MultiFieldCellField(map(f -> f.cellfield,fields))
179192
n_derivatives = length(first(fields).derivatives)

test/AutodiffTests.jl

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,12 +249,70 @@ function main_transient_sf(distribute,parts)
249249
@test reduce(&,map(,partition(A_t),partition(A_t_AD)))
250250
end
251251

252+
253+
254+
function main_transient_mf(distribute,parts)
255+
ranks = distribute(LinearIndices((prod(parts),)))
256+
257+
model = CartesianDiscreteModel(ranks,parts,(0,1,0,1),(4,4))
258+
259+
k = 2
260+
reffe_u = ReferenceFE(lagrangian,VectorValue{2,Float64},k)
261+
reffe_p = ReferenceFE(lagrangian,Float64,k-1;space=:P)
262+
263+
u(x,t) = VectorValue(x[2],-x[1])
264+
u(t::Real) = x -> u(x,t)
265+
V = TestFESpace(model,reffe_u,dirichlet_tags="boundary")
266+
U = TransientTrialFESpace(V,u)
267+
Q = TestFESpace(model,reffe_p;conformity=:L2,constraint=:zeromean)
268+
269+
X = TransientMultiFieldFESpace([U,Q])
270+
Y = MultiFieldFESpace([V,Q])
271+
272+
Ω = Triangulation(model)
273+
= Measure(Ω,2*(k+1))
274+
275+
ν = 1.0
276+
f = VectorValue(0.0,0.0)
277+
278+
conv(u,∇u) = (∇u')u
279+
dconv(du,∇du,u,∇u) = conv(u,∇du)+conv(du,∇u)
280+
c(u,v) = (v(conv(u,(u))))dΩ
281+
dc(u,du,dv) = (dv(dconv(du,(du),u,(u))))dΩ
282+
283+
mass(t, ∂ₜu, v) = (∂ₜuv)dΩ
284+
biform((du,dp),(dv,dq)) = ( ν*(dv)(du) - (∇dv)*dp - (∇du)*dq)dΩ
285+
liform((dv,dq)) = (dvf)dΩ
286+
287+
r(t,(u,p),(v,q)) = mass(t, ∂t(u), v) + biform((u,p),(v,q)) + c(u,v) - liform((v,q))
288+
j_0(t,(u,p),(du,dp),(dv,dq)) = biform((du,dp),(dv,dq)) + dc(u,du,dv)
289+
j_t(t,(u,p),(dut,dp),(dv,dq)) = mass(t, dut, dv)
290+
291+
op = TransientFEOperator(r,(j_0,j_t),X,Y)
292+
op_AD = TransientFEOperator(r,X,Y)
293+
294+
xh = interpolate([VectorValue(1.0,1.0),1.0],X(0.0))
295+
∂txh = interpolate([VectorValue(0.0,0.0),0.0],X(0.0))
296+
xhₜ = TransientCellField(xh,(∂txh,))
297+
298+
b = assemble_vector(y->r(1.0,xhₜ,y),Y)
299+
A_0 = assemble_matrix((x,y)->j_0(1.0,xhₜ,x,y),X(1.0),Y)
300+
A_t = assemble_matrix((x,y)->j_t(1.0,xhₜ,x,y),X(1.0),Y)
301+
jac_0_AD = get_jacs(op_AD)[1]
302+
jac_t_AD = get_jacs(op_AD)[2]
303+
A_0_AD = assemble_matrix((x,y)->jac_0_AD(1.0,xhₜ,x,y),X(1.0),Y)
304+
A_t_AD = assemble_matrix((x,y)->jac_t_AD(1.0,xhₜ,x,y),X(1.0),Y)
305+
@test reduce(&,map(,partition(A_0),partition(A_0_AD)))
306+
@test reduce(&,map(,partition(A_t),partition(A_t_AD)))
307+
end
308+
252309
function main(distribute,parts)
253-
main_sf(distribute,parts)
254-
main_mf(distribute,parts)
255-
mf_different_fespace_trians(distribute,parts)
256-
skeleton_mf_different_fespace_trians(distribute,parts)
257-
main_transient_sf(distribute,parts)
310+
# main_sf(distribute,parts)
311+
# main_mf(distribute,parts)
312+
# mf_different_fespace_trians(distribute,parts)
313+
# skeleton_mf_different_fespace_trians(distribute,parts)
314+
# main_transient_sf(distribute,parts)
315+
main_transient_mf(distribute,parts)
258316
end
259317

260318
end

0 commit comments

Comments
 (0)