C ++********************************************************************
C                                                                      *
C                                                                      *
C                                                                      *
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2005  Health Research Inc.                      *
C=*                                                                    *
C=* HEALTH RESEARCH INCORPORATED (HRI),                                *   
C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455.                   *
C=*                                                                    *
C=* Email:  spider@wadsworth.org                                       *
C=*                                                                    *
C=* This program is free software; you can redistribute it and/or      *
C=* modify it under the terms of the GNU General Public License as     *
C=* published by the Free Software Foundation; either version 2 of the *
C=* License, or (at your option) any later version.                    *
C=*                                                                    *
C=* This program is distributed in the hope that it will be useful,    *
C=* but WITHOUT ANY WARRANTY; without even the implied warranty of     *
C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
C=* General Public License for more details.                           *
C=*                                                                    *
C=* You should have received a copy of the GNU General Public License  *
C=* along with this program; if not, write to the                      *
C=* Free Software Foundation, Inc.,                                    *
C=* 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.      *
C=*                                                                    *
C **********************************************************************
C                                                                      *
C                                                                      *
C                                                                      *
C  PURPOSE:                                                            *
C                                                                      *
C  PARAMETERS:                                                         *
C
C IMAGE_PROCESSING_ROUTINE                                             *
C
C        0         2         3         4         5         6         7 *
C23456789012345678901234567890123456789012345678901234567890123456789012
C***********************************************************************

        subroutine  docors3_s(bcke,bcn,n,nmat,ipcube,nn,ala,ANGS)

        dimension    bcke(nmat),bcn(n,n,n),ipcube(5,nn),angs(3)
        COMMON /PAR/  LDP,NM,LDPNM
        DIMENSION  IM(3)
        DOUBLE PRECISION  RM(3,3),QR(3),THETA,PHI,PSI,DX,DY,DZ
C       EQUIVALENCE  (IM(1),IX),(IM(2),IY),(IM(3),IZ)
        psi=angs(1)/45.0*datan(1.0d0)
        theta=angs(2)/45.0*datan(1.0d0)
        phi=angs(3)/45.0*datan(1.0d0)
        RM(1,1)=DCOS(THETA)*DCOS(PHI)*DCOS(PSI)-DSIN(PHI)*DSIN(PSI)
        RM(2,1)=-DCOS(THETA)*DCOS(PHI)*DSIN(PSI)-DSIN(PHI)*DCOS(PSI)
        RM(3,1)=DSIN(THETA)*DCOS(PHI)
        RM(1,2)=DCOS(THETA)*DSIN(PHI)*DCOS(PSI)+DCOS(PHI)*DSIN(PSI)
        RM(2,2)=-DCOS(THETA)*DSIN(PHI)*DSIN(PSI)+DCOS(PHI)*DCOS(PSI)
        RM(3,2)=DSIN(THETA)*DSIN(PHI)
        RM(1,3)=-DSIN(THETA)*DCOS(PSI)
        RM(2,3)=DSIN(THETA)*DSIN(PSI)
        RM(3,3)=DCOS(THETA)
C
c$omp parallel do private(i,j,ix,iy,iz,qr,qt,a1,a2,a3,a4,a5,
c$omp& a6,a7,a8,iox,ioy,ioz,dx,dy,dz,ixx)
        do   i=1,nn
           ixx=ipcube(3,i)-1-LDP
           iy=ipcube(4,i)-LDP
           iz=ipcube(5,i)-LDP
           do   j=ipcube(1,i),ipcube(2,i)
              ix=ixx+(j+1-ipcube(1,i))
C
C       DO  3  I3=1,3
C       QR(I3)=0.0
C       DO  3  I2=1,3
C3      QR(I3)=QR(I3)+RM(I2,I3)*IM(I2)
              QR(1)=RM(1,1)*IX+RM(2,1)*IY+RM(3,1)*IZ
              QR(2)=RM(1,2)*IX+RM(2,2)*IY+RM(3,2)*IZ
              QR(3)=RM(1,3)*IX+RM(2,3)*IY+RM(3,3)*IZ
C
              IOX=QR(1)+FLOAT(LDPNM)
              DX=QR(1)+LDPNM-IOX
              DX=DMAX1(DX,1.0D-5)
              IOY=QR(2)+FLOAT(LDPNM)
              DY=QR(2)+LDPNM-IOY
              DY=DMAX1(DY,1.0D-5)
              IOZ=QR(3)+FLOAT(LDPNM)
              DZ=QR(3)+LDPNM-IOZ
              DZ=DMAX1(DZ,1.0D-5)
C
c             QT=
c     &         +(1-DX)*(1-DY)*(1-DZ)*bcn(IOX,IOY,IOZ)
c     &         +   DX *(1-DY)*(1-DZ)*bcn(IOX+1,IOY,IOZ)
c     &         +(1-DX)*   DY *(1-DZ)*bcn(IOX,IOY+1,IOZ)
c     &         +(1-DX)*(1-DY)*   DZ *bcn(IOX,IOY,IOZ+1)
c     &         +   DX *   DY *(1-DZ)*bcn(IOX+1,IOY+1,IOZ)
c     &         +   DX *(1-DY)*   DZ *bcn(IOX+1,IOY,IOZ+1)
c     &         +(1-DX)*   DY *   DZ *bcn(IOX,IOY+1,IOZ+1)
c     &         +   DX *   DY *   DZ *bcn(IOX+1,IOY+1,IOZ+1)
C faster version :
c
        a1 = bcn(IOX,IOY,IOZ) 
        a2 = bcn(IOX+1,IOY,IOZ) - bcn(IOX,IOY,IOZ) 
        a3 = bcn(IOX,IOY+1,IOZ) - bcn(IOX,IOY,IOZ) 
        a4 = bcn(IOX,IOY,IOZ+1) - bcn(IOX,IOY,IOZ)
        a5 = bcn(IOX,IOY,IOZ)-bcn(IOX+1,IOY,IOZ)-bcn(IOX,IOY+1,IOZ)
     &     + bcn(IOX+1,IOY+1,IOZ)
        a6 = bcn(IOX,IOY,IOZ)-bcn(IOX+1,IOY,IOZ)-bcn(IOX,IOY,IOZ+1)
     &     + bcn(IOX+1,IOY,IOZ+1)
        a7 = bcn(IOX,IOY,IOZ)-bcn(IOX,IOY+1,IOZ)-bcn(IOX,IOY,IOZ+1)
     &     + bcn(IOX,IOY+1,IOZ+1)
        a8 = bcn(IOX+1,IOY,IOZ)+bcn(IOX,IOY+1,IOZ)+bcn(IOX,IOY,IOZ+1)
     &   - bcn(IOX,IOY,IOZ)-bcn(IOX+1,IOY+1,IOZ)-bcn(IOX+1,IOY,IOZ+1)
     &     - bcn(IOX,IOY+1,IOZ+1) + bcn(IOX+1,IOY+1,IOZ+1)
        QT= a1 + dz*(a4 + a6*dx + (a7 + a8*dx)*dy) + a3*dy
     &         + dx*(a2 + a5*dy)
C**********************************************************
c
              bcke(j)=bcke(j)+ala*QT
           enddo
        enddo
        end

