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)
590 u1_r = b / (h1 + h_neglect)
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)
614 u1_l = u1_l / (h0 + h_neglect)
617 u1_l = slope / (h0 + h_neglect)
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