diff --git a/atmos_model.F90 b/atmos_model.F90 index 1bec14f0b..f30acf48d 100644 --- a/atmos_model.F90 +++ b/atmos_model.F90 @@ -685,8 +685,8 @@ subroutine atmos_model_init (Atmos, Time_init, Time, Time_step) GFS_data%Coupling, GFS_data%Grid, GFS_data%Tbd, GFS_data%Cldprop, GFS_data%Radtend, & GFS_data%IntDiag, Init_parm, GFS_Diag) call FV3GFS_restart_read (GFS_data, GFS_restart_var, Atm_block, GFS_control, Atmos%domain, Atm(mygrid)%flagstruct%warm_start) - if(GFS_control%ca_sgs)then - call read_ca_restart (Atmos%domain,GFS_control%scells) + if(GFS_control%do_ca .and. Atm(mygrid)%flagstruct%warm_start)then + call read_ca_restart (Atmos%domain,GFS_control%scells,GFS_control%nca,GFS_control%ncells_g,GFS_control%nca_g) endif ! Populate the GFS_data%Statein container with the prognostic state ! in Atm_block, which contains the initial conditions/restart data. @@ -979,8 +979,8 @@ subroutine atmos_model_end (Atmos) GFS_Control%lndp_type > 0 .or. GFS_Control%do_ca ) then if(restart_endfcst) then call write_stoch_restart_atm('RESTART/atm_stoch.res.nc') - if (GFS_control%ca_sgs)then - call write_ca_restart(Atmos%domain,GFS_control%scells) + if (GFS_control%do_ca)then + call write_ca_restart() endif endif call stochastic_physics_wrapper_end(GFS_control) @@ -1008,8 +1008,8 @@ subroutine atmos_model_restart(Atmos, timestamp) call atmosphere_restart(timestamp) call FV3GFS_restart_write (GFS_data, GFS_restart_var, Atm_block, & GFS_control, Atmos%domain, timestamp) - if(GFS_control%ca_sgs)then - call write_ca_restart(Atmos%domain,GFS_control%scells,timestamp) + if(GFS_control%do_ca)then + call write_ca_restart(timestamp) endif end subroutine atmos_model_restart ! diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index fb456245b..68abe1de8 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -2,7 +2,7 @@ module GFS_typedefs - use machine, only: kind_phys + use machine, only: kind_phys,kind_dbl_prec use physcons, only: con_cp, con_fvirt, con_g, & con_hvap, con_hfus, con_pi, con_rd, con_rv, & con_t0c, con_cvap, con_cliq, con_eps, con_epsq, & @@ -526,7 +526,6 @@ module GFS_typedefs real (kind=kind_phys), pointer :: ca_rad (:) => null() ! real (kind=kind_phys), pointer :: ca_micro (:) => null() ! real (kind=kind_phys), pointer :: condition(:) => null() ! - real (kind=kind_phys), pointer :: vfact_ca(:) => null() ! !--- stochastic physics real (kind=kind_phys), pointer :: shum_wts (:,:) => null() ! real (kind=kind_phys), pointer :: sppt_wts (:,:) => null() ! @@ -1122,7 +1121,7 @@ module GFS_typedefs logical :: ca_sgs !< switch for sgs ca logical :: ca_global !< switch for global ca logical :: ca_smooth !< switch for gaussian spatial filter - integer :: iseed_ca !< seed for random number generation in ca scheme + integer(kind=kind_dbl_prec) :: iseed_ca !< seed for random number generation in ca scheme integer :: nspinup !< number of iterations to spin up the ca real(kind=kind_phys) :: rcell !< threshold used for CA scheme real(kind=kind_phys) :: nthresh !< threshold used for convection coupling @@ -1131,6 +1130,7 @@ module GFS_typedefs logical :: ca_closure !< logical switch for ca on closure logical :: ca_entr !< logical switch for ca on entrainment logical :: ca_trigger !< logical switch for ca on trigger + real (kind=kind_phys), allocatable :: vfact_ca(:) !< vertical tapering for ca_global !--- stochastic physics control parameters logical :: do_sppt @@ -1633,20 +1633,6 @@ module GFS_typedefs real (kind=kind_phys), pointer :: tdomip (:) => null() !< dominant accumulated sleet type real (kind=kind_phys), pointer :: tdoms (:) => null() !< dominant accumulated snow type - real (kind=kind_phys), pointer :: ca1 (:) => null() ! - real (kind=kind_phys), pointer :: ca2 (:) => null() ! - real (kind=kind_phys), pointer :: ca3 (:) => null() ! - real (kind=kind_phys), pointer :: ca_deep (:) => null() !< cellular automata fraction - real (kind=kind_phys), pointer :: ca_turb (:) => null() !< cellular automata fraction - real (kind=kind_phys), pointer :: ca_shal (:) => null() !< cellular automata fraction - real (kind=kind_phys), pointer :: ca_rad (:) => null() !< cellular automata fraction - real (kind=kind_phys), pointer :: ca_micro (:) => null() !< cellular automata fraction - - real (kind=kind_phys), pointer :: skebu_wts(:,:) => null() !< 10 meter u wind speed - real (kind=kind_phys), pointer :: skebv_wts(:,:) => null() !< 10 meter v wind speed - real (kind=kind_phys), pointer :: sppt_wts(:,:) => null() !< - real (kind=kind_phys), pointer :: shum_wts(:,:) => null() !< - real (kind=kind_phys), pointer :: sfc_wts(:,:) => null() !< real (kind=kind_phys), pointer :: zmtnblck(:) => null() ! IntDiag(nb)%skebu_wts(:,:) + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%skebu_wts(:,:) enddo idx = idx + 1 @@ -2048,7 +2048,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%skebv_wts(:,:) + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%skebv_wts(:,:) enddo idx = idx + 1 @@ -2091,7 +2091,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%sppt_wts(:,:) + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%sppt_wts(:,:) enddo idx = idx + 1 @@ -2102,7 +2102,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%shum_wts(:,:) + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%shum_wts(:,:) enddo idx = idx + 1 @@ -2113,7 +2113,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%sfc_wts(:,1) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%sfc_wts(:,1) enddo idx = idx + 1 @@ -2124,7 +2124,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%sfc_wts(:,2) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%sfc_wts(:,2) enddo idx = idx + 1 @@ -2135,7 +2135,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ca1(:) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%ca1(:) enddo idx = idx + 1 @@ -2146,7 +2146,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ca_deep(:) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%ca_deep(:) enddo idx = idx + 1 @@ -2157,7 +2157,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ca_turb(:) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%ca_turb(:) enddo idx = idx + 1 @@ -2168,7 +2168,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ca_shal(:) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%ca_shal(:) enddo idx = idx + 1 @@ -2179,7 +2179,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ca_rad(:) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%ca_rad(:) enddo idx = idx + 1 @@ -2190,7 +2190,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%mod_name = 'gfs_phys' allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%ca_micro(:) + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%ca_micro(:) enddo if (Model%ldiag_ugwp) THEN diff --git a/ccpp/physics b/ccpp/physics index e22fd68f3..3c23577b9 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit e22fd68f340ec17f884b38bd24b871e36a86e29f +Subproject commit 3c23577b97fa9e9b193543b39963dd538847833d diff --git a/stochastic_physics/stochastic_physics_wrapper.F90 b/stochastic_physics/stochastic_physics_wrapper.F90 index f0e476d5b..8a50eae9b 100644 --- a/stochastic_physics/stochastic_physics_wrapper.F90 +++ b/stochastic_physics/stochastic_physics_wrapper.F90 @@ -41,9 +41,7 @@ module stochastic_physics_wrapper_mod real(kind=kind_phys), dimension(:,:), allocatable, save :: lake real(kind=kind_phys), dimension(:,:), allocatable, save :: condition real(kind=kind_phys), dimension(:,:), allocatable, save :: ca_deep_cpl, ca_turb_cpl, ca_shal_cpl - real(kind=kind_phys), dimension(:,:), allocatable, save :: ca_deep_diag,ca_turb_diag,ca_shal_diag real(kind=kind_phys), dimension(:,:), allocatable, save :: ca1_cpl, ca2_cpl, ca3_cpl - real(kind=kind_phys), dimension(:,:), allocatable, save :: ca1_diag,ca2_diag,ca3_diag !---------------- @@ -170,21 +168,21 @@ subroutine stochastic_physics_wrapper (GFS_Control, GFS_Data, Atm_block, ierr) if (.not. minval(Atm_block%blksz) == maxblk) then call mpp_error(FATAL, 'Logic errror: cellular_automata not compatible with non-uniform blocksizes') end if - ! *DH - do nb=1,nblks - GFS_Data(nb)%Intdiag%ca_deep(:) = 0. - GFS_Data(nb)%Intdiag%ca_turb(:) = 0. - GFS_Data(nb)%Intdiag%ca_shal(:) = 0. - GFS_Data(nb)%Coupling%ca_deep(:) = 0. - GFS_Data(nb)%Coupling%ca_turb(:) = 0. - GFS_Data(nb)%Coupling%ca_shal(:) = 0. - GFS_Data(nb)%Coupling%ca1(:) = 0. - GFS_Data(nb)%Coupling%ca2(:) = 0. - GFS_Data(nb)%Coupling%ca3(:) = 0. - GFS_Data(nb)%Intdiag%ca1(:) = 0. - GFS_Data(nb)%Intdiag%ca2(:) = 0. - GFS_Data(nb)%Intdiag%ca3(:) = 0. - enddo + if(GFS_Control%ca_sgs)then + allocate(sst (1:nblks, maxblk)) + allocate(lmsk (1:nblks, maxblk)) + allocate(lake (1:nblks, maxblk)) + allocate(condition (1:nblks, maxblk)) + allocate(ca_deep_cpl (1:nblks, maxblk)) + allocate(ca_turb_cpl (1:nblks, maxblk)) + allocate(ca_shal_cpl (1:nblks, maxblk)) + endif + if(GFS_Control%ca_global)then + ! Allocate contiguous arrays; no need to copy in (intent out) + allocate(ca1_cpl (1:nblks, maxblk)) + allocate(ca2_cpl (1:nblks, maxblk)) + allocate(ca3_cpl (1:nblks, maxblk)) + endif endif is_initialized = .true. @@ -254,7 +252,7 @@ subroutine stochastic_physics_wrapper (GFS_Control, GFS_Data, Atm_block, ierr) endif call lndp_apply_perts(GFS_Control%blksz, GFS_Control%lsm, GFS_Control%lsm_noah, GFS_Control%lsm_ruc, lsoil, & - GFS_Control%dtf, GFS_Control%kdt, GFS_Control%lndp_each_step, & + GFS_Control%dtp, GFS_Control%kdt, GFS_Control%lndp_each_step, & GFS_Control%n_var_lndp, GFS_Control%lndp_var_list, GFS_Control%lndp_prt_list, & sfc_wts, xlon, xlat, stype, GFS_Control%pores, GFS_Control%resid,param_update_flag, & smc, slc, stc, vfrac, alvsf, alnsf, alvwf, alnwf, facsf, facwf, snoalb, semis, zorll, ierr) @@ -297,17 +295,6 @@ subroutine stochastic_physics_wrapper (GFS_Control, GFS_Data, Atm_block, ierr) if (GFS_Control%do_ca) then if(GFS_Control%ca_sgs)then - ! Allocate contiguous arrays; copy in as needed - allocate(sst (1:nblks, maxblk)) - allocate(lmsk (1:nblks, maxblk)) - allocate(lake (1:nblks, maxblk)) - allocate(ca_deep_diag(1:nblks, maxblk)) - allocate(ca_turb_diag(1:nblks, maxblk)) - allocate(ca_shal_diag(1:nblks, maxblk)) - allocate(condition (1:nblks, maxblk)) - allocate(ca_deep_cpl (1:nblks, maxblk)) - allocate(ca_turb_cpl (1:nblks, maxblk)) - allocate(ca_shal_cpl (1:nblks, maxblk)) do nb=1,nblks sst (nb,1:GFS_Control%blksz(nb)) = GFS_Data(nb)%Sfcprop%tsfco(:) lmsk (nb,1:GFS_Control%blksz(nb)) = GFS_Data(nb)%Sfcprop%slmsk(:) @@ -317,61 +304,31 @@ subroutine stochastic_physics_wrapper (GFS_Control, GFS_Data, Atm_block, ierr) ca_turb_cpl(nb,1:GFS_Control%blksz(nb)) = GFS_Data(nb)%Coupling%ca_turb(:) ca_shal_cpl(nb,1:GFS_Control%blksz(nb)) = GFS_Data(nb)%Coupling%ca_shal(:) enddo - call cellular_automata_sgs(GFS_Control%kdt,GFS_control%dtf,GFS_control%restart,GFS_Control%first_time_step, & - sst,lmsk,lake,condition,ca_deep_cpl,ca_turb_cpl,ca_shal_cpl,ca_deep_diag,ca_turb_diag, & - ca_shal_diag,Atm(mygrid)%domain_for_coupler,nblks, & + call cellular_automata_sgs(GFS_Control%kdt,GFS_control%dtp,GFS_control%restart,GFS_Control%first_time_step, & + sst,lmsk,lake,condition,ca_deep_cpl,ca_turb_cpl,ca_shal_cpl, Atm(mygrid)%domain_for_coupler,nblks, & Atm_block%isc,Atm_block%iec,Atm_block%jsc,Atm_block%jec,Atm(mygrid)%npx,Atm(mygrid)%npy, levs, & - GFS_Control%nthresh,GFS_Control%rcell,GFS_Control%nca,GFS_Control%scells,GFS_Control%tlives,GFS_Control%nfracseed, & - GFS_Control%nseed,GFS_Control%ca_global,GFS_Control%ca_sgs,GFS_Control%iseed_ca, & - GFS_Control%ca_smooth,GFS_Control%nspinup,GFS_Control%ca_trigger,Atm_block%blksz(1),GFS_Control%master,GFS_Control%communicator) + GFS_Control%nthresh,GFS_Control%rcell,GFS_Control%tile_num,GFS_Control%nca,GFS_Control%scells,GFS_Control%tlives, & + GFS_Control%nfracseed, GFS_Control%nseed,GFS_Control%iseed_ca, & + GFS_Control%nspinup,GFS_Control%ca_trigger,Atm_block%blksz(1),GFS_Control%master,GFS_Control%communicator) ! Copy contiguous data back as needed do nb=1,nblks - GFS_Data(nb)%Intdiag%ca_deep(:) = ca_deep_diag(nb,1:GFS_Control%blksz(nb)) - GFS_Data(nb)%Intdiag%ca_turb(:) = ca_turb_diag(nb,1:GFS_Control%blksz(nb)) - GFS_Data(nb)%Intdiag%ca_shal(:) = ca_shal_diag(nb,1:GFS_Control%blksz(nb)) GFS_Data(nb)%Coupling%ca_deep(:) = ca_deep_cpl (nb,1:GFS_Control%blksz(nb)) GFS_Data(nb)%Coupling%ca_turb(:) = ca_turb_cpl (nb,1:GFS_Control%blksz(nb)) GFS_Data(nb)%Coupling%ca_shal(:) = ca_shal_cpl (nb,1:GFS_Control%blksz(nb)) enddo - deallocate(sst ) - deallocate(lmsk ) - deallocate(lake ) - deallocate(condition ) - deallocate(ca_deep_cpl ) - deallocate(ca_turb_cpl ) - deallocate(ca_shal_cpl ) - deallocate(ca_deep_diag) - deallocate(ca_turb_diag) - deallocate(ca_shal_diag) endif if(GFS_Control%ca_global)then - ! Allocate contiguous arrays; no need to copy in (intent out) - allocate(ca1_cpl (1:nblks, maxblk)) - allocate(ca2_cpl (1:nblks, maxblk)) - allocate(ca3_cpl (1:nblks, maxblk)) - allocate(ca1_diag(1:nblks, maxblk)) - allocate(ca2_diag(1:nblks, maxblk)) - allocate(ca3_diag(1:nblks, maxblk)) - call cellular_automata_global(GFS_Control%kdt,GFS_Control%first_time_step,ca1_cpl,ca2_cpl,ca3_cpl,ca1_diag,ca2_diag,ca3_diag, & + call cellular_automata_global(GFS_Control%kdt,GFS_control%restart,GFS_Control%first_time_step,ca1_cpl,ca2_cpl,ca3_cpl, & Atm(mygrid)%domain_for_coupler, nblks,Atm_block%isc,Atm_block%iec,Atm_block%jsc,Atm_block%jec,Atm(mygrid)%npx,Atm(mygrid)%npy,levs, & GFS_Control%nca_g,GFS_Control%ncells_g,GFS_Control%nlives_g,GFS_Control%nfracseed,GFS_Control%nseed_g, & - GFS_Control%ca_global,GFS_Control%ca_sgs,GFS_Control%iseed_ca,GFS_Control%ca_smooth,GFS_Control%nspinup,Atm_block%blksz(1), & + GFS_Control%iseed_ca,GFS_control%tile_num,GFS_Control%ca_smooth,GFS_Control%nspinup,Atm_block%blksz(1), & GFS_Control%nsmooth,GFS_Control%ca_amplitude,GFS_Control%master,GFS_Control%communicator) ! Copy contiguous data back do nb=1,nblks - GFS_Data(nb)%Coupling%ca1(:) = ca1_cpl (nb,1:GFS_Control%blksz(nb)) - GFS_Data(nb)%Coupling%ca2(:) = ca2_cpl (nb,1:GFS_Control%blksz(nb)) - GFS_Data(nb)%Coupling%ca3(:) = ca3_cpl (nb,1:GFS_Control%blksz(nb)) - GFS_Data(nb)%Intdiag%ca1(:) = ca1_diag(nb,1:GFS_Control%blksz(nb)) - GFS_Data(nb)%Intdiag%ca2(:) = ca2_diag(nb,1:GFS_Control%blksz(nb)) - GFS_Data(nb)%Intdiag%ca3(:) = ca3_diag(nb,1:GFS_Control%blksz(nb)) + GFS_Data(nb)%Coupling%ca1(:) = ca1_cpl(nb,1:GFS_Control%blksz(nb)) + GFS_Data(nb)%Coupling%ca2(:) = ca2_cpl(nb,1:GFS_Control%blksz(nb)) + GFS_Data(nb)%Coupling%ca3(:) = ca3_cpl(nb,1:GFS_Control%blksz(nb)) enddo - deallocate(ca1_cpl ) - deallocate(ca2_cpl ) - deallocate(ca3_cpl ) - deallocate(ca1_diag) - deallocate(ca2_diag) - deallocate(ca3_diag) endif endif !do_ca @@ -425,6 +382,20 @@ subroutine stochastic_physics_wrapper_end (GFS_Control) endif call finalize_stochastic_physics() endif + if(GFS_Control%ca_sgs)then + deallocate(sst ) + deallocate(lmsk ) + deallocate(lake ) + deallocate(condition ) + deallocate(ca_deep_cpl ) + deallocate(ca_turb_cpl ) + deallocate(ca_shal_cpl ) + endif + if(GFS_Control%ca_global)then + deallocate(ca1_cpl ) + deallocate(ca2_cpl ) + deallocate(ca3_cpl ) + endif end subroutine stochastic_physics_wrapper_end end module stochastic_physics_wrapper_mod