SURFEX v8.1
General documentation of Surfex
split_grid_conf_proj.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 ! ###########################################################
6  SUBROUTINE split_grid_conf_proj(HPROGRAM,KDIM_FULL,KSIZE_FULL,KGRID_PAR,PGRID_PAR,KHALO)
7 ! ###########################################################
8 !!
9 !! PURPOSE
10 !! -------
11 !! This program splits a PGD grid on several processors (according to host program)
12 !!
13 !! METHOD
14 !! ------
15 !!
16 !! EXTERNAL
17 !! --------
18 !!
19 !!
20 !! IMPLICIT ARGUMENTS
21 !! ------------------
22 !!
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! V. Masson Meteo-France
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 08/11
36 !! M.Moge 02/15 using PGRID_PAR(11) instead of KDIM_FULL
37 !----------------------------------------------------------------------------
38 !
39 !* 0. DECLARATION
40 ! -----------
41 !
44 !
45 !
46 USE yomhook ,ONLY : lhook, dr_hook
47 USE parkind1 ,ONLY : jprb
48 !
49 !
50 IMPLICIT NONE
51 !
52 !* 0.1 Declaration of dummy arguments
53 ! ------------------------------
54 !
55  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! host program
56 INTEGER, INTENT(IN) :: KDIM_FULL ! total number of points
57 INTEGER, INTENT(OUT) :: KSIZE_FULL! number of points on this processor
58 INTEGER, INTENT(INOUT) :: KGRID_PAR ! size of PGRID_PAR pointer
59 REAL, DIMENSION(:), POINTER :: PGRID_PAR ! parameters defining this grid
60 INTEGER, OPTIONAL, INTENT(IN) :: KHALO ! size of the Halo
61 !
62 !* 0.2 Declaration of local variables
63 ! ------------------------------
64 !
65 REAL(KIND=JPRB) :: ZHOOK_HANDLE
66 !
67 !* original grid
68 REAL :: ZLAT0, ZLON0, ZRPK, ZBETA, ZLATOR, ZLONOR
69 INTEGER :: IIMAX, IJMAX
70 REAL, DIMENSION(INT(PGRID_PAR(11))) :: ZX, ZY, ZDX, ZDY
71 !
72 !* splitted grid on processor
73 INTEGER :: IIMAX_SPLIT, IJMAX_SPLIT
74 REAL, DIMENSION(:), ALLOCATABLE :: ZX_SPLIT, ZY_SPLIT, ZDX_SPLIT, ZDY_SPLIT
75 !
76 !------------------------------------------------------------------------------
77 IF (lhook) CALL dr_hook('SPLIT_GRID_CONF_PROJ',0,zhook_handle)
78 !
79 !* 1. Gets Parameters of the Grid
80 !
81  CALL get_gridtype_conf_proj(pgrid_par,zlat0,zlon0,zrpk,zbeta,&
82  zlator,zlonor,iimax,ijmax, &
83  zx,zy,zdx,zdy )
84 !
85 !
86 !* 2. Splits the (pertinent) parameters of the grid
87 !
88 IF (PRESENT(khalo)) THEN
89  CALL split_grid_parametern0(hprogram,'CONF PROJ ','IMAX ',iimax,iimax_split,khalo)
90  CALL split_grid_parametern0(hprogram,'CONF PROJ ','JMAX ',ijmax,ijmax_split,khalo)
91 ELSE
92  CALL split_grid_parametern0(hprogram,'CONF PROJ ','IMAX ',iimax,iimax_split)
93  CALL split_grid_parametern0(hprogram,'CONF PROJ ','JMAX ',ijmax,ijmax_split)
94 ENDIF
95 !
96 ksize_full = iimax_split * ijmax_split
97 !
98 ALLOCATE(zx_split(ksize_full))
99 ALLOCATE(zy_split(ksize_full))
100 ALLOCATE(zdx_split(ksize_full))
101 ALLOCATE(zdy_split(ksize_full))
102 !
103 IF (PRESENT(khalo)) THEN
104  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','XX ',SIZE(zx),ksize_full,zx,zx_split,iimax,ijmax,khalo)
105  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','YY ',SIZE(zy),ksize_full,zy,zy_split,iimax,ijmax,khalo)
106  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','DX ',SIZE(zdx),ksize_full,zdx,zdx_split,iimax,ijmax,khalo)
107  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','DY ',SIZE(zdy),ksize_full,zdy,zdy_split,iimax,ijmax,khalo)
108 ELSE
109  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','XX ',kdim_full,ksize_full,zx,zx_split)
110  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','YY ',kdim_full,ksize_full,zy,zy_split)
111  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','DX ',kdim_full,ksize_full,zdx,zdx_split)
112  CALL split_grid_parameterx1(hprogram,'CONF PROJ ','DY ',kdim_full,ksize_full,zdy,zdy_split)
113 ENDIF
114 !
115 !
116 !* 3. Stores Parameters of the Grid in grid pointer
117 !
118 NULLIFY(pgrid_par)
119  CALL put_gridtype_conf_proj(pgrid_par,zlat0,zlon0,zrpk,zbeta, &
120  zlator,zlonor,iimax_split,ijmax_split, &
121  zx_split,zy_split,zdx_split,zdy_split )
122  !
123 !
124 kgrid_par = SIZE(pgrid_par)
125 !
126 DEALLOCATE(zx_split )
127 DEALLOCATE(zy_split )
128 DEALLOCATE(zdx_split)
129 DEALLOCATE(zdy_split)
130 !
131 IF (lhook) CALL dr_hook('SPLIT_GRID_CONF_PROJ',1,zhook_handle)
132 !_______________________________________________________________________________
133 !
134 END SUBROUTINE split_grid_conf_proj
subroutine split_grid_conf_proj(HPROGRAM, KDIM_FULL, KSIZE_FULL, KGRI
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_gridtype_conf_proj(PGRID_PAR, PLAT0, PLON0, PRPK, PBETA
logical lhook
Definition: yomhook.F90:15
subroutine split_grid_parametern0(HPROGRAM, HGRID, HREC, KFIELD, KFIELD_SPLIT, KHALO)
subroutine put_gridtype_conf_proj(PGRID_PAR, PLAT0, PLON0, PRPK, PBETA
subroutine split_grid_parameterx1(HPROGRAM, HGRID, HREC, KDIM, KSIZE, PFIELD, PFIELD_SPLIT, KIMAX_ll, KJMAX_ll, KHALO)