Skip to content

Avoid in-code checks of PFT type #3388

@samsrabin

Description

@samsrabin

We have a bunch of integer variables in pftconMod that are unique IDs for each PFT ("vegetation type constants"):

! Vegetation type constants
!
integer, public :: noveg ! value for not vegetated
integer, public :: ndllf_evr_tmp_tree ! value for Needleleaf evergreen temperate tree
integer, public :: ndllf_evr_brl_tree ! value for Needleleaf evergreen boreal tree
integer, public :: ndllf_dcd_brl_tree ! value for Needleleaf deciduous boreal tree
integer, public :: nbrdlf_evr_trp_tree ! value for Broadleaf evergreen tropical tree
integer, public :: nbrdlf_evr_tmp_tree ! value for Broadleaf evergreen temperate tree
integer, public :: nbrdlf_dcd_trp_tree ! value for Broadleaf deciduous tropical tree
integer, public :: nbrdlf_dcd_tmp_tree ! value for Broadleaf deciduous temperate tree
integer, public :: nbrdlf_dcd_brl_tree ! value for Broadleaf deciduous boreal tree
integer, public :: nbrdlf_evr_shrub ! value for Broadleaf evergreen shrub
integer, public :: nbrdlf_dcd_tmp_shrub ! value for Broadleaf deciduous temperate shrub
integer, public :: nbrdlf_dcd_brl_shrub ! value for Broadleaf deciduous boreal shrub
integer, public :: nc3_arctic_grass ! value for C3 arctic grass
integer, public :: nc3_nonarctic_grass ! value for C3 non-arctic grass
integer, public :: nc4_grass ! value for C4 grass
integer, public :: npcropmin ! value for first crop
integer, public :: ntmp_corn ! value for temperate corn, rain fed (rf)
integer, public :: nirrig_tmp_corn ! value for temperate corn, irrigated (ir)
integer, public :: nswheat ! value for spring temperate cereal (rf)
integer, public :: nirrig_swheat ! value for spring temperate cereal (ir)
integer, public :: nwwheat ! value for winter temperate cereal (rf)
integer, public :: nirrig_wwheat ! value for winter temperate cereal (ir)
integer, public :: ntmp_soybean ! value for temperate soybean (rf)
integer, public :: nirrig_tmp_soybean ! value for temperate soybean (ir)
integer, public :: nbarley ! value for spring barley (rf)
integer, public :: nirrig_barley ! value for spring barley (ir)
integer, public :: nwbarley ! value for winter barley (rf)
integer, public :: nirrig_wbarley ! value for winter barley (ir)
integer, public :: nrye ! value for spring rye (rf)
integer, public :: nirrig_rye ! value for spring rye (ir)
integer, public :: nwrye ! value for winter rye (rf)
integer, public :: nirrig_wrye ! value for winter rye (ir)
integer, public :: ncassava ! ...and so on
integer, public :: nirrig_cassava
integer, public :: ncitrus
integer, public :: nirrig_citrus
integer, public :: ncocoa
integer, public :: nirrig_cocoa
integer, public :: ncoffee
integer, public :: nirrig_coffee
integer, public :: ncotton
integer, public :: nirrig_cotton
integer, public :: ndatepalm
integer, public :: nirrig_datepalm
integer, public :: nfoddergrass
integer, public :: nirrig_foddergrass
integer, public :: ngrapes
integer, public :: nirrig_grapes
integer, public :: ngroundnuts
integer, public :: nirrig_groundnuts
integer, public :: nmillet
integer, public :: nirrig_millet
integer, public :: noilpalm
integer, public :: nirrig_oilpalm
integer, public :: npotatoes
integer, public :: nirrig_potatoes
integer, public :: npulses
integer, public :: nirrig_pulses
integer, public :: nrapeseed
integer, public :: nirrig_rapeseed
integer, public :: nrice
integer, public :: nirrig_rice
integer, public :: nsorghum
integer, public :: nirrig_sorghum
integer, public :: nsugarbeet
integer, public :: nirrig_sugarbeet
integer, public :: nsugarcane
integer, public :: nirrig_sugarcane
integer, public :: nsunflower
integer, public :: nirrig_sunflower
integer, public :: nmiscanthus
integer, public :: nirrig_miscanthus
integer, public :: nswitchgrass
integer, public :: nirrig_switchgrass
integer, public :: ntrp_corn !value for tropical corn (rf)
integer, public :: nirrig_trp_corn !value for tropical corn (ir)
integer, public :: ntrp_soybean !value for tropical soybean (rf)
integer, public :: nirrig_trp_soybean !value for tropical soybean (ir)
integer, public :: npcropmax ! value for last prognostic crop in list
integer, public :: nc3crop ! value for generic crop (rf)
integer, public :: nc3irrig ! value for irrigated generic crop (ir)

These are used throughout the code in checks like veg_type == ndllf_evr_tmp_tree. We should move to using the parameter file for this instead, to facilitate changing PFT characteristics and adding new ones. For example, the ISIMIP runs may require some unused PFTs to be replaced with different ones, which will necessitate not just changing the parameter file but also looking through the code for these manual checks. In addition, it would make the affected code easier to read.

This especially makes things hard for non-developers trying to develop new crops (e.g.). They have to scour the code for places where PFT integers might need to be used.

Although I think this would be an easy job, it wouldn't have to happen all at once. There's some very low-hanging fruit out there. For instance, this could be replaced with a gdd20_type parameter:

! which GDD*20 variable does this crop use?
if (ivt(p) == ntmp_soybean .or. ivt(p) == nirrig_tmp_soybean .or. &
ivt(p) == ntrp_soybean .or. ivt(p) == nirrig_trp_soybean) then
gdd20 = gdd1020(p)
else if (ivt(p) == ntmp_corn .or. ivt(p) == nirrig_tmp_corn .or. &
ivt(p) == ntrp_corn .or. ivt(p) == nirrig_trp_corn .or. &
ivt(p) == nsugarcane .or. ivt(p) == nirrig_sugarcane .or. &
ivt(p) == nmiscanthus .or. ivt(p) == nirrig_miscanthus .or. &
ivt(p) == nswitchgrass .or. ivt(p) == nirrig_switchgrass) then
gdd20 = gdd820(p)
else if (ivt(p) == nswheat .or. ivt(p) == nirrig_swheat .or. &
ivt(p) == nwwheat .or. ivt(p) == nirrig_wwheat .or. &
ivt(p) == ncotton .or. ivt(p) == nirrig_cotton .or. &
ivt(p) == nrice .or. ivt(p) == nirrig_rice) then
gdd20 = gdd020(p)
else
write(iulog, *) 'ERROR: PlantCrop(): unrecognized ivt for gdd20: ',ivt(p)
call endrun(msg="Stopping")
end if

Note that fully resolving this would also necessarily involve solving Issue #21.

Metadata

Metadata

Assignees

No one assigned

    Labels

    b4bbit-for-bitcode healthimproving internal code structure to make easier to maintain (sustainability)
    No fields configured for Code Health.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions