<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing with OASIS Tables v3.0 20080202//EN" "https://jats.nlm.nih.gov/nlm-dtd/publishing/3.0/journalpub-oasis3.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:oasis="http://docs.oasis-open.org/ns/oasis-exchange/table" xml:lang="en" dtd-version="3.0" article-type="research-article">
  <front>
    <journal-meta><journal-id journal-id-type="publisher">GMD</journal-id><journal-title-group>
    <journal-title>Geoscientific Model Development</journal-title>
    <abbrev-journal-title abbrev-type="publisher">GMD</abbrev-journal-title><abbrev-journal-title abbrev-type="nlm-ta">Geosci. Model Dev.</abbrev-journal-title>
  </journal-title-group><issn pub-type="epub">1991-9603</issn><publisher>
    <publisher-name>Copernicus Publications</publisher-name>
    <publisher-loc>Göttingen, Germany</publisher-loc>
  </publisher></journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.5194/gmd-19-10223-2026</article-id><title-group><article-title>OceanTracker 0.5: fast adaptable Lagrangian particle  tracking in structured and unstructured grids</article-title><alt-title>OceanTracker  0.5</alt-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Vennell</surname><given-names>Ross</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="yes" rid="aff1 aff2">
          <name><surname>Steidle</surname><given-names>Laurin</given-names></name>
          <email>laurin.steidle@cawthron.org.nz</email>
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Smeaton</surname><given-names>Malcolm</given-names></name>
          
        <ext-link>https://orcid.org/0000-0003-3267-2314</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Chaput</surname><given-names>Romain</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Knight</surname><given-names>Ben</given-names></name>
          
        </contrib>
        <aff id="aff1"><label>1</label><institution>Cawthron Institute, Nelson, New Zealand</institution>
        </aff>
        <aff id="aff2"><label>2</label><institution>Institute of Marine Ecosystem and Fishery Science, Department of Biology, University of Hamburg, Hamburg, Germany</institution>
        </aff>
      </contrib-group>
      <author-notes><corresp id="corr1">Laurin Steidle (laurin.steidle@cawthron.org.nz)</corresp></author-notes><pub-date><day>28</day><month>October</month><year>2026</year></pub-date>
      
      <volume>19</volume>
      <issue>20</issue>
      <fpage>10223</fpage><lpage>10241</lpage>
      <history>
        <date date-type="received"><day>15</day><month>September</month><year>2025</year></date>
           <date date-type="rev-request"><day>27</day><month>October</month><year>2025</year></date>
           <date date-type="rev-recd"><day>20</day><month>March</month><year>2026</year></date>
           <date date-type="accepted"><day>1</day><month>September</month><year>2026</year></date>
      </history>
      <permissions>
        <copyright-statement>Copyright: © 2026 Ross Vennell et al.</copyright-statement>
        <copyright-year>2026</copyright-year>
      <license license-type="open-access"><license-p>This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this licence, visit <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link></license-p></license></permissions><self-uri xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026.html">This article is available from https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026.html</self-uri><self-uri xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026.pdf">The full text article is available as a PDF file from https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026.pdf</self-uri>
      <abstract><title>Abstract</title>

      <p id="d2e126">Particle tracking is frequently used to compute particle movements within hydrodynamic ocean models; however, modelling millions of particles is computationally challenging. OceanTracker is designed to reduce the time required to obtain results from particle tracking. Firstly, OceanTracker is computationally efficient, allowing users to simulate large numbers of particles in complex coastal environments, enabling improved statistics and exploration  of a wider range of cases within acceptable run times.  Secondly, OceanTracker can calculate multiple particle statistics during the computational run, eliminating the need to record and post-process large volumes of particle trajectories. The adaptability of OceanTracker's modular computational pipeline allows users to add and modify components that govern particle physics, behaviour, and statistics. The computational pipeline is entirely assembled from user-provided parameters, supplied as a JSON or YMAL text file or built using helper methods. Coders can easily modify existing components through code inheritance. Currently, OceanTracker supports hydrodynamic model output  both for unstructured  (SCHISM, FVCOM, DELFT3D-FM) and structured  (ROMS, NEMO/GLORYS) grids. Computing the trajectories for more than one million particles with OceanTracker on a single computer core is more than ten times faster than the OpenDrift code and twice as fast as the Parcels code, despite treating structured grids as unstructured, which might be expected to be computationally slower than structured grids due to the time required to locate each particle within a hydrodynamic grid cell.  In addition to its single-core performance, OceanTracker can run computations in parallel across available cores. This can further increase speed by up to an order of magnitude on currently available multicore desktop processors.</p>
  </abstract>
    
<funding-group>
<award-group id="gs1">
<funding-source>Ministry of Business, Innovation and Employment</funding-source>
<award-id>C11X1903</award-id>
<award-id>RTVU1914</award-id>
</award-group>
<award-group id="gs2">
<funding-source>Deutsche Forschungsgemeinschaft</funding-source>
<award-id>407270017</award-id>
</award-group>
</funding-group>
</article-meta>
  </front>
<body>
      

<sec id="Ch1.S1" sec-type="intro">
  <label>1</label><title>Introduction</title>
      <p id="d2e138">Particle tracking is key to answering many scientific and practical questions about physical and biophysical transport in the ocean <xref ref-type="bibr" rid="bib1.bibx18 bib1.bibx29 bib1.bibx7" id="paren.1"/>, such as dispersal of pollutants <xref ref-type="bibr" rid="bib1.bibx1" id="paren.2"/>, movements of larvae,  residence times <xref ref-type="bibr" rid="bib1.bibx17" id="paren.3"/>,  or quantifying connectivity between regions <xref ref-type="bibr" rid="bib1.bibx2" id="paren.4"/>. However, a major challenge for particle-tracking models  is simulating millions of particles to enable statistically significant results – particularly  when introducing stochastic movements in the models to account for uncertainties in the physical currents or  biological traits  <xref ref-type="bibr" rid="bib1.bibx29 bib1.bibx22 bib1.bibx3" id="paren.5"/>. This is especially   important  when estimating the bio-physical connectivities of rare events, such as for the initial arrival of invasive species, which have significant ecological and economic consequences. In these cases, it is necessary to release large numbers of particles to represent the numerous trajectories in the system.</p>
      <p id="d2e156">Simulating millions of particles creates several challenges. The first, computing particle  trajectories in user-acceptable time frames.  This first challenge  may result in users either choosing to simulating smaller numbers of particles producing unreliable statistics or shifting their research question to a simplified problem, in order to get results within project deadlines  on accessible hardware. The second challenge, is the  time required to post-process the trajectories to obtain the required particle statistics (see Sect. <xref ref-type="sec" rid="Ch1.S3.SS1"/>).  A third challenge is creating code that is easy to use and yet adaptable to many use cases, e.g. for different particle behaviours. The offline particle tracker OceanTracker  addresses all three challenges. However, what constitutes large numbers and acceptable time frames to obtain particle statistics   depends on a user's objectives, their computer hardware and project deadlines.</p>
      <p id="d2e161">Particle tracking code OceanTracker  addresses the first challenge of speed  by computing large numbers of particle trajectories with widely accessible   desktop and laptop hardware. Table <xref ref-type="table" rid="T1"/> shows a range of hardware, all of which  can compute one month of particle trajectories for 1 million particles in 4 to 20 min, depending on the number of processors and their clock speed, see Table <xref ref-type="table" rid="T1"/>.  The second challenge is a result of the time and effort required to  analyse these trajectories and produce the required particle statistics,  which includes the logistical challenges of storing and accessing what can be terabytes of data. This new version,  OceanTracker  0.5, can resolve some of these issues by recording particle  statistics during the computational run, e.g. heat maps and connectivities between regions, as  shown in Fig. <xref ref-type="fig" rid="F1"/> and Sect. <xref ref-type="sec" rid="Ch1.S4.SS8"/>. On-the-fly statistics may address both the post-processing time and storage issues, as no particle trajectories need to be recorded, and the size of the statistical output files is independent of the number of particles released.  If required, individual particle trajectories can also be recorded to allow detailed inspection of results.  However, including the full-time resolution of the trajectories in any statistical computations would require recording every time step. On-the-fly statistics can enable full-time  resolution without the cost of writing to disk at every time step.</p>
      <p id="d2e172">The  aspects of adaptability addressed in this work are two fold. First, for most users it is  simple to  incorporate   their required particle behaviours  from a suite of supplied options using a configuration file. Second,  coding users  can easily extend and adapt the given options to meet their specialised needs. The new modular <italic>computational pipeline</italic> in OceanTracker 0.5 addresses aspects of the third challenge of adaptability by structuring the computational pipeline  as a sequence of discrete steps, each responsible for a specific computational task, see Fig. <xref ref-type="fig" rid="F3"/>. Users add tasks as <italic>components</italic>  within  <italic>roles</italic>. These components are dynamically assembled at runtime to create the required computational pipeline. Components may be those supplied by OceanTracker  or the user. In many cases multiple components can be added to the same role. For example, there can be multiple release groups, each with distinct release locations and schedules, or multiple biophysical behaviours that alter particle trajectories (e.g., larvae settling within a defined area  and time period <xref ref-type="bibr" rid="bib1.bibx6" id="paren.6"/>). All components are implemented as Python  classes, which enables coders to inherit and adapt any in-built component to their specific needs with minimal addtional code.</p>
      <p id="d2e190">To allow non-coders to use OceanTracker  0.5 it builds the entire computational pipeline from a user-supplied configuration file. This configuration defines which components are added to roles within the computational pipeline.  Alternatively, coders can add components using  simple method calls.   For each component, the configuration also describes the  <italic>parameters</italic> that  specify their individual settings, Sect. <xref ref-type="sec" rid="Ch1.S4.SS1.SSS1"/>.  Figure <xref ref-type="fig" rid="F4"/> gives  a minimal example of these approaches, with the same run done using  coding, or from parameters supplied in  JSON or YAML text file formats. An additional advantage of using text file parameters is that it allows web-based on-demand  particle tracking services to easily access the same level of computational pipeline  flexibility <xref ref-type="bibr" rid="bib1.bibx31" id="paren.7"/>.</p>
      <p id="d2e203">A single particle tracking framework that operates  with both structured and unstructured  hydrodymamic model grids simplifies the particle tracking process for users by having a uniform approach regardless of which hydrodynamic model is used. Particle trackers for unstructured grids are rare due to the complexity involved in coding the movement and interpolations within the grid.  A review of ocean Lagrangian analysis  <xref ref-type="bibr" rid="bib1.bibx29" id="paren.8"/> lists 11  particle trackers, of which only one “LIGHT in MPAS-O” is capable of working with unstructured grids. Beyond this list, those compatible with both types of grids are even rarer, e.g. OpenDrift <xref ref-type="bibr" rid="bib1.bibx4" id="paren.9"/>,   Pylag <xref ref-type="bibr" rid="bib1.bibx28" id="paren.10"/> and the alpha release of Parcels v4. A secondary goal for OceanTracker  0.5 is to provide a single framework that auto-detects the type of grid from multiple  hydrodynamic model formats and identifies  if useful fields are in the hindcast, such as bottom stress used in particle re-suspension. This enables users to focus  on the outcomes they need from particle tracking, rather than the  details of the underlying hydrodynamic model's grid and outputs. While OceanTracker  version 0.1 only supported   the SCHISM hydrodynamic model output format, OceanTracker  0.5 now supports SCHISM, FVCOM, DEFLT3D-FM, NEMO/GLORYS and  ROMS  formats <xref ref-type="bibr" rid="bib1.bibx34 bib1.bibx14 bib1.bibx20 bib1.bibx19" id="paren.11"/>. OceanTracker has been applied to a range of studies involving particle-based simulations to understand transport processes in marine environments. These applications typically involve  releasing large numbers of particles, tracking their movement over time and then analysing connectivity patterns. Examples include:</p>
      <p id="d2e218"><list list-type="bullet">
          <list-item>

      <p id="d2e223"><italic>Investigating phytoplankton retention in an estuary</italic>. A simulation with one billion particles (up to one million active at any time) modelling population growth through particle splitting and retention mechanisms   using a 32k node hindcast <xref ref-type="bibr" rid="bib1.bibx24" id="paren.12"/>.</p>
          </list-item>
          <list-item>

      <p id="d2e234"><italic>Inferring the dispersal area of eDNA</italic>. Inferring  the spatial extent of a species' environmental DNA that may be detected from water samples,   within a 155k node hindcast <xref ref-type="bibr" rid="bib1.bibx21" id="paren.13"/>. </p>
          </list-item>
          <list-item>

      <p id="d2e246"><italic>Assessing invasive species risk from ballast water discharge</italic>. Modelling the transport of invasive species larvae  by releasing 65 million particles from vessels along coastal shipping routes,    within a 78k node hindcast<xref ref-type="bibr" rid="bib1.bibx23" id="paren.14"/>.</p>
          </list-item>
          <list-item>

      <p id="d2e257"><italic>Disease spread in aquaculture farms</italic>. Estimating connectivity between 500 aquaculture farms by analysing tracks of 150 million particles to determine potential disease transmission pathways,  within a 150k node hindcast  <xref ref-type="bibr" rid="bib1.bibx13" id="paren.15"/>.</p>
          </list-item>
          <list-item>

      <p id="d2e268"><italic>Public engagement, online ocean plastics tracker</italic>. A web-based tool that allows users to drop virtual plastic and instantly visualise where it travels, returning 20 particle trajectories in less than one second,   using a 78k node hindcast <xref ref-type="bibr" rid="bib1.bibx31" id="paren.16"/>.</p>
          </list-item>
        </list></p>
      <p id="d2e278">High level goals  for this new version of OceanTracker  included: (1) deskilling particle tracking for novice users, (2) enabling large particle numbers using laptop and desktop hardware, (3) providing a range of inbuilt options that cover many intermediate user requirements,  and (4) allowing experienced coders to extend existing options with minimal additional code. OceanTracker's  modular approach, auto-detection of readers, algorithmic efficiency  and  automation within OceanTracker   contribute to these goals (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS1"/>, <xref ref-type="sec" rid="Ch1.S4.SS4"/> and <xref ref-type="sec" rid="Ch1.S4.SS1.SSS3"/>, and the minimal example in Fig. <xref ref-type="fig" rid="F4"/>).</p>
      <p id="d2e289">This paper provides a high-level outline of the features and structure of the updates to OceanTracker  since the release of version 0.1  <xref ref-type="bibr" rid="bib1.bibx32" id="paren.17"/>, so they can better understand the framework within which they assemble their computational pipeline. The paper only includes  brief comments on how key aspects were implemented within the OceanTracker  code, as this will require a future more technically focused  paper.</p>
      <p id="d2e295">An overview of OceanTracker's  features is provided in Sect. <xref ref-type="sec" rid="Ch1.S3"/>, including some example outputs in Fig. <xref ref-type="fig" rid="F1"/>.  Section <xref ref-type="sec" rid="Ch1.S4"/> details its structure, and a description of how to configure the computational pipeline  is given in Sect. <xref ref-type="sec" rid="Ch1.S4.SS1.SSS1"/>. Additionally, Sect. <xref ref-type="sec" rid="Ch1.S4.SS9"/> outlines integrated models that combine components within roles  to achieve higher-level functionality, such as calculating Lagrangian coherent structures. Section <xref ref-type="sec" rid="Ch1.S5"/>  explores the features contributing to OceanTracker's  computational speed  and compares its performance to OpenDrift  and  Parcels.</p>

