Skip to content

Commit 3318e37

Browse files
explicitly perform multiplications
1 parent 4252639 commit 3318e37

File tree

1 file changed

+47
-11
lines changed

1 file changed

+47
-11
lines changed

lib/OrdinaryDiffEqFIRK/src/firk_perform_step.jl

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,19 +1369,19 @@ end
13691369

13701370
J = calc_J(integrator, cache)
13711371
if u isa Number
1372+
LU1 = -γdt * mass_matrix + J
13721373
tmp = -(αdt[1] + βdt[1] * im) * mass_matrix + J
13731374
else
1375+
LU1 = lu(-γdt * mass_matrix + J)
13741376
tmp = lu(-(αdt[1] + βdt[1] * im) * mass_matrix + J)
13751377
end
13761378
LU2 = Vector{typeof(tmp)}(undef, (num_stages - 1) ÷ 2)
13771379
LU2[1] = tmp
13781380
if u isa Number
1379-
LU1 = -γdt * mass_matrix + J
13801381
for i in 2 : (num_stages - 1) ÷ 2
13811382
LU2[i] = -(αdt[i] + βdt[i] * im) * mass_matrix + J
13821383
end
13831384
else
1384-
LU1 = lu(-γdt * mass_matrix + J)
13851385
for i in 2 : (num_stages - 1) ÷ 2
13861386
LU2[i] = lu(-(αdt[i] + βdt[i] * im) * mass_matrix + J)
13871387
end
@@ -1412,7 +1412,13 @@ end
14121412
end
14131413
z[i] = @.. z[i] * c_prime[i]
14141414
end
1415-
w = TI*z
1415+
#w = TI*z
1416+
for i in 1:num_stages
1417+
w[i] = zero(u)
1418+
for j in 1:num_stages
1419+
w[i] += TI[i,j] * z[j]
1420+
end
1421+
end
14161422
end
14171423

14181424
# Newton iteration
@@ -1431,7 +1437,15 @@ end
14311437
end
14321438
integrator.stats.nf += num_stages
14331439

1434-
fw = TI * ff
1440+
#fw = TI * ff
1441+
fw = Vector{typeof(u)}(undef, num_stages)
1442+
for i in 1:num_stages
1443+
fw[i] = zero(u)
1444+
for j in 1:num_stages
1445+
fw[i] += TI[i,j] * ff[j]
1446+
end
1447+
end
1448+
14351449
Mw = Vector{typeof(u)}(undef, num_stages)
14361450
if mass_matrix isa UniformScaling # `UniformScaling` doesn't play nicely with broadcast
14371451
for i in 1 : num_stages
@@ -1481,8 +1495,13 @@ end
14811495
w = @.. w - dw
14821496

14831497
# transform `w` to `z`
1484-
z = T * w
1485-
1498+
#z = T * w
1499+
for i in 1:num_stages
1500+
z[i] = zero(u)
1501+
for j in 1:num_stages
1502+
z[i] += T[i,j] * w[j]
1503+
end
1504+
end
14861505
# check stopping criterion
14871506
iter > 1 &&= θ / (1 - θ))
14881507
if η * ndw < κ && (iter > 1 || iszero(ndw) || !iszero(integrator.success_iter))
@@ -1565,7 +1584,6 @@ end
15651584
mass_matrix = integrator.f.mass_matrix
15661585

15671586
# precalculations
1568-
15691587
γdt, αdt, βdt = γ / dt, α ./ dt, β ./ dt
15701588
(new_jac = do_newJ(integrator, alg, cache, repeat_step)) &&
15711589
(calc_J!(J, integrator, cache); cache.W_γdt = dt)
@@ -1600,7 +1618,13 @@ end
16001618
end
16011619
@.. z[i] *= c_prime[i]
16021620
end
1603-
mul!(w, TI, z)
1621+
#mul!(w, TI, z)
1622+
for i in 1:num_stages
1623+
w[i] = zero(u)
1624+
for j in 1:num_stages
1625+
w[i] += TI[i,j] * z[j]
1626+
end
1627+
end
16041628
end
16051629

16061630
# Newton iteration
@@ -1620,13 +1644,19 @@ end
16201644
end
16211645
integrator.stats.nf += num_stages
16221646

1623-
mul!(fw, TI, ks)
1647+
#mul!(fw, TI, ks)
1648+
for i in 1:num_stages
1649+
fw[i] = zero(u)
1650+
for j in 1:num_stages
1651+
fw[i] += TI[i,j] * ks[j]
1652+
end
1653+
end
16241654

16251655
if mass_matrix === I
16261656
Mw = w
16271657
elseif mass_matrix isa UniformScaling
16281658
for i in 1 : num_stages
1629-
mul!(z[i], mass_matrix.λ, w[i])
1659+
mul!(z[i], mass_matrix.λ, w[i])
16301660
end
16311661
Mw = z
16321662
else
@@ -1698,7 +1728,13 @@ end
16981728
end
16991729

17001730
# transform `w` to `z`
1701-
mul!(z, T, w)
1731+
#mul!(z, T, w)
1732+
for i in 1:num_stages
1733+
z[i] = zero(u)
1734+
for j in 1:num_stages
1735+
z[i] += T[i,j] * w[j]
1736+
end
1737+
end
17021738
# check stopping criterion
17031739
iter > 1 &&= θ / (1 - θ))
17041740
if η * ndw < κ && (iter > 1 || iszero(ndw) || !iszero(integrator.success_iter))

0 commit comments

Comments
 (0)