@@ -38,39 +38,107 @@ function _assemble_element!(global_val::H1Field, local_val, conn, e, b)
3838 return nothing
3939end
4040
41- _assemble_block_method_from_sym (:: Val{:mass} ) = _assemble_block_mass!
42- _assemble_block_method_from_sym (:: Val{:residual} ) = _assemble_block_residual!
43- _assemble_block_method_from_sym (:: Val{:residual_and_stiffness} ) = _assemble_block_residual_and_stiffness!
44- _assemble_block_method_from_sym (:: Val{:stiffness} ) = _assemble_block_stiffness!
45-
46- function _check_backends (assembler, U, X, conns)
41+ function _check_backends (assembler, U, X, state_old, state_new, conns)
4742 backend = KA. get_backend (assembler)
4843 # TODO add get_backend method of ref_fe
4944 @assert backend == KA. get_backend (U)
5045 @assert backend == KA. get_backend (X)
5146 @assert backend == KA. get_backend (conns)
47+ @assert backend == KA. get_backend (state_old)
48+ @assert backend == KA. get_backend (state_new)
5249 return backend
5350end
5451
52+ function assemble! (assembler, :: Type{H1Field} , p, val_sym:: Val{:mass} )
53+ _zero_storage (assembler, val_sym)
54+ fspace = assembler. dof. H1_vars[1 ]. fspace
55+ for (b, (conns, block_physics, state_old, state_new)) in enumerate (zip (
56+ values (fspace. elem_conns),
57+ values (p. physics),
58+ values (p. state_old), values (p. state_new)
59+ ))
60+ ref_fe = values (fspace. ref_fes)[b]
61+ backend = _check_backends (assembler, p. h1_field, fspace. coords, state_old, state_new, conns)
62+ _assemble_block_mass! (
63+ assembler, block_physics, ref_fe,
64+ p. h1_field, fspace. coords, state_old, state_new,
65+ conns, b,
66+ backend
67+ )
68+ end
69+ end
70+
71+ function assemble! (assembler, :: Type{H1Field} , p, val_sym:: Val{:residual} )
72+ _zero_storage (assembler, val_sym)
73+ fspace = assembler. dof. H1_vars[1 ]. fspace
74+ for (b, (conns, block_physics, state_old, state_new)) in enumerate (zip (
75+ values (fspace. elem_conns),
76+ values (p. physics),
77+ values (p. state_old), values (p. state_new)
78+ ))
79+ ref_fe = values (fspace. ref_fes)[b]
80+ backend = _check_backends (assembler, p. h1_field, fspace. coords, state_old, state_new, conns)
81+ _assemble_block_residual! (
82+ assembler, block_physics, ref_fe,
83+ p. h1_field, fspace. coords, state_old, state_new,
84+ conns, b,
85+ backend
86+ )
87+ end
88+ end
89+
90+ function assemble! (assembler, :: Type{H1Field} , p, val_sym:: Val{:residual_and_stiffness} )
91+ _zero_storage (assembler, val_sym)
92+ fspace = assembler. dof. H1_vars[1 ]. fspace
93+ for (b, (conns, block_physics, state_old, state_new)) in enumerate (zip (
94+ values (fspace. elem_conns),
95+ values (p. physics),
96+ values (p. state_old), values (p. state_new)
97+ ))
98+ ref_fe = values (fspace. ref_fes)[b]
99+ backend = _check_backends (assembler, p. h1_field, fspace. coords, state_old, state_new, conns)
100+ _assemble_block_residual_and_stiffness! (
101+ assembler, block_physics, ref_fe,
102+ p. h1_field, fspace. coords, state_old, state_new,
103+ conns, b,
104+ backend
105+ )
106+ end
107+ end
108+
109+ function assemble! (assembler, :: Type{H1Field} , p, val_sym:: Val{:stiffness} )
110+ _zero_storage (assembler, val_sym)
111+ fspace = assembler. dof. H1_vars[1 ]. fspace
112+ for (b, (conns, block_physics, state_old, state_new)) in enumerate (zip (
113+ values (fspace. elem_conns),
114+ values (p. physics),
115+ values (p. state_old), values (p. state_new)
116+ ))
117+ ref_fe = values (fspace. ref_fes)[b]
118+ backend = _check_backends (assembler, p. h1_field, fspace. coords, state_old, state_new, conns)
119+ _assemble_block_stiffness! (
120+ assembler, block_physics, ref_fe,
121+ p. h1_field, fspace. coords, state_old, state_new,
122+ conns, b,
123+ backend
124+ )
125+ end
126+ end
127+
55128"""
56129$(TYPEDSIGNATURES)
57130Top level assembly method for ```H1Field``` that loops over blocks and dispatches
58131to appropriate kernels based on sym.
59132
60133TODO need to make sure at setup time that physics and elem_conns have the same
61134values order. Otherwise, shenanigans.
135+
136+ TODO figure out how to do generated functions
137+
138+ creates one type instability from the Val
62139"""
63- function assemble! (assembler, physics, U:: H1Field , sym)
64- val_sym = Val {sym} ()
65- _assemble_block_method! = _assemble_block_method_from_sym (val_sym)
66- _zero_storage (assembler, val_sym)
67- fspace = assembler. dof. H1_vars[1 ]. fspace
68- X = fspace. coords
69- for (b, (conns, block_physics)) in enumerate (zip (values (fspace. elem_conns), values (physics)))
70- ref_fe = values (fspace. ref_fes)[b]
71- backend = _check_backends (assembler, U, X, conns)
72- _assemble_block_method! (assembler, block_physics, ref_fe, U, X, conns, b, backend)
73- end
140+ function assemble! (assembler, type:: Type{H1Field} , p, sym:: Symbol )
141+ assemble! (assembler, type, p, Val {sym} ())
74142end
75143
76144"""
0 commit comments