SURFEX v8.1
General documentation of Surfex
sfx_xios_setup_ol.F90
Go to the documentation of this file.
1 SUBROUTINE sfx_xios_setup_ol(YSC, KLUOUT, KYEAR, KMONTH, KDAY, PTIME, PSTEP)
2 !
3 !**** *SFX_XIOS_SETUP_OL* -
4 !
5 ! Purpose.
6 ! --------
7 !
8 ! Call SFX_XIOS_SETUP, providing it with Arpege MPI communicator
9 ! and passing args about : output logical unit, date, model
10 ! timestep and, for the whole MPI task : lat/lon of centers and
11 ! corners, cell index and mask, tile masks
12 !
13 !** Interface.
14 ! ----------
15 ! *CALL* *SFX_XIOS_SETUP_OL*
16 !
17 ! Input:
18 ! -----
19 !
20 ! Output:
21 ! ------
22 !
23 !
24 ! Method:
25 ! ------
26 !
27 ! Externals:
28 ! ---------
29 !
30 ! Reference:
31 ! ---------
32 !
33 ! Author:
34 ! -------
35 ! S.Senesi, aug 2015
36 !
37 ! Modifications.
38 ! --------------
39 !
40 ! -----------------------------------------------------------
41 !
42 USE modd_surfex_n, ONLY : surfex_t
43 !
45 USE modd_surfex_mpi, ONLY : nrank, ncomm, nindex
46 !
47 USE modd_io_surf_ol, ONLY: nmask_ign
48 !
49 USE modd_xios, ONLY : lxios, ladd_dim=>lallow_add_dim, nblock_xios=>nblock
50 !
51 USE modi_abor1_sfx
52 USE modi_get_surf_grid_dim_n
53 USE modi_get_mesh_corner
54 USE modi_sfx_xios_setup
55 USE modi_get_ign_maskall
56 !
57 USE parkind1 ,ONLY : jprb, jpim
58 USE yomhook ,ONLY : lhook, dr_hook
59 !
60 IMPLICIT NONE
61 !
62 TYPE(surfex_t), INTENT(INOUT) :: YSC
63 INTEGER, INTENT(IN) :: KLUOUT
64 INTEGER(KIND=JPIM), INTENT(IN) :: KYEAR ! Current Year
65 INTEGER(KIND=JPIM), INTENT(IN) :: KMONTH ! Current Month
66 INTEGER(KIND=JPIM), INTENT(IN) :: KDAY ! Current Day
67 REAL , INTENT(IN) :: PTIME ! Time in the day
68 REAL , INTENT(IN) :: PSTEP ! Atmospheric time step
69 !
70 ! Local variables
71 !
72 INTEGER :: IX, JX
73 INTEGER, ALLOCATABLE, DIMENSION(:) :: IXINDEX ! Index of the grid meshes for the
74  ! current MPI-task in global 1D grid (start at 0)
75 LOGICAL, ALLOCATABLE, DIMENSION(:) :: GLXMASK ! Cells mask
76 REAL, ALLOCATABLE, DIMENSION(:,:) :: ZCORLON
77 REAL, ALLOCATABLE, DIMENSION(:,:) :: ZCORLAT
78 INTEGER, ALLOCATABLE, DIMENSION(:) :: IMN,IMS,IMW,IMT ! Tile masks, 0-based
79 REAL, DIMENSION(:), ALLOCATABLE :: ZX, ZY
80 !
81  CHARACTER(LEN=10) :: YGRID ! grid type
82 LOGICAL :: GRECT
83 INTEGER :: IDIM1, IDIM2
84 !
85 REAL(KIND=JPRB) :: ZHOOK_HANDLE
86 !
87 !------------------------------------------------------------------------------
88 IF (lhook) CALL dr_hook('SFX_XIOS_SETUP_OL',0,zhook_handle)
89 !
90 #ifdef WXIOS
91 IF (lxios) THEN
92  !
93  ladd_dim = lallow_add_dim
94  !
95  nblock_xios = 1
96 
97  ! Build XIOS index from Surfex's NINDEX
98  ALLOCATE(ixindex(ysc%U%NSIZE_FULL))
99 
100  jx=0
101  DO ix = 1,ysc%U%NDIM_FULL
102  IF ( nindex(ix) == nrank ) THEN
103  jx = jx+1
104  IF (jx > ysc%U%NSIZE_FULL ) THEN
105  CALL abor1_sfx('sfx_xios_setup_ol : internal error with XIOS index')
106  ENDIF
107  ixindex(jx) = ix - 1
108  ENDIF
109  ENDDO
110  !
111  ALLOCATE(glxmask(ysc%U%NSIZE_FULL))
112  glxmask(:)=.true.
113  !
114  ALLOCATE(imn(SIZE(ysc%U%NR_NATURE)))
115  ALLOCATE(ims(SIZE(ysc%U%NR_SEA)))
116  ALLOCATE(imw(SIZE(ysc%U%NR_WATER )))
117  ALLOCATE(imt(SIZE(ysc%U%NR_TOWN )))
118  imn(:) = ysc%U%NR_NATURE-1
119  ims(:) = ysc%U%NR_SEA -1
120  imw(:) = ysc%U%NR_WATER -1
121  imt(:) = ysc%U%NR_TOWN -1
122  !
123  ALLOCATE(zcorlat(ysc%U%NSIZE_FULL,4))
124  ALLOCATE(zcorlon(ysc%U%NSIZE_FULL,4))
125  CALL get_mesh_corner(ysc%UG, kluout,zcorlat(:,:),zcorlon(:,:))
126  !
127  IF (lwrite_coord.AND.(trim(ysc%UG%G%CGRID)=='LONLATVAL'.OR.trim(ysc%UG%G%CGRID)=='IGN')) THEN
128  idim1 = ysc%U%NDIM_FULL
129  idim2 = 1
130  ELSE
131  CALL get_surf_grid_dim_n(ysc%UG, ygrid, grect, idim1, idim2)
132  IF (trim(ysc%UG%G%CGRID)=='IGN') THEN
133  ALLOCATE(zx(idim1),zy(idim2))
134  CALL get_ign_maskall(ysc%UG,ysc%U%NDIM_FULL,zx,zy)
135  ixindex(:) = nmask_ign(ixindex(:)+1) -1
136  DEALLOCATE(nmask_ign,zx,zy)
137  ENDIF
138  ENDIF
139  !
140  CALL sfx_xios_setup(ysc,ncomm,kluout,&
141  kyear,kmonth,kday,ptime,pstep,&
142  idim1,idim2,0,transpose(zcorlat),transpose(zcorlon),&
143  ixindex,glxmask,imn,ims,imw,imt)
144  !
145  DEALLOCATE(imn,ims,imw,imt)
146  DEALLOCATE(zcorlat, zcorlon)
147  DEALLOCATE(ixindex)
148  DEALLOCATE(glxmask)
149  !
150 ENDIF
151 #endif
152 !
153 IF (lhook) CALL dr_hook('SFX_XIOS_SETUP_OL',1,zhook_handle)
154 END SUBROUTINE sfx_xios_setup_ol
integer, parameter jpim
Definition: parkind1.F90:13
logical lxios
Definition: modd_xios.F90:41
subroutine sfx_xios_setup(YSC, KCOMM, KLUOUT, KYEAR, KMONTH, KDAY, PTIME, PTSTEP, KDIM1, KDIM2, KEXT1, PCLAT, PCLON, KXINDEX, ODXMASK, KMASKNAT, KMASKSEA, KMASKWAT, KMASKTOWN)
subroutine get_mesh_corner(UG, KLUOUT, PCORNER_LAT, PCORNER_LON)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
logical lallow_add_dim
Definition: modd_xios.F90:49
subroutine get_ign_maskall(UG, KNI, PX, PY, OTOT)
logical lhook
Definition: yomhook.F90:15
subroutine get_surf_grid_dim_n(UG, HGRID, ORECT, KDIM1, KDIM2, KGRID_PAR, PGRID_PAR)
integer, dimension(:), allocatable nindex
integer nblock
Definition: modd_xios.F90:57
integer, dimension(:), allocatable nmask_ign
subroutine sfx_xios_setup_ol(YSC, KLUOUT, KYEAR, KMONTH, KDAY, PTIME, PSTEP)