From 180bf7a1fb8ae50b81938dd76b4cf2e6b8f70a95 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 9 Mar 2020 16:45:33 +0100
Subject: [PATCH] Philippe 09/03/2020: budgets: use new structures in
 ini_budget

---
 src/MNH/ini_budget.f90 | 5277 +++++++++++++++++++++-------------------
 src/MNH/ini_modeln.f90 |    5 +-
 2 files changed, 2745 insertions(+), 2537 deletions(-)

diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index d8382a7ba..3cebf2ed4 100644
--- a/src/MNH/ini_budget.f90
+++ b/src/MNH/ini_budget.f90
@@ -14,11 +14,12 @@ module mode_ini_budget
 contains
 
 !     #################################################################
-      SUBROUTINE INI_BUDGET(KLUOUT,PTSTEP,KSV,KRR,            &
+      SUBROUTINE INI_BUDGET(KLUOUT,PTSTEP,KSV,KRR,                    &
       ONUMDIFU,ONUMDIFTH,ONUMDIFSV,                                   &
       OHORELAX_UVWTH,OHORELAX_RV,OHORELAX_RC,OHORELAX_RR,             &
-      OHORELAX_RI,OHORELAX_RS, OHORELAX_RG, OHORELAX_RH,OHORELAX_TKE, & 
-      OHORELAX_SV,OVE_RELAX,OCHTRANS,ONUDGING,ODRAGTREE,ODEPOTREE,    &
+      OHORELAX_RI,OHORELAX_RS, OHORELAX_RG, OHORELAX_RH,OHORELAX_TKE, &
+      OHORELAX_SV, OVE_RELAX, ove_relax_grd, OCHTRANS,                &
+      ONUDGING,ODRAGTREE,ODEPOTREE,                                   &
       HRAD,HDCONV,HSCONV,HTURB,HTURBDIM,HCLOUD                        )
 !     #################################################################
 !
@@ -103,39 +104,48 @@ contains
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
 !  P. Wautelet 15/11/2019: remove unused CBURECORD variable
-!  P. Wautelet 28/01/2020: use the new data structures and subroutines for budgets for U
+!  P. Wautelet 02-03/2020: use the new data structures and subroutines for budgets
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------ 
 !
-USE MODD_PARAMETERS
-USE MODD_BUDGET
-USE MODD_DYN
-USE MODD_CONF
-use modd_field,      only: TYPEREAL
-USE MODD_PARAM_ICE
-USE MODD_PARAM_C2R2
-USE MODD_ELEC_DESCR, ONLY : LINDUCTIVE
-USE MODD_2D_FRC
-USE MODD_PARAM_LIMA, ONLY : OWARM=>LWARM, OCOLD=>LCOLD, OSEDI=>LSEDI,   &
-                            OHHONI=>LHHONI, ORAIN=>LRAIN, OSEDC=>LSEDC, &
-                            ONUCL=>LNUCL, OACTI=>LACTI, OSNOW=>LSNOW,   &
-                            OHAIL=>LHAIL, OSCAV=>LSCAV, OMEYERS=>LMEYERS,&
-                            ODEPOC=>LDEPOC, OPTSPLIT=>LPTSPLIT,          &
-                            NMOD_CCN
-use modd_viscosity,  only: lvisc
-!
+use modd_2d_frc,        only: l2d_adv_frc, l2d_rel_frc
+use modd_budget
+use modd_ch_aerosol,    only: lorilam
+use modd_conf,          only: l1d, lcartesian, lforcing, lthinshell, nmodel
+use modd_dust,          only: ldust
+use modd_dyn,           only: lcorio
+use modd_elec_descr,    only: linductive, lrelax2fw_ion
+use modd_field,         only: TYPEREAL
+use modd_nsv,           only: nsv_aerbeg, nsv_aerend, nsv_c2r2beg, nsv_c2r2end, nsv_chembeg, nsv_chemend,          &
+                              nsv_elecbeg, nsv_elecend,                                                            &
+                              nsv_lima_beg, nsv_lima_end, nsv_lima_ccn_acti, nsv_lima_ccn_free, nsv_lima_hom_haze, &
+                              nsv_lima_ifn_free, nsv_lima_ifn_nucl, nsv_lima_imm_nucl,                             &
+                              nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_scavmass,                            &
+                              nsv_user
+use modd_parameters,   only: jphext
+use modd_param_c2r2,   only: ldepoc_c2r2 => ldepoc, lrain_c2r2 => lrain, lsedc_c2r2 => lsedc, lsupsat_c2r2 => lsupsat
+use modd_param_ice,    only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm
+use modd_param_n,      only: cactccn, celec
+use modd_param_lima,   only: lacti_lima => lacti, lcold_lima => lcold, ldepoc_lima => ldepoc, lhail_lima => lhail, &
+                             lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl, lptsplit,        &
+                             lrain_lima => lrain, lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi,   &
+                             lsnow_lima => lsnow, lwarm_lima => lwarm,                                             &
+                             nmod_ccn, nmod_ifn, nmod_imm
+use modd_salt,         only: lsalt
+use modd_viscosity,    only: lvisc, lvisc_r, lvisc_sv, lvisc_th, lvisc_uvw
+
 USE MODE_ll
 USE MODE_MSG
-!
+
 IMPLICIT NONE
 !
 !*       0.1   declarations of argument
 !
 !
 INTEGER,         INTENT(IN) :: KLUOUT   ! Logical unit number for prints
-REAL, INTENT(IN) :: PTSTEP              ! time step
+REAL, INTENT(IN)    :: PTSTEP           ! time step
 INTEGER, INTENT(IN) :: KSV              ! number of scalar variables
 INTEGER, INTENT(IN) :: KRR              ! number of moist variables
 LOGICAL, INTENT(IN) :: ONUMDIFU         ! switch to activate the numerical
@@ -162,9 +172,11 @@ LOGICAL, INTENT(IN) :: OHORELAX_TKE    ! switch for the
                        ! horizontal relaxation for tke
 LOGICAL,DIMENSION(:),INTENT(IN):: OHORELAX_SV     ! switch for the
                        ! horizontal relaxation for scalar variables
-LOGICAL, INTENT(IN) :: OVE_RELAX        ! switch to activate the vertical 
+LOGICAL, INTENT(IN) :: OVE_RELAX        ! switch to activate the vertical
                                         ! relaxation
-LOGICAL, INTENT(IN) :: OCHTRANS         ! switch to activate convective 
+logical, intent(in) :: ove_relax_grd    ! switch to activate the vertical
+                                        ! relaxation to the lowest verticals
+LOGICAL, INTENT(IN) :: OCHTRANS         ! switch to activate convective
                                         !transport for SV
 LOGICAL, INTENT(IN) :: ONUDGING         ! switch to activate nudging
 LOGICAL, INTENT(IN) :: ODRAGTREE        ! switch to activate vegetation drag
@@ -184,7 +196,6 @@ INTEGER, DIMENSION(JPBUMAX,JPBUPROMAX+1) :: IPROACTV      ! switches set by the
                                                           ! activation
 INTEGER :: JI, JJ, JK , JJJ                               ! loop indices
 INTEGER :: IIMAX_ll, IJMAX_ll ! size of the physical global domain
-INTEGER :: IPROC                                          ! counter for processes
 INTEGER :: IIU, IJU                                       ! size along x and y directions
                                                           ! of the extended subdomain
 INTEGER :: IBUDIM1                                        ! first dimension of the budget arrays
@@ -200,16 +211,20 @@ LOGICAL :: GERROR                                         ! switch for error in
                                                           ! budget specifcation
 CHARACTER(LEN=7), DIMENSION(JPBUMAX) :: YEND_COMMENT      ! last part of comment
                                                           ! for budgets records
-CHARACTER(LEN=6), DIMENSION(JPBUMAX,JPBUPROMAX) :: YWORK2 ! used for 
+CHARACTER(LEN=6), DIMENSION(JPBUMAX,JPBUPROMAX) :: YWORK2 ! used for
                                                           ! concatenattion of  
                                                           ! comments for budgets
 CHARACTER(LEN=40)                  :: YSTRING
-INTEGER                            :: ILEN
-INTEGER :: JSV               ! loop indice for the SVs
-INTEGER :: IBUPROCNBR_SV_MAX ! Max number of processes for the SVs
-INTEGER :: ILAST_PROC_NBR    ! Index of the last process number
-INTEGER :: IINFO_ll ! return status of the interface routine
-integer :: isourcesmax          ! Maximum number of source terms in a budget
+character(len=3)    :: ybudgetnum
+INTEGER             :: ILEN
+INTEGER             :: JSV               ! loop indice for the SVs
+INTEGER             :: IBUPROCNBR_SV_MAX ! Max number of processes for the SVs
+INTEGER             :: IINFO_ll ! return status of the interface routine
+integer             :: ibudget
+integer             :: isourcesmax          ! Maximum number of source terms in a budget
+integer             :: igroup
+logical             :: gcond
+logical             :: gtmp
 type(tbusourcedata) :: tzsource ! Used to prepare metadate of source terms
 
 call Print_msg( NVERB_DEBUG, 'BUD', 'Ini_budget', 'called' )
@@ -360,17 +375,37 @@ GERROR=.FALSE.
 YWORK2(:,:) = ' '
 YEND_COMMENT(:) = ' '
 
+!Create intermediate variable to store rhodj for scalar variables
+if ( lbu_rth .or. lbu_rtke .or. lbu_rrv .or. lbu_rrc .or. lbu_rrr .or. &
+     lbu_rri .or. lbu_rrs  .or. lbu_rrg .or. lbu_rrh .or. lbu_rsv      ) then
+  allocate( tburhodj )
+
+  tburhodj%cmnhname  = 'RhodJS'
+  tburhodj%cstdname  = ''
+  tburhodj%clongname = 'RhodJS'
+  tburhodj%cunits    = 'kg'
+  tburhodj%ccomment  = 'RhodJ for Scalars variables'
+  tburhodj%ngrid     = 1
+  tburhodj%ntype     = TYPEREAL
+  tburhodj%ndims     = 3
+
+  allocate( tburhodj%xdata(ibudim1, ibudim2, ibudim3) )
+  tburhodj%xdata(:, :, :) = 0.
+end if
+
+
 tzsource%ntype    = TYPEREAL
 tzsource%ndims    = 3
 
 ! Budget of RU
-tbudgets(NBUDGET_U  )%cname    = "BU_RU"
-tbudgets(NBUDGET_U  )%ccomment = "Budget for U"
+tbudgets(NBUDGET_U)%cname    = "BU_RU"
+tbudgets(NBUDGET_U)%ccomment = "Budget for U"
 
 tbudgets(NBUDGET_U)%lenabled = lbu_ru
 
-if (lbu_ru) then
+if ( lbu_ru ) then
   allocate( tbudgets(NBUDGET_U)%trhodj )
+
   tbudgets(NBUDGET_U)%trhodj%cmnhname  = 'RhodJX'
   tbudgets(NBUDGET_U)%trhodj%cstdname  = ''
   tbudgets(NBUDGET_U)%trhodj%clongname = 'RhodJX'
@@ -398,2160 +433,2980 @@ if (lbu_ru) then
 
   tzsource%cunits   = 'm s-1'
 
+  gcond = .true.
   tzsource%cmnhname  = 'INIF'
   tzsource%clongname = 'initial state'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, .true., 1, odonotinit = .true., ooverwrite = .true.  )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
+  gcond = .true.
   tzsource%cmnhname  = 'ENDF'
   tzsource%clongname = 'final state'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, .true., 1, odonotinit = .true., ooverwrite = .true.  )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
+  gcond = .true.
   tzsource%cmnhname  = 'AVEF'
   tzsource%clongname = 'averaged state'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, .true., 1, odonotinit = .true., ooverwrite = .false. )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
   tzsource%cunits   = 'm s-2'
 
+  gcond = .true.
   tzsource%cmnhname  = 'ASSE'
   tzsource%clongname = 'time filter (Asselin)'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, .true.,                                   nasseu   )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nasseu )
 
+  gcond = nmodel > 1
   tzsource%cmnhname  = 'NEST'
   tzsource%clongname = 'nesting'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, nmodel > 1,                               nnestu   )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nnestu )
 
+  gcond = lforcing
   tzsource%cmnhname  = 'FRC'
   tzsource%clongname = 'forcing'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, lforcing,                                 nfrcu    )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nfrcu )
 
+  gcond = onudging
   tzsource%cmnhname  = 'NUD'
   tzsource%clongname = 'nudging'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, onudging,                                 nnudu    )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nnudu )
 
+  gcond = .not.l1d .and. .not.lcartesian
   tzsource%cmnhname  = 'CURV'
   tzsource%clongname = 'curvature'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, .not. lcartesian,                         ncurvu   )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, ncurvu )
 
+  gcond = lcorio
   tzsource%cmnhname  = 'COR'
   tzsource%clongname = 'Coriolis'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, lcorio,                                   ncoru    )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, ncoru )
 
+  gcond = onumdifu
   tzsource%cmnhname  = 'DIF'
   tzsource%clongname = 'numerical diffusion'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, onumdifu,                                 ndifu    )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, ndifu )
 
+  gcond = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
   tzsource%cmnhname  = 'REL'
   tzsource%clongname = 'relaxation'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, ohorelax_uvwth .or. ove_relax,            nrelu    )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nrelu )
 
+  gcond = odragtree
   tzsource%cmnhname  = 'DRAG'
   tzsource%clongname = 'drag force'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, odragtree,                                ndragu   )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, ndragu )
 
+  gcond = hturb == 'TKEL'
   tzsource%cmnhname  = 'VTURB'
   tzsource%clongname = 'vertical turbulent diffusion'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, hturb /= 'NONE',                          nvturbu  )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nvturbu )
 
+  gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
   tzsource%cmnhname  = 'HTURB'
   tzsource%clongname = 'horizontal turbulent diffusion'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, hturb /= 'NONE' .and. HTURBDIM == '3DIM', nhturbu  )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nhturbu )
 
+  gcond = hsconv == 'EDKF'
   tzsource%cmnhname  = 'MAFL'
   tzsource%clongname = 'mass flux'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, hsconv == 'EDKF',                         nmaflu   )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nmaflu )
 
+  gcond = lvisc .and. lvisc_uvw
   tzsource%cmnhname  = 'VISC'
   tzsource%clongname = 'viscosity'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, lvisc,                                    nviscu   )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nviscu )
 
+  gcond = .true.
   tzsource%cmnhname  = 'ADV'
   tzsource%clongname = 'advection'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, .true.,                                   nadvu    )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, nadvu )
 
+  gcond = .true.
   tzsource%cmnhname  = 'PRES'
   tzsource%clongname = 'pressure'
-  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, .true.,                                   npresu   )
+  call Budget_source_add( tbudgets(NBUDGET_U), tzsource, gcond, npresu )
 end if
-!
-!                        Budget of RV
-IF (LBU_RV) THEN
-  YWORK2(NBUDGET_V, 1) = 'INIF_'
 
-  YWORK2(NBUDGET_V, 2) = 'ENDF_'
+! Budget of RV
+tbudgets(NBUDGET_V)%cname    = "BU_RV"
+tbudgets(NBUDGET_V)%ccomment = "Budget for V"
 
-  YWORK2(NBUDGET_V, 3) = 'AVEF_'
+tbudgets(NBUDGET_V)%lenabled = lbu_rv
 
-  IPROC=4
-  YWORK2(NBUDGET_V, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_V, IPROC) = NASSEV
+if ( lbu_rv ) then
+  allocate( tbudgets(NBUDGET_V)%trhodj )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_V, IPROC) = NNESTV
+  tbudgets(NBUDGET_V)%trhodj%cmnhname  = 'RhodJY'
+  tbudgets(NBUDGET_V)%trhodj%cstdname  = ''
+  tbudgets(NBUDGET_V)%trhodj%clongname = 'RhodJY'
+  tbudgets(NBUDGET_V)%trhodj%cunits    = 'kg'
+  tbudgets(NBUDGET_V)%trhodj%ccomment  = 'RhodJ for momentum along Y axis'
+  tbudgets(NBUDGET_V)%trhodj%ngrid     = 3
+  tbudgets(NBUDGET_V)%trhodj%ntype     = TYPEREAL
+  tbudgets(NBUDGET_V)%trhodj%ndims     = 3
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_V, IPROC)  = NFRCV
+  allocate( tbudgets(NBUDGET_V)%trhodj%xdata(ibudim1, ibudim2, ibudim3) )
+  tbudgets(NBUDGET_V)%trhodj%xdata(:, :, :) = 0.
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'NUD_'
-  IF( ONUDGING ) IPROACTV(NBUDGET_V, IPROC)  = NNUDV
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'CURV_'
-  IF ( .NOT. LCARTESIAN ) THEN
-    IPROACTV(NBUDGET_V, IPROC) = NCURVV
-  ELSE
-    IPROACTV(NBUDGET_V, IPROC) = 4
-  END IF
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 18
+  tbudgets(NBUDGET_V)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_V)%tsources(isourcesmax) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'COR_'
-  IF ( LCORIO ) THEN
-    IPROACTV(NBUDGET_V, IPROC) = NCORV
-  ELSE
-    IPROACTV(NBUDGET_V, IPROC) = 4
-  END IF
+  allocate( tbudgets(NBUDGET_V)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'DIF_'
-  IF ( ONUMDIFU ) IPROACTV(NBUDGET_V, IPROC) = NDIFV
+  tbudgets(NBUDGET_V)%tsources(:)%ngroup = 0
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'REL_'
-  IF ( OHORELAX_UVWTH .OR. OVE_RELAX ) THEN
-    IPROACTV(NBUDGET_V, IPROC) = NRELV
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_V, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_V, IPROC) = 3
-    END IF
-  END IF
+  tzsource%ccomment = 'Budget of momentum along Y axis'
+  tzsource%ngrid    = 3
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'DRAG_'
-  IF( ODRAGTREE ) IPROACTV(NBUDGET_V, IPROC)  = NDRAGV
+  tzsource%cunits   = 'm s-1'
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'VTURB_'
-  IF ( HTURB /= 'NONE' ) IPROACTV(NBUDGET_V, IPROC) = NVTURBV
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'HTURB_'
-  IF ( HTURB /= 'NONE' .AND. HTURBDIM == '3DIM' ) THEN
-    IPROACTV(NBUDGET_V, IPROC) = NHTURBV
-  ELSE
-    IF ( HTURB /= 'NONE' ) THEN
-      IPROACTV(NBUDGET_V, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_V, IPROC) = 3
-    END IF
-  END IF 
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'MAFL_'
-  IF ( HSCONV == 'EDKF' ) IPROACTV(NBUDGET_V, IPROC) = NMAFLV
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_V, IPROC) = NADVV
+  tzsource%cunits   = 'm s-2'
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_V, IPROC) = 'PRES_'
-  IPROACTV(NBUDGET_V, IPROC) = NPRESV
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nassev )
 
-  YEND_COMMENT(NBUDGET_V) = 'BU_RV'
-  NBUPROCNBR(NBUDGET_V) = 3
-!
-  CBUACTION(NBUDGET_V, 1) = 'IG'
-  CBUACTION(NBUDGET_V, 2) = 'CC'
-  CBUACTION(NBUDGET_V, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_V, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_V, JJ) ) // &
-                                ADJUSTL( YEND_COMMENT(NBUDGET_V) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RW
-IF (LBU_RW) THEN
-  YWORK2(NBUDGET_W, 1) = 'INIF_'
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nnestv )
 
-  YWORK2(NBUDGET_W, 2) = 'ENDF_'
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nfrcv )
 
-  YWORK2(NBUDGET_W, 3) = 'AVEF_'
+  gcond = onudging
+  tzsource%cmnhname  = 'NUD'
+  tzsource%clongname = 'nudging'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nnudv )
 
-  IPROC=4
-  YWORK2(NBUDGET_W, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_W, IPROC) = NASSEW
+  gcond = .not.l1d .and. .not.lcartesian
+  tzsource%cmnhname  = 'CURV'
+  tzsource%clongname = 'curvature'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, ncurvv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_W, IPROC) = NNESTW
+  gcond = lcorio
+  tzsource%cmnhname  = 'COR'
+  tzsource%clongname = 'Coriolis'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, ncorv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_W, IPROC)  = NFRCW
+  gcond = onumdifu
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, ndifv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'NUD_'
-  IF( ONUDGING ) IPROACTV(NBUDGET_W, IPROC)  = NNUDW
+  gcond = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nrelv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'CURV_'
-  IF ( .NOT. LCARTESIAN ) THEN
-    IPROACTV(NBUDGET_W, IPROC) = NCURVW
-  ELSE
-    IPROACTV(NBUDGET_W, IPROC) = 4
-  END IF
+  gcond = odragtree
+  tzsource%cmnhname  = 'DRAG'
+  tzsource%clongname = 'drag force'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, ndragv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'COR_'
-  IF ( LCORIO ) THEN
-    IPROACTV(NBUDGET_W, IPROC) = NCORW
-  ELSE
-    IPROACTV(NBUDGET_W, IPROC) = 4
-  END IF
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'VTURB'
+  tzsource%clongname = 'vertical turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nvturbv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'DIF_'
-  IF ( ONUMDIFU ) IPROACTV(NBUDGET_W, IPROC) = NDIFW
+  gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  tzsource%cmnhname  = 'HTURB'
+  tzsource%clongname = 'horizontal turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nhturbv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'REL_'
-  IF ( OHORELAX_UVWTH .OR. OVE_RELAX ) THEN
-    IPROACTV(NBUDGET_W, IPROC) = NRELW
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_W, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_W, IPROC) = 3
-    END IF
-  END IF
+  gcond = hsconv == 'EDKF'
+  tzsource%cmnhname  = 'MAFL'
+  tzsource%clongname = 'mass flux'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nmaflv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'VTURB_'
-  IF ( HTURB /= 'NONE' ) IPROACTV(NBUDGET_W, IPROC) = NVTURBW
+  gcond = lvisc .and. lvisc_uvw
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nviscv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'HTURB_'
-  IF ( HTURB /= 'NONE' .AND. HTURBDIM == '3DIM' ) THEN
-    IPROACTV(NBUDGET_W, IPROC) = NHTURBW
-  ELSE
-    IF ( HTURB /= 'NONE' ) THEN
-      IPROACTV(NBUDGET_W, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_W, IPROC) = 3
-    END IF
-  END IF 
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'advection'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, nadvv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'GRAV_'
-  IPROACTV(NBUDGET_W, IPROC) = NGRAVW
+  gcond = .true.
+  tzsource%cmnhname  = 'PRES'
+  tzsource%clongname = 'pressure'
+  call Budget_source_add( tbudgets(NBUDGET_V), tzsource, gcond, npresv )
+end if
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_W, IPROC) = NADVW
+! Budget of RW
+tbudgets(NBUDGET_W)%cname    = "BU_RW"
+tbudgets(NBUDGET_W)%ccomment = "Budget for W"
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_W, IPROC) = 'PRES_'
-  IPROACTV(NBUDGET_W, IPROC) = NPRESW
+tbudgets(NBUDGET_W)%lenabled = lbu_rw
 
-  YEND_COMMENT(NBUDGET_W) = 'BU_RW'
-  NBUPROCNBR(NBUDGET_W) = 3
-!
-  CBUACTION(NBUDGET_W, 1) = 'IG'
-  CBUACTION(NBUDGET_W, 2) = 'CC'
-  CBUACTION(NBUDGET_W, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_W, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_W, JJ) ) // &
-                                ADJUSTL( YEND_COMMENT(NBUDGET_W) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RTH
-IF (LBU_RTH) THEN
-  YWORK2(NBUDGET_TH, 1) = 'INIF_'
+if ( lbu_rw ) then
+  allocate( tbudgets(NBUDGET_W)%trhodj )
 
-  YWORK2(NBUDGET_TH, 2) = 'ENDF_'
+  tbudgets(NBUDGET_W)%trhodj%cmnhname  = 'RhodJZ'
+  tbudgets(NBUDGET_W)%trhodj%cstdname  = ''
+  tbudgets(NBUDGET_W)%trhodj%clongname = 'RhodJZ'
+  tbudgets(NBUDGET_W)%trhodj%cunits    = 'kg'
+  tbudgets(NBUDGET_W)%trhodj%ccomment  = 'RhodJ for momentum along Y axis'
+  tbudgets(NBUDGET_W)%trhodj%ngrid     = 4
+  tbudgets(NBUDGET_W)%trhodj%ntype     = TYPEREAL
+  tbudgets(NBUDGET_W)%trhodj%ndims     = 3
 
-  YWORK2(NBUDGET_TH, 3) = 'AVEF_'
+  allocate( tbudgets(NBUDGET_W)%trhodj%xdata(ibudim1, ibudim2, ibudim3) )
+  tbudgets(NBUDGET_W)%trhodj%xdata(:, :, :) = 0.
 
-  IPROC=4
-  YWORK2(NBUDGET_TH, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_TH, IPROC) = NASSETH
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 17
+  tbudgets(NBUDGET_W)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_W)%tsources(isourcesmax) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_TH, IPROC) = NNESTTH
+  allocate( tbudgets(NBUDGET_W)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_TH, IPROC)  = NFRCTH
+  tbudgets(NBUDGET_W)%tsources(:)%ngroup = 0
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = '2DADV_'
-  IF( L2D_ADV_FRC ) IPROACTV(NBUDGET_TH, IPROC)  = N2DADVTH
+  tzsource%ccomment = 'Budget of momentum along Z axis'
+  tzsource%ngrid    = 4
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = '2DREL_'
-  IF( L2D_REL_FRC ) IPROACTV(NBUDGET_TH, IPROC)  = N2DRELTH
+  tzsource%cunits   = 'm s-1'
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'NUD_'
-  IF( ONUDGING ) IPROACTV(NBUDGET_TH, IPROC)  = NNUDTH
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'PREF_'
-  IF ( KRR > 0 ) THEN
-    IF(.NOT.L1D) IPROACTV(NBUDGET_TH, IPROC) = NPREFTH
-  ELSE
-    IPROACTV(NBUDGET_TH, IPROC) = 4
-  END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'DIF_'
-  IF ( ONUMDIFTH ) IPROACTV(NBUDGET_TH, IPROC) = NDIFTH
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'REL_'
-  IF ( OHORELAX_UVWTH .OR. OVE_RELAX ) THEN
-    IPROACTV(NBUDGET_TH, IPROC) = NRELTH
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_TH, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_TH, IPROC) = 3
-    END IF
-  END IF
+  tzsource%cunits   = 'm s-2'
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'RAD_'
-  IF ( HRAD /= 'NONE' ) IPROACTV(NBUDGET_TH, IPROC) = NRADTH
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nassew )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'DCONV_'
-  IF ( HDCONV /= 'NONE' .OR. HSCONV == 'KAFR') IPROACTV(NBUDGET_TH, IPROC) = NDCONVTH
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nnestw )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'VTURB_'
-  IF ( HTURB /= 'NONE' ) IPROACTV(NBUDGET_TH, IPROC) = NVTURBTH
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nfrcw )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'HTURB_'
-  IF ( HTURB /= 'NONE' .AND. HTURBDIM == '3DIM' ) THEN
-    IPROACTV(NBUDGET_TH, IPROC) = NHTURBTH
-  ELSE
-    IF ( HTURB /= 'NONE' ) THEN
-      IPROACTV(NBUDGET_TH, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_TH, IPROC) = 3
-    END IF
-  END IF 
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'DISSH_'
-  IF (HTURB /= 'NONE')     IPROACTV(NBUDGET_TH, IPROC) = NDISSHTH
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'NETUR_'
-  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2'))) &
-  IPROACTV(NBUDGET_TH, IPROC) = NNETURTH
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'MAFL_'
-  IF ( HSCONV == 'EDKF' ) IPROACTV(NBUDGET_TH, IPROC) = NMAFLTH
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_TH, IPROC) = NADVTH
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'NEADV_'
-  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))  IPROACTV(NBUDGET_TH, IPROC) = NNEADVTH
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TH, IPROC) = 'NEGA_'
-  IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') &
-          IPROACTV(NBUDGET_TH, IPROC) = NNEGATH
-
-  IF (HCLOUD == 'LIMA') THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'SEDI_'
-    IF (OPTSPLIT)                                           IPROACTV(NBUDGET_TH, IPROC) = NSEDITH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HENU_'
-    IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1)              IPROACTV(NBUDGET_TH, IPROC) = NHENUTH
-
-    IF (.NOT.OPTSPLIT) THEN
-      IPROC=IPROC+1
-      YWORK2(NBUDGET_TH, IPROC) = 'REVA_'
-      IF (OWARM .AND. ORAIN)                                IPROACTV(NBUDGET_TH, IPROC) = NREVATH
-    END IF
+  gcond = onudging
+  tzsource%cmnhname  = 'NUD'
+  tzsource%clongname = 'nudging'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nnudw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HIND_'
-    IF (OCOLD .AND. ONUCL)                                  IPROACTV(NBUDGET_TH, IPROC) = NHINDTH
+  gcond = .not.l1d .and. .not.lcartesian .and. .not.lthinshell
+  tzsource%cmnhname  = 'CURV'
+  tzsource%clongname = 'curvature'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, ncurvw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HINC_'
-    IF (OCOLD .AND. ONUCL)                                  IPROACTV(NBUDGET_TH, IPROC) = NHINCTH
+  gcond = lcorio .and. .not.l1d .and. .not.lthinshell
+  tzsource%cmnhname  = 'COR'
+  tzsource%clongname = 'Coriolis'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, ncorw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HONH_'
-    IF (OCOLD .AND. ONUCL .AND. OHHONI .AND. NMOD_CCN.GE.1) IPROACTV(NBUDGET_TH, IPROC) = NHONHTH
+  gcond = onumdifu
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, ndifw )
 
-    IF (OPTSPLIT) THEN
-      IPROC=IPROC+1
-      YWORK2(NBUDGET_TH, IPROC) = 'REVA_'
-                                                            IPROACTV(NBUDGET_TH, IPROC) = NREVATH
-    END IF
+  gcond = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nrelw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HONC_'
-    IF (OCOLD .AND. OWARM .AND. ONUCL)                      IPROACTV(NBUDGET_TH, IPROC) = NHONCTH
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'VTURB'
+  tzsource%clongname = 'vertical turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nvturbw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HONR_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ONUCL .AND. ORAIN))      IPROACTV(NBUDGET_TH, IPROC) = NHONRTH
+  gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  tzsource%cmnhname  = 'HTURB'
+  tzsource%clongname = 'horizontal turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nhturbw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'DEPS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))                  IPROACTV(NBUDGET_TH, IPROC) = NDEPSTH
+  gcond = lvisc .and. lvisc_uvw
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nviscw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'DEPG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_TH, IPROC) = NDEPGTH
+  gcond = .true.
+  tzsource%cmnhname  = 'GRAV'
+  tzsource%clongname = 'gravity'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, ngravw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'IMLT_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM))                  IPROACTV(NBUDGET_TH, IPROC) = NIMLTTH
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'advection'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, nadvw )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'BERFI_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM))                  IPROACTV(NBUDGET_TH, IPROC) = NBERFITH
+  gcond = .true.
+  tzsource%cmnhname  = 'PRES'
+  tzsource%clongname = 'pressure'
+  call Budget_source_add( tbudgets(NBUDGET_W), tzsource, gcond, npresw )
+end if
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'RIM_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_TH, IPROC) = NRIMTH
+! Budget of RTH
+tbudgets(NBUDGET_TH)%cname    = "BU_RTH"
+tbudgets(NBUDGET_TH)%ccomment = "Budget for potential temperature"
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'ACC_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW .AND. ORAIN))      IPROACTV(NBUDGET_TH, IPROC) = NACCTH
+tbudgets(NBUDGET_TH)%lenabled = lbu_rth
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'CFRZ_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_TH, IPROC) = NCFRZTH
+if ( lbu_rth ) then
+  tbudgets(NBUDGET_TH)%trhodj => tburhodj
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'WETG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_TH, IPROC) = NWETGTH
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 52
+  tbudgets(NBUDGET_TH)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_TH)%tsources(isourcesmax) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'DRYG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_TH, IPROC) = NDRYGTH
+  allocate( tbudgets(NBUDGET_TH)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'GMLT_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_TH, IPROC) = NGMLTTH
+  tbudgets(NBUDGET_TH)%tsources(:)%ngroup = 0
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'WETH_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                          IPROACTV(NBUDGET_TH, IPROC) = NWETHTH
+  tzsource%ccomment = 'Budget of potential temperature'
+  tzsource%ngrid    = 1
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HMLT_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                          IPROACTV(NBUDGET_TH, IPROC) = NHMLTTH
+  tzsource%cunits   = 'K'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'CEDS_'
-                                                            IPROACTV(NBUDGET_TH, IPROC) = NCEDSTH
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'ADJU_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LADJ_BEFORE) IPROACTV(NBUDGET_TH, IPROC) = NADJUTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HENU_'
-    IF (HCLOUD(1:3) == 'ICE' .OR. (HCLOUD == 'C2R2' .AND. (.NOT. LSUPSAT)) &
-          .OR. ( HCLOUD == 'KHKO' .AND. (.NOT. LSUPSAT)) ) &
-      IPROACTV(NBUDGET_TH, IPROC) = NHENUTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HON_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NHONTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'SFR_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NSFRTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'DEPS_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NDEPSTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'DEPG_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NDEPGTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'REVA_'
-    IF (((HCLOUD(1:3) == 'ICE') .AND. LWARM) .OR. ((HCLOUD == 'C2R2' &
-       .OR. HCLOUD == 'KHKO') .AND. LRAIN) .OR. HCLOUD(1:3) == 'KES')             &
-       IPROACTV(NBUDGET_TH, IPROC) = NREVATH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'RIM_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NRIMTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'ACC_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NACCTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'CFRZ_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NCFRZTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'WETG_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NWETGTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'DRYG_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NDRYGTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'GMLT_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NGMLTTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'WETH_'
-    IF (HCLOUD == 'ICE4') IPROACTV(NBUDGET_TH, IPROC) = NWETHTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'DRYH_'
-    IF (HCLOUD == 'ICE4'.AND. LRED) IPROACTV(NBUDGET_TH, IPROC) = NDRYHTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'HMLT_'
-    IF (HCLOUD == 'ICE4') IPROACTV(NBUDGET_TH, IPROC) = NHMLTTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'IMLT_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NIMLTTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'BERFI_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_TH, IPROC) = NBERFITH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'CORR_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(NBUDGET_TH, IPROC) = NCORRTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'CDEPI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. .NOT. LRED .OR. (LRED .AND. LADJ_AFTER)) &
-        IPROACTV(NBUDGET_TH, IPROC) = NCDEPITH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'COND_'
-    IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' .OR. HCLOUD(1:3) == 'KES' .OR.   &
-    HCLOUD == 'REVE')   IPROACTV(NBUDGET_TH, IPROC) = NCONDTH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_TH, IPROC) = 'NECON_'
-    IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))&
-        IPROACTV(NBUDGET_TH, IPROC) = NNECONTH
-  END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  YEND_COMMENT(NBUDGET_TH) = 'BU_RTH'
-  NBUPROCNBR(NBUDGET_TH) = 3
-!
-  CBUACTION(NBUDGET_TH, 1) = 'IG'
-  CBUACTION(NBUDGET_TH, 2) = 'CC'
-  CBUACTION(NBUDGET_TH, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_TH, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_TH, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_TH) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RTKE
-IF (LBU_RTKE) THEN
-  YWORK2(NBUDGET_TKE, 1) = 'INIF_'
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  YWORK2(NBUDGET_TKE, 2) = 'ENDF_'
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-  YWORK2(NBUDGET_TKE, 3) = 'AVEF_'
+  tzsource%cunits   = 'K s-1'
 
-  IPROC=4
-  YWORK2(NBUDGET_TKE, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_TKE, IPROC) = NASSETKE
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nasseth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_TKE, IPROC)  = NFRCTKE
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nnestth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'DIF_'
-  IF ( ONUMDIFTH ) IPROACTV(NBUDGET_TKE, IPROC) = NDIFTKE
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nfrcth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'REL_'
-  IF ( OHORELAX_TKE ) THEN
-    IPROACTV(NBUDGET_TKE, IPROC) = NRELTKE
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_TKE, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_TKE, IPROC) = 3
-    END IF
-  END IF
+  gcond = l2d_adv_frc
+  tzsource%cmnhname  = '2DADV'
+  tzsource%clongname = 'advective forcing'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, n2dadvth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'DRAG_'
-  IF( ODRAGTREE ) IPROACTV(NBUDGET_TKE, IPROC)  = NDRAGTKE
+  gcond = l2d_rel_frc
+  tzsource%cmnhname  = '2DREL'
+  tzsource%clongname = 'relaxation forcing'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, n2drelth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'DP_'
-  IPROACTV(NBUDGET_TKE, IPROC) = NDPTKE
+  gcond = onudging
+  tzsource%cmnhname  = 'NUD'
+  tzsource%clongname = 'nudging'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nnudth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'TP_'
-  IPROACTV(NBUDGET_TKE, IPROC) = NTPTKE
+  gcond = krr > 0 .and. .not.l1d
+  tzsource%cmnhname  = 'PREF'
+  tzsource%clongname = 'reference pressure'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nprefth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'DISS_'
-  IPROACTV(NBUDGET_TKE, IPROC) = NDISSTKE
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndifth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'TR_'
-  IPROACTV(NBUDGET_TKE, IPROC) = NTRTKE
+  gcond = ohorelax_uvwth .or. ove_relax .or. ove_relax_grd
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nrelth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_TKE, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_TKE, IPROC) = NADVTKE
+  gcond = hrad /= 'NONE'
+  tzsource%cmnhname  = 'RAD'
+  tzsource%clongname = 'radiation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nradth )
 
-  YEND_COMMENT(NBUDGET_TKE) = 'BU_RTKE'
-  NBUPROCNBR(NBUDGET_TKE) = 3
-!
-  CBUACTION(NBUDGET_TKE, 1) = 'IG'
-  CBUACTION(NBUDGET_TKE, 2) = 'CC'
-  CBUACTION(NBUDGET_TKE, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_TKE, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_TKE, JJ) ) // &
-                                  ADJUSTL( YEND_COMMENT(NBUDGET_TKE) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RRV
-IF (LBU_RRV) THEN
-  YWORK2(NBUDGET_RV, 1) = 'INIF_'
+  gcond = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+  tzsource%cmnhname  = 'DCONV'
+  tzsource%clongname = 'KAFR convection'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndconvth )
 
-  YWORK2(NBUDGET_RV, 2) = 'ENDF_'
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'VTURB'
+  tzsource%clongname = 'vertical turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nvturbth )
 
-  YWORK2(NBUDGET_RV, 3) = 'AVEF_'
+  gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  tzsource%cmnhname  = 'HTURB'
+  tzsource%clongname = 'horizontal turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhturbth )
 
-  IPROC=4
-  YWORK2(NBUDGET_RV, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_RV, IPROC) = NASSERV
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'DISSH'
+  tzsource%clongname = 'dissipation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndisshth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_RV, IPROC) = NNESTRV
+  gcond = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or.  hcloud == 'C2R2' )
+  tzsource%cmnhname  = 'NETUR'
+  tzsource%clongname = 'negative correction induced by turbulence'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nneturth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_RV, IPROC)  = NFRCRV
+  gcond = hsconv == 'EDKF'
+  tzsource%cmnhname  = 'MAFL'
+  tzsource%clongname = 'mass flux'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nmaflth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = '2DADV_'
-  IF( L2D_ADV_FRC ) IPROACTV(NBUDGET_RV, IPROC)  = N2DADVRV
+  gcond = lvisc .and. lvisc_th
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nviscth )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = '2DREL_'
-  IF( L2D_REL_FRC ) IPROACTV(NBUDGET_RV, IPROC)  = N2DRELRV
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nadvth )
+
+  gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2'
+  tzsource%cmnhname  = 'NEADV'
+  tzsource%clongname = 'negative correction induced by advection'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nneadvth )
+
+  gcond = hcloud /= 'NONE' .and. hcloud /= 'KHKO' .and. hcloud /= 'C2R2'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nnegath )
+
+  gcond = hcloud == 'LIMA' .and. lptsplit
+  tzsource%cmnhname  = 'SEDI'
+  tzsource%clongname = 'heat transport by hydrometeors sedimentation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nsedith )
+
+  gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+  gcond =      ( hcloud      == 'LIMA' .and. lwarm_lima .and. lacti_lima .and. nmod_ccn >= 1 )     &
+          .or.   hcloud(1:3) == 'ICE'                                                         &
+          .or. ( hcloud      == 'C2R2' .and. ( gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) ) ) &
+          .or. ( hcloud      == 'KHKO' .and. ( gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) ) )
+  tzsource%cmnhname  = 'HENU'
+  tzsource%clongname = 'heterogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhenuth )
+
+  gcond =      ( hcloud      == 'LIMA' .and. ( ( .not. lptsplit .and. lwarm_lima .and. lrain_lima ) .or. lptsplit ) ) &
+          .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                                              &
+          .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                                             &
+          .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )                                                             &
+          .or.   hcloud      == 'KESS'
+  tzsource%cmnhname  = 'REVA'
+  tzsource%clongname = 'rain evaporation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nrevath )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima
+  tzsource%cmnhname  = 'HIND'
+  tzsource%clongname = 'heterogeneous nucleation by deposition'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhindth )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima
+  tzsource%cmnhname  = 'HINC'
+  tzsource%clongname = 'heterogeneous nucleation by contact'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhincth )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'HON'
+  tzsource%clongname = 'homogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhonth )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+  tzsource%cmnhname  = 'HONH'
+  tzsource%clongname = 'haze homogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhonhth )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lnucl_lima ) )
+  tzsource%cmnhname  = 'HONC'
+  tzsource%clongname = 'droplet homogeneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhoncth )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lnucl_lima .and. lrain_lima ) )
+  tzsource%cmnhname  = 'HONR'
+  tzsource%clongname = 'raindrop homogeneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhonrth )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'SFR'
+  tzsource%clongname = 'spontaneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nsfrth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DEPS'
+  tzsource%clongname = 'deposition on snow'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndepsth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DEPG'
+  tzsource%clongname = 'deposition on graupel'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndepgth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'IMLT'
+  tzsource%clongname = 'ice melting'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nimltth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'BERFI'
+  tzsource%clongname = 'Bergeron-Findeisen'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nberfith )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'RIM'
+  tzsource%clongname = 'riming of cloud droplets'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nrimth )
+
+  gcond =      ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima .and. lrain_lima) ) ) &
+          .or.   hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'ACC'
+  tzsource%clongname = 'accretion of rain'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, naccth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'CFRZ'
+  tzsource%clongname = 'conversion freezing of rain'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ncfrzth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'WETG'
+  tzsource%clongname = 'wet growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nwetgth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DRYG'
+  tzsource%clongname = 'dry growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndrygth )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'GMLT'
+  tzsource%clongname = 'graupel melting'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ngmltth )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'WETH'
+  tzsource%clongname = 'wet growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nwethth )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'DRYH'
+  tzsource%clongname = 'dry growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ndryhth )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'HMLT'
+  tzsource%clongname = 'melting of hail'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nhmltth )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ncorrth )
+
+  gcond = hcloud == 'LIMA'
+  tzsource%cmnhname  = 'CEDS'
+  tzsource%clongname = 'adjustment to saturation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ncedsth )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before
+  tzsource%cmnhname  = 'ADJU'
+  tzsource%clongname = ''
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nadjuth )
+
+  gcond = hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE' )
+  tzsource%cmnhname  = 'CDEPI'
+  tzsource%clongname = 'deposition on ice'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ncdepith )
+
+  gcond = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE'
+  tzsource%cmnhname  = 'COND'
+  tzsource%clongname = 'vapor condensation or cloud water evaporation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, ncondth )
+
+  gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2'
+  tzsource%cmnhname  = 'NECON'
+  tzsource%clongname = 'negative correction induced by condensation'
+  call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nneconth )
+end if
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'NUD_'
-  IF( ONUDGING ) IPROACTV(NBUDGET_RV, IPROC)  = NNUDRV
+! Budget of RTKE
+tbudgets(NBUDGET_TKE)%cname    = "BU_RTKE"
+tbudgets(NBUDGET_TKE)%ccomment = "Budget for turbulent kinetic energy"
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'DIF_'
-  IF ( ONUMDIFTH ) IPROACTV(NBUDGET_RV, IPROC) = NDIFRV
+tbudgets(NBUDGET_TKE)%lenabled = lbu_rtke
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'REL_'
-  IF ( OHORELAX_RV .OR. OVE_RELAX ) THEN
-    IPROACTV(NBUDGET_RV, IPROC) = NRELRV
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_RV, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RV, IPROC) = 3
-    END IF
-  END IF
+if ( lbu_rtke ) then
+  tbudgets(NBUDGET_TKE)%trhodj => tburhodj
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'DCONV_'
-  IF ( HDCONV /= 'NONE' .OR. HSCONV == 'KAFR') IPROACTV(NBUDGET_RV, IPROC) = NDCONVRV
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 13
+  tbudgets(NBUDGET_TKE)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_TKE)%tsources(isourcesmax) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'VTURB_'
-  IF ( HTURB /= 'NONE' ) IPROACTV(NBUDGET_RV, IPROC) = NVTURBRV
+  allocate( tbudgets(NBUDGET_TKE)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'HTURB_'
-  IF ( HTURB /= 'NONE' .AND. HTURBDIM == '3DIM' ) THEN
-    IPROACTV(NBUDGET_RV, IPROC) = NHTURBRV
-  ELSE
-    IF ( HTURB /= 'NONE' ) THEN
-      IPROACTV(NBUDGET_RV, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RV, IPROC) = 3
-    END IF
-  END IF 
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'NETUR_'
-  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2'))) &
-   IPROACTV(NBUDGET_RV, IPROC) = NNETURRV
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'MAFL_'
-  IF ( HSCONV == 'EDKF' ) IPROACTV(NBUDGET_RV, IPROC) = NMAFLRV
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_RV, IPROC) = NADVRV
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'NEADV_'
-  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))  IPROACTV(NBUDGET_RV, IPROC) = NNEADVRV
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RV, IPROC) = 'NEGA_'
-  IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') &
-     IPROACTV(NBUDGET_RV, IPROC) = NNEGARV
-
-  IF (HCLOUD == 'LIMA') THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'HENU_'
-    IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1)              IPROACTV(NBUDGET_RV, IPROC) = NHENURV
-
-    IF (.NOT.OPTSPLIT) THEN
-      IPROC=IPROC+1
-      YWORK2(NBUDGET_RV, IPROC) = 'REVA_'
-      IF (OWARM .AND. ORAIN)                                IPROACTV(NBUDGET_RV, IPROC) = NREVARV
-    END IF
+  tbudgets(NBUDGET_TKE)%tsources(:)%ngroup = 0
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'HIND_'
-    IF (OCOLD .AND. ONUCL)                                  IPROACTV(NBUDGET_RV, IPROC) = NHINDRV
+  tzsource%ccomment = 'Budget of turbulent kinetic energy'
+  tzsource%ngrid    = 1
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'HONH_'
-    IF (OCOLD .AND. ONUCL .AND. OHHONI .AND. NMOD_CCN.GE.1) IPROACTV(NBUDGET_RV, IPROC) = NHONHRV
+  tzsource%cunits   = 'm2 s-1'
 
-    IF (OPTSPLIT) THEN
-      IPROC=IPROC+1
-      YWORK2(NBUDGET_RV, IPROC) = 'REVA_'
-                                                            IPROACTV(NBUDGET_RV, IPROC) = NREVARV
-    END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'DEPS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))                  IPROACTV(NBUDGET_RV, IPROC) = NDEPSRV
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'DEPG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_RV, IPROC) = NDEPGRV
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'CEDS_'
-                                                            IPROACTV(NBUDGET_RV, IPROC) = NCEDSRV
+  tzsource%cunits   = 'm2 s-3'
 
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'ADJU_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LADJ_BEFORE) &
-            IPROACTV(NBUDGET_RV, IPROC) = NADJURV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'HENU_'
-    IF ((HCLOUD == 'C2R2'  .AND. (.NOT. LSUPSAT)) &
-            .OR. ( HCLOUD == 'KHKO' .AND. (.NOT. LSUPSAT)) &
-            .OR. HCLOUD(1:3) == 'ICE')  &
-          IPROACTV(NBUDGET_RV, IPROC) = NHENURV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'DEPS_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RV, IPROC) = NDEPSRV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'DEPG_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RV, IPROC) = NDEPGRV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'REVA_'
-    IF (HCLOUD(1:3) == 'KES' .OR. ((HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') .AND. LRAIN) .OR. &
-        ((HCLOUD(1:3) == 'ICE') .AND. LWARM)) IPROACTV(NBUDGET_RV, IPROC) = NREVARV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'COND_'
-    IF (HCLOUD(1:3) == 'KES'.OR. HCLOUD == 'REVE' .OR. &
-        HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' ) IPROACTV(NBUDGET_RV, IPROC) = NCONDRV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'CORR_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(NBUDGET_RV, IPROC) = NCORRRV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'CDEPI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) )) &
-            IPROACTV(NBUDGET_RV, IPROC) = NCDEPIRV
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RV, IPROC) = 'NECON_'
-    IF ( (HCLOUD == 'KHKO' )  .OR.  (HCLOUD == 'C2R2')) &
-            IPROACTV(NBUDGET_RV, IPROC) = NNECONRV
-  END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, nassetke )
 
-  YEND_COMMENT(NBUDGET_RV) = 'BU_RRV'
-  NBUPROCNBR(NBUDGET_RV) = 3
-!
-  CBUACTION(NBUDGET_RV, 1) = 'IG'
-  CBUACTION(NBUDGET_RV, 2) = 'CC'
-  CBUACTION(NBUDGET_RV, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_RV, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_RV, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_RV) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RRC
-IF (LBU_RRC) THEN
-  YWORK2(NBUDGET_RC, 1) = 'INIF_'
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, nfrctke )
 
-  YWORK2(NBUDGET_RC, 2) = 'ENDF_'
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, ndiftke )
 
-  YWORK2(NBUDGET_RC, 3) = 'AVEF_'
+  gcond = ohorelax_tke
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, nreltke )
 
-  IPROC=4
-  YWORK2(NBUDGET_RC, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_RC, IPROC) = NASSERC
+  gcond = odragtree
+  tzsource%cmnhname  = 'DRAG'
+  tzsource%clongname = 'drag force'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, ndragtke )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_RC, IPROC) = NNESTRC
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'DP'
+  tzsource%clongname = 'dynamic production'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, ndptke )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_RC, IPROC)  = NFRCRC
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'TP'
+  tzsource%clongname = 'thermal production'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, ntptke )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'DIF_'
-  IF ( ONUMDIFTH ) IPROACTV(NBUDGET_RC, IPROC) = NDIFRC
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'DISS'
+  tzsource%clongname = 'dissipation of TKE'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, ndisstke )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'REL_'
-  IF ( OHORELAX_RC ) THEN
-    IPROACTV(NBUDGET_RC, IPROC) = NRELRC
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_RC, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RC, IPROC) = 3
-    END IF
-  END IF
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'TR'
+  tzsource%clongname = 'turbulent transport'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, ntrtke )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'DCONV_'
-  IF( HDCONV /= 'NONE' .OR. HSCONV == 'KAFR') IPROACTV(NBUDGET_RC, IPROC)  = NDCONVRC
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'DEPOTR'
-  IF( ODRAGTREE .AND. ODEPOTREE ) IPROACTV(NBUDGET_RC, IPROC) = NDEPOTRRC
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'VTURB_'
-  IF ( HTURB /= 'NONE' ) IPROACTV(NBUDGET_RC, IPROC) = NVTURBRC
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'HTURB_'
-  IF ( HTURB /= 'NONE' .AND. HTURBDIM == '3DIM' ) THEN
-    IPROACTV(NBUDGET_RC, IPROC) = NHTURBRC
-  ELSE 
-    IF ( HTURB /= 'NONE' ) THEN
-      IPROACTV(NBUDGET_RC, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RC, IPROC) = 3
-    END IF
-  END IF 
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'NETUR_'
-  IF (HTURB /= 'NONE' .AND. ( (HCLOUD == 'KHKO') .OR.  (HCLOUD == 'C2R2'))) &
-      IPROACTV(NBUDGET_RC, IPROC) = NNETURRC
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_RC, IPROC) = NADVRC
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'NEADV_'
-  IF ((HCLOUD == 'KHKO')  .OR.  (HCLOUD == 'C2R2'))  &
-      IPROACTV(NBUDGET_RC, IPROC) = NNEADVRC
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RC, IPROC) = 'NEGA_'
-  IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'KHKO' .AND. HCLOUD /= 'C2R2') &
-     IPROACTV(NBUDGET_RC, IPROC)  = NNEGARC
-
-  IF (HCLOUD == 'LIMA') THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'CORR_'
-    IF (OPTSPLIT .AND. OWARM .AND. ORAIN)              IPROACTV(NBUDGET_RC, IPROC) = NCORRRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'SEDI_'
-    IF (OWARM .AND. OSEDC)                             IPROACTV(NBUDGET_RC, IPROC) = NSEDIRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'DEPO_'
-    IF (OWARM .AND. ODEPOC)                            IPROACTV(NBUDGET_RC, IPROC) = NDEPORC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'R2C1_'
-    IF (OPTSPLIT .AND. OWARM .AND. ORAIN)              IPROACTV(NBUDGET_RC, IPROC) = NR2C1RC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'HENU_'
-    IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1)         IPROACTV(NBUDGET_RC, IPROC) = NHENURC
-
-    IF (OPTSPLIT) THEN
-      IPROC=IPROC+1
-      YWORK2(NBUDGET_RC, IPROC) = 'HINC_'
-      IF (OCOLD .AND. ONUCL)                          IPROACTV(NBUDGET_RC, IPROC) = NHINCRC
-    END IF
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_TKE), tzsource, gcond, nadvtke )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'AUTO_'
-    IF (OPTSPLIT .OR. (OWARM .AND. ORAIN))             IPROACTV(NBUDGET_RC, IPROC) = NAUTORC
+end if
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'ACCR_'
-    IF (OPTSPLIT .OR. (OWARM .AND. ORAIN))             IPROACTV(NBUDGET_RC, IPROC) = NACCRRC
+! Budget of RRV
+tbudgets(NBUDGET_RV)%cname    = "BU_RRV"
+tbudgets(NBUDGET_RV)%ccomment = "Budget for water vapor mixing ratio"
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'REVA_'
-    IF (OPTSPLIT .OR. (OWARM .AND. ORAIN))             IPROACTV(NBUDGET_RC, IPROC) = NREVARC
+tbudgets(NBUDGET_RV)%lenabled = lbu_rrv .and. krr >= 1
 
-    IF (.NOT.OPTSPLIT) THEN
-      IPROC=IPROC+1
-      YWORK2(NBUDGET_RC, IPROC) = 'HINC_'
-      IF (OCOLD .AND. ONUCL)                          IPROACTV(NBUDGET_RC, IPROC) = NHINCRC
-    END IF
+if ( tbudgets(NBUDGET_RV)%lenabled ) then
+  tbudgets(NBUDGET_RV)%trhodj => tburhodj
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'HONC_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ONUCL)) IPROACTV(NBUDGET_RC, IPROC) = NHONCRC
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 32
+  tbudgets(NBUDGET_RV)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_RV)%tsources(isourcesmax) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'IMLT_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM))             IPROACTV(NBUDGET_RC, IPROC) = NIMLTRC
+  allocate( tbudgets(NBUDGET_RV)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'BERFI_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM))             IPROACTV(NBUDGET_RC, IPROC) = NBERFIRC
+  tbudgets(NBUDGET_RV)%tsources(:)%ngroup = 0
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'RIM_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RC, IPROC) = NRIMRC
+  tzsource%ccomment = 'Budget of water vapor mixing ratio'
+  tzsource%ngrid    = 1
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'WETG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RC, IPROC) = NWETGRC
+  tzsource%cunits   = 'kg kg-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'DRYG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RC, IPROC) = NDRYGRC
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'CVRC_'
-    IF (OPTSPLIT)                                      IPROACTV(NBUDGET_RC, IPROC) = NCVRCRC
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'WETH_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                     IPROACTV(NBUDGET_RC, IPROC) = NWETHRC
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'CEDS_'
-                                                       IPROACTV(NBUDGET_RC, IPROC) = NCEDSRC
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'ACCR_'
-    IF (HCLOUD(1:3) == 'KES' )            IPROACTV(NBUDGET_RC, IPROC  ) = NACCRRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'AUTO_'
-    IF (HCLOUD(1:3) == 'KES' )            IPROACTV(NBUDGET_RC, IPROC) = NAUTORC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'HENU_'
-    IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO')  .AND. (.NOT. LSUPSAT)) &
-            IPROACTV(NBUDGET_RC, IPROC) = NHENURC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'ADJU_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LADJ_BEFORE) &
-            IPROACTV(NBUDGET_RC, IPROC) = NADJURC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'SEDI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LSEDIC .AND. &
-            LRED .AND. (.NOT. LSEDIM_AFTER)) &
-       IPROACTV(NBUDGET_RC, IPROC) = NSEDIRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'HON_'
-    IF (HCLOUD(1:3) == 'ICE' ) IPROACTV(NBUDGET_RC, IPROC) = NHONRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'AUTO_'
-    IF (((HCLOUD(1:3) == 'ICE' ) .AND. LWARM) .OR.  ((HCLOUD == 'C2R2' .OR. &
-          HCLOUD == 'KHKO') .AND. LRAIN)) IPROACTV(NBUDGET_RC, IPROC) = NAUTORC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'ACCR_'
-    IF (((HCLOUD(1:3) == 'ICE' ) .AND. LWARM) .OR.  ((HCLOUD == 'C2R2' .OR. &
-          HCLOUD == 'KHKO') .AND. LRAIN)) IPROACTV(NBUDGET_RC, IPROC) = NACCRRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'RIM_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RC, IPROC) = NRIMRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'CMEL_'
-    IF (HCLOUD(1:3) == 'ICE'  .AND. LRED) IPROACTV(NBUDGET_RC, IPROC) = NCMELRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'WETG_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RC, IPROC) = NWETGRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'DRYG_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RC, IPROC) = NDRYGRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'WETH_'
-    IF (HCLOUD == 'ICE4')  IPROACTV(NBUDGET_RC, IPROC) = NWETHRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'DRYH_'
-    IF (HCLOUD == 'ICE4' .AND. LRED)  IPROACTV(NBUDGET_RC, IPROC) = NDRYHRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'IMLT_'
-    IF (HCLOUD(1:3) == 'ICE' ) IPROACTV(NBUDGET_RC, IPROC) = NIMLTRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'BERFI_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RC, IPROC) = NBERFIRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'CORR_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(NBUDGET_RC, IPROC) = NCORRRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'SEDI_'
-    IF (((HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO').AND. LSEDC) .OR.   &
-       (HCLOUD(1:3) == 'ICE' .AND. LSEDIC .AND. .NOT. LRED) .OR. &
-       (HCLOUD(1:3) == 'ICE' .AND. LSEDIC .AND. LRED .AND. LSEDIM_AFTER)) &
-       IPROACTV(NBUDGET_RC, IPROC) = NSEDIRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'DEPO_'
-    IF (((HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO').AND. LDEPOC) .OR.   &
-       (HCLOUD(1:3) == 'ICE' .AND. LDEPOSC)) IPROACTV(NBUDGET_RC, IPROC) = NDEPORC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'CDEPI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) )) &
-            IPROACTV(NBUDGET_RC, IPROC) = NCDEPIRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'COND_'
-    IF (HCLOUD == 'C2R2'.OR. HCLOUD == 'KHKO' .OR. &
-        HCLOUD(1:3) == 'KES'.OR. HCLOUD == 'REVE') IPROACTV(NBUDGET_RC, IPROC) = NCONDRC
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RC, IPROC) = 'NECON_'
-    IF ( (HCLOUD == 'KHKO' )  .OR.  (HCLOUD == 'C2R2')) &
-       IPROACTV(NBUDGET_RC, IPROC) = NNECONRC
-  END IF
+  tzsource%cunits   = 's-1'
 
-  YEND_COMMENT(NBUDGET_RC) = 'BU_RRC'
-  NBUPROCNBR(NBUDGET_RC) = 3
-!
-  CBUACTION(NBUDGET_RC, 1) = 'IG'
-  CBUACTION(NBUDGET_RC, 2) = 'CC'
-  CBUACTION(NBUDGET_RC, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_RC, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_RC, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_RC) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RRR
-IF (LBU_RRR) THEN
-  YWORK2(NBUDGET_RR, 1) = 'INIF_'
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nasserv )
 
-  YWORK2(NBUDGET_RR, 2) = 'ENDF_'
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nnestrv )
 
-  YWORK2(NBUDGET_RR, 3) = 'AVEF_'
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nfrcrv )
 
-  IPROC=4
-  YWORK2(NBUDGET_RR, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_RR, IPROC) = NASSERR
+  gcond = l2d_adv_frc
+  tzsource%cmnhname  = '2DADV'
+  tzsource%clongname = 'advective forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, n2dadvrv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RR, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_RR, IPROC) = NNESTRR
+  gcond = l2d_rel_frc
+  tzsource%cmnhname  = '2DREL'
+  tzsource%clongname = 'relaxation forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, n2drelrv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RR, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_RR, IPROC)  = NFRCRR
+  gcond = onudging
+  tzsource%cmnhname  = 'NUD'
+  tzsource%clongname = 'nudging'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nnudrv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RR, IPROC) = 'DIF_'
-  IF ( ONUMDIFTH ) IPROACTV(NBUDGET_RR, IPROC) = NDIFRR
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ndifrv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RR, IPROC) = 'REL_'
-  IF ( OHORELAX_RR ) THEN
-    IPROACTV(NBUDGET_RR, IPROC) = NRELRR
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_RR, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RR, IPROC) = 3
-    END IF
-  END IF
+  gcond = ohorelax_rv
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nrelrv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RR, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_RR, IPROC) = NADVRR
+  gcond = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+  tzsource%cmnhname  = 'DCONV'
+  tzsource%clongname = 'KAFR convection'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ndconvrv )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RR, IPROC) = 'NEGA_'
-  IF ( HCLOUD /= 'NONE' ) IPROACTV(NBUDGET_RR, IPROC) = NNEGARR
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'VTURB'
+  tzsource%clongname = 'vertical turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nvturbrv )
 
-  IF (HCLOUD == 'LIMA') THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'CORR_'
-    IF (OPTSPLIT .AND. OWARM .AND. ORAIN)              IPROACTV(NBUDGET_RR, IPROC) = NCORRRR
+  gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  tzsource%cmnhname  = 'HTURB'
+  tzsource%clongname = 'horizontal turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nhturbrv )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'SEDI_'
-    IF (OWARM .AND. ORAIN)                             IPROACTV(NBUDGET_RR, IPROC) = NSEDIRR
+  gcond = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or.  hcloud == 'C2R2' )
+  tzsource%cmnhname  = 'NETUR'
+  tzsource%clongname = 'negative correction induced by turbulence'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nneturrv )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'R2C1_'
-    IF (OPTSPLIT .AND. OWARM .AND. ORAIN)              IPROACTV(NBUDGET_RR, IPROC) = NR2C1RR
+  gcond = hsconv == 'EDKF'
+  tzsource%cmnhname  = 'MAFL'
+  tzsource%clongname = 'mass flux'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nmaflrv )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'AUTO_'
-    IF (OPTSPLIT .OR. (OWARM .AND. ORAIN))             IPROACTV(NBUDGET_RR, IPROC) = NAUTORR
+  gcond = lvisc .and. lvisc_r
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nviscrv )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'ACCR_'
-    IF (OPTSPLIT .OR. (OWARM .AND. ORAIN))             IPROACTV(NBUDGET_RR, IPROC) = NACCRRR
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nadvrv )
+
+  gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2'
+  tzsource%cmnhname  = 'NEADV'
+  tzsource%clongname = 'negative correction induced by advection'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nneadvrv )
+
+  gcond = hcloud /= 'NONE' .and. hcloud /= 'KHKO' .and. hcloud /= 'C2R2'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nnegarv )
+
+  gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+  gcond =      ( hcloud      == 'LIMA' .and. lwarm_lima .and. lacti_lima .and. nmod_ccn >= 1 )     &
+          .or.   hcloud(1:3) == 'ICE'                                                              &
+          .or. ( hcloud      == 'C2R2' .and. ( gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) ) ) &
+          .or. ( hcloud      == 'KHKO' .and. ( gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) ) )
+  tzsource%cmnhname  = 'HENU'
+  tzsource%clongname = 'heterogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nhenurv )
+
+  gcond =      ( hcloud      == 'LIMA' .and. ( ( .not. lptsplit .and. lwarm_lima .and. lrain_lima ) .or. lptsplit ) ) &
+          .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                                              &
+          .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                                             &
+          .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )                                                             &
+          .or.   hcloud      == 'KESS'
+  tzsource%cmnhname  = 'REVA'
+  tzsource%clongname = 'rain evaporation'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nrevarv )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima
+  tzsource%cmnhname  = 'HIND'
+  tzsource%clongname = 'heterogeneous nucleation by deposition'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nhindrv )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+  tzsource%cmnhname  = 'HONH'
+  tzsource%clongname = 'haze homogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nhonhrv )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DEPS'
+  tzsource%clongname = 'deposition on snow'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ndepsrv )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DEPG'
+  tzsource%clongname = 'deposition on graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ndepgrv )
+
+  gcond = hcloud == 'LIMA'
+  tzsource%cmnhname  = 'CEDS'
+  tzsource%clongname = 'adjustment to saturation'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ncedsrv )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before
+  tzsource%cmnhname  = 'ADJU'
+  tzsource%clongname = 'adjustment before'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nadjurv )
+
+  gcond = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE'
+  tzsource%cmnhname  = 'COND'
+  tzsource%clongname = 'vapor condensation or cloud water evaporation'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ncondrv )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ncorrrv )
+
+  gcond = hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE' )
+  tzsource%cmnhname  = 'CDEPI'
+  tzsource%clongname = 'deposition on ice'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, ncdepirv )
+
+  gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2'
+  tzsource%cmnhname  = 'NECON'
+  tzsource%clongname = 'negative correction induced by condensation'
+  call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nneconrv )
+end if
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'REVA_'
-    IF (OPTSPLIT .OR. (OWARM .AND. ORAIN))             IPROACTV(NBUDGET_RR, IPROC) = NREVARR
+! Budget of RRC
+tbudgets(NBUDGET_RC)%cname    = "BU_RRC"
+tbudgets(NBUDGET_RC)%ccomment = "Budget for cloud water mixing ratio"
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'HONR_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ONUCL .AND. ORAIN)) IPROACTV(NBUDGET_RR, IPROC) = NHONRRR
+tbudgets(NBUDGET_RC)%lenabled = lbu_rrc .and. krr >= 2
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'ACC_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW .AND. ORAIN)) IPROACTV(NBUDGET_RR, IPROC) = NACCRR
+if ( tbudgets(NBUDGET_RC)%lenabled ) then
+  if ( hcloud(1:3) == 'ICE' .and. lred .and. lsedic_ice .and. ldeposc_ice ) &
+    call Print_msg( NVERB_WARNING, 'BUD', 'Ini_budget', 'lred=T + lsedic=T + ldeposc=T:'// &
+                                                        'DEPO and SEDI source terms are mixed and stored in SEDI' )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'CFRZ_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RR, IPROC) = NCFRZRR
+  tbudgets(NBUDGET_RC)%trhodj => tburhodj
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'WETG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RR, IPROC) = NWETGRR
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 42
+  tbudgets(NBUDGET_RC)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_RC)%tsources(isourcesmax) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'DRYG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RR, IPROC) = NDRYGRR
+  allocate( tbudgets(NBUDGET_RC)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'GMLT_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RR, IPROC) = NGMLTRR
+  tbudgets(NBUDGET_RC)%tsources(:)%ngroup = 0
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'CVRC_'
-    IF (OPTSPLIT)                                      IPROACTV(NBUDGET_RR, IPROC) = NCVRCRR
+  tzsource%ccomment = 'Budget of cloud water mixing ratio'
+  tzsource%ngrid    = 1
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'WETH_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                     IPROACTV(NBUDGET_RR, IPROC) = NWETHRR
+  tzsource%cunits   = 'kg kg-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'HMLT_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                     IPROACTV(NBUDGET_RR, IPROC) = NHMLTRR
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'SEDI_'
-    IF (HCLOUD(1:3) == 'KES' )   IPROACTV(NBUDGET_RR, IPROC) = NSEDIRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'ACCR_'
-    IF (HCLOUD(1:3) == 'KES' )   IPROACTV(NBUDGET_RR, IPROC) = NACCRRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'AUTO_'
-    IF (HCLOUD(1:3) == 'KES' )   IPROACTV(NBUDGET_RR, IPROC) = NAUTORR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'REVA_'
-    IF (HCLOUD(1:3) == 'KES' )   IPROACTV(NBUDGET_RR, IPROC) = NREVARR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'SEDI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. (.NOT. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RR, IPROC) = NSEDIRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'SFR_'
-    IF (HCLOUD(1:3) == 'ICE' ) IPROACTV(NBUDGET_RR, IPROC) = NSFRRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'AUTO_'
-    IF ((HCLOUD(1:3) == 'ICE' ) .AND. LWARM) &
-         IPROACTV(NBUDGET_RR, IPROC) = NAUTORR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'ACCR_'
-    IF ((HCLOUD(1:3) == 'ICE' ) .AND. LWARM) &
-         IPROACTV(NBUDGET_RR, IPROC) = NACCRRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'REVA_'
-    IF ((HCLOUD(1:3) == 'ICE' ) .AND. LWARM) &
-         IPROACTV(NBUDGET_RR, IPROC) = NREVARR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'ACC_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RR, IPROC) = NACCRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'CMEL_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(NBUDGET_RR, IPROC) = NCMELRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'CFRZ_'
-    IF (HCLOUD(1:3) == 'ICE' ) IPROACTV(NBUDGET_RR, IPROC) = NCFRZRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'WETG_'
-    IF (HCLOUD(1:3) == 'ICE' ) IPROACTV(NBUDGET_RR, IPROC) = NWETGRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'DRYG_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RR, IPROC) = NDRYGRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'GMLT_'
-    IF (HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RR, IPROC) = NGMLTRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'WETH_'
-    IF (HCLOUD == 'ICE4') IPROACTV(NBUDGET_RR, IPROC) = NWETHRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'DRYH_'
-    IF (HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RR, IPROC) = NDRYHRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'HMLT_'
-    IF (HCLOUD == 'ICE4') IPROACTV(NBUDGET_RR, IPROC) = NHMLTRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'CORR_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(NBUDGET_RR, IPROC) = NCORRRR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'AUTO_'
-    IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') .AND. LRAIN)  IPROACTV(NBUDGET_RR, IPROC) = NAUTORR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'ACCR_'
-    IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') .AND. LRAIN)  IPROACTV(NBUDGET_RR, IPROC) = NACCRRR
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'REVA_'
-    IF ((HCLOUD == 'C2R2'.OR. HCLOUD == 'KHKO') .AND. LRAIN)   IPROACTV(NBUDGET_RR, IPROC) = NREVARR
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RR, IPROC) = 'SEDI_'
-    IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO' .OR. &
-    (HCLOUD(1:3) == 'ICE' .AND. .NOT. (LRED)) .OR. &
-    (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) &
-      IPROACTV(NBUDGET_RR, IPROC) = NSEDIRR
-  END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  YEND_COMMENT(NBUDGET_RR) = 'BU_RRR'
-  NBUPROCNBR(NBUDGET_RR) = 3
-!
-  CBUACTION(NBUDGET_RR, 1) = 'IG'
-  CBUACTION(NBUDGET_RR, 2) = 'CC'
-  CBUACTION(NBUDGET_RR, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_RR, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_RR, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_RR) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RRI
-IF (LBU_RRI) THEN
-  YWORK2(NBUDGET_RI, 1) = 'INIF_'
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  YWORK2(NBUDGET_RI, 2) = 'ENDF_'
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-  YWORK2(NBUDGET_RI, 3) = 'AVEF_'
+  tzsource%cunits   = 's-1'
 
-  IPROC=4
-  YWORK2(NBUDGET_RI, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_RI, IPROC) = NASSERI
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nasserc )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_RI, IPROC) = NNESTRI
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nnestrc )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_RI, IPROC)  = NFRCRI
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nfrcrc )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'DIF_'
-  IF( ONUMDIFTH ) IPROACTV(NBUDGET_RI, IPROC) = NDIFRI
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ndifrc )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'REL_'
-  IF ( OHORELAX_RI ) THEN
-    IPROACTV(NBUDGET_RI, IPROC) = NRELRI
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_RI, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RI, IPROC) = 3
-    END IF
-  END IF
+  gcond = ohorelax_rc
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nrelrc )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'DCONV_'
-  IF( HDCONV /= 'NONE' .OR. HSCONV == 'KAFR') IPROACTV(NBUDGET_RI, IPROC) = NDCONVRI
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'VTURB_'
-  IF ( HTURB /=  'NONE' ) IPROACTV(NBUDGET_RI, IPROC) = NVTURBRI
-
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'HTURB_'
-  IF ( HTURB /= 'NONE' .AND. HTURBDIM == '3DIM' ) THEN
-    IPROACTV(NBUDGET_RI, IPROC) = NHTURBRI
-  ELSE 
-    IF ( HTURB /= 'NONE' ) THEN
-      IPROACTV(NBUDGET_RI, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RI, IPROC) = 3
-    END IF
-  END IF 
+  gcond = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+  tzsource%cmnhname  = 'DCONV'
+  tzsource%clongname = 'KAFR convection'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ndconvrc )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_RI, IPROC) = NADVRI
+  gcond = odragtree .and. odepotree
+  tzsource%cmnhname  = 'DEPOTR'
+  tzsource%clongname = 'tree droplet deposition'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ndepotrrc )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RI, IPROC) = 'NEGA_'
-  IF( HCLOUD /= 'NONE' ) IPROACTV(NBUDGET_RI, IPROC) = NNEGARI
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'VTURB'
+  tzsource%clongname = 'vertical turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nvturbrc )
 
-  IF (HCLOUD=='LIMA') THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CORR_'
-    IF (OPTSPLIT .AND. OCOLD .AND. OSNOW)                   IPROACTV(NBUDGET_RI, IPROC) = NCORRRI
+  gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  tzsource%cmnhname  = 'HTURB'
+  tzsource%clongname = 'horizontal turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nhturbrc )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'SEDI_'
-    IF (OCOLD .AND. OSEDI)                                  IPROACTV(NBUDGET_RI, IPROC) = NSEDIRI
+  gcond = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or.  hcloud == 'C2R2' )
+  tzsource%cmnhname  = 'NETUR'
+  tzsource%clongname = 'negative correction induced by turbulence'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nneturrc )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HIND_'
-    IF (OCOLD .AND. ONUCL)                                  IPROACTV(NBUDGET_RI, IPROC) = NHINDRI
+  gcond = lvisc .and. lvisc_r
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nviscrc )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HINC_'
-    IF (OCOLD .AND. ONUCL)                                  IPROACTV(NBUDGET_RI, IPROC) = NHINCRI
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nadvrc )
+
+  gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2'
+  tzsource%cmnhname  = 'NEADV'
+  tzsource%clongname = 'negative correction induced by advection'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nneadvrc )
+
+  gcond = hcloud /= 'NONE' .and. hcloud /= 'KHKO' .and. hcloud /= 'C2R2'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nnegarc )
+
+  gcond =       ( hcloud      == 'LIMA' .and. lptsplit .and. lwarm_lima .and. lrain_lima ) &
+           .or. ( hcloud(1:3) == 'ICE' .and. lred )
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ncorrrc )
+
+  gcond =    ( hcloud      == 'LIMA' .and. lwarm_lima .and. lsedc_lima ) &
+        .or. ( hcloud(1:3) == 'ICE'  .and. lsedic_ice )                  &
+        .or. ( hcloud      == 'C2R2' .and. lsedc_c2r2 )                  &
+        .or. ( hcloud      == 'KHKO' .and. lsedc_c2r2 )
+  tzsource%cmnhname  = 'SEDI'
+  tzsource%clongname = 'sedimentation of cloud'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nsedirc )
+
+  gcond =      ( hcloud == 'LIMA' .and. lwarm_lima .and. ldepoc_lima ) &
+          .or. ( hcloud      == 'C2R2' .and. ldepoc_c2r2 )             &
+          .or. ( hcloud      == 'KHKO' .and. ldepoc_c2r2 )             &
+          .or. ( hcloud(1:3) == 'ICE'  .and. ldeposc_ice .and. celec == 'NONE' )
+  tzsource%cmnhname  = 'DEPO'
+  tzsource%clongname = 'surface droplet deposition'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ndeporc )
+
+  gcond = hcloud == 'LIMA' .and. lptsplit .and. lwarm_lima .and. lrain_lima
+  tzsource%cmnhname  = 'R2C1'
+  tzsource%clongname = 'rain to cloud change after sedimentation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nr2c1rc )
+
+  gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+  gcond =      ( hcloud      == 'LIMA' .and. lwarm_lima .and. lacti_lima .and. nmod_ccn >= 1 )     &
+          .or. ( hcloud      == 'C2R2' .and. ( gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) ) ) &
+          .or. ( hcloud      == 'KHKO' .and. ( gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 ) ) )
+  tzsource%cmnhname  = 'HENU'
+  tzsource%clongname = 'CCN activation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nhenurc )
+
+  gcond = hcloud == 'LIMA' .and. ( ( lptsplit .and. lcold_lima .and. lnucl_lima ) .or. .not.lptsplit )
+  tzsource%cmnhname  = 'HINC'
+  tzsource%clongname = 'heterogeneous nucleation by contact'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nhincrc )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before
+  tzsource%cmnhname  = 'ADJU'
+  tzsource%clongname = 'adjustment to saturation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nadjurc )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'HON'
+  tzsource%clongname = 'homogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nhonrc )
+
+  gcond =       ( hcloud      == 'LIMA' .and. ( lptsplit .or. ( lwarm_lima .and. lrain_lima ) ) ) &
+           .or.   hcloud      == 'KESS'                                                           &
+           .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                         &
+           .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                        &
+           .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  tzsource%cmnhname  = 'AUTO'
+  tzsource%clongname = 'autoconversion into rain'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nautorc )
+
+  gcond =       ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lwarm_lima .and. lrain_lima ) ) ) &
+           .or.   hcloud      == 'KESS'                                                      &
+           .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                    &
+           .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                   &
+           .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  tzsource%cmnhname  = 'ACCR'
+  tzsource%clongname = 'accretion'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, naccrrc )
+
+  gcond =  hcloud == 'LIMA' .and. ( lptsplit .or. ( lwarm_lima .and. lrain_lima ) )
+  tzsource%cmnhname  = 'REVA'
+  tzsource%clongname = 'rain evaporation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nrevarc )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lnucl_lima ) )
+  tzsource%cmnhname  = 'HONC'
+  tzsource%clongname = 'droplet homogeneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nhoncrc )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'IMLT'
+  tzsource%clongname = 'ice melting'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nimltrc )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'BERFI'
+  tzsource%clongname = 'Bergeron-Findeisen'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nberfirc )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'RIM'
+  tzsource%clongname = 'riming of cloud water'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nrimrc )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred
+  tzsource%cmnhname  = 'CMEL'
+  tzsource%clongname = 'collection by snow and conversion into rain with T>XTT on ice'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ncmelrc )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'WETG'
+  tzsource%clongname = 'wet growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nwetgrc )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DRYG'
+  tzsource%clongname = 'dry growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ndrygrc )
+
+  gcond = hcloud == 'LIMA' .and. lptsplit
+  tzsource%cmnhname  = 'CVRC'
+  tzsource%clongname = 'rain to cloud change after other microphysical processes'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ncvrcrc )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'WETH'
+  tzsource%clongname = 'wet growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nwethrc )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'DRYH'
+  tzsource%clongname = 'dry growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ndryhrc )
+
+  gcond = hcloud == 'LIMA'
+  tzsource%cmnhname  = 'CEDS'
+  tzsource%clongname = 'adjustment to saturation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ncedsrc )
+
+  gcond = hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE' )
+  tzsource%cmnhname  = 'CDEPI'
+  tzsource%clongname = 'condensation/deposition on ice'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ncdepirc )
+
+  gcond = hcloud == 'C2R2' .or. hcloud == 'KHKO' .or. hcloud == 'KESS' .or. hcloud == 'REVE'
+  tzsource%cmnhname  = 'COND'
+  tzsource%clongname = 'vapor condensation or cloud water evaporation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, ncondrc )
+
+  gcond = hcloud == 'KHKO' .or. hcloud == 'C2R2'
+  tzsource%cmnhname  = 'NECON'
+  tzsource%clongname = 'negative correction induced by condensation'
+  call Budget_source_add( tbudgets(NBUDGET_RC), tzsource, gcond, nneconrc )
+end if
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HONH_'
-    IF (OCOLD .AND. ONUCL .AND. OHHONI .AND. NMOD_CCN.GE.1) IPROACTV(NBUDGET_RI, IPROC) = NHONHRI
+! Budget of RRR
+tbudgets(NBUDGET_RR)%cname    = "BU_RRR"
+tbudgets(NBUDGET_RR)%ccomment = "Budget for rain water mixing ratio"
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HONC_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ONUCL))      IPROACTV(NBUDGET_RI, IPROC) = NHONCRI
+tbudgets(NBUDGET_RR)%lenabled = lbu_rrr .and. krr >= 3
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CNVI_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))                  IPROACTV(NBUDGET_RI, IPROC) = NCNVIRI
+if ( tbudgets(NBUDGET_RR)%lenabled ) then
+  tbudgets(NBUDGET_RR)%trhodj => tburhodj
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CNVS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))                  IPROACTV(NBUDGET_RI, IPROC) = NCNVSRI
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 29
+  tbudgets(NBUDGET_RR)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_RR)%tsources(isourcesmax) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'AGGS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))                  IPROACTV(NBUDGET_RI, IPROC) = NAGGSRI
+  allocate( tbudgets(NBUDGET_RR)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'IMLT_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM))                  IPROACTV(NBUDGET_RI, IPROC) = NIMLTRI
+  tbudgets(NBUDGET_RR)%tsources(:)%ngroup = 0
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'BERFI_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM))                  IPROACTV(NBUDGET_RI, IPROC) = NBERFIRI
+  tzsource%ccomment = 'Budget of rain water mixing ratio'
+  tzsource%ngrid    = 1
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HMS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_RI, IPROC) = NHMSRI
+  tzsource%cunits   = 'kg kg-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CFRZ_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_RI, IPROC) = NCFRZRI
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'WETG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_RI, IPROC) = NWETGRI
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'DRYG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_RI, IPROC) = NDRYGRI
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HMG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))      IPROACTV(NBUDGET_RI, IPROC) = NHMGRI
+  tzsource%cunits   = 's-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'WETH_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL) IPROACTV(NBUDGET_RI, IPROC) = NWETHRI
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nasserr )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CEDS_'
-                                      IPROACTV(NBUDGET_RI, IPROC) = NCEDSRI
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'ADJU_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LADJ_BEFORE) IPROACTV(NBUDGET_RI, IPROC) = NADJURI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'SEDI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. (.NOT. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RI, IPROC) = NSEDIRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HENU_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NHENURI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'HON_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NHONRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'AGGS_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NAGGSRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'AUTS_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NAUTSRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CFRZ_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NCFRZRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'WETG_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NWETGRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'DRYG_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NDRYGRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'WETH_'
-    IF( HCLOUD == 'ICE4' ) IPROACTV(NBUDGET_RI, IPROC) = NWETHRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'DRYH_'
-    IF( HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RI, IPROC) = NDRYHRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'IMLT_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NIMLTRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'BERFI_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RI, IPROC) = NBERFIRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CORR_'
-    IF( HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(NBUDGET_RI, IPROC) = NCORRRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'SEDI_'
-    IF ((HCLOUD(1:3) == 'ICE' .AND. .NOT. LRED).OR. &
-    (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RI, IPROC) = NSEDIRI
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RI, IPROC) = 'CDEPI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) )) &
-            IPROACTV(NBUDGET_RI, IPROC) = NCDEPIRI
-  END IF
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nnestrr )
 
-  YEND_COMMENT(NBUDGET_RI) = 'BU_RRI'
-  NBUPROCNBR(NBUDGET_RI) = 3
-!
-  CBUACTION(NBUDGET_RI, 1) = 'IG'
-  CBUACTION(NBUDGET_RI, 2) = 'CC'
-  CBUACTION(NBUDGET_RI, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_RI, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_RI, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_RI) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RRS
-IF (LBU_RRS) THEN
-  YWORK2(NBUDGET_RS, 1) = 'INIF_'
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nfrcrr )
 
-  YWORK2(NBUDGET_RS, 2) = 'ENDF_'
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ndifrr )
 
-  YWORK2(NBUDGET_RS, 3) = 'AVEF_'
+  gcond = ohorelax_rr
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nrelrr )
 
-  IPROC=4
-  YWORK2(NBUDGET_RS, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_RS, IPROC) = NASSERS
+  gcond = lvisc .and. lvisc_r
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nviscrr )
 
-  IPROC=  IPROC+1
-  YWORK2(NBUDGET_RS, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_RS, IPROC) = NNESTRS
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nadvrr )
+
+  gcond = hcloud /= 'NONE'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nnegarr )
+
+  gcond =       ( hcloud      == 'LIMA' .and. lptsplit .and. lwarm_lima .and. lrain_lima ) &
+           .or. ( hcloud(1:3) == 'ICE' .and. lred )
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ncorrrr )
+
+  gcond =      ( hcloud      == 'LIMA' .and. lwarm_lima .and. lrain_lima ) &
+          .or.   hcloud      == 'KESS'                                     &
+          .or.   hcloud(1:3) == 'ICE'                                      &
+          .or.   hcloud      == 'C2R2'                                     &
+          .or.   hcloud      == 'KHKO'
+  tzsource%cmnhname  = 'SEDI'
+  tzsource%clongname = 'sedimentation of rain drops'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nsedirr )
+
+  gcond = hcloud == 'LIMA' .and. lptsplit .and. lwarm_lima .and. lrain_lima
+  tzsource%cmnhname  = 'R2C1'
+  tzsource%clongname = 'rain to cloud after sedimentation'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nr2c1rr )
+
+  gcond =       ( hcloud      == 'LIMA' .and. ( lptsplit .or. ( lwarm_lima .and. lrain_lima ) ) ) &
+           .or.   hcloud      == 'KESS'                                                           &
+           .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                         &
+           .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                        &
+           .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  tzsource%cmnhname  = 'AUTO'
+  tzsource%clongname = 'autoconversion into rain drops'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nautorr )
+
+  gcond =       ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lwarm_lima .and. lrain_lima ) ) ) &
+           .or.   hcloud      == 'KESS'                                                      &
+           .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                    &
+           .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                   &
+           .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  tzsource%cmnhname  = 'ACCR'
+  tzsource%clongname = 'accretion of cloud droplets'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, naccrrr )
+
+  gcond =      ( hcloud      == 'LIMA' .and. ( lptsplit .or. ( lwarm_lima .and. lrain_lima ) ) ) &
+          .or.   hcloud      == 'KESS'                                                           &
+          .or. ( hcloud(1:3) == 'ICE'  .and. lwarm_ice )                                         &
+          .or. ( hcloud      == 'C2R2' .and. lrain_c2r2 )                                        &
+          .or. ( hcloud      == 'KHKO' .and. lrain_c2r2 )
+  tzsource%cmnhname  = 'REVA'
+  tzsource%clongname = 'rain evaporation'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nrevarr )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lnucl_lima .and. lrain_lima ) )
+  tzsource%cmnhname  = 'HONR'
+  tzsource%clongname = 'rain homogeneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nhonrrr )
+
+
+  gcond =      ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima .and. lrain_lima) ) ) &
+          .or.   hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'ACC'
+  tzsource%clongname = 'accretion of rain water on aggregates'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, naccrr )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred
+  tzsource%cmnhname  = 'CMEL'
+  tzsource%clongname = 'collection of droplets by snow and conversion into rain'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ncmelrr )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'CFRZ'
+  tzsource%clongname = 'conversion freezing of rain drops'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ncfrzrr )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'WETG'
+  tzsource%clongname = 'wet growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nwetgrr )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DRYG'
+  tzsource%clongname = 'dry growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ndrygrr )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'GMLT'
+  tzsource%clongname = 'graupel melting'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ngmltrr )
+
+  gcond = hcloud == 'LIMA' .and. lptsplit
+  tzsource%cmnhname  = 'CVRC'
+  tzsource%clongname = 'rain to cloud change after other microphysical processes'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ncvrcrr )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'WETH'
+  tzsource%clongname = 'wet growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nwethrr )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'DRYH'
+  tzsource%clongname = 'dry growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, ndryhrr )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'HMLT'
+  tzsource%clongname = 'melting of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nhmltrr )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'SFR'
+  tzsource%clongname = 'spontaneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource, gcond, nsfrrr )
+end if
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RS, IPROC) = 'FRC_'
-  IF( LFORCING )  IPROACTV(NBUDGET_RS, IPROC)  = NFRCRS
+! Budget of RRI
+tbudgets(NBUDGET_RI)%cname    = "BU_RRI"
+tbudgets(NBUDGET_RI)%ccomment = "Budget for cloud ice mixing ratio"
 
-  IPROC=  IPROC+1
-  YWORK2(NBUDGET_RS, IPROC) = 'DIF_'
-  IF( ONUMDIFTH ) IPROACTV(NBUDGET_RS, IPROC) = NDIFRS
+tbudgets(NBUDGET_RI)%lenabled = lbu_rri .and. krr >= 4
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RS, IPROC) = 'REL_'
-  IF ( OHORELAX_RS ) THEN
-    IPROACTV(NBUDGET_RS, IPROC) = NRELRS
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_RS, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RS, IPROC) = 3
-    END IF
-  END IF
+if ( tbudgets(NBUDGET_RI)%lenabled ) then
+  tbudgets(NBUDGET_RI)%trhodj => tburhodj
 
-  IPROC=  IPROC+1
-  YWORK2(NBUDGET_RS, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_RS, IPROC) = NADVRS
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 38
+  tbudgets(NBUDGET_RI)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_RI)%tsources(isourcesmax) )
 
-  IPROC=  IPROC+1
-  YWORK2(NBUDGET_RS, IPROC) = 'NEGA_'
-  IF( HCLOUD /= 'NONE' ) IPROACTV(NBUDGET_RS, IPROC) = NNEGARS
+  allocate( tbudgets(NBUDGET_RI)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-  IF (HCLOUD=='LIMA') THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'CORR_'
-    IF (OPTSPLIT .AND. OCOLD .AND. OSNOW)              IPROACTV(NBUDGET_RS, IPROC) = NCORRRS
+  tbudgets(NBUDGET_RI)%tsources(:)%ngroup = 0
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'SEDI_'
-    IF (OCOLD .AND. OSNOW)                             IPROACTV(NBUDGET_RS, IPROC) = NSEDIRS
+  tzsource%ccomment = 'Budget of cloud ice mixing ratio'
+  tzsource%ngrid    = 1
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'CNVI_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))             IPROACTV(NBUDGET_RS, IPROC) = NCNVIRS
+  tzsource%cunits   = 'kg kg-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'DEPS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))             IPROACTV(NBUDGET_RS, IPROC) = NDEPSRS
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'CNVS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))             IPROACTV(NBUDGET_RS, IPROC) = NCNVSRS
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'AGGS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW))             IPROACTV(NBUDGET_RS, IPROC) = NAGGSRS
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'RIM_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RS, IPROC) = NRIMRS
+  tzsource%cunits   = 's-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'HMS_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RS, IPROC) = NHMSRS
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nasseri )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'ACC_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW .AND. ORAIN)) IPROACTV(NBUDGET_RS, IPROC) = NACCRS
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nnestri )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'CMEL_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RS, IPROC) = NCMELRS
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nfrcri )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'WETG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RS, IPROC) = NWETGRS
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ndifri )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'DRYG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) IPROACTV(NBUDGET_RS, IPROC) = NDRYGRS
+  gcond = ohorelax_ri
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nrelri )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'WETH_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                     IPROACTV(NBUDGET_RS, IPROC) = NWETHRS
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'SEDI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. (.NOT. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RS, IPROC) = NSEDIRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'DEPS_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NDEPSRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'AGGS_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NAGGSRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'AUTS_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NAUTSRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'RIM_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NRIMRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'ACC_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NACCRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'CMEL_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NCMELRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'WETG_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NWETGRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'DRYG_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RS, IPROC) = NDRYGRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'WETH_'
-    IF( HCLOUD == 'ICE4') IPROACTV(NBUDGET_RS, IPROC) = NWETHRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'DRYH_'
-    IF( HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RS, IPROC) = NDRYHRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'CORR_'
-    IF( HCLOUD(1:3) == 'ICE' .AND. LRED) IPROACTV(NBUDGET_RS, IPROC) = NCORRRS
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RS, IPROC) = 'SEDI_'
-    IF ((HCLOUD(1:3) == 'ICE' .AND. .NOT. LRED).OR. &
-       (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RS, IPROC) = NSEDIRS
-  END IF
+  gcond = hdconv == 'KAFR' .OR. hsconv == 'KAFR'
+  tzsource%cmnhname  = 'DCONV'
+  tzsource%clongname = 'KAFR convection'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ndconvri )
 
-  YEND_COMMENT(NBUDGET_RS) = 'BU_RRS'
-  NBUPROCNBR(NBUDGET_RS) = 3
-!
-  CBUACTION(NBUDGET_RS, 1) = 'IG'
-  CBUACTION(NBUDGET_RS, 2) = 'CC'
-  CBUACTION(NBUDGET_RS, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_RS, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_RS, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_RS) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RRG
-IF (LBU_RRG) THEN
-  YWORK2(NBUDGET_RG, 1) = 'INIF_'
+  gcond = hturb == 'TKEL'
+  tzsource%cmnhname  = 'VTURB'
+  tzsource%clongname = 'vertical turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nvturbri )
 
-  YWORK2(NBUDGET_RG, 2) = 'ENDF_'
+  gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  tzsource%cmnhname  = 'HTURB'
+  tzsource%clongname = 'horizontal turbulent diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhturbri )
 
-  YWORK2(NBUDGET_RG, 3) = 'AVEF_'
+  gcond = lvisc .and. lvisc_r
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nviscri )
 
-  IPROC=4
-  YWORK2(NBUDGET_RG, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_RG, IPROC) = NASSERG
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nadvri )
+
+  gcond = hcloud /= 'NONE'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nnegari )
+
+  gcond =       ( hcloud      == 'LIMA' .and. lptsplit .and. lcold_lima .and. lsnow_lima ) &
+           .or. ( hcloud(1:3) == 'ICE' .and. lred )
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ncorrri )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred .and. ladj_before
+  tzsource%cmnhname  = 'ADJU'
+  tzsource%clongname = 'adjustment before on ice'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nadjuri )
+
+  gcond =      ( hcloud      == 'LIMA' .and. lcold_lima .and. lsedi_lima ) &
+          .or.   hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'SEDI'
+  tzsource%clongname = 'sedimentation of rain drops'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nsediri )
+
+  gcond =  hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'HENU'
+  tzsource%clongname = 'heterogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhenuri )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima
+  tzsource%cmnhname  = 'HIND'
+  tzsource%clongname = 'heterogeneous nucleation by deposition'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhindri )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima
+  tzsource%cmnhname  = 'HINC'
+  tzsource%clongname = 'heterogeneous nucleation by contact'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhincri )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'HON'
+  tzsource%clongname = 'homogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhonri )
+
+  gcond = hcloud == 'LIMA' .and. lcold_lima .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+  tzsource%cmnhname  = 'HONH'
+  tzsource%clongname = 'haze homogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhonhri )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lnucl_lima ) )
+  tzsource%cmnhname  = 'HONC'
+  tzsource%clongname = 'droplet homogeneous nucleation'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhoncri )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'CNVI'
+  tzsource%clongname = 'conversion of snow to cloud ice'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ncnviri )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'CNVS'
+  tzsource%clongname = 'conversion of pristine ice to snow'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ncnvsri )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'AGGS'
+  tzsource%clongname = 'aggregation of snow'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, naggsri )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'AUTS'
+  tzsource%clongname = 'autoconversion of ice'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nautsri )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'IMLT'
+  tzsource%clongname = 'ice melting'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nimltri )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'BERFI'
+  tzsource%clongname = 'Bergeron-Findeisen'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nberfiri )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'HMS'
+  tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhmsri )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'CFRZ'
+  tzsource%clongname = 'conversion freezing of rain drops'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ncfrzri )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'WETG'
+  tzsource%clongname = 'wet growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nwetgri )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DRYG'
+  tzsource%clongname = 'dry growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ndrygri )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'HMG'
+  tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nhmgri )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'WETH'
+  tzsource%clongname = 'wet growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, nwethri )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'DRYH'
+  tzsource%clongname = 'dry growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ndryhri )
+
+  gcond = hcloud == 'LIMA'
+  tzsource%cmnhname  = 'CEDS'
+  tzsource%clongname = 'adjustment to saturation'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ncedsri )
+
+  gcond = hcloud(1:3) == 'ICE' .and. ( .not. lred .or. ( lred .and. ladj_after ) .or. celec /= 'NONE' )
+  tzsource%cmnhname  = 'CDEPI'
+  tzsource%clongname = 'condensation/deposition on ice'
+  call Budget_source_add( tbudgets(NBUDGET_RI), tzsource, gcond, ncdepiri )
+end if
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RG, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) IPROACTV(NBUDGET_RG, IPROC) = NNESTRG
+! Budget of RRS
+tbudgets(NBUDGET_RS)%cname    = "BU_RRS"
+tbudgets(NBUDGET_RS)%ccomment = "Budget for snow/aggregate mixing ratio"
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RG, IPROC) = 'FRC_'
-  IF( LFORCING ) IPROACTV(NBUDGET_RG, IPROC)  = NFRCRG
+tbudgets(NBUDGET_RS)%lenabled = lbu_rrs .and. krr >= 5
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RG, IPROC) = 'DIF_'
-  IF( ONUMDIFTH ) IPROACTV(NBUDGET_RG, IPROC) = NDIFRG
+if ( tbudgets(NBUDGET_RS)%lenabled ) then
+  tbudgets(NBUDGET_RS)%trhodj => tburhodj
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RG, IPROC) = 'REL_'
-  IF ( OHORELAX_RG ) THEN
-    IPROACTV(NBUDGET_RG, IPROC) = NRELRG
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_RG, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RG, IPROC) = 3
-    END IF
-  END IF
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 26
+  tbudgets(NBUDGET_RS)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_RS)%tsources(isourcesmax) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RG, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_RG, IPROC) = NADVRG
+  allocate( tbudgets(NBUDGET_RS)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RG, IPROC) = 'NEGA_'
-  IF( HCLOUD /= 'NONE'  ) IPROACTV(NBUDGET_RG, IPROC) = NNEGARG
+  tbudgets(NBUDGET_RS)%tsources(:)%ngroup = 0
 
-  IF (HCLOUD=='LIMA') THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'SEDI_'
-    IF (OCOLD .AND. OSNOW)                                         IPROACTV(NBUDGET_RG, IPROC) = NSEDIRG
+  tzsource%ccomment = 'Budget of snow/aggregate mixing ratio'
+  tzsource%ngrid    = 1
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'HONR_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ONUCL .AND. ORAIN)) IPROACTV(NBUDGET_RG, IPROC) = NHONRRG
+  tzsource%cunits   = 'kg kg-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'DEPG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NDEPGRG
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'RIM_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NRIMRG
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'ACC_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ORAIN .AND. OSNOW)) IPROACTV(NBUDGET_RG, IPROC) = NACCRG
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'CMEL_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NCMELRG
+  tzsource%cunits   = 's-1'
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'CFRZ_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NCFRZRG
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nassers )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'WETG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NWETGRG
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nnestrs )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'DRYG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NDRYGRG
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nfrcrs )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'HMG_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NHMGRG
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ndifrs )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'GMLT_'
-    IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW))             IPROACTV(NBUDGET_RG, IPROC) = NGMLTRG
+  gcond = ohorelax_rs
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nrelrs )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'WETH_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                                 IPROACTV(NBUDGET_RG, IPROC) = NWETHRG
+  gcond = lvisc .and. lvisc_r
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nviscrs )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'COHG_'
-    IF (.NOT.OPTSPLIT .AND. OHAIL)                                 IPROACTV(NBUDGET_RG, IPROC) = NCOHGRG
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'SEDI_'
-    IF (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. (.NOT. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RG, IPROC) = NSEDIRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC)= 'SFR_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NSFRRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'DEPG_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NDEPGRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'RIM_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NRIMRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'ACC_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NACCRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'CMEL_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NCMELRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'CFRZ_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NCFRZRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'WETG_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NWETGRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'GHCV_'
-    IF( HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RG, IPROC) = NGHCVRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'DRYG_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NDRYGRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'GMLT_'
-    IF( HCLOUD(1:3) == 'ICE') IPROACTV(NBUDGET_RG, IPROC) = NGMLTRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'WETH_'
-    IF( HCLOUD == 'ICE4' .AND. .NOT. LRED ) IPROACTV(NBUDGET_RG, IPROC) = NWETHRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'HGCV_'
-    IF( HCLOUD == 'ICE4' .AND. LRED ) IPROACTV(NBUDGET_RG, IPROC) = NHGCVRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'DRYH_'
-    IF( HCLOUD == 'ICE4'  .AND. LRED) IPROACTV(NBUDGET_RG, IPROC) = NDRYHRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'CORR_'
-    IF( HCLOUD(1:3) == 'ICE'  .AND. LRED) IPROACTV(NBUDGET_RG, IPROC) = NCORRRG
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RG, IPROC) = 'SEDI_'
-    IF ((HCLOUD(1:3) == 'ICE' .AND. .NOT. LRED).OR. &
-       (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RG, IPROC) = NSEDIRG
-  END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nadvrs )
+
+  gcond = hcloud /= 'NONE'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nnegars )
+
+  gcond =       ( hcloud      == 'LIMA' .and. lptsplit .and. lcold_lima .and. lsnow_lima ) &
+           .or. ( hcloud(1:3) == 'ICE' .and. lred )
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ncorrrs )
+
+  gcond =      ( hcloud      == 'LIMA' .and. lcold_lima .and. lsnow_lima ) &
+          .or.   hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'SEDI'
+  tzsource%clongname = 'sedimentation'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nsedirs )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'CNVI'
+  tzsource%clongname = 'conversion of snow to cloud ice'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ncnvirs )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DEPS'
+  tzsource%clongname = 'deposition on snow'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ndepsrs )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'CNVS'
+  tzsource%clongname = 'conversion of pristine ice to snow'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ncnvsrs )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'AGGS'
+  tzsource%clongname = 'aggregation of snow'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, naggsrs )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'AUTS'
+  tzsource%clongname = 'autoconversion of ice'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nautsrs )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'RIM'
+  tzsource%clongname = 'riming of cloud water'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nrimrs )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'HMS'
+  tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nhmsrs )
+
+  gcond =       ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima .and. lrain_lima) ) ) &
+           .or.   hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'ACC'
+  tzsource%clongname = 'accretion of rain water'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, naccrs )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'CMEL'
+  tzsource%clongname = 'conversion melting'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ncmelrs )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'WETG'
+  tzsource%clongname = 'wet growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nwetgrs )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DRYG'
+  tzsource%clongname = 'dry growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ndrygrs )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'WETH'
+  tzsource%clongname = 'wet growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, nwethrs )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'DRYH'
+  tzsource%clongname = 'dry growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource, gcond, ndryhrs )
+end if
 
-  YEND_COMMENT(NBUDGET_RG) = 'BU_RRG'
-  NBUPROCNBR(NBUDGET_RG) = 3
-!
-  CBUACTION(NBUDGET_RG, 1) = 'IG'
-  CBUACTION(NBUDGET_RG, 2) = 'CC'
-  CBUACTION(NBUDGET_RG, 3) = 'ES'
-!
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_RG, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_RG, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_RG) ) )
-  END DO
-!
-END IF
-!
-!                        Budget of RRH
-IF (LBU_RRH) THEN
-  YWORK2(NBUDGET_RH, 1) = 'INIF_'
+! Budget of RRG
+tbudgets(NBUDGET_RG)%cname    = "BU_RRG"
+tbudgets(NBUDGET_RG)%ccomment = "Budget for graupel mixing ratio"
 
-  YWORK2(NBUDGET_RH, 2) = 'ENDF_'
+tbudgets(NBUDGET_RG)%lenabled = lbu_rrg .and. krr >= 6
 
-  YWORK2(NBUDGET_RH, 3) = 'AVEF_'
+if ( tbudgets(NBUDGET_RG)%lenabled ) then
+  tbudgets(NBUDGET_RG)%trhodj => tburhodj
 
-  IPROC=4
-  YWORK2(NBUDGET_RH, IPROC) = 'ASSE_'
-  IPROACTV(NBUDGET_RH, IPROC) = NASSERH
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 29
+  tbudgets(NBUDGET_RG)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_RG)%tsources(isourcesmax) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RH, IPROC) = 'NEST_'
-  IF( NMODEL>1 ) THEN
-    IPROACTV(NBUDGET_RH, IPROC) = NNESTRH
-  ELSE
-    IPROACTV(NBUDGET_RH, IPROC) = 3
-  END IF
+  allocate( tbudgets(NBUDGET_RG)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RH, IPROC) = 'FRC_'
-   IF( LFORCING ) THEN
-    IPROACTV(NBUDGET_RH, IPROC)  = NFRCRH
-  ELSE
-    IPROACTV(NBUDGET_RH, IPROC)  = 3
-  END IF
+  tbudgets(NBUDGET_RG)%tsources(:)%ngroup = 0
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RH, IPROC) = 'DIF_'
-  IF( ONUMDIFTH ) THEN
-    IPROACTV(NBUDGET_RH, IPROC) = NDIFRH
-  ELSE
-    IPROACTV(NBUDGET_RH, IPROC) = 3
-  END IF
+  tzsource%ccomment = 'Budget of graupel mixing ratio'
+  tzsource%ngrid    = 1
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RH, IPROC) = 'REL_'
-  IF ( OHORELAX_RH ) THEN
-    IPROACTV(NBUDGET_RH, IPROC) = NRELRH
-  ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-      IPROACTV(NBUDGET_RH, IPROC) = 4
-    ELSE
-      IPROACTV(NBUDGET_RH, IPROC) = 3
-    END IF
-  END IF
+  tzsource%cunits   = 'kg kg-1'
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RH, IPROC) = 'ADV_'
-  IPROACTV(NBUDGET_RH, IPROC) = NADVRH
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  IPROC=IPROC+1
-  YWORK2(NBUDGET_RH, IPROC) = 'NEGA_'
-  IF( HCLOUD /= 'NONE' ) THEN
-    IPROACTV(NBUDGET_RH, IPROC) = NNEGARH
-  ELSE
-    IPROACTV(NBUDGET_RH, IPROC) = 3
-  END IF
-!
-  IF (HCLOUD=='LIMA' .AND. OHAIL) THEN
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'SEDI_'
-    IPROACTV(NBUDGET_RH, IPROC) = NSEDIRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'WETG_'
-    IPROACTV(NBUDGET_RH, IPROC) = NWETGRH
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'WETH_'
-    IF (.NOT.OPTSPLIT) IPROACTV(NBUDGET_RH, IPROC) = NWETHRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'COHG_'
-    IF (.NOT.OPTSPLIT) IPROACTV(NBUDGET_RH, IPROC) = NCOHGRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'HMLT_'
-    IF (.NOT.OPTSPLIT) IPROACTV(NBUDGET_RH, IPROC) = NHMLTRH
-  ELSE
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'SEDI_'
-    IF( HCLOUD == 'ICE4' .AND. LRED .AND. .NOT. LSEDIM_AFTER) &
-            IPROACTV(NBUDGET_RH, IPROC) = NSEDIRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'GHCV_'
-    IF( HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RH, IPROC) = NGHCVRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'WETG_'
-    IF( HCLOUD == 'ICE4' .AND. .NOT. LRED) IPROACTV(NBUDGET_RH, IPROC) = NWETGRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'WETH_'
-    IF( HCLOUD == 'ICE4') IPROACTV(NBUDGET_RH, IPROC) = NWETHRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'HGCV_'
-    IF( HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RH, IPROC) = NHGCVRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'DRYH_'
-    IF( HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RH, IPROC) = NDRYHRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'HMLT_'
-    IF( HCLOUD == 'ICE4' ) IPROACTV(NBUDGET_RH, IPROC) = NHMLTRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'CORR_'
-    IF( HCLOUD == 'ICE4' .AND. LRED) IPROACTV(NBUDGET_RH, IPROC) = NCORRRH
-
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_RH, IPROC) = 'SEDI_'
-    IF ((HCLOUD(1:3) == 'ICE' .AND. .NOT. LRED).OR. &
-       (HCLOUD(1:3) == 'ICE' .AND. LRED .AND. LSEDIM_AFTER)) &
-            IPROACTV(NBUDGET_RH, IPROC) = NSEDIRH
-  END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
 
-  YEND_COMMENT(NBUDGET_RH) = 'BU_RRH'
-  NBUPROCNBR(NBUDGET_RH) = 3
-!
-  CBUACTION(NBUDGET_RH, 1) = 'IG'
-  CBUACTION(NBUDGET_RH, 2) = 'CC'
-  CBUACTION(NBUDGET_RH, 3) = 'ES'
-!  
-  DO JJ=1,3
-    CBUCOMMENT(NBUDGET_RH, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_RH, JJ) ) // &
-                                 ADJUSTL( YEND_COMMENT(NBUDGET_RH) ) )
-  END DO
-!
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
 
-END IF
-!
-!                        Budget of RSV
-IF (LBU_RSV) THEN
-  IBUPROCNBR_SV_MAX = 0 ! initialize the Max nunmber of processes for the SVs
-  DO JSV = 1,KSV
-    YWORK2(NBUDGET_SV1 - 1 + JSV, 1) = 'INIF_'
+  tzsource%cunits   = 's-1'
 
-    YWORK2(NBUDGET_SV1 - 1 + JSV, 2) = 'ENDF_'
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nasserg )
 
-    YWORK2(NBUDGET_SV1 - 1 + JSV, 3) = 'AVEF_'
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nnestrg )
 
-    IPROC=4
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'ASSE_'
-    IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NASSESV
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nfrcrg )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'NEST_'
-    IF( NMODEL>1 ) IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NNESTSV
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ndifrg )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'FRC_'
-    IF( LFORCING ) IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC)  = NFRCSV
+  gcond = ohorelax_rg
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nrelrg )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'DIF_'
-    IF ( ONUMDIFSV ) IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NDIFSV
+  gcond = lvisc .and. lvisc_r
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nviscrg )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'REL_'
-    IF ( OHORELAX_SV(JSV) ) THEN
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NRELSV
-    ELSE
-    IF(OVE_RELAX .OR. OHORELAX_UVWTH .OR. OHORELAX_RV .OR.                 &
-     OHORELAX_RC .OR. OHORELAX_RR .OR. OHORELAX_RI .OR. OHORELAX_RS .OR.   &
-     OHORELAX_RG .OR. OHORELAX_RH .OR. OHORELAX_TKE .OR. ANY(OHORELAX_SV)) THEN
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = 4
-      ELSE
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = 3
-      END IF
-    END IF
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nadvrg )
+
+  gcond = hcloud /= 'NONE'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nnegarg )
+
+  gcond = hcloud(1:3) == 'ICE' .and. lred
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ncorrrg )
+
+  gcond =      ( hcloud      == 'LIMA' .and. lcold_lima .and. lsnow_lima ) &
+          .or.   hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'SEDI'
+  tzsource%clongname = 'sedimentation'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nsedirg )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lnucl_lima .and. lrain_lima ) )
+  tzsource%cmnhname  = 'HONR'
+  tzsource%clongname = 'rain homogeneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nhonrrg )
+
+  gcond = hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'SFR'
+  tzsource%clongname = 'spontaneous freezing'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nsfrrg )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DEPG'
+  tzsource%clongname = 'deposition on graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ndepgrg )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. ( lcold_lima .and. lwarm_lima .and. lsnow_lima ) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'RIM'
+  tzsource%clongname = 'riming of cloud water'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nrimrg )
+
+  gcond =      ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima .and. lrain_lima) ) ) &
+          .or.   hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'ACC'
+  tzsource%clongname = 'rain accretion on graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, naccrg )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'CMEL'
+  tzsource%clongname = 'conversion melting of snow'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ncmelrg )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'CFRZ'
+  tzsource%clongname = 'conversion freezing of rain'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ncfrzrg )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'WETG'
+  tzsource%clongname = 'wet growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nwetgrg )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'GHCV'
+  tzsource%clongname = 'graupel to hail conversion'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nghcvrg )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'DRYG'
+  tzsource%clongname = 'dry growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ndrygrg )
+
+  gcond = hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima ) )
+  tzsource%cmnhname  = 'HMG'
+  tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nhmgrg )
+
+  gcond = ( hcloud == 'LIMA' .and. ( lptsplit .or. (lcold_lima .and. lwarm_lima .and. lsnow_lima) ) ) .or. hcloud(1:3) == 'ICE'
+  tzsource%cmnhname  = 'GMLT'
+  tzsource%clongname = 'graupel melting'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ngmltrg )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima ) &
+          .or. ( hcloud == 'ICE4' .and. ( .not. lred .or. celec /= 'NONE' ) )
+  tzsource%cmnhname  = 'WETH'
+  tzsource%clongname = 'wet growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nwethrg )
+
+  gcond = hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima .and. lsnow_lima
+  tzsource%cmnhname  = 'COHG'
+  tzsource%clongname = 'conversion of hail to graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ncohgrg )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'HGCV'
+  tzsource%clongname = 'hail to graupel conversion'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, nghcvrg )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'DRYH'
+  tzsource%clongname = 'dry growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource, gcond, ndryhrg )
+end if
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'DCONV_'
-    IF ( (HDCONV /= 'NONE' .OR. HSCONV == 'KAFR') .AND. OCHTRANS ) &
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NDCONVSV
+! Budget of RRH
+tbudgets(NBUDGET_RH)%cname    = "BU_RRH"
+tbudgets(NBUDGET_RH)%ccomment = "Budget for hail mixing ratio"
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'DEPOTR'
-    IF ( ODRAGTREE .AND. ODEPOTREE  ) &
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NDEPOTRSV
+tbudgets(NBUDGET_RH)%lenabled = lbu_rrh .and. krr >= 7
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'VTURB_'
-    IF ( HTURB /= 'NONE' ) IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NVTURBSV
+if ( tbudgets(NBUDGET_RH)%lenabled ) then
+  tbudgets(NBUDGET_RH)%trhodj => tburhodj
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'HTURB_'
-    IF ( HTURB /= 'NONE' .AND. HTURBDIM == '3DIM' ) THEN
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = NHTURBSV
-    ELSE
-      IF ( HTURB /= 'NONE' ) THEN
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = 4
-      ELSE
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC) = 3
-      END IF
-    END IF
+  !Allocate all basic source terms (used or not)
+  !The size should be large enough (bigger than necessary is OK)
+  isourcesmax = 20
+  tbudgets(NBUDGET_RH)%nsourcesmax = isourcesmax
+  allocate( tbudgets(NBUDGET_RH)%tsources(isourcesmax) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'MAFL_'
-    IF ( HSCONV == 'EDKF' ) IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC)= NMAFLSV
+  allocate( tbudgets(NBUDGET_RH)%xtmpstore(ibudim1, ibudim2, ibudim3) )
 
-    IPROC=IPROC+1
-    YWORK2(NBUDGET_SV1 - 1 + JSV, IPROC) = 'ADV_'
-    IPROACTV(NBUDGET_SV1 - 1 + JSV, IPROC)= NADVSV
-!
-!
-! complete with the budget of other processes
-!
-    IPROC=IPROC+1
-    ILAST_PROC_NBR = IPROC
-    CALL BUDGET_OTHERPROC_SV
-!
-    YEND_COMMENT(NBUDGET_SV1 - 1 + JSV) = 'BU_RSV'
-    IBUPROCNBR_SV_MAX   = MAX( IBUPROCNBR_SV_MAX, ILAST_PROC_NBR )
-    NBUPROCNBR(NBUDGET_SV1 - 1 + JSV) = 3
-!
-    CBUACTION(NBUDGET_SV1 - 1 + JSV, 1) = 'IG'
-    CBUACTION(NBUDGET_SV1 - 1 + JSV, 2) = 'CC'
-    CBUACTION(NBUDGET_SV1 - 1 + JSV, 3) = 'ES'
-!
-    DO JJ=1,3
-      CBUCOMMENT(NBUDGET_SV1 - 1 + JSV, JJ) = ADJUSTL( ADJUSTR( YWORK2(NBUDGET_SV1 - 1 + JSV, JJ) ) // &
-                                              ADJUSTL( YEND_COMMENT(NBUDGET_SV1 - 1 + JSV) ) )
-    END DO
-  END DO
-!
-END IF
+  tbudgets(NBUDGET_RH)%tsources(:)%ngroup = 0
+
+  tzsource%ccomment = 'Budget of graupel mixing ratio'
+  tzsource%ngrid    = 1
+
+  tzsource%cunits   = 'kg kg-1'
+
+  gcond = .true.
+  tzsource%cmnhname  = 'INIF'
+  tzsource%clongname = 'initial state'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
+
+  gcond = .true.
+  tzsource%cmnhname  = 'ENDF'
+  tzsource%clongname = 'final state'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
+
+  gcond = .true.
+  tzsource%cmnhname  = 'AVEF'
+  tzsource%clongname = 'averaged state'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
+
+  tzsource%cunits   = 's-1'
+
+  gcond = .true.
+  tzsource%cmnhname  = 'ASSE'
+  tzsource%clongname = 'time filter (Asselin)'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nasserh )
+
+  gcond = nmodel > 1
+  tzsource%cmnhname  = 'NEST'
+  tzsource%clongname = 'nesting'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nnestrh )
+
+  gcond = lforcing
+  tzsource%cmnhname  = 'FRC'
+  tzsource%clongname = 'forcing'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nfrcrh )
+
+  gcond = onumdifth
+  tzsource%cmnhname  = 'DIF'
+  tzsource%clongname = 'numerical diffusion'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, ndifrh )
+
+  gcond = ohorelax_rh
+  tzsource%cmnhname  = 'REL'
+  tzsource%clongname = 'relaxation'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nrelrh )
+
+  gcond = lvisc .and. lvisc_r
+  tzsource%cmnhname  = 'VISC'
+  tzsource%clongname = 'viscosity'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nviscrh )
+
+  gcond = .true.
+  tzsource%cmnhname  = 'ADV'
+  tzsource%clongname = 'total advection'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nadvrh )
+
+  gcond = hcloud /= 'NONE'
+  tzsource%cmnhname  = 'NEGA'
+  tzsource%clongname = 'negative correction'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nnegarh )
+
+  gcond =      ( hcloud == 'LIMA' .and. lcold_lima .and. lhail_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'SEDI'
+  tzsource%clongname = 'sedimentation'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nsedirh )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'GHCV'
+  tzsource%clongname = 'graupel to hail conversion'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nghcvrh )
+
+  gcond =      ( hcloud == 'LIMA' .and. ( ( lptsplit .and. lhail_lima )                                                  &
+                                          .or. ( .not.lptsplit .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima ) ) ) &
+          .or. ( hcloud == 'ICE4' .and. ( .not. lred .or. celec /= 'NONE' ) )
+  tzsource%cmnhname  = 'WETG'
+  tzsource%clongname = 'wet growth of graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nwetgrh )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'WETH'
+  tzsource%clongname = 'wet growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nwethrh )
+
+  gcond = hcloud == 'LIMA' .and. .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima
+  tzsource%cmnhname  = 'COHG'
+  tzsource%clongname = 'conversion from hail to graupel'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, ncohgrh )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'HGCV'
+  tzsource%clongname = 'hail to graupel conversion'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nghcvrh )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'DRYH'
+  tzsource%clongname = 'dry growth of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, ndryhrh )
+
+  gcond =      ( hcloud == 'LIMA' .and. .not. lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima ) &
+          .or.   hcloud == 'ICE4'
+  tzsource%cmnhname  = 'HMLT'
+  tzsource%clongname = 'melting of hail'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, nhmltrh )
+
+  gcond = hcloud == 'ICE4' .and. lred
+  tzsource%cmnhname  = 'CORR'
+  tzsource%clongname = 'correction'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource, gcond, ncorrrh )
+end if
+
+! Budgets of RSV (scalar variables)
+
+if ( ksv > 999 ) call Print_msg( NVERB_FATAL, 'BUD', 'Ini_budget', 'number of scalar variables > 999' )
+
+SV_BUDGETS: do jsv = 1, ksv
+  ibudget = NBUDGET_SV1 - 1 + jsv
+  write ( ybudgetnum, '( i3.3 )' ) jsv
+  tbudgets(ibudget)%cname    = 'BU_RSV_' // ybudgetnum
+  tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // ybudgetnum
+
+  tbudgets(ibudget)%lenabled = lbu_rsv
+
+  if ( lbu_rsv ) then
+    tbudgets(ibudget)%trhodj => tburhodj
+
+    !Allocate all basic source terms (used or not)
+    !The size should be large enough (bigger than necessary is OK)
+    isourcesmax = 34
+    tbudgets(ibudget)%nsourcesmax = isourcesmax
+    allocate( tbudgets(ibudget)%tsources(isourcesmax) )
+
+    allocate( tbudgets(ibudget)%xtmpstore(ibudim1, ibudim2, ibudim3) )
+
+    tbudgets(ibudget)%tsources(:)%ngroup = 0
+
+    tzsource%ccomment = 'Budget of scalar variable ' // ybudgetnum
+    tzsource%ngrid    = 1
+
+    tzsource%cunits   = '1'
+
+    gcond = .true.
+    tzsource%cmnhname  = 'INIF'
+    tzsource%clongname = 'initial state'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
+
+    gcond = .true.
+    tzsource%cmnhname  = 'ENDF'
+    tzsource%clongname = 'final state'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .true. )
+
+    gcond = .true.
+    tzsource%cmnhname  = 'AVEF'
+    tzsource%clongname = 'averaged state'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, 1, odonotinit = .true., ooverwrite = .false. )
+
+    tzsource%cunits   = 's-1'
+
+    gcond = .true.
+    tzsource%cmnhname  = 'ASSE'
+    tzsource%clongname = 'time filter (Asselin)'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nassesv )
+
+    gcond = nmodel > 1
+    tzsource%cmnhname  = 'NEST'
+    tzsource%clongname = 'nesting'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nnestsv )
+
+    gcond = lforcing
+    tzsource%cmnhname  = 'FRC'
+    tzsource%clongname = 'forcing'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nfrcsv )
+
+    gcond = onumdifsv
+    tzsource%cmnhname  = 'DIF'
+    tzsource%clongname = 'numerical diffusion'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndifsv )
+
+    gcond = ohorelax_sv( jsv ) .or. ( celec /= 'none' .and. lrelax2fw_ion .and. (jsv == nsv_elecbeg .or. jsv == nsv_elecend ) )
+    tzsource%cmnhname  = 'REL'
+    tzsource%clongname = 'relaxation'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nrelsv )
+
+    gcond = ( hdconv == 'KAFR' .or. hsconv == 'KAFR' ) .and. ochtrans
+    tzsource%cmnhname  = 'DCONV'
+    tzsource%clongname = 'KAFR convection'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndconvsv )
+
+    gcond = odragtree .and. odepotree .and. ( hcloud=='C2R2' .or. hcloud=='KHKO' .or. hcloud=='LIMA' )
+    tzsource%cmnhname  = 'DEPOTR'
+    tzsource%clongname = 'tree droplet deposition'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndepotrsv )
+
+    gcond = hturb == 'TKEL'
+    tzsource%cmnhname  = 'VTURB'
+    tzsource%clongname = 'vertical turbulent diffusion'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nvturbsv )
+
+    gcond = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+    tzsource%cmnhname  = 'HTURB'
+    tzsource%clongname = 'horizontal turbulent diffusion'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nhturbsv )
+
+    gcond = hsconv == 'EDKF'
+    tzsource%cmnhname  = 'MAFL'
+    tzsource%clongname = 'mass flux'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nmaflsv )
+
+    gcond = lvisc .and. lvisc_sv
+    tzsource%cmnhname  = 'VISC'
+    tzsource%clongname = 'viscosity'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nviscsv )
+
+    gcond = .true.
+    tzsource%cmnhname  = 'ADV'
+    tzsource%clongname = 'total advection'
+    call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nadvsv )
+
+    ! Add specific source terms to different scalar variables
+    igroup = 1
+    SV_VAR: if ( jsv <= nsv_user ) then
+      ! nsv_user case
+      ! Nothing to do
+
+    else if ( jsv >= nsv_c2r2beg .and. jsv <= nsv_c2r2end ) then SV_VAR
+      ! C2R2 or KHKO Case
+      SV_C2R2: select case( jsv - nsv_c2r2beg + 1 )
+        case ( 1 ) SV_C2R2
+          ! Concentration of activated nuclei
+          gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+          gcond =  gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 )
+          tzsource%cmnhname  = 'HENU'
+          tzsource%clongname = 'CCN activation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CEVA'
+          tzsource%clongname = 'evaporation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        case ( 2 ) SV_C2R2
+          ! Concentration of cloud droplets
+          gtmp = cactccn == 'ABRK' .and. (lorilam .or. ldust .or. lsalt )
+          gcond =  gtmp .or. ( .not.gtmp .and. .not.lsupsat_c2r2 )
+          tzsource%cmnhname  = 'HENU'
+          tzsource%clongname = 'CCN activation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = lrain_c2r2
+          tzsource%cmnhname  = 'SELF'
+          tzsource%clongname = 'self-collection of cloud droplets'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = lrain_c2r2
+          tzsource%cmnhname  = 'ACCR'
+          tzsource%clongname = 'accretion'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = lsedc_c2r2
+          tzsource%cmnhname  = 'SEDI'
+          tzsource%clongname = 'sedimentation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = ldepoc_c2r2
+          tzsource%cmnhname  = 'DEPO'
+          tzsource%clongname = 'surface droplet deposition'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CEVA'
+          tzsource%clongname = 'evaporation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        case ( 3 ) SV_C2R2
+          ! Concentration of raindrops
+          gcond = lrain_c2r2
+          tzsource%cmnhname  = 'AUTO'
+          tzsource%clongname = 'autoconversion into rain'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = hcloud /= 'KHKO'
+          tzsource%cmnhname  = 'SCBU'
+          tzsource%clongname = 'self collection - coalescence/break-up'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = lrain_c2r2
+          tzsource%cmnhname  = 'REVA'
+          tzsource%clongname = 'rain evaporation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = lrain_c2r2
+          tzsource%cmnhname  = 'BRKU'
+          tzsource%clongname = 'spontaneous break-up'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'SEDI'
+          tzsource%clongname = 'sedimentation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        case ( 4 ) SV_C2R2
+          ! Supersaturation
+          ! Nothing to do
+      end select SV_C2R2
+
+
+    else if ( jsv >= nsv_lima_beg .and. jsv <= nsv_lima_end ) then SV_VAR
+      ! LIMA case
+      SV_LIMA: if ( jsv == nsv_lima_nc ) then
+        ! Cloud droplets concentration
+        gcond = .true.
+        tzsource%cmnhname  = 'NEGA'
+        tzsource%clongname = 'negative correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .and. lwarm_lima  .and. lrain_lima
+        tzsource%cmnhname  = 'CORR'
+        tzsource%clongname = 'correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lwarm_lima  .and. lsedc_lima
+        tzsource%cmnhname  = 'SEDI'
+        tzsource%clongname = 'sedimentation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lwarm_lima  .and. ldepoc_lima
+        tzsource%cmnhname  = 'DEPO'
+        tzsource%clongname = 'surface droplet deposition'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .and. lwarm_lima  .and. lrain_lima
+        tzsource%cmnhname  = 'R2C1'
+        tzsource%clongname = 'rain to cloud change after sedimentation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lwarm_lima  .and. lacti_lima .and. nmod_ccn >= 1
+        tzsource%cmnhname  = 'HENU'
+        tzsource%clongname = 'CCN activation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lcold_lima .and. lnucl_lima
+        tzsource%cmnhname  = 'HINC'
+        tzsource%clongname = 'heterogeneous nucleation by contact'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lwarm_lima  .and. lrain_lima
+        tzsource%cmnhname  = 'SELF'
+        tzsource%clongname = 'self-collection of cloud droplets'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lwarm_lima  .and. lrain_lima )
+        tzsource%cmnhname  = 'AUTO'
+        tzsource%clongname = 'autoconversion into rain'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lwarm_lima  .and. lrain_lima )
+        tzsource%cmnhname  = 'ACCR'
+        tzsource%clongname = 'accretion'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lwarm_lima  .and. lrain_lima )
+        tzsource%cmnhname  = 'REVA'
+        tzsource%clongname = 'rain evaporation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lnucl_lima )
+        tzsource%cmnhname  = 'HONC'
+        tzsource%clongname = 'droplet homogeneous nucleation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  )
+        tzsource%cmnhname  = 'IMLT'
+        tzsource%clongname = 'ice melting'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'RIM'
+        tzsource%clongname = 'riming of cloud water'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'WETG'
+        tzsource%clongname = 'wet growth of graupel'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'DRYG'
+        tzsource%clongname = 'dry growth of graupel'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit
+        tzsource%cmnhname  = 'CVRC'
+        tzsource%clongname = 'rain to cloud change after other microphysical processes'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima
+        tzsource%cmnhname  = 'WETH'
+        tzsource%clongname = 'wet growth of hail'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = .true.
+        tzsource%cmnhname  = 'CEDS'
+        tzsource%clongname = 'adjustment to saturation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+
+      else if ( jsv == nsv_lima_nr ) then SV_LIMA
+        ! Rain drops concentration
+        gcond = .true.
+        tzsource%cmnhname  = 'NEGA'
+        tzsource%clongname = 'negative correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .and. lwarm_lima  .and. lrain_lima
+        tzsource%cmnhname  = 'CORR'
+        tzsource%clongname = 'correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lwarm_lima  .and. lrain_lima
+        tzsource%cmnhname  = 'SEDI'
+        tzsource%clongname = 'sedimentation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .and. lwarm_lima  .and. lrain_lima
+        tzsource%cmnhname  = 'R2C1'
+        tzsource%clongname = 'rain to cloud change after sedimentation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. (lwarm_lima  .and. lrain_lima)
+        tzsource%cmnhname  = 'AUTO'
+        tzsource%clongname = 'autoconversion into rain'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. (lwarm_lima  .and. lrain_lima)
+        tzsource%cmnhname  = 'SCBU'
+        tzsource%clongname = 'self collection - coalescence/break-up'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. (lwarm_lima  .and. lrain_lima)
+        tzsource%cmnhname  = 'REVA'
+        tzsource%clongname = 'rain evaporation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. (lwarm_lima  .and. lrain_lima)
+        tzsource%cmnhname  = 'BRKU'
+        tzsource%clongname = 'spontaneous break-up'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lrain_lima .and. lnucl_lima )
+        tzsource%cmnhname  = 'HONR'
+        tzsource%clongname = 'rain homogeneous freezing'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima .and. lrain_lima )
+        tzsource%cmnhname  = 'ACC'
+        tzsource%clongname = 'accretion of rain water'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'CFRZ'
+        tzsource%clongname = 'conversion freezing of rain'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'WETG'
+        tzsource%clongname = 'wet growth of graupel'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'DRYG'
+        tzsource%clongname = 'dry growth of graupel'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'GMLT'
+        tzsource%clongname = 'graupel melting'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit
+        tzsource%cmnhname  = 'CVRC'
+        tzsource%clongname = 'rain to cloud change after other microphysical processes'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima
+        tzsource%cmnhname  = 'WETH'
+        tzsource%clongname = 'wet growth of hail'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima
+        tzsource%cmnhname  = 'HMLT'
+        tzsource%clongname = 'hail melting'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+
+      else if ( jsv >= nsv_lima_ccn_free .and. jsv <= nsv_lima_ccn_free + nmod_ccn - 1 ) then SV_LIMA
+        ! Free CCN concentration
+        gcond = .true.
+        tzsource%cmnhname  = 'NEGA'
+        tzsource%clongname = 'negative correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lwarm_lima  .and. lacti_lima .and. nmod_ccn >= 1
+        tzsource%cmnhname  = 'HENU'
+        tzsource%clongname = 'CCN activation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lcold_lima .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+        tzsource%cmnhname  = 'HONH'
+        tzsource%clongname = 'haze homogeneous nucleation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lwarm_lima
+        tzsource%cmnhname  = 'CEDS'
+        tzsource%clongname = 'adjustment to saturation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lscav_lima
+        tzsource%cmnhname  = 'SCAV'
+        tzsource%clongname = 'scavenging'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+
+      else if ( jsv >= nsv_lima_ccn_acti .and. jsv <= nsv_lima_ccn_acti + nmod_ccn - 1 ) then SV_LIMA
+        ! Activated CCN concentration
+        ! Nothing to do
+
+      else if ( jsv == nsv_lima_scavmass ) then SV_LIMA
+        ! Scavenged mass variable
+        ! Nothing to do
+
+      else if ( jsv == nsv_lima_ni ) then SV_LIMA
+        ! Pristine ice crystals concentration
+        gcond = .true.
+        tzsource%cmnhname  = 'NEGA'
+        tzsource%clongname = 'negative correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .and. lcold_lima .and. lsnow_lima
+        tzsource%cmnhname  = 'CORR'
+        tzsource%clongname = 'correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .and. lcold_lima .and. lsedi_lima
+        tzsource%cmnhname  = 'SEDI'
+        tzsource%clongname = 'sedimentation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lcold_lima .and. lnucl_lima .and. &
+                ( (      lptsplit .and. ( ( .not.lmeyers_lima .and. nmod_ifn > 0 ) .or. lmeyers_lima ) ) .or. &
+                  ( .not.lptsplit ) )
+        tzsource%cmnhname  = 'HIND'
+        tzsource%clongname = 'heterogeneous nucleation by deposition'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lcold_lima .and. lnucl_lima .and. &
+                ( (      lptsplit .and. ( ( .not.lmeyers_lima .and. nmod_ifn > 0 ) .or. lmeyers_lima ) ) .or. &
+                  ( .not.lptsplit ) )
+        tzsource%cmnhname  = 'HINC'
+        tzsource%clongname = 'heterogeneous nucleation by contact'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lcold_lima .and. lnucl_lima .and. lhhoni_lima .and. nmod_ccn >= 1
+        tzsource%cmnhname  = 'HONH'
+        tzsource%clongname = 'haze homogeneous nucleation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lnucl_lima )
+        tzsource%cmnhname  = 'HONC'
+        tzsource%clongname = 'droplet homogeneous nucleation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lsnow_lima )
+        tzsource%cmnhname  = 'CNVI'
+        tzsource%clongname = 'conversion of snow to cloud ice'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lsnow_lima )
+        tzsource%cmnhname  = 'CNVS'
+        tzsource%clongname = 'conversion of pristine ice to snow'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lsnow_lima )
+        tzsource%cmnhname  = 'AGGS'
+        tzsource%clongname = 'aggregation of snow'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  )
+        tzsource%cmnhname  = 'IMLT'
+        tzsource%clongname = 'ice melting'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'HMS'
+        tzsource%clongname = 'Hallett-Mossop ice multiplication process due to snow riming'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'CFRZ'
+        tzsource%clongname = 'conversion freezing of rain'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'WETG'
+        tzsource%clongname = 'wet growth of graupel'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'DRYG'
+        tzsource%clongname = 'dry growth of graupel'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lptsplit .or. ( lcold_lima .and. lwarm_lima  .and. lsnow_lima )
+        tzsource%cmnhname  = 'HMG'
+        tzsource%clongname = 'Hallett-Mossop ice multiplication process due to graupel riming'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = .not.lptsplit .and. lhail_lima .and. lcold_lima .and. lwarm_lima  .and. lsnow_lima
+        tzsource%cmnhname  = 'WETH'
+        tzsource%clongname = 'wet growth of hail'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = .true.
+        tzsource%cmnhname  = 'CEDS'
+        tzsource%clongname = 'adjustment to saturation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+
+      else if ( jsv >= nsv_lima_ifn_free .and. jsv <= nsv_lima_ifn_free + nmod_ifn - 1 ) then SV_LIMA
+        ! Free IFN concentration
+        gcond = .true.
+        tzsource%cmnhname  = 'NEGA'
+        tzsource%clongname = 'negative correction'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+!Rq: if NMOD_IFN=0=> budget=0
+        gcond = ( .not.lptsplit .and. lcold_lima .and. lnucl_lima .and. .not. lmeyers_lima ) .or.              &
+                (      lptsplit .and. lcold_lima .and. lnucl_lima .and. .not. lmeyers_lima .and. nmod_ifn >= 1 )
+        tzsource%cmnhname  = 'HIND'
+        tzsource%clongname = 'heterogeneous nucleation by deposition'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lcold_lima
+        tzsource%cmnhname  = 'CEDS'
+        tzsource%clongname = 'adjustment to saturation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+        gcond = lscav_lima
+        tzsource%cmnhname  = 'SCAV'
+        tzsource%clongname = 'scavenging'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+
+      else if ( jsv >= nsv_lima_ifn_nucl .and. jsv <= nsv_lima_ifn_nucl + nmod_ifn - 1 ) then SV_LIMA
+        ! Nucleated IFN concentration
+        ! Nothing to do
+
+
+      else if ( jsv >= nsv_lima_imm_nucl .and. jsv <= nsv_lima_imm_nucl + nmod_imm - 1 ) then SV_LIMA
+        ! Nucleated IMM concentration
+        ! Nothing to do
+
+
+      else if ( jsv == nsv_lima_hom_haze ) then SV_LIMA
+        ! Homogeneous freezing of CCN
+        gcond = .not.lptsplit .and. lcold_lima .and. lnucl_lima .and. lwarm_lima  .and. lhhoni_lima
+        tzsource%cmnhname  = 'HONH'
+        tzsource%clongname = 'haze homogeneous nucleation'
+        call Budget_source_add( tbudgets(ibudget), tzsource, gcond, igroup )
+
+    end if SV_LIMA
+
+
+    else if ( jsv >= nsv_elecbeg .and. jsv <= nsv_elecend ) then SV_VAR
+      ! Electricity case
+      gcond = .true.
+      tzsource%cmnhname  = 'NEGA'
+      tzsource%clongname = 'negative correction'
+      call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nnegasv )
+
+      SV_ELEC: select case( jsv - nsv_elecbeg + 1 )
+        case ( 1 ) SV_ELEC
+          ! volumetric charge of water vapor
+          gcond = .true.
+          tzsource%cmnhname  = 'DEPS'
+          tzsource%clongname = 'deposition on snow'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndepsqv )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'DEPG'
+          tzsource%clongname = 'deposition on graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndepgqv )
+
+          gcond = lwarm_ice
+          tzsource%cmnhname  = 'REVA'
+          tzsource%clongname = 'rain evaporation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nrevaqv )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CDEPI'
+          tzsource%clongname = 'condensation/deposition on ice'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncdepiqv )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NEUT'
+          tzsource%clongname = 'NEUT'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nneutqv )
+
+
+        case ( 2 ) SV_ELEC
+          ! volumetric charge of cloud droplets
+          gcond = lwarm_ice
+          tzsource%cmnhname  = 'AUTO'
+          tzsource%clongname = 'autoconversion into rain'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nautoqc )
+
+          gcond = lwarm_ice
+          tzsource%cmnhname  = 'ACCR'
+          tzsource%clongname = 'accretion'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, naccrqc )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'RIM'
+          tzsource%clongname = 'riming of cloud water'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nrimqc )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'WETG'
+          tzsource%clongname = 'wet growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nwetgqc )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'DRYG'
+          tzsource%clongname = 'dry growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndrygqc )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'IMLT'
+          tzsource%clongname = 'ice melting'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nimltqc )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'BERFI'
+          tzsource%clongname = 'Bergeron-Findeisen'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nberfiqc )
+
+          gcond = lsedic_ice
+          tzsource%cmnhname  = 'SEDI'
+          tzsource%clongname = 'sedimentation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nsediqc )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CDEPI'
+          tzsource%clongname = 'condensation/deposition on ice'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncdepiqc )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NEUT'
+          tzsource%clongname = 'NEUT'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nneutqc )
+
+
+        case ( 3 ) SV_ELEC
+          ! volumetric charge of rain drops
+          gcond = lwarm_ice
+          tzsource%cmnhname  = 'AUTO'
+          tzsource%clongname = 'autoconversion into rain'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nautoqr )
+
+          gcond = lwarm_ice
+          tzsource%cmnhname  = 'ACCR'
+          tzsource%clongname = 'accretion'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, naccrqr )
+
+          gcond = lwarm_ice
+          tzsource%cmnhname  = 'REVA'
+          tzsource%clongname = 'rain evaporation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nrevaqr )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'ACC'
+          tzsource%clongname = 'accretion of rain water'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, naccqr )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CFRZ'
+          tzsource%clongname = 'conversion freezing of rain'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncfrzqr )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'WETG'
+          tzsource%clongname = 'wet growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nwetgqr )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'DRYG'
+          tzsource%clongname = 'dry growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndrygqr )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'GMLT'
+          tzsource%clongname = 'graupel melting'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ngmltqr )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'SEDI'
+          tzsource%clongname = 'sedimentation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nsediqr )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NEUT'
+          tzsource%clongname = 'NEUT'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nneutqr )
+
+        case ( 4 ) SV_ELEC
+          ! volumetric charge of ice crystals
+          gcond = .true.
+          tzsource%cmnhname  = 'AGGS'
+          tzsource%clongname = 'aggregation of snow'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, naggsqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'AUTS'
+          tzsource%clongname = 'autoconversion of ice'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nautsqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CFRZ'
+          tzsource%clongname = 'conversion freezing of rain'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncfrzqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'WETG'
+          tzsource%clongname = 'wet growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nwetgqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'DRYG'
+          tzsource%clongname = 'dry growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndrygqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'IMLT'
+          tzsource%clongname = 'ice melting'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nimltqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'BERFI'
+          tzsource%clongname = 'Bergeron-Findeisen'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nberfiqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NIIS'
+          tzsource%clongname = 'non-inductive charge separation due to ice-snow collisions'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nniisqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'SEDI'
+          tzsource%clongname = 'sedimentation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nsediqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CDEPI'
+          tzsource%clongname = 'condensation/deposition on ice'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncdepiqi )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NEUT'
+          tzsource%clongname = 'NEUT'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nneutqi )
+
+
+        case ( 5 ) SV_ELEC
+          ! volumetric charge of snow
+          gcond = .true.
+          tzsource%cmnhname  = 'DEPS'
+          tzsource%clongname = 'deposition on snow'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndepsqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'AGGS'
+          tzsource%clongname = 'aggregation of snow'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, naggsqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'AUTS'
+          tzsource%clongname = 'autoconversion of ice'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nautsqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'RIM'
+          tzsource%clongname = 'riming of cloud water'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nrimqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'ACC'
+          tzsource%clongname = 'accretion of rain water'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, naccqs )
+
+           gcond = .true.
+           tzsource%cmnhname  = 'CMEL'
+           tzsource%clongname = 'conversion melting'
+           call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncmelqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'WETG'
+          tzsource%clongname = 'wet growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nwetgqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'DRYG'
+          tzsource%clongname = 'dry growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndrygqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NIIS'
+          tzsource%clongname = 'non-inductive charge separation due to ice-snow collisions'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nniisqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'SEDI'
+          tzsource%clongname = 'sedimentation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nsediqs )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NEUT'
+          tzsource%clongname = 'NEUT'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nneutqs )
+
+
+        case ( 6 ) SV_ELEC
+          ! volumetric charge of graupel
+          gcond = .true.
+          tzsource%cmnhname  = 'DEPG'
+          tzsource%clongname = 'deposition on graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndepgqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'RIM'
+          tzsource%clongname = 'riming of cloud water'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nrimqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'ACC'
+          tzsource%clongname = 'accretion of rain water'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, naccqg )
+
+           gcond = .true.
+           tzsource%cmnhname  = 'CMEL'
+           tzsource%clongname = 'conversion melting'
+           call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncmelqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'CFRZ'
+          tzsource%clongname = 'conversion freezing of rain'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ncfrzqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'WETG'
+          tzsource%clongname = 'wet growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nwetgqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'DRYG'
+          tzsource%clongname = 'dry growth of graupel'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ndrygqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'GMLT'
+          tzsource%clongname = 'graupel melting'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, ngmltqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'SEDI'
+          tzsource%clongname = 'sedimentation'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nsediqg )
+
+          gcond = .true.
+          tzsource%cmnhname  = 'NEUT'
+          tzsource%clongname = 'NEUT'
+          call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nneutqg )
+
+
+        case ( 7: ) SV_ELEC
+
+      end select SV_ELEC
+
+
+    else if ( jsv >= nsv_chembeg .and. jsv <= nsv_chemend ) then SV_VAR
+      !Chemical case
+      gcond = .true.
+      tzsource%cmnhname  = 'CHEM'
+      tzsource%clongname = 'chemistry activity'
+      call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nchemsv )
+
+      gcond = .true.
+      tzsource%cmnhname  = 'NEGA'
+      tzsource%clongname = 'negative correction'
+      call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nnegasv )
+
+    else if ( jsv >= nsv_aerbeg .and. jsv <= nsv_aerend ) then SV_VAR
+      !Chemical aerosol case
+      gcond = lorilam
+      tzsource%cmnhname  = 'NEGA'
+      tzsource%clongname = 'negative correction'
+      call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nnegasv )
+
+    else SV_VAR
+      ! Nothing to do
+
+    end if SV_VAR
+  end if
+end do SV_BUDGETS
 
 !-------------------------------------------------------------------------------
 !*       4.    COMPUTE THE INCREMENT BETWEEN TWO ACTIVE SOURCES 
@@ -2776,654 +3631,6 @@ IF (LBU_RSV) THEN
   XBURSV(:,:,:,:,:)=0.
 END IF
 !
-CONTAINS
-! ##############################
-  SUBROUTINE BUDGET_OTHERPROC_SV
-! ##############################
-!
-!
-USE MODD_NSV
-USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, NMOD_IMM
-!
-  IF (JSV <= NSV_USER) THEN
-    ! NSV_USER Case
-!   SELECT CASE(JSV)
-!   CASE (1)
-!     ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-!     YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'PROC1_'
-!     IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-!     ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-!     YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'PROC2_'
-!     IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-!   CASE (2)
-!     ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-!     YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'PROC3_'
-!     IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-!     ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-!     YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'PROC4_'
-!     IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-!   END SELECT
-    !
-  ELSEIF (JSV >= NSV_C2R2BEG .AND. JSV <= NSV_C2R2END) THEN  
-    ! C2R2 or KHKO Case
-    SELECT CASE(JSV-NSV_C2R2BEG+1)
-    CASE (1)                               ! Concentration of activated nuclei
-     IF (.NOT. LSUPSAT) THEN
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HENU_'
-     END IF
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CEVA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-    CASE (2)                               ! Concentration of cloud droplets
-     IF (.NOT. LSUPSAT) THEN
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HENU_'
-     END IF
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SELF_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'ACCR_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (LSEDC) THEN
-        ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-        YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SEDI_'
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (LDEPOC) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'DEPO_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CEVA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-    CASE (3)                               ! Concentration of raindrops
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'AUTO_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (HCLOUD /= 'KHKO') THEN
-       ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-       YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SCBU_'
-       IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CEVA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'BRKU_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SEDI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-    END SELECT
-    !
-ELSEIF (JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END) THEN  
-   ! LIMA case
-   IF (JSV == NSV_LIMA_NC) THEN
-      ! Cloud droplets conc.
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'NEGA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CORR_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OSEDC) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SEDI_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (ODEPOC) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'DEPO_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .AND. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'R2C1_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HENU_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OCOLD .AND. ONUCL .AND. OPTSPLIT) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HINC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OWARM .AND. ORAIN)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SELF_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'AUTO_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'ACCR_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'REVA_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OCOLD .AND. ONUCL .AND. .NOT.OPTSPLIT) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HINC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ONUCL)) THEN         
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HONC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'IMLT_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'RIM_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'WETG_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'DRYG_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CVRC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (.NOT.OPTSPLIT .AND. OHAIL) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'WETH_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CEDS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      !
-   ELSE IF (JSV == NSV_LIMA_NR) THEN
-      ! Rain drops conc.
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'NEGA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (OPTSPLIT .AND. OWARM .AND. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CORR_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OWARM .AND. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SEDI_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .AND. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'R2C1_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'AUTO_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SCBU_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'REVA_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. ORAIN) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'BRKU_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ORAIN .AND. ONUCL)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HONR_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'ACC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CFRZ_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'WETG_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'DRYG_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'GMLT_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CVRC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (.NOT.OPTSPLIT .AND. OHAIL) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'WETH_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (.NOT.OPTSPLIT .AND. OHAIL) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HMLT_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      !
-   ELSE IF (JSV.GE.NSV_LIMA_CCN_FREE .AND. JSV.LT.(NSV_LIMA_CCN_FREE+NMOD_CCN)) THEN
-      ! Free CCN conc.
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'NEGA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (OWARM .AND. OACTI .AND. NMOD_CCN.GE.1) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HENU_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OCOLD .AND. ONUCL .AND. OHHONI .AND. NMOD_CCN.GE.1) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HONH_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CEDS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (OSCAV) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SCAV_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      !
-   ELSE IF (JSV.GE.NSV_LIMA_CCN_ACTI .AND. JSV.LT.(NSV_LIMA_CCN_ACTI+NMOD_CCN)) THEN
-      ! Activated CCN conc.
-
-   ELSE IF (JSV == NSV_LIMA_NI) THEN
-      ! Pristine ice crystals conc.
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'NEGA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (OPTSPLIT .AND. OCOLD .AND. OSNOW) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CORR_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OSEDI) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SEDI_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OCOLD .AND. ONUCL) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HIND_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OCOLD .AND. ONUCL) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HINC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OCOLD .AND. ONUCL .AND. OHHONI .AND. NMOD_CCN.GE.1) THEN         
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HONH_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. ONUCL)) THEN         
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HONC_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CNVI_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CNVS_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'AGGS_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'IMLT_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HMS_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CFRZ_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'WETG_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'DRYG_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (OPTSPLIT .OR. (OCOLD .AND. OWARM .AND. OSNOW)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HMG_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      IF (.NOT.OPTSPLIT .AND. OHAIL) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'WETH_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CEDS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      !
-   ELSE IF (JSV.GE.NSV_LIMA_IFN_FREE .AND. JSV.LT.(NSV_LIMA_IFN_FREE+NMOD_IFN)) THEN
-      ! Free IFN conc.
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'NEGA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (OCOLD .AND. ONUCL .AND. (.NOT.OMEYERS)) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HIND_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CEDS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      IF (OSCAV) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'SCAV_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-      !
-   ELSE IF (JSV.GE.NSV_LIMA_IFN_NUCL .AND. JSV.LT.(NSV_LIMA_IFN_NUCL+NMOD_IFN)) THEN
-      ! Nucleated IFN conc.
-
-   ELSE IF (JSV.GE.NSV_LIMA_IMM_NUCL .AND. JSV.LT.(NSV_LIMA_IMM_NUCL+NMOD_IMM)) THEN
-      ! Nucleated IMM conc.
-
-   ELSE IF (JSV == NSV_LIMA_HOM_HAZE) THEN
-      ! Homogeneous freezing of CCN
-      IF (OCOLD .AND. ONUCL .AND. OWARM .AND. OHHONI) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'HONH_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 1
-      END IF
-
-   END IF
-
-
-
-
-ELSEIF (JSV >= NSV_ELECBEG .AND. JSV <= NSV_ELECEND) THEN
-   SELECT CASE(JSV-NSV_ELECBEG+1)
-   CASE(1)  ! volumetric charge of water vapor
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DEPS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDEPSQV
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DEPG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDEPGQV
-      IF (LWARM) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'REVA_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NREVAQV
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DEPI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDEPIQV
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NEUT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNEUTQV
-   CASE(2)  ! volumetric charge of cloud droplets
-      IF (LWARM) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'AUTO_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NAUTOQC
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'ACCR_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NACCRQC
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'RIM_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NRIMQC
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'WETG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NWETGQC
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DRYG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDRYGQC
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'IMLT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NIMLTQC
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'BERFI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NBERFIQC
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DEPI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDEPIQC
-      IF (LINDUCTIVE) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'IND_'
-      END IF
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NINDQC
-      IF (LSEDIC) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'SEDI_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NSEDIQC
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NEUT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNEUTQC
-   CASE(3)  ! volumetric charge of rain drops
-      IF (LWARM) THEN
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'AUTO_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NAUTOQR
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'ACCR_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NACCRQR
-         ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-         YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'REVA_'
-         IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NREVAQR
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'ACC_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NACCQR
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'CFRZ_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NCFRZQR
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'WETG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NWETGQR
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DRYG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDRYGQR
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'GMLT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NGMLTQR
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'SEDI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NSEDIQR
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NEUT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNEUTQR
-   CASE(4)  ! volumetric charge of ice crystals
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'AGGS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NAGGSQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'AUTS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NAUTSQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'CFRZ_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NCFRZQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'WETG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NWETGQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DRYG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDRYGQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'IMLT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NIMLTQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'BERFI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NBERFIQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DEPI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDEPIQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NIIS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNIISQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'SEDI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NSEDIQI
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NEUT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNEUTQI
-   CASE(5)  ! volumetric charge of snow
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DEPS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDEPSQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'AGGS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NAGGSQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'AUTS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NAUTSQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'RIM_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NRIMQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'ACC_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NACCQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'CMEL_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NCMELQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'WETG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NWETGQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DRYG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDRYGQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NIIS_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNIISQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'SEDI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NSEDIQS
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NEUT_'
-   CASE(6)  ! volumetric charge of graupel
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DEPG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDEPGQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'RIM_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NRIMQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'ACC_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NACCQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'CMEL_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NCMELQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'CFRZ_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NCFRZQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'WETG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NWETGQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'DRYG_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NDRYGQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'GMLT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NGMLTQG
-      IF (LINDUCTIVE) THEN
-        ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-        YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'IND_'
-        IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NINDQG
-      END IF
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'SEDI_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NSEDIQG
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = 'NEUT_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNEUTQG
-    CASE(7)  ! volumetric charge of hail
-! add budget for hail volumetric charge
-    END SELECT
-!
-ELSE IF (JSV >= NSV_CHEMBEG .AND. JSV <= NSV_CHEMEND) THEN
-    ! Chemical Case
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'CHEM_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NCHEMSV
-    ! other processes
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'ADV_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NADVSV
-      ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-      YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'NEGA_'
-      IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NNEGASV
- !
-  ELSE
-    ! other processes
-    ! ILAST_PROC_NBR = ILAST_PROC_NBR + 1
-    ! YWORK2(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR)= 'ADV_'
-    ! IPROACTV(NBUDGET_SV1 - 1 + JSV, ILAST_PROC_NBR) = NADVSV
-  END IF
-  !
-  END SUBROUTINE BUDGET_OTHERPROC_SV
-!
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE INI_BUDGET
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 9019a9f4a..46a9f3910 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1654,11 +1654,12 @@ ENDIF
 !              ---------------------------
 !
 IF ( CBUTYPE /= "NONE" .AND. NBUMOD == KMI ) THEN
-  CALL INI_BUDGET(ILUOUT,XTSTEP,NSV,NRR,                                      &
+  CALL Ini_budget(ILUOUT,XTSTEP,NSV,NRR,                                      &
              LNUMDIFU,LNUMDIFTH,LNUMDIFSV,                                    &
              LHORELAX_UVWTH,LHORELAX_RV, LHORELAX_RC,LHORELAX_RR,             &
              LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, LHORELAX_RH,LHORELAX_TKE,   &
-             LHORELAX_SV,LVE_RELAX,LCHTRANS,LNUDGING,LDRAGTREE,LDEPOTREE,     &
+             LHORELAX_SV,LVE_RELAX, LVE_RELAX_GRD,                            &
+             LCHTRANS,LNUDGING,LDRAGTREE,LDEPOTREE,                           &
              CRAD,CDCONV,CSCONV,CTURB,CTURBDIM,CCLOUD                         )
 END IF
 !
-- 
GitLab