Index: trunk/LMDZ.GENERIC/deftank/traceur.def.radioactive
===================================================================
--- trunk/LMDZ.GENERIC/deftank/traceur.def.radioactive	(revision 3724)
+++ trunk/LMDZ.GENERIC/deftank/traceur.def.radioactive	(revision 3724)
@@ -0,0 +1,8 @@
+#ModernTrac-v1
+6
+r1   half_life=8.64e4    bot_prod=8e-6
+r2   half_life=6.048e5   bot_prod=1.15e-6
+r3   half_life=2.592e6   bot_prod=2.7e-7
+r4   half_life=8.64e4    top_prod=8e-6
+r5   half_life=6.048e5   top_prod=1.15e-6
+r6   half_life=2.592e6   top_prod=2.7e-7
Index: trunk/LMDZ.GENERIC/libf/phystd/initracer.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/initracer.F90	(revision 3723)
+++ trunk/LMDZ.GENERIC/libf/phystd/initracer.F90	(revision 3724)
@@ -129,4 +129,7 @@
        IF (.NOT. allocated(constants_metallicity_coeff)) allocate(constants_metallicity_coeff(nq))
        IF (.NOT. allocated(constants_RCPV_generic)) allocate(constants_RCPV_generic(nq))
+       IF (.NOT.ALLOCATED(half_life))         ALLOCATE(half_life(nqtot))
+       IF (.NOT.ALLOCATED(top_prod))         ALLOCATE(top_prod(nqtot))
+       IF (.NOT.ALLOCATED(bot_prod))         ALLOCATE(bot_prod(nqtot))
 
        !! initialization
@@ -141,4 +144,7 @@
        is_recomb_qset(:) = 0
        is_recomb_qotf(:) = 0
+       half_life(:)      = 0.
+       top_prod(:)       = 0.
+       bot_prod(:)       = 0.
        
        ! Added by JVO 2017 : these arrays are handled later
@@ -716,5 +722,25 @@
             write(*,*)'Parameter value (default) : '// &
               'is_rgcs = ',is_rgcs(iq)
-          endif
+          end if
+             ! option top_prod 
+              if (index(tracline,'top_prod=') .ne. 0) then
+                  read(tracline(index(tracline,'top_prod=') &
+                  +len('top_prod='):),*) top_prod(iq)
+                  write(*,*) ' Parameter value (traceur.def) : top_prod=', &
+                  top_prod(iq)
+              else
+                  write(*,*) ' Parameter value (default)     : top_prod=',  &
+                  top_prod(iq)
+              end if
+              ! option bot_prod 
+              if (index(tracline,'bot_prod=') .ne. 0) then
+                  read(tracline(index(tracline,'bot_prod=') &
+                  +len('bot_prod='):),*) bot_prod(iq)
+                  write(*,*) ' Parameter value (traceur.def) : bot_prod=', &
+                  bot_prod(iq)
+              else
+                  write(*,*) ' Parameter value (default)     : bot_prod=',  &
+                  bot_prod(iq)
+              end if
       end subroutine get_tracdat
 
Index: trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90	(revision 3723)
+++ trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90	(revision 3724)
@@ -37,4 +37,6 @@
                           igcm_h2o_ice, igcm_h2o_vap, igcm_dustbin, &
                           igcm_co2_ice, nesp, is_chim, is_condensable,constants_epsi_generic
+                        !  igcm_co2_ice, nesp, is_chim, is_condensable,constants_epsi_generic, &
+                        !  half_life, top_prod, bot_prod
       use time_phylmdz_mod, only: ecritphy, iphysiq, nday
       use phyetat0_mod, only: phyetat0,tab_cntrl_mod
@@ -364,4 +366,5 @@
       REAL,allocatable,save :: zdqchim(:,:,:) ! Calchim_asis routine
       REAL,allocatable,save :: zdqschim(:,:)  ! Calchim_asis routine
+      REAL zdqradio(ngrid,nlayer,nq)   ! Radioactive decay
 !$OMP THREADPRIVATE(zdqchim,zdqschim)
       real zdqvolc(ngrid,nlayer,nq) ! injection by volcanoes (kg/kg_of_air/s)
@@ -2072,4 +2075,11 @@
          qsurf_hist(:,:) = qsurf(:,:)
 
