Guest User

Untitled

a guest
Aug 31st, 2018
108
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.   COMPLEX(KIND=4), 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, nmax)
  13.  
  14. CALL fourier_transform (u_trans, u_fct, nmax)
  15.  
  16. print*,"======================================================================================"
  17. print*, "  zu Aufgabenteil a)"
  18. print*, "     u_tranformiert"
  19. print*, "      Realt.  Imagin„rt."
  20.  
  21. DO n=1, nmax
  22.   WRITE(*,FMT="(A2,I3,2(F8.3))"), "n= ", n, u_trans(n)
  23. END DO
  24. print*,"======================================================================================"
  25.  
  26.  
  27.  
  28. CALL inverse_transform (u_t_inv, u_trans, nmax)
  29.  
  30. print*,"======================================================================================"
  31. print*, "  zu Aufgabenteil d)"
  32. print*, "     u_t_inverse, u_fct"
  33.  
  34. DO n=1, nmax
  35.   WRITE(*,FMT="(A3,I3,2(F8.3))"), "n=", n, u_t_inv(n), u_fct(n)
  36. END DO
  37.  
  38. print*,"======================================================================================"
  39. END PROGRAM
  40.  
  41.  
  42.  
  43. SUBROUTINE the_function(u_init, nmax) !!!!!!!!!!!HIER VLL FEHLER WEGEN n=?????
  44.   IMPLICIT NONE
  45.   INTEGER, INTENT(IN ) :: nmax
  46.   DOUBLE PRECISION, DIMENSION(nmax) :: u_init
  47.   DOUBLE PRECISION, PARAMETER :: b1=4.D0
  48.   DOUBLE PRECISION, PARAMETER :: b2=2.D0
  49.   DOUBLE PRECISION, PARAMETER :: A1=8.D0
  50.   DOUBLE PRECISION, PARAMETER :: A2=5.D0
  51.   INTEGER :: k, n
  52.   DOUBLE PRECISION :: PI=ACOS(-1.D0)
  53.  
  54.     DO n=1,nmax
  55.      u_init(n)=(A1*COS(2*PI*b1*(DBLE(n)-1.d0)/DBLE(nmax))+A2*SIN(2*PI*b2*(DBLE(n)-1.d0)/DBLE(nmax)))
  56.     END DO
  57.  
  58. END SUBROUTINE the_function
  59.  
  60.  
  61. SUBROUTINE fourier_transform (u,u_in, nmax)
  62.   IMPLICIT NONE
  63.  
  64.   COMPLEX(KIND=4) :: Uk_SUM
  65.   INTEGER, INTENT(IN) :: nmax
  66.   DOUBLE PRECISION, DIMENSION(nmax), intent(in) :: u_in
  67.   DOUBLE PRECISION :: PI=ACOS(-1.D0)
  68.   INTEGER :: k, n
  69.   COMPLEX, DIMENSION(nmax), INTENT (out) :: U
  70.  
  71.   !cms DO n=1, nmax hier war die Aufgabenstellung irrefuehrend
  72.    DO n=0,nmax-1
  73.     Uk_SUM = CMPLX (0.d0,0.d0)
  74.     DO k=0,nmax-1
  75.   !  u_in=
  76.      Uk_SUM = Uk_SUM + CMPLX(u_in(k+1)*COS(2.d0*PI*DBLE(k)*DBLE(n)/DBLE(nmax)),u_in(k+1)*SIN(2.D0*PI*DBLE(k)*DBLE(n)/DBLE(nmax)))
  77.     END DO
  78.      U(n) = Uk_SUM
  79.   END DO
  80.  
  81. END SUBROUTINE fourier_transform
  82.  
  83.  
  84. SUBROUTINE inverse_transform (inv,u_in, nmax)
  85.   IMPLICIT NONE
  86.  
  87.   COMPLEX(KIND=4) :: Uk_SUM
  88.   INTEGER, INTENT(IN) :: nmax
  89.   DOUBLE PRECISION :: PI=ACOS(-1.D0)
  90.   INTEGER :: k, n
  91.   COMPLEX(KIND=4), DIMENSION(nmax), INTENT(IN)  :: u_in
  92.   DOUBLE PRECISION, DIMENSION(nmax), intent (out) :: inv
  93.  
  94.    DO n=1, nmax
  95.     Uk_SUM = CMPLX (0.d0,0.d0)
  96.     DO k=0,nmax-1
  97.      !cms Uk_SUM = Uk_SUM + CMPLX(-u_in(k+1)*cos(2.d0*PI*DBLE(k)*DBLE(n)/DBLE(nmax)),u_in(k+1)*sin(2.D0*PI*DBLE(k)*DBLE(n)/DBLE(nmax))) Achtung: Minus Zeichen, n-1
  98.       Uk_SUM = Uk_SUM + u_in(k)*CMPLX(COS(-2.d0*PI*DBLE(k)*DBLE(n-1)/DBLE(nmax)),SIN(-2.D0*PI*DBLE(k)*DBLE(n-1)/DBLE(nmax)))
  99.     END DO
  100.     inv(n)=(DBLE(Uk_SUM))/DBLE(nmax)
  101.   END DO
  102.  
  103. END SUBROUTINE inverse_transform
Add Comment
Please, Sign In to add comment