SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
get_surf_maskn.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 get_surf_mask_n (DTCO, U, &
7  htype,kdim,kmask,klu,kluout)
8 ! #####################################################
9 !
10 !!**** *GET_SURF_MASK_n* - routine to define the masks between all surface
11 !! points and each of the four surface types
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !!** METHOD
17 !! -------
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !!
23 !! AUTHOR
24 !! ------
25 !! V. Masson *Meteo France*
26 !!
27 !! MODIFICATIONS
28 !! -------------
29 !! Original 01/2004
30 !-------------------------------------------------------------------------------
31 !
32 !* 0. DECLARATIONS
33 ! ------------
34 !
35 !
36 !
38 USE modd_surf_atm_n, ONLY : surf_atm_t
39 !
40 USE modd_surf_par, ONLY : nundef
41 !
42 USE modi_convert_cover_frac
43 !
44 !
45 USE yomhook ,ONLY : lhook, dr_hook
46 USE parkind1 ,ONLY : jprb
47 !
48 USE modi_abor1_sfx
49 !
50 USE modi_get_1d_mask
51 !
52 IMPLICIT NONE
53 !
54 !* 0.1 Declarations of arguments
55 ! -------------------------
56 !
57 !
58 TYPE(data_cover_t), INTENT(INOUT) :: dtco
59 TYPE(surf_atm_t), INTENT(INOUT) :: u
60 !
61  CHARACTER(LEN=*), INTENT(IN) :: htype ! Type of surface
62 INTEGER, INTENT(IN) :: kdim ! dimension of mask
63 INTEGER, DIMENSION(KDIM), INTENT(OUT) :: kmask ! mask for reading of the files
64 INTEGER, INTENT(INOUT) :: klu ! expected physical size of full surface array
65 INTEGER, INTENT(IN) :: kluout ! output listing logical unit
66 !
67 !* 0.2 Declarations of local variables
68 ! -------------------------------
69 !
70 INTEGER :: ilu ! total horizontal size
71 REAL(KIND=JPRB) :: zhook_handle
72 !-------------------------------------------------------------------------------
73 !
74 !* 1. Dimension initializations:
75 ! -------------------------
76 !
77 IF (lhook) CALL dr_hook('GET_SURF_MASK_N',0,zhook_handle)
78 IF (.NOT. ASSOCIATED(u%XCOVER)) THEN
79  CALL get_mask(klu,'FULL',kmask)
80  IF (lhook) CALL dr_hook('GET_SURF_MASK_N',1,zhook_handle)
81  RETURN
82 END IF
83 !
84 !-------------------------------------------------------------------------------
85 !
86 !* 2. Fractions
87 ! ---------
88 !
89 ilu = SIZE(u%XCOVER,1)
90 !
91 IF (klu==nundef .OR. klu==0) klu = ilu
92 !
93 IF (ilu/=klu) THEN
94  WRITE(kluout,*) 'Error in initialization of masks for reading or writing'
95  WRITE(kluout,*) 'size expected for reading/writing from atmosphere files : ',klu
96  WRITE(kluout,*) 'size of surface array in module MODD_SURF_ATM : ',ilu
97  CALL abor1_sfx('GET_SURF_MASK: ERROR IN INITIALIZATION OF MASK FOR READING OR WRITING')
98 END IF
99 !
100  CALL get_mask(ilu,htype,kmask)
101 !
102 IF (lhook) CALL dr_hook('GET_SURF_MASK_N',1,zhook_handle)
103 !-------------------------------------------------------------------------------
104  CONTAINS
105 !
106 SUBROUTINE get_mask(KLU,YTYPE,IMASK)
107 !
108 IMPLICIT NONE
109 !
110 INTEGER, INTENT(IN) :: klu
111  CHARACTER(LEN=*), INTENT(IN) :: ytype ! Type of surface
112 INTEGER, DIMENSION(:), INTENT(OUT) :: imask
113 !
114 REAL, DIMENSION(KLU) :: zsea ! sea cover
115 REAL, DIMENSION(KLU) :: znature! nature cover
116 REAL, DIMENSION(KLU) :: ztown ! town cover
117 REAL, DIMENSION(KLU) :: zwater ! water cover
118 REAL, DIMENSION(KLU) :: zland ! land cover
119 REAL, DIMENSION(KLU) :: zsurf
120 INTEGER :: ilu2
121 REAL(KIND=JPRB) :: zhook_handle
122 !
123 IF (lhook) CALL dr_hook('GET_SURF_MASK_N:GET_MASK',0,zhook_handle)
124 !
125 IF (ytype.NE.'FULL' .AND. ytype.NE.'EXTZON') THEN
126  !
127  IF (.NOT. ASSOCIATED(u%XSEA)) THEN
128  CALL convert_cover_frac(dtco, &
129  u%XCOVER,u%LCOVER,zsea,znature,ztown,zwater)
130  ELSE
131  zsea = u%XSEA
132  znature = u%XNATURE
133  zwater = u%XWATER
134  ztown = u%XTOWN
135  END IF
136  zland = znature + ztown
137  !
138  SELECT CASE (ytype)
139  CASE ('NATURE')
140  zsurf = znature
141  CASE ('SEA')
142  zsurf = zsea
143  CASE ('TOWN')
144  zsurf = ztown
145  CASE ('WATER')
146  zsurf = zwater
147  CASE ('LAND')
148  zsurf = zland
149  END SELECT
150  !
151  ilu2 = count(zsurf(:) > 0.)
152  !
153 ELSE
154  !
155  zsurf(:) = 1.
156  ilu2 = klu
157  !
158 ENDIF
159 !
160  CALL get_1d_mask(ilu2,klu,zsurf,imask)
161 !
162 IF (lhook) CALL dr_hook('GET_SURF_MASK_N:GET_MASK',1,zhook_handle)
163 !
164 END SUBROUTINE get_mask
165 !
166 END SUBROUTINE get_surf_mask_n
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
subroutine get_mask(KLU, YTYPE, IMASK)
subroutine get_1d_mask(KSIZE, KFRAC, PFRAC, KMASK)
Definition: get_1d_mask.F90:5
subroutine convert_cover_frac(DTCO, PCOVER, OCOVER, PSEA, PNATURE, PTOWN, PWATER)