Class | gauss_quad |
In: |
radiation/gauss_quad.f90
|
Note that Japanese and English are described in parallel.
!$ ! RadiationFluxDennouAGCM : | 放射フラックスの計算 |
!$ ! RadiationDTempDt : | 放射フラックスによる温度変化の計算 |
!$ ! RadiationFluxOutput : | 放射フラックスの出力 |
!$ ! RadiationFinalize : | 終了処理 (モジュール内部の変数の割り付け解除) |
!$ ! ———— : | ———— |
!$ ! RadiationFluxDennouAGCM : | Calculate radiation flux |
!$ ! RadiationDTempDt : | Calculate temperature tendency with radiation flux |
!$ ! RadiationFluxOutput : | Output radiation fluxes |
!$ ! RadiationFinalize : | Termination (deallocate variables in this module) |
!$ ! NAMELIST#radiation_DennouAGCM_nml
Subroutine : | |
x1 : | real(DP), intent(in ) |
x2 : | real(DP), intent(in ) |
n : | integer , intent(in ) |
a_x(n) : | real(DP), intent(out) |
a_w(n) : | real(DP), intent(out) |
subroutine GauLeg( x1, x2, n, a_x, a_w ) real(DP), intent(in ) :: x1,x2 integer , intent(in ) :: n real(DP), intent(out) :: a_x(n) real(DP), intent(out) :: a_w(n) call GAUSS( n, a_x, a_w ) a_w = a_w * 2.0_DP ! Change integration domain from [-1,1] to [x1,x2] a_x = ( x2 - x1 ) * 0.5_DP * a_x + ( x1 + x2 ) * 0.5_DP a_w = a_w * ( x2 - x1 ) * 0.5_DP end subroutine GauLeg
Subroutine : | |||
JM : | integer, intent(in )
| ||
X(JM) : | real(DP), intent(out) | ||
W(JM) : | real(DP), intent(out) |
SUBROUTINE GAUSS(JM,X,W) !!$ IMPLICIT REAL*8(A-H,O-Z) !!$ PARAMETER(PI=3.1415926535897932385D0) integer, parameter :: NB=64 integer, intent(in ) :: JM !!$ DIMENSION X(JM),W(JM),E(NB) real(DP), intent(out) :: X(JM) real(DP), intent(out) :: W(JM) real(DP) :: E(NB) real(DP) :: EPS real(DP) :: Z real(DP) :: P0 real(DP) :: P1 real(DP) :: DPTMP real(DP) :: DZ integer :: JH integer :: IFLAG integer :: I integer :: J integer :: N JH=JM/2 EPS=1 DO I=1,NB EPS=EPS/2 E(I)=EPS+1 END DO I=0 EPS=1 10 CONTINUE I=I+1 EPS=EPS/2 IF(E(I).GT.1) GOTO 10 EPS=EPS*16 IF(MOD(JM,2).EQ.0) THEN DO J=1,JH Z=SIN(PI*(2*J-1)/(2*JM+1)) IFLAG=0 20 CONTINUE P0=0 P1=1 DO N=1,JM-1,2 P0=((2*N-1)*Z*P1-(N-1)*P0)/N P1=((2*N+1)*Z*P0-N*P1)/(N+1) END DO DPTMP=JM*(P0-Z*P1)/(1-Z*Z) DZ=P1/DPTMP Z=Z-DZ IF(IFLAG.EQ.0) THEN IF(ABS(DZ/Z).LE.EPS) THEN IFLAG=1 X(JM-JH+J)=Z END IF GOTO 20 END IF W(JM-JH+J)=1/(DPTMP*DPTMP)/(1-X(JM-JH+J)*X(JM-JH+J)) W(JH+1-J)=W(JM-JH+J) X(JH+1-J)=-X(JM-JH+J) END DO ELSE DO J=1,JH Z=SIN(PI*2*J/(2*JM+1)) IFLAG=0 30 CONTINUE P0=1 P1=Z DO N=2,JM-1,2 P0=((2*N-1)*Z*P1-(N-1)*P0)/N P1=((2*N+1)*Z*P0-N*P1)/(N+1) END DO DPTMP=JM*(P0-Z*P1)/(1-Z*Z) DZ=P1/DPTMP Z=Z-DZ IF(IFLAG.EQ.0) THEN IF(ABS(DZ/Z).LE.EPS) THEN IFLAG=1 X(JM-JH+J)=Z END IF GOTO 30 END IF W(JM-JH+J)=1/(DPTMP*DPTMP)/(1-X(JM-JH+J)*X(JM-JH+J)) W(JH+1-J)=W(JM-JH+J) X(JH+1-J)=-X(JM-JH+J) END DO P0=1 DO N=2,JM-1,2 P0=-(N-1)*P0/N END DO DPTMP=JM*P0 W(JH+1)=1/(DPTMP*DPTMP) X(JH+1)=0 END IF END SUBROUTINE GAUSS
Constant : | |||
version = ’$Name: $’ // ’$Id: gauss_quad.f90,v 1.3 2011-06-19 11:05:23 yot Exp $’ : | character(*), parameter
|