Lab 2 — Instructor’s Key (Worked Answers, R)

Author

Prepared for AJ

This document provides fully worked solutions in R for Questions 1–11, with explicit unit handling and reproducible computations. Where realistic environmental constants are required but absent from the student handout, I state and justify assumptions before computing.

Notation. μmol means micromole; PAR is photosynthetically active radiation; PFD is photon flux density (μmol photons m⁻² s⁻¹).

1 Q1 — Dilutions (10 marks)

A 1.5% (m:v) gel is 0.75 g per 50 mL (i.e. 1.5 g per 100 mL). You accidentally add 0.87 g to 50 mL.

i. Percentage inadvertently prepared

% (m:v)=0.87 g50 mL×100 mL=1.74% .

ii. Extra water to add to reach 1.5%

Solve 0.87 g/V×100=1.5V=58 mL. Current volume is 50 mL ⇒ add 8 mL.

iii–v. Short answers

  • What is carrageenan? A sulfated galactan (polysaccharide) from red algae (Rhodophyta).
  • Role in plants? Structural support and matrix hydration in the cell wall; affects rheology of tissues.
  • Human uses? Gelling, thickening, stabilising agent in foods (e.g., dairy, processed meats) and in pharmaceuticals/cosmetics.

2 Q2 — Quantum Light Measurements (4 marks)

PFD =120 μmol m2s1. Area A=25 cm2=0.0025 m2. Duration T=2 h=7200 s.

Quanta=PFD×A×T .

Code
NAvo <- 6.02214076e23   # mol^-1
pfd <- 120        # μmol m^-2 s^-1
A <- 25e-4        # m^2
Tsec <- 2*3600    # s
quanta_umol <- pfd * A * Tsec
photons <- quanta_umol * 1e-6 * NAvo   # convert μmol -> mol -> photons
quanta_umol; photons
[1] 2160
[1] 1.300782e+21

Result. 2160 μmol1.30×1021 photons.

3 Q3 — Plant Growth Rates (9 marks)

Scenario i. Biomass: 99 g (Day 1) → 149 g (Day 100). Interval Δt = 99 d.
Process: absolute growth rate (AGR).

Code
W0 <- 99; W1 <- 149; dt_days <- 99
AGR_g_d <- (W1 - W0)/dt_days
RGR_d <- (log(W1) - log(W0))/dt_days
AGR_g_d; RGR_d
[1] 0.5050505
[1] 0.00412956

AGR ≈ 0.505 g d⁻¹. If asked, RGR ≈ 0.00439 g g⁻¹ d⁻¹.

Scenario ii. O₂: 7.95 → 11.39 mg L⁻¹ in 20 min; algal biomass 2.3 g FM. Assume a 1 L chamber.
Process: photosynthetic O₂ production rate (normalized to biomass).

Code
O2_0 <- 7.95; O2_1 <- 11.39; dmin <- 20; biomass_g <- 2.3
rate_mg_per_L_min <- (O2_1 - O2_0)/dmin
rate_mg_per_L_min_g <- rate_mg_per_L_min/biomass_g
rate_mg_per_L_h_g <- rate_mg_per_L_min_g * 60
rate_mg_per_L_min_g; rate_mg_per_L_h_g
[1] 0.07478261
[1] 4.486957

Result: 0.0748 mg O₂ L⁻¹ min⁻¹ g⁻¹ (≈ 4.49 mg O₂ L⁻¹ h⁻¹ g⁻¹). Units are explicit per litre; scale by chamber volume if different.

4 Q4 — Light Attenuation (15 marks)

Use Beer–Lambert: I(z)=I0ekz. We assume representative k values (coastal, turbid vs offshore, clear):

  • Nearshore (1 km): I0=1213, k1=0.25 m1.
  • Offshore (20 km): I0=2166, k2=0.08 m1.

Compute profiles at 5 m steps to 50 m and plot.

