Guest User

Untitled

a guest
Aug 29th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. PROGRAM Slow_Fourier
  2.  
  3. IMPLICIT NONE
  4.   INTEGER, PARAMETER :: nmax=20
  5. !from subroutines
  6.   DOUBLE PRECISION, DIMENSION(nmax) :: u_fct
  7.   DOUBLE PRECISION, DIMENSION(nmax) :: u_trans
  8.   DOUBLE PRECISION, DIMENSION(nmax) :: u_t_inv
  9. !index
  10.   INTEGER :: n
  11. !::::::::::Main::::::::::!
  12. CALL the_function (u_fct)
  13.  
  14. CALL fourier_transform (u_trans, u_fct)
  15.  
  16. print*, "zu Aufgabenteil a)"
  17. print*, "u_tranformiert"
  18.  
  19. DO n=1, nmax
  20.   print*, "n=", n, u_trans(n)
  21. END DO
  22.  
  23. CALL inverse_transform (u_t_inv, u_trans)
  24.  
  25. print*, "zu Aufgabenteil d)"
  26. print*, "u_t_inverse"
  27.  
  28. DO n=1, nmax
  29.   print*, "n=", n, u_t_inv(n)
  30. END DO
  31.  
  32. END PROGRAM
  33.  
  34.  
  35.  
  36. SUBROUTINE the_function(u_init) !!!!!!!!!!!HIER VLL FEHLER WEGEN n=?????
  37.   IMPLICIT NONE
  38.   INTEGER, PARAMETER :: nmax=20
  39.   DOUBLE PRECISION, DIMENSION(nmax) :: u_init
  40.   DOUBLE PRECISION, PARAMETER :: b1=4.D0
  41.   DOUBLE PRECISION, PARAMETER :: b2=2.D0
  42.   DOUBLE PRECISION, PARAMETER :: A1=8.D0
  43.   DOUBLE PRECISION, PARAMETER :: A2=5.D0
  44.   INTEGER :: k, n
  45.   DOUBLE PRECISION :: PI=ACOS(-1.D0)
  46.  
  47.     DO n=1,nmax
  48.      u_init(n)=(A1*cos(2*PI*b1*DBLE(k)/DBLE(nmax))+A2*sin(2*PI*b2*DBLE(k)/DBLE(nmax)))
  49.     END DO
  50.  
  51. END SUBROUTINE the_function
  52.  
  53.  
  54. SUBROUTINE fourier_transform (u,u_in)
  55.   IMPLICIT NONE
  56.  
  57.   COMPLEX(KIND=4) :: Uk_SUM
  58.   INTEGER, PARAMETER :: nmax=20
  59.   DOUBLE PRECISION, DIMENSION(nmax), intent(in) :: u_in
  60.   DOUBLE PRECISION :: PI=ACOS(-1.D0)
  61.   INTEGER :: k, n
  62.   DOUBLE PRECISION, DIMENSION(nmax), intent (out) :: U
  63.  
  64.   DO n=1, nmax
  65.     Uk_SUM = CMPLX (0.d0,0.d0)
  66.     DO k=0,nmax-1
  67.   !  u_in=
  68.      Uk_SUM = Uk_SUM + CMPLX(u_in(n)*cos(2.d0*PI*DBLE(k)*DBLE(n)/DBLE(nmax)),u_in(n)*sin(2*PI*DBLE(k)*DBLE(n)/DBLE(nmax)))
  69.     END DO
  70.     u(n)=(DBLE(Uk_SUM))
  71.   END DO
  72.  
  73. END SUBROUTINE fourier_transform
  74.  
  75.  
  76. SUBROUTINE inverse_transform (inv,u_in)
  77.   IMPLICIT NONE
  78.  
  79.   COMPLEX(KIND=4) :: Uk_SUM
  80.   INTEGER, PARAMETER :: nmax=20
  81.   DOUBLE PRECISION :: PI=ACOS(-1.D0)
  82.   INTEGER :: k, n
  83.   DOUBLE PRECISION, DIMENSION(nmax),intent (in) :: u_in
  84.   DOUBLE PRECISION, DIMENSION(nmax), intent (out) :: inv
  85.  
  86.   DO n=1, nmax
  87.     Uk_SUM = CMPLX (0.d0,0.d0)
  88.     DO k=0,nmax-1
  89.       Uk_SUM = Uk_SUM + CMPLX(u_in(n)*cos(2.d0*PI*DBLE(k)*DBLE(n)/DBLE(nmax)),u_in(n)*sin(-2*PI*DBLE(k)*DBLE(n)/DBLE(nmax)))
  90.     END DO
  91.     inv(n)=(DBLE(Uk_SUM))/dble(nmax)
  92.   END DO
  93.  
  94. END SUBROUTINE inverse_transform
Add Comment
Please, Sign In to add comment