SURFEX v8.1
General documentation of Surfex
soilemisnon.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 SOILEMISNO_n(PSW_FORBIO, PUA, PVA, KSV, HSV, PFLUX)
7  SUBROUTINE soilemisno_n (GB, S, K, NP, NPE, PUA, PVA)
8 ! #####################################################
9 !!
10 !!****** *SOILEMISNO*
11 !!
12 !!
13 !! PURPOSE
14 !! -------
15 !
16 ! Calculates NO emissions from soil
17 ! plus estimation of Canopy Reduction Factor
18 !!
19 !! METHOD
20 !! ------
21 ! Parameterizes NO fluxes function of temperature and soil moisture and other soil parameters,
22 ! Development from a neural network algorithm.
23 
24 !! EXTERNAL
25 !! --------
26 !! none
27 !!
28 !! IMPLICIT ARGUMENTS
29 !! ------------------
30 !! MODD_EMIS_NOX
31 !!
32 !! REFERENCE
33 !! ---------
34 !!
35 !! Parameterization from neural network
36 !!
37 !! Input data : wind speed, deep soil temperature, surface soil temperature, surface WFPS,
38 !! fertilisation rate, pH, sand percentage
39 !! Delon et al. (2007) Tellus B
40 !!
41 !! AUTHOR
42 !! ------
43 !!
44 !! C. Delon * LA *
45 !!
46 !! MODIFICATIONS
47 !! -------------
48 !!
49 
50 !
51 !--------------------------------------------------------------------------
52 !
53 ! 0. DECLARATIONS
54 ! ------------
55 !
56 USE modd_gr_biog_n, ONLY : gr_biog_t
58 !
59 USE modd_emis_nox
60 USE modd_csts, ONLY : xavogadro
61 !
62 USE modd_surf_par, ONLY : xundef
63 !
64 USE yomhook ,ONLY : lhook, dr_hook
65 USE parkind1 ,ONLY : jprb
66 !
67 IMPLICIT NONE
68 !
69 ! 0.1 Declaration of arguments
70 !
71 !
72 !REAL, DIMENSION(:,:), INTENT(IN) :: PSW_FORBIO
73 !
74 TYPE(gr_biog_t), INTENT(INOUT) :: GB
75 TYPE(isba_s_t), INTENT(INOUT) :: S
76 TYPE(isba_k_t), INTENT(INOUT) :: K
77 TYPE(isba_np_t), INTENT(INOUT) :: NP
78 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
79 !
80 REAL, DIMENSION(:), INTENT(IN) :: PUA ! wind module
81 REAL, DIMENSION(:), INTENT(IN) :: PVA
82 INTEGER :: JI ! index
83 INTEGER :: JSV
84 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
85 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
86 ! Local variables:
87 !
88 REAL, DIMENSION(SIZE(PUA,1)) :: ZCRF ! Canopy Reduction Factor
89 !
90 REAL, DIMENSION(SIZE(PUA,1)) :: ZTG_D ! Deep soil temperature in °C
91 REAL, DIMENSION(SIZE(PUA,1)) :: ZTG_S ! Surface soil temperature in °C
92 REAL, DIMENSION(SIZE(PUA,1)) :: ZWFPS_S ! Water filled pore space at surface
93 REAL, DIMENSION(SIZE(PUA,1)) :: ZSAND ! % of sand at surface (0-100)
94 REAL, DIMENSION(SIZE(PUA,1)) :: ZWIND ! wind speed
95 REAL, DIMENSION(SIZE(PUA,1)) :: ZFWORK
96 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_WIND ! Normalized wind speed
97 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_ZTG_D ! Normalized deep soil temperature
98 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_ZTG_S ! Normalized surface soil temperature
99 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_ZWFPS_S ! Normalized WFPS at surface
100 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_FERT ! Normalized fertilisation rate (Nitrogen Unity)
101 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_PH ! Normalized pH value
102 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_ZSAND ! Normalized sand content (%)
103 REAL, DIMENSION(SIZE(PUA,1)) :: ZN_Y ! Normalized NO flux
104 !
105 REAL, DIMENSION(SIZE(PUA,1),3) :: ZS ! normalized sum
106 !
107  CHARACTER(LEN=2) :: TEST_CRF ! 'OK' if VEG<60% (i.e. soils with sparse vegetation)
108 !
109 INTEGER :: J, IMASK
110 REAL(KIND=JPRB) :: ZHOOK_HANDLE
111 !=============================================================================
112 IF (lhook) CALL dr_hook('SOILEMISNO_n',0,zhook_handle)
113 !
114 IF (.NOT.ASSOCIATED(gb%XNOFLUX)) ALLOCATE(gb%XNOFLUX(SIZE(pua,1)))
115 !
116 ! Calculation of WFPS
117 ! coefficients obtenus a partir des donnees Grignon+Hombori+Escompte(0.536 0.4 0.43)
118 zwfps_s(:) = xundef
119 ztg_d(:) = xundef
120 zsand(:) = xundef
121 !
122 DO ji = 1,np%AL(1)%NSIZE_P
123  !
124  imask = np%AL(1)%NR_P(ji)
125  !
126  zwfps_s(imask) = (npe%AL(1)%XWG(ji,1) / 0.45) * 100.
127  ! Change unity of temperatures from Kelvin to Celsius
128  ztg_d(imask) = npe%AL(1)%XTG(ji,2) - 273.15
129  ztg_s(imask) = npe%AL(1)%XTG(ji,1) - 273.15
130  !
131 ENDDO
132 !
133 ! Change sand fraction into sand percentage
134 zsand(:) = k%XSAND(:,1) * 100.
135 !
136 ! Calculate wind module
137 zwind(:) = sqrt( pua(:)**2 + pva(:)**2 )
138 !
139 ! Calculation of NO flux from soil
140 !------------------------------------
141 ! 1- Normalized centered entries
142 !
143 zn_ztg_s(:) = xcoef_tg_s(1) + xcoef_tg_s(2) * ztg_s(:)
144 zn_zwfps_s(:) = xcoef_wfps_s(1) + xcoef_wfps_s(2) * zwfps_s(:)
145 zn_ztg_d(:) = xcoef_tg_d(1) + xcoef_tg_d(2) * ztg_d(:)
146 zn_fert(:) = xcoef_fert(1) + xcoef_fert(2) * s%XFERT(:)
147 zn_zsand(:) = xcoef_sand(1) + xcoef_sand(2) * zsand(:)
148 zn_ph(:) = xcoef_ph(1) + xcoef_ph(2) * s%XPH (:)
149 zn_wind(:) = xcoef_wind(1) + xcoef_wind(2) * zwind(:)
150 !
151 ! 2- weighted sums
152 !
153 DO j=1,3
154  zs(:,j) = xwgt_0(j) + xwgt_tg_s(j) * zn_ztg_s(:) &
155  + xwgt_wfps_s(j) * zn_zwfps_s(:) + xwgt_tg_d(j) * zn_ztg_d(:) &
156  + xwgt_fert(j) * zn_fert(:) + xwgt_sand(j) * zn_zsand(:) &
157  + xwgt_ph(j) * zn_ph(:) + xwgt_wind(j) * zn_wind(:)
158 ENDDO
159 !
160 ! 3- Hyperbolic tangent calculation
161 !
162 zn_y(:) = xwgt_tot(1) + xwgt_tot(2)*tanh(zs(:,1)) + xwgt_tot(3)*tanh(zs(:,2)) + xwgt_tot(4)*tanh(zs(:,3))
163 !
164 ! 4- Flux calculation
165 ! If pH> 6, pulse effect, amplitude coefficient is maximum.
166 ! If pH < 6, amplitude coefficient is reduced to avoid strong emissions
167 WHERE (s%XPH(:) .GE. 6.0)
168  gb%XNOFLUX(:) = xcoef_no0 + xcoef_no1_s*zn_y(:)
169 ELSEWHERE
170  gb%XNOFLUX(:) = xcoef_no0 + xcoef_no1_l*zn_y(:)
171 ENDWHERE
172 !
173 !PRINT*,'flux de NO en gN/ha/d = ',XNOFLUX(:)
174 !
175 ! 5- Flag to avoid negative fluxes.
176 WHERE (gb%XNOFLUX(:).LT. 0.) gb%XNOFLUX(:)=0.
177 ! PRINT*,'!!!!!! Attention flux de NO negatifs !!!!!',XNOFLUX(JI)
178 !
179 ! 6- Changing units from gN/ha/d to molecules/m2/s
180 ! 1 ha=10000 m2, 1d=86400s, 1mole(NO)=30g, 1mole=Avogadro molec (6.022E23).
181 ! 1mole(N) =14g
182 gb%XNOFLUX(:) = gb%XNOFLUX(:)*xavogadro/(1.0e4*8.64e4*14)
183 !
184 !PRINT*,'flux de NO en molec/cm2/s = ',XNOFLUX(JI)
185 !
186 ! 7- Reduction du flux dans la canopee
187 ! WHERE (XLAI(:,1)/=XUNDEF)
188 ! ZCRF(:) = -0.0917*XLAI(:,1) + 0.9429
189 zcrf(:) = 1.
190 DO ji = 1,np%AL(1)%NSIZE_P
191  imask = np%AL(1)%NR_P(ji)
192  IF (npe%AL(1)%XLAI(ji) > 1.9 .AND. npe%AL(1)%XLAI(ji) < 5.) THEN
193  zcrf(imask) = 0.5
194  ELSEIF (npe%AL(1)%XLAI(ji) > 5.) THEN
195  zcrf(imask) = 0.2
196  ENDIF
197 ENDDO
198 ! PRINT*,'LAI, CRF', XLAI(:), ZCRF(:)
199 gb%XNOFLUX(:) = gb%XNOFLUX(:)*zcrf(:)
200 ! PRINT*,'flux de NO en molec/m2/s apres CRF = ',XNOFLUX(:)
201 !
202 ! 8- Introduction du Flux de NO final dans la chimie apres reduction par le CRF (avec MesoNH chimie)
203 ! IF (NBEQ>0) THEN
204 ! DO JSV=NSV_CHSBEG,NSV_CHSEND
205 ! IF (CSV(JSV) == "NO") THEN
206 ! PFLUX(:,JSV) = PFLUX(:,JSV) + XNOFLUX(:)
207 ! ENDIF
208 ! END DO
209 ! ELSE
210 ! PFLUX(:,1) = PFLUX(:,1) + XNOFLUX(:)
211 ! ENDIF
212 !
213 IF (lhook) CALL dr_hook('SOILEMISNO_n',1,zhook_handle)
214 !
215 END SUBROUTINE soilemisno_n
subroutine soilemisno_n(GB, S, K, NP, NPE, PUA, PVA)
Definition: soilemisnon.F90:8
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
real, save xavogadro
Definition: modd_csts.F90:52