25 #include "sll_assert.h"
26 #include "sll_memory.h"
27 #include "sll_working_precision.h"
54 sll_real64,
dimension(:),
pointer :: eta1_coords
55 sll_real64,
dimension(:),
pointer :: eta2_coords
56 sll_real64,
dimension(:, :),
pointer :: charac_feet1
57 sll_real64,
dimension(:, :),
pointer :: charac_feet2
58 sll_real64,
dimension(:, :),
pointer :: phi_at_aligned
59 sll_int32,
dimension(:),
pointer :: spaghetti_index
60 sll_real64,
dimension(:),
pointer :: phi_at_aligned_1d
61 sll_real64,
dimension(:),
pointer :: charac_feet_aligned_1d
62 sll_int32 :: spaghetti_size
94 sll_int32,
intent(in) :: npts1
95 sll_int32,
intent(in) :: npts2
96 sll_real64,
intent(in),
optional :: eta1_min
97 sll_real64,
intent(in),
optional :: eta1_max
98 sll_real64,
intent(in),
optional :: eta2_min
99 sll_real64,
intent(in),
optional :: eta2_max
100 sll_real64,
dimension(:),
pointer,
optional :: eta1_coords
101 sll_real64,
dimension(:),
pointer,
optional :: eta2_coords
104 sll_allocate(adv, ierr)
142 sll_int32,
intent(in) :: npts1
143 sll_int32,
intent(in) :: npts2
144 sll_real64,
intent(in),
optional :: eta1_min
145 sll_real64,
intent(in),
optional :: eta1_max
146 sll_real64,
intent(in),
optional :: eta2_min
147 sll_real64,
intent(in),
optional :: eta2_max
148 sll_real64,
dimension(:),
pointer,
optional :: eta1_coords
149 sll_real64,
dimension(:),
pointer,
optional :: eta2_coords
152 sll_real64 :: delta_eta1
153 sll_real64 :: delta_eta2
159 adv%adv_aligned => adv_aligned
164 sll_allocate(adv%eta1_coords(npts1), ierr)
165 sll_allocate(adv%eta2_coords(npts2), ierr)
167 sll_allocate(adv%charac_feet1(npts1, npts2), ierr)
168 sll_allocate(adv%charac_feet2(npts1, npts2), ierr)
170 sll_allocate(adv%phi_at_aligned(npts1, npts2), ierr)
171 sll_allocate(adv%spaghetti_index(npts1), ierr)
172 sll_allocate(adv%phi_at_aligned_1d(npts1*npts2), ierr)
173 sll_allocate(adv%charac_feet_aligned_1d(npts1*npts2), ierr)
175 if (
present(eta1_min) .and.
present(eta1_max))
then
176 if (
present(eta1_coords))
then
177 print *,
'#provide either eta1_coords or eta1_min and eta1_max'
178 print *,
'#and not both in subroutine initialize_BSL_2d_advector'
181 delta_eta1 = (eta1_max - eta1_min)/real(npts1 - 1, f64)
183 adv%eta1_coords(i) = eta1_min + real(i - 1, f64)*delta_eta1
186 else if (
present(eta1_coords))
then
187 if (
size(eta1_coords, 1) < npts1)
then
188 print *,
'#bad size for eta1_coords in initialize_BSL_2d_advector'
191 adv%eta1_coords(1:npts1) = eta1_coords(1:npts1)
194 print *,
'#Warning, we assume eta1_min = 0._f64 eta1_max = 1._f64'
195 delta_eta1 = 1._f64/real(npts1 - 1, f64)
197 adv%eta1_coords(i) = real(i - 1, f64)*delta_eta1
201 if (
present(eta2_min) .and.
present(eta2_max))
then
202 if (
present(eta2_coords))
then
203 print *,
'#provide either eta2_coords or eta2_min and eta2_max'
204 print *,
'#and not both in subroutine initialize_BSL_2d_advector'
207 delta_eta2 = (eta2_max - eta2_min)/real(npts2 - 1, f64)
209 adv%eta2_coords(i) = eta2_min + real(i - 1, f64)*delta_eta2
212 else if (
present(eta2_coords))
then
213 if (
size(eta2_coords, 1) < npts2)
then
214 print *,
'#bad size for eta2_coords in initialize_BSL_2d_advector'
217 adv%eta2_coords(1:npts2) = eta2_coords(1:npts2)
220 print *,
'#Warning, we assume eta2_min = 0._f64 eta2_max = 1._f64'
221 delta_eta2 = 1._f64/real(npts2 - 1, f64)
223 adv%eta2_coords(i) = real(i - 1, f64)*delta_eta2
250 sll_real64,
dimension(:, :),
intent(in) :: phi
251 sll_int32,
intent(in) :: shift
252 sll_real64,
intent(in) :: dt
253 sll_real64,
dimension(:, :),
intent(in) :: input
254 sll_real64,
dimension(:, :),
intent(out) :: output
259 sll_real64 :: delta_x1
260 print *,
'#not implemented for the moment'
262 sll_assert(
size(input, 1) > 0)
263 sll_assert(
size(input, 2) > 0)
264 output = 0.0_f64 + dt - dt
268 a = real(shift, f64)/real(npts2 - 1, f64)
269 delta_x1 = (adv%eta1_coords(npts1) - adv%eta1_coords(1))/real(npts1 - 1, f64)
273 call adv%adv_x1%advect_1d_constant( &
275 real(i - 1, f64)*delta_x1, &
277 adv%phi_at_aligned(1:npts1, i))
Abstract class for advection.
use integer oblic interpolation
subroutine, public sll_s_integer_oblic_advect_2d(adv, phi, shift, dt, input, output)
type(sll_t_integer_oblic_2d_advector) function, pointer, public sll_f_new_integer_oblic_2d_advector(adv_x1, adv_aligned, interp, charac, Npts1, Npts2, eta1_min, eta1_max, eta2_min, eta2_max, eta1_coords, eta2_coords)
subroutine initialize_integer_oblic_2d_advector(adv, adv_x1, adv_aligned, 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.