
C++*********************************************************************
C
C COPYD.F      CREATED                        23 DEC 87 ARDEAN LEITH
C              USED GETOLDSTACK, GETNEWSTACK  APRIL 99  ARDEAN LEITH
C              GETNEWSTACK PARAM.             FEB 03    ARDEAN LEITH
C              FLIPEND                        FEB 03    ARDEAN LEITH
C              MPI                            FEB 04    Chao Yang
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  COPYD(IRTFLG)
C
C  PURPOSE:  COPY A SPIDER IMAGE FILE TO ANOTHER FILE
C 
C  PARAMETERS:       IRTFLG       ERROR FLAG                      (RET.)
C
C  NOTES:   NEEDS TO SET BUF(26) IN STACK
C
C23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
C--*********************************************************************

        SUBROUTINE COPYD(LUNIN,LUNOUT,INDXD,
     &                   NSAM,NROW,NSLICE,NSTACKIN,ITYPE,IFLIP)

        INCLUDE 'CMBLOCK.INC'
        INCLUDE 'CMLIMIT.INC'

        CHARACTER (LEN=MAXNAM) :: FILNAM
        COMMON /COMMUN/ FILNAM

        COMMON /IOERR/  IERR
        COMMON /IOBUF/  BUF(NBUFSIZ)

        LOGICAL :: VERBOSE_SAVE,INDXD
#ifdef USE_MPI
        include 'mpif.h'
        INTEGER  MYPID, COMM, MPIERR, NLETI
        CHARACTER(LEN=1) :: NULL
        COMM = MPI_COMM_WORLD
        MPIERR = 0 
        CALL MPI_COMM_RANK(COMM, MYPID, MPIERR)
        NULL = CHAR(0)
#else
        MYPID = -1
#endif

        VERBOSE_SAVE = VERBOSE

C	OPEN OUTPUT FILE, KEEP INPUT FILE DATE, TIME AND TITLE
        NSTACKOUT =  1           
        IF (NSTACKIN .GT. 0) THEN
C          INPUT IS A WHOLE STACK CHECK IF WANT INDEXED STACK
           IF (INDXD) NSTACKOUT = -NSTACKIN
        ENDIF

        CALL OPFILEC(LUNIN,.TRUE.,FILNAM,LUNOUT,'U',ITYPE,
     &               NSAM,NROW,NSLICE,NSTACKOUT,'OUTPUT',.TRUE.,IRTFLG) 
	IF (IRTFLG .NE. 0) RETURN
        IF (IFLIP .EQ. 1) CALL LUNSETFLIP(LUNOUT,IFLIP,IRTFLG)

	IF (NSTACKIN .GT. 0 .AND. NSTACKOUT .GE. 0) THEN
C	   DUPLICATE WHOLE STACK FILE RECORD BY RECORD INCLUDING HEADER

C          FIGURE OUT NUMBER OF DATA RECORDS TO BE COPIED
	   CALL TOTREC(NSAM,NROW,NSLICE,IEND)

C          DO NOT REPORT FILE INFO
           VERBOSE = .FALSE.

C          KEEP TRACK OF NUMBER OF IMAGES DONE
           IMDONE = 0

           IMGNUM = 1
           DO WHILE (IMGNUM .LE. NSTACKIN)

C            GET INPUT IMAGE FROM INPUT STACK (CAN INCREASE IMGNUM)            
             CALL GETOLDSTACK(LUNIN,NSAM,IMGNUM,
     &                       .TRUE.,.FALSE.,.TRUE.,IRTFLG)

             IF (IRTFLG .EQ. 0) THEN
C               CREATE OUTPUT IMAGE IN OUTPUT STACK
                CALL GETNEWSTACK(LUNIN,LUNOUT,NSAM,IMGNUM,IRTFLG)

                DO IREC = 1,IEND
                   CALL REDLIN(LUNIN,BUF,NSAM,IREC)
	           IF (IERR .NE. 0) THEN
                      WRITE(NOUT,*) 
     &                    '*** I/O ERROR:(',IERR,') READING RECORD: ',
     &                    IREC
                      CALL ERRT(101,'COPYD',IDUM)
                      GOTO 999
                   ENDIF

                   CALL WRTLIN(LUNOUT,BUF,NSAM,IREC)
	           IF (IERR .NE. 0) THEN
                      CALL ERRT(101,'COPYD',IDUM)
                      GOTO 999
                   ENDIF
                END DO
                IMGNUM = IMGNUM + 1
                IMDONE = IMDONE + 1
             ENDIF
           ENDDO

           IF (MYPID .LE. 0) WRITE(NOUT,90) IMDONE
90         FORMAT('  IMAGES COPIED: ',I6)
   
        ELSEIF (NSTACKIN .GE. 0 .AND. NSTACKOUT .LT. 0) THEN
           CALL ERRT(101,'CAN NOT COPY A WHOLE STACK TO AN IMAGE',NE)
           GOTO 999

	ELSE
C	  IMAGE TO STACKED IMAGE OR STACKED IMAGE TO IMAGE

C         ALTER NECESSARY HEADER VALUES SUCH AS: BUF=24 & 27

C         ISTACK (BUF=25)IS  -1 JUST FOR OLD WEB COMPATIBILITY
          IV25 = 0
          IF (NSTACKOUT .GT. -2) IV25 = -1

          CALL LUNSET25(LUNOUT,IV25,IRTFLG)

C         SET IMGNUM  (BUF=27)
          CALL LUNGETINUSE(LUNOUT,IMGNUM,IRTFLG)
          IF (NSTACKOUT .EQ. -2) IMGNUM = 0
          CALL LUNSETINUSE(LUNOUT,IMGNUM,IRTFLG)

C         PLACE ALTERED HEADER INTO NEW IMAGE FILE
	  CALL LUNWRTHED(LUNOUT,NSAM,IMGNUM,IRTFLG)
          IF (IRTFLG .NE. 0) GOTO 999
    
C         FIGURE OUT NUMBER OF DATA RECORDS TO BE COPIED
	  CALL TOTREC(NSAM,NROW,NSLICE,IEND)

C         COPY THE DESIRED NUMBER OF DATA RECORDS
          DO  I = 1,IEND
             CALL REDLIN(LUNIN,BUF,NSAM,I)
             CALL WRTLIN(LUNOUT,BUF,NSAM,I)
          ENDDO

       ENDIF
       IRTFLG = 0

999    CLOSE(LUNIN)
       CLOSE(LUNOUT)
       VERBOSE = VERBOSE_SAVE  

       RETURN
       END

