「Subroutine callspecgen(Annode,x,y,Eg,generation)」:修訂間差異
跳至導覽
跳至搜尋
已建立頁面,內容為 "$usespecgen" |
無編輯摘要 |
||
| 第1行: | 第1行: | ||
$usespecgen | |||
This subroutine is activated by [[$usespecgen]]. Below is an example. Users are free to change the code except the global variables and subroutine interface. This | |||
subroutine is saved in libspecgen.f90 <br> | |||
module specgenmod | |||
use nrtype | |||
integer(i8b) :: specgen_Nregion | |||
integer(i8b),allocatable :: specgen_type(:) | |||
real(dp),allocatable :: specgen_xc(:),specgen_sgx(:) | |||
real(dp),allocatable :: specgen_yc(:),specgen_sgy(:) | |||
real(dp),allocatable :: specgen_A(:),specgen_B(:) | |||
logical :: ifspecgen=.false. | |||
end module | |||
subroutine callspecgen(Annode,x,y,Eg,generation) | |||
use nrtype | |||
use global2d | |||
use specgenmod | |||
implicit none | |||
integer(i8b), intent(in) :: Annode | |||
real(dp) , intent(inout) :: x(Annode),y(Annode),eg(Annode),generation(Annode) | |||
real(dp) :: totalgen | |||
integer :: i,j | |||
do i=1,Annode | |||
totalgen=0.0_dp | |||
do j=1,specgen_Nregion | |||
if(specgen_type(j)==1) then | |||
totalgen=totalgen+specgen_A(j)*exp(-(x(i)-specgen_xc(j))**2/(2*specgen_sgx(j)**2)) & | |||
*specgen_B(j) *exp(-(y(i)-specgen_yc(j))**2/(2*specgen_sgy(j)**2)) | |||
! print*,totalgen,j,specgen_xc(j),specgen_xy(j),specgen_xgy(j),specgen_sgx(j) | |||
elseif(specgen_type(j)==2) then | |||
totalgen=totalgen+specgen_A(j)*exp(-(x(i)-specgen_xc(j))**2/(specgen_sgx(j)**2)) & | |||
*specgen_B(j)*((y(i)-specgen_yc(j))**2)*exp(-abs(y(i)-specgen_yc(j))/(specgen_sgy(j))) | |||
elseif(specgen_type(j)==3) then | |||
totalgen=totalgen+specgen_A(j)*exp(-(y(i)-specgen_yc(j))**2/(specgen_sgy(j)**2)) & | |||
*specgen_B(j)*((x(i)-specgen_xc(j))**2)*exp(-abs(x(i)-specgen_xc(j))/(specgen_sgx(j))) | |||
end if | |||
end do | |||
generation(i)=generation(i)+totalgen | |||
end do | |||
end subroutine | |||
於 2017年8月27日 (日) 15:14 的最新修訂
This subroutine is activated by $usespecgen. Below is an example. Users are free to change the code except the global variables and subroutine interface. This
subroutine is saved in libspecgen.f90
module specgenmod use nrtype integer(i8b) :: specgen_Nregion integer(i8b),allocatable :: specgen_type(:) real(dp),allocatable :: specgen_xc(:),specgen_sgx(:) real(dp),allocatable :: specgen_yc(:),specgen_sgy(:) real(dp),allocatable :: specgen_A(:),specgen_B(:) logical :: ifspecgen=.false. end module
subroutine callspecgen(Annode,x,y,Eg,generation)
use nrtype
use global2d
use specgenmod
implicit none
integer(i8b), intent(in) :: Annode
real(dp) , intent(inout) :: x(Annode),y(Annode),eg(Annode),generation(Annode)
real(dp) :: totalgen
integer :: i,j
do i=1,Annode
totalgen=0.0_dp
do j=1,specgen_Nregion
if(specgen_type(j)==1) then
totalgen=totalgen+specgen_A(j)*exp(-(x(i)-specgen_xc(j))**2/(2*specgen_sgx(j)**2)) &
*specgen_B(j) *exp(-(y(i)-specgen_yc(j))**2/(2*specgen_sgy(j)**2))
! print*,totalgen,j,specgen_xc(j),specgen_xy(j),specgen_xgy(j),specgen_sgx(j)
elseif(specgen_type(j)==2) then
totalgen=totalgen+specgen_A(j)*exp(-(x(i)-specgen_xc(j))**2/(specgen_sgx(j)**2)) &
*specgen_B(j)*((y(i)-specgen_yc(j))**2)*exp(-abs(y(i)-specgen_yc(j))/(specgen_sgy(j)))
elseif(specgen_type(j)==3) then
totalgen=totalgen+specgen_A(j)*exp(-(y(i)-specgen_yc(j))**2/(specgen_sgy(j)**2)) &
*specgen_B(j)*((x(i)-specgen_xc(j))**2)*exp(-abs(x(i)-specgen_xc(j))/(specgen_sgx(j)))
end if
end do
generation(i)=generation(i)+totalgen
end do
end subroutine