trlaux.f90

来自「用于计算矩阵的特征值,及矩阵的其他运算.可以用与稀疏矩阵」· F90 代码 · 共 508 行 · 第 1/2 页

F90
508
字号
     Call op(nrow, 1, v1(1:nrow,i), nrow, aq, nrow)     If (i.Lt.mv1) Then        Do ii = 1, nrow           alf(i) = alf(i) + aq(ii) * v1(ii,i)           aq(ii) = aq(ii) - alpha(i)*v1(ii,i) - beta(i-1)*v1(ii,i-1)           bet(i) = bet(i) + aq(ii) * aq(ii)           cs(i)  = cs(i)  + aq(ii) * v1(ii, i+1)           aq(ii) = aq(ii) - beta(i) * v1(ii, i+1)           wrk(i) = wrk(i) + aq(ii) * aq(ii)        End Do     Else        Do ii = 1, nrow           alf(i) = alf(i) + aq(ii) * v1(ii,i)           aq(ii) = aq(ii) - alpha(i)*v1(ii,i) - beta(i-1)*v1(ii,i-1)           bet(i) = bet(i) + aq(ii) * aq(ii)           cs(i)  = cs(i)  + aq(ii) * v2(ii,1)           aq(ii) = aq(ii) - beta(i) * v2(ii,1)           wrk(i) = wrk(i) + aq(ii) * aq(ii)        End Do     End If  End Do  Do i = Max(1, kept-j1+2), j2     j = i + j1     Call op(nrow, 1, v2(1,i), nrow, aq, nrow)     If (i.Gt.1) Then        Do ii = 1, nrow           alf(j) = alf(j) + aq(ii) * v2(ii,i)           aq(ii) = aq(ii) - beta(j-1)*v2(ii,i-1) - alpha(j)&                &*v2(ii,i)           bet(j) = bet(j) + aq(ii) * aq(ii)           cs(j)  = cs(j)  + aq(ii) * v2(ii,i+1)           aq(ii) = aq(ii) - beta(j) * v2(ii,i+1)           wrk(j) = wrk(j) + aq(ii) * aq(ii)        End Do     Else        Do ii = 1, nrow           alf(j) = alf(j) + aq(ii) * v2(ii,1)           aq(ii) = aq(ii) - beta(j-1)*v1(ii,j1) - alpha(j)*v2(ii,1)           bet(j) = bet(j) + aq(ii) * aq(ii)           cs(j)  = cs(j)  + aq(ii) * v2(ii,2)           aq(ii) = aq(ii) - beta(j) * v2(ii,2)           wrk(j) = wrk(j) + aq(ii) * aq(ii)        End Do     End If  End Do  !  Call trl_g_sum(info%mpicom, jnd*4, wrk, wrk(jnd*4+1))  aq(1) = Sqrt(Sum(wrk(1:jnd)))  wrk(1:jnd) = Sqrt(wrk(1:jnd))  Do ii =1, jnd     If (bet(ii) .Gt. zero) Then        bet(ii) = Sign(Sqrt(bet(ii)), beta(ii))        cs(ii) = cs(ii) / bet(ii)     Else        bet(ii) = zero     End If  End Do  title = 'Alpha computed by TRLAN ..'  Call trl_print_real(info, title, alpha(1:jnd))  title = 'Alpha computed explicitly in TRL_CHECK_RECURRENCE ..'  Call trl_print_real(info, title, alf)  title = 'Differences in alpha ..'  alf = alf - alpha(1:jnd)  Call trl_print_real(info, title, alf)  title = 'Beta computed by TRLAN ..'  Call trl_print_real(info, title, beta(1:jnd))  title = 'Beta computed explicitly in TRL_CHECK_RECURRENCE ..'  Call trl_print_real(info, title, bet)  title = 'Differences in beta ..'  bet = bet - beta(1:jnd)  Call trl_print_real(info, title, bet)  title = 'Error in Lanczos recurrence (overall) ='  Call trl_print_real(info, title, aq(1:1))  If (info%verbose.Gt.7) Then     title = '|| A q_i - alpha_i q_i - beta_{i-1} q_{i-1} - beta_i q_{i&          &+1} ||..'     Call trl_print_real(info, title, wrk(1:jnd))     title = '(A q_i - alpha_i q_i - beta_{i-1} q_{i-1})*q_{i+1}/beta_i ..'     Call trl_print_real(info, title, cs(1:jnd))     title = 'Sine of the angles ..'     cs = cs*cs     Do ii = 1, jnd        If (cs(ii) .Lt. one) Then           cs(ii) = Sqrt(one - cs(ii))        Else           cs(ii) = -one        End If     End Do     Call trl_print_real(info, title, cs(1:jnd))  End If  If (lwrk.Lt.jnd*4+nrow) Deallocate(aq)End Subroutine trl_check_recurrence!!!! write a check-point file!!!Subroutine trl_write_checkpoint(cp_io, filename, nrow, alpha, beta,&     & evec, lde, me, base, ldb, nb, ierr)  Implicit None  Character(*), Intent(in) :: filename  Integer, Intent(in) :: cp_io, nrow, ldb, lde, me, nb  Real(8), Intent(in) :: alpha(me+nb-1), beta(me+nb-1)  Real(8), Intent(in) :: evec(lde,me), base(ldb,nb)  Integer, Intent(out) :: ierr  ! local variables  Integer :: jnd, i  !  ierr = 0  jnd = me + nb - 1  Open(cp_io, file=filename, form='UNFORMATTED', position='REWIND',&       & status='REPLACE', action='WRITE', iostat=ierr)  If (ierr.Ne.0) Then     Print *, 'TRL_WRITE_CHECKPOINT: failed to open file: ',&          & Trim(filename), '(', ierr, ')'     ierr = -221     Return  End If  Write(cp_io, err=100) nrow, jnd  Write(cp_io, err=100) alpha(1:jnd)  Write(cp_io, err=100) beta(1:jnd)  Do i = 1, me     Write(cp_io, err=100) evec(1:nrow,i)  End Do  Do i = 1, nb     Write(cp_io, err=100) base(1:nrow,i)  End Do  Close(cp_io, err=200)  Return  ! handling write error100 ierr = -222  Close(cp_io, err=200)  Return  ! handle close error -- do nothing200 If (ierr .Eq. 0) ierr = -223  ReturnEnd Subroutine trl_write_checkpoint!!!! read check-point file!!!Subroutine trl_read_checkpoint(cp_io, filename, nrow, evec, lde, mev,&     & j1, base, ldb, nbas, j2, alpha, beta, ierr)  Implicit None  Character(*), Intent(in) :: filename  Integer, Intent(in) :: cp_io, nrow, lde, mev, ldb, nbas  Integer, Intent(out) :: j1, j2, ierr  Real(8), Intent(out) :: alpha(mev+nbas-1), beta(mev+nbas-1)  Real(8), Intent(out) :: base(ldb,nbas), evec(lde,mev)  ! local variables  Integer :: i  ! array size parameters  If (lde.Ge.nrow .And. ldb.Ge.nrow) Then     ierr = 0  Else     Print *, 'TRL_READ_CHECKPOINT: leading dimensions too small.'     ierr = -211     Return  End If  ! open file  Open(cp_io, file=filename, status='OLD', action='READ',&       & form='UNFORMATTED', position='REWIND', iostat=ierr)  If (ierr.Ne.0) Then     Print *, 'TRL_READ_CHECKPOINT: failed to open check-point file ',&          & Trim(filename), ' (', ierr, ')'     ierr = -212     Return  End If  ! read size information  Read(cp_io, err=100) j1, j2  If (j1 .Ne. nrow) Then     Print *, 'TRL_READ_CHECKPOINT: Nrow mismatch.'     ierr = -213     Return  End If  If (j2 .Gt. Min(Size(alpha), Size(beta), mev+nbas-1)) Then     Print *, 'TRL_READ_CHECKPOINT: MAXLAN too small.'     ierr = -214     Return  End If  ! can continue read all data  Read(cp_io, err=100) alpha(1:j2)  Read(cp_io, err=100) beta(1:j2)  j1 = Min(mev, j2)  j2 = j2 - j1  If (j1 .Lt. mev) Then     Do i = 1, j1+1        Read(cp_io, err=100) evec(1:nrow,i)     End Do  Else     Do i = 1, j1        Read(cp_io, err=100) evec(1:nrow, i)     End Do     Do i = 1, j2+1        Read(cp_io, err=100) base(1:nrow, i)     End Do  End If  Close(cp_io, err=200)  Return  ! handle read error100 ierr = -215  Close(cp_io, err=200)  Return  ! handle close error200 If (ierr.Eq.0) ierr = -216  ReturnEnd Subroutine trl_read_checkpoint!!!! a function to generate file name from a base name and the PE number!! the resulting filename is limited to 132 character long.  The! processor number takes four spaces!!!Function trl_pe_filename(base, my_rank, npe) Result(filename)  Implicit None  Integer, Intent(in) :: my_rank, npe  Character(*), Intent(in) :: base  Character(132) :: filename  Character(8) :: fmtint  !! local variable  Integer :: lead, ndig  ndig = 1  lead = npe  Do While (lead .Gt. 9)     lead = lead / 10     ndig = ndig + 1  End Do  lead = Min(133-ndig, Index(base, ' '))  filename = base(1:lead-1)  If (ndig.Gt.0 .And. ndig.Lt.10) Then     Write(fmtint, FMT=100) ndig, ndig  Else If (ndig.Ge.10 .And. ndig.Lt.100) Then     Write (fmtint, FMT=200) ndig, ndig  Else     Stop 'TRL_PE_FILENAME: to many PEs'  End If  Write(filename(lead:), FMT=fmtint) my_rank100 Format('(I', I1, '.', I1,')')200 Format('(I', I2, '.', I2,')')End Function trl_pe_filename!!!! print the current date and time!!!Subroutine trl_time_stamp(iou)  Implicit None  Integer, Intent(in) :: iou  ! local variables  Character*(10) :: date, time, zone  !  Call Date_and_time(date, time, zone)  ! F90 intrinsic function100 Format(T40, A5, '/', A2, '/', A2, 1X, A2, ':', A2, ':', A6,&         & ' (', A3, ':', A2, ')')  Write (iou, 100) date(1:4), date(5:6), date(7:8), time(1:2),&       & time(3:4), time(5:10), zone(1:3), zone(4:5)  ReturnEnd Subroutine trl_time_stamp

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?