pxjoke

VMAT_kurs_18

Apr 9th, 2015
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module params
  2.  real :: L, l1, V_B(3) !Parameters
  3.  DATA V_B/3060.0, 2866.0, 1337.0/
  4.  real :: c != 0.5 * 0.000001
  5.  integer :: nofun !Starting values for QUANC8
  6.  real :: a = 1.0, b = 2.0, relerr, abserr = 0.0, result, errest, flag, tol !Starting values for QUANC8
  7.  real :: U_STATIC(11), U_DYNAMIC(11), Q_U_STATIC=0.0, Q_U_DYNAMIC=0.0 !Vectors for U and their quadratic sum
  8.  DATA U_STATIC/-1.000, 7.777, 12.017, 10.701, 5.407, -0.843, -5.159, -6.015, -3.668, 0.283, 3.829/ !Input data for U
  9.  real :: T, TOUT, Y(3), R_WORK(21) !For RKF45
  10.  integer :: IFLAG, IWORK(5), NEQN = 3 !For RKF45
  11.  real :: E1, E2, R1, R2, R3,  L3, i1, i3, U, R, fm1 = 0.0, fm_a = 0.5E-6, fm_b = 2.0E-6
  12. end module params
  13.  
  14. program kurs
  15.  use params
  16.  real :: IPVT(3), M_A(3,3), WORK(3), cond !For DECOMP and SOLVE
  17.  integer i
  18. interface
  19.  
  20.   real function for_l(x)
  21.   real x
  22.   end function for_l
  23.  
  24.   real function sub_fmin(x)
  25.   real x
  26.   end function sub_fmin
  27.  
  28.   real function for_l1(x)
  29.   real x
  30.   end function for_l1  
  31.  
  32.   subroutine diff(T1, Y1, YP)
  33.     real T1, Y1(3), YP(3)
  34.   end subroutine diff
  35.  
  36. end interface
  37.  
  38. do i = 1, 11
  39.   Q_U_STATIC = Q_U_STATIC + U_STATIC(i)**2 !Cycle to find squares of the matrix elements
  40. end do
  41.  
  42. write(*,*) "Q_U_STATIC = ", Q_U_STATIC
  43.   call QUANC8(for_l, a, b, abserr, relerr, result, errest, nofun, flag)
  44.   L = 0.4674158 * result
  45.   write(*,*) "L = ", L  
  46.  
  47.   l1 = 5.718088 * ZEROIN(0.0, 1.0, for_l1, relerr)
  48.   write(*,*) "l1 = ", l1  
  49.  
  50.   DATA M_A/53.0, 46.0, 20.0, 46.0, 50.0, 26.0, 20.0, 26.0, 17.0/
  51.  
  52.   call DECOMP(3, 3, M_A, cond, IPVT, WORK)
  53.   call SOLVE(3, 3, M_A, V_B, IPVT)    
  54.   write(*,*) "V_B = ", V_B
  55.   tol = 1.0E-08
  56.   a = 0.5 * 0.000001
  57.   b = 2.0 * 0.000001
  58.  
  59.   R = V_B(1)
  60.   R2 = V_B(2)
  61.   E1 = l1
  62.   E2 = V_B(3)
  63.   L1 = L
  64.   L3 = L
  65.   R1 = R
  66.   R3 = R  
  67.  
  68.   C = FMIN(fm_a, fm_b, sub_fmin, tol)
  69.   write(*,*) "========================="
  70.   write(*,*) "L  = ", L
  71.   write(*,*) "E1 = ", E1
  72.   write(*,*) "R  = ", R
  73.   write(*,*) "R2 = ", R2
  74.   write(*,*) "E2 = ", E2
  75.   write(*,*) "========================"
  76.   write(*,*) "FMIN = ", C
  77.  
  78.   T = 0.0
  79.   TOUT= 0.0
  80.   IFLAG = 1
  81.   RELERR = 0.1E-2
  82.   ABSERR = 0.0
  83.   Q_U_DYNAMIC = 0.0
  84.   Y(1) = E1/R1
  85.   Y(2) = 0.0
  86.   Y(3) = -(E2)
  87.   do i=1, 11  
  88.     CALL RKF45(diff,NEQN,Y,T,TOUT,RELERR, ABSERR, IFLAG, R_WORK, IWORK)    
  89.     write(*,*) "T = ", T, "IFLAG = ", IFLAG
  90.     write(*,*) "Y = ", Y
  91.     write(*,*) "----------------------------------"
  92.     TOUT = T + 0.1E-3  
  93.     fm1 = fm1 + (y(3) - U_STATIC(i))**2          
  94.   end do
  95.   write(*,*) "fm = ", sqrt(fm1)/11
  96. end program kurs
  97.  
  98. real function for_l(x)
  99. real x
  100. for_l = cos(x) / x
  101. end function for_l
  102.  
  103. real function for_l1(x)
  104. real x
  105. for_l1 = x - (0.6**x)
  106. end function for_l1
  107.  
  108. subroutine diff(T1, Y1, YP)
  109. use params
  110. real T1, Y1(3), YP(3)
  111. i1 = Y1(1)
  112. i3 = Y1(2)
  113. U  = Y1(3)
  114. YP(1) = (1 / L1) * (E1 - E2 - U + i3 * R2 - i1 * (R1 + R2))
  115. YP(2) = (1 / L3) * (E2 + U + i1 * R2 - i3 * (R2 + R3))
  116. YP(3) = (1 / C)  * (i1 - i3)
  117. end subroutine diff
  118.  
  119. real function sub_fmin(x)
  120. use params
  121.  
  122. real:: x, fm
  123.  interface
  124.     subroutine diff(T1, Y1, YP)
  125.     real T1, Y1(3), YP(3)
  126.   end subroutine diff
  127.   end interface
  128.  
  129.   T = 0.0
  130.   TOUT= 0.0
  131.   IFLAG = 1
  132.   RELERR = 0.1E-3
  133.   ABSERR = 0.0
  134.   Q_U_DYNAMIC = 0.0
  135.   Y(1) = E1/R1
  136.   Y(2) = 0.0
  137.   Y(3) = -E2
  138.   C = x
  139.   fm = 0.0
  140.   do i=1, 11
  141.     CALL RKF45(diff,NEQN,Y,T,TOUT,RELERR, ABSERR, IFLAG, R_WORK, IWORK)  
  142.     TOUT = T + 0.1E-3  
  143.     fm = fm + (y(3) - U_STATIC(i))**2          
  144.   end do
  145.   sub_fmin = fm
  146. end function sub_fmin
Advertisement
Add Comment
Please, Sign In to add comment