
C ++********************************************************************
C                                                                      *
C  BPCM                                                                *
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  BPCM(B,NNNN,NSAM,NROW,LPRJ,CUBE,NX3D,NY3D,NZC,DM,IOPIC,FIRST)                                                            *
C                                                                      *
C  PURPOSE:                                                            *
C                                                                      *
C  PARAMETERS:                                                         *
C                                                                      *
C23456789012345678901234567890123456789012345678901234567890123456789012
C***********************************************************************

        SUBROUTINE BPCM(B,NNNN,NSAM,NROW,LPRJ,CUBE,NX3D,NY3D,NZC,DM,
     &                   IOPIC,FIRST)

        DIMENSION         B(NNNN,NROW,LPRJ),CUBE(NX3D,NY3D)
        DIMENSION         DM(9,LPRJ)
        COMMON /PAR/      LDPX,LDPY,LDPZ,LDPNMX,LDPNMY,NZ1
        LOGICAL           FIRST

        DO K=1,NZC
           KZ = K-1+NZ1
           DO J=1,NY3D
              IF (FIRST)  THEN
                 DO I=1,NX3D
                    CUBE(I,J) = 0.0
		 ENDDO
              ELSE
                 CALL REDLIN(IOPIC,CUBE(1,J),NX3D,J+(K-1)*NY3D)
              ENDIF
	   ENDDO

           DO LP=1,LPRJ
c$omp         parallel do private(i,j,iqx,iqy,xb,yb,xbb,ybb,dipx,dipy)
              DO    J=1,NY3D
                 XBB =
     &            (1-LDPX)*DM(1,LP)+(J-LDPY)*DM(2,LP)+(KZ-LDPZ)*DM(3,LP)
                 YBB =
     &            (1-LDPX)*DM(4,LP)+(J-LDPY)*DM(5,LP)+(KZ-LDPZ)*DM(6,LP)
                 DO I=1,NX3D

                   XB   = (I-1)*DM(1,LP)+XBB
                   IQX  = IFIX(XB+FLOAT(LDPNMX))
                   IF (IQX.LT.1 .OR. IQX.GE.NSAM)  GOTO  101
                   YB   = (I-1)*DM(4,LP)+YBB
                   IQY  = IFIX(YB+FLOAT(LDPNMY))
                   IF (IQY.LT.1 .OR. IQY.GE.NROW)  GOTO  101
                   DIPX = XB+LDPNMX-IQX
                   DIPY = YB+LDPNMY-IQY

C faster version :
                   CUBE(I,J) = CUBE(I,J)
     &              +B(IQX,IQY,LP)+DIPY*(B(IQX,IQY+1,LP)-B(IQX,IQY,LP))
     &              +DIPX*(B(IQX+1,IQY,LP)-B(IQX,IQY,LP)
     &              +DIPY*(B(IQX+1,IQY+1,LP)-B(IQX+1,IQY,LP)
     &              -B(IQX,IQY+1,LP)+B(IQX,IQY,LP)))

C orig. version :
c                  CUBE(I,J) = CUBE(I,J)
c     &                 +(1.0-DIPX)*(1.0-DIPY)*B(MAP(IQX,IQY))
c     &                 +     DIPX *(1.0-DIPY)*B(MAP(IQX+1,IQY))
c     &                 +(1.0-DIPX)*     DIPY *B(MAP(IQX,IQY+1))
c     &                 +     DIPX *     DIPY *B(MAP(IQX+1,IQY+1))

101                CONTINUE
	  	 ENDDO
	    ENDDO
	  ENDDO

          DO J=1,NY3D
             CALL WRTLIN(IOPIC,CUBE(1,J),NX3D,J+(K-1)*NY3D)
          ENDDO
	ENDDO
        END
