get_legendre_assets.F90 Source File


Source Code

SUBROUTINE GET_LEGENDRE_ASSETS(KRETURNCODE, NLAT, KTRUNC, KSPOLEGL, KLOEN, KNUMMAXRESOL, &
  &                            KNMENG, PGW, PRPNM)
! ** PURPOSE
!    Simplified wrapper to TRANS_INQ for obtaining arrays necessary for performing Legendre transform
!    (Gaussian weights, Legendre polynomials and NMENG (cutoff zonal wavenumber for each latitude))
!
! ** DUMMY ARGUMENTS
!    NLAT: number of latitudes (pole-to-pole) in grid-point space
!    KTRUNC: truncation
!    KSPOLEGL: Size of second dimension of Legendre polynomials
!    KLOEN: number of points on each latitude row
!    KNUMMAXRESOL: maximum number of troncatures handled
!    KNMENG: cut-off zonal wavenumber
!    PGW: Gaussian weights
!    PRPNM: Legendre polynomials
!
! ** AUTHOR
!    2 July 2025, S. Hatfield

! I. Dummy arguments declaration
USE ISO_FORTRAN_ENV, ONLY: INT64, REAL64
IMPLICIT NONE
INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE
INTEGER(KIND=INT64), INTENT(IN) :: NLAT
INTEGER(KIND=INT64), INTENT(IN) :: KTRUNC
INTEGER(KIND=INT64), INTENT(IN) :: KSPOLEGL
INTEGER(KIND=INT64), DIMENSION(NLAT), INTENT(IN) :: KLOEN
INTEGER(KIND=INT64), INTENT(IN) :: KNUMMAXRESOL
INTEGER(KIND=INT64), DIMENSION(NLAT), INTENT(OUT) :: KNMENG
REAL(KIND=REAL64), DIMENSION(NLAT), INTENT(OUT) :: PGW
REAL(KIND=REAL64), DIMENSION(NLAT/2,KSPOLEGL), INTENT(OUT) :: PRPNM

! II. Local variables declaration
INTEGER, DIMENSION(NLAT) :: ILOEN
INTEGER :: ISIZEI, ISIZEJ, IPHYSICALSIZEI, IPHYSICALSIZEJ, ITRUNCX, ITRUNCY, INUMMAXRESOL
LOGICAL :: LLSTOP
INTEGER :: IIDENTRESOL
INTEGER, DIMENSION(KSLOEN) :: INMENG
REAL(KIND=REAL64), DIMENSION(KSLOEN) :: ZGW
REAL(KIND=REAL64), DIMENSION(KSLOEN/2,KSPOLEGL) :: ZRPNM
REAL(KIND=REAL64) :: ZDELTAX, ZDELTAY

#include "trans_inq.h"

ILOEN(:) = KLOEN(:)
ISIZEI = 0
ISIZEJ = NLAT
IPHYSICALSIZEI = 0
IPHYSICALSIZEJ = 0
ITRUNCX = KTRUNC
ITRUNCY = 0
INUMMAXRESOL = KNUMMAXRESOL

! III. Setup
ZDELTAX = 0.0_REAL64
ZDELTAY = 0.0_REAL64
CALL SPEC_SETUP4PY(KRETURNCODE, ISIZEI, ISIZEJ, IPHYSICALSIZEI, IPHYSICALSIZEJ, &
                  &ITRUNCX, ITRUNCY, INUMMAXRESOL, ILOEN, .FALSE., SIZE(ILOEN), &
                  &ZDELTAX, ZDELTAY, IIDENTRESOL, LLSTOP)
IF (.NOT. LLSTOP) THEN
  CALL TRANS_INQ(KRESOL=IIDENTRESOL, KNMENG=INMENG, PGW=ZGW, PRPNM=ZRPNM)
  KNMENG = INMENG
  PGW = ZGW
  PRPNM = ZRPNM
ENDIF

END SUBROUTINE GET_LEGENDRE_ASSETS