From af21f3cab0b74b697746843d2084682e8cf74a9c Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Thu, 15 Aug 2024 10:44:44 -0400 Subject: [PATCH 1/5] Update hcox_soilnox_mod.F90 to use soil temperature and parameterizarion from Yi Wang et al. (2021). A new option "Use soil temperature" has been added to the soil NOx extension. When this option is activated, the soil temperature field from the external model (TSOIL1) will be passed to the SoilTemp function instead of T2M (the temperature at 2 meters). The algorithm in the SoilTemp function will also use the updated calculation from Yi Wang et al. (2021). By default, this function will be turned off until the full record of TSOIL1 fields can be archived for input. The error messages in the soil NOx extension have also been updated here to provide more detailed information. Signed-off-by: Melissa Sulprizio --- CHANGELOG.md | 4 + src/Extensions/hcox_soilnox_mod.F90 | 112 ++++++++++++++++++++-------- 2 files changed, 86 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd4e7862..bfbb7f1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased - TBD +### Changed +- Updated soil NOx extention to include the option to use soil temperature and parameterization based on Yi Wang et al. (ERL, 2021) instead of the temperature at 2 meters. + ## [3.9.2] - 2024-07-24 ### Changed - RTD updates: Converted several `:option:` tags to subsections and updated references accordingly diff --git a/src/Extensions/hcox_soilnox_mod.F90 b/src/Extensions/hcox_soilnox_mod.F90 index 85cf0b78..3a134628 100644 --- a/src/Extensions/hcox_soilnox_mod.F90 +++ b/src/Extensions/hcox_soilnox_mod.F90 @@ -104,6 +104,7 @@ MODULE HCOX_SoilNOx_Mod INTEGER :: Instance INTEGER :: ExtNr ! Extension number INTEGER :: IDTNO ! NO tracer ID + LOGICAL :: UseSoilTemp ! Use soil temperature? LOGICAL :: LFERTILIZERNOX ! Use fertilizer NOx? REAL(hp) :: FERT_SCALE ! fertilizer scale factor @@ -748,7 +749,7 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) ! !LOCAL VARIABLES: ! INTEGER :: ExtNr - CHARACTER(LEN=255) :: MSG, LOC + CHARACTER(LEN=255) :: MSG, ErrMsg, ThisLoc CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:) INTEGER, ALLOCATABLE :: HcoIDs(:) INTEGER :: nSpc, I, J, II, AS @@ -757,7 +758,14 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) !================================================================= ! HCOX_SoilNOx_INIT begins here! !================================================================= - LOC = 'HCOX_SoilNOx_INIT (HCOX_SOILNOX_MOD.F90)' + + ! Define strings for error messgaes + ErrMsg = '' + ThisLoc = & + ' -> in HCOX_SoilNOx_Init (in module HEMCO/Extensions/hcox_soilnox_mod.F90)' + + ! Assume success + RC = HCO_SUCCESS ! Extension Nr. ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) ) @@ -766,15 +774,17 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) ! Enter CALL HCO_ENTER( HcoState%Config%Err, LOC, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 39', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error entering soil NOx extension' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! Create instance Inst => NULL() CALL InstCreate ( ExtNr, ExtState%SoilNox, Inst, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR ( 'Cannot create soil NOx instance', RC ) + ErrMsg = 'Cannot create soil NOx instance' + CALL HCO_ERROR ( ErrMsg, RC ) RETURN ENDIF @@ -785,11 +795,20 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) ! Read settings specified in configuration file ! Note: the specified strings have to match those in ! the config. file! + CALL GetExtOpt( HcoState%Config, ExtNr, 'Use soil temperature', & + OptValBool=Inst%UseSoilTemp, RC=RC ) + IF ( RC /= HCO_SUCCESS ) THEN + ErrMsg = 'Use soil temperature not specified' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN + ENDIF + CALL GetExtOpt( HcoState%Config, ExtNr, 'Use fertilizer NOx', & - OptValBool=Inst%LFERTILIZERNOX, RC=RC ) + OptValBool=Inst%LFERTILIZERNOX, RC=RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 40', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Use fertilizer NOx not specified' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! Get global scale factor @@ -798,12 +817,13 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) ! Get HEMCO species IDs CALL HCO_GetExtHcoID( HcoState, ExtNr, HcoIDs, SpcNames, nSpc, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 41', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'No soil NOx species speficied' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF IF ( nSpc /= 1 ) THEN - MSG = 'Module soil NOx accepts only one species!' - CALL HCO_ERROR(MSG, RC ) + ErrMsg = 'Module soil NOx accepts only one species!' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) RETURN ENDIF Inst%IDTNO = HcoIDs(1) @@ -812,15 +832,17 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) CALL GetExtSpcVal( HcoState%Config, ExtNr, nSpc, & SpcNames, 'Scaling', 1.0_sp, Inst%SpcScalVal, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 42', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error reading species scale factor' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF CALL GetExtSpcVal( HcoState%Config, ExtNr, nSpc, & SpcNames, 'ScaleField', HCOX_NOSCALE, Inst%SpcScalFldNme, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 43', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error reading ScaleField' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! Verbose mode @@ -841,6 +863,8 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) CALL HCO_MSG(HcoState%Config%Err,MSG) WRITE(MSG,*) ' - NOx scale field : ', TRIM(Inst%SpcScalFldNme(1)) CALL HCO_MSG(HcoState%Config%Err,MSG) + WRITE(MSG,*) ' - Use soil temperature : ', Inst%UseSoilTemp + CALL HCO_MSG(HcoState%Config%Err,MSG) WRITE(MSG,*) ' - Use fertilizer NOx : ', Inst%LFERTILIZERNOX CALL HCO_MSG(HcoState%Config%Err,MSG) WRITE(MSG,*) ' - Fertilizer scale factor: ', Inst%FERT_SCALE @@ -976,6 +1000,7 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) ! Activate required met fields ExtState%T2M%DoUse = .TRUE. + ExtState%TSOIL1%DoUse = .TRUE. ExtState%GWETTOP%DoUse = .TRUE. ExtState%SUNCOS%DoUse = .TRUE. ExtState%U10M%DoUse = .TRUE. @@ -1146,7 +1171,7 @@ SUBROUTINE Soil_NOx_Emission( ExtState, Inst, TS_EMIS, I, & ! INTEGER :: K REAL(hp) :: BASE_TERM, CRF_TERM, PULSE - REAL(hp) :: TC, TEMP_TERM, WINDSQR + REAL(hp) :: TC, TSOIL, TEMP_TERM, WINDSQR REAL(hp) :: WET_TERM, A_FERT, A_BIOM REAL(hp) :: LAI, SUNCOS, GWET REAL(hp) :: ARID, NARID @@ -1162,6 +1187,9 @@ SUBROUTINE Soil_NOx_Emission( ExtState, Inst, TS_EMIS, I, & ! Surface temperature [C] TC = ExtState%T2M%Arr%Val(I,J) - 273.15_hp + ! Soil temperature [C] + TSOIL = ExtState%TSOIL1%Arr%Val(I,J) - 273.15_hp + ! Surface wind speed, squared WINDSQR = ExtState%U10M%Arr%Val(I,J)**2 + & ExtState%V10M%Arr%Val(I,J)**2 @@ -1188,7 +1216,11 @@ SUBROUTINE Soil_NOx_Emission( ExtState, Inst, TS_EMIS, I, & ! Temperature-dependent term of soil NOx emissions [unitless] ! Use GWET instead of climo wet/dry - TEMP_TERM = SOILTEMP( K, TC, GWET ) + IF ( Inst%UseSoilTemp ) THEN + TEMP_TERM = SOILTEMP( K, TC, GWET ) + ELSE + TEMP_TERM = SOILTEMP( K , TSOIL, GWET) + ENDIF ! Soil moisture scaling of soil NOx emissions ARID = Inst%CLIMARID(I,J) @@ -1818,6 +1850,10 @@ FUNCTION SoilTemp( NN, TC, GWET ) RESULT( SOIL_TEMP ) ! Geophys. Res., 105 , 20,69720,706, 1999. ! (3 ) Yienger, J.J, and H. Levy, Empirical model of global soil-biogenic ! NOx emissions, J. Geophys. Res., 100, D6, 11,447-11464, June 20, 1995. +! (4 ) Wang, Y., C. Ge, L. Castro Garcia1, G.D. Jenerette, P.Y. Oikawa, and +! J. Wang, Improved modelling of soil NOx emissions in a high temperature +! agricultural region: role of background emissions on NO2 trend over the +! US, Environ. Res. Lett., 16(8), DOI: 10.1088/1748-9326/ac16a3, 2021. ! ! !REVISION HISTORY: ! 17 Aug 2009 - R. Yantosca - Initial Version @@ -1837,18 +1873,20 @@ FUNCTION SoilTemp( NN, TC, GWET ) RESULT( SOIL_TEMP ) ! Save surface air temp in shadow variable TMMP TMMP = TC - ! DRY - IF ( GWET < 0.3_hp ) THEN + IF ( .not. Inst%UseSoilTemp ) THEN + ! DRY + IF ( GWET < 0.3_hp ) THEN - ! Convert surface air temperature to model temperature - ! by adding 5 degrees C to model temperature - TMMP = TMMP + 5.0_hp + ! Convert surface air temperature to model temperature + ! by adding 5 degrees C to model temperature + TMMP = TMMP + 5.0_hp - ! WET - ELSE + ! WET + ELSE - TMMP = SOILTA(NN) * TMMP + SOILTB(NN) + TMMP = SOILTA(NN) * TMMP + SOILTB(NN) + ENDIF ENDIF !============================================================== @@ -1867,12 +1905,26 @@ FUNCTION SoilTemp( NN, TC, GWET ) RESULT( SOIL_TEMP ) ELSE - ! Caps temperature response at 30C - IF ( TMMP >= 30.0_hp ) TMMP = 30.0_hp + IF ( Inst%UseSoilTemp ) THEN - SOIL_TEMP = EXP( 0.103_hp * TMMP ) + !---------------------------------------------- + ! Soil NOx scheme from Yi Wang et al. (ERL, 2021) + !---------------------------------------------- + ! Caps temperature response at 40C + IF ( TMMP >= 40.e+0_hp ) TMMP = 40.e+0_hp + IF ( TMMP <= 20.e+0_hp ) SOIL_TEMP = EXP( 0.103 * TMMP ) + IF ( TMMP > 20.e+0_hp ) THEN + SOIL_TEMP=-0.009*(TMMP**3)+0.837*(TMMP**2)+(-22.527)*TMMP+196.149 + ENDIF - ENDIF + ELSE + + ! Caps temperature response at 30C + IF ( TMMP >= 30.0_hp ) TMMP = 30.0_hp + + SOIL_TEMP = EXP( 0.103_hp * TMMP ) + + ENDIF END FUNCTION SoilTemp !EOC From 99ee81b5ed4abcebc9075061b55d35902f32a788 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Thu, 15 Aug 2024 11:57:45 -0400 Subject: [PATCH 2/5] Add TSOIL1 field to ExtState object for soil NOx extension Signed-off-by: Melissa Sulprizio --- CHANGELOG.md | 3 +++ src/Extensions/hcox_state_mod.F90 | 8 ++++++++ .../Standalone/hcoi_standalone_mod.F90 | 17 ++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfbb7f1e..c2793559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased - TBD +### Added +- Added TSOIL1 field to ExtState + ### Changed - Updated soil NOx extention to include the option to use soil temperature and parameterization based on Yi Wang et al. (ERL, 2021) instead of the temperature at 2 meters. diff --git a/src/Extensions/hcox_state_mod.F90 b/src/Extensions/hcox_state_mod.F90 index ea6e5f02..832c3c66 100644 --- a/src/Extensions/hcox_state_mod.F90 +++ b/src/Extensions/hcox_state_mod.F90 @@ -131,6 +131,7 @@ MODULE HCOX_STATE_MOD TYPE(ExtDat_2R), POINTER :: ALBD ! Surface albedo [-] TYPE(ExtDat_2R), POINTER :: T2M ! 2m Sfce temperature [K] TYPE(ExtDat_2R), POINTER :: TSKIN ! Surface skin temperature [K] + TYPE(ExtDat_2R), POINTER :: TSOIL1 ! Soil temperature, layer 1 [K] TYPE(ExtDat_2R), POINTER :: GWETROOT ! Root soil wetness [1] TYPE(ExtDat_2R), POINTER :: GWETTOP ! Top soil moisture [-] TYPE(ExtDat_2R), POINTER :: SNOWHGT ! Snow height [mm H2O = kg H2O/m2] @@ -355,6 +356,12 @@ SUBROUTINE ExtStateInit( ExtState, RC ) RETURN ENDIF + CALL ExtDat_Init ( ExtState%TSOIL1, RC ) + IF ( RC /= HCO_SUCCESS ) THEN + CALL HCO_ERROR( 'Initializing TSOIL1', RC, THISLOC=LOC ) + RETURN + ENDIF + CALL ExtDat_Init ( ExtState%GWETROOT, RC ) IF ( RC /= HCO_SUCCESS ) THEN CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC ) @@ -676,6 +683,7 @@ SUBROUTINE ExtStateFinal( ExtState ) CALL ExtDat_Cleanup( ExtState%ALBD ) CALL ExtDat_Cleanup( ExtState%T2M ) CALL ExtDat_Cleanup( ExtState%TSKIN ) + CALL ExtDat_Cleanup( ExtState%TSOIL1 ) CALL ExtDat_Cleanup( ExtState%GWETROOT ) CALL ExtDat_Cleanup( ExtState%GWETTOP ) CALL ExtDat_Cleanup( ExtState%SNOWHGT ) diff --git a/src/Interfaces/Standalone/hcoi_standalone_mod.F90 b/src/Interfaces/Standalone/hcoi_standalone_mod.F90 index 1d5085fb..fc508a6a 100644 --- a/src/Interfaces/Standalone/hcoi_standalone_mod.F90 +++ b/src/Interfaces/Standalone/hcoi_standalone_mod.F90 @@ -2210,7 +2210,7 @@ SUBROUTINE ExtState_SetFields ( HcoState, ExtState, RC ) ENDIF ENDIF - !%%%%% Air and skin temperature %%%%% + !%%%%% Air temperature %%%%% IF ( ExtState%T2M%DoUse ) THEN Name = 'T2M' CALL ExtDat_Set( HcoState, ExtState%T2M, & @@ -2224,6 +2224,7 @@ SUBROUTINE ExtState_SetFields ( HcoState, ExtState, RC ) ENDIF ENDIF + !%%%%% Skin temperature %%%%% IF ( ExtState%TSKIN%DoUse ) THEN Name = 'TS' CALL ExtDat_Set( HcoState, ExtState%TSKIN, & @@ -2237,6 +2238,20 @@ SUBROUTINE ExtState_SetFields ( HcoState, ExtState, RC ) ENDIF ENDIF + !%%%%% Soil temperature %%%%% + IF ( ExtState%TSOIL1%DoUse ) THEN + Name = 'TSOIL1' + CALL ExtDat_Set( HcoState, ExtState%TSOIL1, & + TRIM( Name ), RC, FIRST=FIRST ) + IF ( RC /= HCO_SUCCESS ) THEN + ErrMsg = 'Could not find quantity "' // TRIM( Name ) // & + '" for the HEMCO standalone simulation!' + CALL HCO_Error( ErrMsg, RC, ThisLoc ) + CALL HCO_Leave( HcoState%Config%Err, RC ) + RETURN + ENDIF + ENDIF + !%%%%% Soil moisture %%%%% IF ( ExtState%GWETROOT%DoUse ) THEN Name = 'GWETROOT' From b8f81864d8145f45fb4c31eac60fc2f1d05ab0f3 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Mon, 19 Aug 2024 16:01:24 -0400 Subject: [PATCH 3/5] Make minor changes to hcox_soilnox_mod.F90 for soil temperature option (1) Remove spaces from from the UseSoilTemperature option so that it can be used in HEMCO logical brackets in HEMCO_Config.rc. (2) Only set ExtState%TSOIL1%DoUse = .TRUE. if UseSoilTemp is true. Signed-off-by: Melissa Sulprizio --- src/Extensions/hcox_soilnox_mod.F90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Extensions/hcox_soilnox_mod.F90 b/src/Extensions/hcox_soilnox_mod.F90 index 3a134628..22ec2add 100644 --- a/src/Extensions/hcox_soilnox_mod.F90 +++ b/src/Extensions/hcox_soilnox_mod.F90 @@ -795,7 +795,7 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) ! Read settings specified in configuration file ! Note: the specified strings have to match those in ! the config. file! - CALL GetExtOpt( HcoState%Config, ExtNr, 'Use soil temperature', & + CALL GetExtOpt( HcoState%Config, ExtNr, 'UseSoilTemperature', & OptValBool=Inst%UseSoilTemp, RC=RC ) IF ( RC /= HCO_SUCCESS ) THEN ErrMsg = 'Use soil temperature not specified' @@ -1000,7 +1000,9 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) ! Activate required met fields ExtState%T2M%DoUse = .TRUE. - ExtState%TSOIL1%DoUse = .TRUE. + IF (Inst%UseSoilTemp) THEN + ExtState%TSOIL1%DoUse = .TRUE. + ENDIF ExtState%GWETTOP%DoUse = .TRUE. ExtState%SUNCOS%DoUse = .TRUE. ExtState%U10M%DoUse = .TRUE. From c55b3cee06584a020be233647964342f5c1a1aba Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Tue, 3 Sep 2024 14:28:19 -0400 Subject: [PATCH 4/5] Fix compile issues and error messages in hcox_soilnox_mod.F90 Compile issues in hcox_soilnox_mod.F90 are addressed here, including adding a missing ENDIF and passing the Inst pointer to function SOILTEMP. The error messages in subroutine HCOX_SoilNOx_Run have also been updated here to be more descriptive. Signed-off-by: Melissa Sulprizio --- src/Extensions/hcox_soilnox_mod.F90 | 293 ++++++++++++++++++---------- 1 file changed, 185 insertions(+), 108 deletions(-) diff --git a/src/Extensions/hcox_soilnox_mod.F90 b/src/Extensions/hcox_soilnox_mod.F90 index 22ec2add..027b6884 100644 --- a/src/Extensions/hcox_soilnox_mod.F90 +++ b/src/Extensions/hcox_soilnox_mod.F90 @@ -299,20 +299,28 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) REAL(dp), ALLOCATABLE :: VecDp(:) LOGICAL :: FIRST LOGICAL :: aIR, FOUND - CHARACTER(LEN= 31) :: DiagnName - CHARACTER(LEN=255) :: MSG, DMY, LOC + CHARACTER(LEN= 31) :: DiagnName, Dummy + CHARACTER(LEN=255) :: ErrMsg, ThisLoc TYPE(MyInst), POINTER :: Inst !================================================================= ! HCOX_SoilNOx_RUN begins here! !================================================================= - LOC = 'HCOX_SoilNOx_RUN (HCOX_SOILNOX_MOD.F90)' + + ! Define strings for error messgaes + ErrMsg = '' + ThisLoc = & + 'HCOX_SoilNOx_Run (in module HEMCO/Extensions/hcox_soilnox_mod.F90)' + + ! Assume success + RC = HCO_SUCCESS ! Enter - CALL HCO_ENTER( HcoState%Config%Err, LOC, RC ) + CALL HCO_ENTER( HcoState%Config%Err, ThisLoc, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error entering soil NOx extension' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! Return if extension disabled @@ -324,8 +332,8 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) ! Get Instance CALL InstGet ( ExtState%SoilNox, Inst, RC ) IF ( RC /= HCO_SUCCESS ) THEN - WRITE(MSG,*) 'Cannot find soil NOx instance Nr. ', ExtState%SoilNOx - CALL HCO_ERROR(MSG,RC) + WRITE(ErrMsg,*) 'Cannot find soil NOx instance number ', ExtState%SoilNOx + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) RETURN ENDIF @@ -340,138 +348,191 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) !IF ( FIRST ) THEN CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK1', Inst%LANDTYPE(1)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK1' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK2', Inst%LANDTYPE(2)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK2' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK3', Inst%LANDTYPE(3)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK3' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK4', Inst%LANDTYPE(4)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK4' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK5', Inst%LANDTYPE(5)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK5' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK6', Inst%LANDTYPE(6)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK6' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK7', Inst%LANDTYPE(7)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK7' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK8', Inst%LANDTYPE(8)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK8' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK9', Inst%LANDTYPE(9)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK9' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK10', Inst%LANDTYPE(10)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK10' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK11', Inst%LANDTYPE(11)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK11' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK12', Inst%LANDTYPE(12)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK12' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK13', Inst%LANDTYPE(13)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK13' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK14', Inst%LANDTYPE(14)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK14' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK15', Inst%LANDTYPE(15)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK15' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK16', Inst%LANDTYPE(16)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK16' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK17', Inst%LANDTYPE(17)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK17' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK18', Inst%LANDTYPE(18)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK18' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK19', Inst%LANDTYPE(19)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK19' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK20', Inst%LANDTYPE(20)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK20' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK21', Inst%LANDTYPE(21)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK21' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK22', Inst%LANDTYPE(22)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 22', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK22' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK23', Inst%LANDTYPE(23)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 23', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK23' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK24', Inst%LANDTYPE(24)%VAL, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 24', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_LANDK24' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_FERT', Inst%SOILFERT, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 25', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_FERT' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_ARID', Inst%CLIMARID, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 26', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_ARID' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF + CALL HCO_EvalFld( HcoState, 'SOILNOX_NONARID', Inst%CLIMNARID, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 27', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error evaluating field SOILNOX_NONARID' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF IF ( FIRST ) THEN @@ -479,17 +540,19 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) ! read it from settings. IF ( .NOT. ASSOCIATED(ExtState%DRYCOEFF) ) THEN CALL GetExtOpt( HcoState%Config, Inst%ExtNr, 'DRYCOEFF', & - OptValChar=DMY, FOUND=FOUND, RC=RC ) + OptValChar=Dummy, FOUND=FOUND, RC=RC ) IF ( .NOT. FOUND ) THEN - CALL HCO_ERROR( 'DRYCOEFF not defined', RC ) + ErrMsg = 'DRYCOEFF not defined' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) RETURN ENDIF ALLOCATE(VecDp(MaxDryCoeff)) - CALL HCO_CharSplit( DMY, HCO_GetOpt(HcoState%Config%ExtList,'Separator'), & + CALL HCO_CharSplit( Dummy, HCO_GetOpt(HcoState%Config%ExtList,'Separator'), & HCO_GetOpt(HcoState%Config%ExtList,'Wildcard'), VecDp, N, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 28', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error reading DRYCOEFF' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ALLOCATE(Inst%DRYCOEFF(N)) Inst%DRYCOEFF(1:N) = VecDp(1:N) @@ -525,22 +588,24 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) CALL HCO_RestartGet( HcoState, 'DEP_RESERVOIR', & Inst%DEP_RESERVOIR, RC, Def2D=Def2D ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 29', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error getting field DEP_RESERVOIR' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! GWET_PREV [unitless] CALL HCO_RestartGet( HcoState, 'GWET_PREV', & Inst%GWET_PREV, RC, FILLED=FOUND ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 30', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error getting field GWET_PREV' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF IF ( .NOT. FOUND ) THEN Inst%GWET_PREV = 0.0_sp IF ( HcoState%amIRoot ) THEN - MSG = 'Cannot find GWET_PREV restart variable - initialized to 0.0!' - CALL HCO_WARNING(HcoState%Config%Err,MSG,RC) + ErrMsg = 'Cannot find GWET_PREV restart variable - initialized to 0.0!' + CALL HCO_WARNING( HcoState%Config%Err, ErrMsg, RC ) ENDIF ENDIF @@ -548,14 +613,15 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) CALL HCO_RestartGet( HcoState, 'PFACTOR', & Inst%PFACTOR, RC, FILLED=FOUND ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 31', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error getting field PFACTOR' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF IF ( .NOT. FOUND ) THEN Inst%PFACTOR = 1.0_sp IF ( HcoState%amIRoot ) THEN - MSG = 'Cannot find PFACTOR restart variable - initialized to 1.0!' - CALL HCO_WARNING(HcoState%Config%Err,MSG,RC) + ErrMsg = 'Cannot find PFACTOR restart variable - initialized to 1.0!' + CALL HCO_WARNING( HcoState%Config%Err, ErrMsg, RC ) ENDIF ENDIF @@ -563,14 +629,15 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) CALL HCO_RestartGet( HcoState, 'DRYPERIOD', & Inst%DRYPERIOD, RC, FILLED=FOUND ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 32', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error ≈getting field DRYPERIOD' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF IF ( .NOT. FOUND ) THEN Inst%DRYPERIOD = 0.0_sp IF ( HcoState%amIRoot ) THEN - MSG = 'Cannot find DRYPERIOD restart variable - initialized to 0.0!' - CALL HCO_WARNING(HcoState%Config%Err,MSG,RC) + ErrMsg = 'Cannot find DRYPERIOD restart variable - initialized to 0.0!' + CALL HCO_WARNING( HcoState%Config%Err, ErrMsg, RC ) ENDIF ENDIF @@ -582,8 +649,9 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) ! Now a function of the new MODIS/Koppen biome map (J.D. Maasakkers) CALL GET_CANOPY_NOX( HcoState, ExtState, Inst, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 33', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error in GET_CANOPY_NOX' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! Init @@ -654,8 +722,9 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) ! Eventually apply spatiotemporal scale factors CALL HCOX_SCALE ( HcoState, FLUX_2D, TRIM(Inst%SpcScalFldNme(1)), RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 34', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error applying scale factors' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF !----------------------------------------------------------------- @@ -666,7 +735,8 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) CALL HCO_EmisAdd( HcoState, FLUX_2D, Inst%IDTNO, & RC, ExtNr=Inst%ExtNr ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'HCO_EmisAdd error', RC ) + ErrMsg = 'Error adding emissions fluxes' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) RETURN ENDIF @@ -677,29 +747,33 @@ SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC ) ! DEP_RESERVOIR [kg/m3] CALL HCO_RestartWrite( HcoState, 'DEP_RESERVOIR', Inst%DEP_RESERVOIR, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 35', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error writing field DEP_RESERVOIR to restart' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! GWET_PREV [unitless] CALL HCO_RestartWrite( HcoState, 'GWET_PREV', Inst%GWET_PREV, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 36', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error writing field GWET_PREV to restart' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! PFACTOR [unitless] CALL HCO_RestartWrite( HcoState, 'PFACTOR', Inst%PFACTOR, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 37', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error writing field PFACTOR to restart' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! DRYPERIOD [unitless] CALL HCO_RestartWrite( HcoState, 'DRYPERIOD', Inst%DRYPERIOD, RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 38', RC, THISLOC=LOC ) - RETURN + ErrMsg = 'Error writing field DRYPERIOD to restart' + CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) + RETURN ENDIF ! Leave w/ success @@ -772,7 +846,7 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) IF ( ExtNr <= 0 ) RETURN ! Enter - CALL HCO_ENTER( HcoState%Config%Err, LOC, RC ) + CALL HCO_ENTER( HcoState%Config%Err, ThisLoc, RC ) IF ( RC /= HCO_SUCCESS ) THEN ErrMsg = 'Error entering soil NOx extension' CALL HCO_ERROR( ErrMsg, RC, ThisLoc ) @@ -962,35 +1036,35 @@ SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC ) Trgt2D = Inst%FertNO_Diag, & RC = RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 44', RC, THISLOC=LOC ) + CALL HCO_ERROR( 'ERROR 44', RC, ThisLoc ) RETURN ENDIF CALL HCO_RestartDefine( HcoState, 'PFACTOR', & Inst%PFACTOR, '1', RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 45', RC, THISLOC=LOC ) + CALL HCO_ERROR( 'ERROR 45', RC, ThisLoc ) RETURN ENDIF CALL HCO_RestartDefine( HcoState, 'DRYPERIOD', & Inst%DRYPERIOD, '1', RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 46', RC, THISLOC=LOC ) + CALL HCO_ERROR( 'ERROR 46', RC, ThisLoc ) RETURN ENDIF CALL HCO_RestartDefine( HcoState, 'GWET_PREV', & Inst%GWET_PREV, '1', RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 47', RC, THISLOC=LOC ) + CALL HCO_ERROR( 'ERROR 47', RC, ThisLoc ) RETURN ENDIF CALL HCO_RestartDefine( HcoState, ' DEP_RESERVOIR', & Inst%DEP_RESERVOIR, 'kg/m3', RC ) IF ( RC /= HCO_SUCCESS ) THEN - CALL HCO_ERROR( 'ERROR 48', RC, THISLOC=LOC ) + CALL HCO_ERROR( 'ERROR 48', RC, ThisLoc ) RETURN ENDIF @@ -1219,9 +1293,9 @@ SUBROUTINE Soil_NOx_Emission( ExtState, Inst, TS_EMIS, I, & ! Temperature-dependent term of soil NOx emissions [unitless] ! Use GWET instead of climo wet/dry IF ( Inst%UseSoilTemp ) THEN - TEMP_TERM = SOILTEMP( K, TC, GWET ) + TEMP_TERM = SOILTEMP( Inst, K, TC, GWET ) ELSE - TEMP_TERM = SOILTEMP( K , TSOIL, GWET) + TEMP_TERM = SOILTEMP( Inst, K , TSOIL, GWET ) ENDIF ! Soil moisture scaling of soil NOx emissions @@ -1813,18 +1887,19 @@ END FUNCTION Source_WetN !\\ ! !INTERFACE: ! - FUNCTION SoilTemp( NN, TC, GWET ) RESULT( SOIL_TEMP ) + FUNCTION SoilTemp( Inst, NN, TC, GWET ) RESULT( SOIL_TEMP ) ! ! !INPUT PARAMETERS: ! - INTEGER, INTENT(IN) :: NN ! Soil biome type - REAL(hp), INTENT(IN) :: TC ! Surface air temperature [C] - REAL(hp), INTENT(IN) :: GWET ! Top soil moisture + TYPE(MyInst), POINTER :: Inst ! Instance object + INTEGER, INTENT(IN) :: NN ! Soil biome type + REAL(hp), INTENT(IN) :: TC ! Surface air temperature [C] + REAL(hp), INTENT(IN) :: GWET ! Top soil moisture ! ! !RETURN VALUE: ! - REAL(hp) :: SOIL_TEMP ! Temperature-dependent term of - ! soil NOx emissions [unitless] + REAL(hp) :: SOIL_TEMP ! Temperature-dependent term of + ! soil NOx emissions [unitless] ! ! !REMARKS: ! Based on Ormeci et al., [1999] and Otter et al., [1999] @@ -1928,6 +2003,8 @@ FUNCTION SoilTemp( NN, TC, GWET ) RESULT( SOIL_TEMP ) ENDIF + ENDIF + END FUNCTION SoilTemp !EOC !---------------------------------------------------------------------------- From d87b219b0d91333b3b7ac3185145a7ceaa2eefa8 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Thu, 5 Sep 2024 13:16:16 -0400 Subject: [PATCH 5/5] Add fix to hcox_soilnox_mod.F90 to only initialize TSOIL when UseSoilTemp is true Signed-off-by: Melissa Sulprizio --- src/Extensions/hcox_soilnox_mod.F90 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Extensions/hcox_soilnox_mod.F90 b/src/Extensions/hcox_soilnox_mod.F90 index 027b6884..871b8694 100644 --- a/src/Extensions/hcox_soilnox_mod.F90 +++ b/src/Extensions/hcox_soilnox_mod.F90 @@ -1264,7 +1264,9 @@ SUBROUTINE Soil_NOx_Emission( ExtState, Inst, TS_EMIS, I, & TC = ExtState%T2M%Arr%Val(I,J) - 273.15_hp ! Soil temperature [C] - TSOIL = ExtState%TSOIL1%Arr%Val(I,J) - 273.15_hp + IF ( Inst%UseSoilTemp ) THEN + TSOIL = ExtState%TSOIL1%Arr%Val(I,J) - 273.15_hp + ENDIF ! Surface wind speed, squared WINDSQR = ExtState%U10M%Arr%Val(I,J)**2 + & @@ -1293,9 +1295,9 @@ SUBROUTINE Soil_NOx_Emission( ExtState, Inst, TS_EMIS, I, & ! Temperature-dependent term of soil NOx emissions [unitless] ! Use GWET instead of climo wet/dry IF ( Inst%UseSoilTemp ) THEN - TEMP_TERM = SOILTEMP( Inst, K, TC, GWET ) - ELSE TEMP_TERM = SOILTEMP( Inst, K , TSOIL, GWET ) + ELSE + TEMP_TERM = SOILTEMP( Inst, K, TC, GWET ) ENDIF ! Soil moisture scaling of soil NOx emissions