Barry, thank you.
I am not sure if I exactly follow you on this:
“Are you forming the Jacobian for the first and second order cases inside of
Newton?”
The problem that we deal with, heat/mass transfer in heterogeneous systems
(reactor system), is generally small in terms of size, i.e., # of DOFs (several
k to maybe 100k level), so for now, I completely rely on PETSc to compute
Jacobian, i.e., finite-differencing.
That’s a good suggestion to see the time spent during various events.
What motivated me to try the options are the following observations.
2nd order FVM:
Time Step 149, time = 13229.7, dt = 100
NL Step = 0, fnorm = 7.80968E-03
NL Step = 1, fnorm = 7.65731E-03
NL Step = 2, fnorm = 6.85034E-03
NL Step = 3, fnorm = 6.11873E-03
NL Step = 4, fnorm = 1.57347E-03
NL Step = 5, fnorm = 9.03536E-04
Solve Converged!
1st order FVM:
Time Step 149, time = 13229.7, dt = 100
NL Step = 0, fnorm = 7.90072E-03
NL Step = 1, fnorm = 2.01919E-04
NL Step = 2, fnorm = 1.06960E-05
NL Step = 3, fnorm = 2.41683E-09
Solve Converged!
Notice the obvious ‘stagnant’ in residual for the 2nd order method while not in
the 1st order.
For the same problem, the wall time is 10 sec vs 6 sec. I would be happy if I
can reduce 2 sec for the 2nd order method.
-Ling
From: Barry Smith <[email protected]>
Date: Sunday, March 3, 2024 at 12:06 PM
To: Zou, Ling <[email protected]>
Cc: [email protected] <[email protected]>
Subject: Re: [petsc-users] 'Preconditioning' with lower-order method
Are you forming the Jacobian for the first and second order cases inside of
Newton? You can run both with -log_view to see how much time is spent in the
various events (compute function, compute Jacobian, linear solve, .. . ) for
the two cases
ZjQcmQRYFpfptBannerStart
This Message Is From an External Sender
This message came from outside your organization.
ZjQcmQRYFpfptBannerEnd
Are you forming the Jacobian for the first and second order cases inside of
Newton?
You can run both with -log_view to see how much time is spent in the various
events (compute function, compute Jacobian, linear solve, ...) for the two
cases and compare them.
On Mar 3, 2024, at 11:42 AM, Zou, Ling via petsc-users
<[email protected]> wrote:
Original email may have been sent to the incorrect place.
See below.
-Ling
From: Zou, Ling <[email protected]<mailto:[email protected]>>
Date: Sunday, March 3, 2024 at 10:34 AM
To: petsc-users
<[email protected]<mailto:[email protected]>>
Subject: 'Preconditioning' with lower-order method
Hi all,
I am solving a PDE system over a spatial domain. Numerical methods are:
* Finite volume method (both 1st and 2nd order implemented)
* BDF1 and BDF2 for time integration.
What I have noticed is that 1st order FVM converges much faster than 2nd order
FVM, regardless the time integration scheme. Well, not surprising since 2nd
order FVM introduces additional non-linearity.
I’m thinking about two possible ways to speed up 2nd order FVM, and would like
to get some thoughts or community knowledge before jumping into code
implementation.
Say, let the 2nd order FVM residual function be F2(x) = 0; and the 1st order
FVM residual function be F1(x) = 0.
1. Option – 1, multi-step for each time step
Step 1: solving F1(x) = 0 to obtain a temporary solution x1
Step 2: feed x1 as an initial guess to solve F2(x) = 0 to obtain the final
solution.
[Not sure if gain any saving at all]
1. Option -2, dynamically changing residual function F(x)
In pseudo code, would be something like.
snesFormFunction(SNES snes, Vec u, Vec f, void *)
{
if (snes.nl_it_no < 4) // 4 being arbitrary here
f = F1(u);
else
f = F2(u);
}
I know this might be a bit crazy since it may crash after switching residual
function, still, any thoughts?
Best,
-Ling