22 integer,
parameter :: iDmin = 2, idmax = 51
23 integer,
parameter :: iTmin = 2, itmax = 21
27 logical :: set_custom_tabledir = .false.
30 double precision,
public ::
alpha_vals(idmin:idmax,itmin:itmax)
31 double precision,
public ::
qbar_vals(idmin:idmax,itmin:itmax)
32 double precision,
public ::
q0_vals(idmin:idmax,itmin:itmax)
33 double precision,
public ::
kappae_vals(idmin:idmax,itmin:itmax)
44 character(len=*),
intent(in) :: tabledir
45 logical,
optional,
intent(in) :: set_custom_tabledir
48 character(len=256) :: amrvac_dir, path_table_dir
50 if (
present(set_custom_tabledir) .and. set_custom_tabledir)
then
51 path_table_dir = trim(tabledir)
53 call get_environment_variable(
"AMRVAC_DIR", amrvac_dir)
54 path_table_dir = trim(amrvac_dir)//
"/src/tables/CAK_tables/"//trim(tabledir)
63 write(*,*)
'Initialized CAK tables, read in from ',path_table_dir
70 subroutine set_cak_opacity(rho, temp, alpha_output, Qbar_output, Q0_output, kappae_output)
72 double precision,
intent(in) :: rho, temp
73 double precision,
intent(out) :: alpha_output, qbar_output, q0_output, kappae_output
76 double precision :: d_input, t_input, kappa_cak
78 if (temp <= 0.0d0)
call mpistop(
'set_cak_opacity: local temperature <= 0')
79 if (rho <= 0.0d0)
call mpistop(
'set_cak_opacity: local density <= 0')
86 alpha_output, qbar_output, q0_output, kappae_output)
92 subroutine read_table(D, T, K, filename)
94 character(*),
intent(in) :: filename
95 double precision,
intent(out) :: k(idmin:idmax,itmin:itmax),
d(idmin:idmax), t(itmin:itmax)
99 integer :: row, col, funit=99
102 inquire(file=trim(filename), exist=alive)
105 open(funit, file=trim(filename), status=
'unknown')
107 call mpistop(
'Table file you want to use cannot be found: '//filename)
111 read(funit,*) dum, t(itmin:itmax)
115 read(funit,*)
d(row), k(row,itmin:itmax)
120 end subroutine read_table
124 subroutine get_val_comb(K1_vals,K2_vals,K3_vals,K4_vals, &
125 logD_list, logT_list, D, T, K1, K2, K3, K4)
127 double precision,
intent(in) :: k1_vals(idmin:idmax,itmin:itmax)
128 double precision,
intent(in) :: k2_vals(idmin:idmax,itmin:itmax)
129 double precision,
intent(in) :: k3_vals(idmin:idmax,itmin:itmax)
130 double precision,
intent(in) :: k4_vals(idmin:idmax,itmin:itmax)
132 double precision,
intent(in) ::
d, t
133 double precision,
intent(out) :: k1, k2, k3, k4
136 integer :: low_d_index, up_d_index, low_t_index, up_t_index
140 low_d_index = idmax-1
147 call get_low_up_index(
d,
logd_list, idmin, idmax, low_d_index, up_d_index)
152 low_t_index = itmax-1
159 call get_low_up_index(t,
logt_list, itmin, itmax, low_t_index, up_t_index)
162 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
165 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
168 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
171 call interpolate_krt(low_d_index, up_d_index, low_t_index, up_t_index, &
174 end subroutine get_val_comb
178 subroutine get_low_up_index(var_in, var_list, imin, imax, low_i, up_i)
180 integer,
intent(in) :: imin, imax
181 double precision,
intent(in) :: var_in, var_list(imin:imax)
182 integer,
intent(out) :: low_i, up_i
185 double precision :: low_val, up_val, res(imin:imax)
187 res = var_list - var_in
190 up_val = minval(res, mask = res >= 0) + var_in
191 low_val = maxval(res, mask = res <= 0) + var_in
194 up_i = minloc(abs(var_list - up_val),1) + imin -1
195 low_i = minloc(abs(var_list - low_val),1) + imin -1
197 if (up_i == low_i) low_i = low_i - 1
199 end subroutine get_low_up_index
202 subroutine interpolate_krt(low_r, up_r, low_t, up_t, logD_list, logT_list, Kappa_vals, D, T, kappa_interp)
204 integer,
intent(in) :: low_r, up_r, low_t, up_t
205 double precision,
intent(in) :: kappa_vals(idmin:idmax,itmin:itmax)
207 double precision,
intent(in) ::
d, t
208 double precision,
intent(out) :: kappa_interp
211 double precision :: r1, r2, t1, t2, k1, k2, k3, k4, ka, kb
235 k1 = kappa_vals(low_r, low_t)
236 k2 = kappa_vals(low_r, up_t)
237 k3 = kappa_vals(up_r, low_t)
238 k4 = kappa_vals(up_r, up_t)
240 call interpolate1d(r1,r2,
d,k1,k2,ka)
241 call interpolate1d(r1,r2,
d,k3,k4,kb)
242 call interpolate1d(t1,t2,t,ka,kb,kappa_interp)
244 end subroutine interpolate_krt
247 subroutine interpolate1d(x1, x2, x, y1, y2, y)
249 double precision,
intent(in) :: x, x1, x2, y1, y2
250 double precision,
intent(out) :: y
252 y = y1 + (x-x1)*(y2-y1)/(x2-x1)
254 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 or CAK 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