Line data Source code
1 : ! ***********************************************************************
2 : !
3 : ! Copyright (C) 2010-2019 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 micro
21 :
22 : use star_private_def
23 : use const_def, only: dp, i8, ln10, crad, qe, avo, kerg, one_third, four_thirds_pi
24 : use star_utils, only: foreach_cell
25 : use utils_lib, only: is_bad
26 :
27 : implicit none
28 :
29 : private
30 : public :: set_micro_vars
31 : public :: set_eos_with_mask
32 : public :: do_eos_for_cell
33 : public :: store_eos_for_cell
34 : public :: do_kap_for_cell
35 : public :: shutdown_microphys
36 :
37 : logical, parameter :: dbg = .false.
38 : logical :: initiaze_kap_grid = .true.
39 : real(dp), public, save :: fk_pcg_old(17)
40 :
41 : contains
42 :
43 67 : subroutine set_micro_vars( &
44 : s, nzlo, nzhi, skip_eos, skip_net, skip_neu, skip_kap, ierr)
45 :
46 : use kap_support, only: prepare_kap
47 : use star_utils, only: start_time, update_time
48 : use net, only: do_net
49 : use chem_def, only: icno, ipp, chem_isos
50 : use rates_def, only: i_rate
51 : use kap_lib
52 :
53 :
54 : type (star_info), pointer :: s
55 : integer, intent(in) :: nzlo, nzhi
56 : logical, intent(in) :: skip_eos, skip_net, skip_neu, skip_kap
57 : integer, intent(out) :: ierr
58 :
59 : integer :: k, op_err, i
60 : integer(i8) :: time0
61 66 : real(dp) :: total, alfa, beta
62 : character(len=4) :: e_name
63 1188 : real(dp) :: fk(17), delta
64 :
65 :
66 :
67 : include 'formats'
68 :
69 66 : ierr = 0
70 : if (dbg) then
71 : write(*,'(A)')
72 : write(*,*) 'set_micro_vars'
73 : write(*,*) 'nzlo', nzlo
74 : write(*,*) 'nzhi', nzhi
75 : write(*,*) 'skip_net', skip_net
76 : write(*,*) 'skip_kap', skip_kap
77 : end if
78 :
79 66 : if (.not. skip_eos) then
80 66 : call set_eos(ierr)
81 66 : if (ierr /= 0) return
82 : end if
83 :
84 80060 : do k=nzlo, nzhi
85 80060 : if (s% csound_start(k) < 0) then
86 40733 : s% csound_start(k) = s% csound(k)
87 : end if
88 : end do
89 :
90 80060 : do k=nzlo, nzhi
91 80060 : if (k == 1) then
92 66 : s% rho_face(k) = s% rho(k)
93 66 : if (.not. s% u_flag) s% P_face_ad(k)%val = s% Peos(k)
94 66 : s% csound_face(1) = s% csound(1)
95 : else
96 79928 : alfa = s% dq(k-1)/(s% dq(k-1) + s% dq(k))
97 79928 : beta = 1 - alfa
98 79928 : s% rho_face(k) = alfa*s% rho(k) + beta*s% rho(k-1)
99 79928 : if (.not. s% u_flag) s% P_face_ad(k)%val = alfa*s% Peos(k) + beta*s% Peos(k-1)
100 79928 : s% csound_face(k) = alfa*s% csound(k) + beta*s% csound(k-1)
101 : end if
102 : end do
103 :
104 66 : if (.not. (skip_kap .and. skip_neu)) then
105 :
106 66 : if (.not. skip_kap .and. s% op_mono_method == 'hu') then
107 66 : call prepare_kap(s, ierr)
108 66 : if (ierr /= 0) return
109 : end if
110 66 : if (.not. skip_kap .and. s% op_mono_method == 'mombarg' .and. &
111 : s% high_logT_op_mono_full_on - s% low_logT_op_mono_full_on > 0 ) then
112 0 : fk = 0
113 0 : do i=1, s% species
114 0 : e_name = chem_isos% name(s% chem_id(i))
115 0 : if (e_name == 'h1') fk(1) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
116 0 : if (e_name == 'he4') fk(2) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
117 0 : if (e_name == 'c12') fk(3) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
118 0 : if (e_name == 'n14') fk(4) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
119 0 : if (e_name == 'o16') fk(5) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
120 0 : if (e_name == 'ne20')fk(6) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
121 0 : if (e_name == 'na23')fk(7) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
122 0 : if (e_name == 'mg24')fk(8) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
123 0 : if (e_name == 'al27')fk(9) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
124 0 : if (e_name == 'si28')fk(10) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
125 0 : if (e_name == 's32') fk(11) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
126 0 : if (e_name == 'ar40')fk(12) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
127 0 : if (e_name == 'ca40')fk(13) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
128 0 : if (e_name == 'cr52')fk(14) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
129 0 : if (e_name == 'mn55')fk(15) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
130 0 : if (e_name == 'fe56')fk(16) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
131 0 : if (e_name == 'ni58')fk(17) = s% xa(i,s% nz)/ chem_isos% W(s% chem_id(i))
132 : end do
133 0 : fk = fk / sum(fk)
134 0 : delta = MAXVAL(ABS(fk - fk_pcg_old)/fk_pcg_old)
135 :
136 0 : if (initiaze_kap_grid) then
137 0 : call call_load_op_master(s% emesh_data_for_op_mono_path, ierr)
138 0 : write(*,*) 'Computing kappa grid for initial mixture.'
139 0 : call call_compute_kappa_grid_mombarg(fk, ierr)
140 : !write(*,*) 'Finished computing grid for initial mixture.'
141 0 : fk_pcg_old = fk
142 0 : initiaze_kap_grid = .false.
143 0 : else if (delta > 1d-4) THEN
144 0 : write(*,*) 'Computing kappa grid for core mixture.'
145 0 : write(*,*) delta
146 0 : call call_compute_kappa_grid_mombarg(fk, ierr)
147 : !write(*,*) 'Finished computing grid for core mixture.'
148 0 : fk_pcg_old = fk
149 : end if
150 : end if
151 :
152 66 : if (s% use_other_opacity_factor) then
153 0 : call s% other_opacity_factor(s% id, ierr)
154 0 : if (ierr /= 0) return
155 : else
156 80060 : s% extra_opacity_factor(1:s% nz) = s% opacity_factor
157 : end if
158 :
159 66 : if (s% doing_timing) call start_time(s, time0, total)
160 :
161 :
162 :
163 66 : !$OMP PARALLEL DO PRIVATE(k,op_err) SCHEDULE(dynamic,2)
164 : do k = nzlo, nzhi
165 : op_err = 0
166 : call do1_neu_kap(s,k,op_err)
167 : if (op_err /= 0) ierr = op_err
168 : end do
169 : !$OMP END PARALLEL DO
170 66 : if (s% doing_timing) call update_time(s, time0, total, s% time_neu_kap)
171 66 : if (ierr /= 0) then
172 0 : if (s% report_ierr) write(*,*) 'do1_neu_kap returned ierr', ierr
173 0 : return
174 : end if
175 :
176 : end if
177 :
178 66 : if (ierr /= 0) return
179 :
180 132 : if (.not. skip_net) then
181 :
182 : if (dbg) write(*,*) 'micro: call do_net'
183 66 : call do_net(s, nzlo, nzhi, ierr)
184 : if (dbg) write(*,*) 'micro: done do_net'
185 66 : if (ierr /= 0) then
186 0 : if (s% report_ierr) write(*,*) 'do_net returned ierr', ierr
187 0 : return
188 : end if
189 :
190 : end if
191 :
192 : contains
193 :
194 80192 : subroutine set_eos(ierr)
195 : integer, intent(out) :: ierr
196 : include 'formats'
197 66 : ierr = 0
198 : if (dbg) write(*,*) 'call do_eos'
199 66 : if (s% doing_timing) call start_time(s, time0, total)
200 : call do_eos(s,nzlo,nzhi,ierr)
201 66 : if (s% doing_timing) call update_time(s, time0, total, s% time_eos)
202 66 : if (ierr /= 0) then
203 0 : if (s% report_ierr) write(*,*) 'do_eos returned ierr', ierr
204 0 : return
205 : end if
206 66 : end subroutine set_eos
207 :
208 : subroutine debug(str)
209 : use chem_def
210 : character (len=*), intent(in) :: str
211 : integer :: k, j
212 : include 'formats'
213 : k = 1469
214 : do j=1,1 !s% species
215 : if (.true. .or. s% xa(j,k) > 1d-9) &
216 : write(*,1) trim(str) // ' xin(net_iso(i' // &
217 : trim(chem_isos% name(s% chem_id(j))) // '))= ', s% xa(j,k)
218 : end do
219 : end subroutine debug
220 :
221 79994 : subroutine do1_neu_kap(s,k,ierr)
222 : use neu_def,only:Tmin_neu
223 : use neu, only: do_neu_for_cell, do_clear_neu_for_cell
224 : type (star_info), pointer :: s
225 : integer, intent(in) :: k
226 : integer, intent(out) :: ierr
227 79994 : if (s% T(k) >= Tmin_neu .and. s% non_nuc_neu_factor > 0d0) then
228 26684 : call do_neu_for_cell(s,k,ierr)
229 : else
230 53310 : call do_clear_neu_for_cell(s,k,ierr)
231 : end if
232 79994 : if (ierr /= 0) return
233 79994 : if (skip_kap) return
234 79994 : call do_kap_for_cell(s,k,ierr)
235 79994 : if (ierr /= 0) return
236 79994 : end subroutine do1_neu_kap
237 :
238 : end subroutine set_micro_vars
239 :
240 :
241 66 : subroutine do_eos(s,nzlo,nzhi,ierr)
242 :
243 : type (star_info), pointer :: s
244 : integer, intent(in) :: nzlo, nzhi
245 : integer, intent(out) :: ierr
246 : logical, parameter :: use_omp = .true.
247 : include 'formats'
248 :
249 : ierr = 0
250 :
251 : if (dbg) write(*,*) 'do_eos call foreach_cell', nzlo, nzhi
252 :
253 66 : call foreach_cell(s,nzlo,nzhi,use_omp,do_eos_for_cell,ierr)
254 :
255 : end subroutine do_eos
256 :
257 :
258 0 : subroutine set_eos_with_mask (s,nzlo,nzhi,mask,ierr)
259 :
260 : type (star_info), pointer :: s
261 : integer, intent(in) :: nzlo, nzhi
262 : logical, intent(in) :: mask(:)
263 : integer, intent(out) :: ierr
264 : include 'formats'
265 : integer :: k
266 0 : logical :: lerr(s%nz)
267 :
268 0 : ierr = 0
269 :
270 : if (dbg) write(*,*) 'set_eos_with_mask'
271 :
272 0 : !$OMP PARALLEL DO PRIVATE(ierr) SCHEDULE(dynamic,2)
273 : do k = nzlo, nzhi
274 : if (mask(k)) then
275 : call do_eos_for_cell(s, k, ierr)
276 : lerr(k) = ierr /= 0
277 : else
278 : lerr(k) = .FALSE.
279 : end if
280 : end do
281 : !$OMP END PARALLEL DO
282 :
283 0 : if (ANY(lerr(nzlo:nzhi))) then
284 0 : ierr = 1
285 : else
286 0 : ierr = 0
287 : end if
288 :
289 0 : end subroutine set_eos_with_mask
290 :
291 :
292 79994 : subroutine do_eos_for_cell(s,k,ierr)
293 :
294 : use chem_def
295 : use chem_lib
296 : use eos_def
297 : use eos_support
298 : use net_def, only: net_general_info
299 : use star_utils, only: write_eos_call_info, lookup_nameofvar
300 :
301 : type (star_info), pointer :: s
302 : integer, intent(in) :: k
303 : integer, intent(out) :: ierr
304 :
305 6399520 : real(dp), dimension(num_eos_basic_results) :: res, d_dlnd, d_dlnT
306 1999850 : real(dp), dimension(num_eos_d_dxa_results,s% species) :: d_dxa
307 79994 : real(dp) :: sumx, logRho, logT, logPgas
308 79994 : integer, pointer :: net_iso(:)
309 : integer :: species
310 : real(dp), parameter :: epsder = 1d-4, Z_limit = 0.5d0
311 : real(dp), parameter :: LOGRHO_TOL = 1d-8, LOGPGAS_TOL = 1d-8
312 :
313 : logical, parameter :: testing = .false.
314 :
315 : include 'formats'
316 :
317 79994 : ierr = 0
318 :
319 79994 : net_iso => s% net_iso
320 79994 : species = s% species
321 : call basic_composition_info( &
322 : species, s% chem_id, s% xa(1:species,k), s% X(k), s% Y(k), s% Z(k), &
323 : s% abar(k), s% zbar(k), s% z2bar(k), s% z53bar(k), &
324 79994 : s% ye(k), s% mass_correction(k), sumx)
325 :
326 79994 : logT = s% lnT(k)/ln10
327 :
328 79994 : if (s%fix_Pgas) then
329 :
330 0 : logPgas = s% lnPgas(k)/ln10
331 :
332 : call solve_eos_given_PgasT( &
333 : s, k, s% xa(:,k), &
334 : logT, logPgas, s% lnd(k)/ln10, LOGRHO_TOL, LOGPGAS_TOL, &
335 0 : logRho, res, d_dlnd, d_dlnT, d_dxa, ierr)
336 0 : if (ierr /= 0) then
337 0 : if (s% report_ierr) then
338 0 : write(*,*) 'do_eos_for_cell: solve_eos_given_PT ierr', ierr
339 : end if
340 0 : if (s% stop_for_bad_nums) call mesa_error(__FILE__,__LINE__,'do_eos_for_cell')
341 0 : return
342 : end if
343 :
344 0 : s% lnd(k) = logRho*ln10
345 0 : s% rho(k) = exp(s% lnd(k))
346 :
347 : end if
348 :
349 79994 : logRho = s% lnd(k)/ln10
350 :
351 79994 : if (s% solver_test_eos_partials) then
352 : eos_test_partials = (k == s% solver_test_partials_k .and. &
353 : s% solver_call_number == s% solver_test_partials_call_number .and. &
354 0 : s% solver_iter == s% solver_test_partials_iter_number )
355 : end if
356 :
357 : call get_eos( &
358 : s, k, s% xa(:,k), &
359 : s% rho(k), logRho, s% T(k), logT, &
360 : res, s% d_eos_dlnd(:,k), s% d_eos_dlnT(:,k), &
361 79994 : s% d_eos_dxa(:,:,k), ierr)
362 79994 : if (ierr /= 0) then
363 0 : if (s% report_ierr) then
364 0 : write(*, *) s% retry_message
365 0 : write(*,*) 'do_eos_for_cell: get_eos ierr', ierr
366 : end if
367 0 : if (s% stop_for_bad_nums) call mesa_error(__FILE__,__LINE__,'do_eos_for_cell')
368 0 : return
369 : end if
370 :
371 79994 : if (s% solver_test_eos_partials .and. eos_test_partials) then
372 0 : s% solver_test_partials_val = eos_test_partials_val
373 0 : s% solver_test_partials_dval_dx = eos_test_partials_dval_dx
374 : end if
375 :
376 79994 : s% lnPgas(k) = res(i_lnPgas)
377 79994 : s% Pgas(k) = exp(s% lnPgas(k))
378 :
379 79994 : call store_stuff(ierr)
380 79994 : if (ierr /= 0) return
381 :
382 : if (s% solver_test_partials_write_eos_call_info .and. &
383 : k == s% solver_test_partials_k .and. &
384 79994 : s% solver_call_number == s% solver_test_partials_call_number .and. &
385 159988 : s% solver_iter == s% solver_test_partials_iter_number) then
386 0 : call write_eos_call_info(s,k)
387 0 : if (s% stop_for_bad_nums) call mesa_error(__FILE__,__LINE__,'do_eos_for_cell: write_eos_call_info')
388 : end if
389 :
390 : contains
391 :
392 79994 : subroutine store_stuff(ierr)
393 :
394 : integer, intent(out) :: ierr
395 :
396 : include 'formats'
397 :
398 : call store_eos_for_cell(s, k, &
399 : res, s% d_eos_dlnd(:,k), s% d_eos_dlnT(:,k), &
400 79994 : s% d_eos_dxa(:,:,k), ierr)
401 :
402 79994 : if (ierr /= 0) then
403 0 : if (s% report_ierr) then
404 0 : call write_eos_call_info(s,k)
405 0 : write(*,2) 'store_eos_for_cell failed', k
406 : end if
407 0 : if (s% stop_for_bad_nums) call mesa_error(__FILE__,__LINE__,'do_eos_for_cell')
408 0 : return
409 : end if
410 :
411 79994 : end subroutine store_stuff
412 :
413 : end subroutine do_eos_for_cell
414 :
415 :
416 159988 : subroutine store_eos_for_cell(s, k, res, d_dlnd, d_dlnT, d_dxa, ierr)
417 :
418 : use eos_def
419 : use chem_def
420 : use star_utils, only: eval_csound, write_eos_call_info
421 :
422 : type (star_info), pointer :: s
423 : integer, intent(in) :: k
424 : real(dp), intent(in), dimension(num_eos_basic_results) :: res, d_dlnd, d_dlnT
425 : real(dp), intent(in) :: d_dxa(num_eos_d_dxa_results,s% species)
426 : integer, intent(out) :: ierr
427 :
428 : integer :: i, j
429 79994 : real(dp) :: T, rho
430 :
431 : include 'formats'
432 :
433 79994 : ierr = 0
434 :
435 : ! check values
436 2159838 : do i = 1, num_eos_basic_results
437 2159838 : if (is_bad(res(i) + d_dlnd(i) + d_dlnT(i))) then
438 0 : ierr = -1
439 0 : if (s% report_ierr) then
440 0 : !$OMP critical (micro_crit0)
441 0 : write(*,2) trim(eosDT_result_names(i)), k, res(i)
442 0 : write(*,2) 'd_dlnd ' // trim(eosDT_result_names(i)), k, d_dlnd(i)
443 0 : write(*,2) 'd_dlnT ' // trim(eosDT_result_names(i)), k, d_dlnT(i)
444 0 : write(*,'(A)')
445 0 : call write_eos_call_info(s,k)
446 : !$OMP end critical (micro_crit0)
447 : end if
448 0 : if (s% stop_for_bad_nums) call mesa_error(__FILE__,__LINE__,'store_eos_for_cell')
449 0 : return
450 : end if
451 : end do
452 :
453 79994 : T = s% T(k)
454 79994 : rho = s% rho(k)
455 79994 : if (T > 1d15 .or. rho > 1d15) then
456 0 : ierr = -1
457 0 : if (s% report_ierr) then
458 0 : write(*,4) 'bad T or rho for eos', k, s% solver_iter, s% model_number
459 0 : write(*,2) 'T', k, T
460 0 : write(*,2) 'rho', k, rho
461 : end if
462 0 : return
463 : end if
464 79994 : s% Prad(k) = crad * T*T*T*T / 3
465 79994 : s% Peos(k) = s% Prad(k) + s% Pgas(k)
466 79994 : s% lnPeos(k) = log(s% Peos(k))
467 79994 : s% lnS(k) = res(i_lnS)
468 79994 : s% lnE(k) = res(i_lnE)
469 79994 : s% energy(k) = exp(s% lnE(k))
470 79994 : s% entropy(k) = exp(s% lnS(k))
471 79994 : s% grada(k) = res(i_grad_ad)
472 79994 : s% dE_dRho(k) = res(i_dE_drho)
473 79994 : s% Cv(k) = res(i_Cv)
474 79994 : s% Cp(k) = res(i_Cp)
475 79994 : s% chiRho(k) = res(i_chiRho)
476 79994 : s% chiT(k) = res(i_chiT)
477 79994 : s% gamma1(k) = res(i_gamma1)
478 79994 : s% gamma3(k) = res(i_gamma3)
479 79994 : s% eta(k) = res(i_eta)
480 : s% gam(k) = s% z53bar(k)*qe*qe * &
481 79994 : pow(four_thirds_pi*avo*rho*s% zbar(k)/s% abar(k),one_third) / (kerg*T)
482 79994 : s% mu(k) = res(i_mu)
483 79994 : s% lnfree_e(k) = res(i_lnfree_e)
484 :
485 79994 : s% phase(k) = res(i_phase)
486 79994 : s% latent_ddlnT(k) = res(i_latent_ddlnT)
487 79994 : s% latent_ddlnRho(k) = res(i_latent_ddlnRho)
488 :
489 79994 : s% eos_frac_OPAL_SCVH(k) = res(i_frac_OPAL_SCVH)
490 79994 : s% eos_frac_HELM(k) = res(i_frac_HELM)
491 79994 : s% eos_frac_Skye(k) = res(i_frac_Skye)
492 79994 : s% eos_frac_PC(k) = res(i_frac_PC)
493 79994 : s% eos_frac_FreeEOS(k) = res(i_frac_FreeEOS)
494 79994 : s% eos_frac_CMS(k) = res(i_frac_CMS)
495 79994 : s% eos_frac_ideal(k) = res(i_frac_ideal)
496 :
497 79994 : s% chiRho_for_partials(k) = s% Pgas(k)*d_dlnd(i_lnPgas)/s% Peos(k)
498 79994 : s% chiT_for_partials(k) = (s% Pgas(k)*d_dlnT(i_lnPgas) + 4d0*s% Prad(k))/s% Peos(k)
499 79994 : s% dE_drho_for_partials(k) = d_dlnd(i_lnE)*s% energy(k)/s% rho(k)
500 79994 : s% Cv_for_partials(k) = d_dlnT(i_lnE)*s% energy(k)/s% T(k)
501 79994 : s% dS_drho_for_partials(k) = d_dlnd(i_lnS)*s% entropy(k)/s% rho(k)
502 79994 : s% dS_dT_for_partials(k) = d_dlnT(i_lnS)*s% entropy(k)/s% T(k)
503 719946 : do j=1, s% species
504 639952 : s% dlnE_dxa_for_partials(j,k) = d_dxa(i_lnE,j)
505 719946 : s% dlnPeos_dxa_for_partials(j,k) = s% Pgas(k)*d_dxa(i_lnPgas,j)/s% Peos(k)
506 : end do
507 :
508 79994 : s% QQ(k) = s% chiT(k)/(s% rho(k)*s% T(k)*s% chiRho(k)) ! thermal expansion coefficient
509 79994 : s% csound(k) = eval_csound(s,k,ierr)
510 :
511 : ! check some key values
512 : if (s% gamma1(k) <= 0 .or. &
513 : s% grada(k) <= 0 .or. &
514 : s% csound(k) <= 0 .or. is_bad(s% csound(k)) .or. &
515 : s% chiT(k) <= 0 .or. &
516 : s% chiRho(k) <= 0 .or. &
517 79994 : s% Cv(k) <= 0 .or. &
518 : s% Cp(k) <= 0) then
519 0 : ierr = -1
520 : end if
521 :
522 79994 : if (ierr /= 0) then
523 0 : if (s% report_ierr) then
524 0 : !$OMP critical (micro_crit1)
525 0 : write(*,2) 's% Cp(k)', k, s% Cp(k)
526 0 : write(*,2) 's% csound(k)', k, s% csound(k)
527 0 : write(*,2) 's% lnPeos(k)', k, s% lnPeos(k)
528 0 : write(*,2) 's% gam(k)', k, s% gam(k)
529 0 : write(*,2) 's% Peos(k)', k, s% Peos(k)
530 0 : write(*,2) 's% Pgas(k)', k, s% Pgas(k)
531 0 : write(*,2) 's% rho(k)', k, s% rho(k)
532 0 : write(*,2) 's% T(k)', k, s% T(k)
533 0 : write(*,2) 'logRho', k, s% lnd(k)/ln10
534 0 : write(*,2) 'logT', k, s% lnT(k)/ln10
535 0 : write(*,2) 'abar', k, s% abar(k)
536 0 : write(*,2) 'zbar', k, s% zbar(k)
537 0 : write(*,*)
538 0 : call write_eos_call_info(s,k)
539 : !$OMP end critical (micro_crit1)
540 : end if
541 0 : if (s% stop_for_bad_nums) call mesa_error(__FILE__,__LINE__,'store_eos_for_cell')
542 0 : ierr = -1
543 : end if
544 :
545 79994 : end subroutine store_eos_for_cell
546 :
547 :
548 79994 : subroutine do_kap_for_cell(s,k,ierr)
549 :
550 79994 : use net_def,only:net_general_info
551 : use rates_def, only:i_rate
552 : use chem_def
553 : use kap_def
554 : use kap_lib
555 : use kap_support, only: fraction_of_op_mono, get_kap
556 : use eos_def, only : i_lnfree_e, i_eta
557 : use eos_lib, only: Radiation_Pressure
558 : use star_utils, only: get_XYZ
559 :
560 : type (star_info), pointer :: s
561 : integer, intent(in) :: k
562 : integer, intent(out) :: ierr
563 :
564 : real(dp) :: &
565 159988 : log10_rho, log10_T, dlnkap_dlnd, dlnkap_dlnT, zbar, &
566 : lnfree_e, d_lnfree_e_dlnRho, d_lnfree_e_dlnT, &
567 79994 : eta, d_eta_dlnRho, d_eta_dlnT, opacity_factor
568 :
569 399970 : real(dp), dimension(num_kap_fracs) :: kap_fracs
570 :
571 79994 : real(dp), pointer :: xa(:)
572 : logical :: test_partials
573 :
574 : include 'formats'
575 :
576 79994 : ierr = 0
577 :
578 79994 : log10_rho = s% lnd(k)/ln10
579 79994 : log10_T = s% lnT(k)/ln10
580 :
581 79994 : lnfree_e = s% lnfree_e(k)
582 79994 : d_lnfree_e_dlnRho = s% d_eos_dlnd(i_lnfree_e,k)
583 79994 : d_lnfree_e_dlnT = s% d_eos_dlnT(i_lnfree_e,k)
584 :
585 79994 : eta = s% eta(k)
586 79994 : d_eta_dlnRho = s% d_eos_dlnd(i_eta,k)
587 79994 : d_eta_dlnT = s% d_eos_dlnT(i_eta,k)
588 :
589 79994 : if (s% use_starting_composition_for_kap) then
590 0 : xa(1:s% species) => s% xa_start(1:s% species,k)
591 0 : zbar = s% zbar_start(k)
592 : else
593 79994 : xa(1:s% species) => s% xa(1:s% species,k)
594 79994 : zbar = s% zbar(k)
595 : end if
596 :
597 : call get_kap( &
598 : s, k, zbar, xa, log10_rho, log10_T, &
599 : lnfree_e, d_lnfree_e_dlnRho, d_lnfree_e_dlnT, &
600 : eta, d_eta_dlnRho, d_eta_dlnT, &
601 79994 : kap_fracs, s% opacity(k), dlnkap_dlnd, dlnkap_dlnT, ierr)
602 :
603 :
604 : ! unpack fractions
605 79994 : s% kap_frac_lowT(k) = kap_fracs(i_frac_lowT)
606 79994 : s% kap_frac_highT(k) = kap_fracs(i_frac_highT)
607 79994 : s% kap_frac_Type2(k) = kap_fracs(i_frac_Type2)
608 79994 : s% kap_frac_Compton(k) = kap_fracs(i_frac_Compton)
609 :
610 79994 : if (is_bad_num(s% opacity(k)) .or. ierr /= 0) then
611 0 : if (s% report_ierr) then
612 0 : write(*,*) 'do_kap_for_cell: get_kap ierr', ierr
613 0 : !$omp critical (star_kap_get)
614 0 : call show_stuff()
615 : !$omp end critical (star_kap_get)
616 : end if
617 0 : if (s% stop_for_bad_nums) call mesa_error(__FILE__,__LINE__,'do_kap_for_cell')
618 0 : ierr = -1
619 0 : return
620 : end if
621 :
622 79994 : opacity_factor = s% extra_opacity_factor(k)
623 79994 : if (s% min_logT_for_opacity_factor_off > 0) then
624 0 : if (log10_T >= s% max_logT_for_opacity_factor_off .or. &
625 : log10_T <= s% min_logT_for_opacity_factor_off) then
626 : opacity_factor = 1
627 0 : else if (log10_T > s% max_logT_for_opacity_factor_on) then
628 : opacity_factor = 1 + (opacity_factor-1)* &
629 : (log10_T - s% max_logT_for_opacity_factor_off)/ &
630 0 : (s% max_logT_for_opacity_factor_on - s% max_logT_for_opacity_factor_off)
631 0 : else if (log10_T < s% min_logT_for_opacity_factor_on) then
632 : opacity_factor = 1 + (opacity_factor-1)* &
633 : (log10_T - s% min_logT_for_opacity_factor_off)/ &
634 0 : (s% min_logT_for_opacity_factor_on - s% min_logT_for_opacity_factor_off)
635 : end if
636 : end if
637 :
638 79994 : s% opacity(k) = s% opacity(k)*opacity_factor
639 79994 : s% d_opacity_dlnd(k) = s% opacity(k)*dlnkap_dlnd
640 79994 : s% d_opacity_dlnT(k) = s% opacity(k)*dlnkap_dlnT
641 :
642 79994 : if (s% opacity(k) > s% opacity_max .and. s% opacity_max > 0) then
643 0 : s% opacity(k) = s% opacity_max
644 0 : s% d_opacity_dlnd(k) = 0
645 0 : s% d_opacity_dlnT(k) = 0
646 : end if
647 :
648 79994 : if (s% opacity(k) < s% opacity_min .and. s% opacity_min > 0) then
649 0 : s% opacity(k) = s% opacity_min
650 0 : s% d_opacity_dlnd(k) = 0
651 0 : s% d_opacity_dlnT(k) = 0
652 : end if
653 :
654 79994 : if (is_bad_num(s% opacity(k))) then
655 0 : if (s% stop_for_bad_nums) then
656 0 : !$omp critical (star_kap_get_bad_num)
657 0 : call show_stuff()
658 0 : call mesa_error(__FILE__,__LINE__,'do_kap_for_cell')
659 : !$omp end critical (star_kap_get_bad_num)
660 : end if
661 0 : ierr = -1
662 0 : return
663 : end if
664 :
665 :
666 : !test_partials = (k == s% solver_test_partials_k)
667 79994 : test_partials = .false.
668 :
669 159988 : if (test_partials) then
670 : s% solver_test_partials_val = s% opacity(k)
671 : s% solver_test_partials_var = s% i_lnd
672 : s% solver_test_partials_dval_dx = s% d_opacity_dlnd(k)
673 : write(*,*) 'do_kap_for_cell', s% solver_test_partials_var
674 : end if
675 :
676 :
677 :
678 : contains
679 :
680 0 : subroutine show_stuff()
681 79994 : use star_utils, only: write_eos_call_info
682 :
683 : include 'formats'
684 :
685 : real(dp) :: xc, xo, xh, xhe, Z
686 : integer :: i, iz
687 :
688 0 : write(*,*) 'eos info'
689 0 : call write_eos_call_info(s,k)
690 :
691 0 : write(*,*) 'kap info'
692 0 : call get_XYZ(s, s% xa(:,k), xh, xhe, Z)
693 0 : xc = 0; xo = 0
694 0 : do i=1, s% species
695 0 : iz = chem_isos% Z(s% chem_id(i))
696 0 : select case(iz)
697 : case (6)
698 0 : xc = xc + s% xa(i,k)
699 : case (8)
700 0 : xo = xo + s% xa(i,k)
701 : end select
702 : end do
703 0 : write(*,2) 'show opacity info', k
704 0 : write(*,*) 'kap_option ' // trim(kap_option_str(s% kap_rq% kap_option))
705 0 : write(*,*) 'kap_CO_option ' // trim(kap_CO_option_str(s% kap_rq% kap_CO_option))
706 0 : write(*,*) 'kap_lowT_option ' // trim(kap_lowT_option_str(s% kap_rq% kap_lowT_option))
707 0 : write(*,1) 'logT = ', log10_T
708 0 : write(*,1) 'logRho = ', log10_rho
709 0 : write(*,1) 'z = ', z
710 0 : write(*,1) 'Zbase = ', s% kap_rq% Zbase
711 0 : write(*,1) 'xh = ', xh
712 0 : write(*,1) 'xc = ', xc
713 0 : write(*,1) 'xo = ', xo
714 0 : write(*,1) 'lnfree_e = ', lnfree_e
715 0 : write(*,1) 'd_lnfree_e_dlnRho = ', d_lnfree_e_dlnRho
716 0 : write(*,1) 'd_lnfree_e_dlnT = ', d_lnfree_e_dlnT
717 0 : write(*,1) 'abar = ', s% abar(k)
718 0 : write(*,1) 'zbar = ', s% zbar(k)
719 0 : write(*,'(A)')
720 0 : write(*,*) 'cubic_interpolation_in_X = ', s% kap_rq% cubic_interpolation_in_X
721 0 : write(*,*) 'cubic_interpolation_in_Z = ', s% kap_rq% cubic_interpolation_in_Z
722 0 : write(*,*) 'include_electron_conduction = ', s% kap_rq% include_electron_conduction
723 0 : write(*,*) 'use_Zbase_for_Type1 = ', s% kap_rq% use_Zbase_for_Type1
724 0 : write(*,*) 'use_Type2_opacities = ', s% kap_rq% use_Type2_opacities
725 0 : write(*,1) 'kap_Type2_full_off_X = ', s% kap_rq% kap_Type2_full_off_X
726 0 : write(*,1) 'kap_Type2_full_on_X = ', s% kap_rq% kap_Type2_full_on_X
727 0 : write(*,1) 'kap_Type2_full_off_dZ = ', s% kap_rq% kap_Type2_full_off_dZ
728 0 : write(*,1) 'kap_Type2_full_on_dZ = ', s% kap_rq% kap_Type2_full_on_dZ
729 0 : write(*,'(A)')
730 0 : write(*,'(A)')
731 0 : write(*,1) 'rho = ', s% rho(k)
732 0 : write(*,1) 'lnrho = ', s% lnd(k)
733 0 : write(*,1) 'T = ', s% T(k)
734 0 : write(*,1) 'lnT = ', s% lnT(k)
735 0 : write(*,1) 'logKap = ', log10(s% opacity(k))
736 0 : write(*,1) 'opacity = ', s% opacity(k)
737 0 : write(*,1) 'dlnkap_dlnd = ', dlnkap_dlnd
738 0 : write(*,1) 'dlnkap_dlnT = ', dlnkap_dlnT
739 0 : write(*,1) 'd_opacity_dlnd = ', s% d_opacity_dlnd(k)
740 0 : write(*,1) 'd_opacity_dlnT = ', s% d_opacity_dlnT(k)
741 0 : write(*,'(A)')
742 0 : write(*,1) 'logQ = ', s% lnd(k)/ln10 - 2*s% lnT(k)/ln10 + 12
743 0 : write(*,'(A)')
744 0 : write(*,1) 'kap_frac_lowT', s% kap_frac_lowT(k)
745 0 : write(*,1) 'kap_frac_highT', s% kap_frac_highT(k)
746 0 : write(*,1) 'kap_frac_Type2', s% kap_frac_Type2(k)
747 0 : write(*,1) 'kap_frac_Compton', s% kap_frac_Compton(k)
748 0 : write(*,'(A)')
749 0 : write(*,1) 'extra_opacity_factor', s% extra_opacity_factor(k)
750 0 : write(*,'(A)')
751 0 : write(*,'(A)')
752 0 : end subroutine show_stuff
753 :
754 : end subroutine do_kap_for_cell
755 :
756 :
757 1 : subroutine shutdown_microphys
758 : use eos_lib, only: eos_shutdown
759 : use kap_lib, only: kap_shutdown
760 : use net_lib
761 1 : call eos_shutdown
762 1 : call kap_shutdown
763 1 : call net_shutdown
764 1 : end subroutine shutdown_microphys
765 :
766 : end module micro
|