* PACKAGE DRUNGE    !" P \infty 近似 時間積分( 4th order Runge-Kutta Scheme )
*
*"  [HIS] 96/03/14 (takepiro) 
*
***********************************************************************
      SUBROUTINE DRUNGE
     O             ( PSI3  , ZETA3 , T3  ,
     I               PSI2  , ZETA2 , T2  , 
     I               RAYL  , PRND  , QINT,
     C               DX    , DZ    , DT  ,
     W               PSI   , ZETA  , T   , 
     W               TNDZ  , TNDT  ,
     W               AJAC  , ALAP          )
*
*"      << 4th order Runge-Kutta scheme により時間積分する >>
*"                     96/03/14 (竹広真一)
*
* [PARAM]
#include        "zcdim.F"            !" 格子点数, 波数
*
* [OUTPUT]
      REAL PSI3  ( 0:NX+1 , 0:NZ+1 ) !" 流線関数(現STEPの値)
      REAL ZETA3 ( 0:NX+1 , 0:NZ+1 ) !" 渦度(現STEPの値)
      REAL T3    ( 0:NX+1 , 0:NZ+1 ) !" 温度(現STEPの値)
*
* [INPUT]
      REAL PSI2  ( 0:NX+1 , 0:NZ+1 ) !" 流線関数(1STEP前の値)
      REAL ZETA2 ( 0:NX+1 , 0:NZ+1 ) !" 渦度(1STEP前の値)
      REAL T2    ( 0:NX+1 , 0:NZ+1 ) !" 温度(1STEP前の値)
*
      REAL PRND                 !" プラントル数(ダミー)
      REAL RAYL                 !" レイリー数
      REAL QINT                 !" 加熱率
*
      REAL DX                   !" X 軸上の格子点間隔
      REAL DZ                   !" Z 軸上の格子点間隔
      REAL DT                   !" 時間間隔
*
* [WORK]
      REAL PSI  ( 0:NX+1 , 0:NZ+1 ) !" 流線関数(仮積分用)
      REAL ZETA ( 0:NX+1 , 0:NZ+1 ) !" 渦度(仮積分用)
      REAL T    ( 0:NX+1 , 0:NZ+1 ) !" 温度(仮積分用)
      REAL TNDZ ( 0:NX+1 , 0:NZ+1 ) !" 第 1 段階での渦度の時間変化
      REAL TNDT ( 0:NX+1 , 0:NZ+1 ) !" 第 1 段階での温度の時間変化
      REAL AJAC ( 0:NX+1 , 0:NZ+1 ) !"ヤコビアン
      REAL ALAP ( 0:NX+1 , 0:NZ+1 ) !"ラプラシアン
*
*  [INTERNAL WORK]
      REAL DELT(3)              !" 仮積分用時間間隔
      REAL WEIGH(4)             !" 出力積分用時間間隔
*
      INTEGER IRUNG                !"ループカウンタ
      INTEGER IX                   !"ループカウンタ
      INTEGER IZ                   !"ループカウンタ
*
      LOGICAL OFIRST
      DATA    OFIRST  / .TRUE. /
      SAVE  OFIRST 
*
      IF( OFIRST ) THEN
         OFIRST = .FALSE.
         CALL MSGDMP('M','DRUNGE',
     &               '4TH RUNGE-KUTTA SCHEME : 96/03/14' )
         CALL MSGDMP('M','DRUNGE',
     &               '***** INFINITE PRNDTL NUMBER APPROX. *****' )
      ENDIF
*
*"         < 0. 時間制御 >
*
      DELT(1)  =  DT * 0.5
      DELT(2)  =  DT * 0.5
      DELT(3)  =  DT
*
      WEIGH(1)  =       DT / 6.
      WEIGH(2)  =  2. * DT / 6. 
      WEIGH(3)  =  2. * DT / 6. 
      WEIGH(4)  =       DT / 6. 
*
*"             出力用積分
      CALL COPY ( PSI3  , PSI2  , (NX+2)*(NZ+2) )
      CALL COPY ( ZETA3 , ZETA2 , (NX+2)*(NZ+2) )
      CALL COPY ( T3    , T2    , (NX+2)*(NZ+2) )
*
*"             仮積分
      CALL COPY ( PSI   , PSI2  , (NX+2)*(NZ+2) )
      CALL COPY ( ZETA  , ZETA2 , (NX+2)*(NZ+2) )
      CALL COPY ( T     , T2    , (NX+2)*(NZ+2) )
*
*"         < 1. 積分 >
*
      DO 1000 IRUNG = 1, 4
         CALL DEULTT            !" 温度の式の積分
     O      ( TNDT  , 
     I        PSI   , T   , 
     C        QINT  , 
     C        DX    , DZ  ,
     W        AJAC  , ALAP    )
*
         IF ( IRUNG .LT. 4 ) THEN       !" 仮積分
            DO 1100 IZ = 1, NZ 
               DO 1110 IX = 1 , NX
                  T    ( IX,IZ ) = T2( IX,IZ )
     &                 + TNDT ( IX,IZ )* DELT(IRUNG)
 1110          CONTINUE 
 1100       CONTINUE 
*
            CALL DTMP2Z        !"  温度から渦度の計算(P inf 近似)
     O            ( ZETA  , 
     I              T     , 
     C              RAYL  , 
     C              DX    , DZ    , DT  ,
     W              ALAP   )
*
             CALL DBNDR
     O            ( PSI   , 
     M              ZETA  , T   ,
     I              DX    , DZ    )
          ENDIF                         !" 仮積分ここまで
*
          DO 1200 IZ = 1, NZ            !"   出力用積分
             DO 1210 IX = 1, NX
                T3   ( IX,IZ ) = T3( IX,IZ )
     &               + TNDT ( IX,IZ ) * WEIGH(IRUNG)
 1210        CONTINUE
 1200     CONTINUE
*
 1000 CONTINUE 
*
      CALL DTMP2Z               !"  温度から渦度の計算(P inf 近似)
     O       ( ZETA3 , 
     I         T3    , 
     C         RAYL  , 
     C         DX    , DZ    , DT  ,
     W         ALAP   )
*
*"         < 2. 境界値 >
*
      CALL DBNDR
     O      ( PSI3  , 
     M        ZETA3 , T3  ,
     I        DX    , DZ    )
*
      RETURN
      END
