Skip to content

Commit 76eb371

Browse files
committed
Modifcations for searching the targeted eigenpairs one by one
1 parent e8efff4 commit 76eb371

5 files changed

Lines changed: 96 additions & 10 deletions

File tree

Changes_cychen.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ monitor. The output messages are very useful for extremely large-scaled calculat
1414
iteration calculations. Or, error results could be obtained in some cases (in
1515
O-like isoelectronic sequence?).
1616
09. dvdson--mpi
17+
10. Modifcations for searching the targeted eigenpairs one by one

src/appl/rci90_mpi/maneigmpi.f90

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

src/lib/libdvd90/dvdson.f90

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,11 @@ SUBROUTINE DVDSON(IRC, IREV, N, LIM, NOC, ILOW, IHIGH, ISELEC, NIV, &
362362

363363
IF (IERR /= 0) RETURN
364364

365-
NUME = IHIGH
365+
!set NUME=NIV. In step-by-step diagonalization, IHIGH is changed in
366+
!different calling dvdson
367+
!NUME=IHIGH
368+
NUME = NIV
369+
366370
! ..Identify if few of the highest eigenpairs are wanted.
367371
IF (ILOW + IHIGH - 1 > N) THEN
368372
HIEND = .TRUE.
@@ -423,6 +427,7 @@ SUBROUTINE DVDSON(IRC, IREV, N, LIM, NOC, ILOW, IHIGH, ISELEC, NIV, &
423427
!
424428

425429
100 CONTINUE
430+
! CYC: niv may be changed to nume+1 in initdvd
426431
CALL INITDVD (IRC, IREV, N, NOC, NIV, NUME + 1, LIM, HIEND, WORK(ISCRA1)&
427432
, WORK(IORTHO), WORK(IBASIS), WORK(IAB), WORK(IS))
428433
! ----------------------------------------------------------------

src/lib/libdvd90/gdvd.f90

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
!***************************************************************************
33

4-
SUBROUTINE GDVD(OP, N, LIM, DIAG, ILOW, IHIGH, ISELEC, NIV, MBLOCK, CRITE&
4+
SUBROUTINE GDVD(OP, IRESTART_GDVD, N, LIM, DIAG, ILOW, IHIGH, ISELEC, NIV, MBLOCK, CRITE&
55
, CRITC, CRITR, ORTHO, MAXITER, WORK, IWRSZ, IWORK, IIWSZ, HIEND, &
66
NLOOPS, NMV, IERR)
77
! Written by M. Saparov
@@ -25,6 +25,7 @@ SUBROUTINE GDVD(OP, N, LIM, DIAG, ILOW, IHIGH, ISELEC, NIV, MBLOCK, CRITE&
2525
!-----------------------------------------------
2626
! D u m m y A r g u m e n t s
2727
!-----------------------------------------------
28+
INTEGER :: IRESTART_GDVD
2829
INTEGER :: N
2930
INTEGER :: LIM
3031
INTEGER :: ILOW
@@ -134,13 +135,27 @@ SUBROUTINE GDVD(OP, N, LIM, DIAG, ILOW, IHIGH, ISELEC, NIV, MBLOCK, CRITE&
134135
GO TO 99
135136

136137
!*********
137-
ELSE IF (IRC==2 .OR. IRC==3) THEN
138+
!-----------------------------------------------------------------------
139+
! CYC: Try to diagonalize step by step
140+
!ELSE IF (IRC==2 .OR. IRC==3) THEN
141+
ELSE IF (IRC==3) THEN
138142
!********* ..Matrix-vector multiply.
139143
CALL OP (N, NB, WORK(IW1), WORK(IW2))
140144
NMV = NMV + NB
141-
142145
GO TO 99
146+
147+
ELSE IF (IRC==2) THEN
148+
IF (IRESTART_GDVD==0) THEN
149+
CALL OP (N, NB, WORK(IW1), WORK(IW2))
150+
NMV = NMV + NB
151+
ELSE
152+
CALL OP (N, 1, WORK(IW1), WORK(IW2))
153+
NMV = NMV + 1
154+
ENDIF
155+
GO TO 99
143156
ENDIF
157+
! CYC
158+
!-----------------------------------------------------------------------
144159
! * * * * End of Reverse Communication * * * * * * * * * * * * * * * * *
145160

146161
RETURN

src/lib/libdvd90/gdvd_I.f90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ MODULE gdvd_I
33
!...Generated by Pacific-Sierra Research 77to90 4.3E 20:12:31 2/12/04
44
!...Modified by Charlotte Froese Fischer
55
! Gediminas Gaigalas 10/05/17
6-
SUBROUTINE gdvd (OP, N, LIM, DIAG, ILOW, IHIGH, ISELEC, NIV, MBLOCK&
6+
SUBROUTINE gdvd (OP, IRESTART_GDVD, N, LIM, DIAG, ILOW, IHIGH, ISELEC, NIV, MBLOCK&
77
, CRITE, CRITC, CRITR, ORTHO, MAXITER, WORK, IWRSZ, IWORK, IIWSZ&
88
, HIEND, NLOOPS, NMV, IERR)
99
USE vast_kind_param,ONLY: DOUBLE
1010
EXTERNAL OP
11+
integer, INTENT(IN) :: IRESTART_GDVD
1112
integer, INTENT(IN) :: N
1213
integer, INTENT(IN) :: LIM
1314
real(DOUBLE), DIMENSION(N), INTENT(INOUT) :: DIAG

0 commit comments

Comments
 (0)