5 integer,
parameter ::
dmin = 2
6 integer,
parameter ::
dmax = 21
7 integer,
parameter ::
tmin = 2
8 integer,
parameter ::
tmax = 21
31 character(6),
intent(in) :: tablename
33 CALL get_environment_variable(
"AMRVAC_DIR",
amrvac_dir)
48 subroutine set_cak_opacity(rho,temp, gradv,alpha_output, Qbar_output, Q0_output, kappa_e_output)
49 double precision,
intent(in) :: rho, temp, gradv
50 double precision,
intent(out) :: alpha_output, qbar_output, q0_output, kappa_e_output
52 double precision,
PARAMETER :: const_c = 2.99792458d10
54 double precision :: d_input, t_input
56 double precision :: kappa_cak
57 double precision :: tau, m_t
60 t_input = dlog10(temp)
62 d_input = min(-7.d0-1.d-5, d_input)
63 d_input = max(-16.d0+1.d-5, d_input)
64 t_input = min(5d0-1.d-5, t_input)
65 t_input = max(4d0+1.d-5, t_input)
69 alpha_output, qbar_output, q0_output, kappa_e_output)
82 double precision,
intent(out) :: K(Dmin:Dmax,Tmin:Tmax), D(Dmin:Dmax), T(Tmin:Tmax)
83 character(*),
intent(in) :: filename
88 OPEN(1,status =
'old', file=trim(
fileplace)//filename)
91 READ(1,*) dum,t(tmin:tmax)
95 READ(1,*) d(row), k(row,tmin:tmax)
105 Log_D_list, Log_T_list, D, T, &
108 double precision,
intent(in) :: K1_vals(Dmin:Dmax,Tmin:Tmax)
109 double precision,
intent(in) :: K2_vals(Dmin:Dmax,Tmin:Tmax)
110 double precision,
intent(in) :: K3_vals(Dmin:Dmax,Tmin:Tmax)
111 double precision,
intent(in) :: K4_vals(Dmin:Dmax,Tmin:Tmax)
113 double precision,
intent(in) :: Log_D_list(Dmin:Dmax)
114 double precision,
intent(in) :: Log_T_list(Tmin:Tmax)
115 double precision,
intent(in) :: D, T
117 double precision,
intent(out) :: K1
118 double precision,
intent(out) :: K2
119 double precision,
intent(out) :: K3
120 double precision,
intent(out) :: K4
122 integer :: low_r_index, up_r_index
123 integer :: low_t_index, up_t_index
125 if (d .gt. maxval(log_d_list))
then
129 elseif (d .lt. minval(log_d_list))
then
137 if (t .gt. maxval(log_t_list))
then
141 elseif ( t .lt. minval(log_t_list))
then
149 call interpolate_krt(low_r_index, up_r_index, low_t_index, up_t_index, &
150 log_d_list, log_t_list, k1_vals, d, t, k1)
152 call interpolate_krt(low_r_index, up_r_index, low_t_index, up_t_index, &
153 log_d_list, log_t_list, k2_vals, d, t, k2)
155 call interpolate_krt(low_r_index, up_r_index, low_t_index, up_t_index, &
156 log_d_list, log_t_list, k3_vals, d, t, k3)
158 call interpolate_krt(low_r_index, up_r_index, low_t_index, up_t_index, &
159 log_d_list, log_t_list, k4_vals, d, t, k4)
166 integer,
intent(in) :: imin, imax
167 double precision,
intent(in) :: x
168 double precision,
intent(in) :: x_list(imin:imax)
170 integer,
intent(out) :: low_i, up_i
172 double precision :: low_val, up_val
173 double precision :: res(imin:imax)
177 up_val = minval(res, mask = res .ge. 0) + x
178 low_val = maxval(res, mask = res .le. 0) + x
180 up_i = minloc(abs(x_list - up_val),1) + imin -1
181 low_i = minloc(abs(x_list - low_val),1) + imin -1
184 if (up_i .eq. low_i) low_i = low_i - 1
189 subroutine interpolate_krt(low_r, up_r, low_t, up_t, Log_D_list, Log_T_list, Kappa_vals, D, T, k_interp)
191 integer,
intent(in) :: low_r, up_r, low_t, up_t
192 double precision,
intent(in) :: Kappa_vals(Dmin:Dmax,Tmin:Tmax)
193 double precision,
intent(in) :: Log_D_list(Dmin:Dmax)
194 double precision,
intent(in) :: Log_T_list(Tmin:Tmax)
195 double precision,
intent(in) :: D,T
196 double precision,
intent(out) :: k_interp
198 double precision :: r1,r2,t1,t2
199 double precision :: k1, k2, k3, k4
200 double precision :: ka, kb
220 r1 = log_d_list(low_r)
221 r2 = log_d_list(up_r)
222 t1 = log_t_list(low_t)
223 t2 = log_t_list(up_t)
230 k1 = kappa_vals(low_r, low_t)
231 k2 = kappa_vals(low_r, up_t)
232 k3 = kappa_vals(up_r, low_t)
233 k4 = kappa_vals(up_r, up_t)
255 double precision,
intent(in) :: x, x1, x2
256 double precision,
intent(in) :: y1, y2
257 double precision,
intent(out) :: y
259 y = y1 + (x-x1)*(y2-y1)/(x2-x1)
subroutine get_low_up_index(x, x_list, imin, imax, low_i, up_i)
this subroutine finds the indexes in R and T arrays of the two values surrounding the input R and T
subroutine, public set_cak_opacity(rho, temp, gradv, alpha_output, Qbar_output, Q0_output, kappa_e_output)
This subroutine calculates the opacity for a given temperature-density structure. The opacities are r...
double precision, dimension(dmin:dmax, tmin:tmax), public q0_vals
character(255), public amrvac_dir
double precision, dimension(dmin:dmax, tmin:tmax), public qbar_vals
double precision, dimension(dmin:dmax, tmin:tmax), public kappa_e_vals
subroutine get_val_comb(K1_vals, K2_vals, K3_vals, K4_vals, Log_D_list, Log_T_list, D, T, K1, K2, K3, K4)
This subroutine looks in the table for the four couples (T,R)
subroutine interpolate_krt(low_r, up_r, low_t, up_t, Log_D_list, Log_T_list, Kappa_vals, D, T, k_interp)
This subroutine does a bilinear interpolation in the R,T-plane.
subroutine interpolate1d(x1, x2, x, y1, y2, y)
Interpolation in one dimension.
integer, parameter dmin
min and max indices for R,T-range in opacity table
subroutine read_table(D, T, K, filename)
This routine reads out values and arguments from a table.
double precision, dimension(tmin:tmax), public log_t_list
double precision, dimension(dmin:dmax, tmin:tmax), public alpha_vals
The opacity tables are read once and stored globally in Kappa_vals.
character(255), public fileplace
subroutine, public init_cak(tablename)
This routine is called when the fld radiation module is initialised. Here, the tables for different H...
double precision, dimension(dmin:dmax), public log_d_list