Advertisement
Guest User

Untitled

a guest
Oct 1st, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Module global
  2.  implicit none
  3.  real, parameter :: Total_Mass=200., p=1.2, ve = 800., A=1., Cd=0.8, g =9.81, alpha=0.5
  4.  integer, parameter :: number_of_equations=3, number_of_steps=20000, itermax = 100
  5.  real :: time, del_time, time_total=20.
  6.  real, dimension(number_of_equations) :: Q
  7.  real, dimension(number_of_equations),target :: T
  8.  real, pointer :: height, velocity, mass
  9.  real :: acc, mexit, mfuel, acceleration
  10. end module global
  11.  
  12. Module ODE_Solver
  13. use global
  14. implicit none
  15. contains
  16.     subroutine RHS(time,T,rhs_value,Number_of_equations)
  17.     implicit none
  18.     integer::Number_of_equations
  19.     real:: T(Number_of_equations),RHS_value(Number_of_equations)
  20.     real:: time, C
  21.     C=(p * Cd * A)/2.
  22.        if (mass < (Total_Mass - mfuel))then
  23.          mexit = 0.
  24.        endif
  25.     rhs_value(1) = -mexit
  26.     rhs_value(2) = velocity
  27.     rhs_value(3) = ((mexit * ve) - mass * g - ((C * abs(velocity)*velocity))) / mass
  28.     acceleration = rhs_value(3)
  29. end subroutine RHS
  30.  
  31.    subroutine RKG(del_time,time,T,Q,Number_of_equations)
  32.         implicit none
  33.         integer::Number_of_equations, I, J
  34.         real:: T(Number_of_equations),Q(Number_of_equations),RHS_value(Number_of_equations),A(4),B(4),C(4),D(4)
  35.         real:: del_time, time , R1, R2
  36.         data A/0.5,0.2928932188134525, &
  37.         &  1.707106781186547,     &
  38.         &  0.1666666666666667/
  39.         data B/2.0,1.0,1.0,2.0/
  40.         data C/0.5,0.2928932188134525, &
  41.         &  1.707106781186547,0.5/
  42.         data D/0.0,0.5,0.,0.5/
  43.             do J=1,4
  44.             time =time+D(J)*del_time
  45.             call RHS(time,T,rhs_value,Number_of_equations)
  46.                 do I=1,Number_of_equations
  47.                   R1=del_time*rhs_value(I)
  48.                   R2=A(J)*(R1-B(J)*Q(I))
  49.                   T(I)=T(I)+R2
  50.                   Q(I)=Q(I)+R2*3.-C(J)*R1
  51.                 enddo
  52.             enddo
  53.         return
  54.    end subroutine RKG
  55. end Module ODE_Solver
  56.  
  57. module secant_solver
  58.      use ODE_Solver
  59.      implicit none
  60.      contains
  61.        subroutine secant(icount,mfuel_1,mfuel_2,height_1,height_ref)
  62.        implicit none
  63.        real :: mfuel_1, mfuel_2, height_1, height_2, height_ref, del_mfuel, height_max1, height_max2
  64.        integer :: icount, i
  65.             mfuel = mfuel_1
  66.             do i = 1, number_of_steps
  67.                  call RKG(del_time,time,T,Q,number_of_equations)
  68.                  if (velocity <= 0.) exit
  69.                  height_max1 = height
  70.                  write(1,*)time,height,velocity,acceleration,mass
  71.             enddo
  72.             height_1 = height_max1
  73.             mfuel = mfuel_2
  74.             height = 0.
  75.             velocity = 0.
  76.             mass = 200.
  77.             time = 0.
  78.             mexit = 3.
  79.             do i = 1, number_of_steps
  80.                  call RKG(del_time,time,T,Q,number_of_equations)
  81.                  if (velocity <= 0.) exit
  82.                  height_max2 = height
  83.                  write(2,*)time,height,velocity,acceleration,mass
  84.             enddo
  85.             height_2 = height_max2
  86.             do icount = 1, itermax
  87.                  del_mfuel = (height_ref - height_1) * (mfuel_1 - mfuel_2) / (height_1 - height_2)
  88.                  mfuel = mfuel + del_mfuel * alpha
  89.                  print*, abs(height_1-height_ref), abs(height_2-height_ref), del_mfuel
  90.                  if (abs(height_1 - height_ref) < abs(height_2 - height_ref)) then
  91.                       mfuel_2 = mfuel_1
  92.                       height_2 = height_1
  93.                  endif
  94.                  mfuel_1 = mfuel
  95.                  height = 0.
  96.                   velocity = 0.
  97.                   mass = 200.
  98.                   time = 0.
  99.                   mexit = 3.
  100.                   do i = 1, number_of_steps
  101.                        call RKG(del_time,time,T,Q,number_of_equations)
  102.                        if (velocity <= 0.) exit
  103.                        height_max1 = height
  104.                        write(3,*)time,height,velocity,acceleration,mass
  105.                  enddo
  106.                  height_1 = height_max1
  107.                  if (abs(del_mfuel) < 2.e-3) exit
  108.             enddo
  109.        RETURN
  110.        end subroutine secant
  111. end module secant_solver
  112.  
  113. program rocket
  114. use secant_solver
  115. implicit none
  116. integer :: iter
  117. real ::  mfuel_1, mfuel_2,height_1,height_ref,C
  118.      mass => T(1)
  119.      height => T(2)
  120.      velocity => T(3)
  121.      time = 0.
  122.      mexit = 3.
  123.      del_time = time_total / real(number_of_steps)
  124.      height_ref = 200.
  125.      height = 0.
  126.      velocity = 0.
  127.      mass = 200.
  128.      C = (p*Cd*A)/ 2.
  129.      acceleration =((mexit * ve) - (mass * g) - (C * abs(velocity) * velocity)) / mass
  130.      Q(:) = 0.
  131.           open(1, file='rocket.dat')
  132.           write(1,*)'Variables = "Time" "Height" "Velocity" "Acceleration" "Mass"'
  133.           write(1,*)'Zone I=', number_of_steps+1, ' Datapacking = point'
  134.           write(1,*)time,height,velocity,acceleration,mass
  135.      mfuel_1 = 25.
  136.      mfuel_2 = 35.
  137.      call secant(iter,mfuel_1,mfuel_2,height_1,height_ref)
  138.      mfuel = mfuel_1
  139. print*, time,height_1,velocity,acceleration,mass,mfuel
  140. stop
  141. end program rocket
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement