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.
halo_mng.F90 in NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/LBC – NEMO

source: NEMO/branches/2020/dev_r12558_HPC-08_epico_Extra_Halo/src/OCE/LBC/halo_mng.F90 @ 12719

Last change on this file since 12719 was 12719, checked in by francesca, 4 years ago

extra-halo management with positive arrays indices - ticket #2366

File size: 5.6 KB
Line 
1MODULE halo_mng
2   !!======================================================================
3   !!                       ***  MODULE  halo_mng  ***
4   !! Ocean numerics:  massively parallel processing library
5   !!=====================================================================
6   !! History :  OPA  !  1994  (M. Guyon, J. Escobar, M. Imbard)
7   !Original code
8   !!            4.0  !  2019  (CMCC - ASC)  initial version of halo management module
9   !in_out_manager
10   !!----------------------------------------------------------------------
11
12   USE dom_oce       ! ocean space and time domain
13   USE lbclnk        ! ocean lateral boundary condition (or mpp link)
14
15   IMPLICIT NONE
16   PRIVATE
17
18   INTERFACE halo_mng_resize
19      MODULE PROCEDURE halo_mng_resize_2D, halo_mng_resize_3D, halo_mng_resize_4D, halo_mng_resize_5D
20   END INTERFACE
21
22   PUBLIC halo_mng_resize
23   PUBLIC halo_mng_init
24   PUBLIC halo_mng_set
25
26   INTEGER :: jpi_1, jpj_1
27   INTEGER :: jpimax_1, jpjmax_1
28   INTEGER :: nlci_1, nlcj_1
29   INTEGER :: nldi_1, nldj_1
30   INTEGER :: nlei_1, nlej_1
31CONTAINS
32
33   SUBROUTINE halo_mng_init( )
34
35        jpi_1 = jpi
36        jpj_1 = jpj
37
38        nlci_1 = nlci
39        nlcj_1 = nlcj
40
41        nldi_1 = nldi
42        nldj_1 = nldj
43
44        nlei_1 = nlei
45        nlej_1 = nlej
46
47      jpimax_1 = jpimax
48      jpjmax_1 = jpjmax
49
50   END SUBROUTINE halo_mng_init
51
52   SUBROUTINE halo_mng_set( khls )
53   
54        INTEGER, INTENT(in   )    ::   khls
55
56        nn_hls = khls
57
58        jpi = jpi_1 + 2*khls -2
59        jpj = jpj_1 + 2*khls -2
60
61        nlci = nlci_1 + 2*khls -2
62        nlcj = nlcj_1 + 2*khls -2
63       
64        jpimax = jpimax_1 + 2*khls -2
65        jpjmax = jpjmax_1 + 2*khls -2
66
67        nldi = nldi_1 + khls - 1
68        nldj = nldj_1 + khls - 1
69
70        nlei = nlei_1 + khls - 1
71        nlej = nlej_1 + khls - 1
72
73   END SUBROUTINE halo_mng_set
74   
75   SUBROUTINE halo_mng_resize_2D(pta, cdna, psgn, fillval)
76   
77      REAL(wp), POINTER, DIMENSION(:,:) :: pta
78      CHARACTER(len=1), INTENT(in)  :: cdna
79      REAL(wp), INTENT(in)  :: psgn
80      REAL(wp), OPTIONAL, INTENT(in ) :: fillval
81      REAL(wp), POINTER, DIMENSION(:,:) :: zpta
82      INTEGER :: offset
83      INTEGER :: pta_size_i, pta_size_j
84
85      pta_size_i = SIZE(pta,1)
86      pta_size_j = SIZE(pta,2)
87     
88      ! check if the current size of pta is equal to the current expected dimension
89      IF (pta_size_i .ne. jpi) THEN
90         ALLOCATE (zpta(jpi, jpj))
91         offset = abs((jpi - pta_size_i) / 2) 
92
93         IF (pta_size_i .lt. jpi) THEN
94            zpta (offset+1 : offset+pta_size_i, offset+1 : offset+pta_size_j) = pta
95         ELSE
96            zpta = pta(offset+1 : offset+jpi, offset+1 : offset+jpj)
97         END IF
98         CALL lbc_lnk( 'halo_mng_resize_2D', zpta, cdna, psgn, pfillval=fillval)
99         DEALLOCATE(pta)
100         pta => zpta
101      END IF
102     
103   END SUBROUTINE halo_mng_resize_2D
104
105   SUBROUTINE halo_mng_resize_3D(pta, cdna, psgn, fillval)
106   
107      REAL(wp), POINTER, DIMENSION(:,:,:) :: pta
108      CHARACTER(len=1), INTENT(in)  :: cdna
109      REAL(wp), INTENT(in)  :: psgn
110      REAL(wp), OPTIONAL, INTENT(in ) :: fillval
111      REAL(wp), POINTER, DIMENSION(:,:,:) :: zpta
112      INTEGER :: offset
113      INTEGER :: pta_size_i, pta_size_j
114
115      pta_size_i = SIZE(pta,1)
116      pta_size_j = SIZE(pta,2)
117     
118      ! check if the current size of pta is equal to the current expected dimension
119      IF (pta_size_i .ne. jpi) THEN
120         ALLOCATE (zpta(jpi, jpj, jpk))
121         offset = abs((jpi - pta_size_i) / 2) 
122
123         IF (pta_size_i .lt. jpi) THEN
124            zpta (offset+1 : offset+pta_size_i, offset+1 : offset+pta_size_j, :) = pta
125         ELSE
126            zpta = pta(offset+1 : offset+jpi, offset+1 : offset+jpj, :)
127         END IF
128         CALL lbc_lnk( 'halo_mng_resize_3D', zpta, cdna, psgn, pfillval=fillval)
129         DEALLOCATE(pta)
130         pta => zpta
131      END IF
132     
133   END SUBROUTINE halo_mng_resize_3D
134
135   SUBROUTINE halo_mng_resize_4D(pta, cdna, psgn, fillval, fjpt)
136   
137      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: pta
138      CHARACTER(len=1), INTENT(in)  :: cdna
139      REAL(wp), INTENT(in)  :: psgn
140      REAL(wp), OPTIONAL, INTENT(in) :: fillval
141      INTEGER , INTENT(in) ::   fjpt 
142      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zpta
143      INTEGER :: offset
144      INTEGER :: pta_size_i, pta_size_j
145
146      pta_size_i = SIZE(pta,1)
147      pta_size_j = SIZE(pta,2)
148     
149      ! check if the current size of pta is equal to the current expected dimension
150      IF (pta_size_i .ne. jpi) THEN
151         ALLOCATE (zpta(jpi, jpj, jpk, jpt))
152         offset = abs((jpi - pta_size_i) / 2) 
153
154         IF (pta_size_i .lt. jpi) THEN
155            zpta (offset+1 : offset+pta_size_i, offset+1 : offset+pta_size_j, :, :) = pta
156         ELSE
157            zpta = pta(offset+1 : offset+jpi, offset+1 : offset+jpj, :, :)
158         END IF
159         CALL lbc_lnk( 'halo_mng_resize_4D', zpta(:,:,:,fjpt), cdna, psgn, pfillval=fillval)
160         DEALLOCATE(pta)
161         pta => zpta
162      END IF
163     
164   END SUBROUTINE halo_mng_resize_4D
165   
166   SUBROUTINE halo_mng_resize_5D(pta, cdna, psgn, fillval, kjpt, fjpt)
167   
168      REAL(wp), POINTER, DIMENSION(:,:,:,:,:) :: pta
169      CHARACTER(len=1), INTENT(in)  :: cdna
170      REAL(wp), INTENT(in)  :: psgn
171      REAL(wp), OPTIONAL, INTENT(in) :: fillval
172      INTEGER , OPTIONAL, INTENT(in) :: kjpt            ! number of tracers
173      INTEGER , INTENT(in) :: fjpt           
174      REAL(wp), POINTER, DIMENSION(:,:,:,:,:) :: zpta
175      INTEGER :: offset
176      INTEGER :: pta_size_i, pta_size_j
177
178      pta_size_i = SIZE(pta,1)
179      pta_size_j = SIZE(pta,2)
180     
181      ! check if the current size of pta is equal to the current expected dimension
182      IF (pta_size_i .ne. jpi) THEN
183         ALLOCATE (zpta(jpi, jpj, jpk, kjpt, jpt))
184         offset = abs((jpi - pta_size_i) / 2) 
185
186         IF (pta_size_i .lt. jpi) THEN
187            zpta (offset+1 : offset+pta_size_i, offset+1 : offset+pta_size_j, :, :, :) = pta
188         ELSE
189            zpta = pta(offset+1 : offset+jpi, offset+1 : offset+jpj, :, :, :)
190         END IF
191         CALL lbc_lnk( 'halo_mng_resize_5D', zpta(:,:,:,:,fjpt), cdna, psgn, pfillval=fillval)
192         DEALLOCATE(pta)
193         pta => zpta
194      END IF
195     
196   END SUBROUTINE halo_mng_resize_5D
197   
198END MODULE
Note: See TracBrowser for help on using the repository browser.