! TestUPGM.f90 ! ! FUNCTIONS: ! TestUPGM - Entry point of console application. ! !**************************************************************************** ! ! PROGRAM: TestUPGM ! ! PURPOSE: Entry point for the console application. ! !**************************************************************************** program TestUPGM use upgm_mod use Preprocess_mod use gddmethod1_mod use gddmethodWEPS_mod use test_phenol_mod, only : test_phenol use constants, only : dp, int32 use environment_state_mod implicit none type(upgm) :: theModel type(environment_state) :: env real(dp) :: r_setter real(dp), dimension(12) :: ra_setter integer(int32) :: i_setter logical :: l_setter real(dp) :: remgdd, daygdd logical :: success = .false. CHARACTER(len=255) :: cd real(dp), dimension(5) :: soil_moisture real(dp), dimension(4) :: gdd_resp, gdd_curve integer(int32) :: nextstage call GETCWD(cd) print *, trim(cd) theModel = UPGM() call theModel%plant%plantstate%init() ! prepare to add processes theModel%plant%processCurrent%ptr => theModel%plant%processes%ptr ! prepare to add phases theModel%plant%phaseCurrent%ptr => theModel%plant%phases%ptr ! iniitalize environmental conditions env = environment_state() call env%init() r_setter = 0.0_dp call env%state%put("tmin", r_setter, success) r_setter = 15.0_dp call env%state%put("tmax", r_setter, success) ! add process ! create gddWEPS method call theModel%plant%add_process("gddweps_method", "WEPS GDD", 0) ! create input names r_setter = 0.0_dp call theModel%plant%plantstate%pars%put("tbase", r_setter, success) r_setter = 15.0_dp call theModel%plant%plantstate%pars%put("topt", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%state%put("daygdd", r_setter, success) ! add process ! create ritchieVernalization method call theModel%plant%add_process("ritchie_vernalization", "Vernalization", 0) ! create input names r_setter = 0.0_dp call theModel%plant%plantstate%state%put("chill_unit_cum", r_setter, success) ! add process ! create ritchieHardening method call theModel%plant%add_process("ritchie_winterhardening", "Winter Hardening", 0) ! create input names r_setter = 2.0_dp call env%state%put("tsmn1", r_setter, success) r_setter = 13.0_dp call env%state%put("tsmx1", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%state%put("harden_index", r_setter, success) ! add process ! create WEPSwarmdays method call theModel%plant%add_process("weps_warmdays", "Warm Days", 0) ! create input names r_setter = 0.0_dp call theModel%plant%plantstate%state%put("warmdays", r_setter, success) ! add undefined process ! call theModel%plant%add_process("apple_pie", "Apple Pie", 0) ! add phase call theModel%plant%add_phase("pmms_germination", "Germination", 0) ! phase state parameter call theModel%plant%phaseCurrent%ptr%phaseState%put("stagegdd", r_setter, success) ! phase specific parameters for this instance gdd_curve = [0.45, 0.35, 0.25, -0.1] !"ratio" response call theModel%plant%phaseCurrent%ptr%phasePars%put("gdd_curve", gdd_curve, success) gdd_resp = [25, 30, 35, 600] ! corresponding gdd value call theModel%plant%phaseCurrent%ptr%phasePars%put("gdd_resp", gdd_resp, success) ! create all input names soil_moisture = [0.45, 0.35, 0.30, 0.35, 0.32] call env%state%put("swc", soil_moisture, success) i_setter = 2 ! planting in layer 2 call theModel%plant%plantstate%state%put("p_depth", i_setter, success) ! add phase !call theModel%plant%add_phase("weps_initialize", "Initialize", 1) ! create all input names l_setter = .true. call theModel%plant%plantstate%state%put("crop_init", l_setter, success) r_setter = 220.0_dp call theModel%plant%plantstate%pars%put("plantpop", r_setter, success) r_setter = 335.0_dp call theModel%plant%plantstate%pars%put("mshoot", r_setter, success) r_setter = 8.0_dp call theModel%plant%plantstate%pars%put("dmaxshoot", r_setter, success) r_setter = 0.05_dp call theModel%plant%plantstate%pars%put("huie", r_setter, success) r_setter = 1800.0_dp call theModel%plant%plantstate%pars%put("thum", r_setter, success) i_setter = 120 call theModel%plant%plantstate%pars%put("pdate", i_setter, success) i_setter = 1 call theModel%plant%plantstate%pars%put("thudf", i_setter, success) r_setter = 0.025_dp call theModel%plant%plantstate%pars%put("growdepth", r_setter, success) r_setter = 28.571428_dp call theModel%plant%plantstate%pars%put("storeinit", r_setter, success) i_setter = 60 call theModel%plant%plantstate%pars%put("dtm", i_setter, success) ra_setter = [0.04_dp, 0.10_dp, 0.25_dp, 0.6_dp, 1.0_dp, 1.5_dp, 2.0_dp, 2.5_dp, 3.0_dp, 3.5_dp, 4.0_dp, 5.0_dp] call env%state%put("laydepths", ra_setter, success) ra_setter = [1.5_dp, 3.0_dp, 5.0_dp, 9.0_dp, 14.0_dp, 18.0_dp, 21.0_dp, 22.0_dp, 17.0_dp, 15.0_dp, 10.0_dp, 4.0_dp] call env%state%put("mavtmx", ra_setter, success) ra_setter = [-4.5_dp, -1.0_dp, 0.0_dp, 3.0_dp, 9.0_dp, 12.0_dp, 15.0_dp, 16.0_dp, 11.0_dp, 9.0_dp, 3.0_dp, -2.0_dp] call env%state%put("mavtmn", ra_setter, success) r_setter = 38.0_dp call env%state%put("amalat", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%state%put("mstandstem", r_setter, success) call theModel%plant%plantstate%state%put("mstandleaf", r_setter, success) call theModel%plant%plantstate%state%put("mstandstore", r_setter, success) call theModel%plant%plantstate%state%put("mflatstem", r_setter, success) call theModel%plant%plantstate%state%put("mflatleaf", r_setter, success) call theModel%plant%plantstate%state%put("mflatstore", r_setter, success) call theModel%plant%plantstate%state%put("masshoot", r_setter, success) call theModel%plant%plantstate%state%put("mtotshoot", r_setter, success) ra_setter = [0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp] call theModel%plant%plantstate%state%put("mbgstemz", ra_setter, success) call theModel%plant%plantstate%state%put("mrootstorez", ra_setter, success) call theModel%plant%plantstate%state%put("mrootfiberz", ra_setter, success) call theModel%plant%plantstate%state%put("height", r_setter, success) call theModel%plant%plantstate%state%put("zshoot", r_setter, success) call theModel%plant%plantstate%state%put("dstm", r_setter, success) call theModel%plant%plantstate%state%put("zrtd", r_setter, success) call theModel%plant%plantstate%state%put("zgrowpt", r_setter, success) call theModel%plant%plantstate%state%put("fliveleaf", r_setter, success) call theModel%plant%plantstate%state%put("trthucum", r_setter, success) call theModel%plant%plantstate%state%put("thu_shoot_beg", r_setter, success) call theModel%plant%plantstate%state%put("thu_shoot_end", r_setter, success) call theModel%plant%plantstate%state%put("thardnx", r_setter, success) call theModel%plant%plantstate%state%put("grainf", r_setter, success) call theModel%plant%plantstate%state%put("leafareatrend", r_setter, success) call theModel%plant%plantstate%state%put("stemmasstrend", r_setter, success) call theModel%plant%plantstate%state%put("tchillucum", r_setter, success) ! add phase call theModel%plant%add_phase("pmms_basephenol", "Emergence", 0) ! create all input names r_setter = 0.0_dp call theModel%plant%plantstate%state%put("stress", r_setter, success) call theModel%plant%phaseCurrent%ptr%phaseState%put("phase_rel_gdd", r_setter, success) call theModel%plant%phaseCurrent%ptr%phaseState%put("stagegdd", r_setter, success) r_setter = 0.1_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("height_inc", r_setter, success) r_setter = 200.0_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GN_trans_gdd", r_setter, success) r_setter = 0.2_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GN_stress", r_setter, success) r_setter = 250.0_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GS_trans_gdd", r_setter, success) r_setter = 0.8_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GS_stress", r_setter, success) ! add phase call theModel%plant%add_phase("pmms_fallphenol", "Tiller_Initiation", 0) ! create all input names r_setter = 0.0_dp call theModel%plant%plantstate%state%put("stress", r_setter, success) call theModel%plant%phaseCurrent%ptr%phaseState%put("phase_rel_gdd", r_setter, success) call theModel%plant%phaseCurrent%ptr%phaseState%put("stagegdd", r_setter, success) r_setter = 0.05_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("height_inc", r_setter, success) r_setter = 200.0_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GN_trans_gdd", r_setter, success) r_setter = 0.1_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GN_stress", r_setter, success) r_setter = 200.0_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GS_trans_gdd", r_setter, success) r_setter = 0.9_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("GS_stress", r_setter, success) r_setter = 0.035_dp call theModel%plant%phaseCurrent%ptr%phasePars%put("tverndel", r_setter, success) ! add phase ! call theModel%plant%add_phase("weps_shootgrow", "Shoot Grow", 0) ! create all input names ra_setter = [5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp, 5.0_dp] call env%state%put("htsmn", ra_setter, success) r_setter = 30.0_dp call env%state%put("eirr", r_setter, success) r_setter = 1.0_dp call env%state%put("fwsf", r_setter, success) r_setter = 12.0_dp call env%state%put("hrlty", r_setter, success) r_setter = 12.0_dp call env%state%put("hrlt", r_setter, success) r_setter = 1.2_dp call theModel%plant%plantstate%pars%put("hmx", r_setter, success) r_setter = 1.4_dp call theModel%plant%plantstate%pars%put("leafstem", r_setter, success) r_setter = 0.012_dp call theModel%plant%plantstate%pars%put("fshoot", r_setter, success) r_setter = 2.87_dp call theModel%plant%plantstate%pars%put("ssaa", r_setter, success) r_setter = 1.0_dp call theModel%plant%plantstate%pars%put("ssab", r_setter, success) r_setter = 0.3_dp call theModel%plant%plantstate%pars%put("diammax", r_setter, success) i_setter = 2 call theModel%plant%plantstate%pars%put("hyldflag", i_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%pars%put("yield_coefficient", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%pars%put("residue_intercept", r_setter, success) r_setter = 1.0_dp call theModel%plant%plantstate%pars%put("grf", r_setter, success) r_setter = 0.6_dp call theModel%plant%plantstate%pars%put("ck", r_setter, success) r_setter = 0.8_dp call theModel%plant%plantstate%pars%put("hui0", r_setter, success) i_setter = 1 call theModel%plant%plantstate%pars%put("idc", i_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%pars%put("rowspac", r_setter, success) r_setter = 1.2192148_dp call theModel%plant%plantstate%pars%put("rdmx", r_setter, success) r_setter = 30.0_dp call theModel%plant%plantstate%pars%put("bceff", r_setter, success) r_setter = 0.013_dp call theModel%plant%plantstate%pars%put("a_lf", r_setter, success) r_setter = 0.8013_dp call theModel%plant%plantstate%pars%put("b_lf", r_setter, success) r_setter = 0.4293_dp call theModel%plant%plantstate%pars%put("c_lf", r_setter, success) r_setter = -0.086_dp call theModel%plant%plantstate%pars%put("d_lf", r_setter, success) r_setter = -0.018_dp call theModel%plant%plantstate%pars%put("a_rp", r_setter, success) r_setter = 0.932_dp call theModel%plant%plantstate%pars%put("b_rp", r_setter, success) r_setter = 0.556_dp call theModel%plant%plantstate%pars%put("c_rp", r_setter, success) r_setter = 0.0736_dp call theModel%plant%plantstate%pars%put("d_rp", r_setter, success) r_setter = 0.3293_dp call theModel%plant%plantstate%pars%put("a_ht", r_setter, success) r_setter = -0.086_dp call theModel%plant%plantstate%pars%put("b_ht", r_setter, success) r_setter = 20.0_dp call theModel%plant%plantstate%pars%put("sla", r_setter, success) r_setter = 0.005_dp call theModel%plant%plantstate%pars%put("stemdia", r_setter, success) r_setter = 1.0_dp call theModel%plant%plantstate%pars%put("cbafact", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%pars%put("leaf2stor", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%pars%put("stem2stor", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%pars%put("stor2stor", r_setter, success) r_setter = 1.0_dp call theModel%plant%plantstate%pars%put("regrmshoot", r_setter, success) r_setter = -5.0_dp call theModel%plant%plantstate%pars%put("frsx1", r_setter, success) r_setter = 0.005_dp call theModel%plant%plantstate%pars%put("frsy1", r_setter, success) r_setter = -15.0_dp call theModel%plant%plantstate%pars%put("frsx2", r_setter, success) r_setter = 0.05_dp call theModel%plant%plantstate%pars%put("frsy2", r_setter, success) r_setter = 0.0_dp call theModel%plant%plantstate%state%put("zloc_regrow", r_setter, success) i_setter = 0.0_dp call theModel%plant%plantstate%state%put("dayam", i_setter, success) ! loop day steps theModel%plant%phaseCurrent%ptr => theModel%plant%phases%ptr ! trigger initial data load to first phase nextstage = 1 call theModel%plant%plantstate%state%put("nextstage", nextstage, success) r_setter = 0.0_dp call theModel%plant%plantstate%state%put("remgdd", r_setter, success) write(*,*) 'BEFORE LOOP', associated(theModel%plant%phaseCurrent%ptr) do while( associated(theModel%plant%phaseCurrent%ptr) ) ! run daily preprocesses theModel%plant%processCurrent%ptr => theModel%plant%processes%ptr call theModel%preproc(env) ! update daily inputs select case(theModel%plant%phaseCurrent%ptr%phaseLabel) case ("Germination") soil_moisture = [0.45, 0.35, 0.30, 0.35, 0.32] call env%state%replace("swc", soil_moisture, success) case ("Emergence") r_setter = 0.3_dp call theModel%plant%plantstate%state%replace("stress", r_setter, success) case ("Tiller_Initiation") r_setter = 0.3_dp call theModel%plant%plantstate%state%replace("stress", r_setter, success) end select ! check for residual gdd and add to phase input call theModel%plant%plantstate%state%get("remgdd", remgdd, success) if( remgdd .gt. 0.0_dp ) then call theModel%plant%plantstate%state%get("daygdd", daygdd, success) write(*,*) 'REMGDD: ', remgdd, daygdd daygdd = daygdd + remgdd remgdd = 0.0_dp call theModel%plant%plantstate%state%replace("daygdd", daygdd, success) call theModel%plant%plantstate%state%replace("remgdd", remgdd, success) end if ! run current phase call theModel%grow(env) end do !call test_phenol() call UPGM_DELETE(theModel) ! cleanup the model end program TestUPGM