24 #include "sll_memory.h"
25 #include "sll_working_precision.h"
26 #include "sll_errors.h"
45 sll_real64,
dimension(:),
pointer :: eta1_coords
46 sll_real64,
dimension(:),
pointer :: eta2_coords
47 sll_real64,
dimension(:, :),
pointer :: charac_feet1
48 sll_real64,
dimension(:, :),
pointer :: charac_feet2
64 eta1_min, eta1_max, eta2_min, eta2_max, eta1_coords, eta2_coords) &
70 sll_int32,
intent(in) :: npts1
71 sll_int32,
intent(in) :: npts2
72 sll_real64,
intent(in),
optional :: eta1_min
73 sll_real64,
intent(in),
optional :: eta1_max
74 sll_real64,
intent(in),
optional :: eta2_min
75 sll_real64,
intent(in),
optional :: eta2_max
76 sll_real64,
dimension(:),
pointer,
optional :: eta1_coords
77 sll_real64,
dimension(:),
pointer,
optional :: eta2_coords
80 sll_allocate(adv, ierr)
82 call adv%init(interp, charac, npts1, npts2, eta1_min, eta1_max, &
83 eta2_min, eta2_max, eta1_coords, eta2_coords)
88 eta1_min, eta1_max, eta2_min, eta2_max, eta1_coords, eta2_coords)
93 sll_int32,
intent(in) :: npts1
94 sll_int32,
intent(in) :: npts2
95 sll_real64,
intent(in),
optional :: eta1_min
96 sll_real64,
intent(in),
optional :: eta1_max
97 sll_real64,
intent(in),
optional :: eta2_min
98 sll_real64,
intent(in),
optional :: eta2_max
99 sll_real64,
dimension(:),
pointer,
optional :: eta1_coords
100 sll_real64,
dimension(:),
pointer,
optional :: eta2_coords
103 sll_real64 :: delta_eta1
104 sll_real64 :: delta_eta2
111 sll_allocate(adv%eta1_coords(npts1), ierr)
112 sll_allocate(adv%eta2_coords(npts2), ierr)
114 sll_allocate(adv%charac_feet1(npts1, npts2), ierr)
115 sll_allocate(adv%charac_feet2(npts1, npts2), ierr)
117 if (
present(eta1_min) .and.
present(eta1_max))
then
118 if (
present(eta1_coords))
then
119 sll_error(
"initialize_advector_2d_bsl",
"provide either eta1_coords or eta1_min and eta1_max and not both")
121 delta_eta1 = (eta1_max - eta1_min)/real(npts1 - 1, f64)
123 adv%eta1_coords(i) = eta1_min + real(i - 1, f64)*delta_eta1
126 else if (
present(eta1_coords))
then
127 if (
size(eta1_coords, 1) < npts1)
then
128 sll_error(
"initialize_advector_2d_bsl",
"bad size for eta1_coords")
130 adv%eta1_coords(1:npts1) = eta1_coords(1:npts1)
133 print *,
'#Warning, we assume eta1_min = 0._f64 eta1_max = 1._f64'
134 delta_eta1 = 1._f64/real(npts1 - 1, f64)
136 adv%eta1_coords(i) = real(i - 1, f64)*delta_eta1
140 if (
present(eta2_min) .and.
present(eta2_max))
then
141 if (
present(eta2_coords))
then
142 sll_error(
"initialize_advector_2d_bsl",
"provide either eta2_coords or eta2_min and eta2_max and not both")
144 delta_eta2 = (eta2_max - eta2_min)/real(npts2 - 1, f64)
146 adv%eta2_coords(i) = eta2_min + real(i - 1, f64)*delta_eta2
149 else if (
present(eta2_coords))
then
150 if (
size(eta2_coords, 1) < npts2)
then
151 sll_error(
"initialize_advector_2d_bsl",
"bad size for eta2_coords")
153 adv%eta2_coords(1:npts2) = eta2_coords(1:npts2)
156 print *,
'#Warning, we assume eta2_min = 0._f64 eta2_max = 1._f64'
157 delta_eta2 = 1._f64/real(npts2 - 1, f64)
159 adv%eta2_coords(i) = real(i - 1, f64)*delta_eta2
168 sll_real64,
dimension(:, :),
intent(in) :: a1
169 sll_real64,
dimension(:, :),
intent(in) :: a2
170 sll_real64,
intent(in) :: dt
171 sll_real64,
dimension(:, :),
intent(in) :: input
172 sll_real64,
dimension(:, :),
intent(out) :: output
174 call adv%charac%compute_characteristics( &
190 call adv%interp%interpolate_array( &
subroutine bsl_advect_2d(adv, a1, a2, dt, input, output)
subroutine, public sll_s_advector_2d_bsl_init(adv, interp, charac, npts1, npts2, eta1_min, eta1_max, eta2_min, eta2_max, eta1_coords, eta2_coords)
type(sll_t_advector_2d_bsl) function, pointer, public sll_f_new_advector_2d_bsl(interp, charac, npts1, npts2, eta1_min, eta1_max, eta2_min, eta2_max, eta1_coords, eta2_coords)
Abstract class to compute the characteristic in two dimensions.
abstract data type for 2d interpolation
Base class/basic interface for 2D interpolators.