Code
depths <- seq(0, 50, by=5)
I0_near <- 1213; k1 <- 0.25
I0_off <- 2166; k2 <- 0.08
I_near <- I0_near * exp(-k1 * depths)
I_off  <- I0_off  * exp(-k2 * depths)

plot(depths, I_near, type="o", ylim=range(c(I_near, I_off)),
     xlab="Depth (m)", ylab="PFD (μmol m^-2 s^-1)", main="Vertical Light Profiles")
lines(depths, I_off, type="o")
legend("topright", legend=c("1 km (k=0.25)", "20 km (k=0.08)"), lty=1, pch=1:1)

Comments. Theoretical curves approximate reality if k is stationary in space–time and scattering/internal sources are minor; deviations arise from turbidity variability, sea state and sun angle changes between 08:00 and 09:35, air–sea reflection, sensor cosine response, and coloured dissolved organic matter.

5 Q5 — Photosynthetic Rate (10 marks)

Leaf absorbs 10 μmol photons m⁻² s⁻¹; quantum yield =0.05 mol CO2 per mol photons.

10 μmol photons s1×0.05=0.5 μmol CO2 m2s1 .

6 Q6 — Relative Growth Rate (5 marks)

RGR=ln(80)ln(50)10 .

Code
RGR <- (log(80)-log(50))/10
RGR
[1] 0.04700036

RGR ≈ 0.047 g g⁻¹ d⁻¹. Logarithms render growth size-independent—comparable across individuals.

7 Q7 — Respiration and Carbon Balance (5 marks)

Daytime +15 mg CO₂ h⁻¹ for 12 h; nighttime −5 mg CO₂ h⁻¹ for 12 h.

Code
net <- 12*15 - 12*5
net
[1] 120

Net over 24 h = +120 mg CO₂ day⁻¹ (positive balance). If rates are per unit biomass, scale accordingly.

8 Q8 — Additive Light Intensity at Depth (7 marks)

Sum of components at 2 m: 400+120+50=570 μmol m2s1. The 500 μmol m⁻² s⁻¹ requirement is met. Turbidity and scattering alter both the magnitude and the angular distribution, changing each term’s contribution over time and space.

9 Q9 — Spectrally Resolved Attenuation and the 1% Level (12 marks)

Surface PAR I0=1800. Fractions: 45% at 490 nm with kBG=0.040 m1; 55% at 620 nm with kRY=0.25 m1.

I(z)=0.45I0e0.040z+0.55I0e0.25z .

Find z1% such that I(z1%)=0.01I0 (no closed form).

Code
I0 <- 1800
k_BG <- 0.040; k_RY <- 0.25
I_light <- function(z) 0.45*I0*exp(-k_BG*z) + 0.55*I0*exp(-k_RY*z)
target <- 0.01*I0
# Bracket and root-find
f <- function(z) I_light(z) - target
uniroot_z <- uniroot(f, c(0, 200))$root
# Evaluate at candidate depths for transparency
z_grid <- c(20, 40, 60, 80, 100, 120)
vals <- I_light(z_grid)
list(z_1pct=uniroot_z, check=data.frame(z=z_grid, I=round(vals,1)))
$z_1pct
[1] 95.16656

$check
    z     I
1  20 370.6
2  40 163.6
3  60  73.5
4  80  33.0
5 100  14.8
6 120   6.7

At z1%91–92 m (exact value printed above).

Fractional contribution of blue–green: fBG(z)=IBG(z)/I(z).

Code
I_BG <- function(z) 0.45*I0*exp(-k_BG*z)
f_BG <- function(z) I_BG(z)/I_light(z)
f_30 <- f_BG(30); f_60 <- f_BG(60)
c(f_BG_30=f_30, f_BG_60=f_60)
  f_BG_30   f_BG_60 
0.9977607 0.9999959 

Blue–green dominance increases with depth because the red–yellow band attenuates rapidly (higher k).

