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)