Adams-Bashforth method for reacting scalar time advancement

This commit is contained in:
ignis 2018-01-21 06:24:41 +09:00
parent f5b0550436
commit e16ead959d

View file

@ -30,6 +30,8 @@ module m_fdm_calc
integer, parameter :: neq = 2
logical :: fors
!===========================================================================
!===========================================================================
@ -217,6 +219,8 @@ module m_fdm_calc
return
endif
fors = .true.
allocate(u_(nx,ny,nz))
allocate(v_(nx,ny,nz))
allocate(w_(nx,ny,nz))
@ -655,6 +659,80 @@ module m_fdm_calc
return
END SUBROUTINE fns
subroutine EE1(xx,yy,zz,uu_,vv_,ww_,yy1,rhs1)
implicit none
integer :: xx,yy,zz
real*8 :: uu_(xx,yy,zz),vv_(xx,yy,zz),ww_(xx,yy,zz)
real*8 :: yy1(xx,yy,zz,neq),rhs1(xx,yy,zz,neq)
integer :: i, j, k
CALL fns(yy1,rhs1,xx,yy,zz,uu_,vv_,ww_)
yy1 = yy1 + fdmdt * rhs1
!==========rho=1 treatment
yy1(:,:,:,2) = yy1(:,:,:,2)/yy1(:,:,:,1)
yy1(:,:,:,1) = 1.
DO k = 1,zz
DO j = 1,yy
DO i = 1,xx
!==========Max Yr=1 treatment
yy1(i,j,k,2)=MIN(in_yr,yy1(i,j,k,2))
!==========Min Yr=0 treatment
! yy1(i,j,k,2)=MAX(out_yr,yy1(i,j,k,2))
ENDDO
ENDDO
ENDDO
return
END SUBROUTINE EE1
subroutine AB2(xx,yy,zz,uu_,vv_,ww_,yy1,rhs0,rhs1)
implicit none
integer :: xx,yy,zz
real*8 :: uu_(xx,yy,zz),vv_(xx,yy,zz),ww_(xx,yy,zz)
real*8 :: yy1(xx,yy,zz,neq),rhs0(xx,yy,zz,neq),rhs1(xx,yy,zz,neq)
integer :: i, j, k
CALL fns(yy1,rhs1,xx,yy,zz,uu_,vv_,ww_)
yy1 = yy1 + fdmdt * ( 1.5d0 * rhs1 - 0.5d0 * rhs0 )
rhs0 = rhs1
!==========rho=1 treatment
yy1(:,:,:,2) = yy1(:,:,:,2)/yy1(:,:,:,1)
yy1(:,:,:,1) = 1.
DO k = 1,zz
DO j = 1,yy
DO i = 1,xx
!==========Max Yr=1 treatment
yy1(i,j,k,2)=MIN(in_yr,yy1(i,j,k,2))
!==========Min Yr=0 treatment
! yy1(i,j,k,2)=MAX(out_yr,yy1(i,j,k,2))
ENDDO
ENDDO
ENDDO
return
END SUBROUTINE AB2
subroutine RK4(xx,yy,zz,uu_,vv_,ww_,yy1,yy2,yyf)
implicit none
@ -681,8 +759,14 @@ module m_fdm_calc
real*8 :: uu_(xx,yy,zz),vv_(xx,yy,zz),ww_(xx,yy,zz)
real*8 :: yy1(xx,yy,zz,neq),yy2(xx,yy,zz,neq),yyf(xx,yy,zz,neq)
CALL RK4(xx,yy,zz,uu_,vv_,ww_,yy1,yy2,yyf)
! advance reacting scalars - either Euler or Adams-Bashforth
if (fors) then
call EE1(xx,yy,zz,uu_,vv_,ww_,yy1,yy2)
fors = .false.
else
call AB2(xx,yy,zz,uu_,vv_,ww_,yy1,yy2,yyf)
yy2 = yyf
end if
return
END SUBROUTINE solve