MODULE zpermute !!===================================================================== !! *** MODULE zpermute *** !! Manipulate array : Library to read input files !!==================================================================== !! History : 3.3.1 ! 2011 11 (S. Pickles) Original code !! !!-------------------------------------------------------------------- !! permute_z_last : return pointer to a copy of an array with indices !! permuted back to z_last ordering !!-------------------------------------------------------------------- USE par_oce, ONLY : wp ! ocean parameters - working precision USE lib_mpp, ONLY : ctl_warn, ctl_stop ! warning and fatal messages IMPLICIT NONE PRIVATE PUBLIC permute_z_last !!---------------------------------------------------------------------- !! NEMO/OPA 3.3 , NEMO Consortium (2011) !! $Id$ !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS FUNCTION permute_z_last( pain ) RESULT ( p_permuted ) !!---------------------------------------------------------------------- !! *** ROUTINE permute_z_last *** !! !! ** Purpose : !! !!---------------------------------------------------------------------- REAL(wp), INTENT(in) :: pain(:,:,:) REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: pain_reordered REAL(wp), POINTER, DIMENSION(:,:,:) :: p_permuted INTEGER, SAVE :: jiss=-1, jjss=-1, jkss=-1 INTEGER :: jisz, jjsz, jksz INTEGER :: ji, jj, jk INTEGER :: ifail #if defined key_z_first jisz = SIZE(pain, DIM=2) jjsz = SIZE(pain, DIM=3) jksz = SIZE(pain, DIM=1) #else jisz = SIZE(pain, DIM=1) jjsz = SIZE(pain, DIM=2) jksz = SIZE(pain, DIM=3) #endif IF ( (jiss /= jisz) .OR. (jjss /= jjsz) .OR. (jkss /= jksz)) THEN IF (ALLOCATED(pain_reordered)) THEN DEALLOCATE(pain_reordered) END IF ELSE IF (.NOT. ALLOCATED(pain_reordered)) THEN CALL ctl_warn("permute_z_last: unexpected need to allocate array") END IF END IF IF (.NOT. ALLOCATED(pain_reordered)) THEN ALLOCATE(pain_reordered(jisz,jjsz,jksz), STAT=ifail) IF (ifail /= 0) THEN CALL ctl_stop("permute_z_last: failure allocating output array") END IF END IF DO jk = 1, jksz DO jj = 1, jjsz DO ji = 1, jisz !FTRANS pain :I :I :z pain_reordered(ji, jj, jk) = pain(ji, jj, jk) END DO END DO END DO jiss = jisz jjss = jjsz jkss = jksz p_permuted => pain_reordered END FUNCTION permute_z_last !!====================================================================== END MODULE zpermute