SURFEX v8.1
General documentation of Surfex
prep.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 PROGRAM prep
7 !------------------------
8 !!
9 !! PURPOSE
10 !! -------
11 !! This program prepares the initial file for offline run
12 !!
13 !! METHOD
14 !! ------
15 !!
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! P. LeMoigne Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 22/04/04
37 !!
38 !----------------------------------------------------------------------------
39 !
40 USE mode_pos_surf
41 !
44 USE modd_surfex_omp, ONLY : nblocktot
45 !
47 !
52 USE modd_surf_par
53 USE modd_surf_conf, ONLY : csoftware
54 !
56 !
57 USE modd_sfx_oasis, ONLY : loasis
58 !
59 USE mode_prep_ctl, ONLY : prep_ctl
60 !
61 USE modi_open_namelist
62 USE modi_close_namelist
63 USE modi_read_all_namelists
64 USE modi_get_luout
65 !
66 USE modi_init_pgd_surf_atm
67 USE modi_io_buff_clean
68 USE modi_prep_surf_atm
69 USE modi_write_diag_surf_atm_n
70 USE modi_write_header_mnh
71 USE modi_write_surf_atm_n
72 !
73 USE modi_get_lonlat_n
74 USE modi_flag_update
75 USE modi_abor1_sfx
76 !
77 USE modi_sfx_oasis_init
78 USE modi_sfx_oasis_read_nam
79 USE modi_sfx_oasis_prep_ol
80 USE modi_sfx_oasis_end
81 !
82 USE modi_init_output_nc_n
83 USE modi_init_index_mpi
84 !
85 !------------------------------------------------------------------------------
86 !
87 #ifdef SFX_MPI
88 #ifdef SFX_MPL
90 #endif
91 #endif
92 USE yomhook ,ONLY : lhook, dr_hook
93 USE parkind1 ,ONLY : jprb
94 !
97 !
98 IMPLICIT NONE
99 !
100 #ifndef AIX64
101 !$ INCLUDE 'omp_lib.h'
102 #endif
103 !
104 #ifdef SFX_MPI
105 include 'mpif.h'
106 #endif
107 !
108 !* 0. Declaration of local variables
109 ! ------------------------------
110 !
111 INTEGER :: ILUOUT
112 INTEGER :: ILUNAM
113 INTEGER :: IYEAR, IMONTH, IDAY
114 REAL :: ZTIME
115 LOGICAL :: GFOUND
116 
117 REAL, DIMENSION(0) :: ZZS
118  CHARACTER(LEN=28) :: YATMFILE =' ' ! name of the Atmospheric file
119  CHARACTER(LEN=6) :: YATMFILETYPE =' ' ! type of the Atmospheric file
120  CHARACTER(LEN=28) :: YPGDFILE =' ' ! name of the pgd file
121  CHARACTER(LEN=6) :: YPGDFILETYPE =' ' ! type of the pgd file
122  CHARACTER(LEN=28) :: YLUOUT ='LISTING_PREP ' ! name of listing
123  CHARACTER(LEN=100) :: YNAME
124 !
125 INTEGER, DIMENSION(11) :: IDATEF
126 !
127 type(prep_ctl) :: ylctl
128 !
129 #ifdef SFX_MPI
130 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
131 #endif
132 INTEGER :: ILEVEL, INFOMPI
133 INTEGER :: JNW, INW
134 INTEGER :: IRET, INB, JPROC
135 DOUBLE PRECISION :: XTIME0
136 REAL(KIND=JPRB) :: ZHOOK_HANDLE
137 !
138 !------------------------------------------------------------------------------
139 !
140 !
141 !* 1. Set default names and parallelized I/O
142 ! --------------------------------------
143 !
144 !Must be call before DRHOOK !
145  CALL sfx_oasis_init(cnamelist,ncomm,'PRE')
146 #ifdef SFX_MPI
147 #ifdef SFX_MPL
148 IF(loasis)THEN
149  lmplusercomm = .true.
151 ENDIF
152 #endif
153 #endif
154 !
155 #ifdef SFX_MPI
156 IF(.NOT.loasis)THEN
157  CALL mpi_init_thread(mpi_thread_multiple,ilevel,infompi)
158  IF (infompi /= mpi_success) THEN
159  CALL abor1_sfx('OFFLINE: ERROR WHEN INITIALIZING MPI')
160  ENDIF
161  ncomm = mpi_comm_world
162 ENDIF
163  CALL mpi_comm_size(ncomm,nproc,infompi)
164  CALL mpi_comm_rank(ncomm,nrank,infompi)
165 #endif
166 !
167 IF (lhook) CALL dr_hook('PREP',0,zhook_handle)
168 !
169 ! Allocations of Surfex Types
170  CALL surfex_alloc_list(1)
171 !
172 csoftware='PREP'
173 !
174 ! 1.1 initializations
175 ! ---------------
176 !
177 iyear = nundef
178 imonth = nundef
179 iday = nundef
180 ztime = xundef
181 !
182 lprep = .true.
183 !
184 ! 1.2 output listing
185 ! --------------
186 !
187 IF (nrank>=10) THEN
188  WRITE(yname,fmt='(A15,I2)') trim(yluout),nrank
189 ELSE
190  WRITE(yname,fmt='(A15,I1)') trim(yluout),nrank
191 ENDIF
192 !
193 cluout_lfi = adjustl(adjustr(yname)//'.txt')
194 cluout_nc = adjustl(adjustr(yname)//'.txt')
195  CALL get_luout('ASCII ',iluout)
196 OPEN (unit=iluout,file=adjustl(adjustr(yname)//'.txt'),form='FORMATTED',action='WRITE')
197 !
198 ! 1.3 output file name read in namelist
199 ! ---------------------------------
200 !
201  CALL open_namelist('ASCII ',ilunam,cnamelist)
202 !
203  CALL posnam(ilunam,'NAM_IO_OFFLINE',gfound)
204 IF (gfound) READ (unit=ilunam,nml=nam_io_offline)
205 !
206  cfilepgd = adjustl(adjustr(cpgdfile)//'.txt')
207  cfilepgd_fa = adjustl(adjustr(cpgdfile)//'.fa')
209  cfilepgd_nc = adjustl(adjustr(cpgdfile)//'.nc')
210  !
211  cfilein = adjustl(adjustr(cpgdfile)//'.txt') ! output of PGD program
212  cfilein_fa = adjustl(adjustr(cpgdfile)//'.fa')
214  cfilein_nc = adjustl(adjustr(cpgdfile)//'.nc')
215  !
220  !
221  cfileout = adjustl(adjustr(cprepfile)//'.txt')
222  cfileout_fa = adjustl(adjustr(cprepfile)//'.fa')
224  cfileout_nc = adjustl(adjustr(cprepfile)//'.nc')
225  !
226  CALL close_namelist('ASCII ',ilunam)
227 !
228 ! Reading all namelist (also assimilation)
229  ysc => ysurf_list(1)
230  CALL read_all_namelists(ysc, csurf_filetype,'PRE',.false.)
231 !
232 !* 1.4. Reads SFX - OASIS coupling namelists
233 ! ------------------------------------
234 !
236 !
237 !* 1.5. Goto model of Surfex Types
238 ! ---------------------------
239 !
240  icurrent_model = 1
241 !
242 !* 2. Preparation of surface physiographic fields
243 ! -------------------------------------------
244 !
245 !$OMP PARALLEL
246 !$ NBLOCKTOT = OMP_GET_NUM_THREADS()
247 !$OMP END PARALLEL
248 !
249  CALL prep_log_mpi
250 !
251  CALL wlog_mpi(' ')
252 !
253  CALL wlog_mpi('NBLOCKTOT ',klog=nblocktot)
254 !
255 #ifdef SFX_MPI
256 xtime0 = mpi_wtime()
257 #endif
258 !
259  CALL init_index_mpi(ysc%DTCO,ysc%U,ysc%UG,ysc%GCP,csurf_filetype,'PRE',yalg_mpi,xio_frac)
260 !
261  CALL io_buff_clean
262  CALL init_pgd_surf_atm(ysc, csurf_filetype,'PRE',yatmfile,yatmfiletype, &
263  iyear, imonth, iday, ztime)
264 !
265  CALL io_buff_clean
266  CALL prep_surf_atm(ysc,csurf_filetype,yatmfile,yatmfiletype,ypgdfile,ypgdfiletype,ylctl)
267 !
268 !* 3. Preparation of SFX-OASIS grid, mask, areas files
269 ! ------------------------------------------------
270 !
271 IF(loasis)THEN
272  CALL sfx_oasis_prep_ol(ysc%IM%O, ysc%IM%S, ysc%UG, ysc%U, csurf_filetype,yalg_mpi)
273 ENDIF
274 !
275 !* 4. Store of surface physiographic fields
276 ! -------------------------------------
277 !
278  CALL flag_update(ysc%IM%ID%O, ysc%DUO, .false.,.true.,.false.,.false.)
279 !
280 !* opens the file
281 IF (nrank==npio) THEN
282  IF (csurf_filetype=='FA ') THEN
283 #ifdef SFX_FA
284  lfanocompact = .true.
285  nunit_fa = 19
286  idatef(1)=ysc%U%TTIME%TDATE%YEAR
287  idatef(2)=ysc%U%TTIME%TDATE%MONTH
288  idatef(3)=ysc%U%TTIME%TDATE%DAY
289  idatef(4)=nint(ysc%U%TTIME%TIME/3600.)
290  idatef(5)=nint(ysc%U%TTIME%TIME/60.) - idatef(4) * 60
291  idatef(6)=1
292  idatef(7:11)=0
293  CALL faitou(iret,nunit_fa,.true.,cfileout_fa,'NEW',.true.,.false.,iverbfa,0,inb,cdnomc)
294  CALL fandar(iret,nunit_fa,idatef)
295 #endif
296  ENDIF
297 END IF
298 !
299 ALLOCATE(ysc%DUO%CSELECT(0))
300 !
301 ldef = .true.
302 !
303 IF (csurf_filetype=="NC ") THEN
304  CALL init_output_nc_n (ysc%TM%BDD, ysc%CHE, ysc%CHN, ysc%CHU, &
305  ysc%SM%DTS, ysc%TM%DTT, ysc%DTZ, ysc%IM, &
306  ysc%UG, ysc%U, ysc%DUO%CSELECT)
307 ENDIF
308 !
309 inw = 1
310 IF (csurf_filetype=="NC ") inw = 2
311 !
312 lfirst_write = .true.
313 ncpt_write = 0
314 !
315 DO jnw = 1,inw
316  !
317  IF (lwrite_coord) CALL get_lonlat_n(ysc%DTCO, ysc%U, ysc%UG, ysc%DUO%CSELECT, csurf_filetype)
318  !
319  !* writes into the file
320  CALL io_buff_clean
321  !
322  ! FLAG_UPDATE now in WRITE_PGD_SURF_ATM_n
323  CALL write_surf_atm_n(ysc, csurf_filetype,'PRE',lland_use) !no pgd field
325  !
326  ldef = .false.
327  lfirst_write = .false.
328  ncpt_write = 0
329  CALL io_buff_clean
330  !
331 ENDDO
332 !
333 !* closes the file
334 IF (nrank==npio) THEN
335  IF (csurf_filetype=='FA ') THEN
336 #ifdef SFX_FA
337  CALL fairme(iret,nunit_fa,'UNKNOWN')
338 #endif
339  END IF
340  !
341  !* add informations in the file
342  IF (csurf_filetype=='LFI ' .AND. lmnh_compatible) CALL write_header_mnh
343  !
344  !
345  !* 4. Close parallelized I/O
346  ! ----------------------
347  !
348  WRITE(iluout,*) ' '
349  WRITE(iluout,*) ' -----------------------'
350  WRITE(iluout,*) ' | PREP ENDS CORRECTLY |'
351  WRITE(iluout,*) ' -----------------------'
352  !
353  WRITE(*,*) ' '
354  WRITE(*,*) ' -----------------------'
355  WRITE(*,*) ' | PREP ENDS CORRECTLY |'
356  WRITE(*,*) ' -----------------------'
357  !
358  CLOSE(iluout)
359  !
360 ENDIF
361 !
362  CALL surfex_deallo_list
363 !
364 IF (ALLOCATED(nindex)) DEALLOCATE(nindex)
365 IF (ALLOCATED(nnum)) DEALLOCATE(nnum)
366 IF (ALLOCATED(nsize_task)) DEALLOCATE(nsize_task)
367 !
368  CALL end_log_mpi
369 !
370 IF (lhook) CALL dr_hook('PREP',1,zhook_handle)
371 !
372 ! * OASIS must be finalized after the last DR_HOOK call
373 !
374 IF(loasis)THEN
375  CALL sfx_oasis_end
376 ELSE
377 #ifdef SFX_MPI
378  CALL mpi_finalize(infompi)
379 #endif
380 ENDIF
381 !
382 !-------------------------------------------------------------------------------
383 !
384 END PROGRAM prep
character(len=28) cnamelist
subroutine write_header_mnh
subroutine fairme(KREP, KNUMER, CDSTTU)
Definition: fairme.F90:232
integer(kind=jpim) mplusercomm
character(len=6) csurf_filetype
character(len=28), save cfileout_nc
subroutine prep_surf_atm(YSC, HPROGRAM, HATMFILE, HATMFILETYPE, HPGDFILE, HPGDFILETYPE, YDCTL)
subroutine sfx_oasis_prep_ol(IO, S, UG, U, HPROGRAM, HALG_MPI)
subroutine sfx_oasis_read_nam(HPROGRAM, PTSTEP_SURF, HINIT)
character(len=28), save cfileout_fa
subroutine get_lonlat_n(DTCO, U, UG, HSELECT, HPROGRAM)
Definition: get_lonlatn.F90:7
subroutine init_index_mpi(DTCO, U, UG, GCP, HPROGRAM, HINIT, HALG, PIO_FRAC, OSHADOWS)
subroutine io_buff_clean
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
character(len=28), save cfilein_lfi_save
character(len=28), save cluout_lfi
integer, dimension(:), allocatable nnum
character(len=28), save cfilepgd
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
character(len=28), save cfilein_save
subroutine write_diag_surf_atm_n(YSC, HPROGRAM, HWRITE)
subroutine surfex_deallo_list
integer, parameter jprb
Definition: parkind1.F90:32
character(len=28), save cluout_nc
subroutine end_log_mpi
character(len=28), save cfilein_fa_save
integer, parameter nundef
character(len=7) csoftware
character(len=6), save cdnomc
subroutine sfx_oasis_init(HNAMELIST, KLOCAL_COMM, HINIT)
subroutine flag_update(DIO, DUO, ONOWRITE_CANOPY, OPGD, OPROVAR_TO_DIAG, OSELE
Definition: flag_update.F90:8
type(surfex_t), pointer ysc
subroutine close_namelist(HPROGRAM, KLUNAM)
character(len=28), save cfilepgd_lfi
subroutine init_pgd_surf_atm(YSC, HPROGRAM, HINIT, HATMFILE, HATMFILETYPE, KYEAR, KMONTH, KDAY, PTIME)
subroutine read_all_namelists(YSC, HPROGRAM, HINIT, ONAM_READ)
subroutine init_output_nc_n(BDD, CHE, CHN, CHU, DTS, DTT, DTZ, IM
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine write_surf_atm_n(YSC, HPROGRAM, HWRITE, OLAND_USE)
subroutine sfx_oasis_end
character(len=28), save cfilepgd_fa
integer, dimension(:), allocatable nsize_task
logical lhook
Definition: yomhook.F90:15
logical, save lprep
character(len=28), save cfileout_lfi
type(surfex_t), dimension(:), allocatable, target, save ysurf_list
subroutine fandar(KREP, KNUMER, KDATEF)
Definition: fandar.F90:174
program prep
Definition: prep.F90:6
integer, dimension(:), allocatable nindex
subroutine surfex_alloc_list(KMODEL)
character(len=4) yalg_mpi
character(len=28), save cfileout
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
character(len=28), save cfilein
character(len=28), save cfilein_fa
logical, save lfanocompact
subroutine prep_log_mpi
character(len=28) cpgdfile
character(len=28), save cfilepgd_nc
character(len=28) cprepfile
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
character(len=28), save cfilein_lfi
character(len=28), save cfilein_nc_save
subroutine faitou(KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC)
Definition: faitou.F90:740
character(len=28), save cfilein_nc