SURFEX v8.1
General documentation of Surfex
prep_flake_extern.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 prep_flake_extern (GCP,HPROGRAM,HSURF,HFILE,HFILETYPE,HFILEPGD,HFILEPGDTYPE,KLUOUT,PFIELD)
7 ! #################################################################################
8 !
9 !
11 !
12 USE modd_surfex_mpi, ONLY : nrank,npio
14 !
15 USE modi_prep_grid_extern
17 USE modi_open_aux_io_surf
18 USE modi_close_aux_io_surf
19 USE modi_abor1_sfx
20 USE modi_get_luout
21 !
23 USE modd_surf_par, ONLY : xundef
24 !
25 USE yomhook ,ONLY : lhook, dr_hook
26 USE parkind1 ,ONLY : jprb
27 !
28 IMPLICIT NONE
29 !
30 !* 0.1 declarations of arguments
31 !
32 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
33 !
34  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
35  CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field
36  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! name of file
37  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! type of input file
38  CHARACTER(LEN=28), INTENT(IN) :: HFILEPGD ! name of file
39  CHARACTER(LEN=6), INTENT(IN) :: HFILEPGDTYPE ! type of input file
40 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
41 REAL,DIMENSION(:,:), POINTER :: PFIELD ! field to interpolate horizontally
42 !
43 !* 0.2 declarations of local variables
44 !
45 !
46 REAL, DIMENSION(:), ALLOCATABLE :: ZMASK
47 !
48  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be read
49 INTEGER :: IRESP ! reading return code
50 INTEGER :: ILUOUT
51 !
52 INTEGER :: IVERSION ! total 1D dimensio
53 INTEGER :: INI ! total 1D dimension
54  CHARACTER(LEN=6) :: YWATER ! lake scheme
55 INTEGER :: IDIM_WATER ! number of water points
56 REAL(KIND=JPRB) :: ZHOOK_HANDLE
57 !
58 !-------------------------------------------------------------------------------------
59 !
60 !* 1. Preparation of IO for reading in the file
61 ! -----------------------------------------
62 !
63 !* Note that all points are read, even those without physical meaning.
64 ! These points will not be used during the horizontal interpolation step.
65 ! Their value must be defined as XUNDEF.
66 !
67 IF (lhook) CALL dr_hook('PREP_FLAKE_EXTERN',0,zhook_handle)
68 !
69  CALL open_aux_io_surf(hfilepgd,hfilepgdtype,'FULL ')
70 !
71  CALL read_surf(hfilepgdtype,'WATER',ywater,iresp,hdir='-')
72 !
73 !-------------------------------------------------------------------------------------
74 !
75 !* 2. Reading of grid
76 ! ---------------
77 !
78  CALL prep_grid_extern(gcp,hfilepgdtype,kluout,cingrid_type,cinterp_type,ini)
79 !
80  CALL read_surf(hfilepgdtype,'DIM_WATER',idim_water,iresp,hdir='-')
81 !
82 yrecfm='VERSION'
83  CALL read_surf(hfilepgdtype,yrecfm,iversion,iresp)
84 !
85 IF (nrank/=npio) ini = 0
86 !
87 ALLOCATE(zmask(ini))
88 IF (iversion>=7) THEN
89  yrecfm='FRAC_WATER'
90  CALL read_surf(hfilepgdtype,yrecfm,zmask,iresp,hdir='E')
91 ELSE
92  zmask(:) = 1.
93 ENDIF
94 !
95 IF (idim_water==0) THEN
96  CALL get_luout(hprogram,iluout)
97  WRITE(iluout,*) ' '
98  WRITE(iluout,*) 'No inland water data available in input file ',hfile
99  WRITE(iluout,*) 'Please change your input file '
100  WRITE(iluout,*) ' or '
101  WRITE(iluout,*) 'specify inland water temperature XTS_WATER_UNIF'
102  CALL abor1_sfx('PREP_FLAKE_EXTERN: No inland water data available in input file')
103 END IF
104 !
105 IF (nrank/=npio) ini = 0
106 !
107 !---------------------------------------------------------------------------------------
108 SELECT CASE(hsurf)
109 !---------------------------------------------------------------------------------------
110 !
111 !* 3. Orography
112 ! ---------
113 !
114  CASE('ZS ')
115  ALLOCATE(pfield(ini,1))
116  yrecfm='ZS'
117  CALL read_surf(hfilepgdtype,yrecfm,pfield(:,1),iresp,hdir='E')
118  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
119 !
120 !* 4. Sea surface temperature
121 ! -----------------------
122 !
123  CASE('TS ')
124  ALLOCATE(pfield(ini,1))
125  yrecfm='TS_WATER'
126  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
127  CALL open_aux_io_surf(hfile,hfiletype,'WATER ')
128  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
129  CALL close_aux_io_surf(hfile,hfiletype)
130  WHERE (zmask(:)==0.) pfield(:,1) = xundef
131 !
132 END SELECT
133 !
134 !* 5. FLake variables
135 ! -----------------------
136 !
137 IF (hsurf/='ZS ' .AND. hsurf/='TS ') THEN
138 
139  CALL close_aux_io_surf(hfilepgd,hfilepgdtype)
140 
141  IF (ywater=='FLAKE ') THEN
142 
143  CALL open_aux_io_surf(hfile,hfiletype,'WATER ')
144 
145  SELECT CASE(hsurf)
146 
147  CASE('T_SNOW ')
148  ALLOCATE(pfield(ini,1))
149  yrecfm='T_SNOW '
150  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
151 !
152  CASE('T_ICE ')
153  ALLOCATE(pfield(ini,1))
154  yrecfm='T_ICE '
155  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
156 !
157  CASE('T_MNW ')
158  ALLOCATE(pfield(ini,1))
159  yrecfm='T_MNW '
160  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
161 !
162  CASE('T_BOT ')
163  ALLOCATE(pfield(ini,1))
164  yrecfm='T_BOT '
165  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
166 !
167  CASE('T_B1 ')
168  ALLOCATE(pfield(ini,1))
169  yrecfm='T_B1 '
170  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
171 !
172  CASE('H_SNOW ')
173  ALLOCATE(pfield(ini,1))
174  yrecfm='H_SNOW '
175  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
176 !
177  CASE('H_ICE ')
178  ALLOCATE(pfield(ini,1))
179  yrecfm='H_ICE '
180  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
181 !
182  CASE('H_ML ')
183  ALLOCATE(pfield(ini,1))
184  yrecfm='H_ML '
185  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
186 !
187  CASE('H_B1 ')
188  ALLOCATE(pfield(ini,1))
189  yrecfm='H_B1 '
190  CALL read_surf(hfiletype,yrecfm,pfield(:,1),iresp,hdir='E')
191 !
192 !---------------------------------------------------------------------------------------
193  END SELECT
194 
195  WHERE (zmask(:)==0.) pfield(:,1) = xundef
196  CALL close_aux_io_surf(hfile,hfiletype)
197 
198  ELSE
199 !* no Flake field in the input file
200  ALLOCATE(pfield(ini,1))
201  pfield = xundef
202  END IF
203 END IF
204 !-------------------------------------------------------------------------------------
205 !
206 DEALLOCATE(zmask)
207 !
208 !* 6. End of IO
209 ! ---------
210 !
211 IF (lhook) CALL dr_hook('PREP_FLAKE_EXTERN',1,zhook_handle)
212 !
213 !---------------------------------------------------------------------------------------
214 !
215 END SUBROUTINE prep_flake_extern
character(len=10) cingrid_type
Definition: modd_prep.F90:39
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine prep_grid_extern(GCP, HFILETYPE, KLUOUT, HGRIDTYPE, HINTER
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine prep_flake_extern(GCP, HPROGRAM, HSURF, HFILE, HFILETYPE, HFILEPGD, HFILEPGDTYPE, KLUOUT, PFIELD)
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK, HDIR)