CABLE-LSM / CABLE-Trac-archive

Archive CABLE Trac contents as issues
Other
0 stars 0 forks source link

ESM1.5 Reconciliation - dryLeaf #350

Closed penguian closed 1 year ago

penguian commented 1 year ago

keyword_maygit owner:jxs599@nci.org.au resolution_fixed type_defect | by yh4968


see attachment


Issue migrated from trac:350 at 2023-11-27 11:43:39 +1100

penguian commented 1 year ago

@yh4968@nci.org.au uploaded file switches -dryLeaf.docx (48.1 KiB)

penguian commented 1 year ago

@ccc561@nci.org.au commented


Relevant file: https://trac.nci.org.au/svn/cable/branches/Share/ESM15-CABLE3_draft1/science/canopy/cbl_dryLeaf.F90

First change:

frac42 = SPREAD(veg%frac4, 2, mf) ! frac C4 plants
IF( cable_runtime%esm15_dryLeaf ) THEN
   gsw_term = Cgsw03 * (1. - frac42) + Cgsw04 * frac42
   lower_limit2 = rad%scalex * (Cgsw03 * (1. - frac42) + Cgsw04 * frac42)
ELSE
   gsw_term = SPREAD(veg%gswmin,2,mf)
   lower_limit2 = rad%scalex * gsw_term
ENDIF   

veg%gswmin and veg%frac4 or frac42 are PFT parameters. Cgsw03 and Cgsw04 are constants from https://trac.nci.org.au/svn/cable/branches/Share/ESM15-CABLE3_draft1/params/cable_photo_constants_mod.F90

If I take the values in the pft_params.nml file in offline/ and replace in the code, the 2 options are the same. That is, veg types 7 and 10 have gsw_term=0.04 and other vegetation types have gsw_term=0.01.

The question is do we want to force the relationship of frac4 and gsw_term to the one in the ESM1.5 or do we want to allow more freedom by using the gswmin vegetation parameter which could be set differently in pft_params.nml?

Another case where input parameters have replaced hard-coded values, so just need to check that values used are the same as for ESM1.5.

penguian commented 1 year ago

@ccc561@nci.org.au changed _comment0 which not transferred by tractive

penguian commented 1 year ago

@rml599@nci.org.au changed _comment1 which not transferred by tractive

penguian commented 1 year ago

@ccc561@nci.org.au commented


Second change:

      IF( cable_runtime%esm15_dryLeaf ) THEN
        ! Calculate fraction of canopy which is wet:
        canopy%fwet(i) = MAX( 0.0, MIN( 1.0, 0.8 * canopy%cansto(i)/ MAX(  &
                              cansat(i),0.01 ) ) )
      ENDIF

Already discussed in ticket #341

penguian commented 1 year ago

@ccc561@nci.org.au commented


Third change:

      ! Michaelis menten constant of Rubisco for CO2:
      IF( cable_runtime%esm15_dryLeaf ) THEN
            conkct(i) = Cconkc0 * EXP( (Cekc / ( Crgas*Ctrefk) ) *         &
                        ( 1.0 - Ctrefk/tlfx(i) ) )

            ! Michaelis menten constant of Rubisco for oxygen:
            conkot(i) = Cconko0 * EXP( ( Ceko / (Crgas*Ctrefk) ) *         &
                        ( 1.0 - Ctrefk/tlfx(i) ) )
      ELSE
        conkct(i) = veg%conkc0(i) * EXP( ( veg%ekc(i) / (Crgas*Ctrefk) ) &
                  * ( 1.0 - Ctrefk/tlfx(i) ) )

        ! Michaelis menten constant of Rubisco for oxygen:
        conkot(i) = veg%conko0(i) * EXP( ( veg%eko(i) / (Crgas*Ctrefk) ) &
                  * ( 1.0 - Ctrefk/tlfx(i) ) )
      ENDIF   

Differences are between:

This seems again a question of whether we want to use fixed constants given by the code or use more flexibility by introducing new pft parameters.

penguian commented 1 year ago

@ccc561@nci.org.au commented


