|
|
发表于 2007-5-22 08:00:23
|
显示全部楼层
求runge-kutta 法程序,多谢
C ***************************************************************
SUBROUTINE RK3TVD_ONE_STEP(T,DT,X,M,F,RHS,TMP)
EXTERNAL F
DIMENSION X(M),RHS(M),TMP(M)
PARAMETER(C13=1.0/3.0,C23=2.0/3.0)
TT = T
CALL F(TT,X,M,RHS)
TMP = X
X = X + DT*RHS
TT = T + DT
CALL F(TT,X,M,RHS)
X = 0.75*TMP + 0.25*(X+DT*RHS)
CALL F(TT,X,M,RHS)
X = C13*TMP + C23*(X + DT*RHS)
T = T + DT
RETURN
END
C ***************************************************************
SUBROUTINE RK3_ONE_STEP(T,DT,X,M,F,RHS,TMP,TMP1)
EXTERNAL F
DIMENSION X(M),RHS(M),TMP(M),TMP1(M)
PARAMETER(C13=1.0/3.0,C23=2.0/3.0)
TT = T
CALL F(TT,X,M,RHS)
TMP = X
X = X + C13*DT*RHS
TMP1 = X
TT = T + C13*DT
CALL F(TT,X,M,RHS)
X = TMP + C23*DT*RHS
TT = T + C23*DT
CALL F(TT,X,M,RHS)
X = 0.25*(TMP+3.0*TMP1)+0.75*DT*RHS
T = T + DT
RETURN
END
C ***************************************************************
SUBROUTINE RKJameson_ONE_STEP(T,DT,X,M,F,RHS,TMP)
EXTERNAL F
DIMENSION X(M),RHS(M),TMP(M)
PARAMETER(C13=1.0/3.0)
TT = T
CALL F(TT,X,M,RHS)
TMP = X
X = X + C13*DT*RHS
TT = T + C13*DT
CALL F(TT,X,M,RHS)
X = TMP + 0.5*DT*RHS
TT = T + 0.5*DT
CALL F(TT,X,M,RHS)
X = TMP + DT*RHS
T = T + DT
RETURN
END
C ***************************************************************
SUBROUTINE RKELiu_ONE_STEP(T,DT,X,M,F,RHS,TMP)
EXTERNAL F
DIMENSION X(M),RHS(M),TMP(M)
TT = T
CALL F(TT,X,M,RHS)
TMP = X
X = X + 0.5*DT*RHS
TT = T + 0.5*DT
CALL F(TT,X,M,RHS)
X = TMP + 0.5*DT*RHS
CALL F(TT,X,M,RHS)
X = TMP + DT*RHS
T = T + DT
RETURN
END
[br][br][以下内容由 caiqd 在 2007年05月22日 08:04am 时添加] [br]
程序很简单,分别是TVD-RK, 三阶RK,Jameson的RK,以及鄂维南和刘健国提出的三阶RK。都是积分一步,需要提供子程序F(T,X,M,RHS),T是时间,M为常微分方程的阶数,X是当前函数值,RHS是方程右端项。 |
|