14 implicit none ;
private 16 public ppm_reconstruction, ppm_boundary_extrapolation
23 real,
parameter :: hneglect_dflt = 1.e-30
28 subroutine ppm_reconstruction( N, h, u, edge_values, ppoly_coef, h_neglect, answers_2018)
29 integer,
intent(in) :: N
30 real,
dimension(N),
intent(in) :: h
31 real,
dimension(N),
intent(in) :: u
32 real,
dimension(N,2),
intent(inout) :: edge_values
33 real,
dimension(N,3),
intent(inout) :: ppoly_coef
34 real,
optional,
intent(in) :: h_neglect
35 logical,
optional,
intent(in) :: answers_2018
39 real :: edge_l, edge_r
42 call ppm_limiter_standard( n, h, u, edge_values, h_neglect, answers_2018 )
47 edge_l = edge_values(k,1)
48 edge_r = edge_values(k,2)
51 ppoly_coef(k,1) = edge_l
52 ppoly_coef(k,2) = 4.0 * ( u(k) - edge_l ) + 2.0 * ( u(k) - edge_r )
53 ppoly_coef(k,3) = 3.0 * ( ( edge_r - u(k) ) + ( edge_l - u(k) ) )
57 end subroutine ppm_reconstruction
62 subroutine ppm_limiter_standard( N, h, u, edge_values, h_neglect, answers_2018 )
63 integer,
intent(in) :: N
64 real,
dimension(:),
intent(in) :: h
65 real,
dimension(:),
intent(in) :: u
66 real,
dimension(:,:),
intent(inout) :: edge_values
67 real,
optional,
intent(in) :: h_neglect
68 logical,
optional,
intent(in) :: answers_2018
73 real :: edge_l, edge_r
77 call bound_edge_values( n, h, u, edge_values, h_neglect, answers_2018 )
80 call check_discontinuous_edge_values( n, u, edge_values )
91 edge_l = edge_values(k,1)
92 edge_r = edge_values(k,2)
94 if ( (u_r - u_c)*(u_c - u_l) <= 0.0)
then 99 expr1 = 3.0 * (edge_r - edge_l) * ( (u_c - edge_l) + (u_c - edge_r))
100 expr2 = (edge_r - edge_l) * (edge_r - edge_l)
101 if ( expr1 > expr2 )
then 103 edge_l = u_c + 2.0 * ( u_c - edge_r )
104 edge_l = max( min( edge_l, max(u_l, u_c) ), min(u_l, u_c) )
105 elseif ( expr1 < -expr2 )
then 107 edge_r = u_c + 2.0 * ( u_c - edge_l )
108 edge_r = max( min( edge_r, max(u_r, u_c) ), min(u_r, u_c) )
114 if ( abs( edge_r - edge_l )<max(1.e-60,epsilon(u_c)*abs(u_c)) )
then 119 edge_values(k,1) = edge_l
120 edge_values(k,2) = edge_r
125 edge_values(1,:) = u(1)
126 edge_values(n,:) = u(n)
128 end subroutine ppm_limiter_standard
133 subroutine ppm_boundary_extrapolation( N, h, u, edge_values, ppoly_coef, h_neglect)
159 integer,
intent(in) :: N
160 real,
dimension(:),
intent(in) :: h
161 real,
dimension(:),
intent(in) :: u
162 real,
dimension(:,:),
intent(inout) :: edge_values
163 real,
dimension(:,:),
intent(inout) :: ppoly_coef
164 real,
optional,
intent(in) :: h_neglect
178 hneglect = hneglect_dflt ;
if (
present(h_neglect)) hneglect = h_neglect
191 u1_r = b *((h0+hneglect)/(h1+hneglect))
195 slope = 2.0 * ( u1 - u0 )
196 if ( abs(u1_r) > abs(slope) )
then 202 u0_r = edge_values(i1,1)
207 u0_l = 3.0 * u0 + 0.5 * u1_r - 2.0 * u0_r
210 exp1 = (u0_r - u0_l) * (u0 - 0.5*(u0_l+u0_r))
211 exp2 = (u0_r - u0_l) * (u0_r - u0_l) / 6.0
213 if ( exp1 > exp2 )
then 214 u0_l = 3.0 * u0 - 2.0 * u0_r
217 if ( exp1 < -exp2 )
then 218 u0_r = 3.0 * u0 - 2.0 * u0_l
221 edge_values(i0,1) = u0_l
222 edge_values(i0,2) = u0_r
225 b = 6.0 * u0 - 4.0 * u0_l - 2.0 * u0_r
226 c = 3.0 * ( u0_r + u0_l - 2.0 * u0 )
245 u1_l = u1_l * ((h1+hneglect)/(h0+hneglect))
248 slope = 2.0 * ( u1 - u0 )
249 if ( abs(u1_l) > abs(slope) )
then 255 u0_l = edge_values(i0,2)
260 u0_r = 3.0 * u1 - 0.5 * u1_l - 2.0 * u0_l
263 exp1 = (u0_r - u0_l) * (u1 - 0.5*(u0_l+u0_r))
264 exp2 = (u0_r - u0_l) * (u0_r - u0_l) / 6.0
266 if ( exp1 > exp2 )
then 267 u0_l = 3.0 * u1 - 2.0 * u0_r
270 if ( exp1 < -exp2 )
then 271 u0_r = 3.0 * u1 - 2.0 * u0_l
274 edge_values(i1,1) = u0_l
275 edge_values(i1,2) = u0_r
278 b = 6.0 * u1 - 4.0 * u0_l - 2.0 * u0_r
279 c = 3.0 * ( u0_r + u0_l - 2.0 * u1 )
285 end subroutine ppm_boundary_extrapolation
Provides functions used with the Piecewise-Parabolic-Method in the vertical ALE algorithm.
Edge value estimation for high-order resconstruction.