In this section, the different Ichthyop processes are described. These processes are implemented in the classes within the action folder.
Parameters associated with these processes must be included in action blocks. They can be activated or deactivated by setting the enabled tag (cf. Section 3.1).
6.1 Activation/Deactivation of a process
Each process can be enabled or disabled by ticking on the enable tick box.
Furthermore, it is also possible to activate/deactivate some processes depending on the particle age (in days) or size (in \(cm\)).
This is done by providing, for each of these processes, the following parameters:
activation_variable, which indicates whether age (in days) or length (in cm) must be used
activation_minimum_class_value, which indicates the age (in days) or lengh (in cm) when the process becomes active. Default is 0
activation_maximum_class_value, which indicates the age (in days) or lengh (in cm) when the process becomes inactive. Default is \(\infty\)
Caution
The length can be used only if one of the different growth process (see Section 6.3.2) is enabled
6.2 Transport processes
6.2.1 Advection
The primary process in Ichthyop is the advection by the ocean currents.
6.2.2 Horizontal advection
The particle grid coordinates will change according as follows:
with \(X,Y\) the particle grid position, \(t\) the time, \(\Delta t\) the time step (in seconds), \(U\) and \(V\) the zonal and meridional velocities (in \(m.s^{-1}\)) and \(\Delta X\) and \(\Delta Y\) the zonal and meridional extent of the grid cell.
6.2.3 Vertical advection
For 3D simulations, vertical advection can also be activated. Particle depth, in grid coordinates, is given by:
with \(Z\) the particle vertical grid position, \(t\) the time, \(\Delta t\) the time step (in seconds), \(W\) the vertical velocity (in \(m.s^{-1}\)) and \(\Delta Z\) the height of the grid cell.
6.2.4 Buoyancy
A buoyancy module allows to displace a particle vertically, depending on it’s density and the sea water density, following Parada et al. (2003).
The buoyancy-induced vertical velocity of the particle is given by:
\[
W_{buoy} = \dfrac{1}{24} \times g \times a \times b \times \dfrac{\rho_{water} - \rho_{part}}{\rho_{water}} \mu^{-1} \log\left(2 \dfrac{a}{b} + 0.5\right);
\]
with \(a\) and \(b\) the semi-major axis and semi-minor axis of an ellipse (mean_major_axis and mean_minor_axis parameters), \(\mu\) the molecular viscosity (molecular_viscosity parameter), \(\rho_{water}\) the water density, \(\rho_{part}\) the particle density and \(g\) the gravitational acceleration (\(cm.s^{-2}\)).
There are two possibilities to define the particle buoyancy, which are provided by the density.method parameter:
If constant, then a constant density (in \(g.cm^{-3}\)) is used, which is provided by the particle_density parameter.
If file, then the buoyancy is read from a file and can vary with either age or length. The class that is used is provided by the density.class parameter.
The density CSV file must be formatted in the following way:
Sea-water density is computed using sea-water temperature and salinity following Millero and Poisson (1981) and the technical implementation described in Fofonoff and Millard (1983) (EOS-80). Using the polynomials values from Millero and Poisson (1981), the density anomalie \(\Delta \sigma = \sigma - \sigma_0\), with \(\sigma_0 = \sigma(S=35, T=0, P=0)\), is computed. Density is then computed as:
\[
\rho = \sigma_0 + \Delta \sigma + \rho_0
\]
with \(rho_0 = 1000 kg.m^{m-3}\) the reference density of water. Finally, density is converted into \(g.cm^{-3}\).
6.2.5 Daily vertical migration
Daily migration of the particles can be activated by providing daytime and nighttime depths, and the timing of the sunset and sunrise.
If the daytime_depth_file parameter is defined, it provides the depth of the particle during daytime. It is formatted as follows:
Age(day);Depth(m)0.0;-203.0;-255.0;-308.0;-35
If this parameter is not found, a constant daytime depth, provided by the daytime_depth parameter, is assumed.
Same thing for the nighttime depths, which can be set by either the nighttime_depth_file or the nighttime_depth parameters.
The sunset and sunrise hours are set by the sunset and sunrise parameters, which must have a HH::mm format.
Warning
When the target depth is greater than the total depth, the particle does not move.
6.2.6 Horizontal dispersion
Horizontal dispersion is implemented following Peliz et al. (2007). The horizontal velocity component due to diffusion is:
\[
u_T = \delta \sqrt{\dfrac{2 K_h}{\Delta t}}
\]
with \(\Delta t\) the time step, \(\delta\) a random number between -1 and 1 and \(K_h\) the imposed explicit Lagrangian horizontal diffusion.
The value of \(K_h\) depends on the mean mesh size where the particle is located:
\[
K_h = \epsilon^{1/3} l^{4/3}
\]
with \(l\) is the mean mesh size and \(\epsilon\) is the turbulent dissipation rate (in \(m^2.s^{-3}\)).
In the Ichythop implementation (HDispAction.java), the displacement is computed:
\[
\Delta X = u_T \times \Delta t
\]
Combining all together, we obtain the following equation:
\[
\Delta X = \delta \times \sqrt{\dfrac{2 \epsilon^{1/3} l^{4/3}}{\Delta t}} \times \Delta t
\]
By putting the rightmost \(\Delta t\) within the square root, and by putting the \(l\) and \(\epsilon\) terms outside, this expression can be simplified as follows:
The value of \(l\) is computing by averaging the mesh size along the \(X\) and \(Y\) dimensions.
6.2.7 Ontogenetic vertical migration
The ontogenetic migration module controls the migration of particles at different depths as a function of age. Its implementation in Ichthyop follows the CMS one. It uses a CMS configuration file, which is formatted as follows:
The first line provides the number of time steps in the CMS file, the second line provides the number of vertical levels in the CMS file. The third line provides the depth values and the fourth lines provides the time step values.
The remaining lines provide the probability matrix \(P_{z, t}\).
Note
The sum of the probability matrix along the depth dimension should equal 100.
At each time step, the index of the CMS time step, \(k\), is determined by comparing the simulation and CMS times as follows:
\[
t_{CMS}(k) < t \leq t_{CMS}(k + 1)
\]
When the CMS time index changes, all the particles are randomly distributed on the vertical, following the probability distribution of the given CMS time. If the CMS time index remains unchanged, nothing is done.
6.2.8 Wind drift
The wind-drift is implemented in the WindDriftFileAction.java class. This class requires that 2D (time, latitude, longitude) wind fields are provided. This is done by providing a input_path and a file_filter parameters, which specify the location and names of the wind files.
The user also provides field_time, wind_u, wind_v, longitude, latitude parameters, which specify the names of the time, zonal wind, meridional wind, longitude and latitude variables in the NetCDF wind files.
The user also provides a depth_application parameter, which specifies the depth at which the wind will impact the trajectories (only valid for 3D simulations), a wind_factor (\(F\), multiplication factor), an angle (\(\theta\)) and a wind_convention parameter (\(\varepsilon\), +1 if convention is ocean-based, i.e. wind-to, -1 if convention is atmospheric based, i.e. wind-from).
The changes in particle longitude (\(\lambda\)) and latitude (\(\phi\)) is computed as follows:
where \(\Delta \lambda_{0}\) and $_{0} $ are the changes in longitudes and latitudes due to wind, \(\Delta \lambda\) and $$ are the effective changes in longitudes and latitudes of the particle when taking into account the angle \(\theta\), \(\Delta t\) is Ichthyop time-step (in days) and \(U_w\) and \(V_w\) are the zonal and meridional wind components (in \(m.s^{-1}\)).
Note
\(R\) is the Earth Radius and equals 6367.74 km. In the code, \(\dfrac{R \pi}{180}\), which is the distance in m of a 1 degree cell, is approximated to 111138 m
6.2.9 Random swimming
Ichthyop allows particles to randomly swim. This is achieved by using the SwimmingAction.java. The velocity may vary with the age of the particle.
The user provides a CSV absolute velocity file (velocity_file parameter), which must me formatted as follows:
Age (days);Speed (m/s)
0;0.1
5;0.2
15;0.3
The user also provides a boolean parameter (constant_velocity) that specifies whether the velocity should remain as defined in the CSV file, or if the absolute velocity should be randomly selected as follows:
\[
\|U\| = \|U\|_{file} \times \kappa
\]
with \(\kappa\) a random value in the \([0, 2]\) interval and \(\|U\|_{file}\) the velocity defined in the CSV file.
At each time-step, the zonal and meridonal velocities are defined as follows:
\[
U = \kappa' \varepsilon \|U\|
\]
\[
V = \varepsilon' \sqrt{\|U\|^2 - U^2}
\]
with \(\kappa'\) a random value between 0 and 1, and \(\varepsilon\) and \(\varepsilon'\) random values either equal to 1 or -1.
6.2.10 Wave drift
Ichthyop can take into account the effects of waves on the particles trajectories, following the Stokes drift equations (Stokes (2009)):
where \(w \times k \times a^2\) is the Stokes drift velocity, \(k_{wave}\) is the wave number and \(z\) is the depth.
In Ichthyop, the user provides the zonal and meridional components of the Stokes drift (\(U_{stokes}\) and \(V_{stokes}\)), the zonal and meridional wave velocities (\(U_{wave}\) and \(V_{wave}\)) and the wave period (\(T_{wave}\)).
Important
Note that all the fields provided by the user are 2D!
First, the value of \(k_{wave}\) is computed from the wave velocity and the wave period:
Then, the horizontal displacement due to the Stokes drift is computed as follows:
\[
\Delta X = F \times U_{stokes} \times \Delta t \times \exp\left(2 \times k_{wave} \times z\right)
\]
\[
\Delta Y = F \times V_{stokes} \times \Delta t \times \exp\left(2 \times k_{wave} \times z\right)
\]
with \(k_{wave}\) the wave number as computed above, \(U_{stokes}\) and \(V_{stokes}\) the zonal and meridional components of the Stokes drift, \(z\) the depth and \(F\) a multiplication factor provided by the user.
6.2.11 Rafting
The rafting process allows a particle to move at the surface, given a certain age, in order to take benefic from the ocean currents.
In Ichthyop implementation, when a particle reaches a certain age or size, then the particle is moved at the surface and will remain there.
6.2.12 Coastal behaviour
Coastal behaviour defines what is done before aplying the change in location to an Ichthyop particle
6.2.12.1 Default
The default behavior is to do nothing prior the displacement of a particle. The change in coordinate of the particle is applied whatsoever, and the particle may be inland. It remains alive but then its behavior is uncertain.
Warning
It is strongly advised not to use this default mode
6.2.12.2 Beaching
Before the particle is moved, Ichthyop checks whether the coming displacement will bring the particle inland. If so, the particle is moved and then is killed, with the BEACHED mortality status.
6.2.12.3 Standstill
Before the particle is moved, Ichthyop checks whether the coming displacement will bring the particle inland. If so, its deplacement is cancelled and the particle remains at the same position until a new displacement brings it in a water cell.
6.2.12.4 Bouncing
In the bouncing mode, Ichthyop will check whether the displacement will bring the particle inland. If so, the particle will bounce on the coast. First, whether the bouncing occurs on a meridional or a zonal coastline is determined.
In case of a meridional coastline, as shown in Figure 6.1, the calculation of the new position is performed as follows.
Let’s assume that the particle is at the position \((x, y)\) and would normally move at the postion \((x + \Delta x, y + \Delta y)\). We suppose that
\[
\Delta y = \Delta y_1 + \Delta y_2,
\tag{6.1}\]
where \(\Delta y_1\) is the meridional distance between the particle and the coastline, and \(\Delta y_2\) is the distance that the particle would travel on land.
In the bouncing mode, the position increment can be written as
By replacing \(\Delta y_2\) using Equation 6.1, we can write:
\[
\Delta_{cor} y = \Delta y_1 - (\Delta y - \Delta y_1)
\]
\[
\Delta_{cor} y = 2 \Delta y_1 - \Delta y
\]
Figure 6.1: Coastal behaviour in bouncing mode.
6.3 Biological processes
6.3.1 Orientation
Active swimming has been implemented in Ichthyop following the work of Romain Chaput. Three active swimming behaviours have been implemented: the rheotaxis orientation (i.e. against the current), the cardinal orientation (i.e toward a given direction) and the reef orientation, i.e. orientation toward points of interests.
These three implementations involve the computation of a swimming velocity and direction. The former is common to all three methods, but the directions depend on the method considered.
The orientation processes all share common features. They both depend on a swimming velocity and random directions. The methods described below differ on the way the random directions are drafted.
Swimming velocity is computed following Staaterman et al. (2012):
where \(I_{0}(\kappa)\) is the modified Bessel function of the first kind of order 0, \(\mu\) is angle where the distribution is centerred and \(\kappa\) is the concentration parameter. The distribution is as follows:
import matplotlib.pyplot as pltimport numpy as npfrom scipy.special import i0x = np.linspace(-np.pi, np.pi, 200)def von_misses(kappa): mu =0 y = np.exp(kappa*np.cos(x-mu))/(2*np.pi*i0(kappa))return yplt.figure()for i in [0.5, 1, 2, 5, 10, 20]: plt.plot(x, von_misses(i), label=f'$\kappa = {i}$')plt.legend()plt.xlim(x.min(), x.max())plt.show()
For computation purposes, all the Von Mises drafts performed in Ichthyop are done by using \(mu = 0\). The angles are thus centerred around 0. Then, the \(mu\) value is added.
Note
\(\theta = 0\) is eastward, \(\theta = \frac{\pi}{2}\) is northward, etc.
6.3.1.3 Computation of displacement
Given a swimming velocity \(V\) and a direction \(\theta\), the larva displacement (in \(m\)) is computed as follows:
\[
\Delta X = V \times \cos(\theta) \times \Delta t
\]
\[
\Delta Y = V \times \sin(\theta) \times \Delta t
\]
with \(\Delta t\) the time step. Next, the corresponding change in longitude (\(\lambda\)) and latitude (\(\varphi\)) is computed as follows:
In cardinal orientation, the user provides a fixed heading \(\theta_{card}\) and a fixed \(\kappa\) parameter. Then, at each time step, a new angle is randomly drafted following a Von Misses distribution \(f(\theta, \theta_{card}, \kappa)\).
In the reef orientation method, the larva will target the closest target area (for instance coral reef). These areas are defined in an XML zone file by a polygon and a zone-specific \(\kappa\) parameter. The user also provides the sensory detection threshold of the larva (maximum detection distance \(\beta\)).
If the distance between the particle and the barycenter of the closest reef (\(D\)) is below the detection thereshold \(\beta\), the larva will swim in the direction of the reef.
First, the angle of the current trajectory, \(\theta_{actual}\), is computed by using the particle position at the previous time step (blue point) and the actual position (red point).
\[
\Delta_X = (X_{t - 1} - X_{t})
\]
\[
\Delta_Y = (Y_{t - 1} - Y_{t})
\]
\[
\theta_{actual} = \arctan2(\Delta Y, \Delta X) + \pi
\]
The direction toward the reef, \(\theta_{reef}\) is also computed.
\[
\Delta_X = (X_{reef} - X_{t})
\]
\[
\Delta_Y = (Y_{reef} - Y_{t})
\]
\[
\theta_{reef} = \arctan2(\Delta Y, \Delta X)
\]
Warning
The angles are computed in the \((X, Y)\) space. Therefore, longitude and latitude coordinates are converted in \((X, Y)\) using the latlon2xy Dataset methods.
The turning angle \(\theta_{turning}\) is given by:
Therefore, the closest to the reef, the strongest the turning angle.
Then, a random angle is picked up following a Von Mises distribution \(f(\theta, \theta_{ponderated}, \kappa_{reef})\)
An example of a trajectory is provided below. In this case, two target destinations are provided (black boxes). The same \(\kappa\) value was used for both ares (1.2) and the \(\beta\) parameter has been set equal to 3 km.
There are 3 different implementations of the growth module. They can be selected by setting the class_name parameter in the action.growth action configuration block.
Warning
All the growth modules should be parameterized to return length in \(cm\).
6.3.2.1 Linear growth
In the linear growth method described in Lett et al. (2008), length depends on temperature but may also depend on the available food if the growth.food.enabled parameter is set to True.
If food dependence is enabled, length increment (in \(cm\)) is given by:
\[
\Delta L = \left[C1 + C2 \times \dfrac{F}{F + K_S} \times max(T, T_{thres})\right] \times \Delta t
\]
where \(\Delta t\) is the time-step (in seconds), \(C1\) and \(C2\) are parameters (coeff1 and coeff2), \(T_{thres}\) is a temperature threshold (threshold_temp parameter), \(F\) is the food quantity (read from a biogeochemical dataset), and \(K_S\) is a half-saturation constant (half_saturation parameter) and \(T\) is the temperature (read from the hydrodynamic dataset).
If food dependence is disabled, then increment is provided as follows:
\[
\Delta L = \left[C1 + C2 \times max(T, T_{thres})\right] \times \Delta t
\]
The \(max(T, T_{thres})\) term has been added to ensure that the particles keep growing with a minimum rate, though they are facing colder sea water.
The name of the food and temperature variables are provided by the food_field and temperature_field parameters.
The initial length of the particle is provided by the initial_length parameter.
6.3.2.2 Sole growth
In the Sole growth model used in Tanner et al. (2017), length increment (in \(cm\)) relies on the growth equation from Fonds (1979) :
\[
\Delta L = C1 \times T^{C2} \times \Delta t
\]
with \(L\) the length (in \(cm\)), \(T\) the temperature and \(\Delta t\) the time step seconds, and \(C1\) and \(C2\) are parameters (c1 and c2 respectively).
The temperature field is provided by the temperature_field parameter.
6.3.2.3 Exponential growth
In the exponential model, length is given by the following equation:
If the particle is an embryo (\(E_H < E_{Hb}\)), then it does not feed. Please note that, according to this definition, a larva that hatched but does not feed is considered an embryo in DEB theory. Else, the scaled functional response \(f\) is computed as:
\[
f = \dfrac{F}{F + K}
\tag{6.4}\]
with \(F\) the food vector and \(K\) the half-saturation constant.
Assimilation rates \(\{\dot{p_{Am}}\}\), energy conductance \(\dot{v}\), volume specific somatic maintenance (\([\dot{p}_M]\)) and maturity maintenances rates (\(\dot{k}_J\)) are corrected by the \(c_T\) factor.
If the accelerated DEB model is used (see e.g. Kooijman et al. (2011) and Kooijman (2014) for more details), the acceleration factor is computed as follows
with \(L_b\) the structural length of the particle when \(E_H = E_Hb\) (i.e the length at birth, i.e. first feeding) and \(L_j\) the structural length of the particle when \(E_H = E_Hj\) (i.e the length when metamorphosis occurs).
Warning
The \(L_b\) and \(L_j\) values are computed by Ichthyop when the different stages are reached.
Laure and Eline, does it seem ok?
The \(s_M\) factor is then used to multiply the assimilation rate \(\{\dot{p_{Am}}\}\) and the energy conductance \(\dot{v}\).
Consequently, the assimilation (in \(J.d^{-1}\)) is computed as follows:
In Ichthyop, there is the possibility to define temperature and salinity values below and above which the particle is killed.
The same set of parameters are used in both cases, with the temperature and salinity prefix. There are two ways to define lethal temperatures and salinities:
Using constant lethal temperatures or salinities (if temperature_file_enabled or salinity.file.enabled is set to false)
Using a CSV file containing lethal temperatures or salinities as a function of the particle class.
If constant lethal temperatures or salinities are provided, the cold and warm lethal temperatures are provided with the cold_lethal_temperature, warm_lethal_temperature, fresh_lethal_salinity, saline_lethal_salinity, .
If a CSV file is used, the lethal temperatures and salinities are provided in a CSV (lethal_temperature_file and lethal_salinity_file parameters) which is formatted as follows:
Age(days);Cold temperature (C);Warm temperature (C)0;14;222;13;226;12;22
The first column provides the class intervals, which are either the age of the particle (in days) or the length of the particle (in cm). The variable that is used to determine the class is provided by the temperature.class parameter.
Flores-Valiente, Jorge, Christophe Lett, François Colas, et al. 2023. “Influence of Combined Temperature and Food Availability on Peruvian Anchovy (Engraulis Ringens) Early Life Stages in the Northern Humboldt Current System: A Modelling Approach.”Progress in Oceanography 215: 103034. https://doi.org/https://doi.org/10.1016/j.pocean.2023.103034.
Fofonoff, Nicholas Paul, and Robert C Millard. 1983. “Algorithms for Computation of Fundamental Properties of Seawater.”UNESCO Technical Papers in Marine Science= Documents Techniques de l’Unesco Sur Les Sciences de La Mer.
Fonds, M. 1979. “Laboratory Observations on the Influence of Temperature and Salinity on Development of the Eggs and Growth of the Larvae of Solea Solea (Pisces).”Mar. Ecol. Prog. Ser 1 (9).
Kooijman, S. A. L. M. 2014. “Metabolic Acceleration in Animal Ontogeny: An Evolutionary Perspective.”Journal of Sea Research 94: 128–37. https://doi.org/https://doi.org/10.1016/j.seares.2014.06.005.
Kooijman, S. A. L. M., L. Pecquerie, S. Augustine, and M. Jusup. 2011. “Scenarios for Acceleration in Fish Development and the Role of Metamorphosis.”Journal of Sea Research 66 (4): 419–23. https://doi.org/https://doi.org/10.1016/j.seares.2011.04.016.
Kooijman, SALM. 2010. “Dynamic Energy Budget Theory for Metabolic Organisation.”Cambridge, New York.
Lett, Christophe, Philippe Verley, Christian Mullon, et al. 2008. “A Lagrangian Tool for Modelling Ichthyoplankton Dynamics.”Environmental Modelling & Software 23 (9): 1210–14. https://doi.org/https://doi.org/10.1016/j.envsoft.2008.02.005.
Millero, Frank J., and Alain Poisson. 1981. “International One-Atmosphere Equation of State of Seawater.”Deep Sea Research Part A. Oceanographic Research Papers 28 (6): 625–29. https://doi.org/https://doi.org/10.1016/0198-0149(81)90122-9.
Parada, C, CD Van Der Lingen, C Mullon, and P Penven. 2003. “Modelling the Effect of Buoyancy on the Transport of Anchovy (Engraulis Capensis) Eggs from Spawning to Nursery Grounds in the Southern Benguela: An IBM Approach.”Fisheries Oceanography 12 (3): 170–84.
Peliz, Alvaro, Patrick Marchesiello, Jesus Dubert, Martinho Marta-Almeida, Claude Roy, and Henrique Queiroga. 2007. “A Study of Crab Larvae Dispersal on the Western Iberian Shelf: Physical Processes.”Journal of Marine Systems 68 (1): 215–36. https://doi.org/https://doi.org/10.1016/j.jmarsys.2006.11.007.
Staaterman, Erica, Claire B. Paris, and Judith Helgers. 2012. “Orientation Behavior in Fish Larvae: A Missing Piece to Hjort’s Critical Period Hypothesis.”Journal of Theoretical Biology 304 (July): 188–96. https://doi.org/10.1016/j.jtbi.2012.03.016.
Stokes, George Gabriel. 2009. “On the Theory of Oscillatory Waves.” In Mathematical and Physical Papers, vol. 1. Cambridge Library Collection - Mathematics. Cambridge University Press. https://doi.org/10.1017/CBO9780511702242.013.
Tanner, Susanne E., Ana Teles-Machado, Filipe Martinho, Álvaro Peliz, and Henrique N. Cabral. 2017. “Modelling Larval Dispersal Dynamics of Common Sole (Solea Solea) Along the Western Iberian Coast.”Progress in Oceanography 156: 78–90. https://doi.org/https://doi.org/10.1016/j.pocean.2017.06.005.