*"    三次元配列、第二次元のフーリエ変換 ISN=+1, 逆変換 ISN=-1
*"    FTPACK (石岡ルーチン) 利用. 
*"    初期化をするときは、LINIT=.TRUE. 
***********************************************************************
      SUBROUTINE AFFTRU
     M      ( X, 
     W        Y,
     C        T, IT, 
     I        N1, N2, L2, N3, ISN, LINIT )

      IMPLICIT  REAL   ( A-H,O-Z )
*  [MODIFY]
      DIMENSION  X(N1,N2,N3)
*  [WORK]
      DIMENSION  Y(N1*N2)
*  [CONST]
      DIMENSION  T(2*N2)  !" このルーチンの外でみだりに使ってはならない
      INTEGER    IT(5)    !" このルーチンの外でみだりに使ってはならない
*  [INPUT]
      LOGICAL    LINIT  
      INTEGER    N1, N2, L2, N3, ISN

      N = N2 / 2
      L = L2 / 2
      IF (MOD(L2,2).NE.0) CALL MSGDMP('E','AFFTRU','L2 MUST BE EVEN')
 
      IF( LINIT ) THEN
        CALL FTRUPR( N ,IT , T )
      ENDIF

      DO 10 J=1,N3
        CALL FTRUMN( X(1,1,J) , Y , N1 , N , L , IT , T , ISN )
   10 CONTINUE

      RETURN
      END
***********************************************************************
*"    三次元配列、第二次元：フーリエ係数 --> スペクトル
*"    X(?,J,?) の J=1,L2/2 にスペクトルを格納.
*"    定数部分は X(?,L2/2+1,?）に移動
*
      SUBROUTINE F2SPRU
     M       ( X, 
     W         Y, 
     I         N1, N2, L2, N3 )
*
      IMPLICIT  REAL ( A-H,O-Z )
*  [MODIFY]
      DIMENSION  X(N1,N2,N3)
*  [WORK]
      DIMENSION  Y(N1,N2/1+1)
*  [INPUT]
      INTEGER    N1, N2, L2, N3
*
      DO 100 K=1,N3
      DO 100 I=1,N1
        DO 20 J=1,L2/2-1
          Y(I,J) = SQRT( X(I, 2*J+1, K)**2 + X(I, 2*J+2, K)**2 )
   20   CONTINUE
        J=L2/2
        IF(L2.EQ.N2)  THEN
          Y(I,J) = ABS( X(I,2,K) )
        ELSE
          Y(I,J) = SQRT( X(I, 2*J+1, K)**2 + X(I, 2*J+2, K)**2 )
        ENDIF          
        Y(I,L2/2+1) = X(I,1,K)
        DO 70 J=1,L2/2+1
          X(I,J,K) = Y(I,J)
   70   CONTINUE
  100 CONTINUE
*
      RETURN
      END
