Line data Source code
1 : ! ***********************************************************************
2 : !
3 : ! Copyright (C) 2009-2019 Bill Paxton, Frank Timmes & The MESA Team
4 : !
5 : ! This program is free software: you can redistribute it and/or modify
6 : ! it under the terms of the GNU Lesser General Public License
7 : ! as published by the Free Software Foundation,
8 : ! either version 3 of the License, or (at your option) any later version.
9 : !
10 : ! This program is distributed in the hope that it will be useful,
11 : ! but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 : ! See the GNU Lesser General Public License for more details.
14 : !
15 : ! You should have received a copy of the GNU Lesser General Public License
16 : ! along with this program. If not, see <https://www.gnu.org/licenses/>.
17 : !
18 : ! ***********************************************************************
19 :
20 : module test_net_support
21 :
22 : use chem_def
23 : use chem_lib, only: chem_init
24 : use math_lib
25 : use net_def
26 : use net_lib
27 : use const_def
28 : use rates_def
29 : use test_net_do_one
30 : use utils_lib, only: mesa_error
31 :
32 : implicit none
33 :
34 : integer, parameter :: max_files = 20, max_cnt = 100000
35 :
36 : character(len=256) :: cache_suffix
37 : integer :: num_reactions
38 :
39 : integer, dimension(:), pointer :: net_iso, chem_id, isos_to_show
40 :
41 : integer, pointer :: reaction_table(:)
42 : integer, pointer :: rates_to_show(:)
43 :
44 : real(dp), dimension(:), pointer :: rho_vector, T_vector
45 :
46 : integer :: nrates_to_show, nisos_to_show, net_handle
47 :
48 : contains
49 :
50 14 : subroutine do_test_net(do_plots, symbolic)
51 : logical, intent(in) :: do_plots, symbolic
52 14 : call set_composition(species, xin)
53 14 : eta = 0
54 14 : if (do_plots) then
55 0 : call Create_Plot_Files(species, xin)
56 : else
57 14 : call Do_One_Net(symbolic)
58 : end if
59 14 : end subroutine do_test_net
60 :
61 2 : subroutine load_libs
62 : use const_lib, only: const_init
63 : use const_def, only: mesa_dir
64 : use chem_lib
65 : use rates_lib, only: rates_init, rates_warning_init
66 : integer :: ierr
67 : character(len=64) :: my_mesa_dir
68 :
69 2 : my_mesa_dir = '../..'
70 2 : call const_init(my_mesa_dir, ierr)
71 2 : if (ierr /= 0) then
72 0 : write (*, *) 'const_init failed'
73 0 : call mesa_error(__FILE__, __LINE__)
74 : end if
75 :
76 2 : call math_init()
77 :
78 2 : ierr = 0
79 2 : call chem_init('isotopes.data', ierr)
80 2 : if (ierr /= 0) then
81 0 : write (*, *) 'chem_init failed'
82 0 : call mesa_error(__FILE__, __LINE__)
83 : end if
84 :
85 : call rates_init('reactions.list', '', 'rate_tables', .false., .false., &
86 2 : '', '', '', ierr)
87 2 : if (ierr /= 0) call mesa_error(__FILE__, __LINE__)
88 :
89 2 : call rates_warning_init(.true., 10d0)
90 :
91 2 : end subroutine load_libs
92 :
93 14 : subroutine test_net_setup(net_file_in)
94 : character(len=*), intent(in) :: net_file_in
95 : type(Net_General_Info), pointer :: g
96 :
97 : integer :: info, ierr
98 :
99 : include 'formats'
100 :
101 14 : net_file = net_file_in
102 :
103 14 : allocate (net_iso(num_chem_isos), isos_to_show(num_chem_isos), chem_id(num_chem_isos))
104 :
105 14 : call net_init(ierr)
106 14 : if (ierr /= 0) call mesa_error(__FILE__, __LINE__)
107 :
108 14 : net_handle = alloc_net_handle(ierr)
109 14 : if (ierr /= 0) then
110 0 : write (*, *) 'alloc_net_handle failed'
111 0 : call mesa_error(__FILE__, __LINE__)
112 : end if
113 :
114 14 : call net_start_def(net_handle, ierr)
115 14 : if (ierr /= 0) then
116 0 : write (*, *) 'net_start_def failed'
117 0 : call mesa_error(__FILE__, __LINE__)
118 : end if
119 :
120 14 : call read_net_file(net_file, net_handle, ierr)
121 14 : if (ierr /= 0) then
122 0 : write (*, *) 'read_net_file failed ', trim(net_file)
123 0 : call mesa_error(__FILE__, __LINE__)
124 : end if
125 :
126 14 : call net_finish_def(net_handle, ierr)
127 14 : if (ierr /= 0) then
128 0 : write (*, *) 'net_finish_def failed'
129 0 : call mesa_error(__FILE__, __LINE__)
130 : end if
131 :
132 14 : allocate (reaction_id(rates_reaction_id_max), reaction_table(rates_reaction_id_max))
133 14 : allocate (rates_to_show(rates_reaction_id_max))
134 :
135 14 : cache_suffix = ''
136 14 : call net_setup_tables(net_handle, cache_suffix, info)
137 14 : if (ierr /= 0) then
138 0 : write (*, *) 'net_setup_tables failed'
139 0 : call mesa_error(__FILE__, __LINE__)
140 : end if
141 :
142 14 : call net_ptr(net_handle, g, ierr)
143 14 : if (ierr /= 0) then
144 0 : write (*, *) 'net_ptr failed'
145 0 : call mesa_error(__FILE__, __LINE__)
146 : end if
147 :
148 14 : species = g%num_isos
149 14 : num_reactions = g%num_reactions
150 :
151 14 : call get_chem_id_table(net_handle, species, chem_id, ierr)
152 14 : if (ierr /= 0) then
153 0 : write (*, *) 'get_chem_id_table failed'
154 0 : call mesa_error(__FILE__, __LINE__)
155 : end if
156 :
157 14 : call get_net_iso_table(net_handle, net_iso, ierr)
158 14 : if (ierr /= 0) then
159 0 : write (*, *) 'get_net_iso_table failed'
160 0 : call mesa_error(__FILE__, __LINE__)
161 : end if
162 :
163 14 : call get_reaction_id_table(net_handle, num_reactions, reaction_id, ierr)
164 14 : if (ierr /= 0) then
165 0 : write (*, *) 'get_reaction_id_table failed'
166 0 : call mesa_error(__FILE__, __LINE__)
167 : end if
168 :
169 14 : call get_net_reaction_table(net_handle, reaction_table, ierr)
170 14 : if (ierr /= 0) then
171 0 : write (*, *) 'get_net_reaction_table failed'
172 0 : call mesa_error(__FILE__, __LINE__)
173 : end if
174 :
175 14 : call do_test_net_alloc(species)
176 :
177 100 : end subroutine test_net_setup
178 :
179 14 : subroutine do_test_net_alloc(species)
180 : integer, intent(in) :: species
181 : allocate ( &
182 : xin(species), xin_copy(species), d_eps_nuc_dx(species), dxdt(species), &
183 14 : d_dxdt_dRho(species), d_dxdt_dT(species), d_dxdt_dx(species, species))
184 14 : end subroutine do_test_net_alloc
185 :
186 14 : subroutine Do_One_Net(symbolic)
187 : logical, intent(in) :: symbolic
188 14 : call do1_net(net_handle, symbolic)
189 14 : end subroutine Do_One_Net
190 :
191 4 : subroutine Setup_eos(handle)
192 : ! allocate and load the eos tables
193 : use eos_def
194 : use eos_lib
195 : integer, intent(out) :: handle
196 : integer :: ierr
197 : logical, parameter :: use_cache = .true.
198 4 : call eos_init('', use_cache, ierr)
199 4 : if (ierr /= 0) then
200 0 : write (*, *) 'eos_init failed in Setup_eos'
201 0 : call mesa_error(__FILE__, __LINE__)
202 : end if
203 4 : handle = alloc_eos_handle(ierr)
204 4 : if (ierr /= 0) then
205 0 : write (*, *) 'failed trying to allocate eos handle'
206 0 : call mesa_error(__FILE__, __LINE__)
207 : end if
208 4 : end subroutine Setup_eos
209 :
210 14 : subroutine test_net_cleanup
211 14 : call do_test_net_cleanup
212 14 : call free_net_handle(net_handle)
213 4 : end subroutine test_net_cleanup
214 :
215 14 : subroutine do_test_net_cleanup
216 14 : deallocate (xin)
217 14 : deallocate (d_eps_nuc_dx)
218 14 : deallocate (dxdt)
219 14 : deallocate (d_dxdt_dRho)
220 14 : deallocate (d_dxdt_dT)
221 14 : deallocate (d_dxdt_dx)
222 14 : end subroutine do_test_net_cleanup
223 :
224 12 : subroutine change_net(new_net_file)
225 : character(len=*), intent(in) :: new_net_file
226 12 : call test_net_cleanup
227 12 : call test_net_setup(new_net_file)
228 12 : end subroutine change_net
229 :
230 0 : subroutine Create_Plot_Files(species, xin)
231 : use utils_lib, only: mkdir
232 : integer, intent(in) :: species
233 : real(dp) :: xin(species)
234 0 : type(net_info) :: n
235 :
236 : integer:: i, j, k, ierr, num_reactions
237 0 : real(dp) :: T, logT, logT_min, logT_max
238 0 : real(dp) :: logRho_min, logRho_max, dlogT, dlogRho
239 : integer :: logT_points, logRho_points
240 : integer :: io, io_first, io_last, io_rho, io_tmp, io_params, num_out
241 : character(len=256) :: fname, dir
242 :
243 0 : real(dp), allocatable :: output_values(:, :, :)
244 : type(Net_General_Info), pointer :: g
245 :
246 : ! full range
247 0 : logT_max = 9.1d0
248 0 : logT_min = 6d0
249 0 : logRho_min = -3d0
250 0 : logRho_max = 10d0
251 :
252 : ! oxygen burning range
253 0 : logT_max = 9.5d0
254 0 : logT_min = 8d0
255 0 : logRho_min = -3d0
256 0 : logRho_max = 12d0
257 :
258 : ! test FL
259 0 : logT_max = 9d0
260 0 : logT_min = 7d0
261 0 : logRho_min = 5d0
262 0 : logRho_max = 10.2d0
263 :
264 : ! test FL
265 0 : logT_max = 8.4d0
266 0 : logT_min = 7.8d0
267 0 : logRho_min = 2d0
268 0 : logRho_max = 6d0
269 :
270 : ! test C+C
271 0 : logT_max = 10d0
272 0 : logT_min = 7.5d0
273 0 : logRho_min = 6d0
274 0 : logRho_max = 12d0
275 :
276 0 : logT_points = 251
277 0 : logRho_points = 251
278 :
279 0 : dir = 'plot_data'
280 0 : call mkdir(dir)
281 0 : write (*, *) trim(dir)
282 :
283 : 01 format(E30.22)
284 :
285 0 : dlogT = (logT_max - logT_min)/(logT_points - 1)
286 0 : dlogRho = (logRho_max - logRho_min)/(logRho_points - 1)
287 :
288 0 : io_params = 40
289 0 : io_rho = 41
290 0 : io_tmp = 42
291 0 : io_first = 43
292 :
293 0 : fname = trim(dir)//'/'//'params.data'
294 0 : open (unit=io_params, file=trim(fname))
295 0 : write (io_params, '(6f16.6)') &
296 0 : xin(net_iso(ih1)), xin(net_iso(ihe4)), xin(net_iso(ic12)), &
297 0 : xin(net_iso(in14)), xin(net_iso(io16))
298 0 : close (io_params)
299 :
300 0 : fname = trim(dir)//'/'//'rho.data'
301 0 : open (unit=io_rho, file=trim(fname))
302 :
303 0 : fname = trim(dir)//'/'//'tmp.data'
304 0 : open (unit=io_tmp, file=trim(fname))
305 :
306 0 : io = io_first - 1
307 0 : io_last = Open_Files(io, dir)
308 0 : num_out = io_last - io_first + 1
309 :
310 0 : call get_net_ptr(net_handle, g, ierr)
311 0 : if (ierr /= 0) return
312 :
313 0 : num_reactions = g%num_reactions
314 :
315 0 : allocate (output_values(logRho_points, logT_points, num_out))
316 :
317 : !xx$OMP PARALLEL DO PRIVATE(logT, T, j)
318 0 : do j = 1, logT_points
319 0 : logT = logT_min + dlogT*(j - 1)
320 0 : T = exp10(logT)
321 :
322 : call do_inner_loop(species, num_reactions, logT, T, j, output_values, n, xin, &
323 0 : logRho_points, logRho_min, dlogRho)
324 :
325 : end do
326 : !xx$OMP END PARALLEL DO
327 :
328 0 : write (*, *) 'write the files'
329 :
330 : ! write out the results
331 0 : do j = 1, logRho_points
332 0 : write (io_rho, 01) logRho_min + dlogRho*(j - 1)
333 : end do
334 0 : close (io_rho)
335 :
336 0 : do i = 1, logT_points
337 0 : write (io_tmp, 01) logT_min + dlogT*(i - 1)
338 : end do
339 0 : close (io_tmp)
340 :
341 0 : !$OMP PARALLEL DO PRIVATE(k)
342 : do k = 1, num_out
343 : write (*, *) k
344 : write (io_first + k - 1, '(e14.6)') output_values(:, :, k)
345 : end do
346 : !$OMP END PARALLEL DO
347 :
348 0 : do io = io_first, io_last
349 0 : close (io)
350 : end do
351 :
352 0 : end subroutine Create_Plot_Files
353 :
354 0 : subroutine do_inner_loop(species, num_reactions, logT, T, j, output_values, n, xin, &
355 : logRho_points, logRho_min, dlogRho)
356 : integer, intent(in) :: species, num_reactions
357 : real(dp), intent(in) :: logT, T
358 : integer, intent(in) :: j, logRho_points
359 : type(Net_info) :: n
360 : real(dp), intent(OUT) :: output_values(:, :, :)
361 : real(dp), intent(in) :: xin(species), logRho_min, dlogRho
362 :
363 : integer :: i
364 0 : real(dp) :: logRho, Rho
365 :
366 0 : do i = 1, logRho_points
367 0 : logRho = logRho_min + dlogRho*(i - 1)
368 0 : Rho = exp10(logRho)
369 : call do_one_net_eval(species, num_reactions, logT, T, logRho, Rho, &
370 0 : i, j, output_values, n, xin)
371 : end do
372 :
373 0 : end subroutine do_inner_loop
374 :
375 0 : subroutine do_one_net_eval(species, num_reactions, logT, T, logRho, Rho, &
376 0 : i, j, output_values, n, xin)
377 : use chem_lib, only: composition_info
378 : integer, intent(in) :: species, num_reactions
379 : real(dp), intent(in) :: logT, T, logRho, Rho
380 : integer, intent(in) :: i, j
381 : type(Net_General_Info), pointer :: g => null()
382 : type(net_info) :: n
383 : real(dp), intent(OUT) :: output_values(:, :, :)
384 : real(dp), intent(in) :: xin(species)
385 :
386 0 : real(dp) :: z, abar, zbar, z2bar, z53bar, ye, sum, mx, weak_rate_factor
387 0 : real(dp), target :: rate_factors_a(num_reactions)
388 0 : real(dp), pointer :: rate_factors(:)
389 :
390 0 : real(dp) :: eps_nuc
391 0 : real(dp) :: d_eps_nuc_dT
392 0 : real(dp) :: d_eps_nuc_dRho
393 0 : real(dp) :: d_eps_nuc_dx(species)
394 : ! partial derivatives wrt mass fractions
395 :
396 0 : real(dp) :: dxdt(species)
397 : ! rate of change of mass fractions caused by nuclear reactions
398 0 : real(dp) :: d_dxdt_dRho(species)
399 0 : real(dp) :: d_dxdt_dT(species)
400 0 : real(dp) :: d_dxdt_dx(species, species)
401 0 : real(dp) :: eps_nuc_categories(num_categories)
402 :
403 0 : integer :: info, k, h1, he4, chem_id(species)
404 0 : real(dp) :: xh, xhe, mass_correction
405 0 : real(dp), dimension(species) :: dabar_dx, dzbar_dx, dmc_dx
406 : logical :: skip_jacobian
407 :
408 0 : rate_factors => rate_factors_a
409 :
410 0 : h1 = net_iso(ih1)
411 0 : he4 = net_iso(ihe4)
412 :
413 0 : g => n%g
414 :
415 0 : call get_chem_id_table(net_handle, species, chem_id, info)
416 0 : if (info /= 0) call mesa_error(__FILE__, __LINE__)
417 :
418 : call composition_info( &
419 0 : species, chem_id, xin, xh, xhe, z, abar, zbar, z2bar, z53bar, ye, &
420 0 : mass_correction, sum, dabar_dx, dzbar_dx, dmc_dx)
421 :
422 0 : rate_factors(:) = 1
423 0 : weak_rate_factor = 1
424 0 : skip_jacobian = .false.
425 :
426 : call net_get(net_handle, skip_jacobian, n, species, num_reactions, &
427 0 : xin, T, logT, Rho, logRho, &
428 : abar, zbar, z2bar, ye, eta, d_eta_dlnT, d_eta_dlnRho, &
429 : rate_factors, weak_rate_factor, &
430 : std_reaction_Qs, std_reaction_neuQs, &
431 0 : eps_nuc, d_eps_nuc_dRho, d_eps_nuc_dT, d_eps_nuc_dx, &
432 0 : dxdt, d_dxdt_dRho, d_dxdt_dT, d_dxdt_dx, &
433 : screening_mode, &
434 : eps_nuc_categories, eps_neu_total, &
435 0 : info)
436 0 : if (info /= 0) then
437 0 : write (*, *) 'bad result from net_get'
438 0 : call mesa_error(__FILE__, __LINE__)
439 : end if
440 :
441 0 : sum = 0d0
442 0 : mx = 0d0
443 0 : do k = species, 1, -1
444 0 : if (abs(dxdt(k)) > mx) mx = abs(dxdt(k))
445 0 : sum = sum + dxdt(k)
446 : end do
447 0 : if (mx <= 0) mx = 1d0
448 0 : if (sum - sum /= 0) then
449 0 : write (*, *) logRho, logT
450 0 : call mesa_error(__FILE__, __LINE__)
451 : end if
452 :
453 0 : k = 1; output_values(i, j, k) = safe_log10(eps_nuc)
454 :
455 0 : k = k + 1; output_values(i, j, k) = sum/max(1d-20, mx)
456 :
457 0 : k = k + 1; output_values(i, j, k) = d_eps_nuc_dT*T/max(1d-20, eps_nuc)
458 0 : k = k + 1; output_values(i, j, k) = d_eps_nuc_dRho*Rho/max(1d-20, eps_nuc)
459 0 : k = k + 1; output_values(i, j, k) = safe_log10(abs(d_eps_nuc_dx(h1)))
460 0 : k = k + 1; output_values(i, j, k) = safe_log10(abs(d_eps_nuc_dx(he4)))
461 :
462 0 : if (k > max_files) then
463 0 : write (*, *) 'need to enlarge max_files'
464 0 : call mesa_error(__FILE__, __LINE__)
465 : end if
466 :
467 0 : end subroutine do_one_net_eval
468 :
469 0 : integer function Open_Files(io_start, dir)
470 : integer, intent(in) :: io_start
471 : character(len=256), intent(in) :: dir
472 : character(len=256) :: fname
473 : integer :: io
474 0 : io = io_start
475 :
476 0 : fname = trim(dir)//'/'//'log_net_eps.data'
477 0 : io = io + 1; open (unit=io, file=trim(fname))
478 :
479 0 : fname = trim(dir)//'/'//'sum_dxdt_div_max_dxdt.data'
480 0 : io = io + 1; open (unit=io, file=trim(fname))
481 :
482 0 : fname = trim(dir)//'/'//'d_lneps_dlnT.data'
483 0 : io = io + 1; open (unit=io, file=trim(fname))
484 :
485 0 : fname = trim(dir)//'/'//'d_lneps_dlnRho.data'
486 0 : io = io + 1; open (unit=io, file=trim(fname))
487 :
488 0 : fname = trim(dir)//'/'//'d_eps_nuc_dxh1.data'
489 0 : io = io + 1; open (unit=io, file=trim(fname))
490 :
491 0 : fname = trim(dir)//'/'//'d_eps_nuc_dxhe4.data'
492 0 : io = io + 1; open (unit=io, file=trim(fname))
493 :
494 0 : Open_Files = io
495 :
496 0 : end function Open_Files
497 :
498 14 : subroutine set_composition(species, xin)
499 : integer, intent(in) :: species
500 : real(dp), intent(OUT) :: xin(species)
501 :
502 14 : real(dp) :: sum
503 : integer :: i, adjustment_iso
504 :
505 14 : eta = 0
506 :
507 14 : adjustment_iso = net_iso(img24)
508 :
509 14 : if (net_file == 'basic.net') then
510 :
511 2 : adjustment_iso = net_iso(img24)
512 :
513 18 : xin = 0
514 2 : xin(net_iso(ih1)) = 0.655186E+00 ! h1
515 2 : xin(net_iso(ihe4)) = 0.31002164D+00 ! he4
516 2 : xin(net_iso(ic12)) = 0.002725D-01 ! c12
517 2 : xin(net_iso(in14)) = 0.203101D-01 + 0.612124D-06 + 0.109305D-02 + 0.356004D-04
518 2 : xin(net_iso(io16)) = 0.094000D-01 ! o16
519 2 : xin(net_iso(ine20)) = 0.162163D-02 ! ne20
520 2 : xin(net_iso(img24)) = 0.658226D-25 ! mg24
521 2 : xin(net_iso(ihe3)) = 0.201852D-02 ! he3
522 :
523 12 : else if (net_file == 'o18_and_ne22.net') then
524 :
525 2 : adjustment_iso = net_iso(img24)
526 :
527 22 : xin = 0
528 2 : xin(net_iso(ih1)) = 0.655186E+00
529 2 : xin(net_iso(ihe4)) = 0.31002164D+00
530 2 : xin(net_iso(ic12)) = 0.002725D-01
531 2 : xin(net_iso(in14)) = 0.203101D-01 + 0.612124D-06 + 0.109305D-02
532 2 : xin(net_iso(io16)) = 0.094000D-01
533 2 : xin(net_iso(io18)) = 1d-20
534 2 : xin(net_iso(ine20)) = 0.162163D-02
535 2 : xin(net_iso(img24)) = 0.658226D-25
536 2 : xin(net_iso(ine22)) = 0.201852D-02
537 :
538 10 : else if (net_file == 'pp_extras.net') then
539 :
540 2 : adjustment_iso = net_iso(img24)
541 :
542 26 : xin = 0
543 2 : xin(net_iso(ih1)) = 0.655186E+00 ! h1
544 2 : xin(net_iso(ihe4)) = 0.31002164D+00 ! he4
545 2 : xin(net_iso(ic12)) = 0.002725D-01 ! c12
546 2 : xin(net_iso(in14)) = 0.203101D-01 + 0.612124D-06 + 0.109305D-02 + 0.356004D-04
547 2 : xin(net_iso(io16)) = 0.094000D-01 ! o16
548 2 : xin(net_iso(ine20)) = 0.162163D-02 ! ne20
549 2 : xin(net_iso(img24)) = 0.658226D-25 ! mg24
550 :
551 2 : xin(net_iso(ih2)) = 0.632956D-17 ! h2
552 2 : xin(net_iso(ihe3)) = 0.201852D-02 ! he3
553 2 : xin(net_iso(ili7)) = 0.664160D-15 ! li7
554 2 : xin(net_iso(ibe7)) = 0.103866D-15 ! be7
555 :
556 8 : else if (net_file == 'cno_extras.net') then
557 :
558 2 : adjustment_iso = net_iso(img24)
559 44 : xin = 0
560 2 : xin(net_iso(ih1)) = 0.173891680788D-01 ! h1
561 2 : xin(net_iso(ihe4)) = 0.963245225401D+00 ! he4
562 2 : xin(net_iso(ic12)) = 0.238935745993D-03 ! c12
563 2 : xin(net_iso(in14)) = 0.134050688300D-01 ! n14
564 2 : xin(net_iso(io16)) = 0.268791618452D-03 ! o16
565 2 : xin(net_iso(ine20)) = 0.180001692845D-02 ! ne20
566 2 : xin(net_iso(img24)) = 0.353667702698D-02 ! mg24
567 :
568 2 : xin(net_iso(ic13)) = 0.717642727071D-04 ! c13
569 2 : xin(net_iso(in13)) = 0.370732258156D-09 ! n13
570 2 : xin(net_iso(in15)) = 0.450484708137D-06 ! n15
571 2 : xin(net_iso(io14)) = 0.100000000000D-49 ! o14
572 2 : xin(net_iso(io15)) = 0.874815374966D-10 ! o15
573 2 : xin(net_iso(if17)) = 0.100000000000D-49 ! f17
574 2 : xin(net_iso(if18)) = 0.100000000000D-49 ! f18
575 2 : xin(net_iso(ine18)) = 0.100000000000D-49 ! ne18
576 2 : xin(net_iso(ine19)) = 0.100000000000D-49 ! ne19
577 2 : xin(net_iso(img22)) = 0.439011547696D-04 ! mg22
578 :
579 6 : else if (net_file == 'pp_cno_extras_o18_ne22.net') then
580 :
581 0 : adjustment_iso = net_iso(img24)
582 0 : xin = 0
583 0 : xin(net_iso(ih1)) = 0.173891680788D-01 ! h1
584 0 : xin(net_iso(ihe4)) = 0.963245225401D+00 ! he4
585 0 : xin(net_iso(ic12)) = 0.238935745993D-03 ! c12
586 0 : xin(net_iso(in14)) = 0.134050688300D-01 ! n14
587 0 : xin(net_iso(io16)) = 0.268791618452D-03 ! o16
588 0 : xin(net_iso(ine20)) = 0.180001692845D-02 ! ne20
589 0 : xin(net_iso(img24)) = 0.353667702698D-02 ! mg24
590 :
591 0 : xin(net_iso(ic13)) = 0.717642727071D-04 ! c13
592 0 : xin(net_iso(in13)) = 0.370732258156D-09 ! n13
593 0 : xin(net_iso(in15)) = 0.450484708137D-06 ! n15
594 0 : xin(net_iso(io14)) = 0.100000000000D-49 ! o14
595 0 : xin(net_iso(io15)) = 0.874815374966D-10 ! o15
596 0 : xin(net_iso(if17)) = 0.100000000000D-49 ! f17
597 0 : xin(net_iso(if18)) = 0.100000000000D-49 ! f18
598 0 : xin(net_iso(ine18)) = 0.100000000000D-49 ! ne18
599 0 : xin(net_iso(ine19)) = 0.100000000000D-49 ! ne19
600 0 : xin(net_iso(img22)) = 0.439011547696D-04 ! mg22
601 :
602 6 : else if (net_file == 'approx21_cr60_plus_co56.net') then
603 :
604 2 : adjustment_iso = net_iso(img24)
605 46 : xin = 0
606 2 : xin(net_iso(ihe4)) = 3.4555392534813939D-01
607 2 : xin(net_iso(io16)) = 1.9367778420430937D-01
608 2 : xin(net_iso(ih1)) = 1.9052931367172501D-01
609 2 : xin(net_iso(isi28)) = 9.1023936032064601D-02
610 2 : xin(net_iso(ini56)) = 5.8492459653295005D-02
611 2 : xin(net_iso(is32)) = 4.1416642476999908D-02
612 2 : xin(net_iso(ine20)) = 2.0927782332477558D-02
613 2 : xin(net_iso(ic12)) = 2.0589617104448312D-02
614 2 : xin(net_iso(img24)) = 1.8975914108406104D-02
615 2 : xin(net_iso(iar36)) = 7.0600338785939956D-03
616 2 : xin(net_iso(ica40)) = 4.9182171981353726D-03
617 2 : xin(net_iso(ife52)) = 3.1618820806005280D-03
618 2 : xin(net_iso(in14)) = 1.9878460082760952D-03
619 2 : xin(net_iso(ife56)) = 7.1668776621130190D-04
620 2 : xin(net_iso(ico56)) = 4.4974971099921181D-04
621 2 : xin(net_iso(ife54)) = 3.3432423890988422D-04
622 2 : xin(net_iso(icr48)) = 1.7602626907769762D-04
623 2 : xin(net_iso(ihe3)) = 5.1650097191631545D-06
624 2 : xin(net_iso(iti44)) = 2.6452422203389906D-06
625 2 : xin(net_iso(icr60)) = 4.7653353095937982D-08
626 2 : xin(net_iso(iprot)) = 1.2739022407246250D-11
627 2 : xin(net_iso(ineut)) = 0.0000000000000000D+00
628 :
629 4 : else if (net_file == 'approx21_cr60_plus_fe53_fe55_co56.net') then
630 :
631 0 : adjustment_iso = net_iso(img24)
632 0 : xin = 0
633 0 : xin(net_iso(ihe4)) = 3.4555392534813939D-01
634 0 : xin(net_iso(io16)) = 1.9367778420430937D-01
635 0 : xin(net_iso(ih1)) = 1.9052931367172501D-01
636 0 : xin(net_iso(isi28)) = 9.1023936032064601D-02
637 0 : xin(net_iso(ini56)) = 5.8492459653295005D-02
638 0 : xin(net_iso(is32)) = 4.1416642476999908D-02
639 0 : xin(net_iso(ine20)) = 2.0927782332477558D-02
640 0 : xin(net_iso(ic12)) = 2.0589617104448312D-02
641 0 : xin(net_iso(img24)) = 1.8975914108406104D-02
642 0 : xin(net_iso(iar36)) = 7.0600338785939956D-03
643 0 : xin(net_iso(ica40)) = 4.9182171981353726D-03
644 0 : xin(net_iso(ife52)) = 3.1618820806005280D-03
645 0 : xin(net_iso(in14)) = 1.9878460082760952D-03
646 0 : xin(net_iso(ife56)) = 7.1668776621130190D-04
647 0 : xin(net_iso(ico56)) = 4.4974971099921181D-04
648 0 : xin(net_iso(ife54)) = 3.3432423890988422D-04
649 0 : xin(net_iso(icr48)) = 1.7602626907769762D-04
650 0 : xin(net_iso(ihe3)) = 5.1650097191631545D-06
651 0 : xin(net_iso(iti44)) = 2.6452422203389906D-06
652 0 : xin(net_iso(icr60)) = 4.7653353095937982D-08
653 0 : xin(net_iso(iprot)) = 1.2739022407246250D-11
654 0 : xin(net_iso(ife53)) = 0.0000000000000000D+00
655 0 : xin(net_iso(ife55)) = 0.0000000000000000D+00
656 0 : xin(net_iso(ineut)) = 0.0000000000000000D+00
657 :
658 : else if (net_file == 'approx21_new.net' .or. &
659 : net_file == 'approx21_old.net' .or. &
660 4 : net_file == 'approx21_plus_co56.net' .or. &
661 : net_file == 'approx21.net') then
662 :
663 4 : adjustment_iso = net_iso(img24)
664 90 : xin = 0
665 4 : xin(net_iso(ife56)) = 8.0387021484318166D-01
666 4 : xin(net_iso(ife54)) = 1.6096648736760832D-01
667 4 : xin(net_iso(icr56)) = 2.9480945535920525D-02
668 4 : xin(net_iso(ihe4)) = 4.8624637161320565D-03
669 4 : xin(net_iso(ini56)) = 2.8376270731890360D-04
670 4 : xin(net_iso(isi28)) = 1.5018628906135739D-04
671 4 : xin(net_iso(is32)) = 1.1613271635573457D-04
672 4 : xin(net_iso(iprot)) = 1.1139431633673653D-04
673 4 : xin(net_iso(ica40)) = 5.3688377473494185D-05
674 4 : xin(net_iso(iar36)) = 5.2702831822567062D-05
675 4 : xin(net_iso(ife52)) = 3.7866504131935185D-05
676 4 : xin(net_iso(icr48)) = 5.8401123037667974D-06
677 4 : xin(net_iso(ineut)) = 4.9141227703118397D-06
678 4 : xin(net_iso(iti44)) = 1.5085038561154746D-06
679 4 : xin(net_iso(io16)) = 9.5384019609049255D-07
680 4 : xin(net_iso(img24)) = 6.3808207717725580D-07
681 4 : xin(net_iso(ic12)) = 2.9048656673991868D-07
682 4 : xin(net_iso(ine20)) = 9.6468865023609427D-09
683 4 : xin(net_iso(ihe3)) = 4.6203603862263096D-80
684 4 : xin(net_iso(in14)) = 7.5867472225841235D-99
685 :
686 : else
687 :
688 0 : write (*, *) 'net_file '//trim(net_file)
689 0 : call mesa_error(__FILE__, __LINE__, 'set_composition: do not recognize net_file')
690 :
691 : end if
692 :
693 14 : sum = 0d0
694 246 : do i = 1, species
695 232 : if (xin(i) < 1d-99) xin(i) = 1d-99
696 246 : sum = sum + xin(i)
697 : end do
698 14 : if (abs(1d0 - sum) > 1d-4) write (*, *) 'change abundance sum by', 1d0 - sum
699 14 : xin(adjustment_iso) = xin(adjustment_iso) + (1d0 - sum)
700 14 : if (xin(adjustment_iso) < 0d0) call mesa_error(__FILE__, __LINE__, 'error in sum of abundances')
701 :
702 14 : end subroutine set_composition
703 :
704 0 : subroutine read_test_data(filename, n, rho_vec, T_vec, ierr)
705 : ! the data files have columns of mass, radius, density, temp
706 : use utils_lib
707 : character(len=*), intent(in) :: filename
708 : integer, intent(out) :: n
709 : real(dp), dimension(:), pointer :: rho_vec, T_vec ! to be allocated and filled
710 : integer, intent(out) :: ierr
711 :
712 : integer :: iounit, i
713 0 : real(dp) :: junk
714 :
715 0 : ierr = 0
716 0 : open (newunit=iounit, file=trim(filename), action='read', iostat=ierr)
717 0 : if (ierr /= 0) then
718 0 : write (*, *) 'failed to open ', trim(filename)
719 0 : return
720 : end if
721 :
722 0 : i = 0
723 0 : do
724 0 : read (unit=iounit, fmt=*, iostat=ierr) junk, junk, junk, junk
725 0 : if (ierr == 0) then
726 0 : i = i + 1; cycle
727 : end if
728 0 : ierr = 0
729 0 : n = i
730 0 : exit
731 : end do
732 0 : rewind (iounit)
733 :
734 0 : allocate (rho_vec(n), T_vec(n), stat=ierr); if (ierr /= 0) return
735 :
736 0 : do i = 1, n
737 0 : read (iounit, *) junk, junk, rho_vec(i), T_vec(i)
738 : end do
739 :
740 0 : close (iounit)
741 :
742 0 : end subroutine read_test_data
743 :
744 0 : subroutine Do_One_Test(net_file, do_timing)
745 : use chem_lib, only: composition_info
746 : use rates_lib
747 : character(len=*), intent(in) :: net_file
748 : logical, intent(in) :: do_timing
749 0 : call Do_One_Testcase(net_file, do_timing, .false.)
750 0 : end subroutine Do_One_Test
751 :
752 0 : subroutine Do_One_Test_and_show_Qs(net_file, do_timing)
753 0 : use chem_lib, only: composition_info
754 : use rates_lib
755 : character(len=*), intent(in) :: net_file
756 : logical, intent(in) :: do_timing
757 0 : call Do_One_Testcase(net_file, do_timing, .true.)
758 0 : end subroutine Do_One_Test_and_show_Qs
759 :
760 0 : subroutine Do_One_Testcase(net_file, do_timing, show_Qs)
761 0 : use chem_lib, only: composition_info
762 : use rates_lib
763 : character(len=*), intent(in) :: net_file
764 : logical, intent(in) :: do_timing, show_Qs
765 :
766 0 : real(dp) :: logRho, logT, Rho, T, xsum, Q1, &
767 0 : eps_nuc, d_eps_nuc_dRho, d_eps_nuc_dT, weak_rate_factor, &
768 0 : dvardx, dvardx_0, dx_0, err, var_0, xdum, &
769 0 : eps_nuc_categories(num_categories), xh, xhe, mass_correction !approx_abar, approx_zbar
770 : integer :: i, j, info, ierr
771 : integer :: j_dx, j_dx_sink
772 0 : real(dp), dimension(:), pointer :: d_eps_nuc_dx, dabar_dx, dzbar_dx, dmc_dx
773 0 : real(dp), pointer :: rate_factors(:), &
774 0 : actual_Qs(:), actual_neuQs(:)
775 0 : logical, pointer :: from_weaklib(:)
776 : logical :: skip_jacobian, doing_d_dlnd, doing_dx
777 : real(dp), dimension(:), pointer :: &
778 0 : rate_raw, rate_raw_dT, &
779 0 : rate_screened
780 0 : type(net_info) :: n
781 :
782 : include 'formats'
783 :
784 0 : write (*, *) 'Do_One_Test '//trim(net_file)
785 :
786 0 : if (do_timing) call mesa_error(__FILE__, __LINE__, 'no support for do_timing')
787 :
788 0 : call test_net_setup(net_file)
789 :
790 0 : ierr = 0
791 :
792 0 : write (*, *) 'species', species
793 :
794 0 : allocate (d_eps_nuc_dx(species), dabar_dx(species), dzbar_dx(species), dmc_dx(species))
795 :
796 0 : info = 0
797 :
798 : allocate ( &
799 : rate_factors(num_reactions), &
800 : actual_Qs(num_reactions), &
801 : actual_neuQs(num_reactions), &
802 : from_weaklib(num_reactions), &
803 0 : stat=info)
804 0 : if (info /= 0) call mesa_error(__FILE__, __LINE__)
805 :
806 0 : rate_factors(:) = 1
807 0 : weak_rate_factor = 1
808 :
809 : if (.false.) then ! get neutrino Q
810 :
811 : Q1 = eval_neutrino_Q(img22, is30)
812 : write (*, 1) 'Qneu mg22->s30', Q1
813 :
814 : Q1 = eval_neutrino_Q(is30, ini56)
815 : write (*, 1) 'Qneu s30->ni56', Q1
816 :
817 : Q1 = eval_neutrino_Q(ica38, ini56)
818 : write (*, 1) 'Qneu ca38->ni56', Q1
819 :
820 : Q1 = eval_neutrino_Q(ini56, ige64)
821 : write (*, 1) 'Qneu ni56->ge64', Q1
822 :
823 : Q1 = eval_neutrino_Q(ige64, ise68)
824 : write (*, 1) 'Qneu ge64->se68', Q1
825 :
826 : Q1 = eval_neutrino_Q(ise68, ikr72)
827 : write (*, 1) 'Qneu se68->kr72', Q1
828 :
829 : Q1 = eval_neutrino_Q(ikr72, isr76)
830 : write (*, 1) 'Qneu kr72->sr76', Q1
831 :
832 : Q1 = eval_neutrino_Q(isr76, isn104)
833 : write (*, 1) 'Qneu sr76->sn104', Q1
834 :
835 : stop
836 : end if
837 :
838 : if (.false.) then ! get reaction Q
839 : ! co55 -> fe55
840 : Q1 = isoB(ife55) - isoB(ico55)
841 : write (*, 1) 'Q co55->fe55', Q1
842 : stop
843 : end if
844 :
845 0 : xin = 0
846 0 : eta = 0
847 :
848 0 : if (net_file == 'mesa_201.net') then
849 :
850 0 : nrates_to_show = 2
851 :
852 0 : rates_to_show(1:nrates_to_show) = [ &
853 : ir_ar36_ag_ca40, &
854 0 : ir_ca40_ga_ar36]
855 :
856 0 : xin(net_iso(ife56)) = 6.3551174304779179D-01
857 0 : xin(net_iso(icr52)) = 1.0518849309100423D-01
858 0 : xin(net_iso(ini60)) = 6.8579809304547934D-02
859 0 : xin(net_iso(ife55)) = 3.0800958229563902D-02
860 0 : xin(net_iso(imn55)) = 2.1373990699858084D-02
861 0 : xin(net_iso(ico57)) = 2.0785551124804885D-02
862 0 : xin(net_iso(ife57)) = 1.6083543077536507D-02
863 0 : xin(net_iso(imn53)) = 1.5959192021165327D-02
864 0 : xin(net_iso(ico59)) = 1.3346191916961030D-02
865 0 : xin(net_iso(ife58)) = 1.2810477227656202D-02
866 0 : xin(net_iso(ife54)) = 1.2428871023625330D-02
867 0 : xin(net_iso(ini62)) = 1.1831182533246063D-02
868 0 : xin(net_iso(icr53)) = 8.1041573656346795D-03
869 0 : xin(net_iso(ini61)) = 5.1462544919734727D-03
870 0 : xin(net_iso(imn54)) = 4.8562102089927551D-03
871 0 : xin(net_iso(icr54)) = 3.4271335428296490D-03
872 0 : xin(net_iso(ini59)) = 2.9811021846265560D-03
873 0 : xin(net_iso(ini58)) = 2.8713349650366189D-03
874 0 : xin(net_iso(iv51)) = 2.0988150935152424D-03
875 0 : xin(net_iso(ico58)) = 2.0282210582857861D-03
876 0 : xin(net_iso(icr51)) = 1.2727926750247761D-03
877 0 : xin(net_iso(icr50)) = 3.5421790633561727D-04
878 0 : xin(net_iso(icu63)) = 3.0335040211002022D-04
879 0 : xin(net_iso(iti48)) = 2.8512639104984498D-04
880 0 : xin(net_iso(iti50)) = 2.8394752519368671D-04
881 0 : xin(net_iso(ico56)) = 2.4310701594699283D-04
882 0 : xin(net_iso(ico60)) = 1.5319574812323961D-04
883 0 : xin(net_iso(ihe4)) = 1.3780017854631601D-04
884 0 : xin(net_iso(imn56)) = 1.1066944504563417D-04
885 0 : xin(net_iso(iv50)) = 8.7723703257792468D-05
886 0 : xin(net_iso(iv49)) = 8.0539507322740820D-05
887 0 : xin(net_iso(icu61)) = 6.0898214714637941D-05
888 0 : xin(net_iso(iti49)) = 5.8026224632063015D-05
889 0 : xin(net_iso(imn52)) = 4.2516037186521133D-05
890 0 : xin(net_iso(ico61)) = 4.1332712278653746D-05
891 0 : xin(net_iso(ini63)) = 3.9285182071536010D-05
892 0 : xin(net_iso(ico55)) = 3.3984664667118780D-05
893 0 : xin(net_iso(ife59)) = 3.1874001320244153D-05
894 0 : xin(net_iso(izn64)) = 2.7904240321969555D-05
895 0 : xin(net_iso(izn66)) = 2.3416686728782276D-05
896 0 : xin(net_iso(icu62)) = 2.1144678609352833D-05
897 0 : xin(net_iso(ini57)) = 1.1679099363693715D-05
898 0 : xin(net_iso(iv52)) = 1.0016381776869645D-05
899 0 : xin(net_iso(ini64)) = 8.9564547480773243D-06
900 0 : xin(net_iso(iti47)) = 8.7562205406651916D-06
901 0 : xin(net_iso(icu65)) = 8.3830901771893844D-06
902 0 : xin(net_iso(iti46)) = 6.5019528109988749D-06
903 0 : xin(net_iso(icu64)) = 6.1556773376380492D-06
904 0 : xin(net_iso(iar38)) = 5.0886468271422554D-06
905 0 : xin(net_iso(ife53)) = 4.4893983930970075D-06
906 0 : xin(net_iso(is34)) = 4.2369862519232918D-06
907 0 : xin(net_iso(izn65)) = 4.1809380230467465D-06
908 0 : xin(net_iso(icr55)) = 3.5647078269917385D-06
909 0 : xin(net_iso(imn51)) = 1.3849206094166064D-06
910 0 : xin(net_iso(ife60)) = 1.0919469947619407D-06
911 0 : xin(net_iso(ih1)) = 9.8211241034612710D-07
912 0 : xin(net_iso(ica44)) = 6.4721481111312556D-07
913 0 : xin(net_iso(isi30)) = 6.0482126630410841D-07
914 0 : xin(net_iso(ica42)) = 5.8926684360031471D-07
915 0 : xin(net_iso(isi28)) = 5.5342250413192408D-07
916 0 : xin(net_iso(iv48)) = 5.4911502105605942D-07
917 0 : xin(net_iso(iv53)) = 5.4571869339657211D-07
918 0 : xin(net_iso(icu60)) = 4.5761289432308086D-07
919 0 : xin(net_iso(izn63)) = 4.4652045082610858D-07
920 0 : xin(net_iso(isc47)) = 4.4099241256913694D-07
921 0 : xin(net_iso(ini56)) = 3.9547421607331126D-07
922 0 : xin(net_iso(iti51)) = 3.6358450091693021D-07
923 0 : xin(net_iso(izn62)) = 3.0268870369662295D-07
924 0 : xin(net_iso(is32)) = 3.0184105591459131D-07
925 0 : xin(net_iso(icr49)) = 2.7706803242086906D-07
926 0 : xin(net_iso(isc45)) = 2.5466905171154329D-07
927 0 : xin(net_iso(ik39)) = 1.9906885458096793D-07
928 0 : xin(net_iso(icl35)) = 1.5826438708200070D-07
929 0 : xin(net_iso(is33)) = 1.2794750349676913D-07
930 0 : xin(net_iso(ip31)) = 1.1805533268957108D-07
931 0 : xin(net_iso(icl37)) = 1.0108890802543261D-07
932 0 : xin(net_iso(ica43)) = 9.5766190955127930D-08
933 0 : xin(net_iso(iar36)) = 8.3287350202069049D-08
934 0 : xin(net_iso(isi29)) = 7.6157023642649312D-08
935 0 : xin(net_iso(isc49)) = 7.2645544618960897D-08
936 0 : xin(net_iso(icu59)) = 6.9036259006119691D-08
937 0 : xin(net_iso(ica40)) = 6.4387988887989985D-08
938 0 : xin(net_iso(isc46)) = 6.1294200120692868D-08
939 0 : xin(net_iso(iar37)) = 5.0049708949178339D-08
940 0 : xin(net_iso(ineut)) = 4.7236564548991118D-08
941 0 : xin(net_iso(isc48)) = 3.7392395931746378D-08
942 0 : xin(net_iso(ife52)) = 3.0982331086000098D-08
943 0 : xin(net_iso(icr56)) = 2.9477366114308358D-08
944 0 : xin(net_iso(ica41)) = 2.7100443580454983D-08
945 0 : xin(net_iso(is35)) = 2.6527306613430685D-08
946 0 : xin(net_iso(ica45)) = 2.5532508173462626D-08
947 0 : xin(net_iso(ico62)) = 2.3608043613616947D-08
948 0 : xin(net_iso(iar39)) = 2.3503192609361190D-08
949 0 : xin(net_iso(ica46)) = 2.2455595751043146D-08
950 0 : xin(net_iso(iv47)) = 1.9789662501752072D-08
951 0 : xin(net_iso(icu66)) = 1.9285467280104737D-08
952 0 : xin(net_iso(icl36)) = 1.8710358753573163D-08
953 0 : xin(net_iso(is36)) = 1.6433794658525574D-08
954 0 : xin(net_iso(ik41)) = 1.1021812817088955D-08
955 0 : xin(net_iso(ini65)) = 1.0432196346423500D-08
956 0 : xin(net_iso(ip33)) = 8.9625871046594568D-09
957 0 : xin(net_iso(ik40)) = 7.2106087354006743D-09
958 0 : xin(net_iso(iar40)) = 7.1174073521523365D-09
959 0 : xin(net_iso(iti45)) = 5.6870435962784455D-09
960 0 : xin(net_iso(ip32)) = 4.9537776441010461D-09
961 0 : xin(net_iso(icr48)) = 3.0709436939798925D-09
962 0 : xin(net_iso(isc44)) = 2.7862949914482315D-09
963 0 : xin(net_iso(isc43)) = 1.4283233379580965D-09
964 0 : xin(net_iso(isi31)) = 1.3747008133379580D-09
965 0 : xin(net_iso(iti52)) = 1.2866447687101849D-09
966 0 : xin(net_iso(ico63)) = 1.0456195723572430D-09
967 0 : xin(net_iso(iti44)) = 7.1579364938842059D-10
968 0 : xin(net_iso(io16)) = 5.6818053126812287D-10
969 0 : xin(net_iso(ial27)) = 5.6117840295305725D-10
970 0 : xin(net_iso(ica47)) = 5.4798226854137171D-10
971 0 : xin(net_iso(img24)) = 3.8679049700264050D-10
972 0 : xin(net_iso(ini66)) = 2.8640604416758339D-10
973 0 : xin(net_iso(izn61)) = 2.4995195933116682D-10
974 0 : xin(net_iso(ica48)) = 1.9626419275146166D-10
975 0 : xin(net_iso(ife61)) = 1.8711288748163173D-10
976 0 : xin(net_iso(ik42)) = 1.4923884785773920D-10
977 0 : xin(net_iso(isi32)) = 1.4443919428884894D-10
978 0 : xin(net_iso(ip30)) = 1.3908837795296053D-10
979 0 : xin(net_iso(ic12)) = 1.3185610207511085D-10
980 0 : xin(net_iso(ik43)) = 1.1518951971920992D-10
981 0 : xin(net_iso(iv54)) = 8.8440974843643898D-11
982 0 : xin(net_iso(img26)) = 8.5260453209638504D-11
983 0 : xin(net_iso(icl38)) = 2.5853881572793256D-11
984 0 : xin(net_iso(isc50)) = 1.7292118708137885D-11
985 0 : xin(net_iso(iar41)) = 1.0665700916421081D-11
986 0 : xin(net_iso(img25)) = 9.2051027558630546D-12
987 0 : xin(net_iso(ial28)) = 8.9602126799277990D-12
988 0 : xin(net_iso(izn60)) = 7.0658622923470296D-12
989 0 : xin(net_iso(ip34)) = 4.2003981867966896D-12
990 0 : xin(net_iso(icr57)) = 2.8195149736768269D-12
991 0 : xin(net_iso(ine20)) = 1.1829006560529443D-12
992 0 : xin(net_iso(ife62)) = 1.0149415562457171D-12
993 0 : xin(net_iso(ik44)) = 5.5654687896999145D-13
994 0 : xin(net_iso(is31)) = 4.0845373817884839D-13
995 0 : xin(net_iso(iv55)) = 2.8610531204397973D-13
996 0 : xin(net_iso(ina23)) = 2.5122330767236196D-13
997 0 : xin(net_iso(is37)) = 2.1529809224524208D-13
998 0 : xin(net_iso(iti53)) = 1.4129020276964862D-13
999 0 : xin(net_iso(iar35)) = 1.2934962278023034D-13
1000 0 : xin(net_iso(ial26)) = 1.2407881461251650D-13
1001 0 : xin(net_iso(in15)) = 1.1945765698183132D-13
1002 0 : xin(net_iso(ico64)) = 8.1590671587313667D-14
1003 0 : xin(net_iso(img27)) = 6.7969591881380018D-14
1004 0 : xin(net_iso(ih2)) = 5.6613884110319004D-14
1005 0 : xin(net_iso(ini67)) = 5.1506647175988674D-14
1006 0 : xin(net_iso(ica39)) = 3.8945192023978035D-14
1007 0 : xin(net_iso(ini55)) = 3.0883773851523300D-14
1008 0 : xin(net_iso(ine22)) = 1.3808913342478939D-14
1009 0 : xin(net_iso(ica49)) = 1.0542673783683999D-14
1010 0 : xin(net_iso(isc51)) = 9.2083686560605166D-15
1011 0 : xin(net_iso(isi27)) = 8.3464191225256989D-15
1012 0 : xin(net_iso(ine21)) = 6.6697557229646203D-15
1013 0 : xin(net_iso(ife51)) = 6.5787879505834196D-15
1014 0 : xin(net_iso(io17)) = 3.8661065919908615D-15
1015 0 : xin(net_iso(ic13)) = 2.2604411883637647D-15
1016 0 : xin(net_iso(icr58)) = 2.1539938862813166D-15
1017 0 : xin(net_iso(isi33)) = 1.4888165334138879D-15
1018 0 : xin(net_iso(ina24)) = 7.2312125147882022D-16
1019 0 : xin(net_iso(ial25)) = 5.3576177397850227D-16
1020 0 : xin(net_iso(ico65)) = 4.9566812556376405D-16
1021 0 : xin(net_iso(icr47)) = 3.0194388465619186D-16
1022 0 : xin(net_iso(in14)) = 2.6891785216435022D-16
1023 0 : xin(net_iso(ina22)) = 2.5931749891034273D-16
1024 0 : xin(net_iso(io15)) = 2.5261003710407275D-16
1025 0 : xin(net_iso(ini68)) = 2.2419710841076782D-16
1026 0 : xin(net_iso(io18)) = 1.8206042351246347D-16
1027 0 : xin(net_iso(iti43)) = 9.9895985562055471D-17
1028 0 : xin(net_iso(if19)) = 7.0445166521693986D-17
1029 0 : xin(net_iso(ihe3)) = 6.8591249543794866D-17
1030 0 : xin(net_iso(iti54)) = 3.3955810406819116D-17
1031 0 : xin(net_iso(ife63)) = 3.0222399040043984D-17
1032 0 : xin(net_iso(in13)) = 2.5097133179904447D-17
1033 0 : xin(net_iso(izn59)) = 2.3782224732332168D-17
1034 0 : xin(net_iso(img23)) = 2.2784900370197838D-17
1035 0 : xin(net_iso(if17)) = 1.0052207505944401D-17
1036 0 : xin(net_iso(if18)) = 6.3013547340360942D-18
1037 0 : xin(net_iso(iv56)) = 2.1677062516769839D-18
1038 0 : xin(net_iso(ina21)) = 1.9109919103480182D-18
1039 0 : xin(net_iso(ine23)) = 1.2143041459039416D-18
1040 0 : xin(net_iso(ili6)) = 1.4203908924439747D-19
1041 0 : xin(net_iso(ib11)) = 1.1320699694157424D-19
1042 0 : xin(net_iso(if20)) = 4.4936577179455616D-20
1043 0 : xin(net_iso(ine19)) = 2.6387620496069204D-20
1044 0 : xin(net_iso(ife64)) = 1.1841283303587735D-20
1045 0 : xin(net_iso(ib10)) = 1.0494357182634838D-20
1046 0 : xin(net_iso(ibe9)) = 7.8292004126082962D-21
1047 0 : xin(net_iso(ico66)) = 6.4514234785580282D-21
1048 0 : xin(net_iso(ili7)) = 6.4231341717191173D-21
1049 0 : xin(net_iso(in16)) = 4.7443318701592232D-21
1050 0 : xin(net_iso(ibe7)) = 3.3532048357084064D-22
1051 0 : xin(net_iso(io19)) = 3.2062683754970905D-22
1052 0 : xin(net_iso(ibe10)) = 6.5331631260779713D-23
1053 0 : xin(net_iso(ico67)) = 4.9629777598135805D-24
1054 0 : xin(net_iso(ife65)) = 3.7335326045384740D-26
1055 0 : xin(net_iso(ife66)) = 8.6772104841406824D-30
1056 0 : xin(net_iso(ib8)) = 4.1439050548710376D-31
1057 :
1058 0 : write (*, *) 'sum xin', sum(xin(:))
1059 :
1060 0 : logT = 9.6532818288064650D+00
1061 0 : logRho = 7.9479966082179185D+00
1062 0 : eta = 2.7403163311838425D+00
1063 :
1064 0 : screening_mode = extended_screening
1065 :
1066 0 : call net_set_logTcut(net_handle, 0d0, 0d0, info)
1067 0 : if (info /= 0) then
1068 0 : write (*, *) 'failed in net_set_logTcut'
1069 0 : call mesa_error(__FILE__, __LINE__)
1070 : end if
1071 :
1072 0 : else if (net_file == 'approx21_cr60_plus_co56.net') then
1073 :
1074 0 : nrates_to_show = 2
1075 :
1076 0 : rates_to_show(1:nrates_to_show) = [ &
1077 : irco56ec_to_fe56, &
1078 0 : irni56ec_to_co56]
1079 :
1080 0 : xin(net_iso(ineut)) = 1.9615092621881698D-06
1081 0 : xin(net_iso(ih1)) = 0.0000000000000000D+00
1082 0 : xin(net_iso(iprot)) = 3.3544919533130298D-04
1083 0 : xin(net_iso(ihe3)) = 0.0000000000000000D+00
1084 0 : xin(net_iso(ihe4)) = 9.6491906054115388D-03
1085 0 : xin(net_iso(ic12)) = 4.4455299753403973D-07
1086 0 : xin(net_iso(in14)) = 0.0000000000000000D+00
1087 0 : xin(net_iso(io16)) = 7.0439210492179401D-07
1088 0 : xin(net_iso(ine20)) = 4.5369892002182717D-09
1089 0 : xin(net_iso(img24)) = 8.0018732551576689D-07
1090 0 : xin(net_iso(isi28)) = 3.3697411043955434D-04
1091 0 : xin(net_iso(is32)) = 2.7239844165292807D-04
1092 0 : xin(net_iso(iar36)) = 1.4240894544492388D-04
1093 0 : xin(net_iso(ica40)) = 1.5156321095874170D-04
1094 0 : xin(net_iso(iti44)) = 4.3979509377388036D-06
1095 0 : xin(net_iso(icr48)) = 2.8113145151721771D-05
1096 0 : xin(net_iso(icr60)) = 4.1810609055173498D-03
1097 0 : xin(net_iso(ife52)) = 1.8928784597602586D-04
1098 0 : xin(net_iso(ife54)) = 2.6996971418369603D-01
1099 0 : xin(net_iso(ife56)) = 7.0702963220409232D-01
1100 0 : xin(net_iso(ico56)) = 6.8333792315189530D-03
1101 0 : xin(net_iso(ini56)) = 8.7251484519146338D-04
1102 :
1103 0 : write (*, *) 'sum xin', sum(xin(:))
1104 :
1105 0 : logT = 9.8200000000000003D+00
1106 0 : logRho = 8.2586740078478176D+00
1107 0 : eta = 0d0
1108 :
1109 0 : screening_mode = extended_screening
1110 :
1111 0 : call net_set_logTcut(net_handle, 0d0, 0d0, info)
1112 0 : if (info /= 0) then
1113 0 : write (*, *) 'failed in net_set_logTcut'
1114 0 : call mesa_error(__FILE__, __LINE__)
1115 : end if
1116 :
1117 0 : else if (net_file == 'approx21_cr60_plus_fe53_fe55_co56.net') then
1118 :
1119 0 : nrates_to_show = 2
1120 :
1121 0 : rates_to_show(1:nrates_to_show) = [ &
1122 : irco56ec_to_fe56, &
1123 0 : irni56ec_to_co56]
1124 :
1125 0 : xin(net_iso(ihe4)) = 3.4555392534813939D-01
1126 0 : xin(net_iso(io16)) = 1.9367778420430937D-01
1127 0 : xin(net_iso(ih1)) = 1.9052931367172501D-01
1128 0 : xin(net_iso(isi28)) = 9.1023936032064601D-02
1129 0 : xin(net_iso(ini56)) = 5.8492459653295005D-02
1130 0 : xin(net_iso(is32)) = 4.1416642476999908D-02
1131 0 : xin(net_iso(ine20)) = 2.0927782332477558D-02
1132 0 : xin(net_iso(ic12)) = 2.0589617104448312D-02
1133 0 : xin(net_iso(img24)) = 1.8975914108406104D-02
1134 0 : xin(net_iso(iar36)) = 7.0600338785939956D-03
1135 0 : xin(net_iso(ica40)) = 4.9182171981353726D-03
1136 0 : xin(net_iso(ife52)) = 3.1618820806005280D-03
1137 0 : xin(net_iso(in14)) = 1.9878460082760952D-03
1138 0 : xin(net_iso(ife56)) = 7.1668776621130190D-04
1139 0 : xin(net_iso(ico56)) = 4.4974971099921181D-04
1140 0 : xin(net_iso(ife54)) = 3.3432423890988422D-04
1141 0 : xin(net_iso(icr48)) = 1.7602626907769762D-04
1142 0 : xin(net_iso(ihe3)) = 5.1650097191631545D-06
1143 0 : xin(net_iso(iti44)) = 2.6452422203389906D-06
1144 0 : xin(net_iso(icr60)) = 4.7653353095937982D-08
1145 0 : xin(net_iso(iprot)) = 1.2739022407246250D-11
1146 0 : xin(net_iso(ife53)) = 0.0000000000000000D+00
1147 0 : xin(net_iso(ife55)) = 0.0000000000000000D+00
1148 0 : xin(net_iso(ineut)) = 0.0000000000000000D+00
1149 :
1150 0 : write (*, *) 'sum xin', sum(xin(:))
1151 :
1152 0 : logT = 4.6233007922659333D+00
1153 0 : logRho = -1.0746410107891649D+01
1154 0 : eta = -2.2590260158215202D+01
1155 :
1156 0 : screening_mode = extended_screening
1157 :
1158 0 : call net_set_logTcut(net_handle, 0d0, 0d0, info)
1159 0 : if (info /= 0) then
1160 0 : write (*, *) 'failed in net_set_logTcut'
1161 0 : call mesa_error(__FILE__, __LINE__)
1162 : end if
1163 :
1164 0 : else if (net_file == 'basic.net') then
1165 :
1166 0 : nrates_to_show = 1
1167 :
1168 0 : if (rates_reaction_id('rc12_to_n14') <= 0) call mesa_error(__FILE__, __LINE__, 'bad reaction')
1169 0 : write (*, *) 'rc12_to_n14', rates_reaction_id('rc12_to_n14')
1170 :
1171 0 : rates_to_show(1:nrates_to_show) = [ &
1172 0 : rates_reaction_id('rc12_to_n14')]
1173 :
1174 0 : xin(net_iso(ihe4)) = 9.8119124177708650D-01
1175 0 : xin(net_iso(in14)) = 9.8369547495994036D-03
1176 0 : xin(net_iso(io16)) = 2.9223115895360822D-03
1177 0 : xin(net_iso(ine20)) = 2.0337034688681288D-03
1178 0 : xin(net_iso(ihe3)) = 0.0000000000000000D+00
1179 0 : xin(net_iso(ih1)) = 0.0000000000000000D+00
1180 :
1181 0 : write (*, *) 'when 1st'
1182 0 : xin(net_iso(ic12)) = 2.3551202768735954D-04 ! 2.3551179217556737D-04
1183 0 : xin(net_iso(img24)) = 3.7802763872225075D-03 ! 3.7802766227342998D-03
1184 :
1185 : !write(*,*) 'when 2nd'
1186 : !xin(net_iso(ic12))= 2.3551179217556737D-04
1187 : !xin(net_iso(img24))= 3.7802766227342998D-03
1188 :
1189 0 : logT = 7.8820961200821831D+00
1190 0 : logRho = 5.6124502722887746D+00
1191 0 : eta = 1.2629003275927920D+01
1192 :
1193 0 : write (*, *) 'sum xin', sum(xin(:))
1194 :
1195 0 : screening_mode = extended_screening
1196 :
1197 0 : call net_set_logTcut(net_handle, 0d0, 0d0, info)
1198 0 : if (info /= 0) then
1199 0 : write (*, *) 'failed in net_set_logTcut'
1200 0 : call mesa_error(__FILE__, __LINE__)
1201 : end if
1202 :
1203 0 : else if (net_file == 'agb.net') then
1204 :
1205 0 : nrates_to_show = 4
1206 :
1207 0 : rates_to_show(1:nrates_to_show) = [ &
1208 : ir_h1_h1_wk_h2, &
1209 : ir_c13_an_o16, &
1210 : ir_f19_ap_ne22, &
1211 0 : ir_he3_ag_be7]
1212 :
1213 0 : xin(net_iso(ih1)) = 1
1214 :
1215 0 : write (*, *) 'sum xin', sum(xin(:))
1216 :
1217 0 : logT = 8.6864273893515023D+00
1218 0 : logRho = 2.0591020210828619D+00
1219 0 : eta = -1.4317150417353590D+01
1220 :
1221 0 : screening_mode = extended_screening
1222 :
1223 0 : call net_set_logTcut(net_handle, 0d0, 0d0, info)
1224 0 : if (info /= 0) then
1225 0 : write (*, *) 'failed in net_set_logTcut'
1226 0 : call mesa_error(__FILE__, __LINE__)
1227 : end if
1228 :
1229 : if (.false.) then
1230 : if (.false.) then
1231 : rate_factors(:) = 0
1232 : i = reaction_table(ir_h2_pg_he3)
1233 : if (i == 0) call mesa_error(__FILE__, __LINE__)
1234 : rate_factors(i) = 1
1235 : else
1236 : i = reaction_table(ir_ne20_ag_mg24)
1237 : if (i == 0) call mesa_error(__FILE__, __LINE__)
1238 : rate_factors(i) = 0
1239 : i = reaction_table(ir_o16_ag_ne20)
1240 : if (i == 0) call mesa_error(__FILE__, __LINE__)
1241 : rate_factors(i) = 0
1242 : end if
1243 : end if
1244 :
1245 0 : else if (net_file == 'pp_and_cno_extras.net') then
1246 :
1247 0 : nrates_to_show = 8
1248 :
1249 0 : rates_to_show(1:nrates_to_show) = [ &
1250 : rates_reaction_id('r_n13_wk_c13'), &
1251 : rates_reaction_id('r_o15_wk_n15'), &
1252 : rates_reaction_id('r_f17_wk_o17'), &
1253 : rates_reaction_id('r_f18_wk_o18'), &
1254 : rates_reaction_id('r_o14_wk_n14'), &
1255 : rates_reaction_id('r_ne18_wk_f18'), &
1256 : rates_reaction_id('r_ne19_wk_f19'), &
1257 0 : ir_he4_he4_he4_to_c12]
1258 :
1259 0 : xin = 0
1260 0 : xin(net_iso(ih1)) = 7.2265805432969643D-01
1261 0 : xin(net_iso(ihe3)) = 6.7801726921522655D-04
1262 0 : xin(net_iso(ihe4)) = 2.6667042876319019D-01
1263 0 : xin(net_iso(ic12)) = 1.9056849943017622D-03
1264 0 : xin(net_iso(in13)) = 1.4791107757148081D-04
1265 0 : xin(net_iso(in14)) = 6.0253770632534619D-04
1266 0 : xin(net_iso(in15)) = 1.9263919190065488D-07
1267 0 : xin(net_iso(io14)) = 9.5977897394247582D-09
1268 0 : xin(net_iso(io15)) = 7.6666060610240002D-08
1269 0 : xin(net_iso(io16)) = 5.5886173952684358D-03
1270 0 : xin(net_iso(io17)) = 2.0449560316023342D-06
1271 0 : xin(net_iso(io18)) = 1.1313355448541673D-05
1272 0 : xin(net_iso(if19)) = 2.1343308067891499D-07
1273 0 : xin(net_iso(ine20)) = 1.2563102679570999D-03
1274 0 : xin(net_iso(img24)) = 4.7858754879924638D-04
1275 :
1276 0 : logT = 9.6d0
1277 0 : logRho = 6.0d0
1278 0 : rho = 7.8571498592117219D+00
1279 0 : T = 8.5648111120065376D+06
1280 0 : abar = 1.2655060647252907D+00
1281 0 : zbar = 1.0901664301076275D+00
1282 0 : z2bar = 1.3036906023574921D+00
1283 0 : ye = 8.6144702146826535D-01
1284 0 : eta = -3.4387570967781595D+00
1285 :
1286 0 : screening_mode = extended_screening
1287 :
1288 0 : else if (net_file == 'approx21_plus_co56.net') then
1289 :
1290 0 : nrates_to_show = 5
1291 :
1292 0 : rates_to_show(1:nrates_to_show) = [ &
1293 : ir_v47_pa_ti44, &
1294 : ir_mn51_pa_cr48, &
1295 : ir_ar36_ap_k39, &
1296 : ir_co55_pa_fe52, &
1297 : ir_s32_ap_cl35 &
1298 0 : ]
1299 0 : xin = 0
1300 :
1301 0 : xin(net_iso(ife54)) = 7.8234742556602999D-01
1302 0 : xin(net_iso(isi28)) = 7.8210084821085060D-02
1303 0 : xin(net_iso(ini56)) = 5.2306555890846963D-02
1304 0 : xin(net_iso(is32)) = 5.1718599300602117D-02
1305 0 : xin(net_iso(iar36)) = 1.3861579457866108D-02
1306 0 : xin(net_iso(ica40)) = 1.2347894507489101D-02
1307 0 : xin(net_iso(ife56)) = 4.8313904464514874D-03
1308 0 : xin(net_iso(ife52)) = 3.9677414859767722D-03
1309 0 : xin(net_iso(icr48)) = 2.9870241199304463D-04
1310 0 : xin(net_iso(ihe4)) = 4.0616997047809087D-05
1311 0 : xin(net_iso(iti44)) = 3.3724322385639036D-05
1312 0 : xin(net_iso(iprot)) = 1.7517084938626562D-05
1313 0 : xin(net_iso(img24)) = 1.1248868356795997D-05
1314 0 : xin(net_iso(io16)) = 6.1628768742062784D-06
1315 0 : xin(net_iso(ic12)) = 7.4857838132808694D-07
1316 0 : xin(net_iso(ine20)) = 5.6045205217740520D-09
1317 0 : xin(net_iso(icr56)) = 1.7593106525983871D-09
1318 0 : xin(net_iso(ineut)) = 1.9978632764577629D-11
1319 0 : xin(net_iso(in14)) = 0.0000000000000000D+00
1320 0 : xin(net_iso(ihe3)) = 0.0000000000000000D+00
1321 0 : xin(net_iso(ih1)) = 0.0000000000000000D+00
1322 0 : write (*, *) 'test case sum xin', sum(xin(1:species))
1323 :
1324 0 : logT = 9.5806070583042597D+00
1325 0 : logRho = 7.1251356937727763D+00
1326 0 : eta = 6.3504500633747440D-01
1327 :
1328 0 : T = 3.8072119794259882D+09
1329 0 : rho = 1.3339381513098311D+07
1330 0 : abar = 4.8254908015575154D+01
1331 0 : zbar = 2.3420437256420026D+01
1332 0 : z2bar = 5.7180065624152712D+02
1333 0 : ye = 4.8534829345982072D-01
1334 0 : screening_mode = extended_screening
1335 :
1336 : else
1337 :
1338 0 : write (*, *) 'need to define setup for net_file ', trim(net_file)
1339 0 : call mesa_error(__FILE__, __LINE__, 'Do_One_Test')
1340 :
1341 : end if
1342 :
1343 0 : Rho = exp10(logRho)
1344 0 : T = exp10(logT)
1345 :
1346 0 : write (*, *)
1347 0 : write (*, *)
1348 :
1349 0 : info = 0
1350 :
1351 0 : ierr = 0
1352 : call composition_info( &
1353 : species, chem_id, xin, xh, xhe, z, abar, zbar, z2bar, z53bar, ye, &
1354 0 : mass_correction, xsum, dabar_dx, dzbar_dx, dmc_dx)
1355 :
1356 0 : write (*, '(a40,d26.16)') 'xh', xh
1357 0 : write (*, '(a40,d26.16)') 'xhe', xhe
1358 0 : write (*, '(a40,d26.16)') 'abar', abar
1359 0 : write (*, '(a40,d26.16)') 'zbar', zbar
1360 0 : write (*, '(a40,d26.16)') 'z2bar', z2bar
1361 0 : write (*, '(a40,d26.16)') 'ye', ye
1362 0 : do i = 1, species
1363 0 : write (*, '(a40,i6,d26.16)') 'init x '//trim(chem_isos%name(chem_id(i))), i, xin(i)
1364 : end do
1365 0 : write (*, '(A)')
1366 0 : write (*, '(a40,d26.16)') 'logT', logT
1367 0 : write (*, '(a40,d26.16)') 'logRho', logRho
1368 0 : write (*, '(a40,d26.16)') 'eta', eta
1369 :
1370 0 : skip_jacobian = .false.
1371 :
1372 0 : n%screening_mode = screening_mode
1373 :
1374 : if (.false.) then
1375 : write (*, *) 'call net_get_rates_only'
1376 : call net_get_rates_only( &
1377 : net_handle, n, species, num_reactions, &
1378 : xin, T, logT, Rho, logRho, &
1379 : abar, zbar, z2bar, ye, eta, d_eta_dlnT, d_eta_dlnRho, &
1380 : rate_factors, weak_rate_factor, &
1381 : std_reaction_Qs, std_reaction_neuQs, &
1382 : screening_mode, &
1383 : ierr)
1384 : call mesa_error(__FILE__, __LINE__, 'net_get_rates_only')
1385 : end if
1386 :
1387 : call net_get_with_Qs( &
1388 : net_handle, skip_jacobian, n, species, num_reactions, &
1389 : xin, T, logT, Rho, logRho, &
1390 : abar, zbar, z2bar, ye, eta, d_eta_dlnT, d_eta_dlnRho, &
1391 : rate_factors, weak_rate_factor, &
1392 : std_reaction_Qs, std_reaction_neuQs, &
1393 : eps_nuc, d_eps_nuc_dRho, d_eps_nuc_dT, d_eps_nuc_dx, &
1394 : dxdt, d_dxdt_dRho, d_dxdt_dT, d_dxdt_dx, &
1395 : screening_mode, &
1396 : eps_nuc_categories, eps_neu_total, &
1397 0 : actual_Qs, actual_neuQs, from_weaklib, info)
1398 0 : if (info /= 0) then
1399 0 : write (*, 1) 'logT', logT
1400 0 : write (*, 1) 'logRho', logRho
1401 0 : write (*, *) 'bad return from net_get'
1402 0 : call mesa_error(__FILE__, __LINE__)
1403 : end if
1404 :
1405 : if (.true.) then ! dfridr tests for partials
1406 :
1407 : !doing_d_dlnd = .true.
1408 0 : doing_d_dlnd = .false.
1409 0 : doing_dx = .false.
1410 :
1411 0 : j_dx = 22
1412 0 : var_0 = dxdt(j_dx)
1413 :
1414 0 : if (doing_dx) then
1415 0 : j_dx = 20 ! fe56
1416 0 : j_dx_sink = 17 ! cr56
1417 0 : dx_0 = xin(j_dx)*1d-6
1418 0 : dvardx_0 = d_eps_nuc_dx(j_dx)
1419 0 : write (*, 1) 'xin(fe56)', xin(j_dx)
1420 0 : write (*, 1) 'xin(cr56)', xin(j_dx_sink)
1421 0 : write (*, 1) 'eps_nuc', eps_nuc
1422 0 : write (*, '(A)')
1423 : !call mesa_error(__FILE__,__LINE__,'testing')
1424 0 : else if (doing_d_dlnd) then
1425 0 : dx_0 = max(1d-14, abs(logRho*ln10*1d-6))
1426 0 : dvardx_0 = d_eps_nuc_dRho*Rho ! d_dxdt_dRho(1)*Rho ! analytic value of partial
1427 : else
1428 0 : dx_0 = max(1d-14, abs(logT*ln10*1d-6))
1429 : !dvardx_0 = d_eps_nuc_dT*T
1430 0 : dvardx_0 = d_dxdt_dT(j_dx)*T
1431 : end if
1432 0 : err = 0d0
1433 0 : dvardx = dfridr(dx_0, err)
1434 0 : xdum = (dvardx - dvardx_0)/max(abs(dvardx_0), 1d-50)
1435 0 : write (*, 1) 'analytic, numeric, est err in numeric, rel diff', &
1436 0 : dvardx_0, dvardx, err, xdum
1437 0 : if (doing_dx) then
1438 0 : write (*, *) 'doing d_dx '//trim(chem_isos%name(chem_id(j_dx)))
1439 0 : else if (doing_d_dlnd) then
1440 0 : write (*, *) 'doing dlnd'
1441 : else ! doing d_dlnT
1442 0 : write (*, *) 'doing dlnT'
1443 : end if
1444 0 : write (*, *) 'test net'
1445 0 : write (*, '(A)')
1446 :
1447 0 : call mesa_error(__FILE__, __LINE__, 'test net')
1448 :
1449 : end if
1450 :
1451 0 : if (show_Qs) then
1452 0 : write (*, '(A)')
1453 0 : write (*, 1) 'logT', logT
1454 0 : write (*, 1) 'logRho', logRho
1455 0 : write (*, '(A)')
1456 0 : write (*, '(30x,4a20)') 'Q total', 'Q neutrino', 'Q total-neutrino'
1457 0 : do i = 1, num_reactions
1458 0 : if (from_weaklib(i)) then
1459 0 : write (*, '(a30,99f20.10)') 'weaklib '//trim(reaction_Name(reaction_id(i))), &
1460 0 : actual_Qs(i), actual_neuQs(i), actual_Qs(i) - actual_neuQs(i)
1461 : else
1462 0 : write (*, '(a30,99f20.10)') trim(reaction_Name(reaction_id(i))), &
1463 0 : actual_Qs(i), actual_neuQs(i), actual_Qs(i) - actual_neuQs(i)
1464 : end if
1465 : end do
1466 0 : write (*, '(A)')
1467 0 : stop
1468 : end if
1469 :
1470 0 : write (*, 2) 'screening_mode', screening_mode
1471 :
1472 : if (.true.) then
1473 0 : write (*, 1) 'logT', logT
1474 0 : write (*, 1) 'logRho', logRho
1475 0 : write (*, '(A)')
1476 :
1477 0 : write (*, 1) 'eps_nuc', eps_nuc
1478 0 : write (*, 1) 'd_epsnuc_dlnd', d_eps_nuc_dRho*Rho
1479 0 : write (*, 1) 'd_epsnuc_dlnT', d_eps_nuc_dT*T
1480 0 : write (*, '(A)')
1481 :
1482 0 : if (eps_nuc > 0) then
1483 0 : write (*, 1) 'log eps_nuc', log10(eps_nuc)
1484 0 : write (*, 1) 'd_lnepsnuc_dlnd', d_eps_nuc_dRho*Rho/eps_nuc
1485 0 : write (*, 1) 'd_lnepsnuc_dlnT', d_eps_nuc_dT*T/eps_nuc
1486 0 : write (*, '(A)')
1487 : end if
1488 :
1489 : !stop
1490 :
1491 : if (.false.) then
1492 :
1493 : do i = 1, species
1494 : write (*, 1) 'd_eps_nuc_dx '//trim(chem_isos%name(chem_id(i))), d_eps_nuc_dx(i)
1495 : end do
1496 : write (*, '(A)')
1497 :
1498 : do i = 1, species
1499 : write (*, 1) 'd_dxdt_dlnRho '//trim(chem_isos%name(chem_id(i))), d_dxdt_dRho(i)*rho
1500 : end do
1501 : write (*, '(A)')
1502 :
1503 : do i = 1, species
1504 : write (*, 1) 'd_dxdt_dlnT '//trim(chem_isos%name(chem_id(i))), d_dxdt_dT(i)*T
1505 : end do
1506 : write (*, '(A)')
1507 :
1508 : if (.false.) then
1509 : do i = 1, species
1510 : write (*, 1) 'd_dxdt_dx(:,neut) '// &
1511 : trim(chem_isos%name(chem_id(i))), d_dxdt_dx(i, net_iso(ineut))
1512 : end do
1513 : write (*, '(A)')
1514 : end if
1515 :
1516 : do i = 1, species
1517 : write (*, 1) 'dxdt '//trim(chem_isos%name(chem_id(i))), dxdt(i)
1518 : end do
1519 : write (*, 1) 'sum(dxdt)', sum(dxdt(1:species))
1520 :
1521 : do i = 1, nrates_to_show
1522 : j = rates_to_show(i)
1523 : if (j == 0) cycle
1524 : write (*, 1) 'd_rate_raw_dT '//trim(reaction_Name(j)), &
1525 : rate_raw_dT(reaction_table(j))
1526 : end do
1527 : write (*, '(A)')
1528 :
1529 : end if
1530 :
1531 0 : do i = 1, nrates_to_show
1532 0 : j = rates_to_show(i)
1533 0 : if (j == 0) cycle
1534 0 : write (*, 1) 'rate_raw '//trim(reaction_Name(j)), &
1535 0 : rate_raw(reaction_table(j))
1536 : end do
1537 0 : write (*, '(A)')
1538 :
1539 0 : do i = 1, nrates_to_show
1540 0 : j = rates_to_show(i)
1541 0 : if (j == 0) cycle
1542 0 : write (*, 1) 'rate_screened '//trim(reaction_Name(j)), &
1543 0 : rate_screened(reaction_table(j))
1544 : end do
1545 0 : write (*, '(A)')
1546 :
1547 0 : do i = 1, nrates_to_show
1548 0 : j = rates_to_show(i)
1549 0 : if (j == 0) cycle
1550 0 : write (*, 1) 'Q total '//trim(reaction_Name(j)), &
1551 0 : actual_Qs(reaction_table(j))
1552 : end do
1553 0 : write (*, '(A)')
1554 :
1555 0 : do i = 1, nrates_to_show
1556 0 : j = rates_to_show(i)
1557 0 : if (j == 0) cycle
1558 0 : write (*, 1) 'Q neutrino '//trim(reaction_Name(j)), &
1559 0 : actual_neuQs(reaction_table(j))
1560 : end do
1561 0 : write (*, '(A)')
1562 :
1563 0 : do i = 1, nrates_to_show
1564 0 : j = rates_to_show(i)
1565 0 : if (j == 0) cycle
1566 0 : write (*, 1) 'Q total-neutrino '//trim(reaction_Name(j)), &
1567 0 : actual_Qs(reaction_table(j)) - actual_neuQs(reaction_table(j))
1568 : end do
1569 0 : write (*, '(A)')
1570 :
1571 : if (.false.) then
1572 :
1573 : do i = 1, species
1574 : write (*, 1) 'x '//trim(chem_isos%name(chem_id(i))), xin(i)
1575 : end do
1576 : write (*, '(A)')
1577 :
1578 : do i = 1, species
1579 : if (-dxdt(i) > 1d-90) &
1580 : write (*, 1) 'x/dxdt '//trim(chem_isos%name(chem_id(i))), xin(i)/dxdt(i)
1581 : end do
1582 : write (*, '(A)')
1583 :
1584 : do i = 1, num_categories
1585 : if (abs(eps_nuc_categories(i)) < 1d-20) cycle
1586 : write (*, 1) 'eps_nuc_cat '//trim(category_name(i)), eps_nuc_categories(i)
1587 : end do
1588 : write (*, '(A)')
1589 :
1590 : end if
1591 :
1592 0 : stop
1593 : end if
1594 :
1595 : write (*, '(A)')
1596 : write (*, '(A)')
1597 : write (*, *) 'net_name ', trim(net_file)
1598 : write (*, *) 'species', species
1599 : write (*, 1) 'abar =', abar
1600 : write (*, 1) 'zbar =', zbar
1601 : write (*, 1) 'z2bar =', z2bar
1602 : write (*, 1) 'ye =', ye
1603 : write (*, *)
1604 : do i = 1, nrates_to_show
1605 : j = rates_to_show(i)
1606 : if (j == 0) cycle
1607 : if (reaction_table(j) == 0) then
1608 : write (*, *) 'missing reaction_table(j) for '//trim(reaction_Name(j))
1609 : stop
1610 : end if
1611 : end do
1612 : write (*, '(A)')
1613 : write (*, 1) 'eps_nuc', eps_nuc
1614 : write (*, 1) 'd_eps_nuc_dRho', d_eps_nuc_dRho
1615 : write (*, 1) 'd_eps_nuc_dT', d_eps_nuc_dT
1616 : do j = 1, species
1617 : write (*, 1) 'd_eps_nuc_dx '//trim(chem_isos%name(chem_id(j))), d_eps_nuc_dx(j)
1618 : end do
1619 : write (*, '(A)')
1620 : do j = 1, species
1621 : write (*, 1) 'dxdt '//trim(chem_isos%name(chem_id(j))), dxdt(j)
1622 : end do
1623 : write (*, '(A)')
1624 : do j = 1, species
1625 : write (*, 1) 'd_dxdt_dRho '//trim(chem_isos%name(chem_id(j))), d_dxdt_dRho(j)
1626 : end do
1627 : write (*, '(A)')
1628 : do j = 1, species
1629 : write (*, 1) 'd_dxdt_dT '//trim(chem_isos%name(chem_id(j))), d_dxdt_dT(j)
1630 : end do
1631 : write (*, '(A)')
1632 : do j = 1, species
1633 : write (*, 1) 'd_dxdt_dx(1,:) '//trim(chem_isos%name(chem_id(j))), d_dxdt_dx(1, j)
1634 : end do
1635 : write (*, *)
1636 : do j = 1, num_categories
1637 : write (*, 1) trim(category_name(j)), eps_nuc_categories(j)
1638 : end do
1639 : write (*, '(A)')
1640 : write (*, 1) 'eta =', eta
1641 : write (*, 1) 'logT =', logT
1642 : write (*, 1) 'logRho =', logRho
1643 : write (*, *) 'screening_mode =', screening_mode
1644 : write (*, '(A)')
1645 : do j = 1, species
1646 : write (*, 1) 'xin(net_iso(i'//trim(chem_isos%name(chem_id(j)))//'))= ', xin(j)
1647 : end do
1648 : write (*, '(A)')
1649 : write (*, 1) 'sum(xin(1:species))', sum(xin(1:species))
1650 : write (*, 1) '1 - sum(xin(1:species))', 1 - sum(xin(1:species))
1651 : write (*, '(A)')
1652 : write (*, 1) 'eps_nuc', eps_nuc
1653 : write (*, 1) 'eps_nuc_neu_total', eps_neu_total
1654 :
1655 0 : deallocate (rate_factors, actual_Qs, actual_neuQs, from_weaklib)
1656 :
1657 : contains
1658 :
1659 0 : real(dp) function dfridr_func(delta_x) result(val)
1660 : real(dp), intent(in) :: delta_x
1661 : integer :: ierr
1662 0 : real(dp) :: var, log_var
1663 : include 'formats'
1664 0 : ierr = 0
1665 :
1666 0 : if (doing_dx) then
1667 :
1668 0 : xin_copy = xin
1669 0 : xin_copy(j_dx) = xin_copy(j_dx) + delta_x
1670 0 : xin_copy(j_dx_sink) = xin_copy(j_dx_sink) - delta_x
1671 :
1672 : call net_get_with_Qs( &
1673 : net_handle, skip_jacobian, n, species, num_reactions, &
1674 : xin_copy, T, logT, Rho, logRho, &
1675 : abar, zbar, z2bar, ye, eta, d_eta_dlnT, d_eta_dlnRho, &
1676 : rate_factors, weak_rate_factor, &
1677 : std_reaction_Qs, std_reaction_neuQs, &
1678 : eps_nuc, d_eps_nuc_dRho, d_eps_nuc_dT, d_eps_nuc_dx, &
1679 : dxdt, d_dxdt_dRho, d_dxdt_dT, d_dxdt_dx, &
1680 : screening_mode, &
1681 : eps_nuc_categories, eps_neu_total, &
1682 0 : actual_Qs, actual_neuQs, from_weaklib, ierr)
1683 :
1684 0 : write (*, 1) 'xin(j)', xin_copy(j_dx)
1685 0 : write (*, 1) 'xin(j_sink)', xin_copy(j_dx_sink)
1686 0 : write (*, 1) 'eps_nuc', eps_nuc
1687 0 : write (*, '(A)')
1688 :
1689 0 : else if (doing_d_dlnd) then
1690 :
1691 0 : log_var = logRho + delta_x/ln10
1692 0 : var = exp10(log_var)
1693 :
1694 : call net_get_with_Qs( &
1695 : net_handle, skip_jacobian, n, species, num_reactions, &
1696 : xin, T, logT, var, log_var, &
1697 : abar, zbar, z2bar, ye, eta, d_eta_dlnT, d_eta_dlnRho, &
1698 : rate_factors, weak_rate_factor, &
1699 : std_reaction_Qs, std_reaction_neuQs, &
1700 : eps_nuc, d_eps_nuc_dRho, d_eps_nuc_dT, d_eps_nuc_dx, &
1701 : dxdt, d_dxdt_dRho, d_dxdt_dT, d_dxdt_dx, &
1702 : screening_mode, &
1703 : eps_nuc_categories, eps_neu_total, &
1704 0 : actual_Qs, actual_neuQs, from_weaklib, ierr)
1705 :
1706 : else
1707 :
1708 0 : log_var = logT + delta_x/ln10
1709 0 : var = exp10(log_var)
1710 :
1711 : call net_get_with_Qs( &
1712 : net_handle, skip_jacobian, n, species, num_reactions, &
1713 : xin, var, log_var, Rho, logRho, &
1714 : abar, zbar, z2bar, ye, eta, d_eta_dlnT, d_eta_dlnRho, &
1715 : rate_factors, weak_rate_factor, &
1716 : std_reaction_Qs, std_reaction_neuQs, &
1717 : eps_nuc, d_eps_nuc_dRho, d_eps_nuc_dT, d_eps_nuc_dx, &
1718 : dxdt, d_dxdt_dRho, d_dxdt_dT, d_dxdt_dx, &
1719 : screening_mode, &
1720 : eps_nuc_categories, eps_neu_total, &
1721 0 : actual_Qs, actual_neuQs, from_weaklib, ierr)
1722 :
1723 : end if
1724 :
1725 0 : if (ierr /= 0) call mesa_error(__FILE__, __LINE__, 'failed in call on net_get_with_Qs')
1726 : !val = eps_nuc ! dxdt(1)
1727 0 : val = dxdt(j_dx)
1728 :
1729 0 : end function dfridr_func
1730 :
1731 0 : real(dp) function dfridr(hx, err) ! from Frank
1732 : real(dp), intent(in) :: hx
1733 : real(dp), intent(out) :: err
1734 : ! this routine returns the first derivative of a function func(x)
1735 : ! at the point x, by ridders method of polynomial extrapolation.
1736 : ! value hx is the initial step size;
1737 : ! it should be an increment for which func changes substantially.
1738 : ! an estimate of the error in the first derivative is returned in err.
1739 : integer, parameter :: ntab = 20
1740 : integer :: i, j
1741 0 : real(dp) :: errt, fac, hh, a(ntab, ntab)
1742 : real(dp), parameter :: con2 = 2d0, con = sqrt(con2), big = 1d50, safe = 2d0
1743 : include 'formats'
1744 0 : dfridr = 0d0
1745 0 : hh = hx
1746 : ! 2nd order central difference
1747 0 : a(1, 1) = (dfridr_func(hh) - dfridr_func(-hh))/(2d0*hh)
1748 0 : write (*, 2) 'dfdx hh', 1, a(1, 1), hh
1749 0 : err = big
1750 : ! successive columns in the neville tableu will go to smaller stepsizes
1751 : ! and higher orders of extrapolation
1752 0 : do i = 2, ntab
1753 0 : hh = hh/con
1754 0 : a(1, i) = (dfridr_func(hh) - dfridr_func(-hh))/(2d0*hh)
1755 0 : write (*, 2) 'dfdx hh', i, a(1, i), hh
1756 : ! compute extrapolations of various orders; the error strategy is to compare
1757 : ! each new extrapolation to one order lower but both at the same stepsize
1758 : ! and at the previous stepsize
1759 0 : fac = con2
1760 0 : do j = 2, i
1761 0 : a(j, i) = (a(j - 1, i)*fac - a(j - 1, i - 1))/(fac - 1d0)
1762 0 : fac = con2*fac
1763 0 : errt = max(abs(a(j, i) - a(j - 1, i)), abs(a(j, i) - a(j - 1, i - 1)))
1764 : ! write(*,3) 'a(j,i)', j, i, a(j,i), errt
1765 0 : if (errt <= err) then
1766 0 : err = errt
1767 0 : dfridr = a(j, i)
1768 : !write(*,3) 'dfridr err', i, j, dfridr, err
1769 : end if
1770 : end do
1771 : ! if higher order is worse by a significant factor safe, then bail
1772 0 : if (abs(a(i, i) - a(i - 1, i - 1)) >= safe*err) then
1773 0 : write (*, 1) 'higher order is worse', err, a(i, i), a(i - 1, i - 1)
1774 0 : return
1775 : end if
1776 : end do
1777 0 : end function dfridr
1778 :
1779 : end subroutine Do_One_Testcase
1780 :
1781 0 : subroutine test_neutrino_Q
1782 : real(dp), parameter :: Qnu_n13 = 0.714440d0 !..13n(e+nu)13c
1783 : real(dp), parameter :: Qnu_o15 = 1.005513d0 !..15o(e+nu)15n
1784 : real(dp), parameter :: Qnu_f17 = 1.009145d0 !..17f(e+nu)17o
1785 : real(dp), parameter :: Qnu_f18 = 0.393075d0 !..18f(e+nu)18o
1786 : real(dp), parameter :: Qnu_o14 = 2.22d0 !..14o(e+nu)14n
1787 : real(dp), parameter :: Qnu_ne18 = 1.87d0 !..18ne(e+nu)18f
1788 : real(dp), parameter :: Qnu_ne19 = 1.25d0 !..19ne(e+nu)19f
1789 : !real(dp), parameter :: Qnu_mg21 = 6.2d0 !..mg21(e+nu)na21
1790 : real(dp), parameter :: Qnu_mg22 = 2.1d0 !..mg22(e+nu)na22
1791 :
1792 : 1 format(a40, 1pd26.16)
1793 :
1794 0 : write (*, 1) 'expected Q for 13n(e+nu)13c', Qnu_n13
1795 0 : write (*, 1) 'calculated Q for 13n(e+nu)13c', eval_neutrino_Q(in13, ic13)
1796 0 : write (*, *)
1797 0 : write (*, 1) 'expected Q for 15o(e+nu)15n', Qnu_o15
1798 0 : write (*, 1) 'calculated Q for 15o(e+nu)15n', eval_neutrino_Q(io15, in15)
1799 0 : write (*, *)
1800 0 : write (*, 1) 'expected Q for 17f(e+nu)17o', Qnu_f17
1801 0 : write (*, 1) 'calculated Q for 17f(e+nu)17o', eval_neutrino_Q(if17, io17)
1802 0 : write (*, *)
1803 0 : write (*, 1) 'expected Q for 18f(e+nu)18o', Qnu_f18
1804 0 : write (*, 1) 'calculated Q for 18f(e+nu)18o', eval_neutrino_Q(if18, io18)
1805 0 : write (*, *)
1806 0 : write (*, 1) 'expected Q for 14o(e+nu)14n', Qnu_o14
1807 0 : write (*, 1) 'calculated Q for 14o(e+nu)14n', eval_neutrino_Q(io14, in14)
1808 0 : write (*, *)
1809 0 : write (*, 1) 'expected Q for 18ne(e+nu)18f', Qnu_ne18
1810 0 : write (*, 1) 'calculated Q for 18ne(e+nu)18f', eval_neutrino_Q(ine18, if18)
1811 0 : write (*, *)
1812 0 : write (*, 1) 'expected Q for 19ne(e+nu)19f', Qnu_ne19
1813 0 : write (*, 1) 'calculated Q for 19ne(e+nu)19f', eval_neutrino_Q(ine19, if19)
1814 0 : write (*, *)
1815 0 : write (*, 1) 'expected Q for mg22(e+nu)na22', Qnu_mg22
1816 0 : write (*, 1) 'calculated Q for mg22(e+nu)na22', eval_neutrino_Q(img22, ina22)
1817 0 : write (*, *)
1818 0 : stop
1819 :
1820 : end subroutine test_neutrino_Q
1821 :
1822 : end module test_net_support
|