* PACKAGE DEULER    !" P \infty 近似 時間積分( Euler Scheme )
*
*"  [HIS] 96/03/14 (takepiro) 
*"        
***********************************************************************
      SUBROUTINE DEULER
     O             ( PSI3  , ZETA3 , T3  ,
     I               PSI2  , ZETA2 , T2  , 
     I               RAYL  , PRND  , QINT,
     C               DX    , DZ    , DT  ,
     W               AJAC2 , ALAP2         )
*
*"      << Euler scheme により次ステップの物理量を計算する >>
*
* [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 AJAC2 ( 0:NX+1 , 0:NZ+1 ) !"ヤコビアン
      REAL ALAP2 ( 0:NX+1 , 0:NZ+1 ) !"ラプラシアン
*
      LOGICAL OFIRST
      DATA    OFIRST  / .TRUE. /
*    
      SAVE  OFIRST 
*
      IF( OFIRST ) THEN
         OFIRST = .FALSE.
         CALL MSGDMP('M','DEULER',
     &               'EULER SCHEME TIME INTEGRATE : 96/03/14' )
         CALL MSGDMP('M','DEULER',
     &               '***** INFINITE PRNDTL NUMBER APPROX. *****' )
      ENDIF
*
*"        < 1. 内部領域の温度の計算 >
*
      CALL DEULRT
     O       ( T3    , 
     I         PSI2  , T2  , 
     C         QINT  , 
     C         DX    , DZ    , DT  ,
     W         AJAC2 , ALAP2   )
*
*"        < 2. 内部領域の渦度の計算 >
*
      CALL DTMP2Z               !"  温度から渦度の計算(P inf 近似)
     O       ( ZETA3 , 
     I         T3    , 
     C         RAYL  , 
     C         DX    , DZ    , DT  ,
     W         ALAP2   )
*
*"        < 3. 境界条件の適用と流線関数の計算 >
*
      CALL DBNDR
     O       ( PSI3 , 
     M         ZETA3, T3  ,
     I         DX   , DZ   )
*
      RETURN
      END
*****************************************************************
      SUBROUTINE DEULRT                !" Euler scheme による温度
     O             ( T3    , 
     I               PSI2  , T2  , 
     C               QINT  , 
     C               DX    , DZ    , DT  ,
     W               AJAC2 , ALAP2   )
*
* [PARAM]
#include        "zcdim.F"            !" 格子点数, 波数
*
* [OUTPUT]
      REAL T3 ( 0:NX+1 , 0:NZ+1 ) !" 温度(現STEPの値)
*
* [INPUT]
      REAL PSI2 ( 0:NX+1 , 0:NZ+1 ) !" 流線関数(1STEP前の値)
      REAL T2   ( 0:NX+1 , 0:NZ+1 ) !" 温度(1STEP前の値)
*
      REAL QINT                      !" 加熱率
      REAL DX                        !" X 軸上の格子点間隔
      REAL DZ                        !" Z 軸上の格子点間隔
      REAL DT                        !" 時間間隔
*
* [WORK]
      REAL AJAC2 ( 0:NX+1,0:NZ+1 ) !" ヤコビアン
      REAL ALAP2 ( 0:NX+1,0:NZ+1 ) !" ラプラシアン
*
*  [INTERNAL WORK]
      INTEGER IX                   !" ループカウンタ
      INTEGER IZ                   !" ループカウンタ
*
*"        < 1. 温度の時間変化の計算 >
*
      CALL DEULTT
     O         ( T3    , 
     I           PSI2  , T2  , 
     C           QINT  , 
     C           DX    , DZ  , 
     W           AJAC2 , ALAP2   )
*
*"        < 3. 各グリッドの温度の値の計算 >
*
      DO 3020 IX = 1 , NX
        DO 3010 IZ = 1 , NZ
              T3(IX,IZ)
     &    =   T2(IX,IZ) + DT * T3( IX, IZ )
 3010   CONTINUE
 3020 CONTINUE
*
      RETURN
      END
*****************************************************************
      SUBROUTINE DEULTT        !" Euler scheme による温度の時間変化
     O             ( TNDT  , 
     I               PSI   , T    , 
     C               QINT  , 
     C               DX    , DZ   ,
     W               AJAC  , ALAP  )
*
* [PARAM]
#include        "zcdim.F"            !" 格子点数, 波数
*
* [OUTPUT]
      REAL TNDT  ( 0:NX+1 , 0:NZ+1 ) !" 温度の時間変化
*
* [INPUT]
      REAL PSI   ( 0:NX+1 , 0:NZ+1 ) !" 流線関数(1STEP前の値)
      REAL T     ( 0:NX+1 , 0:NZ+1 ) !" 温度(1STEP前の値)
*
      REAL QINT                      !" 加熱率
      REAL DX                        !" X 軸上の格子点間隔
      REAL DZ                        !" Z 軸上の格子点間隔
*
*  [WORK]
      REAL AJAC  ( 0:NX+1,0:NZ+1 )   !" ヤコビアン
      REAL ALAP  ( 0:NX+1,0:NZ+1 )   !" ラプラシアン
*
*  [INTERNAL WORK]
      INTEGER IX                   !" ループカウンタ
      INTEGER IZ                   !" ループカウンタ
*
*"        < 1. ヤコビアンの計算 >
*
      CALL DARJAC
     O       ( AJAC ,
     I         PSI  , T   ,
     C         DX   , DZ   )
*
*"        < 2. ラプラシアンの計算 >
*
      CALL DLAPLA
     O       ( ALAP ,
     I         T    ,
     C         DX   , DZ   )
*
*"        < 3. 各グリッドの温度の値の計算 >
*
      DO 3020 IX = 1 , NX
        DO 3010 IZ = 1 , NZ
           TNDT(IX,IZ)
     &          =  AJAC(IX,IZ) + ALAP(IX,IZ) + QINT 
 3010   CONTINUE
 3020 CONTINUE
*
      RETURN
      END
