Adding user-defined tracers

This section describes the way to build-up the tracer scheme in NEMO 3.4 based on the MY_TRC module.

Edit MY_TRC files

The following files are useful when adding tracers into the model.

Script Location Functionality
par_my_trc.F90 TOP_SRC/MY_TRC Claim the number & indexing of tracers
trcsms_my_trc.F90 TOP_SRC/MY_TRC Initialization & parameterization
trcnxt.F90 TOP_SRC/MY_TRC Boundary conditions

An ideal way to edit these files is copying them to MY_SRC and without changing things in the original folder. Here some examples are provided, but the real editing depends on the type of tracer. The OPA Tracer Mannuel explained that MY_TRC is designed for “passive tracers”.

The example below sets user defined tracer as .TRUE. and claimed two tracers with index jpmyt1 and jpmyt2. So during the simulation, the first tracer can be indexed as: trn(lon, lat, dep, jpmyt1).

par_my_trc.F90:

! Line 43
  !!---------------------------------------------------------------------
  !!   'key_my_trc'                     user defined tracers (MY_TRC)
  !!---------------------------------------------------------------------
  LOGICAL, PUBLIC, PARAMETER ::   lk_my_trc     = .TRUE.   !: PTS flag
! Line 48
! assign an index in trc arrays for each PTS prognostic variables
  INTEGER, PUBLIC, PARAMETER ::   jpmyt1 = jp_lm + 1 !: 1st MY_TRC tracer
  INTEGER, PUBLIC, PARAMETER ::   jpmyt2 = jp_lm + 2 !: 1st MY_TRC tracer

trcsms_my_trc.F90 is an important file to work on. The example below demostrates the way of doing initialization, derivative and variable printing.

trcsms_my_trc.F90:

! Initialization
     IF( kt < 5 ) THEN
        WRITE(*, *) '~~~~ Initialization ~~~~'
        trn(:, :, :, jpmyt1) = your_ini_field(:, :, :)
     ENDIF
! Param time derivative
tra(:, :, 1, jpmyt1) = tra(:, :, 1, jpmyt1) + delta
! Print surface tracer values to check
WRITE(*, *) 'trn@Lena estuary', trn(600, 450, 1, jpmyt1)

kt is the timestep, trn is the storage of tracer value and tra is the “delta” term. (this block needs more explainations)

The example below is the open boundary condition for our group. In order to preserve tracer values at the boundary from the impact of advection from “zero grids”, you can hold values at the boundary as their initial condition.

trcnxt.F90:

! Inside the scope of SUBROUTINE trc_nxt( kt )
! Set grids below 60N latitude to zero (only simulates Arctic)
      DO jn = 1, jptra
        DO jk = 1, jpk
           WHERE (gphit < 60)
              tra(:, :, jk, jn) = 0.
           END WHERE
        ENDDO
      ENDDO

Note

It is always necessary to read initial/boundary conditions and other physical fields when simulating the tracer, this part of information is in here.

Edit I/O options`

EXP00/iodef.xml in general contains two parts: (1) the variable definition section and (2) the output section. User-defined tracers should be defined in (1), ideally the ptrc_T group. The information of output frequency is in (2), varies from 1-day to 10-year.

iodef.xml:

<!-- In ptrc_T scope -->
<group id="ptrc_T" axis_ref="deptht" grid_ref="grid_T">
      <!-- My Stupid Tracer -->
      <field id="T01" description="My tracer 01" unit="none" />
      <field id="T02" description="My tracer 02" unit="none" />
</group>

The output definition locates at the bottom of the file.

<!-- In the output definition scope -->
<file_definition >
     <group id="5d" output_freq="432000" output_level="10" enabled=".TRUE.">
       <file id="5d_ptrc_T" name="auto" description="pisces sms variables" >
          <field ref="T01" /> <!-- output every 5-day -->
          <field ref="T02" />
       </file>
     </group>
     <group id="1m" output_freq="-1"     output_level="10" enabled=".TRUE.">
       <file id="1m_ptrc_T" name="auto" description="pisces sms variables" >
         <field ref="T01" /> <!-- output every month -->
         <field ref="T02" />
       </file>
     </group>
</file_definition>

Edit namelist_top

namelist_top:

!                !    name   ! title of the field ! initial data ! initial data ! save   !
!                !           !                    !  units       ! from file    ! or not !
!                !           !                    !              ! or not       !        !
   sn_tracer(1)  = 'T01'     , 'My tracer 01'     ,  'none'      ,  .false.     ,  .true.
   sn_tracer(2)  = 'T02'     , 'My tracer 02'     ,  'none'      ,  .false.     ,  .true.
/

The original namelist_top contains many existing sn_tracer(#) fields, these are prepared for PISCES and can be deleted. namelist_top can set-up the restart tracer files which is useful for long-term simulations