56 subroutine wb_atmos_init(pa, ra, grav, jmax, ds, gzone, grav_dir, irho, ip)
57 double precision,
intent(in) :: pa(:)
58 double precision,
intent(in) :: ra(:)
59 double precision,
intent(in) :: grav(:)
60 integer,
intent(in) :: jmax
61 double precision,
intent(in) :: ds
62 double precision,
intent(in) :: gzone
63 integer,
intent(in) :: grav_dir
64 integer,
intent(in) :: irho
65 integer,
intent(in) :: ip
67 double precision :: x_g, t_lo, t_hi, g_lo, g_hi, res
68 double precision :: alpha_prev, alpha_curr
69 double precision :: x_min, x_max, p_dev, max_dev
70 integer :: ig, na, n_cells, level_factor
72 wb_grav_dir = grav_dir
80 n_cells = domain_nx1 * level_factor
81 x_min = xprobmin1; x_max = xprobmax1
84 n_cells = domain_nx2 * level_factor
85 x_min = xprobmin2; x_max = xprobmax2
89 n_cells = domain_nx2 * level_factor
90 x_min = xprobmin2; x_max = xprobmax2
92 n_cells = domain_nx3 * level_factor
93 x_min = xprobmin3; x_max = xprobmax3
96 call mpistop(
'wb_atmos_init: invalid grav_dir')
101 wb_dx_grid = (x_max - x_min) / dble(n_cells)
102 wb_x_lo = x_min - (dble(wb_n_ghost) - 0.5d0) * wb_dx_grid
111 call interp_fine(x_g, x_min, gzone, ds, jmax, pa, ra, grav, t_lo, g_lo)
113 na = floor((x_g - (x_min - gzone)) / ds + 0.5d0)
114 na = max(1, min(na, jmax - 1))
115 res = (x_g - (x_min - gzone)) / ds - (dble(na) - 0.5d0)
116 res = max(0.0d0, min(1.0d0, res))
117 wb_pa(1) = pa(na) + res * (pa(na + 1) - pa(na))
122 x_g = wb_x_lo + dble(ig - 1) * wb_dx_grid
123 call interp_fine(x_g, x_min, gzone, ds, jmax, pa, ra, grav, t_hi, g_hi)
125 alpha_prev = 0.5d0 * wb_dx_grid * g_lo / t_lo
126 alpha_curr = 0.5d0 * wb_dx_grid * g_hi / t_hi
128 wb_pa(ig) =
wb_pa(ig - 1) * (1.0d0 + alpha_prev) &
129 / (1.0d0 - alpha_curr)
139 x_g = wb_x_lo + dble(ig - 1) * wb_dx_grid
140 na = max(1, min(nint((x_g - (x_min - gzone))/ds) + 1, jmax))
141 if (pa(na) > 0.0d0)
then
142 p_dev = dabs(
wb_pa(ig) - pa(na)) / pa(na)
143 max_dev = max(max_dev, p_dev)
148 write(*,
'(A,I7,A,ES10.3,A,I1)') &
149 ' WB atmosphere: ',
wb_n_grid,
' cells, max p deviation = ', &
150 max_dev,
', grav_dir = ', wb_grav_dir
153 wb_initialised = .true.
214 subroutine interp_fine(x_g, x_min, gzone, ds, jmax, pa, ra, grav, T_out, g_out)
subroutine, public wb_atmos_init(pa, ra, grav, jmax, ds, gzone, grav_dir, irho, ip)
Build grid-aligned HSE tables from a fine 1D reference profile.