@@ -132,8 +132,12 @@ SUBROUTINE MANEIG(IATJPO, IASPAR, NELMNT_a)
132132 CHARACTER (LEN= 8 ) :: CNUM
133133 REAL (DOUBLE), DIMENSION (:), pointer :: w, z, work, diag
134134 INTEGER , DIMENSION (:), pointer :: iwork, ifail, jwork
135- !- ----------------------------------------------
136- !
135+
136+ !- ----------------------------------------------------------------------
137+ ! CYC Modifications for step by step diagonalization
138+ INTEGER IRESTART_GDVD, ISTEP, NSTEP, IITMP, NMV0
139+ INTEGER TIME0, TIME1, TIME2
140+ ! CYC
137141!- ----------------------------------------------------------------------
138142 ABSTOL = 2 * DLAMCH(' S' )
139143 IF (MYID == 0 ) WRITE (6 , * ) ' Calling maneig...'
@@ -494,7 +498,7 @@ SUBROUTINE MANEIG(IATJPO, IASPAR, NELMNT_a)
494498 print * , ' Returned from iniestsd '
495499 if (ncf.gt. IOLPCK) then
496500 print * , ' Calling GDVD'
497- CALL GDVD (SPODMV,NCF,LIM,DIAG,ILOW,IHIGH, &
501+ CALL GDVD (SPODMV,IRESTART_GDVD, NCF,LIM,DIAG,ILOW,IHIGH, &
498502 JWORK,NIV,MBLOCK,CRITE,CRITC, CRITR,ORTHO,MAXITR, &
499503 WORK,LWORK,IWORK,LIWORK,HIEND,NLOOPS, &
500504 NMV,IERR)
@@ -505,10 +509,70 @@ SUBROUTINE MANEIG(IATJPO, IASPAR, NELMNT_a)
505509 IF (myid .EQ. 0 ) print * , ' Sparse - Memory, iniestmpi'
506510 CALL iniestmpi (IOLPCK, NCF,NIV,WORK,EMT,IENDC,IROW)
507511 if (ncf.gt. IOLPCK) then
508- CALL GDVD (SPICMVmpi,NCF,LIM,DIAG,ILOW,IHIGH, &
512+ !- ----------------------------------------------------------------------
513+ ! CYC: Try to diagonalize step by step
514+ IRESTART_GDVD = 0
515+ TIME0 = MPI_WTIME()
516+ ! More tests should be performed for istep, it could be set as 1
517+ ISTEP = 5
518+ NMV = 0
519+ IF (NCF.GT. 2.0E5 .AND. NVEX.GT. ISTEP) THEN
520+ NSTEP = NVEX / ISTEP
521+ IF (MOD (NVEX,ISTEP).LE. ISTEP/ 2 ) NSTEP = NSTEP - 1
522+ DO IITMP = 1 , NSTEP
523+ ! NIV could be changed to nvecmx+1 in dvdson:initdvd procedure
524+ NIV = NVEX
525+ ILOW = 1
526+ IHIGH = IITMP * ISTEP
527+ IF (IITMP .EQ. 1 ) THEN
528+ IRESTART_GDVD = 0
529+ ELSE
530+ IRESTART_GDVD = 1
531+ ENDIF
532+ NMV0 = NMV
533+ TIME1 = MPI_WTIME()
534+
535+ CALL GDVD (SPICMVmpi,IRESTART_GDVD,NCF,LIM,DIAG,ILOW,IHIGH, &
509536 JWORK,NIV,MBLOCK,CRITE,CRITC, CRITR,ORTHO,MAXITR, &
510537 WORK,LWORK,IWORK,LIWORK,HIEND,NLOOPS, &
511538 NMV,IERR)
539+
540+ TIME2 = MPI_WTIME()
541+ IF (MYID .EQ. 0 ) THEN
542+ WRITE (* , * )' IITMP= ' , IITMP, &
543+ ' Time (s)=' , TIME2 - TIME1
544+ WRITE (* ,* ) ' ' , NMV - NMV0, &
545+ ' Matrix-vector multiplies for this loop.'
546+ WRITE (* ,* ) ' ' , NMV, &
547+ ' Total matrix-vector multiplies by now.'
548+ ENDIF
549+ ENDDO
550+ ENDIF
551+
552+ ! Search the remaining (NVEX - ISTEP * NSTEP) EIGENPAIRS
553+ NIV = NVEX
554+ ILOW = 1
555+ IHIGH = NVEX
556+ NMV0 = NMV
557+ TIME1 = MPI_WTIME()
558+
559+ CALL GDVD(SPICMVmpi,IRESTART_GDVD,NCF,LIM,DIAG,ILOW,IHIGH, &
560+ JWORK,NIV,MBLOCK,CRITE,CRITC, CRITR,ORTHO,MAXITR, &
561+ WORK,LWORK,IWORK,LIWORK,HIEND,NLOOPS, &
562+ NMV,IERR)
563+
564+ TIME2 = MPI_WTIME()
565+ IF (MYID .EQ. 0 ) THEN
566+ WRITE (* , * )' IITMP= ' , IITMP, &
567+ ' Time (s)=' , TIME2 - TIME1
568+ WRITE (* ,* ) ' ' , NMV - NMV0, &
569+ ' Matrix-vector multiplies for this loop.'
570+ WRITE (* ,* ) ' ' , NMV, &
571+ ' Total matrix-vector multiplies by now.'
572+ WRITE (* , * )' Total time (m)=' , (TIME2 - TIME0) / 60.0
573+ ENDIF
574+ ! CYC
575+ !- ----------------------------------------------------------------------
512576 end if
513577
514578 CALL DALLOC (EMT, ' EMT' , ' MANEIG' )
@@ -520,7 +584,7 @@ SUBROUTINE MANEIG(IATJPO, IASPAR, NELMNT_a)
520584 IF (myid .EQ. 0 ) print * , ' Dense - Memory, iniestdm'
521585 CALL INIESTDM (IOLPCK,NCF,NIV,WORK,EMT)
522586 if (ncf.gt. IOLPCK) then
523- CALL GDVD (DNICMV,NCF,LIM,DIAG,ILOW,IHIGH, &
587+ CALL GDVD (DNICMV,IRESTART_GDVD, NCF,LIM,DIAG,ILOW,IHIGH, &
524588 JWORK,NIV,MBLOCK,CRITE,CRITC, CRITR,ORTHO,MAXITR, &
525589 WORK,LWORK,IWORK,LIWORK,HIEND,NLOOPS, &
526590 NMV,IERR)
0 commit comments