SURFEX v8.1
General documentation of Surfex
ol_read_atm_conf_ascii.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 ol_read_atm_conf_ascii (DTCO, U, HSURF_FILETYPE, HFORCING_FILETYPE, &
7  PDURATION, PTSTEP_FORC, KNI, &
8  KYEAR, KMONTH, KDAY, PTIME, &
9  PLAT, PLON, PZS, &
10  PZREF, PUREF )
11 !
12 !==================================================================
13 !!**** *OL_READ_ATM_CONF* - Initialization routine
14 !!
15 !! PURPOSE
16 !! -------
17 !!
18 !!** METHOD
19 !! ------
20 !!
21 !! EXTERNAL
22 !! --------
23 !!
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !! REFERENCE
29 !! ---------
30 !!
31 !!
32 !! AUTHOR
33 !! ------
34 !! F. Habets *Meteo France*
35 !!
36 !! MODIFICATIONS
37 !! -------------
38 !! Original 01/2004
39 !! Modified by P. Le Moigne (04/2005): cleaning and checking
40 !! Modified by P. Le Moigne (04/2006): init_io_surf for nature
41 !! with GTMSK to read dimensions.
42 !==================================================================
43 !
45 USE modd_surf_atm_n, ONLY : surf_atm_t
46 !
48 !
50 !
51 USE modd_arch, ONLY : little_endian_arch
52 USE modd_io_surf_asc, ONLY : nni_forc
53 !
54 USE modi_get_luout
55 USE modi_init_io_surf_n
57 USE modi_end_io_surf_n
58 USE modi_get_size_full_n
60 USE modi_abor1_sfx
61 !
62 USE modi_set_surfex_filein
63 !
64 USE yomhook ,ONLY : lhook, dr_hook
65 USE parkind1 ,ONLY : jprb
66 !
67 IMPLICIT NONE
68 !
69 #ifdef SFX_MPI
70 include 'mpif.h'
71 #endif
72 !
73 !
74 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
75 TYPE(surf_atm_t), INTENT(INOUT) :: U
76 !
77  CHARACTER(LEN=6), INTENT(IN) :: HSURF_FILETYPE
78  CHARACTER(LEN=6), INTENT(IN) :: HFORCING_FILETYPE
79 INTEGER, INTENT(OUT) :: KNI
80 INTEGER, INTENT(OUT) :: KYEAR, KMONTH, KDAY
81 REAL, INTENT(OUT) :: PDURATION,PTSTEP_FORC
82 REAL, INTENT(OUT) :: PTIME
83 REAL, DIMENSION(:), POINTER :: PLAT, PLON
84 REAL, DIMENSION(:), POINTER :: PZS
85 REAL, DIMENSION(:), POINTER :: PZREF, PUREF
86 !
87 REAL, DIMENSION(:), ALLOCATABLE :: ZWORK
88 REAL :: ZWORK0
89 REAL :: ZTIME
90  CHARACTER(LEN=1) :: YSWAP
91 type(date_time) :: ttime
92 INTEGER :: INI, IDIM_FULL
93 INTEGER :: IYEAR, IMONTH, IDAY
94 INTEGER :: ILUOUT
95 INTEGER :: IRET, INB_FORC
96 INTEGER :: INFOMPI
97 DOUBLE PRECISION :: XTIME0
98 REAL(KIND=JPRB) :: ZHOOK_HANDLE
99 !
100 !==================================================================
101 !
102 IF (lhook) CALL dr_hook('OL_READ_ATM_CONF_ASCII',0,zhook_handle)
103 !
104 IF (nrank==npio) THEN
105  !
106  CALL get_luout(hsurf_filetype,iluout)
107  !
108 #ifdef SFX_MPI
109  xtime0 = mpi_wtime()
110 #endif
111  !
112  !* 1. Define configuration parameters
113  !
114  yswap='N'
115  IF (hforcing_filetype == 'BINARY') READ(21,*) yswap
116  IF (yswap.EQ.'Y') THEN
118  WRITE(iluout,*) '*******************************************************************'
119  WRITE(iluout,*) 'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', &
121  WRITE(iluout,*) '*******************************************************************'
122  ENDIF
123  !
124  READ(21,*) ini
125  nni_forc = ini
126  !
127  READ(21,*) inb_forc
128  READ(21,*) ptstep_forc
129  pduration = ( inb_forc - 1 ) * ptstep_forc
130  !
131  READ(21,*) iyear
132  READ(21,*) imonth
133  READ(21,*) iday
134  READ(21,*) ztime
135  !
136 #ifdef SFX_MPI
137  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
138 #endif
139  !
140 ENDIF
141 !
142 IF (nproc>1) THEN
143 #ifdef SFX_MPI
144  xtime0 = mpi_wtime()
145  CALL mpi_bcast(ptstep_forc,kind(ptstep_forc)/4,mpi_real,npio,ncomm,infompi)
146  CALL mpi_bcast(pduration,kind(pduration)/4,mpi_real,npio,ncomm,infompi)
147  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
148 #endif
149 ENDIF
150 !
151 !* 2. Read full grid dimension and date
152 !
153  CALL set_surfex_filein(hsurf_filetype,'PREP')
154  CALL init_io_surf_n(dtco, u, hsurf_filetype,'FULL ','SURF ','READ ')
155 !
156  CALL read_surf(hsurf_filetype,'DIM_FULL',idim_full,iret)
157  CALL read_surf(hsurf_filetype,'DTCUR',ttime,iret)
158 !
159  CALL end_io_surf_n(hsurf_filetype)
160 !
161 kyear = ttime%TDATE%YEAR
162 kmonth = ttime%TDATE%MONTH
163 kday = ttime%TDATE%DAY
164 ptime = ttime%TIME
165 !
166 !* 4. Geographical initialization
167 !
168  CALL get_size_full_n('OFFLIN ',idim_full,u%NSIZE_FULL,kni)
169 !
170 ALLOCATE(plon(kni))
171 ALLOCATE(plat(kni))
172 ALLOCATE(pzs(kni))
173 ALLOCATE(pzref(kni))
174 ALLOCATE(puref(kni))
175 !
176 IF (nrank==npio) THEN
177  ALLOCATE(zwork(idim_full))
178 ELSE
179  ALLOCATE(zwork(0))
180 ENDIF
181 !
182 IF (nrank==npio) THEN
183  !
184 #ifdef SFX_MPI
185  xtime0 = mpi_wtime()
186 #endif
187  !
188  IF (ini==1) THEN
189  READ(unit=21,fmt='(F15.8)') zwork0
190  zwork(:) = zwork0
191  ELSE
192  READ(unit=21,fmt='(50(F15.8))') zwork
193  END IF
194  !
195 #ifdef SFX_MPI
196  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
197 #endif
198 ENDIF
199  CALL read_and_send_mpi(zwork,plon)
200 !
201 IF (nrank==npio) THEN
202  !
203 #ifdef SFX_MPI
204  xtime0 = mpi_wtime()
205 #endif
206  !
207  IF (ini==1) THEN
208  READ(unit=21,fmt='(F15.8)') zwork0
209  zwork(:) = zwork0
210  ELSE
211  READ(unit=21,fmt='(50(F15.8))') zwork
212  END IF
213  !
214 #ifdef SFX_MPI
215  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
216 #endif
217 ENDIF
218  CALL read_and_send_mpi(zwork,plat)
219 !
220 IF (nrank==npio) THEN
221  !
222 #ifdef SFX_MPI
223  xtime0 = mpi_wtime()
224 #endif
225  !
226  IF (ini==1) THEN
227  READ(unit=21,fmt='(F15.8)') zwork0
228  zwork(:) = zwork0
229  ELSE
230  READ(unit=21,fmt='(50(F15.8))') zwork
231  END IF
232  !
233 #ifdef SFX_MPI
234  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
235 #endif
236 ENDIF
237  CALL read_and_send_mpi(zwork,pzs)
238 !
239 IF (nrank==npio) THEN
240  !
241 #ifdef SFX_MPI
242  xtime0 = mpi_wtime()
243 #endif
244  !
245  IF (ini==1) THEN
246  READ(unit=21,fmt='(F15.8)') zwork0
247  zwork(:) = zwork0
248  ELSE
249  READ(unit=21,fmt='(50(F15.8))') zwork
250  END IF
251  !
252 #ifdef SFX_MPI
253  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
254 #endif
255 ENDIF
256  CALL read_and_send_mpi(zwork,pzref)
257 !
258 IF (nrank==npio) THEN
259  !
260 #ifdef SFX_MPI
261  xtime0 = mpi_wtime()
262 #endif
263  !
264  IF (ini==1) THEN
265  READ(unit=21,fmt='(F15.8)') zwork0
266  zwork(:) = zwork0
267  ELSE
268  READ(unit=21,fmt='(50(F15.8))') zwork
269  END IF
270  !
271 #ifdef SFX_MPI
272  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
273 #endif
274 ENDIF
275  CALL read_and_send_mpi(zwork,puref)
276 !
277 DEALLOCATE(zwork)
278 !
279 !* 3. Check the consistency
280 !
281 IF (nrank==npio) THEN
282  !
283  IF (idim_full /= ini .AND. ini/=1) THEN
284  WRITE(iluout,*)' NUMBER OF GRID POINTS INCONSISTENCY: ',kni,'/',ini
285  CALL abor1_sfx('OL_READ_ATM_CONF_ASCII: NUMBER OF GRID POINTS INCONSISTENCY')
286  ENDIF
287  !
288  ! check date and time
289  !
290  IF ( (kyear /= iyear) .OR. (kmonth /= imonth) .OR. (kday /= iday) ) THEN
291  WRITE(iluout,*)' DATE INCONSISTANCY: ',kyear,kmonth,kday,'/',iyear,imonth,iday
292  CALL abor1_sfx('OL_READ_ATM_CONF_ASCII: DATE INCONSISTENCY')
293  ENDIF
294  !
295  IF ( ptime /= ztime ) THEN
296  WRITE(iluout,*)' TIME INCONSISTANCY: ',ptime,'/',ztime
297  CALL abor1_sfx('OL_READ_ATM_CONF_ASCII: TIME INCONSISTENCY')
298  ENDIF
299  !
300 ENDIF
301 !
302 IF (lhook) CALL dr_hook('OL_READ_ATM_CONF_ASCII',1,zhook_handle)
303 !
304 END SUBROUTINE ol_read_atm_conf_ascii
subroutine set_surfex_filein(HPROGRAM, HMASK)
subroutine get_size_full_n(HPROGRAM, KDIM_FULL, KSIZE_FULL_IN, KSIZE
subroutine ol_read_atm_conf_ascii(DTCO, U, HSURF_FILETYPE, HFORCING_FILETYPE, PDURATION, PTSTEP_FORC, KNI, KYEAR, KMONTH, KDAY, PTIME, PLAT, PLON, PZS, PZREF, PUREF)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:7
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION
logical, dimension(nnwl), parameter little_endian_arch
Definition: modd_arch.F90:33