📄 explicitscheme.f90
字号:
subroutine SchemeOne(unOne,unZero,lenX,deltX,deltT,coeff)
! The difference scheme on page 84
real unOne(lenX+1),unZero(lenX+1)
integer k
do k=2,lenX
unOne(k)=unZero(k)-deltT/(2*deltX)*unZero(k)*(unZero(k+1)-unZero(k-1)) &
+coeff*deltT/(deltX**2)*(unZero(k+1)-2*unZero(k)+unZero(k-1))
end do
unOne(1)=bounLeft(time) ! Dirichlet boundary value
unOne(lenX+1)=bounRight(time)
end subroutine SchemeOne
!===================================================================================
subroutine SchemeFour(unOne,unZero,lenX,deltX,deltT,coeff)
! The difference scheme on page 258
! Lax-Wendroff scheme
real unOne(0:lenX),unZero(0:lenX)
integer k
real :: cofFir,coeSec
cofFir=deltT/deltX
coeSec=coeff*deltT/(deltX**2)
do k=1,lenX-1
unOne(k)=unZero(k)-cofFir/2.*unZero(k)*(unZero(k+1)-unZero(k-1)) &
+(coeSec+(cofFir*unZero(k))**2/2.)*(unZero(k+1)-2*unZero(k)+unZero(k-1))
end do
unOne(0)=bounLeft(time) ! Dirichlet boundary value
unOne(lenX)=bounRight(time)
end subroutine SchemeFour
!===================================================================================
subroutine SchemeFive(unOne,unZero,lenX,deltX,deltT,coeff)
! The difference scheme on page 346(6.10.1)
! Flux splitting scheme
real unOne(0:lenX),unZero(0:lenX)
integer k
real :: cofFir,coeSec,deltU
cofFir=deltT/deltX
coeSec=coeff*deltT/(deltX**2)
do k=1,lenX-1
if(unZero(k)<0) then
deltU=cofFir*(unZero(k+1)-unZero(k))
else
deltU=cofFir*(unZero(k)-unZero(k-1))
end if
unOne(k)=unZero(k)-deltU*unZero(k)+coeSec*(unZero(k+1)-2*unZero(k)+unZero(k-1))
end do
unOne(0)=bounLeft(time) ! Dirichlet boundary value
unOne(lenX)=bounRight(time)
end subroutine SchemeFive
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -