! 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