51 call shift_table_to_code(
eos%neOnH, .false., 0.d0)
54 if (
allocated(
eos%p2eint%table))
then
55 call shift_table_to_code(
eos%p2eint, .false., 0.d0)
65 if (.not.
allocated(
eos%gamma1%table))
then
66 call build_gamma1_table()
68 if (
mype == 0)
write(*,
'(A)')
" Using loaded gamma1 table (skip rebuild)"
71 call shift_table_to_code(
eos%gamma1, .false., 0.d0)
77 if (.not.
allocated(
eos%p2eint%table))
then
78 call build_p2eint_table()
80 if (
mype == 0)
write(*,
'(A)')
" Using loaded p2eint table (skip rebuild)"
84 call build_gamma1_p_table()
85 call build_log_p_table()
86 call build_p_over_nh_table()
88 if (.not.
allocated(
eos%eint_from_T%table))
then
89 call build_eint_from_t_table()
91 if (
mype == 0)
write(*,
'(A)')
" Using loaded eint_from_T table (skip rebuild)"
94 call shift_table_to_code(
eos%eint_from_T, .true., &
118 call build_interleaved_eint_table()
137 if (
eos%ionE)
call verify_eos_round_trips()
149 subroutine shift_table_to_code(tc, axis2_is_T, value_shift)
151 logical,
intent(in) :: axis2_is_t
152 double precision,
intent(in) :: value_shift
153 double precision :: a1, a2
160 tc%var1_min = tc%var1_min - a1
161 tc%var1_max = tc%var1_max - a1
162 tc%var2_min = tc%var2_min - a2
163 tc%var2_max = tc%var2_max - a2
164 if (value_shift /= 0.d0) tc%table = tc%table - value_shift
165 if (.not. tc%is_uniform)
then
166 tc%var1_nodes = tc%var1_nodes - a1
167 tc%var2_nodes = tc%var2_nodes - a2
170 end subroutine shift_table_to_code
174 double precision function gamma1_from_nh_eint(log_nH, log_eint_nH)
result(g1)
175 double precision,
intent(in) :: log_nh, log_eint_nh
177 end function gamma1_from_nh_eint
191 subroutine build_gamma1_table()
192 integer :: n1, n2, i, j, im, ip, jm, jp
193 double precision :: x1, x2
194 double precision,
allocatable :: log_p(:,:)
195 double precision :: t_val, y_val, p_val, eint_vol
196 double precision :: a_val, b_val, g1_val
197 double precision :: g1_min, g1_max
206 eos%gamma1%var1_min =
eos%T%var1_min
207 eos%gamma1%var1_max =
eos%T%var1_max
208 eos%gamma1%var2_min =
eos%T%var2_min
209 eos%gamma1%var2_max =
eos%T%var2_max
210 eos%gamma1%filename =
'computed_gamma1'
211 eos%gamma1%is_uniform =
eos%T%is_uniform
212 if (
allocated(
eos%gamma1%var1_nodes))
deallocate(
eos%gamma1%var1_nodes)
213 if (
allocated(
eos%gamma1%var2_nodes))
deallocate(
eos%gamma1%var2_nodes)
214 allocate(
eos%gamma1%var1_nodes(n1));
eos%gamma1%var1_nodes =
eos%T%var1_nodes
215 allocate(
eos%gamma1%var2_nodes(n2));
eos%gamma1%var2_nodes =
eos%T%var2_nodes
217 if (
allocated(
eos%gamma1%table))
deallocate(
eos%gamma1%table)
218 allocate(
eos%gamma1%table(n1, n2))
219 allocate(log_p(n1, n2))
224 x2 =
eos%T%var2_nodes(j)
226 x1 =
eos%T%var1_nodes(i)
227 t_val = 10.0d0**
eos%T%table(i, j)
228 y_val = 10.0d0**
eos%neOnH%table(i, j)
230 log_p(i, j) = x1 +
eos%T%table(i, j) + dlog10(1.0d0 +
eos%He_abundance + y_val)
240 x2 =
eos%T%var2_nodes(j)
242 x1 =
eos%T%var1_nodes(i)
251 t_val = 10.0d0**
eos%T%table(i, j)
252 y_val = 10.0d0**
eos%neOnH%table(i, j)
253 eint_vol = 10.0d0**x2
254 p_val = t_val * (1.0d0 +
eos%He_abundance + y_val)
256 if (
eos%gamma1_method ==
'effective')
then
258 g1_val = 1.0d0 + p_val / eint_vol
262 a_val = (log_p(ip, j) - log_p(im, j)) &
263 / (
eos%T%var1_nodes(ip) -
eos%T%var1_nodes(im))
265 b_val = (log_p(i, jp) - log_p(i, jm)) &
266 / (
eos%T%var2_nodes(jp) -
eos%T%var2_nodes(jm))
267 g1_val = a_val + b_val * (p_val / eint_vol)
271 g1_val = max(1.001d0, min(g1_val, 5.0d0/3.0d0))
273 eos%gamma1%table(i, j) = g1_val
275 g1_min = min(g1_min, g1_val)
276 g1_max = max(g1_max, g1_val)
283 write(*,
'(A,A,A,F8.4,A,F8.4)') &
284 ' Gamma1 table built (', trim(
eos%gamma1_method),
'): min = ', &
285 g1_min,
', max = ', g1_max
288 end subroutine build_gamma1_table
296 subroutine build_log_p_table()
297 integer :: n1, n2, i, j
298 double precision :: log_nh, log_eint_nh, t_val, y_val
305 eos%log_p%var1_min =
eos%T%var1_min
306 eos%log_p%var1_max =
eos%T%var1_max
307 eos%log_p%var2_min =
eos%T%var2_min
308 eos%log_p%var2_max =
eos%T%var2_max
309 eos%log_p%is_uniform =
eos%T%is_uniform
310 if (
allocated(
eos%log_p%var1_nodes))
deallocate(
eos%log_p%var1_nodes)
311 if (
allocated(
eos%log_p%var2_nodes))
deallocate(
eos%log_p%var2_nodes)
312 allocate(
eos%log_p%var1_nodes(n1));
eos%log_p%var1_nodes =
eos%T%var1_nodes
313 allocate(
eos%log_p%var2_nodes(n2));
eos%log_p%var2_nodes =
eos%T%var2_nodes
315 if (
allocated(
eos%log_p%table))
deallocate(
eos%log_p%table)
316 allocate(
eos%log_p%table(n1, n2))
320 t_val =
eos%T%table(i, j)
321 y_val =
eos%neOnH%table(i, j)
322 eos%log_p%table(i, j) = dlog10(10.0d0**t_val &
323 * (1.0d0 +
eos%He_abundance + 10.0d0**y_val))
328 write(*,
'(A,I4,A,I4)') &
329 ' Merged log_p table built: ', n1,
' x ', n2
332 end subroutine build_log_p_table
337 subroutine build_p_over_nh_table()
338 integer :: n1, n2, i, j
339 double precision :: t_val, y_val, p_nh_val
340 double precision :: p_min, p_max
345 eos%p_over_nH%dim1 = n1
346 eos%p_over_nH%dim2 = n2
347 eos%p_over_nH%var1_min =
eos%T%var1_min
348 eos%p_over_nH%var1_max =
eos%T%var1_max
349 eos%p_over_nH%var2_min =
eos%T%var2_min
350 eos%p_over_nH%var2_max =
eos%T%var2_max
351 eos%p_over_nH%filename =
'computed_p_over_nH'
352 eos%p_over_nH%is_uniform =
eos%T%is_uniform
353 if (
allocated(
eos%p_over_nH%var1_nodes))
deallocate(
eos%p_over_nH%var1_nodes)
354 if (
allocated(
eos%p_over_nH%var2_nodes))
deallocate(
eos%p_over_nH%var2_nodes)
355 allocate(
eos%p_over_nH%var1_nodes(n1));
eos%p_over_nH%var1_nodes =
eos%T%var1_nodes
356 allocate(
eos%p_over_nH%var2_nodes(n2));
eos%p_over_nH%var2_nodes =
eos%T%var2_nodes
358 if (
allocated(
eos%p_over_nH%table))
deallocate(
eos%p_over_nH%table)
359 allocate(
eos%p_over_nH%table(n1, n2))
367 t_val = 10.0d0**
eos%T%table(i, j)
368 y_val = 10.0d0**
eos%neOnH%table(i, j)
370 p_nh_val = (1.0d0 +
eos%He_abundance + y_val) * t_val
372 eos%p_over_nH%table(i, j) = dlog10(p_nh_val)
373 p_min = min(p_min, p_nh_val)
374 p_max = max(p_max, p_nh_val)
381 write(*,
'(A,ES10.3,A,ES10.3)') &
382 ' p/nH table built: min = ', p_min,
', max = ', p_max
385 end subroutine build_p_over_nh_table
391 subroutine build_interleaved_eint_table()
392 integer :: n1, n2, i, j
397 if (
allocated(
eos%table_eint_il))
deallocate(
eos%table_eint_il)
398 allocate(
eos%table_eint_il(3, n1, n2))
402 eos%table_eint_il(1, i, j) =
eos%T%table(i, j)
403 eos%table_eint_il(2, i, j) =
eos%neOnH%table(i, j)
404 eos%table_eint_il(3, i, j) =
eos%p_over_nH%table(i, j)
409 write(*,
'(A,I0,A,I0,A,I0,A,F6.1,A)') &
410 ' Interleaved table built: ', 3,
' x ', n1,
' x ', n2, &
411 ' (', 3.0d0*n1*n2*8.0d0/1024.0d0,
' KB)'
414 end subroutine build_interleaved_eint_table
420 subroutine build_gamma1_p_table()
421 integer :: n1, n2, i, j
422 double precision :: log_nh, log_p_nh
423 double precision :: p2eint_ratio, log_eint_nh
424 double precision :: g1_val, g1_min, g1_max
431 eos%gamma1_p%dim1 = n1
432 eos%gamma1_p%dim2 = n2
433 eos%gamma1_p%var1_min =
eos%p2eint%var1_min
434 eos%gamma1_p%var1_max =
eos%p2eint%var1_max
435 eos%gamma1_p%var2_min =
eos%p2eint%var2_min
436 eos%gamma1_p%var2_max =
eos%p2eint%var2_max
437 eos%gamma1_p%filename =
'computed_gamma1_p'
438 eos%gamma1_p%is_uniform =
eos%p2eint%is_uniform
439 if (
allocated(
eos%gamma1_p%var1_nodes))
deallocate(
eos%gamma1_p%var1_nodes)
440 if (
allocated(
eos%gamma1_p%var2_nodes))
deallocate(
eos%gamma1_p%var2_nodes)
441 allocate(
eos%gamma1_p%var1_nodes(n1));
eos%gamma1_p%var1_nodes =
eos%p2eint%var1_nodes
442 allocate(
eos%gamma1_p%var2_nodes(n2));
eos%gamma1_p%var2_nodes =
eos%p2eint%var2_nodes
444 if (
allocated(
eos%gamma1_p%table))
deallocate(
eos%gamma1_p%table)
445 allocate(
eos%gamma1_p%table(n1, n2))
451 log_p_nh =
eos%p2eint%var2_nodes(j)
453 log_nh =
eos%p2eint%var1_nodes(i)
458 p2eint_ratio =
eos%p2eint%table(i, j)
459 log_eint_nh = log_p_nh + dlog10(p2eint_ratio)
462 g1_val = gamma1_from_nh_eint(log_nh, log_eint_nh)
464 eos%gamma1_p%table(i, j) = g1_val
466 g1_min = min(g1_min, g1_val)
467 g1_max = max(g1_max, g1_val)
472 write(*,
'(A,F8.4,A,F8.4)') &
473 ' Gamma1_p table built (pressure-indexed): min = ', g1_min,
', max = ', g1_max
476 end subroutine build_gamma1_p_table
485 subroutine build_p2eint_table()
486 integer :: n1, n2_fwd, n2_p, i, j, iter
487 double precision :: log_nh_i, log_eint_lo, log_eint_hi, log_eint_mid
488 double precision :: log_p_target, log_p_eval
489 double precision :: t_val, y_val
490 double precision :: p_global_min, p_global_max
491 double precision :: dx_p, log_p_nh_ij
492 double precision :: max_err, err
493 double precision :: log_p_lo_i, log_p_hi_i
494 integer :: i_worst, j_worst
496 if (
mype == 0)
write(*,*)
'Building p2eint table from forward tables...'
502 p_global_min = 1.0d30
503 p_global_max = -1.0d30
506 t_val = 10.0d0**
eos%T%table(i, j)
507 y_val = 10.0d0**
eos%neOnH%table(i, j)
508 log_p_nh_ij = dlog10(t_val * (1.0d0 +
eos%He_abundance + y_val))
509 p_global_min = min(p_global_min, log_p_nh_ij)
510 p_global_max = max(p_global_max, log_p_nh_ij)
517 p_global_min = p_global_min - 0.2d0
518 p_global_max = p_global_max + 0.2d0
521 if (
allocated(
eos%p2eint%table))
deallocate(
eos%p2eint%table)
523 eos%p2eint%dim2 = n2_p
524 eos%p2eint%var1_min =
eos%T%var1_min
525 eos%p2eint%var1_max =
eos%T%var1_max
526 eos%p2eint%var2_min = p_global_min
527 eos%p2eint%var2_max = p_global_max
528 eos%p2eint%filename =
'computed_p2eint'
532 eos%p2eint%is_uniform =
eos%T%is_uniform
533 if (
allocated(
eos%p2eint%var1_nodes))
deallocate(
eos%p2eint%var1_nodes)
534 if (
allocated(
eos%p2eint%var2_nodes))
deallocate(
eos%p2eint%var2_nodes)
535 allocate(
eos%p2eint%var1_nodes(n1));
eos%p2eint%var1_nodes =
eos%T%var1_nodes
536 allocate(
eos%p2eint%var2_nodes(n2_p))
538 eos%p2eint%var2_nodes(j) = p_global_min &
539 + (j - 1) * (p_global_max - p_global_min) / dble(n2_p - 1)
541 allocate(
eos%p2eint%table(n1, n2_p))
543 dx_p = (p_global_max - p_global_min) / dble(n2_p - 1)
551 log_nh_i =
eos%T%var1_nodes(i)
556 log_p_lo_i = dlog10(10.0d0**t_val &
557 * (1.0d0 +
eos%He_abundance + 10.0d0**y_val))
560 log_p_hi_i = dlog10(10.0d0**t_val &
561 * (1.0d0 +
eos%He_abundance + 10.0d0**y_val))
564 log_p_target = p_global_min + (j - 1) * dx_p
568 if (log_p_target <= log_p_lo_i)
then
569 eos%p2eint%table(i, j) = 10.0d0**(
eos%T%var2_min - log_p_target)
571 else if (log_p_target >= log_p_hi_i)
then
572 eos%p2eint%table(i, j) = 10.0d0**(
eos%T%var2_max - log_p_target)
577 log_eint_lo =
eos%T%var2_min
578 log_eint_hi =
eos%T%var2_max
581 log_eint_mid = 0.5d0 * (log_eint_lo + log_eint_hi)
586 log_p_eval = dlog10(10.0d0**t_val &
587 * (1.0d0 +
eos%He_abundance + 10.0d0**y_val))
589 if (log_p_eval < log_p_target)
then
590 log_eint_lo = log_eint_mid
592 log_eint_hi = log_eint_mid
595 if (dabs(log_eint_hi - log_eint_lo) < 1.0
d-14)
exit
598 eos%p2eint%table(i, j) = 10.0d0**(log_eint_mid - log_p_target)
601 err = dabs(log_p_eval - log_p_target)
602 if (err > max_err)
then
611 write(*,
'(A,ES10.3,A,I4,A,I4)') &
612 ' p2eint table built: max bisection err = ', max_err, &
613 ' at (i,j)=(', i_worst,
',', j_worst,
')'
614 write(*,
'(A,F8.4,A,F8.4)') &
615 ' log10(p/nH) range = ', p_global_min,
' to ', p_global_max
618 end subroutine build_p2eint_table
625 subroutine build_eint_from_t_table()
626 integer :: n1, n2_fwd, n2_inv, i, j, iter
627 double precision :: dx2_inv
628 double precision :: t_global_min, t_global_max, t_fi_threshold
629 double precision :: log_nh_i, log_eint_lo, log_eint_hi, log_eint_mid
630 double precision :: t_target, t_eval, t_max_at_nh, eint_nh_fi
631 double precision :: eint_nh_min, eint_nh_max, max_err, err
632 integer :: n_fi_filled
638 t_global_min = 1.0d30
639 t_global_max = -1.0d30
642 t_global_min = min(t_global_min,
eos%T%table(i, j))
643 t_global_max = max(t_global_max,
eos%T%table(i, j))
648 t_fi_threshold =
eos%p_rho_FI_threshold &
649 * (1.0d0 + 4.0d0*
eos%He_abundance) /
eos%n_per_nH_FI
656 if (
allocated(
eos%eint_from_T%table))
deallocate(
eos%eint_from_T%table)
657 eos%eint_from_T%dim1 = n1
658 eos%eint_from_T%dim2 = n2_inv
659 eos%eint_from_T%var1_min =
eos%T%var1_min
660 eos%eint_from_T%var1_max =
eos%T%var1_max
661 eos%eint_from_T%var2_min = t_global_min
662 eos%eint_from_T%var2_max = t_global_max
663 eos%eint_from_T%filename =
'computed_eint_from_T'
666 eos%eint_from_T%is_uniform =
eos%T%is_uniform
667 if (
allocated(
eos%eint_from_T%var1_nodes))
deallocate(
eos%eint_from_T%var1_nodes)
668 if (
allocated(
eos%eint_from_T%var2_nodes))
deallocate(
eos%eint_from_T%var2_nodes)
669 allocate(
eos%eint_from_T%var1_nodes(n1));
eos%eint_from_T%var1_nodes =
eos%T%var1_nodes
670 allocate(
eos%eint_from_T%var2_nodes(n2_inv))
672 eos%eint_from_T%var2_nodes(j) = t_global_min &
673 + (j - 1) * (t_global_max - t_global_min) / dble(n2_inv - 1)
676 allocate(
eos%eint_from_T%table(n1, n2_inv))
678 dx2_inv = (t_global_max - t_global_min) / dble(n2_inv - 1)
681 eint_nh_max = -1.0d30
688 log_nh_i =
eos%T%var1_nodes(i)
691 t_max_at_nh =
eos%T%table(i, n2_fwd)
694 t_target = t_global_min + (j - 1) * dx2_inv
696 if (10.0d0**t_target > t_fi_threshold .or. &
697 t_target > t_max_at_nh)
then
700 eint_nh_fi =
eos%n_per_nH_FI *
eos%inv_gamma_minus_1 &
702 if (
eos%ionE) eint_nh_fi = eint_nh_fi &
703 +
eos%neOnH_FI *
eos%eion_per_nH
704 eos%eint_from_T%table(i, j) = dlog10(eint_nh_fi)
705 n_fi_filled = n_fi_filled + 1
708 log_eint_lo =
eos%T%var2_min
709 log_eint_hi =
eos%T%var2_max
712 log_eint_mid = 0.5d0 * (log_eint_lo + log_eint_hi)
716 if (t_eval < t_target)
then
717 log_eint_lo = log_eint_mid
719 log_eint_hi = log_eint_mid
722 if (dabs(log_eint_hi - log_eint_lo) < 1.0
d-14)
exit
725 eos%eint_from_T%table(i, j) = log_eint_mid
727 err = dabs(t_eval - t_target)
728 max_err = max(max_err, err)
731 eint_nh_min = min(eint_nh_min,
eos%eint_from_T%table(i, j))
732 eint_nh_max = max(eint_nh_max,
eos%eint_from_T%table(i, j))
737 write(*,
'(A,ES10.3,A,I0,A,I0)') &
738 ' Inverse T table built: max bisection err = ', max_err, &
739 ', FI-filled = ', n_fi_filled,
' / ', n1*n2_inv
740 write(*,
'(A,F8.4,A,F8.4)') &
741 ' log10(T) range = ', t_global_min,
' to ', t_global_max
742 write(*,
'(A,F8.4,A,F8.4)') &
743 ' log10(eint/nH) range = ', eint_nh_min,
' to ', eint_nh_max
746 end subroutine build_eint_from_t_table
751 subroutine verify_eos_round_trips()
752 integer :: n1, n2, i, j, n_tested
753 double precision :: log_nh, log_eint_nh
754 double precision :: dx1, dx2
755 double precision :: t_val, y_val, log_p_nh, p2eint_val, log_eint_recovered
756 double precision :: t_recovered, p_from_ty, log_p_recovered
757 double precision :: eint_from_t_val, log_eint_from_t_recovered
758 double precision :: err_p, err_eint_t
759 double precision :: max_err_p, max_err_eint_t, mean_err_p, mean_err_eint_t
760 double precision :: log_nh_worst_p, log_eint_worst_p
764 dx1 = (
eos%T%var1_max -
eos%T%var1_min) / dble(n1 - 1)
765 dx2 = (
eos%T%var2_max -
eos%T%var2_min) / dble(n2 - 1)
768 max_err_eint_t = 0.0d0
770 mean_err_eint_t = 0.0d0
776 log_nh =
eos%T%var1_min + (dble(i) - 0.5d0) * dx1
778 log_eint_nh =
eos%T%var2_min + (dble(j) - 0.5d0) * dx2
779 n_tested = n_tested + 1
786 log_p_nh = dlog10(10.0d0**t_val &
787 * (1.0d0 +
eos%He_abundance + 10.0d0**y_val))
790 log_eint_recovered = log_p_nh + dlog10(p2eint_val)
792 err_p = dabs(log_eint_recovered - log_eint_nh)
793 mean_err_p = mean_err_p + err_p
794 if (err_p > max_err_p)
then
796 log_nh_worst_p = log_nh
797 log_eint_worst_p = log_eint_nh
803 err_eint_t = dabs(eint_from_t_val - log_eint_nh)
804 mean_err_eint_t = mean_err_eint_t + err_eint_t
808 mean_err_p = mean_err_p / dble(max(n_tested, 1))
809 mean_err_eint_t = mean_err_eint_t / dble(max(n_tested, 1))
812 write(*,
'(A)')
' === EoS round-trip verification (off-grid points) ==='
813 write(*,
'(A,I6,A)')
' Tested ', n_tested,
' points (half-cell offsets)'
814 write(*,
'(A,ES10.3,A,ES10.3)') &
815 ' p round-trip: max err = ', max_err_p, &
816 ' mean err = ', mean_err_p
817 write(*,
'(A,F8.4,A,F8.4)') &
818 ' worst at log_nH = ', log_nh_worst_p, &
819 ', log_eint = ', log_eint_worst_p
820 write(*,
'(A,ES10.3,A,ES10.3)') &
821 ' T round-trip: max err = ', max_err_eint_t, &
822 ' mean err = ', mean_err_eint_t
823 write(*,
'(A)')
' ====================================================='
826 end subroutine verify_eos_round_trips
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
EoS state container – the single thermodynamic authority for AMRVAC.
type(eos_container), allocatable, public eos
The single EoS state object, allocated in eos_init and shared (read-mostly) across all EoS sub-module...
Interpolation kernels for the EoS tables (pure math; no EoS state).
pure double precision function, public bicubic_lookup(var1, var2, tc)
Dispatch wrapper: bicubic lookup that branches on the table's is_uniform flag. Hides the uniform-vs-a...
subroutine, public precompute_step_inv(tc)
'state' method (eos_method='state', legacy 'tables') of the LTE EoS family.
subroutine, public finalise_state_lte()
Table-based method finalise: shift the loaded T/neOnH (and ionE-derived) tables to code units,...
subroutine, public load_state_lte()
state arms of the eos_init / eos_finalise dispatchers (mod_eos_LTE)
Shared LTE lookup-table infrastructure (build/IO; not on the hot path).
subroutine, public try_load_tables_lte(fieldname)
Attempt to load pre-computed table from binary file. If the file does not exist, silently skip and th...
subroutine, public eos_validate_table(tc, name)
Defensive consistency check for one table after init. Aborts with a diagnostic message if any silent-...
subroutine, public load_tables_lte(fieldname)
Read one named table file into its eos% container. The filename encodes the composition (H or HHe) an...
subroutine, public ensure_axis_nodes(tc)
Ensure tcvar1_nodes / tcvar2_nodes are allocated and populated so that build_*_table routines and oth...
subroutine, public eos_build_guards(tc)
Build guard (bucket) arrays so that adaptive index lookup is O(1). No-op for uniform tables....
subroutine, public precompute_fi_bypass_constants()
This module contains definitions of global parameters and variables and some generic functions/subrou...
double precision unit_numberdensity
Physical scaling factor for number density.
double precision unit_pressure
Physical scaling factor for pressure.
integer mype
The rank of the current MPI task.
double precision, dimension(:), allocatable, parameter d
double precision unit_temperature
Physical scaling factor for temperature.