module my_data implicit none INTEGER, ALLOCATABLE:: IAP(:), JA(:) Double precision, ALLOCATABLE:: A(:), DA(:,:), ax(:) Integer mode integer, allocatable:: start_row(:) Integer m, n Double precision s0,s1 end module my_data program dsvd_file Use my_data use omp_lib IMPLICIT NONE integer ldv, ldu, iparam(11), ipntr(11) Double precision t1 Double precision, ALLOCATABLE:: & v(:,:), u(:,:), workl(:), workd(:), & s(:,:), resid(:) logical, ALLOCATABLE:: select(:) integer, allocatable:: seed(:) ! ! %---------------% ! | Local Scalars | ! %---------------% ! CHARACTER*1000 ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 character bmat*1, which*2 integer ido, nev, ncv, lworkl, info, ierr, & accuracy, matrixseed, seedsize, each, & j, ishfts, maxitr, mode1, nconv, i, k, w, y integer maxthreads, n0, t, k1, k0, l0, l1 logical rvec Double precision tol, sigma, temp, temp2, sum0, sum1, alpha Double precision epsilon ! ! %------------% ! | Parameters | ! %------------% ! Double precision two, one, zero integer lwork parameter (two = 2.0D+0, one = 1.0D+0, zero = 0.0D+0) parameter (lwork = 2000000000) ! ! %-----------------------------% ! | BLAS & LAPACK routines used | ! %-----------------------------% ! Double precision dnrm2, dlamch external dnrm2, daxpy, dcopy, dscal, dlamch LOGICAL LSAME EXTERNAL LSAME integer irand ! ! %-----------------------% ! | Executable Statements | ! %-----------------------% ! ! %-------------------------------------------------% ! | The following include statement and assignments | ! | initiate trace output from the internal | ! | actions of ARPACK. See debug.doc in the | ! | DOCUMENTS directory for usage. Initially, the | ! | most useful information will be a breakdown of | ! | time spent in the various stages of computation | ! | given by setting msaupd = 1. | ! %-------------------------------------------------% ! include 'debug.h' ndigit = -3 logfil = 6 msgets = 0 msaitr = 0 msapps = 0 msaupd = 1 msaup2 = 0 mseigt = 0 mseupd = 0 ! ! %-------------------------------------------------% ! | The following sets dimensions for this problem. | ! %-------------------------------------------------% ! CALL GETARG(1,ARG1) CALL GETARG(2,ARG2) CALL GETARG(3,ARG3) CALL GETARG(4,ARG4) CALL GETARG(5,ARG5) CALL GETARG(6,ARG6) READ (ARG1,*) nev READ (ARG2,*) ncv WRITE (*,*) nev, ncv if (lsame(ARG3,'s')) THEN mode = 0 write (*,*) 'runnning: sparse mode' else if(lsame(ARG3,'d')) THEN mode = 1 write (*,*) 'runnning: dense mode' else write (*,*) 'error: select d[dense] or s[sparse]' end if READ (ARG4,*) accuracy tol = 10.0D0**(-accuracy) open(18,file=ARG6,status='old') READ (18,*) m READ (18,*) n READ (18,*) w ldu = m ldv = n WRITE (*,*) m, n, w ALLOCATE( s(ncv,2) ) ALLOCATE( select(ncv) ) if (.FALSE.) then read (ARG5,*) matrixseed call random_seed(size=seedsize) allocate(seed(seedsize)) DO i=1,seedsize seed(i)=matrixseed end do call random_seed(put=seed) if(mode==0) then ALLOCATE( IAP( m+1 ), JA( w ), A( w ) ) each = w / m write (*,*) 'each row has',each DO k=1,m+1 IAP(k)=1+(k-1)*each ENDDO call random_number(A(1:w)) JA(1:w)=int(A(1:w)*n)+1 call random_number(A(1:w)) else ALLOCATE( DA( n, m ) ) ALLOCATE( U(M,N), V(N,N), AX(N), RESID(N), & WORKD(N), workl(lwork) ) CALL RANDOM_NUMBER(U) CALL RANDOM_NUMBER(V) EPSILON = DLAMCH( 'Precision' ) DO I=0,N-1 ! RESID(I+1)=ONE/DBLE(I+1)**101 RESID(I+1)=(EPSILON**(DBLE(I)/DBLE(N-1)))**19 AX(I+1)=RESID(I+1) ! RESID(I+1)=(ONE-EPSILON)*(DBLE(N-1-I)/DBLE(N-1))+EPSILON ENDDO WRITE (*,*) 'CONDITION',AX(1),AX(N),AX(1)/AX(N) DO I=1,N*N J=MOD(irand(0),N)+1 K=MOD(irand(0),N)+1 TEMP=AX(J) AX(J)=AX(K) AX(K)=TEMP ENDDO INFO=0 CALL DGEQRF(M,N,U,M,WORKD,WORKl,LWORK,INFO) INFO=0 CALL DORGQR(M,N,N,U,M,WORKD,WORKl,LWORK,INFO) INFO=0 CALL DGEQRF(N,N,V,N,WORKD,WORKl,LWORK,INFO) INFO=0 CALL DORGQR(N,N,N,V,N,WORKD,WORKl,LWORK,INFO) DO I=1,N DO J=1,N V(J,I)=V(J,I)*AX(I) ENDDO ENDDO INFO=0 CALL DGEMM('N','T',N,M,N,ONE,V,N,U,M,ZERO,DA,N) DEALLOCATE (U,V,AX,RESID,WORKD,workl) end if else if(mode==0) then ALLOCATE( IAP( m+1 ), JA( w ), A( w ) ) k = 1 y = 1 IAP(k) = y sum0 = zero 998 READ (18,*, end=999) i,j,alpha IF (i+1 .NE. k) THEN if (k+1 .lt. i+1) write (*,*) 'not row full rank' DO k=k+1,i+1 IAP(k)=y enddo k = i+1 END IF JA(y)=j+1 sum0=sum0+alpha*alpha A(y)=alpha y=y+1 go to 998 999 if (k+1 .lt. m+1) write (*,*) 'not row full rank' DO k=k+1,m+1 IAP(k)=y enddo else ALLOCATE( DA( n, m ) ) sum0 = zero 1000 READ (18,*, end=1001) i,j,alpha DA(j+1,i+1)=alpha sum0=sum0+alpha*alpha go to 1000 1001 continue end if end if close(18) if(mode==0) then maxthreads=omp_get_max_threads() ALLOCATE (start_row(maxthreads+1)) n0 = w/maxthreads t=0 i=0 do while (i