      subroutine SCHG(lp,s,R,M,SI,bd,BUFF,a,b,d,F,X)
c     UKLADY 3 DIAG. DOWOLNE ZMIENNE WSPOLCZYNNIKI
c     MACIERZ PODAJEMY DIAGONALAMI: POD,GLOWNA,NAD
c     POD a(j), DIAG d(j), NAD b(j) 
c     j-'global': j=s*(R+1)+k, k- 'local' k=0,1,...,R
c     NUMER PROCESORA s=0,1,...,lp-1
c     W KAZDYM PROCESPRZE s WSZYSTKIE CALE  WIERSZE
c     O NUMERACH l=s*(R+1)+k, k=0,1,...,R 
c     KORZYSTA Z ELIM.f I ELIM3.f
c     PODZIAL: PROCESORY   s=0,...,lp-1
c     W KAZDYM PROCESORZE  k=0,...,R, s-USTALONE
c     F(j) KOLUMNA PRAWEJ STRONY  j=s*(R+1)+k
c     W KAZDYM PROESORZE CALY UKLAD SCHURA
c     PRZESYLANIE ALLGATHER PAK==>QAK
      implicit none 
      include 'mpif.h'

c     PAK - SEND, QAK - RECV
      real*8 F,PAK,QAK,MAG,MAS,a,d,b
      real*8 W,V,X,XT,BUFF,O,E
      real*8 Z,SD,SB,SA,SS
      integer lp,s,i,j,k,R,M,SI,p,bd,ierr

      dimension X(0:R),F(0:R),BUFF(bd)
      dimension MAG(0:R,0:6),MAS(0:SI,0:4)
      dimension a(0:R),d(0:R),b(0:R)
      dimension XT(0:R),PAK(0:5),QAK(0:((6*lp)-1))
      dimension W(0:R),V(0:R),Z(0:SI)

c     STALE
      O=real(0)
      E=real(1)
      SI=2*lp-3

c     PIERWSZE PRZYBLIZENIE XT,W,V
c     LADOWANIE MAG DLA XT,W,IV
      do k=0,R,1
      if(k.eq.0)then
      MAG(0,0)=a(k)
      MAG(0,1)=d(k)
      MAG(0,2)=b(k)
      MAG(0,3)=O
      MAG(0,4)=F(k)
      MAG(0,5)=E
      MAG(0,6)=O
      elseif(k.eq.R)then
      MAG(R,0)=a(k)
      MAG(R,1)=d(k)
      MAG(R,2)=b(k)
      MAG(R,3)=O
      MAG(R,4)=F(k)
      MAG(R,5)=O
      MAG(R,6)=E
      else
      MAG(k,0)=a(k)
      MAG(k,1)=d(k)
      MAG(k,2)=b(k)
      MAG(k,3)=O
      MAG(k,4)=F(k)
      MAG(k,5)=O
      MAG(k,6)=O
      endif
      enddo

c     ROZWIAZANIE UKLADU DLA XT, W i V
      call ELIM3(R,MAG,XT,W,V)

c     MACIERZ SCHURA DLA lp=4
c     WSPOLCZYNNIKI ZALEZA OD PROCESORA s
c     Z KTOREGO POCHODZA

c  s=0   |SS,E ,O ,O ,O ,O |  |XT(R)|
c  s=1   |E ,SD,SB,O ,O ,O |  |XT(0)|
c  s=1   |O ,SA,SS,E ,O ,O |  |XT(R)|
c  s=2   |O ,O ,E ,SD,SB,O |  |XT(0)|
c  s=2   |O ,O ,O ,SA,SS,E |  |XT(R)|
c  s=3   |O ,O ,O ,O ,E ,SD|  |XT(0)|

c     TWORZENIE WSPOLCZYNNIKOW
      if(s.eq.0)then
      SS=b(R)*V(R)
      elseif(s.eq.(lp-1))then
      SD=a(0)*W(0)
      else
      SD=a(0)*W(0)
      SB=b(R)*V(0)
      SA=a(0)*W(R)
      SS=b(R)*V(R)
      endif

c     PRZYGOTOWANIE DLA ALLGATHER
c     PAK==>QAK
c     PAKA DO WYSYLKI
c     UWAZAC PRZY ODCZYCIE Z QAK!
c     TWORZENIE PAK

      if(s.eq.0)then
      PAK(0)=O
      PAK(1)=O
      PAK(2)=O
      PAK(3)=SS
      PAK(4)=O
      PAK(5)=XT(R)
      elseif(s.eq.(lp-1))then
      PAK(0)=SD
      PAK(1)=O
      PAK(2)=O
      PAK(3)=O
      PAK(4)=XT(0)
      PAK(5)=O
      else
      PAK(0)=SD
      PAK(1)=SB
      PAK(2)=SA
      PAK(3)=SS
      PAK(4)=XT(0)
      PAK(5)=XT(R)
      endif

c     ALLGATHER
      call MPI_Allgather
     $(PAK,6,MPI_Real8,QAK,6,MPI_Real8,MPI_Comm_World,ierr)      

      call MPI_Barrier(MPI_Comm_World,ierr)


      do i=0,SI,1
      if(i.eq.0)then
      MAS(0,0)=O
      MAS(0,1)=QAK(3)
      MAS(0,2)=E
      MAS(0,3)=O
      MAS(0,4)=QAK(5)
      elseif(i.eq.SI)then
      p=(SI+1)/2
      MAS(SI,0)=E
      MAS(SI,1)=QAK(6*p)
      MAS(SI,2)=O
      MAS(SI,3)=O
      MAS(SI,4)=QAK(6*p+4)
      else
       if(mod(i,2).eq.0)then
       p=(i+1)/2
       MAS(i,0)=QAK(6*p+2)
       MAS(i,1)=QAK(6*p+3)
       MAS(i,2)=E
       MAS(i,3)=O
       MAS(i,4)=QAK(6*p+5)
       else     
       p=(i+1)/2  
       MAS(i,0)=E
       MAS(i,1)=QAK(6*p)
       MAS(i,2)=QAK(6*p+1)
       MAS(i,3)=O
       MAS(i,4)=QAK(6*p+4)
       endif
      endif
      enddo
c     ROZWIAZANIE UKLADU SCHURA
      call ELIM(SI,MAS,Z)

c     POPRAWKI W KAZDYM PROCESORZE
      if(s.eq.0)then
       do k=0,R,1
       X(k)=XT(k)-b(R)*V(k)*Z(0)
       enddo
      elseif(s.eq.(lp-1))then
       do k=0,R,1
       X(k)=XT(k)-a(0)*W(k)*Z(SI)
       enddo
      elseif(mod(s,2).eq.0)then
       do k=0,R,1
       X(k)=XT(k)-a(0)*W(k)*Z(s+1)-b(R)*V(k)*Z(s+2)
       enddo
      else
       do k=0,R,1
       X(k)=XT(k)-a(0)*W(k)*Z(s)-b(R)*V(k)*Z(s+1)
       enddo
      endif

c     OUT
      return
      end
