New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
zpermute.F90 in branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/IOM – NEMO

source: branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/IOM/zpermute.F90 @ 4409

Last change on this file since 4409 was 3211, checked in by spickles2, 12 years ago

Stephen Pickles, 11 Dec 2011

Commit to bring the rest of the DCSE NEMO development branch
in line with the latest development version. This includes
array index re-ordering of all OPA_SRC/.

  • Property svn:keywords set to Id
File size: 3.0 KB
Line 
1MODULE zpermute
2   !!=====================================================================
3   !!                    ***  MODULE  zpermute ***
4   !! Manipulate array :  Library to read input files
5   !!====================================================================
6   !! History :  3.3.1  ! 2011 11  (S. Pickles) Original code
7   !!
8   !!--------------------------------------------------------------------
9   !!   permute_z_last : return pointer to a copy of an array with indices
10   !!                    permuted back to z_last ordering
11   !!--------------------------------------------------------------------
12   USE par_oce, ONLY : wp                   ! ocean parameters - working precision
13   USE lib_mpp, ONLY : ctl_warn, ctl_stop   ! warning and fatal messages
14
15   IMPLICIT NONE
16   PRIVATE
17
18   PUBLIC permute_z_last
19
20   !!----------------------------------------------------------------------
21   !! NEMO/OPA 3.3 , NEMO Consortium (2011)
22   !! $Id$
23   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
24   !!----------------------------------------------------------------------
25
26CONTAINS
27
28   FUNCTION permute_z_last( pain )   RESULT ( p_permuted )
29
30      !!----------------------------------------------------------------------
31      !!                     ***  ROUTINE permute_z_last  ***
32      !!
33      !! ** Purpose :   
34      !!
35      !!----------------------------------------------------------------------
36
37      REAL(wp), INTENT(in) :: pain(:,:,:)
38
39      REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: pain_reordered 
40      REAL(wp), POINTER, DIMENSION(:,:,:)                   :: p_permuted
41 
42      INTEGER, SAVE :: jiss=-1, jjss=-1, jkss=-1
43      INTEGER       :: jisz,    jjsz,    jksz
44      INTEGER       :: ji,      jj,      jk
45      INTEGER       :: ifail
46
47#if defined key_z_first
48      jisz = SIZE(pain, DIM=2)
49      jjsz = SIZE(pain, DIM=3)
50      jksz = SIZE(pain, DIM=1)
51#else
52      jisz = SIZE(pain, DIM=1)
53      jjsz = SIZE(pain, DIM=2)
54      jksz = SIZE(pain, DIM=3)
55#endif
56
57      IF ( (jiss /= jisz) .OR. (jjss /= jjsz) .OR. (jkss /= jksz)) THEN
58         IF (ALLOCATED(pain_reordered)) THEN
59            DEALLOCATE(pain_reordered)
60         END IF
61      ELSE
62         IF (.NOT. ALLOCATED(pain_reordered)) THEN
63            CALL ctl_warn("permute_z_last: unexpected need to allocate array")
64         END IF
65      END IF
66
67      IF (.NOT. ALLOCATED(pain_reordered)) THEN
68         ALLOCATE(pain_reordered(jisz,jjsz,jksz), STAT=ifail)
69         IF (ifail /= 0) THEN
70            CALL ctl_stop("permute_z_last: failure allocating output array")
71         END IF
72      END IF
73
74      DO jk = 1, jksz
75         DO jj = 1, jjsz
76            DO ji = 1, jisz
77!FTRANS pain :I :I :z
78               pain_reordered(ji, jj, jk) = pain(ji, jj, jk)
79            END DO
80         END DO
81      END DO
82
83      jiss = jisz
84      jjss = jjsz
85      jkss = jksz
86      p_permuted => pain_reordered
87
88   END FUNCTION permute_z_last
89
90   !!======================================================================
91END MODULE zpermute
Note: See TracBrowser for help on using the repository browser.