|
[Fortran] 纯文本查看 复制代码 008 | real ( 8 ) , allocatable :: mat ( : , : ) |
009 | real ( 8 ) , allocatable :: vec ( : , : ) |
010 | real ( 8 ) , allocatable :: enr ( : ) |
011 | real ( 8 ) , allocatable :: spn ( : ) |
012 | real ( 8 ) , allocatable :: mag ( : ) |
020 | use system ; implicit none |
022 | open ( 10 , file = 'read.in' , status = 'old' ) |
027 | allocate ( mat ( 0 : nst -1 , 0 : nst -1 ) ) |
028 | allocate ( vec ( 0 : nst -1 , 0 : nst -1 ) ) |
029 | allocate ( enr ( 0 : nst -1 ) ) |
030 | allocate ( spn ( 0 : nst -1 ) ) |
031 | allocate ( mag ( 0 : nst -1 ) ) |
034 | call diagonalize ( nst , mat , vec , enr ) |
037 | call transform ( nst , mat , vec , spn ) |
038 | spn ( : ) = 0.5d0 * abs ( sqrt ( 1 .d 0 +4 .d 0 * spn ( : ) ) -1 .d 0 ) |
054 | subroutine writedata ( ) |
056 | use system ; implicit none |
060 | open ( 10 , file = 'eig.dat' , status = 'unknown' ) |
062 | write ( 10 , '(i5,3f18.10)' ) i , enr ( i ) , spn ( i ) , mag ( i ) |
066 | end subroutine writedata |
070 | subroutine hamiltonian ( ) |
072 | use system ; implicit none |
080 | if ( btest ( a , i ) .eqv. btest ( a , j ) ) then |
081 | mat ( a , a ) = mat ( a , a ) +0.25d0 |
083 | mat ( a , a ) = mat ( a , a ) -0.25d0 |
085 | mat ( a , b ) = mat ( a , b ) +0.5d0 |
091 | end subroutine hamiltonian |
095 | subroutine spinsquared ( ) |
097 | use system ; implicit none |
105 | if ( btest ( a , i ) ) m = m +1 |
107 | mat ( a , a ) = dfloat ( m - nn / 2 ) * * 2 +0.5d0 * dfloat ( nn ) |
110 | if ( btest ( a , i ) .neqv. btest ( a , j ) ) then |
112 | mat ( a , b ) = mat ( a , b ) +1 .d 0 |
118 | end subroutine spinsquared |
122 | subroutine magnetization ( ) |
124 | use system ; implicit none |
127 | integer , allocatable :: mz ( : ) |
129 | allocate ( mz ( 0 : nst -1 ) ) |
133 | if ( btest ( a , i ) ) mz ( a ) = mz ( a ) +1 |
139 | mag ( a ) = mag ( a ) + mz ( b ) * vec ( b , a ) * * 2 |
142 | mag ( : ) = ( mag ( : ) - nn / 2 ) * 0.5d0 |
145 | end subroutine magnetization |
149 | subroutine diagonalize ( n , mat , vec , eig ) |
154 | real ( 8 ) :: mat ( n , n ) , vec ( n , n ) , eig ( n ) , work ( n * ( 3 + n / 2 ) ) |
157 | call dsyev ( 'V' , 'U' , n , vec , n , eig , work , n * ( 3 + n / 2 ) , info ) |
159 | end subroutine diagonalize |
163 | subroutine transform ( n , mat , vec , dia ) |
168 | real ( 8 ) :: mat ( n , n ) , vec ( n , n ) , dia ( n ) |
171 | mat = matmul ( transpose ( vec ) , mat ) |
176 | end subroutine transform |
|
|