SURFEX v8.1
General documentation of Surfex
treat_bathyfield.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 treat_bathyfield (UG, U, USS, &
7  HPROGRAM,HSCHEME,HFILETYPE, &
8  HSUBROUTINE,HFILENAME,HNCVARNAME, &
9  HFIELD, PPGDARRAY,HSFTYPE )
10 ! ##############################################################
11 !
12 !!**** *TREAT_BATHYFIELD* chooses which treatment subroutine to use to read
13 !! the bathymetry
14 !!
15 !! PURPOSE
16 !! -------
17 !!
18 !! METHOD
19 !! ------
20 !!
21 !! EXTERNAL
22 !! --------
23 !!
24 !! IMPLICIT ARGUMENTS
25 !! ------------------
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !! AUTHOR
31 !! ------
32 !!
33 !! C. Lebeaupin Brossier Meteo-France
34 !!
35 !! MODIFICATION
36 !! ------------
37 !!
38 !! Original 01/2008
39 !!
40 !----------------------------------------------------------------------------
41 !
42 !* 0. DECLARATION
43 ! -----------
44 !
45 !
46 !
47 !
49 USE modd_surf_atm_n, ONLY : surf_atm_t
50 USE modd_sso_n, ONLY : sso_t
51 !
52 USE modd_surf_par, ONLY : xundef
54 !
55 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm, nreq, nindex, idx_r, &
56  nsize_task,nreq, nsize_max=>nsize
57 !
58 USE modi_ini_ssowork
59 USE modi_get_luout
60 USE modi_read_direct
61 USE modi_read_binllv
62 USE modi_read_binllvfast
63 USE modi_read_ascllv
64 USE modi_read_netcdf
65 USE modi_average2_mesh
67 !
68 !
69 USE yomhook ,ONLY : lhook, dr_hook
70 USE parkind1 ,ONLY : jprb
71 !
72 USE modi_abor1_sfx
73 !
74 USE modi_average2_cover
75 !
76 USE modi_average2_orography
77 !
78 USE modi_read_direct_gauss
79 IMPLICIT NONE
80 !
81 #ifdef SFX_MPI
82 include "mpif.h"
83 #endif
84 !
85 !* 0.1 Declaration of arguments
86 ! ------------------------
87 !
88 !
89 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
90 TYPE(surf_atm_t), INTENT(INOUT) :: U
91 TYPE(sso_t), INTENT(INOUT) :: USS
92 !
93  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program
94  CHARACTER(LEN=6), INTENT(IN) :: HSCHEME ! Scheme treated
95  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! Type of the data file
96  CHARACTER(LEN=6), INTENT(IN) :: HSUBROUTINE ! Name of the subroutine to call
97  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file.
98  CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME ! Name of the variable in netcdf file
99  CHARACTER(LEN=20), INTENT(IN) :: HFIELD ! Name of the field.
100 REAL, DIMENSION(:), INTENT(INOUT), OPTIONAL :: PPGDARRAY ! field on MESONH grid
101  CHARACTER(LEN=3), INTENT(IN), OPTIONAL :: HSFTYPE
102 !
103 !* 0.2 Declaration of local variables
104 ! ------------------------------
105 !
106 REAL, DIMENSION(:,:), ALLOCATABLE :: ZPGDARRAY
107 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK
108 REAL, DIMENSION(:,:), ALLOCATABLE :: ZVAL
109 INTEGER, DIMENSION(:), ALLOCATABLE :: ISIZE
110 !
111 #ifdef SFX_MPI
112 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
113 INTEGER, DIMENSION(MPI_STATUS_SIZE,NPROC-1) :: ISTATUS2
114 #endif
115 INTEGER :: ILUOUT, INFOMPI, JP, ICPT, JI, JL, IREQ, IDX,&
116  IDX_SAVE
117 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
118 !-------------------------------------------------------------------------------
119 !
120 IF (lhook) CALL dr_hook('TREAT_BATHYFIELD',0,zhook_handle)
121  CALL get_luout(hprogram,iluout)
122 !
123 !* 1. Selection of type of reading (and point by point treatment)
124 ! -----------------------------------------------------------
125 !
126 SELECT CASE (hfiletype)
127 
128  CASE ('DIRECT')
129  IF(ug%G%CGRID=="GAUSS ")THEN
130  CALL read_direct_gauss(ug, u, uss, &
131  hprogram,hscheme,hsubroutine,hfilename,hfield)
132  ELSE
133  CALL read_direct(ug, u, uss, &
134  hprogram,hscheme,hsubroutine,hfilename,hfield)
135  ENDIF
136  CASE ('BINLLV')
137  CALL ini_ssowork
138  IF (nrank==npio) CALL read_binllv(ug, u, uss, &
139  hprogram,hsubroutine,hfilename)
140 
141  CASE ('BINLLF')
142  CALL ini_ssowork
143  IF (nrank==npio) CALL read_binllvfast(ug, u, uss, &
144  hprogram,hsubroutine,hfilename)
145 
146  CASE ('ASCLLV')
147  CALL ini_ssowork
148  IF (nrank==npio) CALL read_ascllv(ug, u, uss, &
149  hprogram,hsubroutine,hfilename)
150 
151  CASE ('NETCDF')
152  CALL ini_ssowork
153  IF (nrank==npio) CALL read_netcdf(ug, u, uss, &
154  hprogram,hsubroutine,hfilename,hncvarname)
155 
156 END SELECT
157 !
158 !-------------------------------------------------------------------------------
159 !
160 !nsize contains the number of points found for each of the domain, for each task
161 ALLOCATE(nsize(u%NSIZE_FULL,1))
162 !
163 IF (nproc>1) THEN
164  !
165  ALLOCATE(isize(nsize_max))
166  !
167  idx_save = idx_r
168  idx = idx_save + nrank
169  !each task sends to each other task the part of NSIZE_ALL it got, stored in
170  !isize
171  CALL read_and_send_mpi(nsize_all(:,1),isize(1:nsize_task(nrank)),kpio=nrank,kdx=idx)
172  !
173  nsize(:,1) = 0
174  !for each task
175  DO jp=0,nproc-1
176  !
177  IF (jp/=nrank) THEN
178  !
179 #ifdef SFX_MPI
180  !each task receives each ISIZE from each task
181  CALL mpi_recv(isize,nsize_max*kind(isize)/4,mpi_integer,&
182  jp,idx_save+1+jp,ncomm,istatus,infompi)
183 #endif
184  !
185  ELSE
186  !
187  icpt = 0
188  DO ji = 1,SIZE(nindex)
189  IF (nindex(ji)==jp) THEN
190  icpt = icpt + 1
191  isize(icpt) = nsize_all(ji,1)
192  ENDIF
193  ENDDO
194  !
195  ENDIF
196  !
197  !nsize is the sum of all parts isize
198  nsize(:,1) = nsize(:,1) + isize(1:nsize_task(nrank))
199  !
200  ENDDO
201  DEALLOCATE(isize)
202 #ifdef SFX_MPI
203  CALL mpi_waitall(nproc-1,nreq(1:nproc-1),istatus2,infompi)
204 #endif
205 ELSE
206  nsize(:,1) = nsize_all(:,1)
207 ENDIF
208 !
209 !
210 DEALLOCATE(nsize_all)
211 !
212 !
213 SELECT CASE (hsubroutine)
214 
215  CASE ('A_MESH')
216  !most simple case
217  ALLOCATE(xsumval(u%NSIZE_FULL,1))
218  IF (nproc>1) THEN
219  xsumval(:,:) = 0.
220  ALLOCATE(zval(u%NSIZE_FULL,1))
221  DO jp = 0,nproc-1
222  CALL read_and_send_mpi(xall(:,:,1),zval,kpio=jp)
223  xsumval(:,:) = xsumval(:,:) + zval(:,:)
224  ENDDO
225  DEALLOCATE(zval)
226  ELSE
227  xsumval(:,:) = xall(:,:,1)
228  ENDIF
229  DEALLOCATE(xall)
230  !
231 END SELECT
232 !
233 !* 2. Call to the adequate subroutine (global treatment)
234 ! --------------------------------------------------
235 !
236 SELECT CASE (hsubroutine)
237 
238  CASE ('A_MESH')
239  IF (.NOT. PRESENT(ppgdarray)) THEN
240  WRITE(iluout,*) 'You asked to average a PGD field with A_MESH option,'
241  WRITE(iluout,*) 'but you did not give the array to store this field'
242  CALL abor1_sfx('TREAT_BATHYFIELD: PGD ARRAY IS MISSING')
243  END IF
244  ALLOCATE(zpgdarray(SIZE(ppgdarray),1))
245  CALL average2_mesh(zpgdarray)
246  ppgdarray = zpgdarray(:,1)
247  DEALLOCATE(zpgdarray)
248 
249 END SELECT
250 IF (lhook) CALL dr_hook('TREAT_BATHYFIELD',1,zhook_handle)
251 !-------------------------------------------------------------------------------
252 !
253 END SUBROUTINE treat_bathyfield
integer, dimension(:), allocatable nreq
integer, dimension(:,:), allocatable nsize_all
real, dimension(:,:,:), allocatable xall
subroutine read_direct(UG, U, USS, HPROGRAM, HSCHEME, HSUBROUTINE, HFILENAME, HFI
Definition: read_direct.F90:8
subroutine read_binllv(UG, U, USS, HPROGRAM, HSUBROUTINE, HFILENAME)
Definition: read_binllv.F90:8
subroutine read_direct_gauss(UG, U, USS, HPROGRAM, HSCHEME, HSUBROUTINE, HFILENA
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
real, dimension(:,:), allocatable xsumval
subroutine ini_ssowork(PMESHLENGTH, PDLAT, PDLON)
Definition: ini_ssowork.F90:7
subroutine read_binllvfast(UG, U, USS, HPROGRAM, HSUBROUTINE, HFILENAME)
subroutine read_ascllv(UG, U, USS, HPROGRAM, HSUBROUTINE, HFILENAME)
Definition: read_ascllv.F90:8
subroutine average2_mesh(PPGDARRAY)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
integer, dimension(:), allocatable nsize_task
logical lhook
Definition: yomhook.F90:15
integer, dimension(:,:), allocatable nsize
subroutine read_netcdf(UG, U, USS, HPROGRAM, HSUBROUTINE, HFILENAME, HNCVARNAME)
Definition: read_netcdf.F90:8
subroutine treat_bathyfield(UG, U, USS, HPROGRAM, HSCHEME, HFILETYPE, HSUBROUTINE, HFILENAME, HNCVARNAME, HFIELD, PPGDARRAY, HSFTYPE)
integer, dimension(:), allocatable nindex