From e08ce7f0fcc890f5d108ddc2789e79851b906274 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Wed, 12 Mar 2025 11:46:25 +1100 Subject: [PATCH 1/4] Initialise CASA types to zero on allocation This is done to avoid exceptions due to uninitialised memory access for debug builds. --- src/science/casa-cnp/casa_variable.F90 | 546 ++++++++++++------------- 1 file changed, 273 insertions(+), 273 deletions(-) diff --git a/src/science/casa-cnp/casa_variable.F90 b/src/science/casa-cnp/casa_variable.F90 index 0430438a9..8b56740a4 100644 --- a/src/science/casa-cnp/casa_variable.F90 +++ b/src/science/casa-cnp/casa_variable.F90 @@ -296,281 +296,281 @@ MODULE casavariable CONTAINS - SUBROUTINE alloc_casavariable(casabiome,casapool,casaflux, & - casamet,casabal,arraysize) - - USE casaparm, ONLY : leaf - IMPLICIT NONE - TYPE (casa_biome) , INTENT(INOUT) :: casabiome - TYPE (casa_pool) , INTENT(INOUT) :: casapool - TYPE (casa_flux) , INTENT(INOUT) :: casaflux - TYPE (casa_met) , INTENT(INOUT) :: casamet + SUBROUTINE alloc_casavariable(casabiome,casapool,casaflux,casamet,casabal,arraysize) + !* Allocate casabiome, casapool, casaflux, casamet and casabal derived type instances. + ! Allocated arrays are initialised to zero. + + TYPE (casa_biome), INTENT(INOUT) :: casabiome + TYPE (casa_pool), INTENT(INOUT) :: casapool + TYPE (casa_flux), INTENT(INOUT) :: casaflux + TYPE (casa_met), INTENT(INOUT) :: casamet TYPE (casa_balance), INTENT(INOUT) :: casabal - INTEGER, INTENT(IN) :: arraysize - - ALLOCATE(casabiome%ivt2(mvtype), & - casabiome%xkleafcoldmax(mvtype), & - casabiome%xkleafcoldexp(mvtype), & - casabiome%xkleafdrymax(mvtype), & - casabiome%xkleafdryexp(mvtype), & - casabiome%glaimax(mvtype), & - casabiome%glaimin(mvtype), & - casabiome%sla(mvtype), & - casabiome%ratiofrootleaf(mvtype), & - casabiome%kroot(mvtype), & - casabiome%krootlen(mvtype), & - casabiome%rootdepth(mvtype), & - casabiome%kuptake(mvtype), & - casabiome%kminN(mvtype), & - casabiome%KuplabP(mvtype), & - casabiome%kclabrate(mvtype), & - casabiome%xnpmax(mvtype), & - casabiome%q10soil(mvtype), & - casabiome%xkoptlitter(mvtype), & - casabiome%xkoptsoil(mvtype), & - casabiome%xkplab(mso), & - casabiome%xkpsorb(mso), & - casabiome%xkpocc(mso), & - casabiome%prodptase(mvtype), & - casabiome%costnpup(mvtype), & - casabiome%maxfinelitter(mvtype), & - casabiome%maxcwd(mvtype), & - casabiome%nintercept(mvtype), & - casabiome%nslope(mvtype), & - casabiome%plantrate(mvtype,mplant), & - casabiome%rmplant(mvtype,mplant), & - casabiome%fracnpptoP(mvtype,mplant), & - casabiome%fraclignin(mvtype,mplant), & - casabiome%fraclabile(mvtype,mplant), & - casabiome%ratioNCplantmin(mvtype,mplant), & - casabiome%ratioNCplantmax(mvtype,mplant), & - casabiome%ratioNPplantmin(mvtype,mplant), & - casabiome%ratioNPplantmax(mvtype,mplant), & - casabiome%fracLigninplant(mvtype,mplant), & - casabiome%ftransNPtoL(mvtype,mplant), & - casabiome%ftransPPtoL(mvtype,mplant), & - casabiome%litterrate(mvtype,mlitter), & - casabiome%soilrate(mvtype,msoil), & - ! casabiome%ratioPcplantmax(mvtype,leaf), & - ! casabiome%ratioPcplantmin(mvtype,leaf) & - ! vh_js ! - casabiome%ratioPcplantmax(mvtype,mplant), & - casabiome%ratioPcplantmin(mvtype,mplant) & - ) - - ALLOCATE(casapool%Clabile(arraysize), & - casapool%dClabiledt(arraysize), & - casapool%Cplant(arraysize,mplant), & - casapool%Nplant(arraysize,mplant), & - casapool%Pplant(arraysize,mplant), & - casapool%dCplantdt(arraysize,mplant), & - casapool%dNplantdt(arraysize,mplant), & - casapool%dPplantdt(arraysize,mplant), & - casapool%ratioNCplant(arraysize,mplant), & - casapool%ratioNPplant(arraysize,mplant), & - casapool%Nsoilmin(arraysize), & - casapool%Psoillab(arraysize), & - casapool%Psoilsorb(arraysize), & - casapool%Psoilocc(arraysize), & - casapool%dNsoilmindt(arraysize), & - casapool%dPsoillabdt(arraysize), & - casapool%dPsoilsorbdt(arraysize), & - casapool%dPsoiloccdt(arraysize), & - casapool%Clitter(arraysize,mlitter), & - casapool%Nlitter(arraysize,mlitter), & - casapool%Plitter(arraysize,mlitter), & - casapool%dClitterdt(arraysize,mlitter), & - casapool%dNlitterdt(arraysize,mlitter), & - casapool%dPlitterdt(arraysize,mlitter), & - casapool%ratioNClitter(arraysize,mlitter), & - casapool%ratioNPlitter(arraysize,mlitter), & - casapool%Csoil(arraysize,msoil), & - casapool%Nsoil(arraysize,msoil), & - casapool%Psoil(arraysize,msoil), & - casapool%dCsoildt(arraysize,msoil), & - casapool%dNsoildt(arraysize,msoil), & - casapool%dPsoildt(arraysize,msoil), & - casapool%ratioNCsoil(arraysize,msoil), & - casapool%ratioNPsoil(arraysize,msoil), & - casapool%ratioNCsoilnew(arraysize,msoil), & - casapool%ratioNCsoilmin(arraysize,msoil), & - casapool%ratioNCsoilmax(arraysize,msoil), & - casapool%ratioPcsoil(arraysize,msoil), & - casapool%ratioPcplant(arraysize,mplant), & - casapool%ratioPclitter(arraysize,mlitter), & - casapool%Ctot_0(arraysize), & - casapool%Ctot(arraysize), & - casapool%cwoodprod(arraysize,mwood), & - casapool%nwoodprod(arraysize,mwood), & - casapool%pwoodprod(arraysize,mwood)) - - ALLOCATE(casaflux%Cgpp(arraysize), & - casaflux%Cnpp(arraysize), & - casaflux%Crp(arraysize), & - casaflux%Crgplant(arraysize), & - casaflux%Nminfix(arraysize), & - casaflux%Nminuptake(arraysize), & - casaflux%Plabuptake(arraysize), & - casaflux%Clabloss(arraysize), & - casaflux%fracClabile(arraysize), & - casaflux%fracCalloc(arraysize,mplant), & - casaflux%fracNalloc(arraysize,mplant), & - casaflux%fracPalloc(arraysize,mplant), & - casaflux%kplant(arraysize,mplant), & - casaflux%Crmplant(arraysize,mplant), & - casaflux%fromPtoL(arraysize,mlitter,mplant), & - casaflux%Cnep(arraysize), & - casaflux%Crsoil(arraysize), & - casaflux%Nmindep(arraysize), & - casaflux%Nminloss(arraysize), & - casaflux%Nminleach(arraysize), & - casaflux%Nupland(arraysize), & - casaflux%Nlittermin(arraysize), & - casaflux%Nsmin(arraysize), & - casaflux%Nsimm(arraysize), & - casaflux%Nsnet(arraysize), & - casaflux%fNminloss(arraysize), & - casaflux%fNminleach(arraysize), & - casaflux%Pdep(arraysize), & - casaflux%Pwea(arraysize), & - casaflux%Pleach(arraysize), & - casaflux%Ploss(arraysize), & - casaflux%Pupland(arraysize), & - casaflux%Plittermin(arraysize), & - casaflux%Psmin(arraysize), & - casaflux%Psimm(arraysize), & - casaflux%Psnet(arraysize), & - casaflux%fPleach(arraysize), & - casaflux%kplab(arraysize), & - casaflux%kpsorb(arraysize), & - casaflux%kpocc(arraysize), & - casaflux%kmlabP(arraysize), & - casaflux%Psorbmax(arraysize), & - casaflux%klitter(arraysize,mlitter), & - casaflux%ksoil(arraysize,msoil), & - casaflux%fromLtoS(arraysize,msoil,mlitter), & - casaflux%fromStoS(arraysize,msoil,msoil), & - casaflux%fromLtoCO2(arraysize,mlitter), & - casaflux%fromStoCO2(arraysize,msoil), & - casaflux%stemnpp(arraysize), & - casaflux%frac_sapwood(arraysize), & - casaflux%sapwood_area(arraysize), & - casaflux%Cplant_turnover(arraysize,mplant) , & - casaflux%Cplant_turnover_disturbance(arraysize) , & - casaflux%Cplant_turnover_crowding(arraysize) , & - casaflux%Cplant_turnover_resource_limitation(arraysize)) - - ALLOCATE(casaflux%FluxCtolitter(arraysize,mlitter), & - casaflux%FluxNtolitter(arraysize,mlitter), & - casaflux%FluxPtolitter(arraysize,mlitter)) - - ALLOCATE(casaflux%FluxCtosoil(arraysize,msoil), & - casaflux%FluxNtosoil(arraysize,msoil), & - casaflux%FluxPtosoil(arraysize,msoil)) - - ALLOCATE(casaflux%FluxCtohwp(arraysize), & - casaflux%FluxNtohwp(arraysize), & - casaflux%FluxPtohwp(arraysize)) - - ALLOCATE(casaflux%FluxCtoclear(arraysize), & - casaflux%FluxNtoclear(arraysize), & - casaflux%FluxPtoclear(arraysize)) - - ALLOCATE(casaflux%CtransferLUC(arraysize)) - - ALLOCATE(casaflux%FluxCtoco2(arraysize)) - - ALLOCATE(casaflux%meangpp(arraysize)) - ALLOCATE(casaflux%meanrleaf(arraysize)) + INTEGER, INTENT(IN ) :: arraysize + + ALLOCATE(casabiome%ivt2(mvtype), source=0) + ALLOCATE( & + casabiome%xkleafcoldmax(mvtype), & + casabiome%xkleafcoldexp(mvtype), & + casabiome%xkleafdrymax(mvtype), & + casabiome%xkleafdryexp(mvtype), & + casabiome%glaimax(mvtype), & + casabiome%glaimin(mvtype), & + casabiome%sla(mvtype), & + casabiome%ratiofrootleaf(mvtype), & + casabiome%kroot(mvtype), & + casabiome%krootlen(mvtype), & + casabiome%rootdepth(mvtype), & + casabiome%kuptake(mvtype), & + casabiome%kminN(mvtype), & + casabiome%KuplabP(mvtype), & + casabiome%kclabrate(mvtype), & + casabiome%xnpmax(mvtype), & + casabiome%q10soil(mvtype), & + casabiome%xkoptlitter(mvtype), & + casabiome%xkoptsoil(mvtype), & + casabiome%xkplab(mso), & + casabiome%xkpsorb(mso), & + casabiome%xkpocc(mso), & + casabiome%prodptase(mvtype), & + casabiome%costnpup(mvtype), & + casabiome%maxfinelitter(mvtype), & + casabiome%maxcwd(mvtype), & + casabiome%nintercept(mvtype), & + casabiome%nslope(mvtype), & + casabiome%plantrate(mvtype,mplant), & + casabiome%rmplant(mvtype,mplant), & + casabiome%fracnpptoP(mvtype,mplant), & + casabiome%fraclignin(mvtype,mplant), & + casabiome%fraclabile(mvtype,mplant), & + casabiome%ratioNCplantmin(mvtype,mplant), & + casabiome%ratioNCplantmax(mvtype,mplant), & + casabiome%ratioNPplantmin(mvtype,mplant), & + casabiome%ratioNPplantmax(mvtype,mplant), & + casabiome%fracLigninplant(mvtype,mplant), & + casabiome%ftransNPtoL(mvtype,mplant), & + casabiome%ftransPPtoL(mvtype,mplant), & + casabiome%litterrate(mvtype,mlitter), & + casabiome%soilrate(mvtype,msoil), & + casabiome%ratioPcplantmax(mvtype,mplant), & + casabiome%ratioPcplantmin(mvtype,mplant), & + source=0.0_r_2 & + ) + + ALLOCATE( & + casapool%Clabile(arraysize), & + casapool%dClabiledt(arraysize), & + casapool%Cplant(arraysize,mplant), & + casapool%Nplant(arraysize,mplant), & + casapool%Pplant(arraysize,mplant), & + casapool%dCplantdt(arraysize,mplant), & + casapool%dNplantdt(arraysize,mplant), & + casapool%dPplantdt(arraysize,mplant), & + casapool%ratioNCplant(arraysize,mplant), & + casapool%ratioNPplant(arraysize,mplant), & + casapool%Nsoilmin(arraysize), & + casapool%Psoillab(arraysize), & + casapool%Psoilsorb(arraysize), & + casapool%Psoilocc(arraysize), & + casapool%dNsoilmindt(arraysize), & + casapool%dPsoillabdt(arraysize), & + casapool%dPsoilsorbdt(arraysize), & + casapool%dPsoiloccdt(arraysize), & + casapool%Clitter(arraysize,mlitter), & + casapool%Nlitter(arraysize,mlitter), & + casapool%Plitter(arraysize,mlitter), & + casapool%dClitterdt(arraysize,mlitter), & + casapool%dNlitterdt(arraysize,mlitter), & + casapool%dPlitterdt(arraysize,mlitter), & + casapool%ratioNClitter(arraysize,mlitter), & + casapool%ratioNPlitter(arraysize,mlitter), & + casapool%Csoil(arraysize,msoil), & + casapool%Nsoil(arraysize,msoil), & + casapool%Psoil(arraysize,msoil), & + casapool%dCsoildt(arraysize,msoil), & + casapool%dNsoildt(arraysize,msoil), & + casapool%dPsoildt(arraysize,msoil), & + casapool%ratioNCsoil(arraysize,msoil), & + casapool%ratioNPsoil(arraysize,msoil), & + casapool%ratioNCsoilnew(arraysize,msoil), & + casapool%ratioNCsoilmin(arraysize,msoil), & + casapool%ratioNCsoilmax(arraysize,msoil), & + casapool%ratioPcsoil(arraysize,msoil), & + casapool%ratioPcplant(arraysize,mplant), & + casapool%ratioPclitter(arraysize,mlitter), & + casapool%Ctot_0(arraysize), & + casapool%Ctot(arraysize), & + casapool%cwoodprod(arraysize,mwood), & + casapool%nwoodprod(arraysize,mwood), & + casapool%pwoodprod(arraysize,mwood), & + source=0.0_r_2 & + ) + + ALLOCATE( & + casaflux%Cgpp(arraysize), & + casaflux%Cnpp(arraysize), & + casaflux%Crp(arraysize), & + casaflux%Crgplant(arraysize), & + casaflux%Nminfix(arraysize), & + casaflux%Nminuptake(arraysize), & + casaflux%Plabuptake(arraysize), & + casaflux%Clabloss(arraysize), & + casaflux%fracClabile(arraysize), & + casaflux%fracCalloc(arraysize,mplant), & + casaflux%fracNalloc(arraysize,mplant), & + casaflux%fracPalloc(arraysize,mplant), & + casaflux%kplant(arraysize,mplant), & + casaflux%Crmplant(arraysize,mplant), & + casaflux%fromPtoL(arraysize,mlitter,mplant), & + casaflux%Cnep(arraysize), & + casaflux%Crsoil(arraysize), & + casaflux%Nmindep(arraysize), & + casaflux%Nminloss(arraysize), & + casaflux%Nminleach(arraysize), & + casaflux%Nupland(arraysize), & + casaflux%Nlittermin(arraysize), & + casaflux%Nsmin(arraysize), & + casaflux%Nsimm(arraysize), & + casaflux%Nsnet(arraysize), & + casaflux%fNminloss(arraysize), & + casaflux%fNminleach(arraysize), & + casaflux%Pdep(arraysize), & + casaflux%Pwea(arraysize), & + casaflux%Pleach(arraysize), & + casaflux%Ploss(arraysize), & + casaflux%Pupland(arraysize), & + casaflux%Plittermin(arraysize), & + casaflux%Psmin(arraysize), & + casaflux%Psimm(arraysize), & + casaflux%Psnet(arraysize), & + casaflux%fPleach(arraysize), & + casaflux%kplab(arraysize), & + casaflux%kpsorb(arraysize), & + casaflux%kpocc(arraysize), & + casaflux%kmlabP(arraysize), & + casaflux%Psorbmax(arraysize), & + casaflux%klitter(arraysize,mlitter), & + casaflux%ksoil(arraysize,msoil), & + casaflux%fromLtoS(arraysize,msoil,mlitter), & + casaflux%fromStoS(arraysize,msoil,msoil), & + casaflux%fromLtoCO2(arraysize,mlitter), & + casaflux%fromStoCO2(arraysize,msoil), & + casaflux%stemnpp(arraysize), & + casaflux%frac_sapwood(arraysize), & + casaflux%sapwood_area(arraysize), & + casaflux%Cplant_turnover(arraysize,mplant), & + casaflux%Cplant_turnover_disturbance(arraysize), & + casaflux%Cplant_turnover_crowding(arraysize), & + casaflux%Cplant_turnover_resource_limitation(arraysize), & + casaflux%FluxCtolitter(arraysize,mlitter), & + casaflux%FluxNtolitter(arraysize,mlitter), & + casaflux%FluxPtolitter(arraysize,mlitter), & + casaflux%FluxCtosoil(arraysize,msoil), & + casaflux%FluxNtosoil(arraysize,msoil), & + casaflux%FluxPtosoil(arraysize,msoil), & + casaflux%FluxCtohwp(arraysize), & + casaflux%FluxNtohwp(arraysize), & + casaflux%FluxPtohwp(arraysize), & + casaflux%FluxCtoclear(arraysize), & + casaflux%FluxNtoclear(arraysize), & + casaflux%FluxPtoclear(arraysize), & + casaflux%CtransferLUC(arraysize), & + casaflux%FluxCtoco2(arraysize), & + casaflux%meangpp(arraysize), & + casaflux%meanrleaf(arraysize), & + source=0.0_r_2 & + ) - ALLOCATE(casamet%glai(arraysize), & - casamet%lnonwood(arraysize), & - casamet%Tairk(arraysize), & - casamet%precip(arraysize), & - casamet%tsoilavg(arraysize), & - casamet%moistavg(arraysize), & - casamet%btran(arraysize), & - casamet%Tsoil(arraysize,ms), & - casamet%moist(arraysize,ms), & - casamet%iveg2(arraysize), & - casamet%ijgcm(arraysize), & - casamet%isorder(arraysize), & - casamet%lat(arraysize), & - casamet%lon(arraysize), & - casamet%areacell(arraysize), & - - casamet%Tairkspin(arraysize,mdyear), & - casamet%cgppspin(arraysize,mdyear), & - casamet%crmplantspin_1(arraysize,mdyear),& - casamet%crmplantspin_2(arraysize,mdyear),& - casamet%crmplantspin_3(arraysize,mdyear),& - casamet%Tsoilspin_1(arraysize,mdyear), & - casamet%Tsoilspin_2(arraysize,mdyear), & - casamet%Tsoilspin_3(arraysize,mdyear), & - casamet%Tsoilspin_4(arraysize,mdyear), & - casamet%Tsoilspin_5(arraysize,mdyear), & - casamet%Tsoilspin_6(arraysize,mdyear), & - casamet%moistspin_1(arraysize,mdyear), & - casamet%moistspin_2(arraysize,mdyear), & - casamet%moistspin_3(arraysize,mdyear), & - casamet%moistspin_4(arraysize,mdyear), & - casamet%moistspin_5(arraysize,mdyear), & - casamet%moistspin_6(arraysize,mdyear), & - casamet%mtempspin(arraysize,mdyear)) - - ALLOCATE(casabal%FCgppyear(arraysize), & - casabal%FCnppyear(arraysize), & - casabal%FCrpyear(arraysize), & - casabal%FCrmleafyear(arraysize), & - casabal%FCrmwoodyear(arraysize), & - casabal%FCrmrootyear(arraysize), & - casabal%FCrgrowyear(arraysize), & - casabal%FCrsyear(arraysize), & - casabal%FCneeyear(arraysize), & - casabal%FNdepyear(arraysize), & - casabal%FNfixyear(arraysize), & - casabal%FNsnetyear(arraysize), & - casabal%FNupyear(arraysize), & - casabal%FNleachyear(arraysize), & - casabal%FNlossyear(arraysize), & - casabal%FPweayear(arraysize), & - casabal%FPdustyear(arraysize), & - casabal%FPsnetyear(arraysize), & - casabal%FPupyear(arraysize), & - casabal%FPleachyear(arraysize), & - casabal%FPlossyear(arraysize), & - casabal%dCdtyear(arraysize), & - casabal%LAImax(arraysize), & - casabal%Cleafmean(arraysize), & - casabal%Crootmean(arraysize) ) - - - ALLOCATE(casabal%glaimon(arraysize,12), & - casabal%glaimonx(arraysize,12)) - - ALLOCATE(casabal%cplantlast(arraysize,mplant), & - casabal%nplantlast(arraysize,mplant), & - casabal%pplantlast(arraysize,mplant)) - - ALLOCATE(casabal%clitterlast(arraysize,mlitter), & - casabal%nlitterlast(arraysize,mlitter), & - casabal%plitterlast(arraysize,mlitter)) - - ALLOCATE(casabal%csoillast(arraysize,msoil), & - casabal%nsoillast(arraysize,msoil), & - casabal%psoillast(arraysize,msoil)) - - ALLOCATE(casabal%nsoilminlast(arraysize), & - casabal%psoillablast(arraysize), & - casabal%psoilsorblast(arraysize), & - casabal%psoilocclast(arraysize), & - casabal%cbalance(arraysize), & - casabal%nbalance(arraysize), & - casabal%pbalance(arraysize), & - casabal%sumcbal(arraysize), & - casabal%sumnbal(arraysize), & - casabal%sumpbal(arraysize), & - casabal%clabilelast(arraysize)) + ALLOCATE( & + casamet%lnonwood(arraysize), & + casamet%iveg2(arraysize), & + casamet%ijgcm(arraysize), & + casamet%isorder(arraysize), & + source=0 & + ) + ALLOCATE( & + casamet%glai(arraysize), & + casamet%Tairk(arraysize), & + casamet%precip(arraysize), & + casamet%tsoilavg(arraysize), & + casamet%moistavg(arraysize), & + casamet%btran(arraysize), & + casamet%Tsoil(arraysize,ms), & + casamet%moist(arraysize,ms), & + casamet%lat(arraysize), & + casamet%lon(arraysize), & + casamet%areacell(arraysize), & + casamet%Tairkspin(arraysize,mdyear), & + casamet%cgppspin(arraysize,mdyear), & + casamet%crmplantspin_1(arraysize,mdyear), & + casamet%crmplantspin_2(arraysize,mdyear), & + casamet%crmplantspin_3(arraysize,mdyear), & + casamet%Tsoilspin_1(arraysize,mdyear), & + casamet%Tsoilspin_2(arraysize,mdyear), & + casamet%Tsoilspin_3(arraysize,mdyear), & + casamet%Tsoilspin_4(arraysize,mdyear), & + casamet%Tsoilspin_5(arraysize,mdyear), & + casamet%Tsoilspin_6(arraysize,mdyear), & + casamet%moistspin_1(arraysize,mdyear), & + casamet%moistspin_2(arraysize,mdyear), & + casamet%moistspin_3(arraysize,mdyear), & + casamet%moistspin_4(arraysize,mdyear), & + casamet%moistspin_5(arraysize,mdyear), & + casamet%moistspin_6(arraysize,mdyear), & + casamet%mtempspin(arraysize,mdyear), & + source=0.0_r_2 & + ) + + ALLOCATE( & + casabal%FCgppyear(arraysize), & + casabal%FCnppyear(arraysize), & + casabal%FCrpyear(arraysize), & + casabal%FCrmleafyear(arraysize), & + casabal%FCrmwoodyear(arraysize), & + casabal%FCrmrootyear(arraysize), & + casabal%FCrgrowyear(arraysize), & + casabal%FCrsyear(arraysize), & + casabal%FCneeyear(arraysize), & + casabal%FNdepyear(arraysize), & + casabal%FNfixyear(arraysize), & + casabal%FNsnetyear(arraysize), & + casabal%FNupyear(arraysize), & + casabal%FNleachyear(arraysize), & + casabal%FNlossyear(arraysize), & + casabal%FPweayear(arraysize), & + casabal%FPdustyear(arraysize), & + casabal%FPsnetyear(arraysize), & + casabal%FPupyear(arraysize), & + casabal%FPleachyear(arraysize), & + casabal%FPlossyear(arraysize), & + casabal%dCdtyear(arraysize), & + casabal%LAImax(arraysize), & + casabal%Cleafmean(arraysize), & + casabal%Crootmean(arraysize), & + casabal%glaimon(arraysize,12), & + casabal%glaimonx(arraysize,12), & + casabal%cplantlast(arraysize,mplant), & + casabal%nplantlast(arraysize,mplant), & + casabal%pplantlast(arraysize,mplant), & + casabal%clitterlast(arraysize,mlitter), & + casabal%nlitterlast(arraysize,mlitter), & + casabal%plitterlast(arraysize,mlitter), & + casabal%csoillast(arraysize,msoil), & + casabal%nsoillast(arraysize,msoil), & + casabal%psoillast(arraysize,msoil), & + casabal%nsoilminlast(arraysize), & + casabal%psoillablast(arraysize), & + casabal%psoilsorblast(arraysize), & + casabal%psoilocclast(arraysize), & + casabal%cbalance(arraysize), & + casabal%nbalance(arraysize), & + casabal%pbalance(arraysize), & + casabal%sumcbal(arraysize), & + casabal%sumnbal(arraysize), & + casabal%sumpbal(arraysize), & + casabal%clabilelast(arraysize), & + source=0.0_r_2 & + ) + END SUBROUTINE alloc_casavariable SUBROUTINE alloc_sum_casavariable( sum_casapool, sum_casaflux & From 86ecdd8b4ca7ed72b9e0ca521e9adddc9f88d097 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Thu, 13 Mar 2025 13:39:55 +1100 Subject: [PATCH 2/4] Initialise phen type to zero on allocation Currently the phen type is not initialised properly in the MPI implementation and results in uninitialised values being written to the restart file. This change initialises the phen type on allocation so it is initialised for both serial and MPI applications. --- src/science/casa-cnp/casa_phenology.F90 | 27 ++++++++++++++----------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/science/casa-cnp/casa_phenology.F90 b/src/science/casa-cnp/casa_phenology.F90 index 492c87746..9db9cfef5 100644 --- a/src/science/casa-cnp/casa_phenology.F90 +++ b/src/science/casa-cnp/casa_phenology.F90 @@ -46,21 +46,24 @@ MODULE phenvariable CONTAINS SUBROUTINE alloc_phenvariable(phen,arraysize) + !* Allocate phen derived type instance. + ! Allocated arrays are initialised to zero. - IMPLICIT NONE TYPE(phen_variable), INTENT(INOUT) :: phen - INTEGER, INTENT(IN) :: arraysize + INTEGER, INTENT(IN ) :: arraysize - ALLOCATE(phen%Tkshed(mvtype)) - ALLOCATE(phen%phase(arraysize), & - phen%doyphase(arraysize,mphase)) - ALLOCATE(phen%phen(arraysize), & - phen%aphen(arraysize), & - phen%phasespin(arraysize,mdyear), & - phen%doyphasespin_1(arraysize,mdyear), & - phen%doyphasespin_2(arraysize,mdyear), & - phen%doyphasespin_3(arraysize,mdyear), & - phen%doyphasespin_4(arraysize,mdyear)) + ALLOCATE(phen%Tkshed(mvtype), source=0.0_r_2) + ALLOCATE(phen%phen(arraysize), phen%aphen(arraysize), source=0.0) + ALLOCATE( & + phen%phase(arraysize), & + phen%doyphase(arraysize,mphase), & + phen%phasespin(arraysize,mdyear), & + phen%doyphasespin_1(arraysize,mdyear), & + phen%doyphasespin_2(arraysize,mdyear), & + phen%doyphasespin_3(arraysize,mdyear), & + phen%doyphasespin_4(arraysize,mdyear), & + source=0 & + ) END SUBROUTINE alloc_phenvariable END MODULE phenvariable From 4deefbca7e851639c47c14bd4fd1eba7f6cd37ac Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Thu, 13 Mar 2025 14:49:04 +1100 Subject: [PATCH 3/4] Communicate CASA output variables from worker to master Some CASA variables required in the output file are not being communicated back to the master process from the workers. This change communicates the required variables from worker to master and is required to restore bitwise reproducibility in the CASA netcdf output file between serial and MPI runs. --- src/offline/cable_mpicommon.F90 | 2 +- src/offline/cable_mpimaster.F90 | 32 ++++++++++++++++++++++++++++++++ src/offline/cable_mpiworker.F90 | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/offline/cable_mpicommon.F90 b/src/offline/cable_mpicommon.F90 index 15e1c70d2..c4088c43b 100644 --- a/src/offline/cable_mpicommon.F90 +++ b/src/offline/cable_mpicommon.F90 @@ -99,7 +99,7 @@ MODULE cable_mpicommon ! MPI: number of final casa result matrices and vectors to receive ! by the master for casa_poolout and casa_fluxout INTEGER, PARAMETER :: ncasa_mat = 37 ! add three more wood product variables - INTEGER, PARAMETER :: ncasa_vec = 58 ! vh changed on 5-feb-2016 for adding sapwood area and frac_sapwood + INTEGER, PARAMETER :: ncasa_vec = 66 ! MPI: number of fields included in restart_t type for data ! that is returned only for creating a restart file at the end of the run ! MPI: gol124: canopy%rwater removed when Bernard ported to CABLE_r491 diff --git a/src/offline/cable_mpimaster.F90 b/src/offline/cable_mpimaster.F90 index 00be9085b..2d8554a86 100644 --- a/src/offline/cable_mpimaster.F90 +++ b/src/offline/cable_mpimaster.F90 @@ -6656,6 +6656,38 @@ SUBROUTINE master_casa_types (comm, casapool, casaflux, & CALL MPI_Get_address (casaflux%Cplant_turnover_resource_limitation(off), displs(bidx), ierr) blocks(bidx) = r2len + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Pupland(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Plittermin(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Psmin(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Psimm(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%kplab(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%kpsorb(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%kpocc(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%FluxCtoco2(off), displs(bidx), ierr) + blocks(bidx) = r2len + types(last2d+1:bidx) = MPI_BYTE ! MPI: sanity check diff --git a/src/offline/cable_mpiworker.F90 b/src/offline/cable_mpiworker.F90 index 030f62af1..15dc780c2 100644 --- a/src/offline/cable_mpiworker.F90 +++ b/src/offline/cable_mpiworker.F90 @@ -6055,6 +6055,38 @@ SUBROUTINE worker_casa_type (comm, casapool,casaflux, & CALL MPI_Get_address (casaflux%Cplant_turnover_resource_limitation(off), displs(bidx), ierr) blocks(bidx) = r2len + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Pupland(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Plittermin(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Psmin(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%Psimm(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%kplab(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%kpsorb(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%kpocc(off), displs(bidx), ierr) + blocks(bidx) = r2len + + bidx = bidx + 1 + CALL MPI_Get_address (casaflux%FluxCtoco2(off), displs(bidx), ierr) + blocks(bidx) = r2len + ! MPI: sanity check IF (bidx /= ntyp) THEN WRITE (*,*) 'worker: invalid number of casa fields, fix it!' From 6e609f4d44ccbec637df302ac6a40d7929601450 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Thu, 13 Mar 2025 14:52:50 +1100 Subject: [PATCH 4/4] Output time averaged CASA fluxes and pools Currently the MPI implementation does not output time-averaged pools and fluxes (#566). This change implements the time-averaging functionality which exists in the serial driver into the MPI master driver. This is required to restore bitwise reproducibility in the CASA netcdf output file across serial and MPI runs. --- src/offline/cable_mpimaster.F90 | 42 ++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/offline/cable_mpimaster.F90 b/src/offline/cable_mpimaster.F90 index 2d8554a86..3d0683ab7 100644 --- a/src/offline/cable_mpimaster.F90 +++ b/src/offline/cable_mpimaster.F90 @@ -248,7 +248,9 @@ SUBROUTINE mpidrv_master (comm, trunk_sumbal, dels, koffset, kend, PLUME, CRU) ctime = 0, & ! day count for casacnp YYYY, & ! LOY, & ! Length of Year - maxdiff(2) ! location of maximum in convergence test + maxdiff(2), & ! location of maximum in convergence test + count_sum_casa ! number of time steps over which casa pools & + !and fluxes are aggregated (for output) CHARACTER :: dum*9, str1*9, str2*9, str3*9 ! dummy char for fileName generation @@ -602,8 +604,8 @@ SUBROUTINE mpidrv_master (comm, trunk_sumbal, dels, koffset, kend, PLUME, CRU) CALL master_restart_types (comm, canopy, air, bgc) END IF - ! CALL zero_sum_casa(sum_casapool, sum_casaflux) - ! count_sum_casa = 0 + CALL zero_sum_casa(sum_casapool, sum_casaflux) + count_sum_casa = 0 ! CALL master_sumcasa_types(comm, sum_casapool, sum_casaflux) IF( icycle>0 .AND. spincasa) THEN @@ -766,6 +768,13 @@ SUBROUTINE mpidrv_master (comm, trunk_sumbal, dels, koffset, kend, PLUME, CRU) ! receive casa update from worker CALL master_receive (ocomm, oktau, casa_ts) + IF(MOD((oktau-kstart+1),ktauday)==0) THEN + ! update time-aggregates of casa pools and fluxes + CALL update_sum_casa(sum_casapool, sum_casaflux, casapool, casaflux, & + & .TRUE. , .FALSE., 1) + count_sum_casa = count_sum_casa + 1 + END IF + CALL MPI_Waitall (wnp, recv_req, recv_stats, ierr) ! receive casa dump requirements from worker IF ( ((.NOT.spinup).OR.(spinup.AND.spinConv)) .AND. & @@ -835,11 +844,12 @@ SUBROUTINE mpidrv_master (comm, trunk_sumbal, dels, koffset, kend, PLUME, CRU) IF ( IS_CASA_TIME("write", yyyy, oktau, kstart, & koffset, kend, ktauday, logn) ) THEN ctime = ctime +1 - - - CALL WRITE_CASA_OUTPUT_NC (veg, casamet, casapool, casabal, casaflux, & - CASAONLY, ctime, & - ( ktau.EQ.kend .AND. YYYY .EQ.cable_user%YearEnd ) ) + CALL update_sum_casa(sum_casapool, sum_casaflux, casapool, casaflux, & + .FALSE. , .TRUE. , count_sum_casa) + CALL WRITE_CASA_OUTPUT_NC (veg, casamet, sum_casapool, casabal, sum_casaflux, & + CASAONLY, ctime, ( oktau == kend .AND. YYYY == cable_user%YearEnd ) ) + count_sum_casa = 0 + CALL zero_sum_casa(sum_casapool, sum_casaflux) ENDIF ENDIF @@ -952,6 +962,13 @@ SUBROUTINE mpidrv_master (comm, trunk_sumbal, dels, koffset, kend, PLUME, CRU) CALL master_receive (ocomm, oktau, casa_ts) + IF(MOD((oktau-kstart+1),ktauday)==0) THEN + ! update time-aggregates of casa pools and fluxes + CALL update_sum_casa(sum_casapool, sum_casaflux, casapool, casaflux, & + & .TRUE. , .FALSE., 1) + count_sum_casa = count_sum_casa + 1 + END IF + IF ( ((.NOT.spinup).OR.(spinup.AND.spinConv)) .AND. & ( IS_CASA_TIME("dwrit", yyyy, oktau, kstart, & koffset, kend, ktauday, logn) ) ) THEN @@ -1024,9 +1041,12 @@ SUBROUTINE mpidrv_master (comm, trunk_sumbal, dels, koffset, kend, PLUME, CRU) IF((.NOT.spinup).OR.(spinup.AND.spinConv)) THEN IF(icycle >0) THEN ctime = ctime +1 - CALL WRITE_CASA_OUTPUT_NC (veg, casamet, casapool, casabal, casaflux, & - CASAONLY, ctime, ( ktau.EQ.kend .AND. YYYY .EQ. & - cable_user%YearEnd ) ) + CALL update_sum_casa(sum_casapool, sum_casaflux, casapool, casaflux, & + .FALSE. , .TRUE. , count_sum_casa) + CALL WRITE_CASA_OUTPUT_NC (veg, casamet, sum_casapool, casabal, sum_casaflux, & + CASAONLY, ctime, ( oktau == kend .AND. YYYY == cable_user%YearEnd ) ) + count_sum_casa = 0 + CALL zero_sum_casa(sum_casapool, sum_casaflux) IF ( cable_user%CALL_POP ) THEN ! CALL master_receive_pop(POP, ocomm)