Sujet : Re: Continuations
De : tkoenig (at) *nospam* netcologne.de (Thomas Koenig)
Groupes : comp.archDate : 18. Jul 2024, 18:06:52
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <v7bi3c$2gk81$1@dont-email.me>
References : 1 2 3 4 5 6 7 8 9 10 11 12 13 14
User-Agent : slrn/1.0.3 (Linux)
Michael S <
already5chosen@yahoo.com> schrieb:
On Thu, 18 Jul 2024 07:54:23 -0000 (UTC)
Thomas Koenig <tkoenig@netcologne.de> wrote:
>
Stephen Fuld <SFuld@alumni.cmu.edu.invalid> schrieb:
[Arrhenius]
Good, I get that. But Thomas' original discussion of the problem
indicated that it was very parallel, so the question is, in your
design, how many of those calculations can go in in parallel?
I ran a little Arrhenius benchmark on an i7-11700. Main program was
program main
implicit none
integer, parameter :: n = 1024
double precision, dimension(n) :: k, a, ea, t
integer :: i
call random_number (a)
call random_number(ea)
ea = 10000+ea*30000
call random_number(t)
t = 400 + 200*t
do i=1,1024*1024
call arrhenius(k,a,ea,t,n)
end do
end program main
and the called routine was (in a separate file, so the compiler
could not notice that the results were actually never used)
subroutine arrhenius(k, a, ea, t, n)
implicit none
integer, intent(in) :: n
double precision, dimension(n), intent(out) :: k
double precision, dimension(n), intent(in) :: a, ea, t
double precision, parameter :: r = 8.314
k = a * exp(-ea/(r*t))
end subroutine arrhenius
Timing result (wall-clock time only):
-O0: 5.343s
-O2: 4.560s
-Ofast: 2.237s
-Ofast -march=native -mtune=native: 2.154
Of course, you kever know what speed your CPU is actually running
at these days, but if I assume 5GHz, that would give around 10
cycles per Arrhenius evaluation, which is quite fast (IMHO).
It uses an AVX2 version of exp, or so I gather from the function
name, _ZGVdN4v_exp_avx2 .
>
Does the benchmark represent a real-world use?
In particular,
1. Is there really a large number of different EA values or only around
dozen or hundred?
Usually, one for each chemical reaction. If you have a complex
reaction network, it can be a few hundred.
It is possible to pre-calculate Ea/R, but the division by T still
needs to be done.
2. Does temperature vary all the time or there are relatively big
groups of points calculated at the same temperature?
It varies all the time because of the exothermic/endothermic
character of the reactions. This is not what was calculated, but you
can think of Methane combusion with oxygen. There are numerous
radical, high-energy species appearing and disappearing all the time.
And if you're unlucky, you will also have to calculate radiation :-(
But for each fluid element, the energy equation is solved again
each time step.
And if you try to average the temperatueres over groups of cells...
don't. You average enough already by selecting the grid, and also by
applying multigrid solvers.
A similar question can be asked about A, but it is of little practical
importance.
3. Is double precision really needed? According to my understanding,
empirical equations like this one have precision of something like 2
significant digits, or 3 digits at best. So I'd expect that single
precision is sufficient with digits to spare.
To calculate values, yes, but if you try to differentiate things,
things can go wrong pretty fast. I'm actually not sure what he used
in this particular case.
There is, however, a tendency with engineers to use double precision
because quite often, you do not go wrong with that, and you can
go wrong with single precision.
A lot of numerical work in general, and CFD work in particular,
consists of fighting for convergence. You usually don't want to
change anything that would endanger that.
4. Dies the equation work at all when the temperature is not close to
the point of equilibrium ? If not, what is a sane range for ea/(r*t) ?
It does work far away from the equilibrium (which is the point).