<table-wrap id="T1" specific-use="star"><label>Table 1</label><caption><p id="d2e315">OceanTracker  run times for modelling 1 million particles over a period of 1 month. Each run utilised all physical computer cores and completed 2880 time steps of 15 min each using 4th order Runge-Kutta  time integration in 3D. The unstructured hydrodynamic model had 79k nodes and 140k triangles.  Read times are the time spent reading the hindcast from the local disk, with the balance of  time spent computing particle tracks.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="8">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="center" colsep="1"/>
     <oasis:colspec colnum="6" colname="col6" align="center"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:colspec colnum="8" colname="col8" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1"/>
         <oasis:entry rowsep="1" namest="col2" nameend="col5" align="center" colsep="1">Specifications </oasis:entry>
         <oasis:entry rowsep="1" namest="col6" nameend="col8">Minutes per modelled month </oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2">CPU Name</oasis:entry>
         <oasis:entry colname="col3">Physical cores</oasis:entry>
         <oasis:entry colname="col4">RAM GB</oasis:entry>
         <oasis:entry colname="col5">Freq. MHz</oasis:entry>
         <oasis:entry colname="col6">Read</oasis:entry>
         <oasis:entry colname="col7">Computation</oasis:entry>
         <oasis:entry colname="col8">Total</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">Laptop I</oasis:entry>
         <oasis:entry colname="col2">Intel i5-8265U (2018)</oasis:entry>
         <oasis:entry colname="col3">4</oasis:entry>
         <oasis:entry colname="col4">8</oasis:entry>
         <oasis:entry colname="col5">1.6–3.9</oasis:entry>
         <oasis:entry colname="col6">4</oasis:entry>
         <oasis:entry colname="col7">18</oasis:entry>
         <oasis:entry colname="col8">22</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Laptop II</oasis:entry>
         <oasis:entry colname="col2">Intel i7-1255U  (2022)</oasis:entry>
         <oasis:entry colname="col3">10</oasis:entry>
         <oasis:entry colname="col4">16</oasis:entry>
         <oasis:entry colname="col5">1.7–4.7</oasis:entry>
         <oasis:entry colname="col6">7</oasis:entry>
         <oasis:entry colname="col7">16</oasis:entry>
         <oasis:entry colname="col8">21</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Desktop I</oasis:entry>
         <oasis:entry colname="col2">AMD Ryzen 2700X (2018)</oasis:entry>
         <oasis:entry colname="col3">8</oasis:entry>
         <oasis:entry colname="col4">32</oasis:entry>
         <oasis:entry colname="col5">3.7–4.4</oasis:entry>
         <oasis:entry colname="col6">5</oasis:entry>
         <oasis:entry colname="col7">8</oasis:entry>
         <oasis:entry colname="col8">13</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Work station</oasis:entry>
         <oasis:entry colname="col2">Dual Intel Xeon 6154 (2017)</oasis:entry>
         <oasis:entry colname="col3">36</oasis:entry>
         <oasis:entry colname="col4">512</oasis:entry>
         <oasis:entry colname="col5">3.0–3.7</oasis:entry>
         <oasis:entry colname="col6">4</oasis:entry>
         <oasis:entry colname="col7">5</oasis:entry>
         <oasis:entry colname="col8">9</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Desktop II</oasis:entry>
         <oasis:entry colname="col2">AMD Ryzen 7970X (2023)</oasis:entry>
         <oasis:entry colname="col3">32</oasis:entry>
         <oasis:entry colname="col4">512</oasis:entry>
         <oasis:entry colname="col5">4.0–5.3</oasis:entry>
         <oasis:entry colname="col6">2</oasis:entry>
         <oasis:entry colname="col7">2</oasis:entry>
         <oasis:entry colname="col8">4</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <fig id="F1" specific-use="star"><label>Figure 1</label><caption><p id="d2e526">Examples of results from point, polygon and grid particle release groups computed during a single run, Sect. <xref ref-type="sec" rid="Ch1.S4.SS5"/>.   Plots give results at the end of a 4 d run. In the upper figures, the crosses in the upper left are the locations of a grid particle release, while the black polygon is the area covered by a polygon release. The crosses near the middle of the plots are locations of two point releases. <bold>(a)</bold> A snapshot of the particles: blue indicates particles that are moving and green particles  those   that are stranded by an outgoing tide. Dry cells are shown in brown, and  blue shading indicates water depth. <bold>(b)</bold> Particles are sized and coloured according to a decaying particle property, see  Sect. <xref ref-type="sec" rid="Ch1.S4.SS2.SSS2"/>. <bold>(c)</bold> Heat map of log particle counts with each grid cell from a release of 5.7 million particles from a pair of point sources. <bold>(d)</bold> Heat map of decaying particle property on a logarithmic scale.  The region shown is part of Tasman Bay (located at the northern end of New Zealand's South Island) and part of a hydrodynamic model of Cook Strait used in <xref ref-type="bibr" rid="bib1.bibx2" id="text.18"/>.  The heat maps in the lower plots are based on a user specified regular grid with a 100 m resolution. The code to run this example is provided in  Appendix <xref ref-type="sec" rid="App1.Ch1.S1"/> (Fig. <xref ref-type="fig" rid="FA1"/>).</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f01.png"/>

      </fig>

</sec>
<sec id="Ch1.S2">
  <label>2</label><title>Example</title>
      <p id="d2e567">Figure <xref ref-type="fig" rid="F1"/> presents basic examples of OceanTracker  outputs from a 3D simulation, with particles released from points, polygons and a regular grid, all within the same computational run, see  Sect. <xref ref-type="sec" rid="Ch1.S4.SS5"/>. The snapshot in Fig. <xref ref-type="fig" rid="F1"/>a displays particles coloured according to their status, moving (blue) or  stranded by the tide (green).  For the upper two plots in Fig. <xref ref-type="fig" rid="F1"/>, the two points each released 5 particles every 10 min, the polygon released 50 particles every 10 min and the grid released 2 particles every 3 h at depths between  2 and 0.5 m below sea-level datum. A total of 35 000 particles were released over the 4 d run.  Figure <xref ref-type="fig" rid="F1"/> presents results at the end of the run.</p>
      <p id="d2e580">Heat maps can be used to illustrate the  decay and dispersion of a pollutant from its source. OceanTracker  creates heat maps on the fly, by counting particles that fall within cells of a user-specified regular grid overlaid  on the hydrodynamic model grid during trajectory computation.   OceanTracker's  efficiency may enable particles counts large enough, such that sufficient numbers fall within each grid cell to create visually smooth heat maps.</p>
      <p id="d2e583">The two points in the lower plots of Fig. <xref ref-type="fig" rid="F1"/> each released 5000 particles every 10 min, giving  5.7 million particles by the end of the  4 d run. This  resulted in an average of 500 particles being counted within each grid cell to create the heat maps. This appears sufficient to give a smooth heat map for a 100 m resolution user specified grid. Creating this  heat map bypassed the need to record large volumes of particle trajectories (see gridded statistics in Sect. <xref ref-type="sec" rid="Ch1.S4.SS8"/> and code in Appendix <xref ref-type="sec" rid="App1.Ch1.S1"/>). Figure <xref ref-type="fig" rid="F1"/>d illustrates  a heat map of the average value of a user-added exponentially decaying  particle property.</p>
</sec>
<sec id="Ch1.S3">
  <label>3</label><title>OceanTracker – new features</title>
      <p id="d2e602">This section highlights some  of the new features of OceanTracker v0.5 that minimise user effort and its physics.</p>

      <fig id="F2" specific-use="star"><label>Figure 2</label><caption><p id="d2e607">Outline of the data flow through the two main data structures, fields and particle properties, from hydrodynamic model files to output. These data structure roles are outlined in Sect. <xref ref-type="sec" rid="Ch1.S4.SS2"/>. Each has “managers” to orchestrate operations on the variants of each data structure, to deliver particle properties to the solver. The steps carried out by the solver are shown in Fig. <xref ref-type="fig" rid="F3"/>.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f02.png"/>

      </fig>

<sec id="Ch1.S3.SS1">
  <label>3.1</label><title>Features reducing user effort</title>
      <p id="d2e627">In addition to computational speed,  OceanTracker  incorporates a number of features that significantly reduce the time and effort required to obtain results from the analysis of particle trajectories. The most significant features  are: <list list-type="bullet"><list-item>
      <p id="d2e632"><italic>Release groups.</italic> Simultaneous  release of multiple groups of particles can be done,  each with distinct locations and timing. This functionality enables users to obtain multiple results from a single computational run (see Fig. <xref ref-type="fig" rid="F1"/>, Sect. <xref ref-type="sec" rid="Ch1.S4.SS5"/> and Appendix <xref ref-type="sec" rid="App1.Ch1.S1"/>). This may eliminate the need for setting up and managing multiple runs to explore different release scenarios.</p></list-item><list-item>
      <p id="d2e644"><italic>On-the-fly particle statistics.</italic> OceanTracker  enables the simultaneous computation of  multiple statistics  while calculating trajectories, reducing post-processing effort. For instance, within the same run OceanTracker can generate heat maps for moving and settled particles while also calculating the connectivity between different areas defined by polygons, all within the same  trajectory computational run . These statistics are  based on counting particles within user-specified grids or polygons as trajectories are calculated. These “on-the-fly” statistics are calculated separately for each release group, e.g. individual heat maps for each release site, or connectivities between releases within  multiple polygons and  another set of polygons.</p></list-item><list-item>
      <p id="d2e650"><italic>Coding productivity.</italic>  User written custom components  can be added  to OceanTracker  by class inheritance  using the widely used  Python  language and NumPy package <xref ref-type="bibr" rid="bib1.bibx9" id="paren.19"/>.   In addition, computationally intensive tasks can often be accelerated  by simply adding  a Numba  decorator to their functions that use Python  and NumPy code  <xref ref-type="bibr" rid="bib1.bibx15" id="paren.20"/>. This  bypasses the  need to learn an additional language, such as C,  to computationally speed intensive operations (more on Numba in Sect. <xref ref-type="sec" rid="Ch1.S5"/>).</p></list-item><list-item>
      <p id="d2e664"><italic>Self-managing particle buffer.</italic>  Particle  properties such  as current location or status are stored in memory buffers, that expand dynamically as more particles are released. This removes the need to specify the maximum number of particles that will be used in advance. Memory buffers are  also dynamically consolidated as particles are killed to minimise the total memory required, allowing efficient computation  within limited memory.</p></list-item></list></p>
</sec>
<sec id="Ch1.S3.SS2">
  <label>3.2</label><title>Physics features </title>
      <p id="d2e678">Along with advection by water velocity, the  core physics features that affect particle motions  are outlined  below.  A coding user can easily adapt these to create required variants through class inheritance. <list list-type="bullet"><list-item>
      <p id="d2e683"><italic>Dispersion.</italic> A random walk mechanism simulates dispersion due to sub-hydrodynamic grid-scale processes  as a first order Markov process <xref ref-type="bibr" rid="bib1.bibx18 bib1.bibx29" id="paren.21"/>.  As in the  earlier version of OceanTracker, random walk can be incorporated using constant turbulent eddy viscosities in both the horizontal and vertical directions.  Optionally  in the new version, if vertical turbulent viscosity profiles are available in a 3D hydrodynamic model, the profiles are interpolated to calculate the size of the vertical random walk. This requires the inclusion of an additional vertical velocity that is equal to the vertical gradient of the  turbulent viscosity  <xref ref-type="bibr" rid="bib1.bibx33 bib1.bibx26" id="paren.22"/>. Note that the random walk is not applied as a step change in position but as an equivalent additional velocity.   This dispersion velocity modifier is calculated once for each full time step and  added to the hydrodynamic model's velocity at  each  Runge-Kutta (RK) sub-step, see Fig. <xref ref-type="fig" rid="F3"/> and Sect. <xref ref-type="sec" rid="Ch1.S4.SS6"/>.</p></list-item><list-item>
      <p id="d2e699"><italic>Re-suspension.</italic> Particles that settle on the seabed can be re-suspended if the flow is strong enough. The likelihood and height of re-suspension depends on the friction velocity (<xref ref-type="bibr" rid="bib1.bibx18" id="altparen.23"/>, their Eq. 9.28). Stronger flows increase the probability of re-suspension and cause particles to be lifted higher into the water column. The friction velocity is calculated from the near-bed velocity using a logarithmic velocity profile or, if available, from the bottom-stress field in the hydrodynamic model output   (<xref ref-type="bibr" rid="bib1.bibx18" id="altparen.24"/>, their Eqs. 5.5 and 5.6).</p></list-item><list-item>
      <p id="d2e711"><italic>Tidal stranding.</italic> Particles within  hydrodynamic model cells that become dry as the tide recedes remain stationary until the cell becomes wet again. Dry cells are “flagged” based on flags in the hydrodynamic model files. If a dry cell flag is not available, a cell is considered dry when the total water depth at its centre falls below a user-specified minimum value.</p></list-item><list-item>
      <p id="d2e717"><italic>Backtracking.</italic> OceanTracker  supports reverse-time simulations, which can be useful for identifying potential sources of particles arriving at a given location <xref ref-type="bibr" rid="bib1.bibx27" id="paren.25"/>.  Note that dispersion is not time-reversible, and this operates the same in the forward-direction time, producing outputs, like  heat maps, that offer a probabilistic view of sources <xref ref-type="bibr" rid="bib1.bibx27" id="paren.26"/>. </p></list-item><list-item>
      <p id="d2e730"><italic>Nested grids.</italic> To enable particle tracking beyond the open boundaries of a single hydrodynamic grid,  OceanTracker  can nest multiple inner grids within a broader, coarser outer grid. Particles exiting the open boundary of an inner grid are transferred to the outer grid, and particles on the outer grid which move inside an inner grid, are transferred to that grid. Each particle is aware of its current grid, allowing field values to be interpolated from the relevant grid.  The inner and outer grids may consist of any combination of structured or unstructured grids.</p></list-item></list> Beyond these core physical processes,  OceanTracker  allows users to optionally add particle behaviour by adding additional bio-physical processes, e.g. <xref ref-type="bibr" rid="bib1.bibx2" id="text.27"/>. This is achieved by adding given components to specific computational roles, such as velocity modifiers (e.g., sinking velocities) and trajectory modifiers (e.g., particle splitting or larval behaviours), as described in Sect. <xref ref-type="sec" rid="Ch1.S4.SS7"/> and <xref ref-type="sec" rid="Ch1.S4.SS6"/>.</p>
</sec>
</sec>
<sec id="Ch1.S4">
  <label>4</label><title>OceanTracker  structure</title>
      <p id="d2e752">At a high level, particle tracking code takes the Eulerian water velocity field from a hydrodynamic model and interpolates  these to provide  velocities at particle locations. These velocities are  then numerically integrated to give particle trajectories. There are also multiple other processes and computations that must be done at each time step, including the physical processes of dispersion, resuspension and tidal stranding. OceanTracker  decomposes  these processes into a series of components that fulfil specific roles, which are part of the <italic>computational pipeline</italic> outlined in Fig. <xref ref-type="fig" rid="F3"/> and Sect. <xref ref-type="sec" rid="Ch1.S4"/>.</p>
      <p id="d2e762">Figure <xref ref-type="fig" rid="F2"/> illustrates  the data flow in OceanTracker  from hydrodynamic model files through to outputs via its two main data structures: <italic>fields</italic> and <italic>particle properties</italic> (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS2"/>). Fields store data from the hydrodynamic model, such as water velocity, salinity and wind stress, as well as custom fields that are calculated from other fields, such as friction velocity.  Particle proprieties hold  data for each particle, which could include their current location, status  or  temperature.  These data structures enable access to, and operations on, their data, and they are collectively “managed” by their respective manager roles (see Sect. <xref ref-type="sec" rid="Ch1.S4.SS3"/>).</p>
<sec id="Ch1.S4.SS1">
  <label>4.1</label><title>Computational pipeline </title>
      <p id="d2e784">The computational pipeline    is  constructed from components assigned to specific <italic>roles</italic> within the pipeline that implement required tasks at each time step (Fig. <xref ref-type="fig" rid="F3"/>). From a user's perspective, the adaptability of OceanTracker  comes from the ability to customise which components  are added to each role to create a computational pipeline    to meet their specific needs. For example, a gridded 2D statistic can be added to the “particle statistics” role to create heat maps of particle locations on-the-fly.</p>
      <p id="d2e792">These components are constructed as Python  classes, which are dynamically added to the computational pipeline  during setup.  Time stepping within the computational pipeline  proceeds by calling the “update” method of each component within each role.  Some roles, such as dispersion and re-suspension, allow only one class to be added, while  others allow the addition of multiple classes. For  example, multiple trajectory modifiers  can be combined to give the required particle behaviour.</p>

      <fig id="F3" specific-use="star"><label>Figure 3</label><caption><p id="d2e798">Flow chart of time stepping to advect particles within the solver component in Fig. <xref ref-type="fig" rid="F2"/>. The figure illustrates the order in which components are updated within their roles in the computational pipeline.  These operation roles are outlined in Sect. <xref ref-type="sec" rid="Ch1.S4.SS2"/>. Green  “core roles”  only contain one component. Blue roles may contain one or more components that are looped through. For large runs, the most computational expensive steps are (1) finding the cell containing each particle and (2) evaluating the field interpolation; these steps are coloured yellow.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f03.png"/>

        </fig>

<sec id="Ch1.S4.SS1.SSS1">
  <label>4.1.1</label><title>Building a computational pipeline</title>
      <p id="d2e819">The computational pipeline  in OceanTracker  can be  fully assembled at startup from  parameters provided in either a  JSON or YMAL text file or a Python  dictionary, eliminating the need for direct coding if using only  inbuilt components  (see Fig. <xref ref-type="fig" rid="F4"/>b, c). Alternatively,  for simulations that add many classes (eg. hundreds of different release groups), coders can add their parameters programmatically within loops,  using helper wrapper methods. This wrapper provides two key methods “settings” and “add_class”  which enable users to construct a parameter dictionary using keyword arguments  (see Fig. <xref ref-type="fig" rid="F4"/>a). The resulting parameter dictionary follows the same structure as the JSON text file format shown in Fig. <xref ref-type="fig" rid="F4"/>c and is passed to OceanTracker  for execution.</p>
      <p id="d2e828">Users can configure top-level settings, such as the particle tracking time step and output directories, as well as component-specific settings. This trajectory calculation process constitutes a series of roles performed by a collection of components. Each component’s configuration typically includes the name of the Python class assigned to a particular role. Most component settings have default values defined within their respective Python classes, but  some class settings must be explicitly provided by the user.  During setup, all user-defined settings are automatically validated for type correctness and appropriate value ranges.  To run OceanTracker   a user must add at least a reader class and one release group class. In addition,  they must set the name of the folder where output will be written to (see Fig. <xref ref-type="fig" rid="F4"/>a).</p>

      <fig id="F4" specific-use="star"><label>Figure 4</label><caption><p id="d2e835">Minimal example of building a computational pipeline    <bold>(a)</bold> by coding, using  “helper” wrapper methods  “settings” and “add_class” methods to set up parameters and run code. A computational pipeline  can also be built from a text file with   user supplied parameters in either <bold>(b)</bold> YAML or <bold>(c)</bold> JSON standard formats.</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f04.png"/>

          </fig>

</sec>
<sec id="Ch1.S4.SS1.SSS2">
  <label>4.1.2</label><title>Computational steps</title>
      <p id="d2e861">Time stepping in OceanTracker  integrates particle velocity to compute trajectories. Within the computational pipeline, time stepping is divided into a series of roles, each performed by one or more components, see Fig. <xref ref-type="fig" rid="F3"/>. The update of each component is automated within the  time stepping of the computational pipeline, with updates grouped by role, see Fig. <xref ref-type="fig" rid="F3"/>. The order in which the roles are updated reflects their temporal dependence on the data from other roles.  For example, custom particle properties may be calculated from field particle properties and are therefore updated after the interpolated field properties.  The solver class  implements the time stepping by managing the classes within the computational pipeline  and the associated bookkeeping functions.</p>
      <p id="d2e868">The first step in the computational pipeline  involves looping over the release groups and releasing a single pulse  containing a user specified number of particles, if scheduled for the current time step. After this, each newly released particle's current horizontal and vertical cell are calculated. The solver then checks if the reader field time buffers contain the required time steps; if not, the reader fills the buffers and any custom fields are calculated from the newly read time steps.   Next,  any additional particle velocities  are added together to give a total of “velocity modifiers” (e.g. a fall velocity) and to this total a random walk dispersion is added as an equivalent velocity, see Sect. <xref ref-type="sec" rid="Ch1.S3.SS2"/>. Particles are then advected by RK integration based on the sum of the water velocity and the total of the velocity modifiers. At each sub-step, their current horizontal and vertical cells and  barycentric coordinates are updated, enabling  each particle's velocity to be interpolated to their locations. By default, fourth order RK time integration is used, although first and second order RK are also available.</p>
      <p id="d2e874">Once particles are at their new locations, additional changes to particle status or positions due to resuspension or specified trajectory modifiers are made. These modifiers add  any additional particle movements or changes to their status, e.g. settling in a polygon or culling.  To enable interpolation after these movements,   particle horizontal and vertical cells and  barycentric coordinates are updated. Then, all field-derived particle properties are then looped over and updated by interpolation.  Subsequent steps include updating any custom particle properties, calculating any particle statistics that have been added to the computational pipeline, and then finally writing out time series of particle trajectories and particle properties if this has been requested.</p>
</sec>
<sec id="Ch1.S4.SS1.SSS3">
  <label>4.1.3</label><title>Mechanisms enabling computational pipeline  adaptability</title>
      <p id="d2e885">The following mechanisms  provide the flexibility needed to build the  computational pipeline  dynamically at run time and enable coders to extend OceanTracker:</p>
      <p id="d2e888"><list list-type="bullet">
              <list-item>

      <p id="d2e893"><italic>Dynamic importing.</italic>   Components for all roles are dynamically imported at runtime, allowing users to build custom computational pipelines. To specify a component, users provide a “class name” setting (see  Sect. <xref ref-type="sec" rid="Ch1.S4.SS1.SSS1"/>), which follows standard Python class referencing conventions. Core roles have default class names, and all built-in OceanTracker classes can be imported using a shortened version of their full names. Users can also import customised variants of Python classes into any of the roles in the computational pipeline, enabling them to modify core functionality  or add optional functionality (e.g. dispersion models, trajectory modifiers or on-the-fly statistics).</p>
              </list-item>
              <list-item>

      <p id="d2e903"><italic>Inheritance.</italic>  New component variants can be created by inheriting from an existing  class.  Users can modify computations by overwriting specific methods, such as the “update” method, while retaining inherited configuration settings and the  infrastructure than manages bookkeeping operations. This approach allows for incremental modifications of the parent class.</p>
              </list-item>
              <list-item>

      <p id="d2e911"><italic>Internal naming.</italic>  To simplify access to the main data structures outlined in Fig. <xref ref-type="fig" rid="F2"/> OceanTracker  uses standardised names for instances of the field and particle property components. These instances  are held in globally accessible field and particle property   Python   dictionaries. Additionally, both reader-sourced and custom user-defined fields automatically generate particle properties of the same name, by  interpolation at each time step. Essential fields like “water velocity” and “water depth” are mapped to  corresponding variable names in the hydrodynamic model files by the reader component. Vector fields may require mapping multiple file variables to a single internal name.   Users can also assign names to optional components for easier reference within their output files and code.</p>
              </list-item>
            </list></p>
</sec>
</sec>
<sec id="Ch1.S4.SS2">
  <label>4.2</label><title>Data structures within the computational pipeline</title>
      <p id="d2e929">This section outlines OceanTracker's  two main data structures, <italic>fields</italic> and <italic>particle properties</italic>,  see Fig. <xref ref-type="fig" rid="F2"/>, while  Sect. <xref ref-type="sec" rid="Ch1.S4.SS3"/> describes their management.</p>
<sec id="Ch1.S4.SS2.SSS1">
  <label>4.2.1</label><title>Field role</title>
      <p id="d2e949">The spatial fields stored within the   output of the hydrodynamic model are the foundation of offline particle tracking and are stored and accessed using the “field” data structure, see Fig. <xref ref-type="fig" rid="F2"/>. Water velocity  is a crucial spatial field for particle tracking, but there may be many other relevant fields, such as water depth, tide or wind-stress.  There are also  grid variables associated with the fields, including nodal locations, triangulation and cell adjacency.  These are also accessed through a map that links their name in the hydrodynamic model output to standard internal names.</p>
      <p id="d2e954">Fields are read from hydrodynamic model files as described in Sect. <xref ref-type="sec" rid="Ch1.S4.SS4"/>. Users can also integrate custom fields into the computational pipeline by deriving new values from existing fields. For example, a friction velocity field can be computed from the 3D velocity field near the seabed to determine whether a particle can be re-suspended by the flow.</p>
</sec>
<sec id="Ch1.S4.SS2.SSS2">
  <label>4.2.2</label><title>Particle property role</title>
      <p id="d2e968">There are three types of particle properties that store the  values for each particle and enable high level operations on these values as shown in Fig. <xref ref-type="fig" rid="F2"/>b. These properties can have different types  depending on how they are updated at each time step, and they may be integer,  scalars or vectors. <list list-type="bullet"><list-item>
      <p id="d2e975"><italic>Field particle properties</italic> store field values at each particle location and are updated by interpolating a field data structure, e.g. water velocity.</p></list-item><list-item>
      <p id="d2e981"><italic>Core particle properties</italic> are updated within the  core code, i.e. not by their own  class update method. Examples include particle location and  bookkeeping particle properties, such as  particle ID,  release group ID, or particle status, e.g. whether computationally alive, on the sea bed, stranded by the tide etc.</p></list-item><list-item>
      <p id="d2e987"><italic>Custom particle properties</italic> store values calculated from other particle properties. For example, the “inside-polygons” class uses the location particle property to determine whether any user-given polygon contains each particle. These are updated by calling their classes's update method.</p></list-item></list> Some examples of currently available custom particle properties are: <list list-type="bullet"><list-item>
      <p id="d2e995"><italic>Age decay</italic> models an exponentially decaying particle load, such as bacteria,  based on the core “age” particle  property</p></list-item><list-item>
      <p id="d2e1001"><italic>Inside polygon</italic> records the polygons, from a given set that contain a particle. This information is used to compute polygon connectivity statistics or to determine events such as larval settlement when a particle drifts over a reef.</p></list-item><list-item>
      <p id="d2e1007"><italic>Total water depth</italic>  represents the sum of tidal elevation and water depth. This property is useful for particles whose behaviour differs in varying water depths, such as larvae that only settle in shallow water, even if a cell is not completely dry.</p></list-item></list></p>
</sec>
</sec>
<sec id="Ch1.S4.SS3">
  <label>4.3</label><title>Manager roles</title>
      <p id="d2e1022">Instances of field and particle properties store, update,  and manage access to individual data values. Higher level operations on all the individual instances are orchestrated by  “managers” that automate key processes (see Fig. <xref ref-type="fig" rid="F2"/>). <list list-type="bullet"><list-item>
      <p id="d2e1029"><italic>Fields group manager role.</italic> Orchestrates the setup, reading,  updating and interpolation of fields, along with setting up the required grid variables, such as nodal locations, triangulation and the adjacency matrix. It also manages the process of finding each particle's current horizontal and vertical cell, and updates the status of  dry cells. By default, the fields group manager automatically adds a particle  property with the same internal name as the field to the computational pipeline, which are interpolated at each time step. When nesting  small fine-scale grids within a larger  outer grid, a special master fields group manager orchestrates a set of  field group managers, each associated  with a hydrodynamic model grid.  It  associates each particle with the appropriate grid, so that the water velocity and other particle properties can be interpolated from  the fields of that grid.  At each time step, any  particles crossing the open boundaries of the inner grid are associated with  the outer grid. Conversely, any particles on the outer grid that move inside an  inner grid are then associated with that grid. </p></list-item><list-item>
      <p id="d2e1036"><italic>Particle group manager role.</italic> Manages the release of particles and the updating of all three types of particle properties.  It also manages the dynamic memory buffers that hold the individual particle property values, expanding them  as needed when particle numbers grow and also culls computationally dead particles that are no longer of interest. Additionally, if required, this manager handles the writing of time series of particle trajectories and properties.</p></list-item></list></p>
</sec>
<sec id="Ch1.S4.SS4">
  <label>4.4</label><title>Reader role</title>
      <p id="d2e1049">The primary function of the reader is to convert hydrodynamic model file variables, which may be stored in different files, into standardised internal formats.  The reader builds a catalogue of all file variables and which files contain them.  From this catalogue, the reader identifies if the hydrodynamic output is a known format and imports the associated reader class.   It identifies known formats  by looking for a set of expected signature variables  within the files. The file variables are then mapped to standard internal variable names.  Field variables are categorised  as  time varying, vector or 3D. The reader does this by determining  if each variable's named dimensions contains dimensions associated with these attributes for the known  hydrodynamic model. For vector variables, e.g. water velocity, several file variable names can be mapped to a single internal vector variable, allowing vector fields to be treated as a single variable within computations.</p>
      <p id="d2e1052">To ensure files for time-varying variables are read in the correct order, files are sorted into time order, using the hydrodynamic model's time variable. Thus OceanTracker  is not reliant on a file naming convention to determine file order. Each variable has its own list of files, which enables the reader to accommodate hydrodynamic models where variables are split between files, as is the case for SCHISM version 5 output files and NEMO/GLORYS output files.</p>
      <p id="d2e1055">The reader loads fields into memory buffers as they are needed. For time-dependent variables it reads multiple  time steps into buffers, if the  next time step is not already in the buffer. By default, the buffer maintains 24 hydrodynamic model time steps in memory.  This default number of steps balances reducing wall time, by reading in multiple time steps at the same time, while only requiring of  100s of megabytes of computer RAM for each buffered hindcast variable. The user can  reduce this buffer size if RAM is limited.</p>
      <p id="d2e1058">If needed, the reader converts the non-nodal values to values at the nodes of the triangles through interpolation. Readers and interpolators that are based on a hydrodynamic model's native grid and  do not need this conversion, could be developed in the future. To facilitate automation, the reader stores all fields in 4D arrays with dimensions (corresponding to time, node, depth layer and vector components).</p>
      <p id="d2e1062">The unstructured SCHISM and DEFLT3D-FM grids contain a mixture of triangular and quad cells. For these formats and regular grid formats, quad cells are divided into triangles. This division simply takes the first three nodes of a quad cell as one triangle, then creates a new triangle from the third, fourth and first nodes. Modifying the “triangulation” of the hydrodynamic model grid by splitting quad cells is only done  once at the start of the run and it has no impact on the time spent reading the hindcast. It also adds little to the memory used, as the underlying field values are still stored as nodal values. By increasing the number of cells to search, quad cell splitting  may sightly increase the time taken to locate the cell containing each particle. However, it simplifies the code by only requiring  one type of cell to search.</p>
<sec id="Ch1.S4.SS4.SSS1">
  <label>4.4.1</label><title>Interpolator role</title>
      <p id="d2e1072">The interpolator serves as the link between  the hydrodynamic model's fields held by the reader and the corresponding particle properties. The interpolator has two functions: (1) determining each particle's current horizontal and vertical cell; and  (2) interpolating  field values at the triangles' vertices to each particle's location, which are then stored as particle properties.  In the horizontal,  OceanTracker   currently uses linear interpolation in unstructured triangular grids from nodal values,  utilizing a particle's Barycentric coordinates within their current triangle, along with linear interpolation between hydrodynamic model  time steps.</p>
      <p id="d2e1075">Vertical interpolation to the position of each particle  is also linear between the layers of the  hydrodynamic model and between time steps. The one exception to linear vertical interpolation is  the water velocity within the seabed layer. Here,  vertical interpolation is based on a logarithmic layer,   ensuring that particles near the seabed experience a more realistic velocity profile than the linear variation in higher layers <xref ref-type="bibr" rid="bib1.bibx18" id="text.28"/>.</p>
      <p id="d2e1081">The interpolator supports linear interpolation for several vertical grids, Sigma grid (ROMS, Deft-3D FM) and fixed <inline-formula><mml:math id="M1" display="inline"><mml:mi>z</mml:mi></mml:math></inline-formula> levels (Deft-3D FM, NEMO/GLORYS), which apply the same vertical grid at all locations.  It also supports grids with  spatially varying layer thicknesses (SCHISM, FVCOM). This includes SCHISM's LSC vertical grid, where the number of vertical layers also varies spatially.</p>
</sec>
</sec>
<sec id="Ch1.S4.SS5">
  <label>4.5</label><title>Particle release groups role</title>
      <p id="d2e1100">A “particle release group” introduces new particles  into the computational pipeline.  Each group generates new particles at specified locations,  which are released at user set intervals or times with a specified number per release, or “pulse size”. Multiple release groups can be added, each with their  specific release locations, release schedules or pulse size. Release groups can be:</p>
      <p id="d2e1103"><list list-type="bullet">
            <list-item>

      <p id="d2e1108"><italic>Point release.</italic>  Particles are spawned  from a set of specified locations and depths, such as the two crosses in the middle of the plots in Fig. <xref ref-type="fig" rid="F1"/>. A radius  release class,  releases  particles  randomly within a circular area around each point.</p>
            </list-item>
            <list-item>

      <p id="d2e1118"><italic>Polygon release.</italic> Particles are spawned at random locations within a user-defined 2D polygon,  e.g.  mid-right of the upper plots in Fig. <xref ref-type="fig" rid="F1"/>.</p>
            </list-item>
            <list-item>

      <p id="d2e1128"><italic>Grid release.</italic> Particles are spawned from points of a user specified regular grid,  as on the upper left of the upper plots in Fig.  <xref ref-type="fig" rid="F1"/>.</p>
            </list-item>
          </list></p>
      <p id="d2e1137">Particles will not be released on land, e.g. where a release polygon overlaps land   as in Fig. <xref ref-type="fig" rid="F1"/>a. By default, particles are not released within cells that are currently dry due to the outgoing tide. For all types it is possible to restrict releases so that they are randomly distributed  within a given vertical layer, at fixed distance from seabed or sea surface or to locations where water depth is within a given range.</p>
</sec>
<sec id="Ch1.S4.SS6">
  <label>4.6</label><title>Velocity modifiers role </title>
      <p id="d2e1150">Additional bio-physical processes can be added to the water  velocity experienced by each particle.  These are incorporated into the computational pipeline  as  “velocity modifiers”, which are added to the water velocity for use in the time integration, see Fig. <xref ref-type="fig" rid="F3"/>.  Terminal velocity is an example of an in-built modifier that adds the terminal sinking or buoyant velocity to the ambient water velocity, either as a uniform value or a particle specific value drawn from a normal distribution.</p>
</sec>
<sec id="Ch1.S4.SS7">
  <label>4.7</label><title>Trajectory modifiers  role </title>
      <p id="d2e1163">Components in the “trajectory modifiers” role implement  bio-physical processes that alter the status or movement of particles at each time step. Examples of inbuilt modifiers include: <list list-type="bullet"><list-item>
      <p id="d2e1168"><italic>Settlement</italic> allows particles to settle within user defined polygons, e.g. larvae to settle on reefs. The trajectory is modified by changing its status to “stationary”.</p></list-item><list-item>
      <p id="d2e1174"><italic>Floating</italic> sets each particle's vertical position to that of the free-surface height at its current location.</p></list-item><list-item>
      <p id="d2e1180"><italic>Culling</italic> sets the status  of a random fraction of particles for a given status (e.g. on the bottom) to be dead, allowing them to be removed from subsequent  computations and particle statistics.</p></list-item><list-item>
      <p id="d2e1186"><italic>Splitting</italic> splits particles in two to simulate e.g. reproduction, at a set rate or probability. This can rapidly generate very large numbers of particles, which may need to be contained by a culling mechanism <xref ref-type="bibr" rid="bib1.bibx24" id="paren.29"/>.</p></list-item></list></p>
</sec>
<sec id="Ch1.S4.SS8">
  <label>4.8</label><title>On-the-fly particle statistics roles </title>
      <p id="d2e1202">OceanTracker  employs an on-the-fly particle counting approach to produce particle statistics during the computational run. This produces a data output volume that is independent of the total number of released particles. Currently available spatial particle statistics are:</p>
      <p id="d2e1205"><list list-type="bullet">
            <list-item>

      <p id="d2e1210"><italic>Gridded</italic>  counts particles inside the cells of a regular grid at user-specified time intervals. These are commonly used to generate heat maps (see  Fig. <xref ref-type="fig" rid="F1"/>).</p>
            </list-item>
            <list-item>

      <p id="d2e1220"><italic>Polygon</italic>  computes the physical connectivity matrix between each release group and user-defined polygonal regions.</p>
            </list-item>
          </list></p>
      <p id="d2e1227">Both gridded and polygon-based statistics can be recorded using two approaches: <list list-type="bullet"><list-item>
      <p id="d2e1232">Time series counts particles at specified time intervals, producing time-based heat maps or connectivity data.</p></list-item><list-item>
      <p id="d2e1236">Age bin series categorises particles into age bins within each spatial region, enabling the generation of age-based heat maps or connectivity matrices.</p></list-item></list></p>
      <p id="d2e1239">Users can filter which particles are counted,  for example they can restrict statistics to particles within a specific vertical range or to particles resting on the seabed. Multiple on-the-fly statistics components can be added, which  allows, for example, separate particle counts for different depth layers.</p>
      <p id="d2e1243">Beyond counting particles, average values of particle properties can also be computed within the spatial bins. For instance, users can track average water temperature of particles within a given grid cell or polygon.</p>
</sec>
<sec id="Ch1.S4.SS9">
  <label>4.9</label><title>Integrated models</title>
      <p id="d2e1255">Users may need to combine multiple roles to create  higher level functionality. OceanTracker  supports this aggregation of roles into a single component,  enabling sharing of specialised combined functionality amongst users. These integrated models only require the parameters essential for executing their higher-level function; the model manages the intricacies of assigning classes to  appropriate roles to complete the overall function.  Currently, there is one integrated model: <list list-type="bullet"><list-item>
      <p id="d2e1260"><italic>On-the-fly Lagrangian Coherent Structures.</italic> These structures identify   regions of convergence or divergence within a fluid flow over time.  OceanTracker  calculates   time series of Finite-Time Lyapunov Exponents (FTLE)  <xref ref-type="bibr" rid="bib1.bibx8 bib1.bibx10" id="paren.30"/>, which can be used to derive characteristics of Lagrangian Coherent Structures. The FTLE  calculation uses  the largest Eigenvalue of the strain tensor after specified lag times. This process involves releasing particles on a regular grid and calculating the distances between adjacent released particles. The user only needs to designate one or more grid locations and the required time lags. The integrated model sets up new regular grid releases at regular time intervals and calculates the FTLE on-the-fly for each grid and lag, eliminating the need to record and post process large volumes of particle trajectories.</p></list-item></list></p>
</sec>
</sec>
<sec id="Ch1.S5">
  <label>5</label><title>Computational speed</title>
      <p id="d2e1278">The primary features contributing  to OceanTracker's  computational speed measured by wall time  are: <list list-type="bullet"><list-item>
      <p id="d2e1283"><italic>Finding cells containing particles.</italic> For unstructured grids, significant computational time is spent determining the horizontal  and vertical cells containing each particle. OceanTracker  uses the particle history to improve the speed of its cell search. Short triangle and vertical walk algorithms improve the search speed by an order of magnitude compared to long triangle walks or KDE tree approaches, as outlined in <xref ref-type="bibr" rid="bib1.bibx32" id="text.31"/>.</p></list-item><list-item>
      <p id="d2e1292"><italic>Calculate once, use many times.</italic> To avoid repetition in performing  key computational tasks,  a particle's current triangle, barycentric coordinates, vertical cell and fraction of the vertical cell are recorded at each time step. These  values are then used repeatedly  to interpolate multiple fields to the particle's location. Adopting the “calculate once,  use many times” methodology significantly improves the efficiency of interpolations <xref ref-type="bibr" rid="bib1.bibx32" id="paren.32"/>.</p></list-item><list-item>
      <p id="d2e1301"><italic>Dynamic particle buffer.</italic>  Particle proprieties are stored in memory buffers, which are expanded as needed to accommodate newly released particles.  System performance and memory utilisation can be optimised by periodically  culling dead particles, e.g. those too old to be of interest.  When more than 25 % are flagged as dead, particle memory buffers are compacted by removing the dead particles, which can significantly improve performance.</p></list-item><list-item>
      <p id="d2e1307"><italic>Uniform  sigma grid.</italic> For 3D SCHSIM and FVCOM models layer thicknesses vary temporally and spatially, making the search for each particle's  vertical cell the most time-consuming step. Optionally, for these models, the vertical cell search  can be made 5 times faster by vertically linearly interpolating to spatially uniform sigma-layer fractional thicknesses when filling the reader's buffers. With uniform fractional thicknesses,  finding the vertical cell is significantly quicker using rounding within a pre-calculated layer map, followed by a single correction step.  For large numbers of particles, the time spent re-interpolating to this near-native vertical grid when reading the hydrodynamic model's files, is small compared to the time saved by the faster vertical cell search.  Models  that use a sigma vertical grid can directly exploit a faster approach to the vertical cell search with no additional effort.  Though vertical interpolation  means particle motions are not strictly a result of velocities of the native hydrodynamic model grid, but rather an approximation of those velocities.</p></list-item><list-item>
      <p id="d2e1313"><italic>Numba.</italic>    Particle tracking involves complex operations with nested loops, requiring per-particle decisions at each time step. To significantly accelerate these computations, OceanTracker   leverages Numba, a Python extension for Just-In-Time (JIT) compilation <xref ref-type="bibr" rid="bib1.bibx15" id="paren.33"/>.  Numba optimises performance by compiling functions at runtime using a simple function decorator.  Numba achieves execution speeds comparable to C or Cython while maintaining Python’s ease of use. Once a function is compiled, the optimised code is reused for subsequent calls, eliminating further compilation overhead. However, a drawback of using Numba is that compiling the many required functions adds 20–30 s to OceanTracker's  startup time. This delay can be minimised by enabling optional caching, which stores the compiled Numba code on disk for reuse between runs.</p></list-item><list-item>
      <p id="d2e1322"><italic>Field storage precision.</italic> Hydrodynamic models typically store field values as 32 or 64 bit floating point numbers.  However, 64 bit floats require twice the memory of 32 bit floats.  More importantly, these fields must be transfered from computer RAM to CPU registers before they are used to calculate interpolated values. This transfer may limit the speeds at which computations can be done. To reduce transfer time, OceanTracker  stores all hydrodynamic model fields at 32 bit floats, regardless of how they are recorded by the hydrodyamic model.</p></list-item><list-item>
      <p id="d2e1328"><italic>Parallelisation.</italic>  OceanTracker  spreads most demanding computations across all available physical computer cores, exploiting Numba's multithreading capabilities. Specifically, when iterating over particles OceanTracker  uses Numba's parallel for-loop,  to automatically distribute particle computations across multiple physical cores.  All threads access the same field variable memory;  thus each hydrodynamic model time step is only read once during the run. This makes  OceanTracker  suitable for running on a single computer or single node of a super-computer where cores share the same memory.</p></list-item></list></p>
<sec id="Ch1.S5.SS1">
  <label>5.1</label><title>Input/Output speed</title>
      <p id="d2e1340">The speed at which the hydrodynamic model can be read may contribute significantly to total run times. The times in Table <xref ref-type="table" rid="T1"/> are based on reading from local disks. Reading model data from  internet sources would be  expected to be slower.  In the Table <xref ref-type="table" rid="T1"/>  examples, the proportion of read time varies from 36 % for basic Laptop I to 50 % for  high end Desktop II.  These values are for 1 million particles, larger numbers would dilute these read times. For particle numbers where 50 % or more of time is spent reading the hydrodynamic model on a user's hardware,  the number of particles could be doubled to obtain better statistics, while only increasing wall time by 25 %.</p>
      <p id="d2e1347">For large numbers of particles, the time spent writing particle tracks can also  add significantly to run times; particularly  as writing tacks is typically a serial process, whereas trajectory computations can be parallelised. The times in  Table <xref ref-type="table" rid="T1"/> do not include the time to write tracks. This potentially significant time was part of the reason behind developing  on-the-fly  statistics, as this  eliminates the  necessity to write particle tracks for subsequent analysis.</p>
</sec>
<sec id="Ch1.S5.SS2">
  <label>5.2</label><title>Speed comparisons</title>
      <p id="d2e1360">The computational performance of OceanTracker   (version 0.5.1.1) and its closest alternative OpenDrift   (version 1.11.1) <xref ref-type="bibr" rid="bib1.bibx4" id="paren.34"/> are compared in Fig. <xref ref-type="fig" rid="F6"/> for structured and unstructured grids.  A similar comparison has been reported in <xref ref-type="bibr" rid="bib1.bibx32" id="text.35"/>. The base code  has since undergone a significant overhaul,  from  using NumPy and SciPy for critical computational steps to using Numba. This transition has facilitated the implementation of far more particle-specific decision processes that enhance the realism of their movement.  A speed comparison with   Parcels (version 3.0.6) <xref ref-type="bibr" rid="bib1.bibx5" id="paren.36"/> is also included in Fig. <xref ref-type="fig" rid="F6"/>. Both Parcels and OceanTracker  can exploit parallelisation,  with Parcels using processing  via MPI, while OceanTracker  uses multithreading via Numba. OpenDrift does not natively  support parallelisation but can be used to run multiple independent cases, each  separately  reading the hydrodynamic model,  an approach referred to as “embarrassingly parallel”.  Thus,  the comparisons presented here show performance using only a single process and thread to provide comparable results across the three models. Parcels currently only supports structured grids, so could only be compared with OceanTracker  for this type of grid.</p>
      <p id="d2e1376">All comparisons use 3D hydro-dynamic models. The first is a high-resolution unstructured mesh estuarine model described in <xref ref-type="bibr" rid="bib1.bibx24" id="text.37"/>, built using SCHISM <xref ref-type="bibr" rid="bib1.bibx34" id="paren.38"/>. This  model features 32 000 horizontal nodes and employs terrain-following coordinates for the vertical grid, with up to 20 levels. Its spatial resolution  varies from 5 to 1400 m. The second model is a regular grid ROMS model presented in <xref ref-type="bibr" rid="bib1.bibx16" id="text.39"/>,  consisting of about 250 000 nodes and 40 <inline-formula><mml:math id="M2" display="inline"><mml:mi>z</mml:mi></mml:math></inline-formula>-grid type vertical levels with a uniform horizontal resolution of 7 km. The third model is a large NEMO/GLORYS model of the Baltic Sea <xref ref-type="bibr" rid="bib1.bibx11" id="paren.40"/>, which contains about 600 000 horizontal nodes and 56 <inline-formula><mml:math id="M3" display="inline"><mml:mrow><mml:msup><mml:mi>z</mml:mi><mml:mo>*</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula>-grid type vertical levels. All hydrodynamic models had a temporal resolution of 1 h.</p>
      <p id="d2e1410">OceanTracker and OpenDrift were compared using dispersion, while the comparison to Parcels using the NEMO data set were performed using advection only, due to a lack of a native 3D dispersion method in Parcels.  For Parcels the “JITParticle” class was used as the advection kernel. All particle  trackers used 4th order Runge-Kutta (RK4) time integration. The computations covered 10 model days using 5 min time steps, resulting in a total of 2880 time steps. Particles were released at 30 locations, with total particle numbers varying from 1000 to 1 million particles per model run. Note that OpenDrift by default uses a different time step size for its vertical diffusion calculations of 1 min. We chose not to override this default behaviour as OpenDrift's internal timing information shows that the  computational cost did not dominate the total runtime (<inline-formula><mml:math id="M4" display="inline"><mml:mrow><mml:mo>&lt;</mml:mo><mml:mn mathvariant="normal">10</mml:mn></mml:mrow></mml:math></inline-formula> %) and is similar to what we expect based on our experience with OceanTracker.</p>
      <p id="d2e1423">The computational experiments were performed on the desktop computer “imf20-l01”, which was equipped with an Intel(R) Core(TM) i5-10500 CPU @ 3.10 GHz and 16 GB RAM.   The relative performace of OceanTracker  and the other two codes may differ on other hardware. The source code that has been used to perform this speed tests is publicly available (see Code and data availability).</p>

      <fig id="F5" specific-use="star"><label>Figure 5</label><caption><p id="d2e1429">Computational comparison speed for  OceanTracker with OpenDrift for   structured (ROMS)  and unstructured (SCHISM)  grids, and with Parcels for structured (NEMO/GLORYS) grids.   <bold>(a)</bold> Comparison of   the  total   run   time   measured  as   wall time. <bold>(b)</bold> Normalized     computational   time  per   particle per   RK4   time   step.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f05.png"/>

        </fig>

      <fig id="F6"><label>Figure 6</label><caption><p id="d2e1446">Comparison of the relative speed up from OceanTracker  compared to OpenDrift  and Parcels for the different data sets and particle sizes. The green line represents the baseline performance equal to  OceanTracker.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f06.png"/>

        </fig>

      <p id="d2e1455">Figure <xref ref-type="fig" rid="F5"/>a displays the total run time across OceanTracker  and OpenDrift  (structured and unstructured grids)  and Parcels  (structured grid). Figure <xref ref-type="fig" rid="F5"/>b  illustrates the scaling of both models in terms of time per particle per RK4 time step. This demonstrates that OceanTracker  can process around a million particles per second per time step on a single desktop core.</p>
      <p id="d2e1462">For the SCHISM and ROMS data set, model setup times are the main contributor to OceanTracker's  run time for  particle counts  up to 10 000.   For these small numbers, OpenDrift's   minimum run time was approximately 2 min, while OceanTracker's  completed these runs in 30 s.  For particle counts exceeding  10 000 setup times become negligible for  both models. In 1 million particle simulations  OceanTracker  is up to 35 times faster than OpenDrift  as shown in Fig. <xref ref-type="fig" rid="F6"/>, resulting  in total run times of 15 h for OpenDrift  and 30 min for OceanTracker.</p>
      <p id="d2e1467">OceanTracker  treats structured grids as unstructured grids by triangulating them, whereas OpenDrift  uses a native reader for the structured ROMS grids. Surprisingly, the native ROMs reader of OpenDrift  does not significantly enhance its performance  with structured grids.</p>
      <p id="d2e1471">For the NEMO/GLORYS case, which uses a large data set with over 3 million spatial nodes, model setup times and reading the data remains the dominant cost for cases with particle counts of below 100 000. For larger particle counts over 1 million, OceanTracker  performs approximately twice as fast as Parcels. To our knowledge, this demonstates that OceanTracker  is the fastest general-purpose particle tracker for both structured and unstructured grids.</p>
</sec>
<sec id="Ch1.S5.SS3">
  <label>5.3</label><title>Multi-core scaling</title>
      <p id="d2e1482">OceanTracker  utilises use Numba's multi-threading capability for parallelisation across mutiple cores.  Figure <xref ref-type="fig" rid="F7"/> shows the  multi-threading scaling for two machines (note the logarithmic <inline-formula><mml:math id="M5" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula>-axis). The first is the high-performance computer “Levante” based at the DKRZ (German Climate Computing Center). It is equipped with two AMD 7763 CPUs @ 2.45–3.5 GHz, containing 128 physical cores in total and 256 GB of RAM. The second is  “imf20-l01”, a desktop computer that was also used for the single  thread speed tests. Scaling quickly becomes sub-linear for threads counts greater than two, presumably due to bandwidth limitations between the CPU memory caches and the much larger Random Access Memory (RAM) when accessing particle or hindcast data. This bottleneck becomes strongly limiting on Levante for thread counts above 32, with no improvements between 64 and 128 threads. The latter is expected because multi-threading is limited to only one of the two available physical CPUs. This data access bottleneck indicated the need to improve how speed scales with the number of threads. This could be achieved by restructuring the code to slice up the hydrodynamic hindcast into sub-domains distributed across threads, or by redesigning how particle data is ordered in memory <xref ref-type="bibr" rid="bib1.bibx12" id="paren.41"/>.</p>

      <fig id="F7"><label>Figure 7</label><caption><p id="d2e1499">Scaling of computation speed when run in parallel mode. The vertical axis is the speed-up  relative to single thread runs. Comparisons were performed on “imf20-l01”, a standard office desktop machine, and on node of Levante, a high-performance computer, with 128 CPU cores for particle counts of 1 and 10 million (<inline-formula><mml:math id="M6" display="inline"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M7" display="inline"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">7</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula>). Note the logarithmic scaling on the <inline-formula><mml:math id="M8" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula>-axis.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f07.png"/>

        </fig>

</sec>
</sec>
<sec id="Ch1.S6">
  <label>6</label><title>Discussion</title>
      <p id="d2e1554"><xref ref-type="bibr" rid="bib1.bibx32" id="text.42"/> found that OceanTracker  performs significantly faster than OpenDrift  when working with unstructured grids. Here, Fig. <xref ref-type="fig" rid="F5"/> demonstrates that the new version of OceanTracker   maintains a speed advantage on structured grids, despite treating them as unstructured. This result is somewhat surprising since,  as cell identification is typically much faster in structured grids because it only requires  rounding coordinates. The observed performance difference suggests that the advantage is not due to differences in cell-finding algorithms,  but rather other aspects of how the two models handle computations. Note that for the speed comparisons we focused exclusively on computational time as our metric. Because all models internally show significant difference in their implementations it was not possible to configure them to perform the exact same computation. Hence, for future comparisons it would be desirable to compare computational cost while normalising for model accuracy.</p>
      <p id="d2e1561">For unstructured grids,  the original OceanTracker  was over two orders of magnitude faster than OpenDrift  <xref ref-type="bibr" rid="bib1.bibx32" id="paren.43"/>. The latest version of OceanTracker  is an order of magnitude slower than its predecessor. However, this trade-off comes with significantly improved physics, see Sect. <xref ref-type="sec" rid="Ch1.S3.SS2"/>. The enhancements require more computationally intensive, particle-by-particle decisions regarding movement. While these decisions introduce slower branching code, they result in more realistic particle behaviour and improved simulation accuracy.</p>
      <p id="d2e1569">To validate OceanTracker's  accuracy, we performed a standard test using a circular flow with a known period, as recommended by <xref ref-type="bibr" rid="bib1.bibx29" id="text.44"/>. A 2D synthetic eddy test was conducted, featuring a peak flow of 1 m s<sup>−1</sup> at a 10 km radius with a 12 h period. With 15 min RK4 time steps, particles released 10 km from the centre deviated by less than 0.3 m from their initial radius after 10 d, demonstrating high accuracy.</p>
<sec id="Ch1.S6.SS1">
  <label>6.1</label><title>Design compromises</title>
      <p id="d2e1594">The  design of OceanTracker  makes a number of compromises between speed, steepness of the adoption curve, adaptability  and  the  complexity of its implementation code.  Though speed was high priority, in a number of places other aspects had higher priority. The below outlines some of OceanTracker's  design compromises. <list list-type="bullet"><list-item>
      <p id="d2e1599"><italic>Class modularity vs speed.</italic> The computational pipeline  in Fig. <xref ref-type="fig" rid="F3"/> is a series of steps, where an operation needs to be completed for all particles, before moving on to the next operation. This approach moves all particles one operation at a time along the computational pipeline. A downside of this approach is that the same particle property data may be moved between RAM and CPU for several  times per time step, slowing  code, i.e becomes memory-bound. An alternative is to complete all operations of the computational pipeline  for each particle, before moving on to the next particle.  When compared to the modular approach, this could significantly increase overall speed by reducing the volume  of intermediate results that must be transferred between  RAM and CPU. The disadvantage of performing all  operations on each particle is it limits flexibility, making it more difficult to dynamically add or modify components within the pipeline. It may also require users to have a high level of coding ability to adapt the computational pipeline  to their needs.  Thus, the  memory-bound modular approach of OceanTracker  compromises speed while significantly enhancing  adaptability, particularly for novice users.  Adapting OceanTracker  for GPUs may lead to faster performance due to their better memory access speeds.</p></list-item><list-item>
      <p id="d2e1607"><italic>Automation vs code complexity.</italic>  OceanTracker's  design abstracts the computational pipeline  into a series of roles, within which individual components carry out the functions requested by the user. This allows aspects of the pipeline to be automated, e.g. auto detection of hydrodynamic model type and required fields, where particle properties  are automatically interpolated from named fields, and written to output files. While, this internal automation helps deskill the computational pipeline  for the user, it adds significantly to the internal complexity of  OceanTracker's  code. This heavily relies on modularity based on class inheritance to implement the abstracted pipeline, in order to accommodate many user options and multiple  hydrodynamic model formats. As a result parts of   OceanTracker's  code may be harder to develop.</p></list-item><list-item>
      <p id="d2e1613"><italic>Abstraction limitations.</italic> The modular computational pipeline  abstraction in Fig. <xref ref-type="fig" rid="F3"/> could limit the types of problems that OceanTracker  can be used to solve. For example, the effects of trajectory modifiers and velocity modifiers are added to each other. However, there are be examples where this linear superposition of effects approach may not be able to implement users requirements. For example if the magnitude of several velocity modifiers each depend on the combined total of the  water velocity and all velocity modifiers.</p></list-item></list></p>
</sec>
</sec>
<sec id="Ch1.S7" sec-type="conclusions">
  <label>7</label><title>Summary</title>
      <p id="d2e1629">OceanTracker  v0.5 provides a comprehensive ocean particle tracking framework  compatible with both structured and unstructured grids.  Its computational speed allows users to scale to larger numbers of particles on modest computer hardware within acceptable run times. Simulating larger numbers facilitates enhanced particle statistics and broader exploration of variations in particle behaviours. Integrating the calculation of particle statistics directly within  computational runs may significantly reduce the time required to derive statistics. In addition, on-the-fly-statistics produce more manageable data volumes, as their size does not depend on the number of particles released. The ability to add multiple release groups and statistics also reduces user efforts, by enabling multiple outcomes within the same computational run. Adaptability in building a computational pipeline  is enabled by a modular approach to roles within the pipeline. Moving OceanTracker  to a full version 1.0 release will require additional development. For example, more testing is needed to ensure compatibility  with  a wider range of variants of the currently supported hydrodynamic model formats, as well as adding support for  other popular model formats. In addition, more comprehensive documentation, users guide and tutorials that will help make the adoption curve less steep.</p>
      <p id="d2e1632">OceanTracker's   computational speed primarily stems from its algorithmic efficiency in locating each particle’s current triangle and interpolating field values at its position. This efficiency allows it to significantly outperform current versions of OpenDrift  and  Parcels on a single computer core. When using more than 30 cores, OceanTracker's  performance increases by an additional factor, further surpassing models that do not leverage  parallel computation.</p>
      <p id="d2e1635">For small particle counts, reading the hydrodynamic model data will dominate the run time, making the actual trajectory calculations negligibly short. For the Laptop I and Desktop II benchmarks in Table <xref ref-type="table" rid="T1"/>, the tipping point between time spent reading and time spent calculating trajectories is around 100 000 and 1 000 000 particles respectively. Trajectory computation for significantly smaller particle numbers is almost free. This tipping point will be higher for hydrodynamic models with more nodes or a larger particle tracking time step than those used for the examples in Table <xref ref-type="table" rid="T1"/>.</p>
      <p id="d2e1642">Future improvements to enhance OceanTracker's   computational speed might include greater use of  “Single Instruction Multiple Data instructions” on conventional CPUs <xref ref-type="bibr" rid="bib1.bibx12" id="paren.45"/>. Additional  optimisation may be possible by adapting expensive computational kernels to take advantage of GPUs. Speed could  may  also be improved by chunking or restructuring the data in memory <xref ref-type="bibr" rid="bib1.bibx12" id="paren.46"/>.  An asynchronous reader  could  fill field buffers in a separate parallel process and share memory with the particle computational threads. This could make reading the hydrodynamic model almost “free” in terms of overall run times for numbers above the tipping point, or the trajectory computations free for numbers below this point.</p>
</sec>

      
      </body>
    <back><app-group>

<app id="App1.Ch1.S1">
  <label>Appendix A</label><title>Code for Fig. 1</title>

      <fig id="FA1"><label>Figure A1</label><caption><p id="d2e1665">Python code used to run the particle tracking example shown in Fig. <xref ref-type="fig" rid="F1"/>.</p></caption>
        
        <graphic xlink:href="https://gmd.copernicus.org/articles/19/10223/2026/gmd-19-10223-2026-f08.png"/>

      </fig>

</app>
  </app-group><notes notes-type="codedataavailability"><title>Code and data availability</title>

      <p id="d2e1682">OceanTracker's latest source code is available at <uri>https://github.com/oceantracker/oceantracker/</uri> (last access: 5 October 2026) and the version at the time of publication is archived at <ext-link xlink:href="https://doi.org/10.5281/zenodo.22588338" ext-link-type="DOI">10.5281/zenodo.22588338</ext-link> <xref ref-type="bibr" rid="bib1.bibx30" id="paren.47"/>. Demonstrations and user guide at <uri>https://oceantracker.github.io/oceantracker/</uri>. The code is released under the MIT license. The research data, i.e. the code to perform the speed tests and their output, can be accessed in the repository for sustainable reasearch data management hosted by the University of Hamburg (<ext-link xlink:href="https://doi.org/10.25592/uhhfdm.14172" ext-link-type="DOI">10.25592/uhhfdm.14172</ext-link>, <xref ref-type="bibr" rid="bib1.bibx25" id="altparen.48"/>).</p>
  </notes><notes notes-type="authorcontribution"><title>Author contributions</title>

      <p id="d2e1707">RV and LS are core code developers and primarily responsible for writing this paper. MS, RC and BK contributed to development of specific components of the code,   extensive code testing and the structure of the paper.</p>
  </notes><notes notes-type="competinginterests"><title>Competing interests</title>

      <p id="d2e1713">The contact author has declared that none of the authors has any competing interests.</p>
  </notes><notes notes-type="disclaimer"><title>Disclaimer</title>

      <p id="d2e1722">Publisher's note: Copernicus Publications remains neutral with regard to jurisdictional claims made in the text, published maps, institutional affiliations, or any other geographical representation in this paper. The authors bear the ultimate responsibility for providing appropriate place names. Views expressed in the text are those of the authors and do not necessarily reflect the views of the publisher.</p>
  </notes><ack><title>Acknowledgements</title><p id="d2e1728">This study was supported by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) within Research Training Group 2530: “Biota-mediated effects on carbon cycling in estuaries” (project number 407270017), as well as  New Zealand Ministry of Business, Innovation and Employment science grants – Data Science for Aquaculture (RTVU1914),  Reimagining Aquaculture (C11X1903) and the Sustainable Seas National Science Challenge.</p></ack><notes notes-type="financialsupport"><title>Financial support</title>

      <p id="d2e1733">This research has been supported by the Ministry of Business, Innovation and Employment (grant nos. C11X1903 and RTVU1914) and the Deutsche Forschungsgemeinschaft (grant no. 407270017).</p>
  </notes><notes notes-type="reviewstatement"><title>Review statement</title>

      <p id="d2e1739">This paper was edited by Deepak Subramani and reviewed by Erik van Sebille, Willi Rath, and one anonymous referee.</p>
  </notes><ref-list>
    <title>References</title>

      <ref id="bib1.bibx1"><label>Ainsworth et al.(2021)Ainsworth, Chassignet, French-McCay, Beegle-Krause, Berenshtein, Englehardt, Fiddaman, Huang, Huettel, Justic et al.</label><mixed-citation>Ainsworth, C., Chassignet, E. P., French-McCay, D., Beegle-Krause, C. J., Berenshtein, I., Englehardt, J., Fiddaman, T., Huang, H., Huettel, M., Justic, D.,  Kourafalou, V. H.,  Liu, Y.,  Mauritzen, C.,  Murawski, S.,  Morey, S., Özgökmen,  T.,  Paris, C. B.,  Ruzicka, J., Saul,  S., Shepherd,  J.,  Socolofsky, S., Solo Gabriele,  H.,  Sutton, T.,  Weisbergm R. H., Wilson, C.,  Zheng, L., and  Zheng, Y.: Ten years of modeling the Deepwater Horizon oil spill, Environ. Model. Softw., 142, 105070, <ext-link xlink:href="https://doi.org/10.1016/j.envsoft.2021.105070" ext-link-type="DOI">10.1016/j.envsoft.2021.105070</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx2"><label>Atalah et al.(2022)Atalah, South, Briscoe, and Vennell</label><mixed-citation>Atalah, J., South, P. M., Briscoe, D. K., and Vennell, R.: Inferring parental areas of juvenile mussels using hydrodynamic modelling, Aquaculture, 555, 738227, <ext-link xlink:href="https://doi.org/10.1016/j.aquaculture.2022.738227" ext-link-type="DOI">10.1016/j.aquaculture.2022.738227</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx3"><label>Chaput et al.(2022)Chaput, Sochala, Miron, Kourafalou, and Iskandarani</label><mixed-citation> Chaput, R., Sochala, P., Miron, P., Kourafalou, V. H., and Iskandarani, M.: Quantitative uncertainty estimation in biophysical models of fish larval connectivity in the Florida Keys, ICES J. Mar. Sci., 79, 609–632, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx4"><label>Dagestad et al.(2018)Dagestad, Röhrs, Breivik, and Ådlandsvik</label><mixed-citation>Dagestad, K.-F., Röhrs, J., Breivik, Ø., and Ådlandsvik, B.: OpenDrift v1.0: a generic framework for trajectory modelling, Geosci. Model Dev., 11, 1405–1420, <ext-link xlink:href="https://doi.org/10.5194/gmd-11-1405-2018" ext-link-type="DOI">10.5194/gmd-11-1405-2018</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx5"><label>Delandmeter and Van Sebille(2019)</label><mixed-citation>Delandmeter, P. and van Sebille, E.: The Parcels v2.0 Lagrangian framework: new field interpolation schemes, Geosci. Model Dev., 12, 3571–3584, <ext-link xlink:href="https://doi.org/10.5194/gmd-12-3571-2019" ext-link-type="DOI">10.5194/gmd-12-3571-2019</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx6"><label>Demmer et al.(2022)Demmer, Neill, Andres, Malham, Jones, and Robins</label><mixed-citation> Demmer, J., Neill, S. P., Andres, O., Malham, S. K., Jones, T., and Robins, P.: Larval dispersal from an energetic tidal channel and implications for blue mussel (Mytilus edulis) shellfisheries, Aquacult. Int., 30, 2969–2995, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx7"><label>Garnier et al.(2025)Garnier, Murray, Gillibrand, Gallego, Robins, and Moriarty</label><mixed-citation>Garnier, S., Murray, R. O., Gillibrand, P. A., Gallego, A., Robins, P., and Moriarty, M.: Particle tracking modelling in coastal marine environments: Recommended practices and performance limitations, Ecol. Model., 501, 110999,   <ext-link xlink:href="https://doi.org/10.1016/j.ecolmodel.2024.110999" ext-link-type="DOI">10.1016/j.ecolmodel.2024.110999</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx8"><label>Haller(2015)</label><mixed-citation> Haller, G.: Lagrangian coherent structures, Annu. Rev. Fluid Mech., 47, 137–162, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx9"><label>Harris et al.(2020)Harris, Millman, van der Walt, Gommers, Virtanen, Cournapeau, Wieser, Taylor, Berg, Smith, Kern, Picus, Hoyer, van Kerkwijk, Brett, Haldane, del Río, Wiebe, Peterson, Gérard-Marchant, Sheppard, Reddy, Weckesser, Abbasi, Gohlke, and Oliphant</label><mixed-citation>Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R., Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del Río, J. F., Wiebe, M., Peterson, P., Gérard-Marchant, P., Sheppard, K., Reddy, T., Weckesser, W., Abbasi, H., Gohlke, C., and Oliphant, T. E.: Array programming with NumPy, Nature, 585, 357–362, <ext-link xlink:href="https://doi.org/10.1038/s41586-020-2649-2" ext-link-type="DOI">10.1038/s41586-020-2649-2</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx10"><label>Harrison and Glatzmaier(2012)</label><mixed-citation>Harrison, C. S. and Glatzmaier, G. A.: Lagrangian coherent structures in the California Current System–sensitivities and limitations, Geophys. Astrophys. Fluid Dynam., 106, 22–44, 2012.  </mixed-citation></ref>
      <ref id="bib1.bibx11"><label>Kärnä et al.(2021)Kärnä, Ljungemyr, Falahat, Ringgaard, Axell, Korabel, Murawski, Maljutenko, Lindenthal, Jandt-Scheelke, Verjovkina, Lorkowski, Lagemaa, She, Tuomi, Nord, and Huess</label><mixed-citation>Kärnä, T., Ljungemyr, P., Falahat, S., Ringgaard, I., Axell, L., Korabel, V., Murawski, J., Maljutenko, I., Lindenthal, A., Jandt-Scheelke, S., Verjovkina, S., Lorkowski, I., Lagemaa, P., She, J., Tuomi, L., Nord, A., and Huess, V.: Nemo-Nordic 2.0: operational marine forecast model for the Baltic Sea, Geosci. Model Dev., 14, 5731–5749, <ext-link xlink:href="https://doi.org/10.5194/gmd-14-5731-2021" ext-link-type="DOI">10.5194/gmd-14-5731-2021</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx12"><label>Kehl et al.(2023)Kehl, Nooteboom, Kaandorp, and van Sebille</label><mixed-citation>Kehl, C., Nooteboom, P. D., Kaandorp, M. L. A., and van Sebille, E.: Efficiently simulating Lagrangian particles in large-scale ocean flows – Data structures and their impact on geophysical applications, Comput. Geosci., 175, 105322, <ext-link xlink:href="https://doi.org/10.1016/j.cageo.2023.105322" ext-link-type="DOI">10.1016/j.cageo.2023.105322</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx13"><label>Knight et al.(2025)Knight, Treml, Waddington, Vennell, and Hutson</label><mixed-citation>Knight, B. R., Treml, E. A., Waddington, Z., Vennell, R., and Hutson, K. S.: Hindcasting Farmed Salmon Mortality to Improve Future Health and Production Outcomes, J. Fish Dis., 48, e14058, <ext-link xlink:href="https://doi.org/10.1111/jfd.14058" ext-link-type="DOI">10.1111/jfd.14058</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx14"><label>Lai et al.(2010)Lai, Chen, Cowles, and Beardsley</label><mixed-citation>Lai, Z., Chen, C., Cowles, G. W., and Beardsley, R. C.: A nonhydrostatic version of FVCOM: 1. Validation experiments, J. Geophys. Res.-Oceans, 115, <ext-link xlink:href="https://doi.org/10.1029/2009JC005525" ext-link-type="DOI">10.1029/2009JC005525</ext-link>, 2010.</mixed-citation></ref>
      <ref id="bib1.bibx15"><label>Lam et al.(2015)Lam, Pitrou, and Seibert</label><mixed-citation>Lam, S. K., Pitrou, A., and Seibert, S.: Numba: A llvm-based python jit compiler, in: Proceedings of the Second Workshop on the LLVM Compiler Infrastructure in HPC, Association for Computing Machinery, New York, NY, USA, 1–6, <ext-link xlink:href="https://doi.org/10.1145/2833157.2833162" ext-link-type="DOI">10.1145/2833157.2833162</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx16"><label>López et al.(2020)López, Wilkin, and Levin</label><mixed-citation>López, A. G., Wilkin, J. L., and Levin, J. C.: Doppio – a ROMS (v3.6)-based circulation model for the Mid-Atlantic Bight and Gulf of Maine: configuration and comparison to integrated coastal observing network observations, Geosci. Model Dev., 13, 3709–3729, <ext-link xlink:href="https://doi.org/10.5194/gmd-13-3709-2020" ext-link-type="DOI">10.5194/gmd-13-3709-2020</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx17"><label>Lucas and Deleersnijder(2020)</label><mixed-citation>Lucas, L. V. and Deleersnijder, E.: Timescale methods for simplifying, understanding and modeling biophysical and water quality processes in coastal aquatic ecosystems: A review, Water, 12, 2717, <ext-link xlink:href="https://doi.org/10.3390/w12102717" ext-link-type="DOI">10.3390/w12102717</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx18"><label>Lynch et al.(2014)Lynch, Greenberg, Bilgili, McGillicuddy Jr, Manning, and Aretxabaleta</label><mixed-citation>Lynch, D. R., Greenberg, D. A., Bilgili, A., McGillicuddy Jr., D. J., Manning, J. P., and Aretxabaleta, A. L.: Particles in the coastal ocean: Theory and applications, Cambridge University Press, <ext-link xlink:href="https://doi.org/10.1017/CBO9781107449336" ext-link-type="DOI">10.1017/CBO9781107449336</ext-link>, 2014.</mixed-citation></ref>
      <ref id="bib1.bibx19"><label>Moore et al.(2011)Moore, Arango, Broquet, Powell, Weaver, and Zavala-Garay</label><mixed-citation> Moore, A. M., Arango, H. G., Broquet, G., Powell, B. S., Weaver, A. T., and Zavala-Garay, J.: The Regional Ocean Modeling System (ROMS) 4-dimensional variational data assimilation systems: Part I–System overview and formulation, Prog. Oceanogr., 91, 34–49, 2011.</mixed-citation></ref>
      <ref id="bib1.bibx20"><label>O’Shea and Murphy(2020)</label><mixed-citation>O’Shea, M. and Murphy, J.: Developing a Process Driven Morphological Model for Long Term Evolution of a Dynamic Coastal Embayment, Open J. Mar. Sci., 10, 93–109, <ext-link xlink:href="https://doi.org/10.4236/ojms.2020.10300" ext-link-type="DOI">10.4236/ojms.2020.10300</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx21"><label>Pastor Rollan et al.(2024)Pastor Rollan, Sherman, Ellis, Tuohey, Vennell, Foster-Thorpe, and Treml</label><mixed-citation>Pastor Rollan, A., Sherman, C. D., Ellis, M. R., Tuohey, K., Vennell, R., Foster-Thorpe, C., and Treml, E. A.: Current Trends in Biophysical Modeling of eDNA Dynamics for the Detection of Marine Species, Environ. DNA, 6, e70021, <ext-link xlink:href="https://doi.org/10.1002/edn3.70021" ext-link-type="DOI">10.1002/edn3.70021</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx22"><label>Simons et al.(2013)Simons, Siegel, and Brown</label><mixed-citation> Simons, R. D., Siegel, D. A., and Brown, K. S.: Model sensitivity and robustness in the estimation of larval transport: a study of particle tracking parameters, J. Mar. Syst., 119, 19–29, 2013.</mixed-citation></ref>
      <ref id="bib1.bibx23"><label>Smeaton et al.(2026)Smeaton, Atalah1, Fletcher, Davidson, Floerl, Hilliam, Treml, Vennell, Georgiades, and Kluza</label><mixed-citation> Smeaton, M., Atalah, J., Fletcher, L. M., Davidson, I. C., Floerl, L., Hilliam, K., Treml, E., Vennell, R., Georgiades, E., and Kluza, D.: Hydrodynamic modelling of ballast water exchange for domestic voyage routes, J. Fish Dis., in preparation, 2026.</mixed-citation></ref>
      <ref id="bib1.bibx24"><label>Steidle and Vennell(2023)</label><mixed-citation>Steidle, L. and Vennell, R.: Phytoplankton retention mechanisms in estuaries: a case study of the Elbe estuary, Nonlin. Processes Geophys., 31, 151–164, <ext-link xlink:href="https://doi.org/10.5194/npg-31-151-2024" ext-link-type="DOI">10.5194/npg-31-151-2024</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx25"><label>Steidle et al.(2026)Steidle, Vennell, Smeaton, Chaput, and Knight</label><mixed-citation>Steidle, L., Vennell, R., Smeaton, M., Chaput, R., and Knight, B.: OceanTracker 0.5: Fast Adaptable Lagrangian Particle Tracking in Structured and Unstructured Grids, University of Hamburg [code], <ext-link xlink:href="https://doi.org/10.25592/uhhfdm.14172" ext-link-type="DOI">10.25592/uhhfdm.14172</ext-link>, 2026.</mixed-citation></ref>
      <ref id="bib1.bibx26"><label>Thorpe(2005)</label><mixed-citation>Thorpe, S. A.: The turbulent ocean, Cambridge university press, <ext-link xlink:href="https://doi.org/10.1017/CBO9780511819933" ext-link-type="DOI">10.1017/CBO9780511819933</ext-link>, 2005.</mixed-citation></ref>
      <ref id="bib1.bibx27"><label>Thygesen(2011)</label><mixed-citation> Thygesen, U. H.: How to reverse time in stochastic particle tracking models, J. Mar. Syst., 88, 159–168, 2011.</mixed-citation></ref>
      <ref id="bib1.bibx28"><label>Uncles et al.(2020)Uncles, Clark, Bedington, and Torres</label><mixed-citation>Uncles, R. J., Clark, J. R., Bedington, M., and Torres, R.: On sediment dispersal in the Whitsand Bay Marine Conservation Zone: Neighbor to a closed dredge-spoil disposal site, in: Marine Protected Areas: Evidence, Policy and Practise, edited by: Clark, R. and Humphreys, J., Elsevier, 599–629, <ext-link xlink:href="https://doi.org/10.1016/B978-0-08-102698-4.00031-9" ext-link-type="DOI">10.1016/B978-0-08-102698-4.00031-9</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx29"><label>Van Sebille et al.(2018)Van Sebille, Griffies, Abernathey, Adams, Berloff, Biastoch, Blanke, Chassignet, Cheng, Cotter et al.</label><mixed-citation>Van Sebille, E., Griffies, S. M., Abernathey, R., Adams, T. P., Berloff, P., Biastoch, A., Blanke, B., Chassignet, E. P., Cheng, Y., Cotter, C. J., Deleersnijder, E., Döös, K., Drake, H. F., Drijfhout, S., Gary, S. F., Heemink, A. W., Kjellsson, J., Koszalka, I. M., Lange, M., Lique, C., MacGilchrist, G. A., Marsh, R., Mayorga Adame, C. G., McAdam, R., Nencioli, F., Paris, C. B., Piggott, M. D., Polton, J. A., Rühs, S., Shah, S. H., Thomas, M. D., Wang, J., Wolfram, P. J., Zanna, L., and Zika, J. D.: Lagrangian ocean analysis: Fundamentals and practices, Ocean Model., 121, 49–75, <ext-link xlink:href="https://doi.org/10.1016/j.ocemod.2017.11.008" ext-link-type="DOI">10.1016/j.ocemod.2017.11.008</ext-link>, 2018. </mixed-citation></ref>
      <ref id="bib1.bibx30"><label>Vennell and Steidle(2026)</label><mixed-citation>Vennell, R. and Steidle, L.: oceantracker/oceantracker: v0.5.3.8-zenodo, Zenodo [code], <ext-link xlink:href="https://doi.org/10.5281/zenodo.22588338" ext-link-type="DOI">10.5281/zenodo.22588338</ext-link>, 2026.</mixed-citation></ref>
      <ref id="bib1.bibx31"><label>Vennell et al.(2019)Vennell, Unwin, and Scheel</label><mixed-citation>Vennell, R., Unwin, H., and Scheel, M.: Where's Our Plastic Going?, <uri>https://ocean-plastic-simulator.cawthron.org.nz/</uri> (last access: 5 October 2026), 2019.</mixed-citation></ref>
      <ref id="bib1.bibx32"><label>Vennell et al.(2021)Vennell, Scheel, Weppe, Knight, and Smeaton</label><mixed-citation> Vennell, R., Scheel, M., Weppe, S., Knight, B., and Smeaton, M.: Fast Lagrangian particle tracking in unstructured ocean model grids, Ocean Dynam., 71, 423–437, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx33"><label>Visser(1998)</label><mixed-citation>Visser, A.: Using random walk models to simulate the vertical distribution of particles in a turbulent water column, Oceanographic Literature Review, 6, 1086, <ext-link xlink:href="https://doi.org/10.3354/meps158275" ext-link-type="DOI">10.3354/meps158275</ext-link>, 1998.</mixed-citation></ref>
      <ref id="bib1.bibx34"><label>Zhang et al.(2016)Zhang, Ye, Stanev, and Grashorn</label><mixed-citation> Zhang, Y. J., Ye, F., Stanev, E. V., and Grashorn, S.: Seamless cross-scale modeling with SCHISM, Ocean Model., 102, 64–81, 2016.</mixed-citation></ref>

  </ref-list></back>
    <!--<article-title-html>OceanTracker 0.5: fast adaptable Lagrangian particle  tracking in structured and unstructured grids</article-title-html>
<abstract-html/>
<ref-html id="bib1.bib1"><label>Ainsworth et al.(2021)Ainsworth, Chassignet, French-McCay,
Beegle-Krause, Berenshtein, Englehardt, Fiddaman, Huang, Huettel, Justic
et al.</label><mixed-citation>
      
Ainsworth, C., Chassignet, E. P., French-McCay, D., Beegle-Krause, C. J.,
Berenshtein, I., Englehardt, J., Fiddaman, T., Huang, H., Huettel, M.,
Justic, D.,  Kourafalou, V. H.,  Liu, Y.,  Mauritzen, C.,  Murawski, S.,  Morey, S., Özgökmen,  T.,  Paris, C. B.,  Ruzicka, J., Saul,  S., Shepherd,  J.,  Socolofsky, S., Solo Gabriele,  H.,  Sutton, T.,  Weisbergm R. H., Wilson, C.,  Zheng, L., and  Zheng, Y.: Ten years of modeling the Deepwater Horizon oil spill,
Environ. Model. Softw., 142, 105070, <a href="https://doi.org/10.1016/j.envsoft.2021.105070" target="_blank">https://doi.org/10.1016/j.envsoft.2021.105070</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib2"><label>Atalah et al.(2022)Atalah, South, Briscoe, and
Vennell</label><mixed-citation>
      
Atalah, J., South, P. M., Briscoe, D. K., and Vennell, R.: Inferring parental
areas of juvenile mussels using hydrodynamic modelling, Aquaculture, 555,
738227, <a href="https://doi.org/10.1016/j.aquaculture.2022.738227" target="_blank">https://doi.org/10.1016/j.aquaculture.2022.738227</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib3"><label>Chaput et al.(2022)Chaput, Sochala, Miron, Kourafalou, and
Iskandarani</label><mixed-citation>
      
Chaput, R., Sochala, P., Miron, P., Kourafalou, V. H., and Iskandarani, M.:
Quantitative uncertainty estimation in biophysical models of fish larval
connectivity in the Florida Keys, ICES J. Mar. Sci., 79,
609–632, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib4"><label>Dagestad et al.(2018)Dagestad, Röhrs, Breivik, and
Ådlandsvik</label><mixed-citation>
      
Dagestad, K.-F., Röhrs, J., Breivik, Ø., and Ådlandsvik, B.: OpenDrift v1.0: a generic framework for trajectory modelling, Geosci. Model Dev., 11, 1405–1420, <a href="https://doi.org/10.5194/gmd-11-1405-2018" target="_blank">https://doi.org/10.5194/gmd-11-1405-2018</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib5"><label>Delandmeter and Van Sebille(2019)</label><mixed-citation>
      
Delandmeter, P. and van Sebille, E.: The Parcels v2.0 Lagrangian framework: new field interpolation schemes, Geosci. Model Dev., 12, 3571–3584, <a href="https://doi.org/10.5194/gmd-12-3571-2019" target="_blank">https://doi.org/10.5194/gmd-12-3571-2019</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib6"><label>Demmer et al.(2022)Demmer, Neill, Andres, Malham, Jones, and
Robins</label><mixed-citation>
      
Demmer, J., Neill, S. P., Andres, O., Malham, S. K., Jones, T., and Robins, P.:
Larval dispersal from an energetic tidal channel and implications for blue
mussel (Mytilus edulis) shellfisheries, Aquacult. Int., 30,
2969–2995, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib7"><label>Garnier et al.(2025)Garnier, Murray, Gillibrand, Gallego, Robins, and
Moriarty</label><mixed-citation>
      
Garnier, S., Murray, R. O., Gillibrand, P. A., Gallego, A., Robins, P., and
Moriarty, M.: Particle tracking modelling in coastal marine environments:
Recommended practices and performance limitations, Ecol. Model., 501,
110999,   <a href="https://doi.org/10.1016/j.ecolmodel.2024.110999" target="_blank">https://doi.org/10.1016/j.ecolmodel.2024.110999</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib8"><label>Haller(2015)</label><mixed-citation>
      
Haller, G.: Lagrangian coherent structures, Annu. Rev. Fluid Mech.,
47, 137–162, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib9"><label>Harris et al.(2020)Harris, Millman, van der Walt, Gommers, Virtanen,
Cournapeau, Wieser, Taylor, Berg, Smith, Kern, Picus, Hoyer, van Kerkwijk,
Brett, Haldane, del Río, Wiebe, Peterson, Gérard-Marchant,
Sheppard, Reddy, Weckesser, Abbasi, Gohlke, and Oliphant</label><mixed-citation>
      
Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P.,
Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R.,
Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del
Río, J. F., Wiebe, M., Peterson, P., Gérard-Marchant, P.,
Sheppard, K., Reddy, T., Weckesser, W., Abbasi, H., Gohlke, C., and Oliphant,
T. E.: Array programming with NumPy, Nature, 585, 357–362,
<a href="https://doi.org/10.1038/s41586-020-2649-2" target="_blank">https://doi.org/10.1038/s41586-020-2649-2</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib10"><label>Harrison and Glatzmaier(2012)</label><mixed-citation>
      
Harrison, C. S. and Glatzmaier, G. A.: Lagrangian coherent structures in the
California Current System–sensitivities and limitations, Geophys.
Astrophys. Fluid Dynam., 106, 22–44, 2012.


    </mixed-citation></ref-html>
<ref-html id="bib1.bib11"><label>Kärnä et al.(2021)Kärnä, Ljungemyr, Falahat, Ringgaard, Axell,
Korabel, Murawski, Maljutenko, Lindenthal, Jandt-Scheelke, Verjovkina,
Lorkowski, Lagemaa, She, Tuomi, Nord, and Huess</label><mixed-citation>
      
Kärnä, T., Ljungemyr, P., Falahat, S., Ringgaard, I., Axell, L., Korabel, V., Murawski, J., Maljutenko, I., Lindenthal, A., Jandt-Scheelke, S., Verjovkina, S., Lorkowski, I., Lagemaa, P., She, J., Tuomi, L., Nord, A., and Huess, V.: Nemo-Nordic 2.0: operational marine forecast model for the Baltic Sea, Geosci. Model Dev., 14, 5731–5749, <a href="https://doi.org/10.5194/gmd-14-5731-2021" target="_blank">https://doi.org/10.5194/gmd-14-5731-2021</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib12"><label>Kehl et al.(2023)Kehl, Nooteboom, Kaandorp, and van
Sebille</label><mixed-citation>
      
Kehl, C., Nooteboom, P. D., Kaandorp, M. L. A., and van Sebille, E.:
Efficiently simulating Lagrangian particles in large-scale ocean flows –
Data structures and their impact on geophysical applications, Comput.
Geosci., 175, 105322, <a href="https://doi.org/10.1016/j.cageo.2023.105322" target="_blank">https://doi.org/10.1016/j.cageo.2023.105322</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib13"><label>Knight et al.(2025)Knight, Treml, Waddington, Vennell, and
Hutson</label><mixed-citation>
      
Knight, B. R., Treml, E. A., Waddington, Z., Vennell, R., and Hutson, K. S.:
Hindcasting Farmed Salmon Mortality to Improve Future Health and Production
Outcomes, J. Fish Dis., 48, e14058, <a href="https://doi.org/10.1111/jfd.14058" target="_blank">https://doi.org/10.1111/jfd.14058</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib14"><label>Lai et al.(2010)Lai, Chen, Cowles, and
Beardsley</label><mixed-citation>
      
Lai, Z., Chen, C., Cowles, G. W., and Beardsley, R. C.: A nonhydrostatic
version of FVCOM: 1. Validation experiments, J. Geophys. Res.-Oceans, 115, <a href="https://doi.org/10.1029/2009JC005525" target="_blank">https://doi.org/10.1029/2009JC005525</a>, 2010.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib15"><label>Lam et al.(2015)Lam, Pitrou, and Seibert</label><mixed-citation>
      
Lam, S. K., Pitrou, A., and Seibert, S.: Numba: A llvm-based python jit
compiler, in: Proceedings of the Second Workshop on the LLVM Compiler
Infrastructure in HPC, Association for Computing Machinery, New York, NY, USA, 1–6, <a href="https://doi.org/10.1145/2833157.2833162" target="_blank">https://doi.org/10.1145/2833157.2833162</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib16"><label>López et al.(2020)López, Wilkin, and Levin</label><mixed-citation>
      
López, A. G., Wilkin, J. L., and Levin, J. C.: Doppio – a ROMS (v3.6)-based circulation model for the Mid-Atlantic Bight and Gulf of Maine: configuration and comparison to integrated coastal observing network observations, Geosci. Model Dev., 13, 3709–3729, <a href="https://doi.org/10.5194/gmd-13-3709-2020" target="_blank">https://doi.org/10.5194/gmd-13-3709-2020</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib17"><label>Lucas and Deleersnijder(2020)</label><mixed-citation>
      
Lucas, L. V. and Deleersnijder, E.: Timescale methods for simplifying,
understanding and modeling biophysical and water quality processes in coastal
aquatic ecosystems: A review, Water, 12, 2717, <a href="https://doi.org/10.3390/w12102717" target="_blank">https://doi.org/10.3390/w12102717</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib18"><label>Lynch et al.(2014)Lynch, Greenberg, Bilgili, McGillicuddy Jr,
Manning, and Aretxabaleta</label><mixed-citation>
      
Lynch, D. R., Greenberg, D. A., Bilgili, A., McGillicuddy Jr., D. J., Manning,
J. P., and Aretxabaleta, A. L.: Particles in the coastal ocean: Theory and
applications, Cambridge University Press, <a href="https://doi.org/10.1017/CBO9781107449336" target="_blank">https://doi.org/10.1017/CBO9781107449336</a>, 2014.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib19"><label>Moore et al.(2011)Moore, Arango, Broquet, Powell, Weaver, and
Zavala-Garay</label><mixed-citation>
      
Moore, A. M., Arango, H. G., Broquet, G., Powell, B. S., Weaver, A. T., and
Zavala-Garay, J.: The Regional Ocean Modeling System (ROMS) 4-dimensional
variational data assimilation systems: Part I–System overview and
formulation, Prog. Oceanogr., 91, 34–49, 2011.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib20"><label>O’Shea and Murphy(2020)</label><mixed-citation>
      
O’Shea, M. and Murphy, J.: Developing a Process Driven Morphological Model for Long Term Evolution of a Dynamic Coastal Embayment, Open J. Mar. Sci., 10, 93–109, <a href="https://doi.org/10.4236/ojms.2020.10300" target="_blank">https://doi.org/10.4236/ojms.2020.10300</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib21"><label>Pastor Rollan et al.(2024)Pastor Rollan, Sherman, Ellis, Tuohey,
Vennell, Foster-Thorpe, and Treml</label><mixed-citation>
      
Pastor Rollan, A., Sherman, C. D., Ellis, M. R., Tuohey, K., Vennell, R.,
Foster-Thorpe, C., and Treml, E. A.: Current Trends in Biophysical Modeling
of eDNA Dynamics for the Detection of Marine Species, Environ. DNA, 6,
e70021, <a href="https://doi.org/10.1002/edn3.70021" target="_blank">https://doi.org/10.1002/edn3.70021</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib22"><label>Simons et al.(2013)Simons, Siegel, and Brown</label><mixed-citation>
      
Simons, R. D., Siegel, D. A., and Brown, K. S.: Model sensitivity and
robustness in the estimation of larval transport: a study of particle
tracking parameters, J. Mar. Syst., 119, 19–29, 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib23"><label>Smeaton et al.(2026)Smeaton, Atalah1, Fletcher, Davidson, Floerl,
Hilliam, Treml, Vennell, Georgiades, and Kluza</label><mixed-citation>
      
Smeaton, M., Atalah, J., Fletcher, L. M., Davidson, I. C., Floerl, L.,
Hilliam, K., Treml, E., Vennell, R., Georgiades, E., and Kluza, D.:
Hydrodynamic modelling of ballast water exchange for domestic voyage routes,
J. Fish Dis., in preparation, 2026.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib24"><label>Steidle and Vennell(2023)</label><mixed-citation>
      
Steidle, L. and Vennell, R.: Phytoplankton retention mechanisms in estuaries: a case study of the Elbe estuary, Nonlin. Processes Geophys., 31, 151–164, <a href="https://doi.org/10.5194/npg-31-151-2024" target="_blank">https://doi.org/10.5194/npg-31-151-2024</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib25"><label>Steidle et al.(2026)Steidle, Vennell, Smeaton, Chaput, and
Knight</label><mixed-citation>
      
Steidle, L., Vennell, R., Smeaton, M., Chaput, R., and Knight, B.:
OceanTracker 0.5: Fast Adaptable Lagrangian Particle Tracking in Structured
and Unstructured Grids, University of Hamburg [code], <a href="https://doi.org/10.25592/uhhfdm.14172" target="_blank">https://doi.org/10.25592/uhhfdm.14172</a>, 2026.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib26"><label>Thorpe(2005)</label><mixed-citation>
      
Thorpe, S. A.: The turbulent ocean, Cambridge university press, <a href="https://doi.org/10.1017/CBO9780511819933" target="_blank">https://doi.org/10.1017/CBO9780511819933</a>, 2005.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib27"><label>Thygesen(2011)</label><mixed-citation>
      
Thygesen, U. H.: How to reverse time in stochastic particle tracking models,
J. Mar. Syst., 88, 159–168, 2011.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib28"><label>Uncles et al.(2020)Uncles, Clark, Bedington, and Torres</label><mixed-citation>
      
Uncles, R. J., Clark, J. R., Bedington, M., and Torres, R.: On sediment
dispersal in the Whitsand Bay Marine Conservation Zone: Neighbor to a closed
dredge-spoil disposal site, in: Marine Protected Areas: Evidence, Policy and
Practise, edited by: Clark, R. and Humphreys, J., Elsevier, 599–629, <a href="https://doi.org/10.1016/B978-0-08-102698-4.00031-9" target="_blank">https://doi.org/10.1016/B978-0-08-102698-4.00031-9</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib29"><label>Van Sebille et al.(2018)Van Sebille, Griffies, Abernathey, Adams,
Berloff, Biastoch, Blanke, Chassignet, Cheng, Cotter
et al.</label><mixed-citation>
      
Van Sebille, E., Griffies, S. M., Abernathey, R., Adams, T. P., Berloff, P., Biastoch, A., Blanke, B., Chassignet, E. P., Cheng, Y., Cotter, C. J., Deleersnijder, E., Döös, K., Drake, H. F., Drijfhout, S., Gary, S. F., Heemink, A. W., Kjellsson, J., Koszalka, I. M., Lange, M., Lique, C., MacGilchrist, G. A., Marsh, R., Mayorga Adame, C. G., McAdam, R., Nencioli, F., Paris, C. B., Piggott, M. D., Polton, J. A., Rühs, S., Shah, S. H., Thomas, M. D., Wang, J., Wolfram, P. J., Zanna, L., and Zika, J. D.: Lagrangian ocean analysis: Fundamentals and practices, Ocean
Model., 121, 49–75, <a href="https://doi.org/10.1016/j.ocemod.2017.11.008" target="_blank">https://doi.org/10.1016/j.ocemod.2017.11.008</a>, 2018.


    </mixed-citation></ref-html>
<ref-html id="bib1.bib30"><label>Vennell and Steidle(2026)</label><mixed-citation>
      
Vennell, R. and Steidle, L.: oceantracker/oceantracker: v0.5.3.8-zenodo,
Zenodo [code], <a href="https://doi.org/10.5281/zenodo.22588338" target="_blank">https://doi.org/10.5281/zenodo.22588338</a>, 2026.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib31"><label>Vennell et al.(2019)Vennell, Unwin, and
Scheel</label><mixed-citation>
      
Vennell, R., Unwin, H., and Scheel, M.: Where's Our Plastic Going?,
<a href="https://ocean-plastic-simulator.cawthron.org.nz/" target="_blank"/> (last access: 5 October 2026), 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib32"><label>Vennell et al.(2021)Vennell, Scheel, Weppe, Knight, and
Smeaton</label><mixed-citation>
      
Vennell, R., Scheel, M., Weppe, S., Knight, B., and Smeaton, M.: Fast
Lagrangian particle tracking in unstructured ocean model grids, Ocean
Dynam., 71, 423–437, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib33"><label>Visser(1998)</label><mixed-citation>
      
Visser, A.: Using random walk models to simulate the vertical distribution of
particles in a turbulent water column, Oceanographic Literature Review, 6,
1086, <a href="https://doi.org/10.3354/meps158275" target="_blank">https://doi.org/10.3354/meps158275</a>, 1998.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib34"><label>Zhang et al.(2016)Zhang, Ye, Stanev, and Grashorn</label><mixed-citation>
      
Zhang, Y. J., Ye, F., Stanev, E. V., and Grashorn, S.: Seamless cross-scale
modeling with SCHISM, Ocean Model., 102, 64–81, 2016.

    </mixed-citation></ref-html>--></article>