+  ! -----------------------------
+  !   VI.7. Radioactive Tracers
+  ! -----------------------------
+         
+         call radioactive_tracers(ngrid,nlayer,nq,ptimestep,pq,zdqradio)
+         pdq(1:ngrid,1:nlayer,1:nq) = pdq(1:ngrid,1:nlayer,1:nq) + zdqradio(1:ngrid,1:nlayer,1:nq)
+
       endif! end of if 'tracer'
 
Index: trunk/LMDZ.GENERIC/libf/phystd/radioactive_tracers.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/radioactive_tracers.F90	(revision 3724)
+++ trunk/LMDZ.GENERIC/libf/phystd/radioactive_tracers.F90	(revision 3724)
@@ -0,0 +1,53 @@
+
+subroutine radioactive_tracers(ngrid,nlayer,nq,ptimestep,pq,zdqradio)
+
+    USE tracer_h, only: half_life, top_prod, bot_prod, noms
+    implicit none
+    
+    !==================================================================
+    !     
+    !     Purpose
+    !     -------
+    !     Calculates the decay of radioactive tracers
+    !     
+    !     Authors
+    !     -------
+    !     Maxime Maurice (14/04/2025)
+    !     
+    !==================================================================
+    
+    !     Arguments
+    integer,intent(in) :: ngrid                      ! number of atmospheric columns
+    integer,intent(in) :: nlayer                     ! number of atmospheric layers
+    integer,intent(in) :: nq                         ! number of tracers
+    real,intent(in)    :: ptimestep                  ! time interval
+    real,intent(in)    :: pq(ngrid,nlayer,nq)        ! tracers (kg/kg)
+    real,intent(out)   :: zdqradio(ngrid,nlayer,nq)  ! radioactive tracers tendencies
+
+    !     Local variables
+    integer iq
+
+        zdqradio(1:ngrid,1:nlayer,1:nq) = 0
+        do iq=1,nq
+        if (half_life(iq) .ne. 0) then
+            ! SOURCE
+            ! bottom
+            if (bot_prod(iq) .ne. 0) then
+                zdqradio(1:ngrid,1,iq) = zdqradio(1:ngrid,1,iq) + bot_prod(iq) ! <== bottom production
+            end if ! bot_prod != 0
+            ! top
+            if (top_prod(iq) .ne. 0) then
+                zdqradio(1:ngrid,nlayer,iq) = zdqradio(1:ngrid,nlayer,iq) + top_prod(iq) ! <== top production (prod = log(2)/half_life)
+            end if ! bot_prod != 0
+
+            ! DECAY
+            if (half_life(iq)/10 .le. ptimestep) then ! sanity test
+                write(*,*)"timestep is more than half-life / 10 of tracer ", noms(iq)
+                call abort_physic()
+            end if ! dt > 0.1 * half_life
+            zdqradio(1:ngrid,1:nlayer,iq) = zdqradio(1:ngrid,1:nlayer,iq) - LOG(2.)/half_life(iq)*pq(1:ngrid,1:nlayer,iq) ! <== decay
+        end if ! half_life(iq) != 0
+        end do ! iq=1,nq
+
+end subroutine radioactive_tracers
+
Index: trunk/LMDZ.GENERIC/libf/phystd/tracer_h.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/tracer_h.F90	(revision 3723)
+++ trunk/LMDZ.GENERIC/libf/phystd/tracer_h.F90	(revision 3724)
@@ -55,4 +55,10 @@
 !$OMP THREADPRIVATE(constants_Pref,constants_epsi_generic)
 !$OMP THREADPRIVATE(constants_RLVTT_generic,constants_metallicity_coeff,constants_RCPV_generic)
+
+       real, save, allocatable :: half_life(:) ! half-life (s) for radioactive tracers. If 0, tracer is not decaying.
+       real, save, allocatable :: top_prod(:)  ! top production rate (1/s) for radioactive tracers. Non-dim, so use 1.
+       real, save, allocatable :: bot_prod(:)  ! bottom production rate (1/s) for radioactive tracers. Non-dim, so use 1.
+!$OMP THREADPRIVATE(half_life,top_prod,bot_prod)
+
 
 !$OMP THREADPRIVATE(is_condensable,is_rgcs)   !also added by LT
