Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module global_vars
  2.     integer :: N = 100
  3.     real :: R = 15.0, V_0 = 4.0, a = 5.0
  4.     save
  5. end module
  6.    
  7. function V(x)
  8.     use global_vars
  9.     real :: V
  10.     real, intent(in) :: x
  11.     if (x < a) then
  12.         V = -V_0
  13.     else
  14.         V = 0
  15.     end if
  16.     return
  17. end function
  18.    
  19. function F(x, l)
  20.     use global_vars
  21.     real :: F
  22.     real, intent(in) :: l, x
  23.     F = V(x) + l * (l + 1) / (x * x)
  24.     return
  25. end function
  26.    
  27. program bcond
  28.     use global_vars
  29.     implicit none
  30.     integer :: i, j, out
  31.     real :: l, x, h, F, pi
  32.     real, dimension(:), allocatable :: mBdiag, mBoff, mDdiag_inv, work, wr, wi
  33.     real, dimension(:, :), allocatable :: mA, mV, mC, vl, vr, wavefun
  34.     !memory allocation
  35.     allocate(mBdiag(N))
  36.     allocate(mBoff(N))
  37.     allocate(mDdiag_inv(N))
  38.     allocate(work(4 * N))
  39.     allocate(wr(N))
  40.     allocate(wi(N))
  41.     allocate(mA(N, N))
  42.     allocate(mV(N, N))
  43.     allocate(mC(N, N))
  44.     allocate(vl(N, N))
  45.     allocate(vr(N, N))
  46.     allocate(wavefun(N, N))
  47.     !init variables
  48.     out = 42
  49.     l = 1.0
  50.     h = R / N
  51.     pi = 3.1415926535
  52.     do i = 1, N
  53.         x = h * i
  54.         do j = 1, N
  55.             mA(i, j) = 0.0
  56.         end do
  57.         mA(i, i) = 24.0 / h ** 2 + 10.0 * F(x, l)
  58.         !mBdiag(i) = 10.0
  59.         !mBoff(i) = 1.0
  60.         if (i > 1) then
  61.             mA(i, i - 1) = -12.0 / h ** 2 + F(x - h, l)
  62.         end if
  63.         if(i < N) then
  64.             mA(i, i + 1) = -12.0 / h ** 2 + F(x + h, l)
  65.         end if
  66.     end do
  67.     !print *, mA
  68.     !calc V and D
  69.     !D will overwrite mBdiag
  70.     !call ssteqr('I', N, mBdiag, mBoff(1:N - 1), mV, N, work, i)
  71.     do i = 1, N
  72.         do j = 1, N
  73.             mV(i, j) = sqrt(2.0 / (N + 1.0)) * sin(i * j * pi / (N + 1.0))
  74.         end do
  75.         mBdiag(i) = 10.0 + 2.0 * cos(i * pi / (N + 1.0))
  76.     end do
  77.     !calc D^(-1)
  78.     do i = 1, N
  79.         mDdiag_inv(i) = 1.0 / mBdiag(i)
  80.     end do
  81.     !calc matrix C = D^(-1) * V^(-1) * A * V
  82.     do i = 1, N
  83.         do j = 1, N
  84.             mC(i, j) = mDdiag_inv(i) * mV(j, i)
  85.         end do
  86.     end do
  87.     mC = matmul(mC, mA)
  88.     mC = matmul(mC, mV)
  89.     !calc eigenvalues and eigenvectors of C * y = lambda * y
  90.     !wr - real parts of eigenvalues
  91.     !vr - real part of eigenvectors
  92.     call sgeev('N', 'V', N, mC, N, wr, wi, vl, N, vr, N, work, 4 * N, i)
  93.     !f = V * y
  94.     wavefun = matmul(mV, vr)
  95.     !output
  96.     print *, "E:"
  97.     do i = 1, N
  98.         if(wr(i) < 0.0 .and. wr(i) > -V_0) then
  99.             print *, wr(i)
  100.         end if
  101.     end do
  102.     open(unit = out, file = "output.txt")
  103.     do i = 1, N
  104.         if(wr(i) < 0.0 .and. wr(i) > -V_0) then
  105.             do j = 1, N
  106.                 write(out, "(F15.5 F15.5)") h * j, wavefun(j, i)
  107.             end do
  108.             write(out, *) " "
  109.         end if
  110.     end do
  111.     close(out)
  112.     print *, "X"
  113.     do i = 1, N
  114.         if(wr(i) < 0.0 .and. wr(i) > -V_0) then
  115.             print *, a * sqrt(V_0 - abs(wr(i)))
  116.         end if
  117.     end do
  118. end program
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement