! Spectral and grid-point norms (distributed). Single precision. Field-first inputs
! consistent with the transform wrappers: spectral (KSPEC2, KFLD) [coeff-first in
! Fortran], grid (KGPTOT, KFLD). Norms are global (gathered across tasks).

SUBROUTINE SPECNORM4PY(KRETURNCODE, KSPEC2, KFLD, PSPEC, PNORM)
! Global spectral L2 norm per field. Cf. SPECNORM.
USE ISO_FORTRAN_ENV, ONLY: INT64
USE PARKIND1, ONLY: JPIM, JPRB
IMPLICIT NONE
INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE
INTEGER(KIND=INT64), INTENT(IN)  :: KSPEC2, KFLD
REAL(KIND=JPRB), DIMENSION(KSPEC2, KFLD), INTENT(IN)  :: PSPEC
REAL(KIND=JPRB), DIMENSION(KFLD),         INTENT(OUT) :: PNORM
REAL(KIND=JPRB) :: ZSP(KFLD, KSPEC2)
INTEGER(KIND=JPIM) :: IVSET(KFLD), JL
#include "specnorm.h"
KRETURNCODE = 0
IVSET(:) = 1                       ! single V-set (NPRTRV=1)
DO JL = 1, KFLD
  ZSP(JL, :) = PSPEC(:, JL)
ENDDO
PNORM(:) = 0._JPRB
CALL SPECNORM(PNORM=PNORM, PSPEC=ZSP, KVSET=IVSET, KMASTER=1)
END SUBROUTINE SPECNORM4PY


SUBROUTINE GPNORM_TRANS4PY(KRETURNCODE, KGPTOT, KFLD, PGP, PAVE, PMIN, PMAX)
! Global grid-point average / min / max per field. Cf. GPNORM_TRANS.
USE ISO_FORTRAN_ENV, ONLY: INT64
USE PARKIND1, ONLY: JPIM, JPRB
IMPLICIT NONE
INTEGER(KIND=INT64), INTENT(OUT) :: KRETURNCODE
INTEGER(KIND=INT64), INTENT(IN)  :: KGPTOT, KFLD
REAL(KIND=JPRB), DIMENSION(KGPTOT, KFLD), INTENT(IN)  :: PGP
REAL(KIND=JPRB), DIMENSION(KFLD),         INTENT(OUT) :: PAVE, PMIN, PMAX
REAL(KIND=JPRB) :: ZGP(KGPTOT, KFLD, 1)
#include "gpnorm_trans.h"
KRETURNCODE = 0
ZGP(:, :, 1) = PGP(:, :)
PMIN(:) = 0._JPRB
PMAX(:) = 0._JPRB
CALL GPNORM_TRANS(ZGP, INT(KFLD,JPIM), INT(KGPTOT,JPIM), PAVE, PMIN, PMAX, .FALSE., KRESOL=1)
END SUBROUTINE GPNORM_TRANS4PY
