!copyright (C) 2001  MSC-RPN COMM  %%%RPNPHY%%%
***s/p  integ2
*

      subroutine integ2(y,r,con,s,a,b,c,n,my,mr,nk,base) 8
*
#include "impnone.cdk"
      integer n,my,mr,nk
      real y(my,nk),r(mr,nk),con,s(n,nk),a(n,nk),b(n,nk),c(n,nk)
      logical base
*
*author
*          r. benoit (august 93) adapted from s/r intodif
*
*revision
* 001      G. Pellerin (May 03) - IBM Conversion
*                      - calls to vslog routine (from massvp4 library)
*
*object
*          to resolve differential equation of the 1st order
*          d y / d s = con * s**alpha*r with boundary condition at
*          s(nk) if base=.true. or at s(1) if base=.false.
*
*arguments
*
*          - output -
* y        result
*
*          - input -
* r        right-hand-side (mr,nk)
* con      constant muliplier
* alpha    exponent of pre-factor of the differential equation
* s        sigma levels
* a        work space (n,nk)
* b        work space (n,nk)
* c        work space (n,nk)
* n        horizontal dimension
* my       1st dimension of y
* mr       1st dimension of r
* nk       vertical dimension
* base     .true. for boundary condition at s(nk)
*          .false. for boundary condition at s(1)
*
*notes
*          y(*,1) or y(*,nk) must be initialized
*          based accordingly as y and r cannot share the same space.
*
**
*
      real q1,q2,q3,xp,xo,xm,ex,aa,bb,cc,dd,det,ak,bk,ck,co2
      real temp(n)
      integer j,k,l
*
*     calcul des a,b,c
*

*
*     cas 1: k = 1
*

      k = 1
      do j=1,n
         xp=s(j,2)
         xm=s(j,1)
         temp(j)=xp/xm
      enddo
         call vslog(temp,temp,n)
      do j=1,n
         xp=s(j,2)
         xm=s(j,1)
         xo=(xp+xm)*0.5
*gpp      q1=alog(xp/xm)
         q1=temp(j)
         q2=(xp-xm)
         q3=(xp*xp-xm*xm)*0.5

         q3=q3-xo*(2.0*q2-xo*q1)
         q2=q2-xo*q1
         aa=xm-xo
         bb=xp-xo
         cc=aa*aa
         dd=bb*bb
         det=aa*dd-bb*cc
         a(j,k)=(dd*q2-bb*q3)/det*0.5
         c(j,k)=(aa*q3-cc*q2)/det*0.5
         b(j,k)=q1*0.5-a(j,k)-c(j,k)
         aa=a(j,1)
         bb=b(j,1)*0.25
         cc=c(j,1)
         b(j,1)=aa+bb*(1.0+(s(j,3)-s(j,2))/(s(j,3)-s(j,1)))
         c(j,1)=cc+bb*(1.0+(s(j,3)-s(j,1))/(s(j,3)-s(j,2)))
         a(j,1)=-bb*((s(j,2)-s(j,1))*(s(j,2)-s(j,1)))/
     $              ((s(j,3)-s(j,2))*(s(j,3)-s(j,1)))
      enddo
*
*     cas 2: k = nk
*

      k = nk
      do j=1,n
         xp=s(j,nk)
         xm=s(j,nk-1)
         temp(j)=xp/xm
      enddo
         call vslog(temp,temp,n)
      do j=1,n
         xp=s(j,nk)
         xm=s(j,nk-1)
         xo=(xp+xm)*0.5
*gpp      q1=alog(xp/xm)
         q1=temp(j)
         q2=(xp-xm)
         q3=(xp*xp-xm*xm)*0.5

         q3=q3-xo*(2.0*q2-xo*q1)
         q2=q2-xo*q1
         aa=xm-xo
         bb=xp-xo
         cc=aa*aa
         dd=bb*bb
         det=aa*dd-bb*cc
         a(j,k)=(dd*q2-bb*q3)/det*0.5
         c(j,k)=(aa*q3-cc*q2)/det*0.5
         b(j,k)=q1*0.5-a(j,k)-c(j,k)
         aa=a(j,nk)
         bb=b(j,nk)*0.25
         cc=c(j,nk)
         b(j,nk)=cc+bb*(1.0+(s(j,nk-1)-s(j,nk-2))/
     $        (s(j,nk)-s(j,nk-2)))
         a(j,nk)=aa+bb*(1.0+(s(j,nk)-s(j,nk-2))/
     $        (s(j,nk-1)-s(j,nk-2)))
         c(j,nk)=-bb*((s(j,nk)-s(j,nk-1))*(s(j,nk)-s(j,nk-1)))/
     $             ((s(j,nk-1)-s(j,nk-2))*(s(j,nk)-s(j,nk-2)))
      enddo
*
*     cas 1: k > 1 and < nk
*

      do k=2,nk-1
         do j=1,n
            xp=s(j,k+1)
            xm=s(j,k-1)
            temp(j)=xp/xm
         enddo
          call vslog(temp,temp,n)
         do  j=1,n
            xp=s(j,k+1)
            xo=s(j,k)
            xm=s(j,k-1)
*gpp         q1=alog(xp/xm)
            q1=temp(j)
            q2=(xp-xm)
            q3=(xp*xp-xm*xm)*0.5

            q3=q3-xo*(2.0*q2-xo*q1)
            q2=q2-xo*q1
            aa=xm-xo
            bb=xp-xo
            cc=aa*aa
            dd=bb*bb
            det=aa*dd-bb*cc
            a(j,k)=(dd*q2-bb*q3)/det*0.5
            c(j,k)=(aa*q3-cc*q2)/det*0.5
            b(j,k)=q1*0.5-a(j,k)-c(j,k)
         enddo
      enddo

*
*
*     integration
*
        if (base) then
*
*       y(nk) est initialise
*
           do 2 j=1,n
              ak=-2.0*con*a(j,nk)
              bk=-2.0*con*b(j,nk)
              ck=-2.0*con*c(j,nk)
    2         y(j,nk-1)=ak*r(j,nk-1)+bk*r(j,nk)+ck*r(j,nk-2)+y(j,nk)
           do 3 k=nk-2,1,-1
              do 3 j=1,n
                 ak=-2.0*con*a(j,k+1)
                 bk=-2.0*con*b(j,k+1)
                 ck=-2.0*con*c(j,k+1)
    3            y(j,k)=ak*r(j,k)+bk*r(j,k+1)+ck*r(j,k+2)+y(j,k+2)
        else
*
*     y(1) est initialise
*
           do 4 j=1,n
              ak=2.0*con*a(j,1)
              bk=2.0*con*b(j,1)
              ck=2.0*con*c(j,1)
    4         y(j,2)=bk*r(j,1)+ck*r(j,2)+ak*r(j,3)+y(j,1)
           do 5 k=3,nk,1
              do 5 j=1,n
                 ak=2.0*con*a(j,k-1)
                 bk=2.0*con*b(j,k-1)
                 ck=2.0*con*c(j,k-1)
    5            y(j,k)=ak*r(j,k-2)+bk*r(j,k-1)+ck*r(j,k)+y(j,k-2)
        endif
*
*
      return
      end