
C ++********************************************************************
C                                                                      *
C   BCKCQ.F              SPEEDED UP  FEB 2000 ARDEAN LEITH             *
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  BCKCQ(CUBE,LTC,DM,B,N,IPCUBE,NN)                                    *
C                                                                      *
C  PURPOSE:         BACKPROJECTS B INTO CUBE                           *
C                                                                      *
C  PARAMETERS:      CUBE                                     SENT/RET. *
C                   LTC      DIMENSIONS OF CUBE ARRAY        SENT      *
C                   DM                                                 *
C                   B                                        SENT      *
C                   N        DIMENSIONS OF B                 SENT      *
C                   IPCUBE                                   SENT      *
C                   NN       2ND DIMENSION OF IPCUBE         SENT      *
C                                                                      *
C IMAGE_PROCESSING_ROUTINE                                             *
C                                                                      *
C        0         2         3         4         5         6         7 *
C23456789012345678901234567890123456789012345678901234567890123456789012
C***********************************************************************

        SUBROUTINE  BCKCQ(CUBE,LTC,DM,B,N,IPCUBE,NN)

        DIMENSION     DM(9),CUBE(LTC),B(4,N,N)
        INTEGER       IPCUBE(5,NN)
        COMMON /PAR/  LDP,NM,LDPNM

#ifdef SP_MP
c$omp   parallel do private(i,j,xb,yb,xbb,ybb,iqx,iqy,jt)
        DO   I=1,NN
           XB = ((IPCUBE(3,I)-LDP)*DM(1)+(IPCUBE(4,I)-LDP)*DM(2)+
     &          (IPCUBE(5,I)-LDP)*DM(3)) + LDPNM
           YB = ((IPCUBE(3,I)-LDP)*DM(4)+(IPCUBE(4,I)-LDP)*DM(5)+
     &          (IPCUBE(5,I)-LDP)*DM(6)) + LDPNM

           DO    J=IPCUBE(1,I),IPCUBE(2,I)
	      JT=J-IPCUBE(1,I)
	      XBB=XB+JT*DM(1)
	      YBB=YB+JT*DM(4)
              IQX  = IFIX(XBB)
              IQY  = IFIX(YBB)

              CUBE(J) = CUBE(J) + 
     &                      B(1,IQX,IQY) + (YBB-IQY) * B(2,IQX,IQY) + 
     &          (XBB-IQX) * (B(3,IQX,IQY) + (YBB-IQY) * B(4,IQX,IQY) )

           ENDDO
        ENDDO
#else
        DO   I=1,NN
           XB = ((IPCUBE(3,I)-LDP)*DM(1)+(IPCUBE(4,I)-LDP)*DM(2)+
     &          (IPCUBE(5,I)-LDP)*DM(3)) + LDPNM
           YB = ((IPCUBE(3,I)-LDP)*DM(4)+(IPCUBE(4,I)-LDP)*DM(5)+
     &          (IPCUBE(5,I)-LDP)*DM(6)) + LDPNM

           DO    J=IPCUBE(1,I),IPCUBE(2,I)

              IQX  = IFIX(XB)
              IQY  = IFIX(YB)

              CUBE(J) = CUBE(J) + 
     &                      B(1,IQX,IQY) + (YB-IQY) * B(2,IQX,IQY) + 
     &          (XB-IQX) * (B(3,IQX,IQY) + (YB-IQY) * B(4,IQX,IQY) )

              XB = XB + DM(1)
              YB = YB + DM(4)
           ENDDO
        ENDDO
#endif
        END



#ifdef NEVER
              XBB  = (J-IPCUBE(1,I)) * DM1 + XB
              YBB  = (J-IPCUBE(1,I)) * DM4 + YB
              IQX  = IFIX(XBB+FLOAT(LDPNM))
              IQY  = IFIX(YBB+FLOAT(LDPNM))
              DIPX = XBB+LDPNM-IQX
              DIPY = YBB+LDPNM-IQY
              IF (iqx .ne. iqx1 .or. iqy .ne. iqy1 .or.
     &            dipx1 .ne. dipx .or. dipy .ne. dipy1) then
                  write(6,*) 'simailar test failed'
                  write(6,*) iqx,iqy, ' != ',iqx1,iqy1
                  write(6,*) dipx,dipy, ' != ',dipx1,dipy1
                  stop 'simalar test failed'
              endif


C             REFORMATTED FASTER VERSION :
              CUBE(J) = CUBE(J) +
     &               B(IQX,  IQY) + 
     &         DIPY*(B(IQX,  IQY+1) - B(IQX,  IQY)) + 
     &         DIPX*(B(IQX+1,IQY)   - B(IQX,  IQY)  +
     &         DIPY*(B(IQX+1,IQY+1) - B(IQX+1,IQY)  -
     &              (B(IQX,  IQY+1) - B(IQX,  IQY))  ))

C             FASTER VERSION :
              CUBE(J)=CUBE(J)
     &        +B(IQX,IQY)+DIPY*(B(IQX,IQY+1)-B(IQX,IQY))
     &        +DIPX*(B(IQX+1,IQY)-B(IQX,IQY)
     &        +DIPY*(B(IQX+1,IQY+1)-B(IQX+1,IQY)
     &        -B(IQX,IQY+1)+B(IQX,IQY)))

C             SLOWER VERSION :
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))

#endif

