29 #include "sll_working_precision.h"
30 #include "sll_assert.h"
31 #include "sll_memory.h"
40 class(sll_advection_1d_base),
pointer :: adv_x1
41 class(sll_advection_1d_base),
pointer :: adv_x2
51 sll_real64,
dimension(:, :),
allocatable :: f
52 sll_real64,
dimension(:, :),
allocatable :: f_init
53 sll_real64,
dimension(:, :),
allocatable :: f_exact
63 sll_real64 :: delta_x1
64 sll_real64 :: delta_x2
72 sll_real64,
dimension(:, :),
allocatable :: buf
73 sll_real64,
dimension(:, :),
allocatable :: f_new
77 sll_real64,
dimension(:),
allocatable :: xx
78 sll_real64,
dimension(:),
allocatable :: x1_array
79 sll_real64,
dimension(:),
allocatable :: x2_array
82 character(len=256) :: filename
84 sll_int32,
parameter :: input_file = 99
123 call get_command_argument(1, filename)
124 if (len_trim(filename) .ne. 0)
then
125 print *,
'#read namelist'
126 open (unit=input_file, file=trim(filename)//
'.nml', iostat=io_stat)
127 if (io_stat /= 0)
then
128 print *,
'#aligned_translation_2d failed to open file ', trim(filename)//
'.nml'
131 read (input_file, params)
134 print *,
'#use default parameters'
136 print *,
'#k_mode=', k_mode
137 print *,
'#Nc_x1=', nc_x1
138 print *,
'#Nc_x2=', nc_x2
139 print *,
'#x1_min, x1_max=', x1_min, x1_max
140 print *,
'#x2_min, x2_max=', x2_min, x2_max
141 print *,
'#nb_step=', nb_step
144 print *,
'#A1_0', a1_0
145 print *,
'#A2_0', a2_0
149 delta_x1 = (x1_max - x1_min)/real(nc_x1, f64)
150 delta_x2 = (x2_max - x2_min)/real(nc_x2, f64)
153 sll_allocate(xx(r:s), ierr)
154 sll_allocate(buf(r:s, nc_x1 + 1), ierr)
155 sll_allocate(f(nc_x1 + 1, nc_x2 + 1), ierr)
156 sll_allocate(f_init(nc_x1 + 1, nc_x2 + 1), ierr)
157 sll_allocate(f_exact(nc_x1 + 1, nc_x2 + 1), ierr)
158 sll_allocate(f_new(nc_x1 + 1, nc_x2 + 1), ierr)
159 sll_allocate(x1_array(nc_x1 + 1), ierr)
160 sll_allocate(x2_array(nc_x2 + 1), ierr)
163 x1_array(i) = x1_min + real(i - 1, f64)*delta_x1
166 x2_array(i) = x2_min + real(i - 1, f64)*delta_x2
170 xx(i1) = real(i1, f64)
173 adv_x1 => new_periodic_1d_advector( &
180 adv_x2 => new_periodic_1d_advector( &
189 x2 = x2_min + real(i2 - 1, f64)*delta_x2
191 x1 = x1_min + real(i1 - 1, f64)*delta_x1
192 x2 = x2_min + real(i2 - 1, f64)*delta_x2
193 f_init(i1, i2) = sin(2._f64*sll_p_pi*real(k_mode, f64)*(-a2_0*x1 + a1_0*x2))
194 x1 = x1 - a1*real(nb_step, f64)*dt
195 x2 = x2 - a2*real(nb_step, f64)*dt
196 f_exact(i1, i2) = sin(2._f64*sll_p_pi*real(k_mode, f64)*(-a2_0*x1 + a1_0*x2))
207 call adv_x1%advect_1d_constant(a1, dt, f(1:nc_x1 + 1, i2), f(1:nc_x1 + 1, i2))
211 call adv_x2%advect_1d_constant(a2, dt, f(i1, 1:nc_x2 + 1), f(i1, 1:nc_x2 + 1))
214 err = maxval(abs(f - f_exact))
215 print *,
'#err for classical method=', err
244 alpha = a2*dt/delta_x2
247 print *,
'#i0=', i0, alpha
253 dt_loc = real(ell + i0, f64)*delta_x2/a2
254 i2_loc = modulo(i2 - ell - i0 - 1, nc_x2) + 1
255 call adv_x1%advect_1d_constant( &
258 f(1:nc_x1 + 1, i2_loc), &
259 buf(ell, 1:nc_x1 + 1))
263 f_new(i1, i2) = lagrange_interpolate(alpha, d, xx, buf(r:s, i1))
268 err = maxval(abs(f - f_exact))
269 print *,
'#err with new method=', err
program aligned_translation_2d
Abstract class for advection.