Skip to content
Snippets Groups Projects
fft_tools.f90 4.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • !MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
    !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
    !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
    !MNH_LIC for details. version 1.
    !-----------------------------------------------------------------
    ! Creation: 22/05/2023
    !  codes comes from flat_inv.f90 and flat_invz.f90 (deduplication of code)
    !-----------------------------------------------------------------
    !      ##############
    MODULE MODE_FFT_TOOLS
    !      ##############
    
      IMPLICIT NONE
    
      CONTAINS
    
      SUBROUTINE FAST_TRANSPOSE( PX, PXT, KNI, KNJ, KNK )
        INTEGER,                      INTENT(IN)  :: KNI, KNJ, KNK ! 3D dimension of X and XT
        REAL, DIMENSION(KNI*KNJ,KNK), INTENT(IN)  :: PX
        REAL, DIMENSION(KNJ*KNI,KNK), INTENT(OUT) :: PXT
    
        INTEGER :: IJI,II,IJ,IIJ ! index in array X and XT
        INTEGER :: JK
    
        !$acc data present( PX, PXT )
    
        !$acc kernels
        DO JK=1,KNK
           ! PERMUTATION(PX,PXT)
           !CDIR NODEP
           !OCL NOVREC
           DO IJI = 1, KNJ*KNI
              ! I,J Indice in XT array from linearised index IJI
              II   = 1 +    (IJI-1)/KNJ
              IJ   = IJI - (II-1)*KNJ
              ! linearised index in X
              IIJ = II + (IJ-1)*KNI
              ! transposition
              PXT(IJI,JK) = PX(IIJ,JK)
    
           END DO
        END DO
        !$acc end kernels
    
        !$acc end data
    
      END SUBROUTINE FAST_TRANSPOSE
    
    
      SUBROUTINE FAST_SUBSTITUTION_3D( PBAND_YR, PBETX, PPBF, PGAM, PPCF, PAF, PBAND_Y, KIY, KJY, KKB, KKE, KKU )
        INTEGER,                      INTENT(IN)  :: KIY, KJY, KKB, KKE, KKU
        REAL, DIMENSION (KIY*KJY,KKU),INTENT(OUT) :: PBAND_YR, PGAM
        REAL, DIMENSION (KIY*KJY,KKU),INTENT(IN)  :: PBAND_Y, PPBF, PAF
        REAL, DIMENSION (KIY*KJY),    INTENT(OUT) :: PBETX
        REAL, DIMENSION (KKU),        INTENT(IN)  :: PPCF
    
        INTEGER :: JK
    
        !$acc data present( PBAND_YR, PGAM, PBAND_Y, PPBF, PAF, PBETX, PPCF )
    
        !$acc kernels
        !
        !       initialization
        !
        PBAND_YR = 0.0
        PBETX(:) = PPBF(:,KKB-1)
        PBAND_YR(:,KKB-1) = PBAND_Y(:,KKB-1)  &
                                              / PBETX(:)
        PGAM(:,1:KKB-1) = 0.
        !
        !        decomposition and forward substitution
        !
        DO JK = KKB,KKE+1
          PGAM(:,JK) = PPCF(JK-1) / PBETX(:)
        !
          PBETX(:) = PPBF(:,JK) -              &
                         PAF(:,JK)*PGAM(:,JK)
        !
          PBAND_YR(:,JK) = ( PBAND_Y(:,JK) -  &
               PAF(:,JK)*PBAND_YR(:,JK- 1) )  &
                                        /PBETX(:)
        !
        END DO
        !
        !       backsubstitution
        !
        DO JK = KKE,KKB-1,-1
          PBAND_YR(:,JK) = PBAND_YR(:,JK) -    &
                  PGAM(:,JK+1)*PBAND_YR(:,JK+1)
        END DO
        !$acc end kernels
    
        !$acc end data
    
      END SUBROUTINE FAST_SUBSTITUTION_3D
    
    
      SUBROUTINE FAST_SUBSTITUTION_2D( PBAND_YR, PBETX, PPBF, PGAM, PPCF, PAF, PBAND_Y, KIY, KJY, KKB, KKE, KKU )
        INTEGER,                      INTENT(IN)    :: KIY, KJY, KKB, KKE, KKU
        REAL, DIMENSION(KIY,KJY,KKU), INTENT(OUT)   :: PBAND_YR
        REAL, DIMENSION(KIY,KJY,KKU), INTENT(IN)    :: PBAND_Y
        REAL, DIMENSION(KIY,KJY,KKU), INTENT(IN)    :: PPBF
        REAL, DIMENSION(KIY,KJY,KKU), INTENT(INOUT) :: PGAM
        REAL, DIMENSION(KIY,KJY,KKU), INTENT(IN)    :: PAF
        REAL, DIMENSION(KIY,KJY),     INTENT(INOUT) :: PBETX
        REAL, DIMENSION(KKU),         INTENT(IN)    :: PPCF
    
        INTEGER :: JK
    
        !$acc data present( PBAND_YR, PGAM, PBAND_Y, PPBF, PAF, PBETX, PPCF )
    
        !$acc kernels
        !
        !       initialization
        !
        PBAND_YR = 0.0
        PBETX(:,1) = PPBF(:,1,KKB-1)
        PBAND_YR(:,1,KKB-1) = PBAND_Y(:,1,KKB-1)  &
                                             / PBETX(:,1)
        !
        !        decomposition and forward substitution
        !
        DO JK = KKB,KKE+1
          PGAM(:,1,JK) = PPCF(JK-1) / PBETX(:,1)
        !
          PBETX(:,1) = PPBF(:,1,JK) -              &
                         PAF(:,1,JK)*PGAM(:,1,JK)
        !
          PBAND_YR(:,1,JK) = ( PBAND_Y(:,1,JK) -  &
               PAF(:,1,JK)*PBAND_YR(:,1,JK- 1) )  &
                                        /PBETX(:,1)
        !
        END DO
        !
        !       backsubstitution
        !
        DO JK = KKE,KKB-1,-1
          PBAND_YR(:,1,JK) = PBAND_YR(:,1,JK) -    &
                  PGAM(:,1,JK+1)*PBAND_YR(:,1,JK+1)
        END DO
        !$acc end kernels
    
        !$acc end data
    
      END SUBROUTINE FAST_SUBSTITUTION_2D
    
    
      SUBROUTINE FAST_SPREAD( PTAB1D, PTAB3D, KIY, KJY, KKU )
        INTEGER,                      INTENT(IN)  :: KIY, KJY, KKU
        REAL, DIMENSION(KKU),         INTENT(IN)  :: PTAB1D
        REAL, DIMENSION(KIY*KJY,KKU), INTENT(OUT) :: PTAB3D
    
        INTEGER :: JIJ,JK
    
        !$acc data present( PTAB1D, PTAB3D )
    
        !$acc kernels
        DO JK=1,KKU
           DO JIJ=1,KIY*KJY
              PTAB3D(JIJ,JK) = PTAB1D(JK)
           END DO
        END DO
        !$acc end kernels
    
        !$acc end data
    
      END SUBROUTINE FAST_SPREAD
    
    END MODULE MODE_FFT_TOOLS