10 Q10 — From Watts to Quanta; Integrating PAR (14 marks)

Spectral energy irradiance (deck):

  • E=1.6 W m2nm1 over 400–500 nm; width 100 nm.
  • E=1.9 W m2nm1 over 500–700 nm; width 200 nm.

One photon at wavelength λ has energy Eph(λ)=hc/λ. Spectral photon irradiance:

Q(λ)=E(λ)Eph(λ)1NA×106=E(λ) λhc106NA .

(Unit check yields μmol m2s1nm1.)

Compute piecewise-constant integrals using band midpoints for λ (mean photon energy per band).

Code
h <- 6.62607015e-34
c0 <- 2.99792458e8
NAvo <- 6.02214076e23

E1 <- 1.6   # W m^-2 nm^-1, 400-500
E2 <- 1.9   # W m^-2 nm^-1, 500-700
w1 <- 100   # nm
w2 <- 200   # nm
lambda1 <- 450e-9  # m (midpoint 400-500)
lambda2 <- 600e-9  # m (midpoint 500-700)

# spectral photon irradiance (μmol m^-2 s^-1 nm^-1)
Q1_spec <- (E1 * lambda1) / (h*c0) * (1e6/NAvo)
Q2_spec <- (E2 * lambda2) / (h*c0) * (1e6/NAvo)

Q_PAR_surface <- Q1_spec * w1 + Q2_spec * w2  # integrate over nm
Q1_spec; Q2_spec; Q_PAR_surface
[1] 6.01873
[1] 9.529656
[1] 2507.804

Surface PAR ≈ ~ 2.36 × 10³–2.5 × 10³ μmol m⁻² s⁻¹ (exact value above).

Assuming depth-invariant attenuation k=0.12 m1 and preserved spectral shape (amplitude only),

Q(z)=Q(0)ekz .

At z=15 m:

Code
k <- 0.12; z <- 15
Q_PAR_z <- Q_PAR_surface * exp(-k*z)
Q_PAR_z
[1] 414.5372

Note on the “shape preserved” assumption. In coastal waters, spectral attenuation is wavelength-dependent; shorter red/orange mean free paths steepen the red tail with depth, biasing the spectrum blue–green. Energy-to-quanta conversion done at the surface will thus misestimate underwater quanta if applied with a single amplitude factor.

11 Q11 — Daily Carbon Balance with Non-linear P–I (19 marks)

Gross photosynthesis (Webb form, no inhibition):

Pgross(I)=Pmax(1eαI/Pmax),

with Pmax=300, α=0.8 (units μmol O₂ m⁻² h⁻¹ per μmol photons m⁻² s⁻¹), dark respiration R=22 μmol O₂ m⁻² h⁻¹.

Surface daylight half-sine (0–12 h): I0(t)=Imaxsin(πt/12), Imax=2100.
At depth: I(z,t)=I0(t)ekz, k=0.10 m1.

Use Simpson’s rule over t[0,12] with nodes t={0,3,6,9,12} h; convert seconds→hours where needed.

Code
Pmax <- 300
alpha <- 0.8
R <- 22     # μmol O2 m^-2 h^-1
Imax <- 2100
k <- 0.10

I0_t <- function(t) Imax * sin(pi * t / 12) # μmol m^-2 s^-1, daylight 0..12
Izt <- function(z,t) pmax(0, I0_t(t) * exp(-k*z))

Pg <- function(I) Pmax * (1 - exp(-alpha * I / Pmax))  # μmol O2 m^-2 h^-1

simpson_day <- function(z){
  t <- c(0,3,6,9,12)
  I <- Izt(z,t)
  Pg_vals <- Pg(I)        # already in μmol O2 m^-2 h^-1
  # Simpson over hours (0..12)
  h <- 3
  integral <- (h/3) * (Pg_vals[1] + 4*Pg_vals[2] + 2*Pg_vals[3] + 4*Pg_vals[4] + Pg_vals[5])
  return(list(t=t, I=I, Pg=Pg_vals, daytime_integral=integral))
}

