25 #include "sll_memory.h"
26 #include "sll_working_precision.h"
27 #include "sll_errors.h"
44 sll_real64,
dimension(:),
pointer :: eta_coords
45 sll_real64,
dimension(:),
pointer :: charac_feet
62 eta_coords)
result(adv)
68 sll_int32,
intent(in) :: npts
69 sll_real64,
intent(in),
optional :: eta_min
70 sll_real64,
intent(in),
optional :: eta_max
71 sll_real64,
pointer,
optional :: eta_coords(:)
75 sll_allocate(adv, ierr)
77 call adv%init(interp, charac, npts, eta_min, eta_max, eta_coords)
82 eta_min, eta_max, eta_coords)
87 sll_int32,
intent(in) :: npts
89 sll_real64,
intent(in),
optional :: eta_min
90 sll_real64,
intent(in),
optional :: eta_max
91 sll_real64,
dimension(:),
pointer,
optional :: eta_coords
95 sll_real64 :: delta_eta
101 sll_allocate(adv%eta_coords(npts), ierr)
102 sll_allocate(adv%charac_feet(npts), ierr)
104 if (
present(eta_min) .and.
present(eta_max))
then
105 if (
present(eta_coords))
then
106 sll_error(
'initialize_advector_1d_bsl',
'provide either eta_coords or eta_min and eta_max and not both')
108 delta_eta = (eta_max - eta_min)/real(npts - 1, f64)
110 adv%eta_coords(i) = eta_min + real(i - 1, f64)*delta_eta
113 else if (
present(eta_coords))
then
114 if (
size(eta_coords) < npts)
then
115 sll_error(
'initialize_advector_1d_bsl',
'bad size for eta_coords in initialize_sll_t_advector_1d_bsl')
117 adv%eta_coords(1:npts) = eta_coords(1:npts)
120 sll_warning(
'initialize_advector_1d_bsl',
'we assume eta_min = 0._f64 eta_max = 1._f64')
121 delta_eta = 1._f64/real(npts - 1, f64)
123 adv%eta_coords(i) = real(i - 1, f64)*delta_eta
132 sll_real64,
dimension(:),
intent(in) :: a
133 sll_real64,
intent(in) :: dt
134 sll_real64,
dimension(:),
intent(in) :: input
135 sll_real64,
dimension(:),
intent(out) :: output
137 call adv%charac%compute_characteristics(a, dt, adv%eta_coords, adv%charac_feet)
139 call adv%interp%interpolate_array(adv%npts, input, adv%charac_feet, output)
146 sll_real64,
intent(in) :: a
147 sll_real64,
intent(in) :: dt
148 sll_real64,
dimension(:),
intent(in) :: input
149 sll_real64,
dimension(:),
intent(out) :: output
150 sll_real64,
dimension(:),
allocatable :: a1
153 sll_allocate(a1(adv%npts), ierr)
157 call adv%charac%compute_characteristics(a1, dt, adv%eta_coords, adv%charac_feet)
159 call adv%interp%interpolate_array(adv%npts, input, adv%charac_feet, output)
161 sll_deallocate_array(a1, ierr)
171 sll_deallocate(adv%eta_coords, ierr)
172 sll_deallocate(adv%charac_feet, ierr)
Abstract class for advection.
backward semi-lagrangian 1d advection
subroutine delete_bsl_1d_adv(adv)
subroutine initialize_advector_1d_bsl(adv, interp, charac, npts, eta_min, eta_max, eta_coords)
subroutine bsl_advect_1d(adv, A, dt, input, output)
subroutine bsl_advect_1d_constant(adv, A, dt, input, output)
type(sll_t_advector_1d_bsl) function, pointer, public sll_f_new_advector_1d_bsl(interp, charac, npts, eta_min, eta_max, eta_coords)
Abstract class for characteristic derived type.
Module for 1D interpolation and reconstruction.
Abstract class for 1D interpolation and reconstruction.