SURFEX v8.1
General documentation of Surfex
get_sizes_parallel.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 SUBROUTINE get_sizes_parallel (DTCO, UG, U, KPROC,KSIZE,KPROCMIN,KSIZE_TASK,OSHADOWS)
6 !
7 !
8 ! Modified by B. Decharme (08/2013): bug in KSIZE_TASK
9 !
10 ! Modif Matthieu Lafaysse 04/2014
11 ! For shadows routines, we need strictly rectangular subdomains
12 
13 !
14 !
15 !
18 USE modd_surf_atm_n, ONLY : surf_atm_t
19 !
20 #ifdef SFX_OL
21 USE modd_slope_effect, ONLY : nix,niy
23 #endif
24 USE modi_init_io_surf_n
26 USE modi_read_gridtype
27 USE modi_get_grid_dim
28 !RJ: missing modi
29 USE modi_end_io_surf_n
30 !
31 USE yomhook ,ONLY : lhook, dr_hook
32 USE parkind1 ,ONLY : jprb
33 !
34 IMPLICIT NONE
35 !
36 !
37 !
38 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
39 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
40 TYPE(surf_atm_t), INTENT(INOUT) :: U
41 !
42 !
43 INTEGER, INTENT(IN) :: KPROC
44 INTEGER, INTENT(IN) :: KSIZE
45 INTEGER, INTENT(IN) :: KPROCMIN
46 LOGICAL, INTENT(IN),OPTIONAL :: OSHADOWS
47 
48 LOGICAL::GSHADOWS
49 
50 LOGICAL :: GRECT
51 
52 INTEGER, DIMENSION(0:KPROC-1), INTENT(OUT) :: KSIZE_TASK
53 !
54 
55 INTEGER::IRESP
56 
57 INTEGER :: ISIZE, IRESTE, INRESTE
58 INTEGER :: J, IPROC
59 INTEGER :: ISIZE_Y,INY_THREAD,INY_RESTE
60 
61 REAL(KIND=JPRB) :: ZHOOK_HANDLE
62 !
63 IF (lhook) CALL dr_hook('GET_SIZES_PARALLEL',0,zhook_handle)
64 !
65 
66 IF (PRESENT(oshadows)) THEN
67  gshadows=oshadows
68 ELSE
69  gshadows=.false.
70 ENDIF
71 
72 IF (gshadows) THEN
73  ! We want only rectangular subdomains
74 
75  ! Get x and y dimension lengths
76 #ifdef SFX_OL
77  IF (nix==0) THEN
78 
79  !CALL SET_SURFEX_FILEIN(CSURF_FILETYPE,'PREP ') ! not necessary, it works with PGD or PREP file
80  CALL init_io_surf_n(dtco, u, &
81  csurf_filetype,'FULL ','SURF ','READ ')
82  CALL read_surf(&
83  csurf_filetype,'GRID_TYPE',ug%G%CGRID,iresp,hdir='A')
84  CALL read_gridtype(&
85  csurf_filetype,ug%G%CGRID,ug%NGRID_FULL_PAR,u%NDIM_FULL,.false.,hdir="A")
86  ALLOCATE(ug%XGRID_FULL_PAR(ug%NGRID_FULL_PAR))
87  CALL read_gridtype(&
88  csurf_filetype,ug%G%CGRID,ug%NGRID_FULL_PAR,u%NDIM_FULL,.true.,ug%XGRID_FULL_PAR,iresp,hdir="A")
90  CALL get_grid_dim(ug%G%CGRID,SIZE(ug%XGRID_FULL_PAR),ug%XGRID_FULL_PAR,grect,nix,niy)
91  ug%XGRID_FULL_PAR=>null()
92  ENDIF
93 
94  !If get_sizes_parallel is called by init_index_mpi
95  !ISIZE_Y represents the number of lines of the total domain
96  !INY_THREAD represents the number of lines for 1 MPI thread
97  !If get_sizes_parallel is called by offline
98  !ISIZE_Y represents the number of lines of 1 MPI thread
99  !INY_THREAD represent the number of lines for 1 OPEN-MP thread
100 
101  isize_y=ksize/nix
102 
103  ! Number of lines (y) for one thread
104  iny_thread=isize_y/kproc
105  iny_reste=isize_y-kproc*iny_thread
106 
107  ksize_task(:)=iny_thread*nix
108 
109  DO j=kprocmin+kproc-iny_reste,kprocmin+kproc-1
110  ksize_task(mod(j,kproc))=ksize_task(mod(j,kproc))+nix
111  END DO
112 #endif
113 ELSE
114  isize = ceiling(ksize*1./kproc) !nb of points by task
115 
116  inreste = kproc*isize - ksize ! nb of tasks containing ireste points
117  IF (inreste>0) THEN
118  ireste = isize - 1
119  ELSE
120  ireste = isize
121  ENDIF
122 !
123  ksize_task(:) = isize
124  IF (inreste>0) THEN
125  DO j = kprocmin+kproc-inreste,kprocmin+kproc-1
126  ksize_task(mod(j,kproc)) = ireste
127  ENDDO
128  ENDIF
129 !
130 !so:
131 !(nproc-nreste)*isize + nreste*ireste = ndim_full
132 !if nreste==1:
133 !(nproc-1)*isize + ireste =
134 !(nproc-1)*isize + NDIM_FULL - (nproc-1)*isize = NDIM_FULL
135 !if (ireste==isize-1):
136 !nproc*isize - nreste*isize + nreste*isize - nreste =
137 !nproc*isize - nreste = NDIM_FULL
138 
139 
140 ENDIF
141 !
142 IF (lhook) CALL dr_hook('GET_SIZES_PARALLEL',1,zhook_handle)
143 !
144 END SUBROUTINE get_sizes_parallel
character(len=6) csurf_filetype
subroutine get_grid_dim(HGRID, KGRID_PAR, PGRID_PAR, ORECT, KDIM1, KDIM
Definition: get_grid_dim.F90:7
subroutine read_gridtype( HPROGRAM, HGRID, KGRID_PAR, KLU, OREAD, PGRID
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_sizes_parallel(DTCO, UG, U, KPROC, KSIZE, KPROCMIN, KSIZE_TASK, OSHADOWS)
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION