LCOV - code coverage report
Current view: | top level - physics/pumas - micro_pumas_diags.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 264 | 486 | 54.3 %
Date: | 2024-12-17 17:57:11 |  | Functions: | 2 | 4 | 50.0 %

              Line data    Source code
           1             : module micro_pumas_diags
           2             :
           3             : !----------------------------------------
           4             : ! PUMAS diagnostics support package
           5             : !----------------------------------------
           6             :
           7             : use shr_kind_mod,   only: r8=>shr_kind_r8
           8             :
           9             :   type, public :: proc_rates_type
          10             :
          11             :     real(r8), allocatable :: prodsnow(:,:)     ! production of snow (1/s)
          12             :     real(r8), allocatable :: evapsnow(:,:)     ! sublimation rate of snow (1/s)
          13             :     real(r8), allocatable :: qcsevap(:,:)      ! cloud water evaporation due to sedimentation (1/s)
          14             :     real(r8), allocatable :: qisevap(:,:)      ! cloud ice sublimation due to sublimation (1/s)
          15             :     real(r8), allocatable :: qvres(:,:)        ! residual condensation term to ensure RH < 100% (1/s)
          16             :     real(r8), allocatable :: cmeitot(:,:)      ! grid-mean cloud ice sub/dep (1/s)
          17             :     real(r8), allocatable :: vtrmc(:,:)        ! mass-weighted cloud water fallspeed (m/s)
          18             :     real(r8), allocatable :: vtrmi(:,:)        ! mass-weighted cloud ice fallspeed (m/s)
          19             :     real(r8), allocatable :: umr(:,:)          ! mass weighted rain fallspeed (m/s)
          20             :     real(r8), allocatable :: ums(:,:)          ! mass weighted snow fallspeed (m/s)
          21             :     real(r8), allocatable :: umg(:,:)          ! mass weighted graupel/hail fallspeed (m/s)
          22             :     real(r8), allocatable :: qgsedten(:,:)     ! qg sedimentation tendency (1/s)
          23             :     real(r8), allocatable :: qcsedten(:,:)     ! qc sedimentation tendency (1/s)
          24             :     real(r8), allocatable :: qisedten(:,:)     ! qi sedimentation tendency (1/s)
          25             :     real(r8), allocatable :: qrsedten(:,:)     ! qr sedimentation tendency (1/s)
          26             :     real(r8), allocatable :: qssedten(:,:)     ! qs sedimentation tendency (1/s)
          27             :
          28             :     real(r8), allocatable :: pratot(:,:)
          29             :     real(r8), allocatable :: prctot(:,:)
          30             :     real(r8), allocatable :: mnuccctot(:,:)
          31             :     real(r8), allocatable :: mnuccttot(:,:)
          32             :     real(r8), allocatable :: msacwitot(:,:)
          33             :     real(r8), allocatable :: psacwstot(:,:)
          34             :     real(r8), allocatable :: bergstot(:,:)
          35             :     real(r8), allocatable :: vapdepstot(:,:)
          36             :     real(r8), allocatable :: bergtot(:,:)
          37             :     real(r8), allocatable :: melttot(:,:)
          38             :     real(r8), allocatable :: meltstot(:,:)
          39             :     real(r8), allocatable :: meltgtot(:,:)
          40             :     real(r8), allocatable :: homotot(:,:)
          41             :     real(r8), allocatable :: qcrestot(:,:)
          42             :     real(r8), allocatable :: prcitot(:,:)
          43             :     real(r8), allocatable :: praitot(:,:)
          44             :     real(r8), allocatable :: qirestot(:,:)
          45             :     real(r8), allocatable :: mnuccrtot(:,:)
          46             :     real(r8), allocatable :: mnudeptot(:,:)
          47             :     real(r8), allocatable :: mnuccritot(:,:)
          48             :     real(r8), allocatable :: pracstot(:,:)
          49             :     real(r8), allocatable :: meltsdttot(:,:)
          50             :     real(r8), allocatable :: frzrdttot(:,:)
          51             :     real(r8), allocatable :: mnuccdtot(:,:)
          52             :     real(r8), allocatable :: pracgtot(:,:)
          53             :     real(r8), allocatable :: psacwgtot(:,:)
          54             :     real(r8), allocatable :: pgsacwtot(:,:)
          55             :     real(r8), allocatable :: pgracstot(:,:)
          56             :     real(r8), allocatable :: prdgtot(:,:)
          57             :     real(r8), allocatable :: qmultgtot(:,:)
          58             :     real(r8), allocatable :: qmultrgtot(:,:)
          59             :     real(r8), allocatable :: psacrtot(:,:)
          60             :     real(r8), allocatable :: npracgtot(:,:)
          61             :     real(r8), allocatable :: nscngtot(:,:)
          62             :     real(r8), allocatable :: ngracstot(:,:)
          63             :     real(r8), allocatable :: nmultgtot(:,:)
          64             :     real(r8), allocatable :: nmultrgtot(:,:)
          65             :     real(r8), allocatable :: npsacwgtot(:,:)
          66             :
          67             :   real(r8), allocatable :: nnuccctot(:,:)        ! change n  due to Immersion freezing of cloud water
          68             :   real(r8), allocatable :: nnuccttot(:,:)        ! change n  due to Contact freezing of cloud water
          69             :   real(r8), allocatable :: nnuccdtot(:,:)        ! change n  due to Ice nucleation
          70             :   real(r8), allocatable :: nnudeptot(:,:)        ! change n  due to Deposition Nucleation
          71             :   real(r8), allocatable :: nhomotot(:,:)         ! change n  due to Homogeneous freezing of cloud water
          72             :   real(r8), allocatable :: nnuccrtot(:,:)        ! change n  due to heterogeneous freezing of rain to snow (1/s)
          73             :   real(r8), allocatable :: nnuccritot(:,:)       ! change n  due to Heterogeneous freezing of rain to ice
          74             :   real(r8), allocatable :: nsacwitot(:,:)        ! change n  due to Conversion of cloud water [to cloud ice]
          75             :                                                          !                  from rime-splintering
          76             :   real(r8), allocatable :: npratot(:,:)          ! change n  due to Accretion of cloud water by rain
          77             :   real(r8), allocatable :: npsacwstot(:,:)       ! change n  due to Accretion of cloud water by snow
          78             :   real(r8), allocatable :: npraitot(:,:)         ! change n  due to Accretion of cloud ice to snow
          79             :   real(r8), allocatable :: npracstot(:,:)        ! change n  due to Accretion of rain by snow
          80             :   real(r8), allocatable :: nprctot(:,:)          ! change nr  due to Autoconversion of cloud water [to rain]
          81             :   real(r8), allocatable :: nprcitot(:,:)         ! change n  due to Autoconversion of cloud ice to snow
          82             :   real(r8), allocatable :: ncsedten(:,:)         ! change n  due to cloud liquid sedimentation
          83             :   real(r8), allocatable :: nisedten(:,:)         ! change n  due to cloud ice sedimentation
          84             :   real(r8), allocatable :: nrsedten(:,:)         ! change n  due to rain sedimentation
          85             :   real(r8), allocatable :: nssedten(:,:)         ! change n  due to snow sedimentation
          86             :   real(r8), allocatable :: ngsedten(:,:)         ! change n  due to graupel sedimentation
          87             :   real(r8), allocatable :: nmelttot(:,:)         ! change n  due to Melting of cloud ice
          88             :   real(r8), allocatable :: nmeltstot(:,:)        ! change n  due to Melting of snow
          89             :   real(r8), allocatable :: nmeltgtot(:,:)        ! change n  due to Melting of graupel
          90             :
          91             :   ! TAU diagnostic variables
          92             :   real(r8), allocatable :: nraggtot(:,:)          ! change nr  due to self collection of rain
          93             :
          94             :
          95             :   real(r8), allocatable :: pgam_out(:,:)      ! Liquid Size distribution parameter Mu for output
          96             :   real(r8), allocatable :: lamc_out(:,:)      ! Liquid Size distribution parameter Lambda for output
          97             :   real(r8), allocatable :: lamr_out(:,:)      ! Rain Size distribution parameter Lambda for output
          98             :   real(r8), allocatable :: n0r_out(:,:)       ! Size distribution parameter n0 for output
          99             :   real(r8), allocatable :: scale_qc(:,:)        !TAU scaling factor for liquid mass to ensure conservation
         100             :   real(r8), allocatable :: scale_nc(:,:)        !TAU scaling factor for liquid number to ensure conservation
         101             :   real(r8), allocatable :: scale_qr(:,:)        !TAU scaling factor for rain mass to ensure conservation
         102             :   real(r8), allocatable :: scale_nr(:,:)        !TAU scaling factor for rain_number to ensure conservation
         103             :   real(r8), allocatable :: amk_c(:,:,:)         !TAU cloud liquid mass from bins
         104             :   real(r8), allocatable :: ank_c(:,:,:)         !TAU cloud liquid number from bins
         105             :   real(r8), allocatable :: amk_r(:,:,:)         !TAU cloud rain mass from bins
         106             :   real(r8), allocatable :: ank_r(:,:,:)         !TAU cloud rain number from bins
         107             :   real(r8), allocatable :: amk(:,:,:)           !TAU all liquid mass from bins
         108             :   real(r8), allocatable :: ank(:,:,:)           !TAU all liquid number from bins
         109             :   real(r8), allocatable :: amk_out(:,:,:)       !TAU all liquid number from bins output
         110             :   real(r8), allocatable :: ank_out(:,:,:)       !TAU all liquid mass from bins output
         111             :   real(r8), allocatable :: qc_out_TAU(:,:)      !TAU: output total cloud liquid mass
         112             :   real(r8), allocatable :: nc_out_TAU(:,:)      !TAU: output total cloud liquid number
         113             :   real(r8), allocatable :: qr_out_TAU(:,:)      !TAU: output total rain mass
         114             :   real(r8), allocatable :: nr_out_TAU(:,:)      !TAU: output total cloud rain number
         115             :   real(r8), allocatable :: qc_in_TAU(:,:)       !TAU: input total cloud liquid mass
         116             :   real(r8), allocatable :: nc_in_TAU(:,:)       !TAU: input total cloud liquid number
         117             :   real(r8), allocatable :: qr_in_TAU(:,:)       !TAU: input total rain mass
         118             :   real(r8), allocatable :: nr_in_TAU(:,:)       !TAU: input total cloud rain number
         119             :   real(r8), allocatable :: qctend_KK2000(:,:)   !cloud liquid mass tendency due to autoconversion  & accretion from KK2000
         120             :   real(r8), allocatable :: nctend_KK2000(:,:)   !cloud liquid number tendency due to autoconversion  & accretion from KK2000
         121             :   real(r8), allocatable :: qrtend_KK2000(:,:)   !rain mass tendency due to autoconversion  & accretion from KK2000
         122             :   real(r8), allocatable :: nrtend_KK2000(:,:)   !rain number tendency due to autoconversion   & accretion from KK2000
         123             :   real(r8), allocatable :: qctend_SB2001(:,:)   !cloud liquid mass tendency due to autoconversion  & accretion from SB2001
         124             :   real(r8), allocatable :: nctend_SB2001(:,:)   !cloud liquid number tendency due to autoconversion  & accretion from SB2001
         125             :   real(r8), allocatable :: qrtend_SB2001(:,:)   !rain mass tendency due to autoconversion  & accretion from SB2001
         126             :   real(r8), allocatable :: nrtend_SB2001(:,:)   !rain number tendency due to autoconversion  & accretion from SB2001
         127             :   real(r8), allocatable :: qctend_TAU(:,:)      !cloud liquid mass tendency due to autoconversion & accretion from TAU or Emulator code
         128             :   real(r8), allocatable :: nctend_TAU(:,:)      !cloud liquid number tendency due to autoconversion & accretion from TAU or Emulator code
         129             :   real(r8), allocatable :: qrtend_TAU(:,:)      !rain mass tendency due to autoconversion & accretion from TAU or Emulator code
         130             :   real(r8), allocatable :: nrtend_TAU(:,:)      !rain number tendency due to autoconversion & accretion from TAU or Emulatorcode
         131             :   real(r8), allocatable :: gmnnn_lmnnn_TAU(:,:) ! TAU sum of mass gain and loss from bin code
         132             :   real(r8), allocatable :: ML_fixer(:,:)     !Emulated: frequency of ML fixer is activated
         133             :   real(r8), allocatable :: QC_fixer(:,:)     !Emulated: change in cloud liquid mass due to ML fixer
         134             :   real(r8), allocatable :: NC_fixer(:,:)     !Emulated: change in cloud number number due to ML fixer
         135             :   real(r8), allocatable :: QR_fixer(:,:)     !Emulated: change in rain mass due to ML fixer
         136             :   real(r8), allocatable :: NR_fixer(:,:)     !Emulated: change in rain number due to ML fixer
         137             :
         138             :     contains
         139             :       procedure :: allocate => proc_rates_allocate
         140             :       procedure :: deallocate => proc_rates_deallocate
         141             :   end type proc_rates_type
         142             :
         143             : contains
         144             :
         145     4467528 :    subroutine proc_rates_allocate(this, psetcols, nlev, ncd, warm_rain, errstring)
         146             :    !--------------------------------------------------------------
         147             :    ! Routine to allocate the elements of the proc_rates DDT
         148             :    !--------------------------------------------------------------
         149             :
         150             :    use cam_abortutils, only: endrun
         151             :
         152             :       implicit none
         153             :
         154             :       class(proc_rates_type) :: this
         155             :
         156             :       integer,           intent(in) :: psetcols, nlev
         157             :       integer,           intent(in) :: ncd
         158             :       character(len=16), intent(in) :: warm_rain            ! 'tau','emulated','sb2001' or 'kk2000'
         159             :       character(128),   intent(out) :: errstring
         160             :
         161             :       integer :: ierr
         162             :
         163     4467528 :       errstring=' '
         164             :
         165    17870112 :       allocate(this%prodsnow(psetcols,nlev), stat=ierr)
         166     4467528 :       if (ierr /= 0) then
         167           0 :         errstring='Error allocating this%prodsnow'
         168             :       end if
         169    13402584 :       allocate(this%evapsnow(psetcols,nlev), stat=ierr)
         170     4467528 :       if (ierr /= 0) then
         171           0 :         errstring='Error allocating this%evapsnow'
         172             :       end if
         173    13402584 :       allocate(this%qcsevap(psetcols,nlev), stat=ierr)
         174     4467528 :       if (ierr /= 0) then
         175           0 :         errstring='Error allocating this%qcsevap'
         176             :       end if
         177    13402584 :       allocate(this%qisevap(psetcols,nlev), stat=ierr)
         178     4467528 :       if (ierr /= 0) then
         179           0 :         errstring='Error allocating this%qisevap'
         180             :       end if
         181    13402584 :       allocate(this%qvres(psetcols,nlev), stat=ierr)
         182     4467528 :       if (ierr /= 0) then
         183           0 :         errstring='Error allocating this%qvres'
         184             :       end if
         185    13402584 :       allocate(this%cmeitot(psetcols,nlev), stat=ierr)
         186     4467528 :       if (ierr /= 0) then
         187           0 :         errstring='Error allocating this%cmeitot'
         188             :       end if
         189    13402584 :       allocate(this%vtrmc(psetcols,nlev), stat=ierr)
         190     4467528 :       if (ierr /= 0) then
         191           0 :         errstring='Error allocating this%vtrmc'
         192             :       end if
         193    13402584 :       allocate(this%vtrmi(psetcols,nlev), stat=ierr)
         194     4467528 :       if (ierr /= 0) then
         195           0 :         errstring='Error allocating this%vtrmi'
         196             :       end if
         197    13402584 :       allocate(this%umr(psetcols,nlev), stat=ierr)
         198     4467528 :       if (ierr /= 0) then
         199           0 :         errstring='Error allocating this%umr'
         200             :       end if
         201    13402584 :       allocate(this%ums(psetcols,nlev), stat=ierr)
         202     4467528 :       if (ierr /= 0) then
         203           0 :         errstring='Error allocating this%ums'
         204             :       end if
         205    13402584 :       allocate(this%umg(psetcols,nlev), stat=ierr)
         206     4467528 :       if (ierr /= 0) then
         207           0 :         errstring='Error allocating this%umg'
         208             :       end if
         209    13402584 :       allocate(this%qgsedten(psetcols,nlev), stat=ierr)
         210     4467528 :       if (ierr /= 0) then
         211           0 :         errstring='Error allocating this%qgsedten'
         212             :       end if
         213    13402584 :       allocate(this%qcsedten(psetcols,nlev), stat=ierr)
         214     4467528 :       if (ierr /= 0) then
         215           0 :         errstring='Error allocating this%qcsedten'
         216             :       end if
         217    13402584 :       allocate(this%qisedten(psetcols,nlev), stat=ierr)
         218     4467528 :       if (ierr /= 0) then
         219           0 :         errstring='Error allocating this%qisedten'
         220             :       end if
         221    13402584 :       allocate(this%qrsedten(psetcols,nlev), stat=ierr)
         222     4467528 :       if (ierr /= 0) then
         223           0 :         errstring='Error allocating this%qrsedten'
         224             :       end if
         225    13402584 :       allocate(this%qssedten(psetcols,nlev), stat=ierr)
         226     4467528 :       if (ierr /= 0) then
         227           0 :         errstring='Error allocating this%qssedten'
         228             :       end if
         229    13402584 :       allocate(this%pratot(psetcols,nlev), stat=ierr)
         230     4467528 :       if (ierr /= 0) then
         231           0 :         errstring='Error allocating this%pratot'
         232             :       end if
         233    13402584 :       allocate(this%prctot(psetcols,nlev), stat=ierr)
         234     4467528 :       if (ierr /= 0) then
         235           0 :         errstring='Error allocating this%prctot'
         236             :       end if
         237    13402584 :       allocate(this%mnuccctot(psetcols,nlev), stat=ierr)
         238     4467528 :       if (ierr /= 0) then
         239           0 :         errstring='Error allocating this%mnuccctot'
         240             :       end if
         241    13402584 :       allocate(this%mnuccttot(psetcols,nlev), stat=ierr)
         242     4467528 :       if (ierr /= 0) then
         243           0 :         errstring='Error allocating this%mnuccttot'
         244             :       end if
         245    13402584 :       allocate(this%msacwitot(psetcols,nlev), stat=ierr)
         246     4467528 :       if (ierr /= 0) then
         247           0 :         errstring='Error allocating this%msacwitot'
         248             :       end if
         249    13402584 :       allocate(this%psacwstot(psetcols,nlev), stat=ierr)
         250     4467528 :       if (ierr /= 0) then
         251           0 :         errstring='Error allocating this%psacwstot'
         252             :       end if
         253    13402584 :       allocate(this%bergstot(psetcols,nlev), stat=ierr)
         254     4467528 :       if (ierr /= 0) then
         255           0 :         errstring='Error allocating this%bergstot'
         256             :       end if
         257    13402584 :       allocate(this%vapdepstot(psetcols,nlev), stat=ierr)
         258     4467528 :       if (ierr /= 0) then
         259           0 :         errstring='Error allocating this%vapdepstot'
         260             :       end if
         261    13402584 :       allocate(this%bergtot(psetcols,nlev), stat=ierr)
         262     4467528 :       if (ierr /= 0) then
         263           0 :         errstring='Error allocating this%bergtot'
         264             :       end if
         265    13402584 :       allocate(this%melttot(psetcols,nlev), stat=ierr)
         266     4467528 :       if (ierr /= 0) then
         267           0 :         errstring='Error allocating this%melttot'
         268             :       end if
         269    13402584 :       allocate(this%meltstot(psetcols,nlev), stat=ierr)
         270     4467528 :       if (ierr /= 0) then
         271           0 :         errstring='Error allocating this%meltstot'
         272             :       end if
         273    13402584 :       allocate(this%meltgtot(psetcols,nlev), stat=ierr)
         274     4467528 :       if (ierr /= 0) then
         275           0 :         errstring='Error allocating this%meltgtot'
         276             :       end if
         277    13402584 :       allocate(this%homotot(psetcols,nlev), stat=ierr)
         278     4467528 :       if (ierr /= 0) then
         279           0 :         errstring='Error allocating this%homotot'
         280             :       end if
         281    13402584 :       allocate(this%qcrestot(psetcols,nlev), stat=ierr)
         282     4467528 :       if (ierr /= 0) then
         283           0 :         errstring='Error allocating this%qcrestot'
         284             :       end if
         285    13402584 :       allocate(this%prcitot(psetcols,nlev), stat=ierr)
         286     4467528 :       if (ierr /= 0) then
         287           0 :         errstring='Error allocating this%prcitot'
         288             :       end if
         289    13402584 :       allocate(this%praitot(psetcols,nlev), stat=ierr)
         290     4467528 :       if (ierr /= 0) then
         291           0 :         errstring='Error allocating this%praitot'
         292             :       end if
         293    13402584 :       allocate(this%qirestot(psetcols,nlev), stat=ierr)
         294     4467528 :       if (ierr /= 0) then
         295           0 :         errstring='Error allocating this%qirestot'
         296             :       end if
         297    13402584 :       allocate(this%mnuccrtot(psetcols,nlev), stat=ierr)
         298     4467528 :       if (ierr /= 0) then
         299           0 :         errstring='Error allocating this%mnuccrtot'
         300             :       end if
         301    13402584 :       allocate(this%mnudeptot(psetcols,nlev), stat=ierr)
         302     4467528 :       if (ierr /= 0) then
         303           0 :         errstring='Error allocating this%mnudeptot'
         304             :       end if
         305    13402584 :       allocate(this%mnuccritot(psetcols,nlev), stat=ierr)
         306     4467528 :       if (ierr /= 0) then
         307           0 :         errstring='Error allocating this%mnuccritot'
         308             :       end if
         309    13402584 :       allocate(this%pracstot(psetcols,nlev), stat=ierr)
         310     4467528 :       if (ierr /= 0) then
         311           0 :         errstring='Error allocating this%pracstot'
         312             :       end if
         313    13402584 :       allocate(this%meltsdttot(psetcols,nlev), stat=ierr)
         314     4467528 :       if (ierr /= 0) then
         315           0 :         errstring='Error allocating this%meltsdttot'
         316             :       end if
         317    13402584 :       allocate(this%frzrdttot(psetcols,nlev), stat=ierr)
         318     4467528 :       if (ierr /= 0) then
         319           0 :         errstring='Error allocating this%frzrdttot'
         320             :       end if
         321    13402584 :       allocate(this%mnuccdtot(psetcols,nlev), stat=ierr)
         322     4467528 :       if (ierr /= 0) then
         323           0 :         errstring='Error allocating this%mnuccdtot'
         324             :       end if
         325    13402584 :       allocate(this%pracgtot(psetcols,nlev), stat=ierr)
         326     4467528 :       if (ierr /= 0) then
         327           0 :         errstring='Error allocating this%pracgtot'
         328             :       end if
         329    13402584 :       allocate(this%psacwgtot(psetcols,nlev), stat=ierr)
         330     4467528 :       if (ierr /= 0) then
         331           0 :         errstring='Error allocating this%psacwgtot'
         332             :       end if
         333    13402584 :       allocate(this%pgsacwtot(psetcols,nlev), stat=ierr)
         334     4467528 :       if (ierr /= 0) then
         335           0 :         errstring='Error allocating this%pgsacwtot'
         336             :       end if
         337    13402584 :       allocate(this%pgracstot(psetcols,nlev), stat=ierr)
         338     4467528 :       if (ierr /= 0) then
         339           0 :         errstring='Error allocating this%pgracstot'
         340             :       end if
         341    13402584 :       allocate(this%prdgtot(psetcols,nlev), stat=ierr)
         342     4467528 :       if (ierr /= 0) then
         343           0 :         errstring='Error allocating this%prdgtot'
         344             :       end if
         345    13402584 :       allocate(this%qmultgtot(psetcols,nlev), stat=ierr)
         346     4467528 :       if (ierr /= 0) then
         347           0 :         errstring='Error allocating this%qmultgtot'
         348             :       end if
         349    13402584 :       allocate(this%qmultrgtot(psetcols,nlev), stat=ierr)
         350     4467528 :       if (ierr /= 0) then
         351           0 :         errstring='Error allocating this%qmultrgtot'
         352             :       end if
         353    13402584 :       allocate(this%psacrtot(psetcols,nlev), stat=ierr)
         354     4467528 :       if (ierr /= 0) then
         355           0 :         errstring='Error allocating this%psacrtot'
         356             :       end if
         357    13402584 :       allocate(this%npracgtot(psetcols,nlev), stat=ierr)
         358     4467528 :       if (ierr /= 0) then
         359           0 :         errstring='Error allocating this%npracgtot'
         360             :       end if
         361    13402584 :       allocate(this%nscngtot(psetcols,nlev), stat=ierr)
         362     4467528 :       if (ierr /= 0) then
         363           0 :         errstring='Error allocating this%nscngtot'
         364             :       end if
         365    13402584 :       allocate(this%ngracstot(psetcols,nlev), stat=ierr)
         366     4467528 :       if (ierr /= 0) then
         367           0 :         errstring='Error allocating this%ngracstot'
         368             :       end if
         369    13402584 :       allocate(this%nmultgtot(psetcols,nlev), stat=ierr)
         370     4467528 :       if (ierr /= 0) then
         371           0 :         errstring='Error allocating this%nmultgtot'
         372             :       end if
         373    13402584 :       allocate(this%nmultrgtot(psetcols,nlev), stat=ierr)
         374     4467528 :       if (ierr /= 0) then
         375           0 :         errstring='Error allocating this%nmultrgtot'
         376             :       end if
         377    13402584 :       allocate(this%npsacwgtot(psetcols,nlev), stat=ierr)
         378     4467528 :       if (ierr /= 0) then
         379           0 :         errstring='Error allocating this%npsacwgtot'
         380             :       end if
         381    13402584 :       allocate(this%nnuccctot(psetcols,nlev), stat=ierr)
         382     4467528 :       if (ierr /= 0) then
         383           0 :         errstring='Error allocating this%nnuccctot'
         384             :       end if
         385    13402584 :       allocate(this%nnuccttot(psetcols,nlev), stat=ierr)
         386     4467528 :       if (ierr /= 0) then
         387           0 :         errstring='Error allocating this%nnuccttot'
         388             :       end if
         389    13402584 :       allocate(this%nnuccdtot(psetcols,nlev), stat=ierr)
         390     4467528 :       if (ierr /= 0) then
         391           0 :         errstring='Error allocating this%nnuccdtot'
         392             :       end if
         393    13402584 :       allocate(this%nnudeptot(psetcols,nlev), stat=ierr)
         394     4467528 :       if (ierr /= 0) then
         395           0 :         errstring='Error allocating this%nnudeptot'
         396             :       end if
         397    13402584 :       allocate(this%nhomotot(psetcols,nlev), stat=ierr)
         398     4467528 :       if (ierr /= 0) then
         399           0 :         errstring='Error allocating this%nhomotot'
         400             :       end if
         401    17870112 :       allocate(this%nnuccrtot(psetcols,nlev), stat=ierr)
         402     4467528 :       if (ierr /= 0) then
         403           0 :         errstring='Error allocating this%nnuccrtot'
         404             :       end if
         405    13402584 :       allocate(this%nnuccritot(psetcols,nlev), stat=ierr)
         406     4467528 :       if (ierr /= 0) then
         407           0 :         errstring='Error allocating this%nnuccritot'
         408             :       end if
         409    13402584 :       allocate(this%nsacwitot(psetcols,nlev), stat=ierr)
         410     4467528 :       if (ierr /= 0) then
         411           0 :         errstring='Error allocating this%nsacwitot'
         412             :       end if
         413    13402584 :       allocate(this%npratot(psetcols,nlev), stat=ierr)
         414     4467528 :       if (ierr /= 0) then
         415           0 :         errstring='Error allocating this%npratot'
         416             :       end if
         417    13402584 :       allocate(this%npsacwstot(psetcols,nlev), stat=ierr)
         418     4467528 :       if (ierr /= 0) then
         419           0 :         errstring='Error allocating this%npsacwstot'
         420             :       end if
         421    13402584 :       allocate(this%npraitot(psetcols,nlev), stat=ierr)
         422     4467528 :       if (ierr /= 0) then
         423           0 :         errstring='Error allocating this%npraitot'
         424             :       end if
         425    13402584 :       allocate(this%npracstot(psetcols,nlev), stat=ierr)
         426     4467528 :       if (ierr /= 0) then
         427           0 :         errstring='Error allocating this%npracstot'
         428             :       end if
         429    13402584 :       allocate(this%nprctot(psetcols,nlev), stat=ierr)
         430     4467528 :       if (ierr /= 0) then
         431           0 :         errstring='Error allocating this%nprctot'
         432             :       end if
         433    13402584 :       allocate(this%nraggtot(psetcols,nlev), stat=ierr)
         434     4467528 :       if (ierr /= 0) then
         435           0 :         errstring='Error allocating this%nraggtot'
         436             :       end if
         437    13402584 :       allocate(this%nprcitot(psetcols,nlev), stat=ierr)
         438     4467528 :       if (ierr /= 0) then
         439           0 :         errstring='Error allocating this%nprcitot'
         440             :       end if
         441    13402584 :       allocate(this%ncsedten(psetcols,nlev), stat=ierr)
         442     4467528 :       if (ierr /= 0) then
         443           0 :         errstring='Error allocating this%ncsedten'
         444             :       end if
         445    13402584 :       allocate(this%nisedten(psetcols,nlev), stat=ierr)
         446     4467528 :       if (ierr /= 0) then
         447           0 :         errstring='Error allocating this%nisedten'
         448             :       end if
         449    13402584 :       allocate(this%nrsedten(psetcols,nlev), stat=ierr)
         450     4467528 :       if (ierr /= 0) then
         451           0 :         errstring='Error allocating this%nrsedten'
         452             :       end if
         453    13402584 :       allocate(this%nssedten(psetcols,nlev), stat=ierr)
         454     4467528 :       if (ierr /= 0) then
         455           0 :         errstring='Error allocating this%nssedten'
         456             :       end if
         457    13402584 :       allocate(this%ngsedten(psetcols,nlev), stat=ierr)
         458     4467528 :       if (ierr /= 0) then
         459           0 :         errstring='Error allocating this%ngsedten'
         460             :       end if
         461    13402584 :       allocate(this%nmelttot(psetcols,nlev), stat=ierr)
         462     4467528 :       if (ierr /= 0) then
         463           0 :         errstring='Error allocating this%nmelttot'
         464             :       end if
         465    13402584 :       allocate(this%nmeltstot(psetcols,nlev), stat=ierr)
         466     4467528 :       if (ierr /= 0) then
         467           0 :         errstring='Error allocating this%nmeltstot'
         468             :       end if
         469    13402584 :       allocate(this%nmeltgtot(psetcols,nlev), stat=ierr)
         470     4467528 :       if (ierr /= 0) then
         471           0 :         errstring='Error allocating this%nmeltgtot'
         472             :       end if
         473    13402584 :       allocate(this%lamc_out(psetcols,nlev), stat=ierr)
         474     4467528 :       if (ierr /= 0) then
         475           0 :          errstring='Error allocating this%lamc_out'
         476             :       end if
         477    13402584 :       allocate(this%lamr_out(psetcols,nlev), stat=ierr)
         478     4467528 :       if (ierr /= 0) then
         479           0 :          errstring='Error allocating this%lamr_out'
         480             :       end if
         481    13402584 :       allocate(this%pgam_out(psetcols,nlev), stat=ierr)
         482     4467528 :       if (ierr /= 0) then
         483           0 :          errstring='Error allocating this%pgam_out'
         484             :       end if
         485    13402584 :       allocate(this%n0r_out(psetcols,nlev), stat=ierr)
         486     4467528 :       if (ierr /= 0) then
         487           0 :          errstring='Error allocating this%n0r_out'
         488             :       end if
         489             :
         490             :       ! Only allocate these variables if machine learning turned on
         491             :
         492     4467528 :       if (trim(warm_rain) == 'tau' .or. trim(warm_rain) == 'emulated') then
         493           0 :          allocate(this%scale_qc(psetcols,nlev), stat=ierr)
         494           0 :          if (ierr /= 0) then
         495           0 :            errstring='Error allocating this%scale_qc'
         496             :          end if
         497           0 :          allocate(this%scale_nc(psetcols,nlev), stat=ierr)
         498           0 :          if (ierr /= 0) then
         499           0 :            errstring='Error allocating this%scale_nc'
         500             :          end if
         501           0 :          allocate(this%scale_qr(psetcols,nlev), stat=ierr)
         502           0 :          if (ierr /= 0) then
         503           0 :            errstring='Error allocating this%scale_qr'
         504             :          end if
         505           0 :          allocate(this%scale_nr(psetcols,nlev), stat=ierr)
         506           0 :          if (ierr /= 0) then
         507           0 :            errstring='Error allocating this%scale_nr'
         508             :          end if
         509           0 :          allocate(this%amk_c(psetcols,nlev,ncd), stat=ierr)
         510           0 :          if (ierr /= 0) then
         511           0 :            errstring='Error allocating this%amk_c'
         512             :          end if
         513           0 :          allocate(this%ank_c(psetcols,nlev,ncd), stat=ierr)
         514           0 :          if (ierr /= 0) then
         515           0 :            errstring='Error allocating this%ank_c'
         516             :          end if
         517           0 :          allocate(this%amk_r(psetcols,nlev,ncd), stat=ierr)
         518           0 :          if (ierr /= 0) then
         519           0 :            errstring='Error allocating this%amk_r'
         520             :          end if
         521           0 :          allocate(this%ank_r(psetcols,nlev,ncd), stat=ierr)
         522           0 :          if (ierr /= 0) then
         523           0 :            errstring='Error allocating this%ank_r'
         524             :          end if
         525           0 :          allocate(this%amk(psetcols,nlev,ncd), stat=ierr)
         526           0 :          if (ierr /= 0) then
         527           0 :            errstring='Error allocating this%amk'
         528             :          end if
         529           0 :          allocate(this%ank(psetcols,nlev,ncd), stat=ierr)
         530           0 :          if (ierr /= 0) then
         531           0 :            errstring='Error allocating this%ank'
         532             :          end if
         533           0 :          allocate(this%amk_out(psetcols,nlev,ncd), stat=ierr)
         534           0 :          if (ierr /= 0) then
         535           0 :            errstring='Error allocating this%amk_out'
         536             :          end if
         537           0 :          allocate(this%ank_out(psetcols,nlev,ncd), stat=ierr)
         538           0 :          if (ierr /= 0) then
         539           0 :            errstring='Error allocating this%ank_out'
         540             :          end if
         541           0 :          allocate(this%qc_out_TAU(psetcols,nlev), stat=ierr)
         542           0 :          if (ierr /= 0) then
         543           0 :            errstring='Error allocating this%qc_out_TAU'
         544             :          end if
         545           0 :          allocate(this%nc_out_TAU(psetcols,nlev), stat=ierr)
         546           0 :          if (ierr /= 0) then
         547           0 :            errstring='Error allocating this%nc_out_TAU'
         548             :          end if
         549           0 :          allocate(this%qr_out_TAU(psetcols,nlev), stat=ierr)
         550           0 :          if (ierr /= 0) then
         551           0 :            errstring='Error allocating this%qr_out_TAU'
         552             :          end if
         553           0 :          allocate(this%nr_out_TAU(psetcols,nlev), stat=ierr)
         554           0 :          if (ierr /= 0) then
         555           0 :            errstring='Error allocating this%nr_out_TAU'
         556             :          end if
         557           0 :          allocate(this%qc_in_TAU(psetcols,nlev), stat=ierr)
         558           0 :          if (ierr /= 0) then
         559           0 :            errstring='Error allocating this%qc_in_TAU'
         560             :          end if
         561           0 :          allocate(this%nc_in_TAU(psetcols,nlev), stat=ierr)
         562           0 :          if (ierr /= 0) then
         563           0 :            errstring='Error allocating this%nc_in_TAU'
         564             :          end if
         565           0 :          allocate(this%qr_in_TAU(psetcols,nlev), stat=ierr)
         566           0 :          if (ierr /= 0) then
         567           0 :            errstring='Error allocating this%qr_in_TAU'
         568             :          end if
         569           0 :          allocate(this%nr_in_TAU(psetcols,nlev), stat=ierr)
         570           0 :          if (ierr /= 0) then
         571           0 :            errstring='Error allocating this%nr_in_TAU'
         572             :          end if
         573           0 :          allocate(this%qctend_TAU(psetcols,nlev), stat=ierr)
         574           0 :          if (ierr /= 0) then
         575           0 :            errstring='Error allocating this%qctend_TAU'
         576             :          end if
         577           0 :          allocate(this%nctend_TAU(psetcols,nlev), stat=ierr)
         578           0 :          if (ierr /= 0) then
         579           0 :            errstring='Error allocating this%nctend_TAU'
         580             :          end if
         581           0 :          allocate(this%qrtend_TAU(psetcols,nlev), stat=ierr)
         582           0 :          if (ierr /= 0) then
         583           0 :            errstring='Error allocating this%qrtend_TAU'
         584             :          end if
         585           0 :          allocate(this%nrtend_TAU(psetcols,nlev), stat=ierr)
         586           0 :          if (ierr /= 0) then
         587           0 :            errstring='Error allocating this%nrtend_TAU'
         588             :          end if
         589           0 :          allocate(this%gmnnn_lmnnn_TAU(psetcols,nlev), stat=ierr)
         590           0 :          if (ierr /= 0) then
         591           0 :            errstring='Error allocating this%gmnnn_lmnnn_TAU'
         592             :          end if
         593           0 :          allocate(this%ML_fixer(psetcols,nlev), stat=ierr)
         594           0 :          if (ierr /= 0) then
         595           0 :            errstring='Error allocating this%ML_fixer'
         596             :          end if
         597           0 :          allocate(this%QC_fixer(psetcols,nlev), stat=ierr)
         598           0 :          if (ierr /= 0) then
         599           0 :            errstring='Error allocating this%QC_fixer'
         600             :          end if
         601           0 :          allocate(this%NC_fixer(psetcols,nlev), stat=ierr)
         602           0 :          if (ierr /= 0) then
         603           0 :            errstring='Error allocating this%NC_fixer'
         604             :          end if
         605           0 :          allocate(this%QR_fixer(psetcols,nlev), stat=ierr)
         606           0 :          if (ierr /= 0) then
         607           0 :            errstring='Error allocating this%QR_fixer'
         608             :          end if
         609           0 :          allocate(this%NR_fixer(psetcols,nlev), stat=ierr)
         610           0 :          if (ierr /= 0) then
         611           0 :            errstring='Error allocating this%NR_fixer'
         612             :          end if
         613     4467528 :       else if (warm_rain == 'sb2001') then
         614             :          ! Classic default (non-ML) microphysics
         615           0 :          allocate(this%qctend_SB2001(psetcols,nlev), stat=ierr)
         616           0 :          if (ierr /= 0) then
         617           0 :            errstring='Error allocating this%qctend_SB2001'
         618             :          end if
         619           0 :          allocate(this%nctend_SB2001(psetcols,nlev), stat=ierr)
         620           0 :          if (ierr /= 0) then
         621           0 :            errstring='Error allocating this%nctend_SB2001'
         622             :          end if
         623           0 :          allocate(this%qrtend_SB2001(psetcols,nlev), stat=ierr)
         624           0 :          if (ierr /= 0) then
         625           0 :            errstring='Error allocating this%artend_SB2001'
         626             :          end if
         627           0 :          allocate(this%nrtend_SB2001(psetcols,nlev), stat=ierr)
         628           0 :          if (ierr /= 0) then
         629           0 :            errstring='Error allocating this%nrtend_SB2001'
         630             :          end if
         631             :       end if
         632             :
         633             :       ! Variables which are needed by all code (Machine Learning and non-ML)
         634    13402584 :       allocate(this%qctend_KK2000(psetcols,nlev), stat=ierr)
         635     4467528 :       if (ierr /= 0) then
         636           0 :         errstring='Error allocating this%qctend_KK2000'
         637             :       end if
         638    17870112 :       allocate(this%nctend_KK2000(psetcols,nlev), stat=ierr)
         639     4467528 :       if (ierr /= 0) then
         640           0 :         errstring='Error allocating this%nctend_KK2000'
         641             :       end if
         642    13402584 :       allocate(this%qrtend_KK2000(psetcols,nlev), stat=ierr)
         643     4467528 :       if (ierr /= 0) then
         644           0 :         errstring='Error allocating this%artend_KK2000'
         645             :       end if
         646    13402584 :       allocate(this%nrtend_KK2000(psetcols,nlev), stat=ierr)
         647     4467528 :       if (ierr /= 0) then
         648           0 :         errstring='Error allocating this%nrtend_KK2000'
         649             :       end if
         650             :
         651     4467528 :    end subroutine proc_rates_allocate
         652             :
         653     4467528 :    subroutine proc_rates_deallocate(this, warm_rain)
         654             :    !--------------------------------------------------------------
         655             :    ! Routine to deallocate the elements of the proc_rates DDT
         656             :    !--------------------------------------------------------------
         657             :
         658             :       class(proc_rates_type) :: this
         659             :       character(len=16), intent(in) :: warm_rain            ! 'tau','emulated','sb2001' or 'kk2000'
         660             :
         661     4467528 :       deallocate(this%prodsnow)
         662     4467528 :       deallocate(this%evapsnow)
         663     4467528 :       deallocate(this%qcsevap)
         664     4467528 :       deallocate(this%qisevap)
         665     4467528 :       deallocate(this%qvres)
         666     4467528 :       deallocate(this%cmeitot)
         667     4467528 :       deallocate(this%vtrmc)
         668     4467528 :       deallocate(this%vtrmi)
         669     4467528 :       deallocate(this%umr)
         670     4467528 :       deallocate(this%ums)
         671     4467528 :       deallocate(this%umg)
         672     4467528 :       deallocate(this%qgsedten)
         673     4467528 :       deallocate(this%qcsedten)
         674     4467528 :       deallocate(this%qisedten)
         675     4467528 :       deallocate(this%qrsedten)
         676     4467528 :       deallocate(this%qssedten)
         677     4467528 :       deallocate(this%pratot)
         678     4467528 :       deallocate(this%prctot)
         679     4467528 :       deallocate(this%mnuccctot)
         680     4467528 :       deallocate(this%mnuccttot)
         681     4467528 :       deallocate(this%msacwitot)
         682     4467528 :       deallocate(this%psacwstot)
         683     4467528 :       deallocate(this%bergstot)
         684     4467528 :       deallocate(this%vapdepstot)
         685     4467528 :       deallocate(this%bergtot)
         686     4467528 :       deallocate(this%melttot)
         687     4467528 :       deallocate(this%meltstot)
         688     4467528 :       deallocate(this%meltgtot)
         689     4467528 :       deallocate(this%homotot)
         690     4467528 :       deallocate(this%qcrestot)
         691     4467528 :       deallocate(this%prcitot)
         692     4467528 :       deallocate(this%praitot)
         693     4467528 :       deallocate(this%qirestot)
         694     4467528 :       deallocate(this%mnuccrtot)
         695     4467528 :       deallocate(this%mnudeptot)
         696     4467528 :       deallocate(this%mnuccritot)
         697     4467528 :       deallocate(this%pracstot)
         698     4467528 :       deallocate(this%meltsdttot)
         699     4467528 :       deallocate(this%frzrdttot)
         700     4467528 :       deallocate(this%mnuccdtot)
         701     4467528 :       deallocate(this%pracgtot)
         702     4467528 :       deallocate(this%psacwgtot)
         703     4467528 :       deallocate(this%pgsacwtot)
         704     4467528 :       deallocate(this%pgracstot)
         705     4467528 :       deallocate(this%prdgtot)
         706     4467528 :       deallocate(this%qmultgtot)
         707     4467528 :       deallocate(this%qmultrgtot)
         708     4467528 :       deallocate(this%psacrtot)
         709     4467528 :       deallocate(this%npracgtot)
         710     4467528 :       deallocate(this%nscngtot)
         711     4467528 :       deallocate(this%ngracstot)
         712     4467528 :       deallocate(this%nmultgtot)
         713     4467528 :       deallocate(this%nmultrgtot)
         714     4467528 :       deallocate(this%npsacwgtot)
         715     4467528 :       deallocate(this%nnuccctot)
         716     4467528 :       deallocate(this%nnuccttot)
         717     4467528 :       deallocate(this%nnuccdtot)
         718     4467528 :       deallocate(this%nnudeptot)
         719     4467528 :       deallocate(this%nhomotot)
         720     4467528 :       deallocate(this%nnuccrtot)
         721     4467528 :       deallocate(this%nnuccritot)
         722     4467528 :       deallocate(this%nsacwitot)
         723     4467528 :       deallocate(this%npratot)
         724     4467528 :       deallocate(this%npsacwstot)
         725     4467528 :       deallocate(this%npraitot)
         726     4467528 :       deallocate(this%npracstot)
         727     4467528 :       deallocate(this%nprctot)
         728     4467528 :       deallocate(this%nraggtot)
         729     4467528 :       deallocate(this%nprcitot)
         730     4467528 :       deallocate(this%ncsedten)
         731     4467528 :       deallocate(this%nisedten)
         732     4467528 :       deallocate(this%nrsedten)
         733     4467528 :       deallocate(this%nssedten)
         734     4467528 :       deallocate(this%ngsedten)
         735     4467528 :       deallocate(this%nmelttot)
         736     4467528 :       deallocate(this%nmeltstot)
         737     4467528 :       deallocate(this%nmeltgtot)
         738             :
         739     4467528 :       deallocate(this%qctend_KK2000)
         740     4467528 :       deallocate(this%nctend_KK2000)
         741     4467528 :       deallocate(this%qrtend_KK2000)
         742     4467528 :       deallocate(this%nrtend_KK2000)
         743             :
         744     4467528 :       deallocate(this%lamc_out)
         745     4467528 :       deallocate(this%lamr_out)
         746     4467528 :       deallocate(this%pgam_out)
         747     4467528 :       deallocate(this%n0r_out)
         748             :
         749     4467528 :       if (trim(warm_rain) == 'tau' .or. trim(warm_rain) == 'emulated') then
         750           0 :          deallocate(this%scale_qc)
         751           0 :          deallocate(this%scale_nc)
         752           0 :          deallocate(this%scale_qr)
         753           0 :          deallocate(this%scale_nr)
         754           0 :          deallocate(this%amk_c)
         755           0 :          deallocate(this%ank_c)
         756           0 :          deallocate(this%amk_r)
         757           0 :          deallocate(this%ank_r)
         758           0 :          deallocate(this%amk)
         759           0 :          deallocate(this%ank)
         760           0 :          deallocate(this%amk_out)
         761           0 :          deallocate(this%ank_out)
         762           0 :          deallocate(this%qc_out_TAU)
         763           0 :          deallocate(this%nc_out_TAU)
         764           0 :          deallocate(this%qr_out_TAU)
         765           0 :          deallocate(this%nr_out_TAU)
         766           0 :          deallocate(this%qc_in_TAU)
         767           0 :          deallocate(this%nc_in_TAU)
         768           0 :          deallocate(this%qr_in_TAU)
         769           0 :          deallocate(this%nr_in_TAU)
         770           0 :          deallocate(this%qctend_TAU)
         771           0 :          deallocate(this%nctend_TAU)
         772           0 :          deallocate(this%qrtend_TAU)
         773           0 :          deallocate(this%nrtend_TAU)
         774           0 :          deallocate(this%gmnnn_lmnnn_TAU)
         775           0 :          deallocate(this%ML_fixer)
         776           0 :          deallocate(this%QC_fixer)
         777           0 :          deallocate(this%NC_fixer)
         778           0 :          deallocate(this%QR_fixer)
         779           0 :          deallocate(this%NR_fixer)
         780     4467528 :       else if (trim(warm_rain) == 'sb2001') then
         781           0 :          deallocate(this%qctend_SB2001)
         782           0 :          deallocate(this%nctend_SB2001)
         783           0 :          deallocate(this%qrtend_SB2001)
         784           0 :          deallocate(this%nrtend_SB2001)
         785             :       end if
         786             :
         787     4467528 :    end subroutine proc_rates_deallocate
         788             :
         789           0 : end module micro_pumas_diags

Generated by: LCOV version 1.14