SURFEX v8.1
General documentation of Surfex
init_io_surf_fan.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 init_io_surf_fa_n (DTCO, U, &
7  HPROGRAM,HMASK,HACTION)
8 ! ######################
9 !
10 !!**** *INIT_IO_SURF_FA* Keep in memory the output files
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !!
16 !!** IMPLICIT ARGUMENTS
17 !! ------------------
18 !! None
19 !!
20 !! REFERENCE
21 !! ---------
22 !!
23 !! AUTHOR
24 !! ------
25 !! V. Masson *Meteo France*
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !!
30 !! P. Le Moigne 04/2004: distinguish in and out file name
31 !! P. Le Moigne 04/2006: special HACTION='GTMSK' to initialize
32 !! a mask different of 'FULL ' in order
33 !! to read dimensions only.
34 !! B. Decharme 2008 : Change to switch between offline and online run
35 !! In online run, the mask must be always global
36 !! B. Decharme 2013 : Allocate work variables to write in FA in AROME case
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 !
42 !
43 !
45 USE modd_surf_atm_n, ONLY : surf_atm_t
46 !
47 USE modd_surfex_mpi, ONLY : nrank, nindex, npio, nsize
48 !
49 USE modd_csts, ONLY : xpi
50 !
55 !
56 !
57 USE modi_abor1_sfx
58 USE modi_get_luout
60 USE modi_get_dim_full_n
61 USE modi_get_size_full_n
62 USE modi_get_type_dim_n
63 USE modi_get_surf_mask_n
64 USE modi_get_1d_mask
65 !
66 USE yomhook ,ONLY : lhook, dr_hook
67 USE parkind1 ,ONLY : jprb
68 !
69 IMPLICIT NONE
70 !
71 !
72 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
73 TYPE(surf_atm_t), INTENT(INOUT) :: U
74 !
75  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM
76  CHARACTER(LEN=6), INTENT(IN) :: HMASK
77  CHARACTER(LEN=5), INTENT(IN) :: HACTION
78 !
79 INTEGER :: ILU, IRET, IL
80 !
81 INTEGER :: INB ! number of articles in the file
82 INTEGER :: ITYPTR, ITRONC, INLATI, INXLON, INIVER
83 INTEGER, DIMENSION (1000) :: INLOPA, INOZPA
84 !
85 REAL, DIMENSION (1000) :: ZSINLA
86 REAL, DIMENSION (200) :: ZAHYBR, ZBHYBR
87 REAL :: ZSLAPO, ZCLOPO, ZSLOPO, ZCODIL, ZREFER
88 LOGICAL :: LOUTFAC
89 !
90 REAL(KIND=JPRB) :: ZHOOK_HANDLE
91 !
92 !------------------------------------------------------------------------------
93 !
94 IF (lhook) CALL dr_hook('INIT_IO_SURF_FA_N',0,zhook_handle)
95 !
96 IF(hprogram/='FA '.AND.hprogram/='AROME ') THEN
97  CALL abor1_sfx('INIT_IO_SURF_FA_N -- HPROGRAM should be FA or AROME')
98 ENDIF
99 !
100  CALL get_luout(hprogram,nluout)
101 !
102 nunit_fa = 19
103 !
104 lopen=.false.
105 !
106 IF (haction=='GTMSK') THEN
107  IF (nrank==npio) THEN
108  CALL faitou(iret,nunit_fa,.true.,cfilein_fa,'OLD',.true.,.false.,iverbfa,0,inb,cdnomc)
109  WRITE(nluout,*)'HPROGRAM ',hprogram,' IO_INIT HACTION==GTMSK',nunit_fa,cfilein_fa
110  lopen=.true.
111  ENDIF
112  cmask = hmask
114  IF (lhook) CALL dr_hook('INIT_IO_SURF_FA_N',1,zhook_handle)
115  RETURN
116 ENDIF
117 !
118 IF (haction == 'READ ') THEN
119  CALL faitou(iret,nunit_fa,.true.,cfilein_fa,'OLD',.true.,.false.,iverbfa,0,inb,cdnomc)
120  WRITE(nluout,*)'HPROGRAM ',hprogram,' IO_INIT HACTION==READ',nunit_fa,cfilein_fa
121  CALL facage(cdnomc,.true.)
122  lopen=.true.
123  !
125  !
126  IF (hmask /= 'EXTZON') THEN
127  cmask = 'FULL '
128  CALL read_surf(&
129  hprogram,'DIM_FULL',nfull,iret,hdir='A')
130  !
131  nfull_ext = nfull
132  IF (hprogram=='AROME ') THEN
133  u%NDIM_FULL = nfull
134  ENDIF
135  ENDIF
136  !
137 ELSE
138  ! NFULL must be known in every case.
139  CALL get_dim_full_n(u%NDIM_FULL, nfull)
140  !
142 ENDIF
143 !
144 IF (hmask == 'EXTZON') THEN
145  IF (nrank==npio) THEN
146  CALL facies(cdnomc, ityptr, zslapo, zclopo, zslopo, &
147  zcodil, itronc, inlati, inxlon, inlopa, &
148  inozpa, zsinla, iniver, zrefer, zahybr, &
149  zbhybr, loutfac)
150  nfull_ext = inlati*inxlon
151  ndgl = inlati
152  ndlon = inxlon
153  nfull = inlopa(4)*inlopa(6)
154  ndlux = inlopa(4)
155  ndgux = inlopa(6)
156  pebeta = zslapo
157  perpk = zsinla(2)
158  pelon0 = zsinla(3)*180./xpi
159  pelat0 = zsinla(4)*180./xpi
160  pedelx = zsinla(7)
161  pedely = zsinla(8)
162  pelon1 = zsinla(13)*180./xpi
163  pelat1 = zsinla(14)*180./xpi
164  ENDIF
165 ENDIF
166 !
167 IF (.NOT.ALLOCATED(nindex).AND.nrank==npio) THEN
168  ALLOCATE(nindex(nfull))
169  nindex(:) = 0
170 ELSEIF (hmask /= 'EXTZON') THEN
171  CALL get_dim_full_n(u%NDIM_FULL,nfull)
172 ENDIF
173 !
174 !------------------------------------------------------------------------------
175 CMASK=HMASK
176 !------------------------------------------------------------------------------
177 !
178 IF (hprogram=='AROME ') THEN
179  nfull = u%NDIM_FULL
180  ilu = nfull
181  il = nfull
182  nsize = nfull
183 ELSE
184  CALL get_size_full_n(hprogram,nfull,u%NSIZE_FULL,ilu)
185  IF (ilu>nsize) nsize = ilu
186  il = ilu
187  CALL get_type_dim_n(dtco, u, &
188  hmask,il)
189 ENDIF
190 !
191  CALL get_mask(ilu,il)
192 !
193 !------------------------------------------------------------------------------
194 IF (lhook) CALL dr_hook('INIT_IO_SURF_FA_N',1,zhook_handle)
195 !------------------------------------------------------------------------------
196 !
197 CONTAINS
198 !
199 SUBROUTINE get_mask(KLU,KL)
200 !
201 USE modd_mask, ONLY: nmask_full
202 USE modd_io_surf_fa, ONLY: nmask
203 !
204 IMPLICIT NONE
205 !
206 INTEGER, INTENT(INOUT) :: KLU
207 INTEGER, INTENT(IN) :: KL
208 !
209 REAL, DIMENSION(KL) :: ZFULL
210 INTEGER, DIMENSION(KL) :: IMASK
211 REAL(KIND=JPRB) :: ZHOOK_HANDLE
212 !
213 IF (lhook) CALL dr_hook('INIT_IO_SURF_FA_N:GET_MASK',0,zhook_handle)
214 !
215 IF (hprogram=='AROME ') THEN
216  zfull = 1.
217  CALL get_1d_mask(klu,klu,zfull,imask)
218  IF (ALLOCATED(nmask_full)) THEN
219  IF (klu>SIZE(nmask_full)) DEALLOCATE(nmask_full)
220  ENDIF
221 ELSE
222  CALL get_surf_mask_n(dtco, u, &
223  hmask,kl,imask,klu,nluout)
224  IF (ALLOCATED(nmask_full)) THEN
225  IF (kl>SIZE(nmask_full)) DEALLOCATE(nmask_full)
226  ENDIF
227 ENDIF
228 !
229 IF (.NOT.ALLOCATED(nmask_full)) ALLOCATE(nmask_full(klu))
230 !
231 nmask_full(1:kl) = imask(:)
232 !
233 nmask => nmask_full(1:kl)
234 !
235 IF (lhook) CALL dr_hook('INIT_IO_SURF_FA_N:GET_MASK',1,zhook_handle)
236 !
237 END SUBROUTINE get_mask
238 !
239 END SUBROUTINE init_io_surf_fa_n
240 
subroutine get_type_dim_n(DTCO, U, HTYPE, KDIM)
character(len=28), save cfileout_fa
subroutine get_dim_full_n(KDIM_FULL_IN, KDIM_FULL_OUT)
character(len=28), save cfile_fa
real, save xpi
Definition: modd_csts.F90:43
subroutine init_io_surf_fa_n(DTCO, U, HPROGRAM, HMASK, HACTION)
subroutine get_size_full_n(HPROGRAM, KDIM_FULL, KSIZE_FULL_IN, KSIZE
integer, dimension(:), allocatable, target nmask_full
Definition: modd_mask.F90:37
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_mask(KLU, YTYPE, IMASK)
character(len=6), save cdnomc
character(len=6) cmask
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine get_1d_mask(KSIZE, KFRAC, PFRAC, KMASK)
Definition: get_1d_mask.F90:6
logical lhook
Definition: yomhook.F90:15
subroutine facage(CDNOMC, LDGARD)
Definition: facage.F90:169
subroutine facies(CDNOMC, KTYPTR, PSLAPO, PCLOPO, PSLOPO, PCODIL, KTRONC, KNLATI, KNXLON, KNLOPA, KNOZPA, PSINLA, KNIVER, PREFER, PAHYBR, PBHYBR, LDGARD)
Definition: facies.F90:276
integer, dimension(:), allocatable nindex
character(len=28), save cfilein_fa
integer, dimension(:), pointer nmask
subroutine faitou(KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC)
Definition: faitou.F90:740