16 integer,
parameter :: iDmin = 2, idmax = 51
17 integer,
parameter :: iTmin = 2, itmax = 21
21 logical :: set_custom_tabledir = .false.
24 double precision,
public ::
alpha_vals(idmin:idmax,itmin:itmax)
25 double precision,
public ::
qbar_vals(idmin:idmax,itmin:itmax)
26 double precision,
public ::
q0_vals(idmin:idmax,itmin:itmax)
27 double precision,
public ::
kappae_vals(idmin:idmax,itmin:itmax)
38 character(len=*),
intent(in) :: tabledir
39 logical,
optional,
intent(in) :: set_custom_tabledir
42 character(len=256) :: amrvac_dir, path_table_dir
44 if (
present(set_custom_tabledir) .and. set_custom_tabledir)
then
45 path_table_dir = trim(tabledir)
47 call get_environment_variable(
"AMRVAC_DIR", amrvac_dir)
48 path_table_dir = trim(amrvac_dir)//
"/src/tables/CAK_tables/"//trim(tabledir)
57 write(*,*)
'Initialized CAK tables, read in from',path_table_dir
63 subroutine set_cak_opacity(rho, temp, alpha_output, Qbar_output, Q0_output, kappae_output)
65 double precision,
intent(in) :: rho, temp
66 double precision,
intent(out) :: alpha_output, qbar_output, q0_output, kappae_output
69 double precision :: d_input, t_input, kappa_cak
71 if (temp <= 0.0d0)
call mpistop(
'Input temperature < 0 in set_cak_opacity.')
72 if (rho <= 0.0d0)
call mpistop(
'Input density < 0 in set_cak_opacity.')
79 alpha_output, qbar_output, q0_output, kappae_output)
85 subroutine read_table(D, T, K, filename)
87 character(*),
intent(in) :: filename
88 double precision,
intent(out) :: k(idmin:idmax,itmin:itmax),
d(idmin:idmax), t(itmin:itmax)
92 integer :: row, col, funit=99
95 inquire(file=trim(filename), exist=alive)
98 open(funit, file=trim(filename), status=
'unknown')
100 call mpistop(
'Table file you want to use cannot be found: '//filename)
104 read(funit,*) dum, t(itmin:itmax)
108 read(funit,*)
d(row), k(row,itmin:itmax)
113 end subroutine read_table
117 subroutine get_val_comb(K1_vals,K2_vals,K3_vals,K4_vals, &
118 logD_list, logT_list, D, T, K1, K2, K3, K4)
120 double precision,
intent(in) :: k1_vals(idmin:idmax,itmin:itmax)
121 double precision,
intent(in) :: k2_vals(idmin:idmax,itmin:itmax)
122 double precision,
intent(in) :: k3_vals(idmin:idmax,itmin:itmax)
123 double precision,
intent(in) :: k4_vals(idmin:idmax,itmin:itmax)
125 double precision,
intent(in) ::
d, t
126 double precision,
intent(out) :: k1, k2, k3, k4
129 integer :: low_d_index, up_d_index, low_t_index, up_t_index
133 low_d_index = idmax-1
140 call get_low_up_index(
d,
logd_list, idmin, idmax, low_d_index, up_d_index)
145 low_t_index = itmax-1
152 call get_low_up_index(t,
logt_list, itmin, itmax, low_t_index, up_t_index)
155 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
158 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
161 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
164 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
167 end subroutine get_val_comb
171 subroutine get_low_up_index(var_in, var_list, imin, imax, low_i, up_i)
173 integer,
intent(in) :: imin, imax
174 double precision,
intent(in) :: var_in, var_list(imin:imax)
175 integer,
intent(out) :: low_i, up_i
178 double precision :: low_val, up_val, res(imin:imax)
180 res = var_list - var_in
183 up_val = minval(res, mask = res >= 0) + var_in
184 low_val = maxval(res, mask = res <= 0) + var_in
187 up_i = minloc(abs(var_list - up_val),1) + imin -1
188 low_i = minloc(abs(var_list - low_val),1) + imin -1
190 if (up_i == low_i) low_i = low_i - 1
192 end subroutine get_low_up_index
195 subroutine interpolate_krt(low_r, up_r, low_t, up_t, logD_list, logT_list, Kappa_vals, D, T, kappa_interp)
197 integer,
intent(in) :: low_r, up_r, low_t, up_t
198 double precision,
intent(in) :: kappa_vals(idmin:idmax,itmin:itmax)
200 double precision,
intent(in) ::
d, t
201 double precision,
intent(out) :: kappa_interp
204 double precision :: r1, r2, t1, t2, k1, k2, k3, k4, ka, kb
228 k1 = kappa_vals(low_r, low_t)
229 k2 = kappa_vals(low_r, up_t)
230 k3 = kappa_vals(up_r, low_t)
231 k4 = kappa_vals(up_r, up_t)
233 call interpolate1d(r1,r2,
d,k1,k2,ka)
234 call interpolate1d(r1,r2,
d,k3,k4,kb)
235 call interpolate1d(t1,t2,t,ka,kb,kappa_interp)
237 end subroutine interpolate_krt
240 subroutine interpolate1d(x1, x2, x, y1, y2, y)
242 double precision,
intent(in) :: x, x1, x2, y1, y2
243 double precision,
intent(out) :: y
245 y = y1 + (x-x1)*(y2-y1)/(x2-x1)
247 end subroutine interpolate1d
This module reads in CAK line opacities in the Gayley (1995) notation (alpha, Qbar,...
double precision, dimension(itmin:itmax), public logt_list
double precision, dimension(idmin:idmax, itmin:itmax), public q0_vals
double precision, dimension(idmin:idmax, itmin:itmax), public qbar_vals
subroutine, public init_cak_table(tabledir, set_custom_tabledir)
This routine is called when the FLD radiation module is initialised.
double precision, dimension(idmin:idmax, itmin:itmax), public alpha_vals
The opacity tables are read once and stored globally.
double precision, dimension(idmin:idmax), public logd_list
subroutine, public set_cak_opacity(rho, temp, alpha_output, qbar_output, q0_output, kappae_output)
This subroutine calculates the opacity for a given temperature-density structure. Opacities are read ...
double precision, dimension(idmin:idmax, itmin:itmax), public kappae_vals
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer mype
The rank of the current MPI task.
double precision, dimension(:), allocatable, parameter d