|
| 1 | +!*********************************************************************** |
| 2 | +! * |
| 3 | + SUBROUTINE GETMIXBLOCK(NAME, NCI) |
| 4 | +! * |
| 5 | +! Reads mixing coefficient file from block-structured format * |
| 6 | +! * |
| 7 | +! Note: * |
| 8 | +! eav is not compatible with the non-block version if some blocks * |
| 9 | +! were not diagonalized * |
| 10 | +! * |
| 11 | +! This is a modified version of cvtmix.f * |
| 12 | +! * |
| 13 | +! Written by Per Jonsson, September 2003 * |
| 14 | +! Modified by G. Gaigalas, May 2011 * |
| 15 | +! * |
| 16 | +! Modified by C. Cychen 2021 * |
| 17 | +! * |
| 18 | +!*********************************************************************** |
| 19 | +!...Translated by Pacific-Sierra Research 77to90 4.3E 18:32:57 1/ 6/07 |
| 20 | +!----------------------------------------------- |
| 21 | +! M o d u l e s |
| 22 | +!----------------------------------------------- |
| 23 | + USE vast_kind_param, ONLY: DOUBLE |
| 24 | + USE memory_man |
| 25 | + USE def_C |
| 26 | + USE EIGV_C |
| 27 | + USE orb_C |
| 28 | + USE prnt_C |
| 29 | + USE syma_C |
| 30 | + USE iounit_C |
| 31 | + USE blk_C, ONLY: NEVINBLK, NCFINBLK, TWO_J |
| 32 | +!----------------------------------------------- |
| 33 | +! I n t e r f a c e B l o c k s |
| 34 | +!----------------------------------------------- |
| 35 | + USE openfl_I |
| 36 | + IMPLICIT NONE |
| 37 | +!----------------------------------------------- |
| 38 | +! D u m m y A r g u m e n t s |
| 39 | +!----------------------------------------------- |
| 40 | + INTEGER , INTENT(IN) :: NCI |
| 41 | + CHARACTER(LEN=24), INTENT(IN) :: NAME |
| 42 | +!----------------------------------------------- |
| 43 | +! L o c a l V a r i a b l e s |
| 44 | +!----------------------------------------------- |
| 45 | + INTEGER :: K, IERR, IOS, NCFTOT, NVECTOT, NVECSIZ, NBLOCK, I, NVECPAT, & |
| 46 | + NCFPAT, NEAVSUM, JB, NB, NCFBLK, NEVBLK, IATJP, IASPA, J |
| 47 | + REAL(DOUBLE) :: EAVSUM |
| 48 | + integer*8 NVECSIZPAT, NCFTOT_i8, NVECSIZ_i8 |
| 49 | + CHARACTER(LEN=3) :: STATUS |
| 50 | + CHARACTER(LEN=6) :: G92MIX |
| 51 | + CHARACTER(LEN=11) :: FORM |
| 52 | + CHARACTER(LEN=256) :: FILNAM |
| 53 | +!----------------------------------------------- |
| 54 | +! |
| 55 | +! The .mix file is UNFORMATTED; it must exist |
| 56 | +! |
| 57 | + K = INDEX(NAME,' ') |
| 58 | + IF (NCI == 0) THEN |
| 59 | + FILNAM = NAME(1:K-1)//'.cm' |
| 60 | + ELSE |
| 61 | + FILNAM = NAME(1:K-1)//'.m' |
| 62 | + ENDIF |
| 63 | + FORM = 'UNFORMATTED' |
| 64 | + STATUS = 'OLD' |
| 65 | +! |
| 66 | + CALL OPENFL (25, FILNAM, FORM, STATUS, IERR) |
| 67 | + IF (IERR == 1) THEN |
| 68 | + WRITE (ISTDE, *) 'Error when opening', FILNAM |
| 69 | + STOP |
| 70 | + ENDIF |
| 71 | +! |
| 72 | +! Check the header of the file; if not as expected, try again |
| 73 | +! |
| 74 | + READ (25, IOSTAT=IOS) G92MIX |
| 75 | + IF (IOS/=0 .OR. G92MIX/='G92MIX') THEN |
| 76 | + WRITE (ISTDE, *) 'Not a GRASP92 MIXing Coefficients File;' |
| 77 | + CLOSE(25) |
| 78 | + STOP |
| 79 | + ENDIF |
| 80 | + |
| 81 | + READ (25) NELEC, NCFTOT, NW, NVECTOT, NVECSIZ, NBLOCK |
| 82 | + WRITE (*, *) ' nelec = ', NELEC |
| 83 | + WRITE (*, *) ' ncftot = ', NCFTOT |
| 84 | + WRITE (*, *) ' nw = ', NW |
| 85 | + WRITE (*, *) ' nblock = ', NBLOCK |
| 86 | + WRITE (*, *) |
| 87 | + NCFTOT_i8 = NCFTOT |
| 88 | + |
| 89 | +!*********************************************************************** |
| 90 | +! Allocate memory for old format data |
| 91 | +!*********************************************************************** |
| 92 | + |
| 93 | +!GG CALL ALLOC (EVAL, NVECTOT, 'EVAL', 'GETMIXBLOCK') |
| 94 | +!GG CALL ALLOC (EVEC, NCFTOT*NVECTOT, 'EVEC', 'GETMIXBLOCK') |
| 95 | +!GG CALL ALLOC (IVEC, NVECTOT, 'IVEC', 'GETMIXBLOCK') |
| 96 | +!GG CALL ALLOC (IATJPO, NVECTOT, 'IATJPO', 'GETMIXBLOCK') |
| 97 | +!GG CALL ALLOC (IASPAR, NVECTOT, 'IASPAR', 'GETMIXBLOCK') |
| 98 | + allocate (EVAL(NVECTOT)) |
| 99 | + allocate (EVEC(NCFTOT_i8*NVECTOT)) |
| 100 | + allocate (IVEC(NVECTOT)) |
| 101 | + allocate (IATJPO(NVECTOT)) |
| 102 | + allocate (IASPAR(NVECTOT)) |
| 103 | + |
| 104 | +!*********************************************************************** |
| 105 | +! Initialize mixing coefficients to zero; others are fine |
| 106 | +!*********************************************************************** |
| 107 | + EVEC(:NVECTOT*NCFTOT_i8) = 0.D0 |
| 108 | + |
| 109 | +!*********************************************************************** |
| 110 | +! Initialize counters and sum registers |
| 111 | +! |
| 112 | +! nvecpat: total number of eigenstates of the previous blocks |
| 113 | +! ncfpat: total number of CSF of the previous blocks |
| 114 | +! nvecsizpat: vector size of the previous blocks |
| 115 | +! eavsum: sum of diagonal elements of the previous blocks where |
| 116 | +! at least one eigenstate is calculated |
| 117 | +! neavsum: total number CSF contributing to eavsum |
| 118 | +!*********************************************************************** |
| 119 | + |
| 120 | + NVECPAT = 0 |
| 121 | + NCFPAT = 0 |
| 122 | + NVECSIZPAT = 0 |
| 123 | + NEAVSUM = 0 |
| 124 | + EAVSUM = 0.D0 |
| 125 | + |
| 126 | + WRITE (*, *) ' block ncf nev 2j+1 parity' |
| 127 | + DO JB = 1, NBLOCK |
| 128 | + |
| 129 | + READ (25) NB, NCFBLK, NEVBLK, IATJP, IASPA |
| 130 | + WRITE (*, '(5I8)') NB, NCFBLK, NEVBLK, IATJP, IASPA |
| 131 | + NEVINBLK(JB) = NEVBLK |
| 132 | + NCFINBLK(JB) = NCFBLK |
| 133 | + TWO_J(JB) = IATJP - 1 |
| 134 | + IF (JB /= NB) STOP 'jb .NE. nb' |
| 135 | + |
| 136 | + IF (NEVBLK > 0) THEN |
| 137 | + |
| 138 | + READ (25) (IVEC(NVECPAT + I),I=1,NEVBLK) |
| 139 | + ! ivec(i) = ivec(i) + ncfpat ! serial # of the state |
| 140 | + IATJPO(NVECPAT+1:NEVBLK+NVECPAT) = IATJP |
| 141 | + IASPAR(NVECPAT+1:NEVBLK+NVECPAT) = IASPA |
| 142 | + |
| 143 | + READ (25) EAV, (EVAL(NVECPAT+I),I=1,NEVBLK) |
| 144 | + |
| 145 | +! ...Construct the true energy by adding up the average |
| 146 | + EVAL(NVECPAT+1:NEVBLK+NVECPAT) = EVAL(NVECPAT+1:NEVBLK+NVECPAT) + & |
| 147 | + EAV |
| 148 | +! ...For overal (all blocks) average energy |
| 149 | + EAVSUM = EAVSUM + EAV*NCFBLK |
| 150 | + NEAVSUM = NEAVSUM + NCFBLK |
| 151 | + |
| 152 | + READ (25) ((EVEC(NVECSIZPAT+NCFPAT+I+(J-1)*NCFTOT_i8),I=1,NCFBLK),J=1,& |
| 153 | + NEVBLK) |
| 154 | + ENDIF |
| 155 | +! |
| 156 | + NVECPAT = NVECPAT + NEVBLK |
| 157 | + NCFPAT = NCFPAT + NCFBLK |
| 158 | + NVECSIZPAT = NVECSIZPAT + NEVBLK*NCFTOT_i8 |
| 159 | +! |
| 160 | + END DO |
| 161 | + |
| 162 | +! ...Here eav is the average energy of the blocks where at least |
| 163 | +! one eigenstate is calculated. It is not the averge of the |
| 164 | +! total Hamiltonian. |
| 165 | + |
| 166 | + EAV = EAVSUM/NEAVSUM |
| 167 | + |
| 168 | + IF (NCFTOT /= NEAVSUM) WRITE (6, *) & |
| 169 | + 'Not all blocks are diagonalized --- Average E ', 'not correct' |
| 170 | + |
| 171 | +! ...Substrct the overal average energy |
| 172 | + EVAL(:NVECTOT) = EVAL(:NVECTOT) - EAV |
| 173 | +! |
| 174 | + CLOSE(25) |
| 175 | +! |
| 176 | + NCF = NCFTOT |
| 177 | + NVEC = NVECTOT |
| 178 | +! |
| 179 | + RETURN |
| 180 | + END SUBROUTINE GETMIXBLOCK |
0 commit comments