SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/soilemisnon.F90
Go to the documentation of this file.
00001 !     #####################################################
00002 !      SUBROUTINE SOILEMISNO_n(PSW_FORBIO, PUA, PVA, KSV, HSV, PFLUX)
00003       SUBROUTINE SOILEMISNO_n(PUA, PVA)
00004 !     #####################################################
00005 !!
00006 !!****** *SOILEMISNO*
00007 !!
00008 !!
00009 !!    PURPOSE
00010 !!    -------
00011 !
00012 !     Calculates NO emissions from soil
00013 !     plus estimation of Canopy Reduction Factor
00014 !!
00015 !!    METHOD
00016 !!    ------
00017 !     Parameterizes NO fluxes function of temperature and soil moisture and other soil parameters,
00018 !     Development from a neural network algorithm.
00019 
00020 !!    EXTERNAL
00021 !!    --------
00022 !!    none
00023 !!
00024 !!    IMPLICIT ARGUMENTS
00025 !!    ------------------
00026 !!    MODD_EMIS_NOX
00027 !!
00028 !!    REFERENCE
00029 !!    ---------
00030 !!
00031 !!    Parameterization from neural network
00032 !!
00033 !!    Input data : wind speed, deep soil temperature, surface soil temperature, surface WFPS,
00034 !!    fertilisation rate, pH, sand percentage
00035 !!    Delon et al. (2007) Tellus B
00036 !!
00037 !!    AUTHOR
00038 !!    ------
00039 !!
00040 !!      C. Delon           * LA *
00041 !!
00042 !!    MODIFICATIONS
00043 !!    -------------
00044 !!
00045 
00046 !
00047 !--------------------------------------------------------------------------
00048 !
00049 !       0. DECLARATIONS
00050 !          ------------
00051 !
00052 USE MODD_EMIS_NOX
00053 USE MODD_ISBA_n,     ONLY : XSAND, XTG, XWG, XLAI, XPH, XFERT
00054 USE MODD_GR_BIOG_n,  ONLY : XNOFLUX
00055 USE MODD_CSTS,       ONLY : XAVOGADRO
00056 !USE MODD_CH_ISBA_n,  ONLY : NSV_CHSBEG, NSV_CHSEND, NBEQ, CSV
00057 !USE MODD_SURF_PAR,   ONLY : XUNDEF
00058 !
00059 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00060 USE PARKIND1  ,ONLY : JPRB
00061 !
00062 IMPLICIT NONE
00063 !
00064 !       0.1 Declaration of arguments
00065 !
00066 !
00067 !REAL, DIMENSION(:,:), INTENT(IN)              :: PSW_FORBIO
00068 REAL, DIMENSION(:), INTENT(IN)                :: PUA        ! wind module
00069 REAL, DIMENSION(:), INTENT(IN)                :: PVA
00070 !INTEGER,             INTENT(IN)               :: KSV       ! number of scalars
00071 !CHARACTER(LEN=6), DIMENSION(KSV),  INTENT(IN) :: HSV        ! chemical species name
00072 !REAL, DIMENSION(:,:), INTENT(INOUT)           :: PFLUX      ! NO flux from soil
00073 !                                                control switch for the first call
00074 INTEGER                                       :: JI         ! index
00075 INTEGER                                       :: JSV
00076 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
00077 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00078 ! Local variables:
00079 !
00080 REAL, DIMENSION(SIZE(PUA,1))   :: ZCRF            ! Canopy Reduction Factor
00081 !
00082 REAL, DIMENSION(SIZE(PUA,1))   :: ZTG_D           ! Deep soil temperature in °C
00083 REAL, DIMENSION(SIZE(PUA,1))   :: ZTG_S           ! Surface soil temperature in °C
00084 REAL, DIMENSION(SIZE(PUA,1))   :: ZWFPS_S         ! Water filled pore space at surface
00085 REAL, DIMENSION(SIZE(PUA,1))   :: ZSAND           ! % of sand at surface (0-100)
00086 REAL, DIMENSION(SIZE(PUA,1))   :: ZWIND          ! wind speed
00087 REAL, DIMENSION(SIZE(PUA,1))   :: ZFWORK        
00088 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_WIND          ! Normalized wind speed
00089 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_ZTG_D        ! Normalized deep soil temperature
00090 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_ZTG_S        ! Normalized surface soil temperature
00091 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_ZWFPS_S      ! Normalized WFPS at surface
00092 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_FERT        ! Normalized fertilisation rate (Nitrogen Unity)
00093 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_PH          ! Normalized pH value
00094 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_ZSAND        ! Normalized sand content (%)
00095 REAL, DIMENSION(SIZE(PUA,1))   :: ZN_Y            ! Normalized NO flux
00096 !
00097 REAL, DIMENSION(SIZE(PUA,1),3)   :: ZS            ! normalized sum
00098 !
00099  CHARACTER(LEN=2)               :: TEST_CRF ! 'OK' if VEG<60% (i.e. soils with sparse vegetation)
00100 !
00101 INTEGER :: J
00102 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00103 !=============================================================================
00104 IF (LHOOK) CALL DR_HOOK('SOILEMISNO_n',0,ZHOOK_HANDLE)
00105 !
00106 IF (.NOT.ASSOCIATED(XNOFLUX))  ALLOCATE(XNOFLUX(SIZE(PUA,1)))
00107 !
00108 ! Calculation of WFPS
00109 ! coefficients obtenus a partir des donnees Grignon+Hombori+Escompte(0.536 0.4 0.43)
00110 ZWFPS_S(:) = (XWG(:,1,1) / 0.45) * 100.      
00111 ! Change unity of temperatures from Kelvin to Celsius
00112 ZTG_D(:) = XTG(:,2,1)  - 273.15
00113 ZTG_S(:) = XTG(:,1,1)  - 273.15
00114 ! Change sand fraction into sand percentage
00115 ZSAND(:) = XSAND(:,1) * 100.
00116 ! Calculate wind module
00117 ZWIND(:) = SQRT( PUA(:)**2 + PVA(:)**2 )
00118 !
00119 ! Calculation of NO flux from soil 
00120 !------------------------------------
00121 ! 1- Normalized centered entries
00122 !
00123 ZN_ZTG_S(:)   = XCOEF_TG_S(1)   + XCOEF_TG_S(2) * ZTG_S(:)
00124 ZN_ZWFPS_S(:) = XCOEF_WFPS_S(1) + XCOEF_WFPS_S(2) * ZWFPS_S(:)
00125 ZN_ZTG_D(:)   = XCOEF_TG_D(1)   + XCOEF_TG_D(2) * ZTG_D(:)
00126 ZN_FERT(:)    = XCOEF_FERT(1)   + XCOEF_FERT(2) * XFERT(:)
00127 ZN_ZSAND(:)   = XCOEF_SAND(1)   + XCOEF_SAND(2) * ZSAND(:)
00128 ZN_PH(:)      = XCOEF_PH(1)     + XCOEF_PH(2) * XPH(:)
00129 ZN_WIND(:)    = XCOEF_WIND(1)   + XCOEF_WIND(2) * ZWIND(:)
00130 !
00131 ! 2- weighted sums
00132 !
00133 DO J=1,3
00134   ZS(:,J) = XWGT_0(J) + XWGT_TG_S(J) * ZN_ZTG_S(:) &
00135           + XWGT_WFPS_S(J) * ZN_ZWFPS_S(:) + XWGT_TG_D(J) * ZN_ZTG_D(:) &
00136           + XWGT_FERT(J) * ZN_FERT(:) + XWGT_SAND(J) * ZN_ZSAND(:) &
00137           + XWGT_PH(J) * ZN_PH(:) + XWGT_WIND(J) * ZN_WIND(:) 
00138 ENDDO
00139 !
00140 ! 3- Hyperbolic tangent calculation    
00141 !
00142 ZN_Y(:) = XWGT_TOT(1) + XWGT_TOT(2)*TANH(ZS(:,1)) + XWGT_TOT(3)*TANH(ZS(:,2)) + XWGT_TOT(4)*TANH(ZS(:,3)) 
00143 !
00144 !  4- Flux calculation
00145 !       If  pH> 6, pulse effect, amplitude coefficient is maximum.
00146 !       If pH < 6, amplitude coefficient is reduced to avoid strong emissions
00147 WHERE (XPH(:) .GE. 6.0)
00148   XNOFLUX(:) = XCOEF_NO0 + XCOEF_NO1_s*ZN_Y(:)
00149 ELSEWHERE
00150   XNOFLUX(:) = XCOEF_NO0 + XCOEF_NO1_l*ZN_Y(:)
00151 ENDWHERE
00152 !
00153 !PRINT*,'flux de NO en gN/ha/d = ',XNOFLUX(:)
00154 !
00155 !  5- Flag to avoid negative fluxes.
00156 WHERE (XNOFLUX(:).LT. 0.) XNOFLUX(:)=0.
00157 !     PRINT*,'!!!!!! Attention flux de NO negatifs !!!!!',XNOFLUX(JI)
00158 !
00159 !  6- Changing units from gN/ha/d to molecules/m2/s
00160 ! 1 ha=10000 m2, 1d=86400s, 1mole(NO)=30g, 1mole=Avogadro molec (6.022E23).
00161 !                           1mole(N) =14g
00162 XNOFLUX(:) = XNOFLUX(:)*XAVOGADRO/(1.0E4*8.64E4*14)
00163 !
00164 !PRINT*,'flux de NO en molec/cm2/s = ',XNOFLUX(JI)
00165 !
00166 !  7- Reduction du flux dans la canopee
00167 !          WHERE (XLAI(:,1)/=XUNDEF) 
00168 !         ZCRF(:) = -0.0917*XLAI(:,1) + 0.9429
00169 WHERE (XLAI(:,1) > 1.9 .AND. XLAI(:,1) < 5.)
00170   ZCRF(:) = 0.5
00171 ELSEWHERE (XLAI(:,1) > 5.)
00172   ZCRF(:) = 0.2
00173 ELSEWHERE
00174   ZCRF(:) = 1.
00175 ENDWHERE
00176 !       PRINT*,'LAI, CRF', XLAI(:), ZCRF(:)
00177 XNOFLUX(:) = XNOFLUX(:)*ZCRF(:)
00178 !       PRINT*,'flux de NO en molec/m2/s apres CRF = ',XNOFLUX(:)       
00179 !
00180 !  8- Introduction du Flux de NO final dans la chimie apres reduction par le CRF (avec MesoNH chimie)
00181 !  IF (NBEQ>0) THEN
00182 !      DO JSV=NSV_CHSBEG,NSV_CHSEND
00183 !         IF (CSV(JSV) == "NO") THEN
00184 !          PFLUX(:,JSV) = PFLUX(:,JSV) + XNOFLUX(:)
00185 !         ENDIF
00186 !      END DO
00187 !  ELSE
00188 !      PFLUX(:,1) = PFLUX(:,1) + XNOFLUX(:)
00189 !  ENDIF
00190 !
00191 IF (LHOOK) CALL DR_HOOK('SOILEMISNO_n',1,ZHOOK_HANDLE)
00192 !
00193 END SUBROUTINE SOILEMISNO_n