Fortran 中的 Filon 正交
Filon's quadrature in fortran
我正在尝试使用 Filon 方法计算调和函数。
我的代码看起来像这样:
program function1
implicit none
real(10) :: g, a, x, b, k, s
! frequency intervals for function and her transform
real(10) :: step, dstep
! number of inervals
integer, parameter :: nmax=10
integer :: j
! function and result of her transformation
real(kind=10), dimension(0:nmax) :: f, wynik
step=0.01
dstep=0.1
!constant value for function
a=1
b=-1
s=2
open(1, file='wykresik.dat', action='write', status='replace')
! loop over all frequencies in the function
do j=0,1000
k=float(j)*step
f=-1*cos(k*s)
enddo
call filonc(step,dstep,nmax,f,wynik)
write(1,*) k, wynik
! filon subroutine call
end program function1
include 'filon.f95'
包含的子程序是用于高振荡函数的 filons 正交函数,它看起来像这样:
SUBROUTINE FILONC ( DT, DOM, NMAX, D, CHAT )
INTEGER :: NMAX
REAL(kind=10) :: DT, DOM
REAL(kind=10), dimension(0:NMAX) ::D, CHAT
REAL(kind=10) :: TMAX, OMEGA, THETA, SINTH, COSTH, CE, CO
REAL(kind=10) :: SINSQ, COSSQ, THSQ, THCUB, ALPHA, BETA, GAMMA
INTEGER TAU, NU
IF ( MOD ( NMAX, 2 ) .NE. 0 ) then
stop ' NMAX SHOULD BE EVEN '
ENDIF
TMAX = float(NMAX) * DT
DO NU = 0, NMAX
OMEGA = float(NU) * DOM
THETA = OMEGA * DT
SINTH = SIN ( THETA )
COSTH = COS ( THETA )
SINSQ = SINTH * SINTH
COSSQ = COSTH * COSTH
THSQ = THETA * THETA
THCUB = THSQ * THETA
IF ( THETA .EQ. 0.0 ) THEN
ALPHA = 0.0
BETA = 2.0 / 3.0
GAMMA = 4.0 / 3.0
ELSE
ALPHA = ( 1.0 / THCUB )* ( THSQ + THETA * SINTH * COSTH - 2.0 * SINSQ )
BETA = ( 2.0 / THCUB )* ( THETA * ( 1.0 + COSSQ ) -2.0 * SINTH * COSTH )
GAMMA = ( 4.0 / THCUB ) * ( SINTH - THETA * COSTH )
ENDIF
CE = 0.0
DO TAU = 0, NMAX, 2
CE = CE + D(TAU) * COS ( THETA * float( TAU ) )
ENDDO
CE = CE - 0.5 * ( D(0) + D(NMAX) * COS ( OMEGA * TMAX ) )
CO = 0.0
DO TAU = 1, NMAX - 1, 2
CO = CO + D(TAU) * COS ( THETA * REAL ( TAU ) )
ENDDO
CHAT(NU) = 2.0 * ( ALPHA * D(NMAX) * SIN ( OMEGA * TMAX )+ BETA * CE + GAMMA * CO ) * DT
ENDDO
ENDSUBROUTINE FILONC
我想知道,为什么在该代码中我会得到 11 个 1 k 的结果,我不知道为什么会这样工作。
这一行
write(1,*) k, wynik
写出标量 k
和整个 rank-1 数组 wynik
的值。在这两行
integer, parameter :: nmax=10
...
real(kind=10), dimension(0:nmax) :: f, wynik
wynik
被声明为有 11 个元素。
因此,自然地,程序会为 k
写出一个值,为 wynik
写出 11 个值
这看起来太明显了,我怀疑我误解了你真正要问的内容 - 在这种情况下,请尽量更清楚地了解你想知道的内容。
我正在尝试使用 Filon 方法计算调和函数。 我的代码看起来像这样:
program function1
implicit none
real(10) :: g, a, x, b, k, s
! frequency intervals for function and her transform
real(10) :: step, dstep
! number of inervals
integer, parameter :: nmax=10
integer :: j
! function and result of her transformation
real(kind=10), dimension(0:nmax) :: f, wynik
step=0.01
dstep=0.1
!constant value for function
a=1
b=-1
s=2
open(1, file='wykresik.dat', action='write', status='replace')
! loop over all frequencies in the function
do j=0,1000
k=float(j)*step
f=-1*cos(k*s)
enddo
call filonc(step,dstep,nmax,f,wynik)
write(1,*) k, wynik
! filon subroutine call
end program function1
include 'filon.f95'
包含的子程序是用于高振荡函数的 filons 正交函数,它看起来像这样:
SUBROUTINE FILONC ( DT, DOM, NMAX, D, CHAT )
INTEGER :: NMAX
REAL(kind=10) :: DT, DOM
REAL(kind=10), dimension(0:NMAX) ::D, CHAT
REAL(kind=10) :: TMAX, OMEGA, THETA, SINTH, COSTH, CE, CO
REAL(kind=10) :: SINSQ, COSSQ, THSQ, THCUB, ALPHA, BETA, GAMMA
INTEGER TAU, NU
IF ( MOD ( NMAX, 2 ) .NE. 0 ) then
stop ' NMAX SHOULD BE EVEN '
ENDIF
TMAX = float(NMAX) * DT
DO NU = 0, NMAX
OMEGA = float(NU) * DOM
THETA = OMEGA * DT
SINTH = SIN ( THETA )
COSTH = COS ( THETA )
SINSQ = SINTH * SINTH
COSSQ = COSTH * COSTH
THSQ = THETA * THETA
THCUB = THSQ * THETA
IF ( THETA .EQ. 0.0 ) THEN
ALPHA = 0.0
BETA = 2.0 / 3.0
GAMMA = 4.0 / 3.0
ELSE
ALPHA = ( 1.0 / THCUB )* ( THSQ + THETA * SINTH * COSTH - 2.0 * SINSQ )
BETA = ( 2.0 / THCUB )* ( THETA * ( 1.0 + COSSQ ) -2.0 * SINTH * COSTH )
GAMMA = ( 4.0 / THCUB ) * ( SINTH - THETA * COSTH )
ENDIF
CE = 0.0
DO TAU = 0, NMAX, 2
CE = CE + D(TAU) * COS ( THETA * float( TAU ) )
ENDDO
CE = CE - 0.5 * ( D(0) + D(NMAX) * COS ( OMEGA * TMAX ) )
CO = 0.0
DO TAU = 1, NMAX - 1, 2
CO = CO + D(TAU) * COS ( THETA * REAL ( TAU ) )
ENDDO
CHAT(NU) = 2.0 * ( ALPHA * D(NMAX) * SIN ( OMEGA * TMAX )+ BETA * CE + GAMMA * CO ) * DT
ENDDO
ENDSUBROUTINE FILONC
我想知道,为什么在该代码中我会得到 11 个 1 k 的结果,我不知道为什么会这样工作。
这一行
write(1,*) k, wynik
写出标量 k
和整个 rank-1 数组 wynik
的值。在这两行
integer, parameter :: nmax=10
...
real(kind=10), dimension(0:nmax) :: f, wynik
wynik
被声明为有 11 个元素。
因此,自然地,程序会为 k
写出一个值,为 wynik
这看起来太明显了,我怀疑我误解了你真正要问的内容 - 在这种情况下,请尽量更清楚地了解你想知道的内容。