class NPZD extends Ecosystem { // NPZD model including light limitation; extension to DO is below. Statevar N,P,Z,D,par,totalN; Flux Fuptake, Fingest, Fegest, Fpmort, Fzmort, Fexcret, Fremin; FreeParam mu0, ks, alpha, attSW, attP, m, I0, Ks, epsilon, fegest, zeta, Rremin; // system definition ---------------------- NPZD() { N = addVar("nutrients","N","µM"); P = addVar("phytoplankton","P","µM"); Z = addVar("zooplankton","Z","µM"); D = addVar("detritus","D","µM"); totalN = addGhostVar("total nitrogen","T","µM"); par = addGhostVar("PAR","PAR","W/m^2"); Fuptake = addFlux("uptake","uptake", N, P); Fingest = addFlux("ingestion","ingest", P, Z); Fegest = addFlux("egestion","egest", P, D); Fexcret = addFlux("excretion","excret", Z, N); Fpmort = addFlux("P mortality","Pmort", P, D); Fzmort = addFlux("Z mortality","Zmort", Z, D); Fremin = addFlux("remineralization","Fremin", D, N); mu0 = addParam("P max growth","mu0","1/d",1.3,0,3); ks = addParam("nutrient half-saturation","ks","µM",1, 0.1, 5); alpha = addParam("initial P-E slope","alpha","", 0.15, 0.01, 0.2); attSW = addParam("light attenuation by seawater","attSW","1/m",0.1, 0, 0.2); // the Environment is repsonsible for using these to calculate the light profile attP = addParam("light attenuation by phytoplankton","attP","1/µM/m", 0.02, 0, 0.05); m = addParam("P mortality","m","1/d",0.1, 0, 0.4); I0 = addParam("Z max growth","I0","1/d", 4.8, 0, 6); Ks = addParam("grazing half-saturation","Ks","µM",3, 0.1, 10); Ks.logScale = true; epsilon = addParam("Z growth efficiency","epsilon","", 0.3, 0, 1); fegest = addParam("egestion fraction","fegest","",0.5, 0, 1); zeta = addParam("Z quadratic mortality","zeta","1/µM/d",2.0, 0, 4.0); Rremin = addParam("remineralization rate","remin","1/d",0.1, 0.01, 1); Rremin.logScale = true; // sinking gets set up by the Environment: don't turn it on here } void calcFluxes() { float small = 1e-6; for (int i=0; i