Class | ae_module |
In: |
src/ae_module.f90
|
a_Int_ag : | real(8), dimension(size(ag,1)) |
ag : | real(8), dimension(:,0:), intent(in) |
————— 積分計算 ——————
function a_Int_ag(ag) real(8), dimension(:,0:), intent(in) :: ag real(8), dimension(size(ag,1)) :: a_Int_ag integer :: i if ( size(ag,2) < im ) then call MessageNotify('E','ae_Int_ag', 'The Grid points of input data too small.') elseif ( size(ag,2) > im ) then call MessageNotify('W','ae_Int_ag', 'The Grid points of input data too large.') endif a_Int_ag = 0.0d0 do i=0,im-1 a_Int_ag(:) = a_Int_ag(:) + ag(:,i)*g_X_Weight(i) enddo end function a_Int_ag
ae : | real(8), dimension(:,-km:), intent(in) |
————— 微分計算 ——————
function ae_Dx_ae(ae) ! スペクトルに作用する x 微分演算子 real(8), dimension(:,-km:), intent(in) :: ae real(8), dimension(size(ae,1),-km:km) :: ae_dx_ae integer k if ( size(ae,2) < 2*km+1 ) then call MessageNotify('W','ae_Dx_ae', 'The Fourier dimension of input data too small.') elseif ( size(ae,2) > 2*km+1 ) then call MessageNotify('W','ae_Dx_ae', 'The Fourier dimension of input data too large.') endif do k=-km,km ae_Dx_ae(:,k) = -(2*pi*k/xl)*ae(:,-k) enddo end function ae_dx_ae
i : | integer,intent(in)
| ||
k : | integer,intent(in)
| ||
xmin : | real(8),intent(in)
| ||
xmax : | real(8),intent(in)
|
————— 初期化 ——————
subroutine ae_initial(i,k,xmin,xmax) integer,intent(in) :: i ! 格子点の設定 integer,intent(in) :: k ! 切断波数の設定 real(8),intent(in) :: xmin, xmax ! X 座標範囲 integer :: ii im = i km = k xl = xmax-xmin if ( im <= 0 .or. km <= 0 ) then call MessageNotify('E','ae_initial', 'Number of grid points and waves should be positive') elseif ( mod(im,2) /= 0 ) then call MessageNotify('E','ae_initial', 'Number of grid points should be even') elseif ( km >= im/2 ) then call MessageNotify('E','ae_initial', 'KM shoud be less than IM/2') endif allocate(ti(im*2)) call fttrui(im,iti,ti) allocate(g_x(0:im-1)) do ii=0,im g_X(ii) = xmin + xl/im*ii enddo allocate(g_x_weight(0:im-1)) g_X_Weight = xl/im end subroutine ae_initial
ag_ae : | real(8), dimension(size(ae,1),0:im-1) |
ae : | real(8), dimension(:,-km:), intent(in) |
————— 基本変換 ——————
function ag_ae(ae) ! スペクトル -> 格子 real(8), dimension(:,-km:), intent(in) :: ae real(8), dimension(size(ae,1),0:im-1) :: ag_ae real(8), dimension(size(ae,1)*im) :: y integer :: m, k m=size(ae,1) if ( size(ae,2) < 2*km+1 ) then call MessageNotify('E','ag_ae', 'The Fourier dimension of input data too small.') elseif ( size(ae,2) > 2*km+1 ) then call MessageNotify('W','ag_ae', 'The Fourier dimension of input data too large.') endif ag_ae = 0.0D0 ag_ae(:,0)=ae(:,0) ag_ae(:,1)=0 do k=1,km ag_ae(:,2*k)=ae(:,k) ag_ae(:,2*k+1)=ae(:,-k) enddo ag_ae(:,2*km+2:im-1)=0 call fttrub(m,im,ag_ae,y,iti,ti) end function ag_ae