diff-grok 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/license-updater/SKILL.md +149 -0
- package/.claude/skills/license-updater/references/compatibility.md +68 -0
- package/.claude/skills/license-updater/references/templates.md +151 -0
- package/.claude/skills/license-updater/scripts/generate_license_files.py +467 -0
- package/CLAUDE.md +10 -4
- package/LICENSE +1 -1
- package/README.MD +41 -23
- package/THIRD_PARTY_LICENSES +135 -0
- package/docs/.nojekyll +1 -0
- package/docs/assets/hierarchy.js +1 -0
- package/docs/assets/highlight.css +99 -0
- package/docs/assets/icons.js +18 -0
- package/docs/assets/icons.svg +1 -0
- package/docs/assets/main.js +60 -0
- package/docs/assets/navigation.js +1 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +1633 -0
- package/docs/classes/BasicModelPipelineCreator.html +10 -0
- package/docs/classes/Callback.html +7 -0
- package/docs/classes/CyclicModelPipelineCreator.html +10 -0
- package/docs/classes/IterCheckerCallback.html +8 -0
- package/docs/classes/PipelineCreator.html +6 -0
- package/docs/classes/TimeCheckerCallback.html +8 -0
- package/docs/classes/UpdatesModelPipelineCreator.html +10 -0
- package/docs/functions/ab4.html +8 -0
- package/docs/functions/ab5.html +8 -0
- package/docs/functions/applyPipeline.html +9 -0
- package/docs/functions/getCallback.html +3 -0
- package/docs/functions/getIVP.html +6 -0
- package/docs/functions/getInputVector.html +2 -0
- package/docs/functions/getIvp2WebWorker.html +6 -0
- package/docs/functions/getJScode.html +6 -0
- package/docs/functions/getOutputNames.html +4 -0
- package/docs/functions/getPipelineCreator.html +7 -0
- package/docs/functions/lsoda.html +8 -0
- package/docs/functions/mrt.html +11 -0
- package/docs/functions/printE5.html +76 -0
- package/docs/functions/printHires.html +76 -0
- package/docs/functions/printOrego.html +66 -0
- package/docs/functions/printPollution.html +163 -0
- package/docs/functions/printRobertson.html +60 -0
- package/docs/functions/printVdpol.html +66 -0
- package/docs/functions/rk3.html +8 -0
- package/docs/functions/rk4.html +8 -0
- package/docs/functions/rkdp.html +8 -0
- package/docs/functions/ros34prw.html +8 -0
- package/docs/functions/ros3prw.html +8 -0
- package/docs/functions/solveIvp.html +5 -0
- package/docs/hierarchy.html +1 -0
- package/docs/index.html +768 -0
- package/docs/media/CONTRIBUTING.md +74 -0
- package/docs/media/E5.png +0 -0
- package/docs/media/HIRES.png +0 -0
- package/docs/media/OREGO.png +0 -0
- package/docs/media/POLL-full.png +0 -0
- package/docs/media/POLL.png +0 -0
- package/docs/media/ROBER.png +0 -0
- package/docs/media/VDP0L.png +0 -0
- package/docs/media/VDPOL.png +0 -0
- package/docs/media/acid-prod.gif +0 -0
- package/docs/media/basic-use.js +40 -0
- package/docs/media/basic-use.js.map +1 -0
- package/docs/media/basic-use.ts +44 -0
- package/docs/media/check-methods.js +59 -0
- package/docs/media/check-methods.js.map +1 -0
- package/docs/media/check-methods.ts +81 -0
- package/docs/media/corr-probs.js +132 -0
- package/docs/media/corr-probs.js.map +1 -0
- package/docs/media/corr-probs.ts +155 -0
- package/docs/media/cyclic-model.js +102 -0
- package/docs/media/cyclic-model.js.map +1 -0
- package/docs/media/cyclic-model.ts +112 -0
- package/docs/media/e5.js +36 -0
- package/docs/media/e5.js.map +1 -0
- package/docs/media/e5.ts +36 -0
- package/docs/media/hires.js +39 -0
- package/docs/media/hires.js.map +1 -0
- package/docs/media/hires.ts +40 -0
- package/docs/media/model-updates.js +112 -0
- package/docs/media/model-updates.js.map +1 -0
- package/docs/media/model-updates.ts +122 -0
- package/docs/media/orego.js +24 -0
- package/docs/media/orego.js.map +1 -0
- package/docs/media/orego.ts +25 -0
- package/docs/media/pipeline-use.js +87 -0
- package/docs/media/pipeline-use.js.map +1 -0
- package/docs/media/pipeline-use.ts +98 -0
- package/docs/media/pollution.js +132 -0
- package/docs/media/pollution.js.map +1 -0
- package/docs/media/pollution.ts +133 -0
- package/docs/media/print-benchmark.js +581 -0
- package/docs/media/print-benchmark.js.map +1 -0
- package/docs/media/print-benchmark.ts +594 -0
- package/docs/media/robertson.js +19 -0
- package/docs/media/robertson.js.map +1 -0
- package/docs/media/robertson.ts +19 -0
- package/docs/media/scripting.js +30 -0
- package/docs/media/scripting.js.map +1 -0
- package/docs/media/scripting.ts +35 -0
- package/docs/media/vdpol.js +17 -0
- package/docs/media/vdpol.js.map +1 -0
- package/docs/media/vdpol.ts +17 -0
- package/docs/modules.html +1 -0
- package/docs/types/Arg.html +12 -0
- package/docs/types/DifEqs.html +8 -0
- package/docs/types/Func.html +7 -0
- package/docs/types/IVP.html +40 -0
- package/docs/types/IVP2WebWorker.html +12 -0
- package/docs/types/Input.html +8 -0
- package/docs/types/Loop.html +7 -0
- package/docs/types/ODEs.html +31 -0
- package/docs/types/Output.html +6 -0
- package/docs/types/Pipeline.html +6 -0
- package/docs/types/SolverOptions.html +8 -0
- package/docs/types/Update.html +9 -0
- package/docs/types/Wrapper.html +8 -0
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/index.ts +1 -1
- package/package.json +4 -2
- package/src/examples/check-methods.js +15 -3
- package/src/examples/check-methods.js.map +1 -1
- package/src/examples/check-methods.ts +18 -3
- package/src/solver-tools/cvode/common.js +487 -0
- package/src/solver-tools/cvode/common.js.map +1 -0
- package/src/solver-tools/cvode/common.ts +549 -0
- package/src/solver-tools/cvode/cvode.js +1062 -0
- package/src/solver-tools/cvode/cvode.js.map +1 -0
- package/src/solver-tools/cvode/cvode.ts +1226 -0
- package/src/solver-tools/cvode/cvode_adams.js +124 -0
- package/src/solver-tools/cvode/cvode_adams.js.map +1 -0
- package/src/solver-tools/cvode/cvode_adams.ts +142 -0
- package/src/solver-tools/cvode/cvode_bdf.js +153 -0
- package/src/solver-tools/cvode/cvode_bdf.js.map +1 -0
- package/src/solver-tools/cvode/cvode_bdf.ts +164 -0
- package/src/solver-tools/cvode/cvode_class.js +158 -0
- package/src/solver-tools/cvode/cvode_class.js.map +1 -0
- package/src/solver-tools/cvode/cvode_class.ts +271 -0
- package/src/solver-tools/cvode/cvode_hin.js +119 -0
- package/src/solver-tools/cvode/cvode_hin.js.map +1 -0
- package/src/solver-tools/cvode/cvode_hin.ts +150 -0
- package/src/solver-tools/cvode/cvode_io.js +203 -0
- package/src/solver-tools/cvode/cvode_io.js.map +1 -0
- package/src/solver-tools/cvode/cvode_io.ts +258 -0
- package/src/solver-tools/cvode/cvode_ls.js +210 -0
- package/src/solver-tools/cvode/cvode_ls.js.map +1 -0
- package/src/solver-tools/cvode/cvode_ls.ts +249 -0
- package/src/solver-tools/cvode/cvode_nls.js +220 -0
- package/src/solver-tools/cvode/cvode_nls.js.map +1 -0
- package/src/solver-tools/cvode/cvode_nls.ts +259 -0
- package/src/solver-tools/cvode/cvode_root.js +415 -0
- package/src/solver-tools/cvode/cvode_root.js.map +1 -0
- package/src/solver-tools/cvode/cvode_root.ts +503 -0
- package/src/solver-tools/cvode/dense_linalg.js +131 -0
- package/src/solver-tools/cvode/dense_linalg.js.map +1 -0
- package/src/solver-tools/cvode/dense_linalg.ts +144 -0
- package/src/solver-tools/cvode/index.js +26 -0
- package/src/solver-tools/cvode/index.js.map +1 -0
- package/src/solver-tools/cvode/index.ts +64 -0
- package/src/solver-tools/cvode-method.js +114 -0
- package/src/solver-tools/cvode-method.js.map +1 -0
- package/src/solver-tools/cvode-method.ts +129 -0
- package/src/solver-tools/index.js +1 -0
- package/src/solver-tools/index.js.map +1 -1
- package/src/solver-tools/index.ts +1 -0
- package/src/solver-tools/lsoda/blas.js +11 -0
- package/src/solver-tools/lsoda/blas.js.map +1 -1
- package/src/solver-tools/lsoda/blas.ts +12 -0
- package/src/solver-tools/lsoda/cfode.js +11 -0
- package/src/solver-tools/lsoda/cfode.js.map +1 -1
- package/src/solver-tools/lsoda/cfode.ts +12 -0
- package/src/solver-tools/lsoda/corfailure.js +11 -0
- package/src/solver-tools/lsoda/corfailure.js.map +1 -1
- package/src/solver-tools/lsoda/corfailure.ts +12 -0
- package/src/solver-tools/lsoda/correction.js +11 -0
- package/src/solver-tools/lsoda/correction.js.map +1 -1
- package/src/solver-tools/lsoda/correction.ts +12 -0
- package/src/solver-tools/lsoda/dense.js +11 -0
- package/src/solver-tools/lsoda/dense.js.map +1 -1
- package/src/solver-tools/lsoda/dense.ts +12 -0
- package/src/solver-tools/lsoda/index.js +11 -0
- package/src/solver-tools/lsoda/index.js.map +1 -1
- package/src/solver-tools/lsoda/index.ts +12 -0
- package/src/solver-tools/lsoda/intdy.js +11 -0
- package/src/solver-tools/lsoda/intdy.js.map +1 -1
- package/src/solver-tools/lsoda/intdy.ts +12 -0
- package/src/solver-tools/lsoda/lsoda.js +11 -0
- package/src/solver-tools/lsoda/lsoda.js.map +1 -1
- package/src/solver-tools/lsoda/lsoda.ts +12 -0
- package/src/solver-tools/lsoda/methodswitch.js +11 -0
- package/src/solver-tools/lsoda/methodswitch.js.map +1 -1
- package/src/solver-tools/lsoda/methodswitch.ts +12 -0
- package/src/solver-tools/lsoda/orderswitch.js +11 -0
- package/src/solver-tools/lsoda/orderswitch.js.map +1 -1
- package/src/solver-tools/lsoda/orderswitch.ts +12 -0
- package/src/solver-tools/lsoda/prja.js +11 -0
- package/src/solver-tools/lsoda/prja.js.map +1 -1
- package/src/solver-tools/lsoda/prja.ts +12 -0
- package/src/solver-tools/lsoda/scaleh.js +11 -0
- package/src/solver-tools/lsoda/scaleh.js.map +1 -1
- package/src/solver-tools/lsoda/scaleh.ts +12 -0
- package/src/solver-tools/lsoda/solsy.js +11 -0
- package/src/solver-tools/lsoda/solsy.js.map +1 -1
- package/src/solver-tools/lsoda/solsy.ts +12 -0
- package/src/solver-tools/lsoda/stoda.js +11 -0
- package/src/solver-tools/lsoda/stoda.js.map +1 -1
- package/src/solver-tools/lsoda/stoda.ts +12 -0
- package/src/solver-tools/lsoda-method.js +23 -9
- package/src/solver-tools/lsoda-method.js.map +1 -1
- package/src/solver-tools/lsoda-method.ts +27 -9
- package/src/solver-tools/solver-defs.js +1 -0
- package/src/solver-tools/solver-defs.js.map +1 -1
- package/src/solver-tools/solver-defs.ts +1 -0
- package/src/tests/cvode-lib-correctness.test.js +404 -0
- package/src/tests/cvode-lib-correctness.test.js.map +1 -0
- package/src/tests/cvode-lib-correctness.test.ts +505 -0
- package/src/tests/cvode-lib-performance.test.js +103 -0
- package/src/tests/cvode-lib-performance.test.js.map +1 -0
- package/src/tests/cvode-lib-performance.test.ts +128 -0
- package/src/tests/performance.test.js +4 -2
- package/src/tests/performance.test.js.map +1 -1
- package/src/tests/performance.test.ts +4 -2
- package/src/tests/test-defs.js +7 -1
- package/src/tests/test-defs.js.map +1 -1
- package/src/tests/test-defs.ts +8 -1
- package/src/worker-tools/solving.js +3 -1
- package/src/worker-tools/solving.js.map +1 -1
- package/src/worker-tools/solving.ts +4 -1
- package/src/examples/bioreactor.js +0 -125
- package/src/examples/bioreactor.js.map +0 -1
- package/src/examples/bioreactor.ts +0 -132
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import {Cvode, CvodeOptions, CvodeSolveResult} from '../solver-tools/cvode';
|
|
2
|
+
import {ODEs} from '../../index';
|
|
3
|
+
import {robertson, robertsonReferencePoint} from '../examples/robertson';
|
|
4
|
+
import {hires, hiresReferencePoint} from '../examples/hires';
|
|
5
|
+
import {vdpol, vdpolReferencePoint} from '../examples/vdpol';
|
|
6
|
+
import {orego, oregoReferencePoint} from '../examples/orego';
|
|
7
|
+
import {e5, e5ReferencePoint} from '../examples/e5';
|
|
8
|
+
import {pollution, pollutionReferencePoint} from '../examples/pollution';
|
|
9
|
+
|
|
10
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
interface SolverOpts {
|
|
13
|
+
mxstep?: number;
|
|
14
|
+
hmax?: number;
|
|
15
|
+
rtol?: Float64Array;
|
|
16
|
+
atol?: Float64Array;
|
|
17
|
+
/** Small initial tout to bootstrap very stiff problems before the main loop. */
|
|
18
|
+
warmupTout?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Solves a benchmark problem using CVODE, checks accuracy against the reference point. */
|
|
22
|
+
function solveBenchmarkAndCheck(
|
|
23
|
+
ode: ODEs, referencePoint: Float64Array, relTol: number, absTol: number, opts?: SolverOpts,
|
|
24
|
+
): void {
|
|
25
|
+
const neq = ode.initial.length;
|
|
26
|
+
const tol = ode.tolerance;
|
|
27
|
+
|
|
28
|
+
// Build CvodeOptions
|
|
29
|
+
const cvodeOpts: CvodeOptions = {lmm: 'bdf'};
|
|
30
|
+
|
|
31
|
+
// Handle tolerances
|
|
32
|
+
if (opts?.rtol && opts?.atol) {
|
|
33
|
+
cvodeOpts.rtol = opts.rtol[0];
|
|
34
|
+
cvodeOpts.atol = opts.atol;
|
|
35
|
+
} else if (opts?.rtol)
|
|
36
|
+
cvodeOpts.rtol = opts.rtol[0];
|
|
37
|
+
else if (opts?.atol)
|
|
38
|
+
cvodeOpts.atol = opts.atol;
|
|
39
|
+
else {
|
|
40
|
+
cvodeOpts.rtol = tol;
|
|
41
|
+
cvodeOpts.atol = tol;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (opts?.mxstep) cvodeOpts.maxSteps = opts.mxstep;
|
|
45
|
+
if (opts?.hmax) cvodeOpts.maxStep = opts.hmax;
|
|
46
|
+
|
|
47
|
+
const y0 = Float64Array.from(ode.initial);
|
|
48
|
+
const solver = new Cvode(ode.func, neq, ode.arg.start, y0, cvodeOpts);
|
|
49
|
+
|
|
50
|
+
// Warmup phase: bootstrap very stiff problems with a small initial tout
|
|
51
|
+
if (opts?.warmupTout !== undefined) {
|
|
52
|
+
const result = solver.solve(opts.warmupTout);
|
|
53
|
+
expect(result.flag).toBeGreaterThanOrEqual(0);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const t = opts?.warmupTout ?? ode.arg.start;
|
|
57
|
+
let tout = t + ode.arg.step;
|
|
58
|
+
const finish = ode.arg.finish;
|
|
59
|
+
let lastResult: CvodeSolveResult;
|
|
60
|
+
|
|
61
|
+
while (tout <= finish + ode.arg.step / 2) {
|
|
62
|
+
lastResult = solver.solve(tout);
|
|
63
|
+
if (lastResult.flag < 0)
|
|
64
|
+
throw new Error(`${ode.name}: solver failed at t=${lastResult.t} with flag=${lastResult.flag}`);
|
|
65
|
+
tout += ode.arg.step;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Check final solution against reference point
|
|
69
|
+
const y = lastResult!.y;
|
|
70
|
+
for (let j = 0; j < neq; j++) {
|
|
71
|
+
const absErr = Math.abs(y[j] - referencePoint[j]);
|
|
72
|
+
const allowed = relTol * Math.abs(referencePoint[j]) + absTol;
|
|
73
|
+
expect(absErr).toBeLessThan(allowed);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ─── Performance tests ──────────────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
// Robertson: components span many orders of magnitude; use component-wise atol
|
|
80
|
+
describe('Robertson', () => {
|
|
81
|
+
it('should solve correctly', () => {
|
|
82
|
+
solveBenchmarkAndCheck(robertson, robertsonReferencePoint, 1e-2, 1e-7, {
|
|
83
|
+
mxstep: 50000,
|
|
84
|
+
atol: new Float64Array([1e-8, 1e-14, 1e-8]),
|
|
85
|
+
rtol: new Float64Array([1e-7, 1e-7, 1e-7]),
|
|
86
|
+
});
|
|
87
|
+
}, 60000);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('HIRES', () => {
|
|
91
|
+
it('should solve correctly', () => {
|
|
92
|
+
solveBenchmarkAndCheck(hires, hiresReferencePoint, 1e-3, 1e-12);
|
|
93
|
+
}, 60000);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// Van der Pol (mu=1000): very stiff, needs many internal steps
|
|
97
|
+
describe('van der Pol', () => {
|
|
98
|
+
it('should solve correctly', () => {
|
|
99
|
+
solveBenchmarkAndCheck(vdpol, vdpolReferencePoint, 1e-3, 1e-6, {
|
|
100
|
+
mxstep: 50000,
|
|
101
|
+
});
|
|
102
|
+
}, 60000);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe('OREGO', () => {
|
|
106
|
+
it('should solve correctly', () => {
|
|
107
|
+
solveBenchmarkAndCheck(orego, oregoReferencePoint, 1e-2, 1e-6);
|
|
108
|
+
}, 60000);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// E5: extremely stiff (rate constants span 20 orders of magnitude).
|
|
112
|
+
// Known limitation: CVODE BDF with dense direct solver hits convergence failures
|
|
113
|
+
// on this extreme problem. LSODA handles it via automatic stiff/non-stiff switching.
|
|
114
|
+
// TODO: revisit when band/iterative solvers or preconditioners are added.
|
|
115
|
+
describe('E5', () => {
|
|
116
|
+
it.skip('should solve correctly (known limitation: CV_CONV_FAILURE)', () => {
|
|
117
|
+
solveBenchmarkAndCheck(e5, e5ReferencePoint, 1, 1e-6, {
|
|
118
|
+
mxstep: 50000,
|
|
119
|
+
warmupTout: 1e-5,
|
|
120
|
+
});
|
|
121
|
+
}, 60000);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('Pollution', () => {
|
|
125
|
+
it('should solve correctly', () => {
|
|
126
|
+
solveBenchmarkAndCheck(pollution, pollutionReferencePoint, 1e-2, 1e-10);
|
|
127
|
+
}, 60000);
|
|
128
|
+
});
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// Performance tests
|
|
2
2
|
import { perfProbs } from '../../index';
|
|
3
|
-
import { implicitMethods, TIMEOUT_MS } from './test-defs';
|
|
3
|
+
import { implicitMethods, perfExclusions, TIMEOUT_MS } from './test-defs';
|
|
4
4
|
implicitMethods.forEach((method, name) => {
|
|
5
5
|
describe(`${name}`, () => {
|
|
6
|
+
const excluded = perfExclusions.get(name);
|
|
6
7
|
perfProbs.forEach((odes) => {
|
|
7
|
-
|
|
8
|
+
const testFn = (excluded === null || excluded === void 0 ? void 0 : excluded.has(odes.name)) ? test.skip : test;
|
|
9
|
+
testFn(`${odes.name}`, () => {
|
|
8
10
|
const start = performance.now();
|
|
9
11
|
method(odes);
|
|
10
12
|
const elapsed = performance.now() - start;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.test.js","sourceRoot":"","sources":["performance.test.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,eAAe,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"performance.test.js","sourceRoot":"","sources":["performance.test.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,eAAe,EAAE,cAAc,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;AAExE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IACvC,QAAQ,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE;QACvB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;gBAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACb,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
// Performance tests
|
|
2
2
|
|
|
3
3
|
import {perfProbs} from '../../index';
|
|
4
|
-
import {implicitMethods, TIMEOUT_MS} from './test-defs';
|
|
4
|
+
import {implicitMethods, perfExclusions, TIMEOUT_MS} from './test-defs';
|
|
5
5
|
|
|
6
6
|
implicitMethods.forEach((method, name) => {
|
|
7
7
|
describe(`${name}`, () => {
|
|
8
|
+
const excluded = perfExclusions.get(name);
|
|
8
9
|
perfProbs.forEach((odes) => {
|
|
9
|
-
|
|
10
|
+
const testFn = excluded?.has(odes.name) ? test.skip : test;
|
|
11
|
+
testFn(`${odes.name}`, () => {
|
|
10
12
|
const start = performance.now();
|
|
11
13
|
method(odes);
|
|
12
14
|
const elapsed = performance.now() - start;
|
package/src/tests/test-defs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable max-len */
|
|
2
|
-
import { mrt, ros3prw, ros34prw, rk4, ab5, ab4, rkdp, rk3, lsoda } from '../../index';
|
|
2
|
+
import { mrt, ros3prw, ros34prw, rk4, ab5, ab4, rkdp, rk3, lsoda, cvode } from '../../index';
|
|
3
3
|
export const methods = new Map([
|
|
4
4
|
['MRT', mrt],
|
|
5
5
|
['ROS3PRw', ros3prw],
|
|
@@ -10,6 +10,7 @@ export const methods = new Map([
|
|
|
10
10
|
['RKDP', rkdp],
|
|
11
11
|
['RK3', rk3],
|
|
12
12
|
['LSODA', lsoda],
|
|
13
|
+
['CVODE', cvode],
|
|
13
14
|
]);
|
|
14
15
|
/** Implicit methods suitable for stiff performance benchmarks */
|
|
15
16
|
export const implicitMethods = new Map([
|
|
@@ -17,6 +18,11 @@ export const implicitMethods = new Map([
|
|
|
17
18
|
['ROS3PRw', ros3prw],
|
|
18
19
|
['ROS34PRw', ros34prw],
|
|
19
20
|
['LSODA', lsoda],
|
|
21
|
+
['CVODE', cvode],
|
|
22
|
+
]);
|
|
23
|
+
/** Performance problems to skip per method (known limitations) */
|
|
24
|
+
export const perfExclusions = new Map([
|
|
25
|
+
['CVODE', new Set(['E5'])],
|
|
20
26
|
]);
|
|
21
27
|
export const MAX_MAD = 0.1;
|
|
22
28
|
export const TIMEOUT_MS = 10000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-defs.js","sourceRoot":"","sources":["test-defs.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"test-defs.js","sourceRoot":"","sources":["test-defs.ts"],"names":[],"mappings":"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"}
|
package/src/tests/test-defs.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable max-len */
|
|
2
|
-
import {mrt, ros3prw, ros34prw, rk4, ab5, ab4, rkdp, rk3, lsoda} from '../../index';
|
|
2
|
+
import {mrt, ros3prw, ros34prw, rk4, ab5, ab4, rkdp, rk3, lsoda, cvode} from '../../index';
|
|
3
3
|
|
|
4
4
|
export const methods = new Map([
|
|
5
5
|
['MRT', mrt],
|
|
@@ -11,6 +11,7 @@ export const methods = new Map([
|
|
|
11
11
|
['RKDP', rkdp],
|
|
12
12
|
['RK3', rk3],
|
|
13
13
|
['LSODA', lsoda],
|
|
14
|
+
['CVODE', cvode],
|
|
14
15
|
]);
|
|
15
16
|
|
|
16
17
|
/** Implicit methods suitable for stiff performance benchmarks */
|
|
@@ -19,6 +20,12 @@ export const implicitMethods = new Map([
|
|
|
19
20
|
['ROS3PRw', ros3prw],
|
|
20
21
|
['ROS34PRw', ros34prw],
|
|
21
22
|
['LSODA', lsoda],
|
|
23
|
+
['CVODE', cvode],
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
/** Performance problems to skip per method (known limitations) */
|
|
27
|
+
export const perfExclusions = new Map<string, Set<string>>([
|
|
28
|
+
['CVODE', new Set(['E5'])],
|
|
22
29
|
]);
|
|
23
30
|
|
|
24
31
|
export const MAX_MAD = 0.1;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Tools for solving IVPs in web-workers
|
|
2
|
-
import { mrt, ros3prw, ros34prw, getCallback, rk4, ab5, ab4, rkdp, rk3, lsoda } from '../solver-tools';
|
|
2
|
+
import { mrt, ros3prw, ros34prw, getCallback, rk4, ab5, ab4, rkdp, rk3, lsoda, cvode } from '../solver-tools';
|
|
3
3
|
import { getFunc } from './scripting';
|
|
4
4
|
const ARG_INIT = 0;
|
|
5
5
|
const ARG_FINAL = 1;
|
|
@@ -24,6 +24,8 @@ function getMethod(name) {
|
|
|
24
24
|
return rk3;
|
|
25
25
|
case 'lsoda':
|
|
26
26
|
return lsoda;
|
|
27
|
+
case 'cvode':
|
|
28
|
+
return cvode;
|
|
27
29
|
default:
|
|
28
30
|
return ros34prw;
|
|
29
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solving.js","sourceRoot":"","sources":["solving.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,EAAe,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAQ,WAAW,EAC7D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"solving.js","sourceRoot":"","sources":["solving.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,EAAe,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAQ,WAAW,EAC7D,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAgB,OAAO,EAAC,MAAM,aAAa,CAAC;AAEnD,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,oCAAoC;AACpC,SAAS,SAAS,CAAC,IAAwB;IACzC,QAAQ,IAAI,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QAEb,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC;QAEjB,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QAEb,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QAEb,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QAEb,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QAEd,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QAEb,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QAEf,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QAEf;YACE,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,SAAS,WAAW,CAAC,GAAkB,EAAE,MAAoB;IAC3D,MAAM,QAAQ,GAAG,aAAa,GAAG,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;IAEvE,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM;QAC1B,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAChG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAkB,EAAE,MAAoB;IAC/D,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;IAElE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAS,CAAC;IAE5C,MAAM,IAAI,GAAS;QACjB,IAAI,EAAE,EAAE;QACR,GAAG,EAAE;YACH,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC;YACzB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC;SACvB;QACD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,mBAAmB,CAAC;QACxD,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Tools for solving IVPs in web-workers
|
|
2
2
|
|
|
3
3
|
import {SolverMethod, mrt, ros3prw, ros34prw, ODEs, getCallback,
|
|
4
|
-
rk4, ab5, ab4, rkdp, rk3, lsoda} from '../solver-tools';
|
|
4
|
+
rk4, ab5, ab4, rkdp, rk3, lsoda, cvode} from '../solver-tools';
|
|
5
5
|
import {Func} from '../solver-tools/solver-defs';
|
|
6
6
|
import {IVP2WebWorker, getFunc} from './scripting';
|
|
7
7
|
|
|
@@ -37,6 +37,9 @@ function getMethod(name: string | undefined): SolverMethod {
|
|
|
37
37
|
case 'lsoda':
|
|
38
38
|
return lsoda;
|
|
39
39
|
|
|
40
|
+
case 'cvode':
|
|
41
|
+
return cvode;
|
|
42
|
+
|
|
40
43
|
default:
|
|
41
44
|
return ros34prw;
|
|
42
45
|
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/** Example. Solve the following initial value problem
|
|
2
|
-
|
|
3
|
-
dx / dt = x + y - t
|
|
4
|
-
dy / dt = x * y + t
|
|
5
|
-
x(0) = 1
|
|
6
|
-
y(0) = -1
|
|
7
|
-
|
|
8
|
-
on [0, 2] with the step 0.01.
|
|
9
|
-
*/
|
|
10
|
-
import { lsoda } from '../../index';
|
|
11
|
-
// constants
|
|
12
|
-
const VLinit = 7.2;
|
|
13
|
-
const VTV = 10;
|
|
14
|
-
const speed = 400;
|
|
15
|
-
const diam = 6;
|
|
16
|
-
const power = 2.1;
|
|
17
|
-
const pH = 7.4;
|
|
18
|
-
const k1red = 0.05604;
|
|
19
|
-
const k1ox = 0.0108;
|
|
20
|
-
const k2Fd = 1.35;
|
|
21
|
-
const k2Fa = 110400000;
|
|
22
|
-
const k2Kd = 0.04038;
|
|
23
|
-
const k2Ka = 120000000;
|
|
24
|
-
const k3FKa = 181200000;
|
|
25
|
-
const k3FKd = 0.01188;
|
|
26
|
-
const k4ox = 0.0108;
|
|
27
|
-
const k4red = 0.05604;
|
|
28
|
-
const ktox = 0.005;
|
|
29
|
-
const krcyst = 0;
|
|
30
|
-
const pO2sat = 100;
|
|
31
|
-
const pKa2MEA = 8.18;
|
|
32
|
-
const H = 1.072069378;
|
|
33
|
-
const R = 0.082;
|
|
34
|
-
const _t0 = 0;
|
|
35
|
-
const _t1 = 1000;
|
|
36
|
-
const _h = 1;
|
|
37
|
-
const FFox = 0.2;
|
|
38
|
-
const KKox = 0.2;
|
|
39
|
-
const FFred = 0.1;
|
|
40
|
-
const KKred = 0.1;
|
|
41
|
-
const Ffree = 0;
|
|
42
|
-
const Kfree = 0;
|
|
43
|
-
const FKred = 0;
|
|
44
|
-
const FKox = 0;
|
|
45
|
-
const MEAthiol = 15;
|
|
46
|
-
const CO2 = 0.12;
|
|
47
|
-
const yO2P = 0.209;
|
|
48
|
-
const CYST = 0;
|
|
49
|
-
const VL = 7.2;
|
|
50
|
-
const qin = 1;
|
|
51
|
-
const yO2in = 0.21;
|
|
52
|
-
const T = 300;
|
|
53
|
-
const P = 1;
|
|
54
|
-
const switchTime = 135;
|
|
55
|
-
// the problem definition
|
|
56
|
-
const task = {
|
|
57
|
-
name: 'Bioreactor',
|
|
58
|
-
arg: { name: 't', start: _t0, finish: _t1, step: _h },
|
|
59
|
-
initial: [FFox, KKox, FFred, KKred, Ffree, Kfree, FKred, FKox, MEAthiol, CO2, yO2P, CYST, VL],
|
|
60
|
-
func: (t, _y, _output) => {
|
|
61
|
-
// extract function values
|
|
62
|
-
const FFox = _y[0];
|
|
63
|
-
const KKox = _y[1];
|
|
64
|
-
const FFred = _y[2];
|
|
65
|
-
const KKred = _y[3];
|
|
66
|
-
const Ffree = _y[4];
|
|
67
|
-
const Kfree = _y[5];
|
|
68
|
-
const FKred = _y[6];
|
|
69
|
-
const FKox = _y[7];
|
|
70
|
-
const MEAthiol = _y[8];
|
|
71
|
-
const CO2 = _y[9];
|
|
72
|
-
const yO2P = _y[10];
|
|
73
|
-
const CYST = _y[11];
|
|
74
|
-
const VL = _y[12];
|
|
75
|
-
// evaluate expressions
|
|
76
|
-
const KF = pow(VL, -0.65) * 0.065 * pow(Math.pow(speed, 3) * Math.pow(diam, 5) * power / 2.16e12, 0.361);
|
|
77
|
-
const MA = MEAthiol * pow(10, pH - pKa2MEA);
|
|
78
|
-
const qout = qin - KF * (yO2P * H - CO2) * VL * R * T / (P * 1000);
|
|
79
|
-
const OTR = KF * (yO2P * H - CO2);
|
|
80
|
-
const Fin = t < switchTime ? 0 : 0.025;
|
|
81
|
-
const Fper = t < switchTime ? 0.025 : Fin;
|
|
82
|
-
const E0 = VLinit / VL;
|
|
83
|
-
const E1 = Math.pow((MA * E0), 2);
|
|
84
|
-
const E11 = k1red * FFox * E0 * E1;
|
|
85
|
-
const E12 = k1ox * FFred * E0;
|
|
86
|
-
const E31 = k2Fd * FFred * E0;
|
|
87
|
-
const E32 = k2Fa * Math.pow((Ffree * E0), 2) * E1;
|
|
88
|
-
const E21 = k1red * KKox * E0 * E1;
|
|
89
|
-
const E22 = k1ox * KKred * E0;
|
|
90
|
-
const E41 = k2Kd * KKred * E0;
|
|
91
|
-
const E42 = k2Ka * Math.pow((Kfree * E0), 2) * E1;
|
|
92
|
-
const E51 = k3FKa * Ffree * E0 * Kfree * E0;
|
|
93
|
-
const E52 = k3FKd * FKred * E0;
|
|
94
|
-
const E61 = k4ox * FKred * E0 * Math.pow((CYST * E0), 2);
|
|
95
|
-
const E62 = k4red * FKox * E0 * E1;
|
|
96
|
-
const E70 = E0 * CO2;
|
|
97
|
-
const E71 = Math.pow((MEAthiol * E0), 2);
|
|
98
|
-
const E72 = (E70 >= 0) ? sqrt(E70) : 0;
|
|
99
|
-
// compute output
|
|
100
|
-
_output[0] = -E11 + E12;
|
|
101
|
-
_output[1] = -E21 + E22;
|
|
102
|
-
_output[2] = E11 - E12 - E31 + E32;
|
|
103
|
-
_output[3] = E21 - E22 - E41 + E42;
|
|
104
|
-
_output[4] = 2 * (E31 - E32) - E51 + E52;
|
|
105
|
-
_output[5] = 2 * (E41 - E42) - E51 + E52;
|
|
106
|
-
_output[6] = E51 - E52 - E61 + E62;
|
|
107
|
-
_output[7] = E61 - E62;
|
|
108
|
-
_output[8] = 2 * (-E11 + E12 - E21 + E22 + E31 + E41 - E32 - E42 - E62 - ktox * E71 * E72) -
|
|
109
|
-
(MEAthiol + MA) * (Fin + Fper) / VL;
|
|
110
|
-
_output[9] = (Fin * pO2sat * 0.0022 - 2 * Fper * CO2) / VL + OTR - 0.5 * ktox * E71 * E72;
|
|
111
|
-
_output[10] = -OTR * (VL / (VTV - VL)) * R * T * P + yO2in * qin - yO2P * qout;
|
|
112
|
-
_output[11] = ktox * E71 * E72 - krcyst * CYST * E0 - (Fin + Fper) * CYST / VL;
|
|
113
|
-
_output[12] = Fin - Fper;
|
|
114
|
-
},
|
|
115
|
-
tolerance: 0.00005,
|
|
116
|
-
solutionColNames: ['FFox', 'KKox', 'FFred', 'KKred', 'Ffree', 'Kfree', 'FKred',
|
|
117
|
-
'FKox', 'MEAthiol', 'CO2', 'yO2P', 'CYST', 'VL'],
|
|
118
|
-
};
|
|
119
|
-
// used Math-functions
|
|
120
|
-
const pow = (x, y) => Math.pow(x, y);
|
|
121
|
-
const tan = (x) => Math.tan(x);
|
|
122
|
-
const sqrt = (x) => Math.sqrt(x);
|
|
123
|
-
const exp = (x) => Math.exp(x);
|
|
124
|
-
const solution = lsoda(task);
|
|
125
|
-
//# sourceMappingURL=bioreactor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bioreactor.js","sourceRoot":"","sources":["bioreactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
/** Example. Solve the following initial value problem
|
|
2
|
-
|
|
3
|
-
dx / dt = x + y - t
|
|
4
|
-
dy / dt = x * y + t
|
|
5
|
-
x(0) = 1
|
|
6
|
-
y(0) = -1
|
|
7
|
-
|
|
8
|
-
on [0, 2] with the step 0.01.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import {ODEs, lsoda, mrt} from '../../index';
|
|
12
|
-
|
|
13
|
-
// constants
|
|
14
|
-
const VLinit = 7.2;
|
|
15
|
-
const VTV = 10;
|
|
16
|
-
const speed = 400;
|
|
17
|
-
const diam = 6;
|
|
18
|
-
const power = 2.1;
|
|
19
|
-
const pH = 7.4;
|
|
20
|
-
const k1red = 0.05604;
|
|
21
|
-
const k1ox = 0.0108;
|
|
22
|
-
const k2Fd = 1.35;
|
|
23
|
-
const k2Fa = 110400000;
|
|
24
|
-
const k2Kd = 0.04038;
|
|
25
|
-
const k2Ka = 120000000;
|
|
26
|
-
const k3FKa = 181200000;
|
|
27
|
-
const k3FKd = 0.01188;
|
|
28
|
-
const k4ox = 0.0108;
|
|
29
|
-
const k4red = 0.05604;
|
|
30
|
-
const ktox = 0.005;
|
|
31
|
-
const krcyst = 0;
|
|
32
|
-
const pO2sat = 100;
|
|
33
|
-
const pKa2MEA = 8.18;
|
|
34
|
-
const H = 1.072069378;
|
|
35
|
-
const R = 0.082;
|
|
36
|
-
|
|
37
|
-
const _t0 = 0;
|
|
38
|
-
const _t1 = 1000;
|
|
39
|
-
const _h = 1;
|
|
40
|
-
const FFox = 0.2;
|
|
41
|
-
const KKox = 0.2;
|
|
42
|
-
const FFred = 0.1;
|
|
43
|
-
const KKred = 0.1;
|
|
44
|
-
const Ffree = 0;
|
|
45
|
-
const Kfree = 0;
|
|
46
|
-
const FKred = 0;
|
|
47
|
-
const FKox = 0;
|
|
48
|
-
const MEAthiol = 15;
|
|
49
|
-
const CO2 = 0.12;
|
|
50
|
-
const yO2P = 0.209;
|
|
51
|
-
const CYST = 0;
|
|
52
|
-
const VL = 7.2;
|
|
53
|
-
const qin = 1;
|
|
54
|
-
const yO2in = 0.21;
|
|
55
|
-
const T = 300;
|
|
56
|
-
const P = 1;
|
|
57
|
-
const switchTime = 135;
|
|
58
|
-
|
|
59
|
-
// the problem definition
|
|
60
|
-
const task = {
|
|
61
|
-
name: 'Bioreactor',
|
|
62
|
-
arg: {name: 't', start: _t0, finish: _t1, step: _h},
|
|
63
|
-
initial: [FFox, KKox, FFred, KKred, Ffree, Kfree, FKred, FKox, MEAthiol, CO2, yO2P, CYST, VL],
|
|
64
|
-
func: (t: number, _y: Float64Array, _output: Float64Array) => {
|
|
65
|
-
// extract function values
|
|
66
|
-
const FFox = _y[0];
|
|
67
|
-
const KKox = _y[1];
|
|
68
|
-
const FFred = _y[2];
|
|
69
|
-
const KKred = _y[3];
|
|
70
|
-
const Ffree = _y[4];
|
|
71
|
-
const Kfree = _y[5];
|
|
72
|
-
const FKred = _y[6];
|
|
73
|
-
const FKox = _y[7];
|
|
74
|
-
const MEAthiol = _y[8];
|
|
75
|
-
const CO2 = _y[9];
|
|
76
|
-
const yO2P = _y[10];
|
|
77
|
-
const CYST = _y[11];
|
|
78
|
-
const VL = _y[12];
|
|
79
|
-
|
|
80
|
-
// evaluate expressions
|
|
81
|
-
const KF = pow(VL, -0.65) * 0.065 * pow(speed**3 * diam**5 * power / 2.16e12, 0.361);
|
|
82
|
-
const MA = MEAthiol * pow(10, pH - pKa2MEA);
|
|
83
|
-
const qout = qin - KF * (yO2P * H - CO2) * VL * R * T / (P * 1000);
|
|
84
|
-
const OTR = KF * (yO2P * H - CO2);
|
|
85
|
-
const Fin = t < switchTime ? 0 : 0.025;
|
|
86
|
-
const Fper = t < switchTime ? 0.025 : Fin;
|
|
87
|
-
const E0 = VLinit / VL;
|
|
88
|
-
const E1 = (MA * E0)**2;
|
|
89
|
-
const E11 = k1red * FFox * E0 * E1;
|
|
90
|
-
const E12 = k1ox * FFred * E0;
|
|
91
|
-
const E31 = k2Fd * FFred * E0;
|
|
92
|
-
const E32 = k2Fa * (Ffree * E0)**2 * E1;
|
|
93
|
-
const E21 = k1red * KKox * E0 * E1;
|
|
94
|
-
const E22 = k1ox * KKred * E0;
|
|
95
|
-
const E41 = k2Kd * KKred * E0;
|
|
96
|
-
const E42 = k2Ka * (Kfree * E0)**2 * E1;
|
|
97
|
-
const E51 = k3FKa * Ffree * E0 * Kfree * E0;
|
|
98
|
-
const E52 = k3FKd * FKred * E0;
|
|
99
|
-
const E61 = k4ox * FKred * E0 * (CYST * E0)**2;
|
|
100
|
-
const E62 = k4red * FKox * E0 * E1;
|
|
101
|
-
const E70 = E0 * CO2;
|
|
102
|
-
const E71 = (MEAthiol * E0)**2;
|
|
103
|
-
const E72 = (E70 >= 0) ? sqrt(E70) : 0;
|
|
104
|
-
|
|
105
|
-
// compute output
|
|
106
|
-
_output[0] = -E11 + E12;
|
|
107
|
-
_output[1] = -E21 + E22;
|
|
108
|
-
_output[2] = E11 - E12 - E31 + E32;
|
|
109
|
-
_output[3] = E21 - E22 - E41 + E42;
|
|
110
|
-
_output[4] = 2 * (E31 - E32) - E51 + E52;
|
|
111
|
-
_output[5] = 2 * (E41 - E42) - E51 + E52;
|
|
112
|
-
_output[6] = E51 - E52 - E61 + E62;
|
|
113
|
-
_output[7] = E61 - E62;
|
|
114
|
-
_output[8] = 2 * (-E11 + E12 - E21 + E22 + E31 + E41 - E32 - E42 - E62 - ktox * E71 * E72) -
|
|
115
|
-
(MEAthiol + MA) * (Fin + Fper) / VL;
|
|
116
|
-
_output[9] = (Fin * pO2sat * 0.0022 - 2 * Fper * CO2) / VL + OTR - 0.5 * ktox * E71 * E72;
|
|
117
|
-
_output[10] = -OTR * (VL / (VTV - VL)) * R * T * P + yO2in * qin - yO2P * qout;
|
|
118
|
-
_output[11] = ktox * E71 * E72 - krcyst * CYST * E0 - (Fin + Fper) * CYST / VL;
|
|
119
|
-
_output[12] = Fin - Fper;
|
|
120
|
-
},
|
|
121
|
-
tolerance: 0.00005,
|
|
122
|
-
solutionColNames: ['FFox', 'KKox', 'FFred', 'KKred', 'Ffree', 'Kfree', 'FKred',
|
|
123
|
-
'FKox', 'MEAthiol', 'CO2', 'yO2P', 'CYST', 'VL'],
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
// used Math-functions
|
|
127
|
-
const pow = (x: number, y: number) => Math.pow(x, y);
|
|
128
|
-
const tan = (x: number) => Math.tan(x);
|
|
129
|
-
const sqrt = (x: number) => Math.sqrt(x);
|
|
130
|
-
const exp = (x: number) => Math.exp(x);
|
|
131
|
-
|
|
132
|
-
const solution = lsoda(task);
|