Fourth change is more complicated.

      rdx(i,1) = (Ccfrd3*vcmxt3(i,1) + Ccfrd4*vcmxt4(i,1))
      rdx(i,2) = (Ccfrd3*vcmxt3(i,2) + Ccfrd4*vcmxt4(i,2))

      IF( cable_runtime%esm15_dryLeaf ) THEN
        xleuning(i,1) = ( fwsoil(i) / ( csx(i,1) - co2cp3 ) )              &
                          * ( ( 1.0 - veg%frac4(i) ) * CA1C3 / ( 1.0 + dsx(i) &
                          / Cd0c3 ) + veg%frac4(i)    * CA1C4 / (1.0+dsx(i)/ &
                          Cd0c4) )

        xleuning(i,2) = ( fwsoil(i) / ( csx(i,2)-co2cp3 ) )                &
                            * ( (1.0-veg%frac4(i) ) * CA1C3 / ( 1.0 + dsx(i) /&
                            Cd0c3 ) + veg%frac4(i)    * CA1C4 / (1.0+ dsx(i)/&
                            Cd0c4) )

        gs_coeff(:,:) = xleuning(:,:)

      ELSE
        IF (cable_user%CALL_climate) THEN
          ( CALL_climate special case we don't care about)

        ELSE !cable_user%call_climate

          !!$!Vanessa:note there is no xleuning to go into photosynthesis etc anymore
          !!$             gs_coeff = xleuning

          rdx(i,1) = (veg%cfrd(i)*vcmxt3(i,1) + veg%cfrd(i)*vcmxt4(i,1))
          rdx(i,2) = (veg%cfrd(i)*vcmxt3(i,2) + veg%cfrd(i)*vcmxt4(i,2))

        ENDIF !cable_user%call_climate

      ENDIF ! IF( cable_runtime%esm15_dryLeaf ) THEN

If we look at the top lines (rdx) and bottom lines also for rdx, these seem similar but again with a difference between constants in the code or pft parameters. Need to check Ccfrd3 and Ccfrd4 are the same. Confirmed 'Ccfrd3 # 0.010', 'Ccfrd4 0.025' whereas veg%cfrd seems to be 0.015 for c3 types and 0.025 for c4 types. Looks like we should be able to delete the top rdx lines and just change the cfrd parameter values to reproduce ESM1.5 behaviour.

ccfrd3 and ccfrd4 are set in cable_photo_constants.mod veg%cfrd set in cable_pft_params.F90 Values currently not consistent. Retire ccfrd3/4 and only set through cable_pft_params.F90. Need to look for more generic solution going forward for setting these types of parameters. Need to check if any of the other parameters in cable_photo_constants.mod are also doubled up.

Traced change in ccfrd3 value from 0.015 to 0.010 to ESM1.5/CABLE2.4 version documented in Sec 2.2.2 of Ziehn et al., JSHESS, 2020 (https://www.publish.csiro.au/es/ES19035) as part of tuning to improve leaf respiration/productivity.

To understand the xleuning and gs_coeff lines, we need to look at the next difference:

      ! Ticket #56 added switch for Belinda Medlyn's model
      IF (  cable_user%GS_SWITCH == 'leuning') THEN

        IF( .NOT. cable_runtime%esm15_dryLeaf ) THEN

          gs_coeff(i,1) = ( fwsoil(i) / ( csx(i,1) - co2cp3 ) )              &
                          * ( veg%a1gs(i) / ( 1.0 + dsx(i)/veg%d0gs(i)))

          gs_coeff(i,2) = ( fwsoil(i) / ( csx(i,2) - co2cp3 ) )              &
                          * ( veg%a1gs(i) / ( 1.0 + dsx(i)/veg%d0gs(i)))

        ENDIF ! IF( .NOT. cable_runtime%esm15_dryLeaf ) THEN

      ELSEIF(cable_user%GS_SWITCH == 'medlyn') THEN

These lines could be equivalent but we would need to check the values of the constants and the new pft parameters a1gs and d0gs.

But otherwise, it seems the code was modified in its structure because of the introduction of the Medlyn case.

penguian commented 1 year ago

@rml599@nci.org.au changed _comment0 which not transferred by tractive

penguian commented 1 year ago

@rml599@nci.org.au changed _comment1 which not transferred by tractive

penguian commented 1 year ago

@rml599@nci.org.au changed _comment2 which not transferred by tractive

penguian commented 1 year ago

@rml599@nci.org.au changed _comment3 which not transferred by tractive

penguian commented 1 year ago

@ccc561@nci.org.au commented


Fifth change:

            IF( .NOT. cable_runtime%esm15_dryLeaf ) THEN
              dsx(i)=  MAX(dsx(i),0.0)
            END IF    

I have no idea of the impact of this change. It potentially needs to be investigated on its own.

penguian commented 1 year ago

@ccc561@nci.org.au commented


Last change:

canopy%frday = 12.0 * SUM(rdy, 2)

IF( cable_runtime%esm15_dryLeaf ) THEN
  canopy%fpn = -12.0 * SUM(an_y, 2)
ELSE
  canopy%fpn = MIN(-12.0 * SUM(an_y, 2), canopy%frday)
END IF    

Yingping highlighted previously that the trunk version is scientifically wrong. Probably the change with the most impact - but why does it run OK with ESM1.5? Is the condition or similar somewhere else? TO BE RESOLVED SOMETIME

But Yingping said:

If you turn off that line of code, at night time, water, energy and carbon fluxes went crazy. That line of code simply covers up the abnormal carbon flux, water and energy fluxes are not corrected. The fundamental issue lies elsewhere.

penguian commented 1 year ago

@rml599@nci.org.au changed _comment0 which not transferred by tractive

penguian commented 1 year ago

@rml599@nci.org.au changed _comment1 which not transferred by tractive

penguian commented 1 year ago

@jxs599@nci.org.au changed status from new to closed

penguian commented 1 year ago

@jxs599@nci.org.au set resolution to fixed

penguian commented 1 year ago

@jxs599@nci.org.au set milestone to 1. Closed

penguian commented 1 year ago

@ccc561@nci.org.au set keywords to maygit