C ********************************************************************** C C ADS.F FOR SPEED APR 03 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 PURPOSE: ADD A SERIES OF IMAGES (USES LESS MEMORY THAN 'AS R' C FASTER THAN 'AD' C C--********************************************************************* SUBROUTINE ADS(LUNIN,LUNSUM,LUNDOC) INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' CHARACTER(LEN=MAXNAM) :: FILNAM,FILA,FILPAT COMMON /COMMUN/ FILNAM,FILA,FILPAT COMMON /IOBUF/ BUF(NBUFSIZ) REAL, ALLOCATABLE, DIMENSION(:) :: SUMARAY #ifndef SP_32 INTEGER *8 NVOX,IOK8 #else INTEGER *4 NVOX,IOK8 #endif CALL FILELIST(.TRUE.,LUNDOC,FILPAT,NLETP,INUMBR,NIMAX,NUMT, & 'INPUT FILE TEMPLATE (E.G. PIC****)',IRTFLG) IF (IRTFLG .NE. 0) RETURN C OPEN FIRST PICTURE TO DETERMINE DIMS CALL FILGET(FILPAT,FILNAM,NLETP,INUMBR(1),IRTFLG) IF (IRTFLG .NE. 0) RETURN MAXIM = 0 CALL OPFILEC(0,.FALSE.,FILNAM,LUNIN,'O',IFORM,NSAM,NROW,NSLICE, & MAXIM,' ',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN NVOX = NSAM * NROW * NSLICE C COMPLAIN IF EXCESSIVE ALLOCATION CALL BIGALLOC(NVOX,IOK8,.FALSE.,.TRUE.,IRTFLG) ALLOCATE(SUMARAY(NVOX),STAT=IRTFLG) IF (IRTFLG .NE. 0) THEN CALL ERRT(102,'FAILED TO ALLOCATE',NVOX3) GOTO 999 ENDIF C FILL THE SUM ARRAY WITH FIRST FILE CALL REDVOL(LUNIN,NSAM,NROW,1,NSLICE,SUMARAY,IRTFLG) CLOSE(LUNIN) NREC = NROW * NSLICE DO IFIL=2,NUMT CALL FILGET(FILPAT,FILNAM,NLETP,INUMBR(IFIL),IRTFLG) IF (IRTFLG .NE. 0) THEN CALL ERRT(3,'ADS',NE) GOTO 997 ENDIF MAXIM = 0 CALL OPFILEC(0,.FALSE.,FILNAM,LUNIN,'Z',IFORM, & NSAM1,NROW1,NSLICE1,MAXIM,' ',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) THEN C ALLOW GAPS IN FILE SERIES WRITE(NOUT,100) FILNAM 100 FORMAT(' FILE: ',A,' NOT FOUND, FILE SKIPPED') ELSE C INPUT FILE OPENED OK IF (NSAM1.NE.NSAM.OR.NROW1.NE.NROW.OR.NSLICE1.NE.NSLICE)THEN CALL ERRT(1,'ADS',NE) GOTO 997 ENDIF ILOC = 0 DO I=1,NREC CALL REDLIN(LUNIN,BUF,NSAM,I) DO J = 1,NSAM SUMARAY(ILOC+J) = SUMARAY(ILOC+J) + BUF(J) ENDDO ILOC = ILOC + NSAM ENDDO CLOSE(LUNIN) ENDIF ENDDO C FINISHED, OPEN OUTPUT FILE MAXIM = 0 CALL OPFILEC(LUNIN,.TRUE.,FILA,LUNSUM,'U',IFORM,NSAM,NROW,NSLICE, & MAXIM,'OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) GOTO 997 CALL WRTVOL(LUNSUM,NSAM,NROW,1,NSLICE,SUMARAY,IRTFLG) 997 CLOSE(LUNSUM) CLOSE(LUNIN) 999 IF (ALLOCATED(SUMARAY)) DEALLOCATE(SUMARAY) RETURN END