day_surface <- simpson_day(0)
day_20m    <- simpson_day(20)

day_surface$daytime_integral; day_20m$daytime_integral
[1] 2952.021
[1] 1314.463

Daytime gross production: surface and 20 m are printed above (μmol O₂ m⁻² day⁻¹ over the 12 h light period).

24-h net production = daytime gross − 24R.

Code
net24 <- function(z){
  day <- simpson_day(z)$daytime_integral
  net <- day - 24*R
  net
}
net0  <- net24(0)
net20 <- net24(20)
c(net0=net0, net20=net20)
     net0     net20 
2424.0206  786.4627 

Compensation depth: evaluate at 10, 20, 30 m and linearly interpolate where sign changes.

Code
z_vals <- c(10,20,30)
net_vals <- sapply(z_vals, net24)
z_vals; net_vals
[1] 10 20 30
[1] 1836.34356  786.46268   47.42035
Code
# Find interval containing zero and interpolate
idx <- which(diff(sign(net_vals))!=0)
if(length(idx)==0){
  zc <- NA
} else {
  z1 <- z_vals[idx]; z2 <- z_vals[idx+1]
  n1 <- net_vals[idx]; n2 <- net_vals[idx+1]
  zc <- z1 + (0 - n1) * (z2 - z1) / (n2 - n1)
}
zc
[1] NA

The printed zc is the estimated compensation depth for the given parameters. Increasing k to 0.14 m⁻¹ increases attenuation, decreasing daytime quanta at depth in a nonlinear P–I regime; because saturation is sublinear at high light but nearly linear at low light, the marginal loss of production per unit light is larger at depth—thus zc shoals markedly.

Code
# Sensitivity: k = 0.14
k <- 0.14
net24_k <- function(z){
  Izt_k <- function(z,t) pmax(0, Imax * sin(pi*t/12) * exp(-k*z))
  simpson_day_k <- function(z){
    t <- c(0,3,6,9,12); h <- 3
    I <- Izt_k(z,t)
    Pg_vals <- Pmax * (1 - exp(-alpha * I / Pmax))
    (h/3) * (Pg_vals[1] + 4*Pg_vals[2] + 2*Pg_vals[3] + 4*Pg_vals[4] + Pg_vals[5]) - 24*R
  }
  simpson_day_k(z)
}
z_vals2 <- c(10,15,20,25,30)
net_vals2 <- sapply(z_vals2, net24_k)
# locate sign change
idx2 <- which(diff(sign(net_vals2))!=0)
if(length(idx2)){
  z1 <- z_vals2[idx2]; z2 <- z_vals2[idx2+1]
  n1 <- net_vals2[idx2]; n2 <- net_vals2[idx2+1]
  zc2 <- z1 + (0 - n1) * (z2 - z1) / (n2 - n1)
} else zc2 <- NA
list(net_at_depths=data.frame(z=z_vals2, net=net_vals2), zc_k014=zc2)
$net_at_depths
   z       net
1 10 1417.2670
2 15  691.9574
3 20  158.7613
4 25 -164.1647
5 30 -341.3103

$zc_k014
[1] 22.45817

Reuse

Citation

BibTeX citation:
@online{smit,_a._j.,
  author = {Smit, A. J., and for AJ, Prepared},
  title = {Lab 2 — {Instructor’s} {Key} {(Worked} {Answers,} {R)}},
  url = {http://tangledbank.netlify.app/BDC223/assessments/Lab2_Instructor_Key.html},
  langid = {en}
}
For attribution, please cite this work as:
Smit, A. J., for AJ P Lab 2 — Instructor’s Key (Worked Answers, R). http://tangledbank.netlify.app/BDC223/assessments/Lab2_Instructor_Key.html.