| 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
  |