SURFEX v8.1
General documentation of Surfex
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).AND..NOT.ASSOCIATED(u%XSEA)) 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 IF (ASSOCIATED(u%XCOVER)) THEN
90  ilu = SIZE(u%XCOVER,1)
91 ELSEIF (ASSOCIATED(u%XSEA)) THEN
92  ilu = SIZE(u%XSEA)
93 ENDIF
94 !
95 IF (klu==nundef .OR. klu==0) klu = ilu
96 !
97 IF (ilu/=klu) THEN
98  WRITE(kluout,*) 'Error in initialization of masks for reading or writing'
99  WRITE(kluout,*) 'size expected for reading/writing from atmosphere files : ',klu
100  WRITE(kluout,*) 'size of surface array in module MODD_SURF_ATM : ',ilu
101  CALL abor1_sfx('GET_SURF_MASK: ERROR IN INITIALIZATION OF MASK FOR READING OR WRITING')
102 END IF
103 !
104  CALL get_mask(ilu,htype,kmask)
105 !
106 IF (lhook) CALL dr_hook('GET_SURF_MASK_N',1,zhook_handle)
107 !-------------------------------------------------------------------------------
108 CONTAINS
109 !
110 SUBROUTINE get_mask(KLU,YTYPE,IMASK)
111 !
112 IMPLICIT NONE
113 !
114 INTEGER, INTENT(IN) :: KLU
115  CHARACTER(LEN=*), INTENT(IN) :: YTYPE ! Type of surface
116 INTEGER, DIMENSION(:), INTENT(OUT) :: IMASK
117 !
118 REAL, DIMENSION(KLU) :: ZSEA ! sea cover
119 REAL, DIMENSION(KLU) :: ZNATURE! nature cover
120 REAL, DIMENSION(KLU) :: ZTOWN ! town cover
121 REAL, DIMENSION(KLU) :: ZWATER ! water cover
122 REAL, DIMENSION(KLU) :: ZLAND ! land cover
123 REAL, DIMENSION(KLU) :: ZSURF
124 INTEGER :: ILU2
125 REAL(KIND=JPRB) :: ZHOOK_HANDLE
126 !
127 IF (lhook) CALL dr_hook('GET_SURF_MASK_N:GET_MASK',0,zhook_handle)
128 !
129 IF (ytype.NE.'FULL' .AND. ytype.NE.'EXTZON') THEN
130  !
131  IF (.NOT. ASSOCIATED(u%XSEA)) THEN
132  CALL convert_cover_frac(dtco, &
133  u%XCOVER,u%LCOVER,zsea,znature,ztown,zwater)
134  ELSE
135  zsea = u%XSEA
136  znature = u%XNATURE
137  zwater = u%XWATER
138  ztown = u%XTOWN
139  END IF
140  zland = znature + ztown
141  !
142  SELECT CASE (ytype)
143  CASE ('NATURE')
144  zsurf = znature
145  CASE ('SEA')
146  zsurf = zsea
147  CASE ('TOWN')
148  zsurf = ztown
149  CASE ('WATER')
150  zsurf = zwater
151  CASE ('LAND')
152  zsurf = zland
153  END SELECT
154  !
155  ilu2 = count(zsurf(:) > 0.)
156  !
157 ELSE
158  !
159  zsurf(:) = 1.
160  ilu2 = klu
161  !
162 ENDIF
163 !
164  CALL get_1d_mask(ilu2,klu,zsurf,imask)
165 !
166 IF (lhook) CALL dr_hook('GET_SURF_MASK_N:GET_MASK',1,zhook_handle)
167 !
168 END SUBROUTINE get_mask
169 !
170 END SUBROUTINE get_surf_mask_n
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)
integer, parameter nundef
subroutine get_1d_mask(KSIZE, KFRAC, PFRAC, KMASK)
Definition: get_1d_mask.F90:6
logical lhook
Definition: yomhook.F90:15
subroutine convert_cover_frac(DTCO, PCOVER, OCOVER, PSEA, PNATURE, PTOWN, PWATER)
static int count
Definition: memory_hook.c:21