15 implicit none ;
private 39 integer,
intent(in) :: N
40 real,
dimension(:),
intent(in) :: h
41 real,
dimension(:),
intent(in) :: u
42 real,
dimension(:,:),
intent(inout) :: ppoly_E
43 real,
dimension(:,:),
intent(inout) :: ppoly_S
44 real,
dimension(:,:),
intent(inout) :: ppoly_coefficients
69 c = 30.0 * u(k) - 12.0*u0_r - 18.0*u0_l + 1.5*h_c*(u1_r - 3.0*u1_l)
70 d = -60.0 * u(k) + h_c *(6.0*u1_l - 4.0*u1_r) + 28.0*u0_r + 32.0*u0_l
71 e = 30.0 * u(k) + 2.5*h_c*(u1_r - u1_l) - 15.0*(u0_l + u0_r)
74 ppoly_coefficients(k,1) = a
75 ppoly_coefficients(k,2) = b
76 ppoly_coefficients(k,3) = c
77 ppoly_coefficients(k,4) = d
78 ppoly_coefficients(k,5) = e
101 integer,
intent(in) :: N
102 real,
dimension(:),
intent(in) :: h
103 real,
dimension(:),
intent(in) :: u
104 real,
dimension(:,:),
intent(inout) :: ppoly_E
105 real,
dimension(:,:),
intent(inout) :: ppoly_S
109 integer :: inflexion_l
110 integer :: inflexion_r
113 real :: u_l, u_c, u_r
114 real :: h_l, h_c, h_r
115 real :: sigma_l, sigma_c, sigma_r
118 real :: a, b, c, d, e
119 real :: alpha1, alpha2, alpha3
120 real :: rho, sqrt_rho
121 real :: gradient1, gradient2
154 sigma_l = 2.0 * ( u_c - u_l ) / ( h_c +
h_neglect )
155 sigma_c = 2.0 * ( u_r - u_l ) / ( h_l + 2.0*h_c + h_r +
h_neglect )
156 sigma_r = 2.0 * ( u_r - u_c ) / ( h_c +
h_neglect )
158 if ( (sigma_l * sigma_r) .GT. 0.0 )
then 159 slope = sign( min(abs(sigma_l),abs(sigma_c),abs(sigma_r)), sigma_c )
166 if ( u1_l*slope .le. 0.0 ) u1_l = slope
167 if ( u1_r*slope .le. 0.0 ) u1_r = slope
170 if ( (u0_r - u_c) * (u_c - u0_l) .le. 0.0)
then 183 if ( (inflexion_l .EQ. 0) .AND. (inflexion_r .EQ. 0) )
then 187 c = 30.0 * u(k) - 12.0*u0_r - 18.0*u0_l + 1.5*h_c*(u1_r - 3.0*u1_l)
188 d = -60.0 * u(k) + h_c *(6.0*u1_l - 4.0*u1_r) + 28.0*u0_r + 32.0*u0_l
189 e = 30.0 * u(k) + 2.5*h_c*(u1_r - u1_l) - 15.0*(u0_l + u0_r)
197 rho = alpha2 * alpha2 - 4.0 * alpha1 * alpha3
200 if (( alpha1 .ne. 0.0 ) .and. ( rho .ge. 0.0 ))
then 202 sqrt_rho = sqrt( rho )
204 x1 = 0.5 * ( - alpha2 - sqrt_rho ) / alpha1
205 x2 = 0.5 * ( - alpha2 + sqrt_rho ) / alpha1
208 if ( (x1 .GE. 0.0) .AND. (x1 .LE. 1.0) .AND. &
209 (x2 .GE. 0.0) .AND. (x2 .LE. 1.0) )
then 211 gradient1 = 4.0 * e * (x1**3) + 3.0 * d * (x1**2) + 2.0 * c * x1 + b
212 gradient2 = 4.0 * e * (x2**3) + 3.0 * d * (x2**2) + 2.0 * c * x2 + b
215 if ( (gradient1 * slope .LT. 0.0) .OR. &
216 (gradient2 * slope .LT. 0.0) )
then 219 if ( abs(sigma_l) .LT. abs(sigma_r) )
then 228 else if ( (x1 .GE. 0.0) .AND. (x1 .LE. 1.0) )
then 230 gradient1 = 4.0 * e * (x1**3) + 3.0 * d * (x1**2) + 2.0 * c * x1 + b
233 if ( gradient1 * slope .LT. 0.0 )
then 236 if ( abs(sigma_l) .LT. abs(sigma_r) )
then 244 else if ( (x2 .GE. 0.0) .AND. (x2 .LE. 1.0) )
then 246 gradient2 = 4.0 * e * (x2**3) + 3.0 * d * (x2**2) + 2.0 * c * x2 + b
249 if ( gradient2 * slope .LT. 0.0 )
then 252 if ( abs(sigma_l) .LT. abs(sigma_r) )
then 265 if (( alpha1 .eq. 0.0 ) .and. ( alpha2 .ne. 0.0 ))
then 267 x1 = - alpha3 / alpha2
268 if ( (x1 .ge. 0.0) .AND. (x1 .le. 1.0) )
then 270 gradient1 = 4.0 * e * (x1**3) + 3.0 * d * (x1**2) + 2.0 * c * x1 + b
273 if ( gradient1 * slope .LT. 0.0 )
then 276 if ( abs(sigma_l) .LT. abs(sigma_r) )
then 290 if ( inflexion_l .EQ. 1 )
then 294 u1_l = ( 10.0 * u_c - 2.0 * u0_r - 8.0 * u0_l ) / (3.0*h_c +
h_neglect )
295 u1_r = ( -10.0 * u_c + 6.0 * u0_r + 4.0 * u0_l ) / ( h_c +
h_neglect )
301 if ( u1_l * slope .LT. 0.0 )
then 304 u0_r = 5.0 * u_c - 4.0 * u0_l
305 u1_r = 20.0 * (u_c - u0_l) / ( h_c +
h_neglect )
307 else if ( u1_r * slope .LT. 0.0 )
then 310 u0_l = (5.0*u_c - 3.0*u0_r) / 2.0
311 u1_l = 10.0 * (-u_c + u0_r) / (3.0 * h_c +
h_neglect)
315 else if ( inflexion_r .EQ. 1 )
then 319 u1_r = ( -10.0 * u_c + 8.0 * u0_r + 2.0 * u0_l ) / (3.0 * h_c +
h_neglect)
320 u1_l = ( 10.0 * u_c - 4.0 * u0_r - 6.0 * u0_l ) / (h_c +
h_neglect)
326 if ( u1_l * slope .LT. 0.0 )
then 329 u0_r = ( 5.0 * u_c - 3.0 * u0_l ) / 2.0
330 u1_r = 10.0 * (u_c - u0_l) / (3.0 * h_c +
h_neglect)
332 else if ( u1_r * slope .LT. 0.0 )
then 335 u0_l = 5.0 * u_c - 4.0 * u0_r
336 u1_l = 20.0 * ( -u_c + u0_r ) / (h_c +
h_neglect)
387 integer,
intent(in) :: N
388 real,
dimension(:),
intent(in) :: h
389 real,
dimension(:),
intent(in) :: u
390 real,
dimension(:,:),
intent(inout) :: ppoly_E
391 real,
dimension(:,:),
intent(inout) :: ppoly_coefficients
397 real :: a, b, c, d, e
413 b = ppoly_coefficients(i1,2)
418 slope = 2.0 * ( u1 - u0 )
419 if ( abs(u1_r) .GT. abs(slope) )
then 430 u0_l = 3.0 * u0 + 0.5 * u1_r - 2.0 * u0_r
433 exp1 = (u0_r - u0_l) * (u0 - 0.5*(u0_l+u0_r))
434 exp2 = (u0_r - u0_l) * (u0_r - u0_l) / 6.0
436 if ( exp1 .GT. exp2 )
then 437 u0_l = 3.0 * u0 - 2.0 * u0_r
440 if ( exp1 .LT. -exp2 )
then 441 u0_r = 3.0 * u0 - 2.0 * u0_l
448 b = 6.0 * u0 - 4.0 * u0_l - 2.0 * u0_r
449 c = 3.0 * ( u0_r + u0_l - 2.0 * u0 )
452 ppoly_coefficients(i0,1) = a
453 ppoly_coefficients(i0,2) = b
454 ppoly_coefficients(i0,3) = c
455 ppoly_coefficients(i0,4) = 0.0
456 ppoly_coefficients(i0,5) = 0.0
468 b = ppoly_coefficients(i0,2)
469 c = ppoly_coefficients(i0,3)
470 d = ppoly_coefficients(i0,4)
471 e = ppoly_coefficients(i0,5)
472 u1_l = (b + 2*c + 3*d + 4*e)
473 u1_l = u1_l * (h1/h0)
476 slope = 2.0 * ( u1 - u0 )
477 if ( abs(u1_l) .GT. abs(slope) )
then 488 u0_r = 3.0 * u1 - 0.5 * u1_l - 2.0 * u0_l
491 exp1 = (u0_r - u0_l) * (u1 - 0.5*(u0_l+u0_r))
492 exp2 = (u0_r - u0_l) * (u0_r - u0_l) / 6.0
494 if ( exp1 .GT. exp2 )
then 495 u0_l = 3.0 * u1 - 2.0 * u0_r
498 if ( exp1 .LT. -exp2 )
then 499 u0_r = 3.0 * u1 - 2.0 * u0_l
506 b = 6.0 * u1 - 4.0 * u0_l - 2.0 * u0_r
507 c = 3.0 * ( u0_r + u0_l - 2.0 * u1 )
510 ppoly_coefficients(i1,1) = a
511 ppoly_coefficients(i1,2) = b
512 ppoly_coefficients(i1,3) = c
513 ppoly_coefficients(i1,4) = 0.0
514 ppoly_coefficients(i1,5) = 0.0
546 integer,
intent(in) :: N
547 real,
dimension(:),
intent(in) :: h
548 real,
dimension(:),
intent(in) :: u
549 real,
dimension(:,:),
intent(inout) :: ppoly_E
550 real,
dimension(:,:),
intent(inout) :: ppoly_S
551 real,
dimension(:,:),
intent(inout) :: ppoly_coefficients
555 integer :: inflexion_l
556 integer :: inflexion_r
559 real :: a, b, c, d, e
565 real :: alpha1, alpha2, alpha3
566 real :: rho, sqrt_rho
567 real :: gradient1, gradient2
581 slope = 2.0 * ( u1 - u0 ) / ( ( h0 + h1 ) +
h_neglect )
586 a = ppoly_coefficients(i1,1)
587 b = ppoly_coefficients(i1,2)
595 beta = 2.0 * ( u0_r - um ) / ( (h0 +
h_neglect)*u1_r) - 1.0
599 br = u0_r + beta*u0_r - um
600 ar = um + beta*um - br
606 u_plm = um - 0.5 * slope
612 if ( abs(um-u0_l) .lt. abs(um-u_plm) )
then 613 u1_l = 2.0 * ( br - ar*beta)
625 c = 30.0 * um - 12.0*u0_r - 18.0*u0_l + 1.5*h0*(u1_r - 3.0*u1_l)
626 d = -60.0 * um + h0 *(6.0*u1_l - 4.0*u1_r) + 28.0*u0_r + 32.0*u0_l
627 e = 30.0 * um + 2.5*h0*(u1_r - u1_l) - 15.0*(u0_l + u0_r)
633 rho = alpha2 * alpha2 - 4.0 * alpha1 * alpha3
637 if (( alpha1 .ne. 0.0 ) .and. ( rho .ge. 0.0 ))
then 639 sqrt_rho = sqrt( rho )
641 x1 = 0.5 * ( - alpha2 - sqrt_rho ) / alpha1
642 if ( (x1 .gt. 0.0) .and. (x1 .lt. 1.0) )
then 643 gradient1 = 4.0 * e * (x1**3) + 3.0 * d * (x1**2) + 2.0 * c * x1 + b
644 if ( gradient1 * slope .lt. 0.0 )
then 649 x2 = 0.5 * ( - alpha2 + sqrt_rho ) / alpha1
650 if ( (x2 .gt. 0.0) .and. (x2 .lt. 1.0) )
then 651 gradient2 = 4.0 * e * (x2**3) + 3.0 * d * (x2**2) + 2.0 * c * x2 + b
652 if ( gradient2 * slope .lt. 0.0 )
then 659 if (( alpha1 .eq. 0.0 ) .and. ( alpha2 .ne. 0.0 ))
then 661 x1 = - alpha3 / alpha2
662 if ( (x1 .ge. 0.0) .and. (x1 .le. 1.0) )
then 663 gradient1 = 3.0 * d * (x1**2) + 2.0 * c * x1 + b
664 if ( gradient1 * slope .lt. 0.0 )
then 671 if ( inflexion_l .eq. 1 )
then 675 u1_l = ( 10.0 * um - 2.0 * u0_r - 8.0 * u0_l ) / (3.0*h0 +
h_neglect)
676 u1_r = ( -10.0 * um + 6.0 * u0_r + 4.0 * u0_l ) / (h0 +
h_neglect)
682 if ( u1_l * slope .LT. 0.0 )
then 685 u0_r = 5.0 * um - 4.0 * u0_l
686 u1_r = 20.0 * (um - u0_l) / ( h0 +
h_neglect )
688 else if ( u1_r * slope .LT. 0.0 )
then 691 u0_l = (5.0*um - 3.0*u0_r) / 2.0
692 u1_l = 10.0 * (-um + u0_r) / (3.0 * h0 +
h_neglect )
706 c = 30.0 * um - 12.0*u0_r - 18.0*u0_l + 1.5*h0*(u1_r - 3.0*u1_l)
707 d = -60.0 * um + h0 *(6.0*u1_l - 4.0*u1_r) + 28.0*u0_r + 32.0*u0_l
708 e = 30.0 * um + 2.5*h0*(u1_r - u1_l) - 15.0*(u0_l + u0_r)
711 ppoly_coefficients(i0,1) = a
712 ppoly_coefficients(i0,2) = b
713 ppoly_coefficients(i0,3) = c
714 ppoly_coefficients(i0,4) = d
715 ppoly_coefficients(i0,5) = e
728 slope = 2.0 * ( u1 - u0 ) / ( h0 + h1 )
733 a = ppoly_coefficients(i0,1)
734 b = ppoly_coefficients(i0,2)
735 c = ppoly_coefficients(i0,3)
736 d = ppoly_coefficients(i0,4)
737 e = ppoly_coefficients(i0,5)
738 u0_l = a + b + c + d + e
739 u1_l = (b + 2*c + 3*d + 4*e) / h0
743 if (um-u0_l.ne.0.)
then 744 beta = 0.5*h1*u1_l / (um-u0_l) - 1.0
748 br = beta*um + um - u0_l
752 if (1+beta.ne.0.)
then 753 u0_r = (ar + 2*br + beta*br ) / ((1+beta)*(1+beta))
755 u0_r = um + 0.5 * slope
759 u_plm = um + 0.5 * slope
765 if ( abs(um-u0_r) .lt. abs(um-u_plm) )
then 766 u1_r = 2.0 * ( br - ar*beta ) / ( (1+beta)*(1+beta)*(1+beta) )
778 c = 30.0 * um - 12.0*u0_r - 18.0*u0_l + 1.5*h1*(u1_r - 3.0*u1_l)
779 d = -60.0 * um + h1*(6.0*u1_l - 4.0*u1_r) + 28.0*u0_r + 32.0*u0_l
780 e = 30.0 * um + 2.5*h1*(u1_r - u1_l) - 15.0*(u0_l + u0_r)
786 rho = alpha2 * alpha2 - 4.0 * alpha1 * alpha3
790 if (( alpha1 .ne. 0.0 ) .and. ( rho .ge. 0.0 ))
then 792 sqrt_rho = sqrt( rho )
794 x1 = 0.5 * ( - alpha2 - sqrt_rho ) / alpha1
795 if ( (x1 .gt. 0.0) .and. (x1 .lt. 1.0) )
then 796 gradient1 = 4.0 * e * (x1**3) + 3.0 * d * (x1**2) + 2.0 * c * x1 + b
797 if ( gradient1 * slope .lt. 0.0 )
then 802 x2 = 0.5 * ( - alpha2 + sqrt_rho ) / alpha1
803 if ( (x2 .gt. 0.0) .and. (x2 .lt. 1.0) )
then 804 gradient2 = 4.0 * e * (x2**3) + 3.0 * d * (x2**2) + 2.0 * c * x2 + b
805 if ( gradient2 * slope .lt. 0.0 )
then 812 if (( alpha1 .eq. 0.0 ) .and. ( alpha2 .ne. 0.0 ))
then 814 x1 = - alpha3 / alpha2
815 if ( (x1 .ge. 0.0) .and. (x1 .le. 1.0) )
then 816 gradient1 = 3.0 * d * (x1**2) + 2.0 * c * x1 + b
817 if ( gradient1 * slope .lt. 0.0 )
then 824 if ( inflexion_r .eq. 1 )
then 828 u1_r = ( -10.0 * um + 8.0 * u0_r + 2.0 * u0_l ) / (3.0 * h1)
829 u1_l = ( 10.0 * um - 4.0 * u0_r - 6.0 * u0_l ) / h1
835 if ( u1_l * slope .lt. 0.0 )
then 838 u0_r = ( 5.0 * um - 3.0 * u0_l ) / 2.0
839 u1_r = 10.0 * (um - u0_l) / (3.0 * h1)
841 else if ( u1_r * slope .lt. 0.0 )
then 844 u0_l = 5.0 * um - 4.0 * u0_r
845 u1_l = 20.0 * ( -um + u0_r ) / h1
859 c = 30.0 * um - 12.0*u0_r - 18.0*u0_l + 1.5*h1*(u1_r - 3.0*u1_l)
860 d = -60.0 * um + h1 *(6.0*u1_l - 4.0*u1_r) + 28.0*u0_r + 32.0*u0_l
861 e = 30.0 * um + 2.5*h1*(u1_r - u1_l) - 15.0*(u0_l + u0_r)
863 ppoly_coefficients(i1,1) = a
864 ppoly_coefficients(i1,2) = b
865 ppoly_coefficients(i1,3) = c
866 ppoly_coefficients(i1,4) = d
867 ppoly_coefficients(i1,5) = e
subroutine, public pqm_boundary_extrapolation_v1(N, h, u, ppoly_E, ppoly_S, ppoly_coefficients)
subroutine, public check_discontinuous_edge_values(N, u, edge_values)
real, parameter h_neglect
subroutine, public pqm_reconstruction(N, h, u, ppoly_E, ppoly_S, ppoly_coefficients)
subroutine, public bound_edge_values(N, h, u, edge_values)
subroutine, public pqm_boundary_extrapolation(N, h, u, ppoly_E, ppoly_coefficients)
subroutine pqm_limiter(N, h, u, ppoly_E, ppoly_S)