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