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,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of SUNDIALS CVODE v7.5.0 (https://github.com/LLNL/sundials)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025, Lawrence Livermore National Security, University of
|
|
5
|
+
* Maryland Baltimore County, and the SUNDIALS contributors.
|
|
6
|
+
* Copyright (c) 2013-2025, Lawrence Livermore National Security and
|
|
7
|
+
* Southern Methodist University.
|
|
8
|
+
* Copyright (c) 2002-2013, Lawrence Livermore National Security.
|
|
9
|
+
* Copyright (c) 2026 Datagrok.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the BSD-3-Clause License. See THIRD_PARTY_LICENSES
|
|
12
|
+
* for the full license text and provenance chain of the original code.
|
|
13
|
+
*/
|
|
14
|
+
import { L_MAX } from './common';
|
|
15
|
+
/**
|
|
16
|
+
* cvAltSum - Alternating sum: sum_{i=0}^{iend} (-1)^i * a[i] / (i + k)
|
|
17
|
+
*/
|
|
18
|
+
function cvAltSum(iend, a, k) {
|
|
19
|
+
if (iend < 0)
|
|
20
|
+
return 0.0;
|
|
21
|
+
let sum = 0.0;
|
|
22
|
+
let sign = 1;
|
|
23
|
+
for (let i = 0; i <= iend; i++) {
|
|
24
|
+
sum += sign * (a[i] / (i + k));
|
|
25
|
+
sign = -sign;
|
|
26
|
+
}
|
|
27
|
+
return sum;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* cvAdamsStart - Generate product polynomial coefficients for Adams method
|
|
31
|
+
* Returns hsum.
|
|
32
|
+
*/
|
|
33
|
+
function cvAdamsStart(mem, m) {
|
|
34
|
+
let hsum = mem.cv_h;
|
|
35
|
+
m[0] = 1.0;
|
|
36
|
+
for (let i = 1; i <= mem.cv_q; i++)
|
|
37
|
+
m[i] = 0.0;
|
|
38
|
+
for (let j = 1; j < mem.cv_q; j++) {
|
|
39
|
+
if (j === mem.cv_q - 1 && mem.cv_qwait === 1) {
|
|
40
|
+
const sum = cvAltSum(mem.cv_q - 2, m, 2);
|
|
41
|
+
mem.cv_tq[1] = mem.cv_q * sum / m[mem.cv_q - 2];
|
|
42
|
+
}
|
|
43
|
+
const xi_inv = mem.cv_h / hsum;
|
|
44
|
+
for (let i = j; i >= 1; i--)
|
|
45
|
+
m[i] += m[i - 1] * xi_inv;
|
|
46
|
+
hsum += mem.cv_tau[j];
|
|
47
|
+
}
|
|
48
|
+
return hsum;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* cvAdamsFinish - Complete Adams l and tq computation
|
|
52
|
+
*/
|
|
53
|
+
function cvAdamsFinish(mem, m, M, hsum) {
|
|
54
|
+
const M0_inv = 1.0 / M[0];
|
|
55
|
+
mem.cv_l[0] = 1.0;
|
|
56
|
+
for (let i = 1; i <= mem.cv_q; i++)
|
|
57
|
+
mem.cv_l[i] = M0_inv * (m[i - 1] / i);
|
|
58
|
+
const xi = hsum / mem.cv_h;
|
|
59
|
+
const xi_inv = 1.0 / xi;
|
|
60
|
+
mem.cv_tq[2] = M[1] * M0_inv / xi;
|
|
61
|
+
mem.cv_tq[5] = xi / mem.cv_l[mem.cv_q];
|
|
62
|
+
if (mem.cv_qwait === 1) {
|
|
63
|
+
for (let i = mem.cv_q; i >= 1; i--)
|
|
64
|
+
m[i] += m[i - 1] * xi_inv;
|
|
65
|
+
M[2] = cvAltSum(mem.cv_q, m, 2);
|
|
66
|
+
mem.cv_tq[3] = M[2] * M0_inv / mem.cv_L;
|
|
67
|
+
}
|
|
68
|
+
mem.cv_tq[4] = mem.cv_nlscoef / mem.cv_tq[2];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* cvSetAdams - Compute Adams method coefficients l[] and tq[]
|
|
72
|
+
*/
|
|
73
|
+
export function cvSetAdams(mem) {
|
|
74
|
+
const m = new Float64Array(L_MAX);
|
|
75
|
+
const M = new Float64Array(3);
|
|
76
|
+
if (mem.cv_q === 1) {
|
|
77
|
+
mem.cv_l[0] = 1.0;
|
|
78
|
+
mem.cv_l[1] = 1.0;
|
|
79
|
+
mem.cv_tq[1] = 1.0;
|
|
80
|
+
mem.cv_tq[5] = 1.0;
|
|
81
|
+
mem.cv_tq[2] = 0.5;
|
|
82
|
+
mem.cv_tq[3] = 1.0 / 12.0;
|
|
83
|
+
mem.cv_tq[4] = mem.cv_nlscoef / mem.cv_tq[2];
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const hsum = cvAdamsStart(mem, m);
|
|
87
|
+
M[0] = cvAltSum(mem.cv_q - 1, m, 1);
|
|
88
|
+
M[1] = cvAltSum(mem.cv_q - 1, m, 2);
|
|
89
|
+
cvAdamsFinish(mem, m, M, hsum);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* cvAdjustAdams - Adjust history array for Adams order change
|
|
93
|
+
*/
|
|
94
|
+
export function cvAdjustAdams(mem, deltaq) {
|
|
95
|
+
const N = mem.cv_N;
|
|
96
|
+
if (deltaq === 1) {
|
|
97
|
+
// On order increase, set new column of zn to zero
|
|
98
|
+
mem.cv_zn[mem.cv_L].fill(0.0, 0, N);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Order decrease: adjust zn[j] by multiples of zn[q]
|
|
102
|
+
for (let i = 0; i <= mem.cv_qmax; i++)
|
|
103
|
+
mem.cv_l[i] = 0.0;
|
|
104
|
+
mem.cv_l[1] = 1.0;
|
|
105
|
+
let hsum = 0.0;
|
|
106
|
+
for (let j = 1; j <= mem.cv_q - 2; j++) {
|
|
107
|
+
hsum += mem.cv_tau[j];
|
|
108
|
+
const xi = hsum / mem.cv_hscale;
|
|
109
|
+
for (let i = j + 1; i >= 1; i--)
|
|
110
|
+
mem.cv_l[i] = mem.cv_l[i] * xi + mem.cv_l[i - 1];
|
|
111
|
+
}
|
|
112
|
+
for (let j = 1; j <= mem.cv_q - 2; j++)
|
|
113
|
+
mem.cv_l[j + 1] = mem.cv_q * (mem.cv_l[j] / (j + 1));
|
|
114
|
+
if (mem.cv_q > 2) {
|
|
115
|
+
const znq = mem.cv_zn[mem.cv_q];
|
|
116
|
+
for (let j = 2; j < mem.cv_q; j++) {
|
|
117
|
+
const c = -mem.cv_l[j];
|
|
118
|
+
const znj = mem.cv_zn[j];
|
|
119
|
+
for (let i = 0; i < N; i++)
|
|
120
|
+
znj[i] += c * znq[i];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=cvode_adams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cvode_adams.js","sourceRoot":"","sources":["cvode_adams.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of SUNDIALS CVODE v7.5.0 (https://github.com/LLNL/sundials)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025, Lawrence Livermore National Security, University of
|
|
5
|
+
* Maryland Baltimore County, and the SUNDIALS contributors.
|
|
6
|
+
* Copyright (c) 2013-2025, Lawrence Livermore National Security and
|
|
7
|
+
* Southern Methodist University.
|
|
8
|
+
* Copyright (c) 2002-2013, Lawrence Livermore National Security.
|
|
9
|
+
* Copyright (c) 2026 Datagrok.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the BSD-3-Clause License. See THIRD_PARTY_LICENSES
|
|
12
|
+
* for the full license text and provenance chain of the original code.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {CvodeMem, L_MAX} from './common';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* cvAltSum - Alternating sum: sum_{i=0}^{iend} (-1)^i * a[i] / (i + k)
|
|
19
|
+
*/
|
|
20
|
+
function cvAltSum(iend: number, a: Float64Array, k: number): number {
|
|
21
|
+
if (iend < 0) return 0.0;
|
|
22
|
+
let sum = 0.0;
|
|
23
|
+
let sign = 1;
|
|
24
|
+
for (let i = 0; i <= iend; i++) {
|
|
25
|
+
sum += sign * (a[i] / (i + k));
|
|
26
|
+
sign = -sign;
|
|
27
|
+
}
|
|
28
|
+
return sum;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* cvAdamsStart - Generate product polynomial coefficients for Adams method
|
|
33
|
+
* Returns hsum.
|
|
34
|
+
*/
|
|
35
|
+
function cvAdamsStart(mem: CvodeMem, m: Float64Array): number {
|
|
36
|
+
let hsum = mem.cv_h;
|
|
37
|
+
m[0] = 1.0;
|
|
38
|
+
for (let i = 1; i <= mem.cv_q; i++) m[i] = 0.0;
|
|
39
|
+
|
|
40
|
+
for (let j = 1; j < mem.cv_q; j++) {
|
|
41
|
+
if (j === mem.cv_q - 1 && mem.cv_qwait === 1) {
|
|
42
|
+
const sum = cvAltSum(mem.cv_q - 2, m, 2);
|
|
43
|
+
mem.cv_tq[1] = mem.cv_q * sum / m[mem.cv_q - 2];
|
|
44
|
+
}
|
|
45
|
+
const xi_inv = mem.cv_h / hsum;
|
|
46
|
+
for (let i = j; i >= 1; i--)
|
|
47
|
+
m[i] += m[i - 1] * xi_inv;
|
|
48
|
+
|
|
49
|
+
hsum += mem.cv_tau[j];
|
|
50
|
+
}
|
|
51
|
+
return hsum;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* cvAdamsFinish - Complete Adams l and tq computation
|
|
56
|
+
*/
|
|
57
|
+
function cvAdamsFinish(mem: CvodeMem, m: Float64Array, M: Float64Array, hsum: number): void {
|
|
58
|
+
const M0_inv = 1.0 / M[0];
|
|
59
|
+
|
|
60
|
+
mem.cv_l[0] = 1.0;
|
|
61
|
+
for (let i = 1; i <= mem.cv_q; i++)
|
|
62
|
+
mem.cv_l[i] = M0_inv * (m[i - 1] / i);
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const xi = hsum / mem.cv_h;
|
|
66
|
+
const xi_inv = 1.0 / xi;
|
|
67
|
+
|
|
68
|
+
mem.cv_tq[2] = M[1] * M0_inv / xi;
|
|
69
|
+
mem.cv_tq[5] = xi / mem.cv_l[mem.cv_q];
|
|
70
|
+
|
|
71
|
+
if (mem.cv_qwait === 1) {
|
|
72
|
+
for (let i = mem.cv_q; i >= 1; i--)
|
|
73
|
+
m[i] += m[i - 1] * xi_inv;
|
|
74
|
+
|
|
75
|
+
M[2] = cvAltSum(mem.cv_q, m, 2);
|
|
76
|
+
mem.cv_tq[3] = M[2] * M0_inv / mem.cv_L;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
mem.cv_tq[4] = mem.cv_nlscoef / mem.cv_tq[2];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* cvSetAdams - Compute Adams method coefficients l[] and tq[]
|
|
84
|
+
*/
|
|
85
|
+
export function cvSetAdams(mem: CvodeMem): void {
|
|
86
|
+
const m = new Float64Array(L_MAX);
|
|
87
|
+
const M = new Float64Array(3);
|
|
88
|
+
|
|
89
|
+
if (mem.cv_q === 1) {
|
|
90
|
+
mem.cv_l[0] = 1.0;
|
|
91
|
+
mem.cv_l[1] = 1.0;
|
|
92
|
+
mem.cv_tq[1] = 1.0;
|
|
93
|
+
mem.cv_tq[5] = 1.0;
|
|
94
|
+
mem.cv_tq[2] = 0.5;
|
|
95
|
+
mem.cv_tq[3] = 1.0 / 12.0;
|
|
96
|
+
mem.cv_tq[4] = mem.cv_nlscoef / mem.cv_tq[2];
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const hsum = cvAdamsStart(mem, m);
|
|
101
|
+
M[0] = cvAltSum(mem.cv_q - 1, m, 1);
|
|
102
|
+
M[1] = cvAltSum(mem.cv_q - 1, m, 2);
|
|
103
|
+
cvAdamsFinish(mem, m, M, hsum);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* cvAdjustAdams - Adjust history array for Adams order change
|
|
108
|
+
*/
|
|
109
|
+
export function cvAdjustAdams(mem: CvodeMem, deltaq: number): void {
|
|
110
|
+
const N = mem.cv_N;
|
|
111
|
+
|
|
112
|
+
if (deltaq === 1) {
|
|
113
|
+
// On order increase, set new column of zn to zero
|
|
114
|
+
mem.cv_zn[mem.cv_L].fill(0.0, 0, N);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Order decrease: adjust zn[j] by multiples of zn[q]
|
|
119
|
+
for (let i = 0; i <= mem.cv_qmax; i++) mem.cv_l[i] = 0.0;
|
|
120
|
+
mem.cv_l[1] = 1.0;
|
|
121
|
+
let hsum = 0.0;
|
|
122
|
+
|
|
123
|
+
for (let j = 1; j <= mem.cv_q - 2; j++) {
|
|
124
|
+
hsum += mem.cv_tau[j];
|
|
125
|
+
const xi = hsum / mem.cv_hscale;
|
|
126
|
+
for (let i = j + 1; i >= 1; i--)
|
|
127
|
+
mem.cv_l[i] = mem.cv_l[i] * xi + mem.cv_l[i - 1];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
for (let j = 1; j <= mem.cv_q - 2; j++)
|
|
131
|
+
mem.cv_l[j + 1] = mem.cv_q * (mem.cv_l[j] / (j + 1));
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
if (mem.cv_q > 2) {
|
|
135
|
+
const znq = mem.cv_zn[mem.cv_q];
|
|
136
|
+
for (let j = 2; j < mem.cv_q; j++) {
|
|
137
|
+
const c = -mem.cv_l[j];
|
|
138
|
+
const znj = mem.cv_zn[j];
|
|
139
|
+
for (let i = 0; i < N; i++) znj[i] += c * znq[i];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of SUNDIALS CVODE v7.5.0 (https://github.com/LLNL/sundials)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025, Lawrence Livermore National Security, University of
|
|
5
|
+
* Maryland Baltimore County, and the SUNDIALS contributors.
|
|
6
|
+
* Copyright (c) 2013-2025, Lawrence Livermore National Security and
|
|
7
|
+
* Southern Methodist University.
|
|
8
|
+
* Copyright (c) 2002-2013, Lawrence Livermore National Security.
|
|
9
|
+
* Copyright (c) 2026 Datagrok.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the BSD-3-Clause License. See THIRD_PARTY_LICENSES
|
|
12
|
+
* for the full license text and provenance chain of the original code.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* cvSetBDF - Compute BDF method coefficients l[] and tq[]
|
|
16
|
+
*
|
|
17
|
+
* The polynomial l(x) = l_0 + l_1*x + ... + l_q*x^q is given by:
|
|
18
|
+
* Lambda(x) = (1 + x/xi*_q) * product_{i=1}^{q-1} (1 + x/xi_i)
|
|
19
|
+
* where xi_i = (t_n - t_{n-i}) / h
|
|
20
|
+
*
|
|
21
|
+
* The tq array holds test quantities for error and convergence tests:
|
|
22
|
+
* tq[1] = coefficient for error at order q-1
|
|
23
|
+
* tq[2] = coefficient for error at order q
|
|
24
|
+
* tq[3] = coefficient for error at order q+1
|
|
25
|
+
* tq[4] = convergence test coefficient
|
|
26
|
+
* tq[5] = derivative for order q+2 vector
|
|
27
|
+
*/
|
|
28
|
+
export function cvSetBDF(mem) {
|
|
29
|
+
let alpha0;
|
|
30
|
+
let alpha0_hat;
|
|
31
|
+
let xi_inv;
|
|
32
|
+
let xistar_inv;
|
|
33
|
+
let hsum;
|
|
34
|
+
mem.cv_l[0] = 1.0;
|
|
35
|
+
mem.cv_l[1] = 1.0;
|
|
36
|
+
xi_inv = 1.0;
|
|
37
|
+
xistar_inv = 1.0;
|
|
38
|
+
for (let i = 2; i <= mem.cv_q; i++)
|
|
39
|
+
mem.cv_l[i] = 0.0;
|
|
40
|
+
alpha0 = -1.0;
|
|
41
|
+
alpha0_hat = -1.0;
|
|
42
|
+
hsum = mem.cv_h;
|
|
43
|
+
if (mem.cv_q > 1) {
|
|
44
|
+
for (let j = 2; j < mem.cv_q; j++) {
|
|
45
|
+
hsum += mem.cv_tau[j - 1];
|
|
46
|
+
xi_inv = mem.cv_h / hsum;
|
|
47
|
+
alpha0 -= 1.0 / j;
|
|
48
|
+
for (let i = j; i >= 1; i--)
|
|
49
|
+
mem.cv_l[i] += mem.cv_l[i - 1] * xi_inv;
|
|
50
|
+
}
|
|
51
|
+
// j = q
|
|
52
|
+
alpha0 -= 1.0 / mem.cv_q;
|
|
53
|
+
xistar_inv = -mem.cv_l[1] - alpha0;
|
|
54
|
+
hsum += mem.cv_tau[mem.cv_q - 1];
|
|
55
|
+
xi_inv = mem.cv_h / hsum;
|
|
56
|
+
alpha0_hat = -mem.cv_l[1] - xi_inv;
|
|
57
|
+
for (let i = mem.cv_q; i >= 1; i--)
|
|
58
|
+
mem.cv_l[i] += mem.cv_l[i - 1] * xistar_inv;
|
|
59
|
+
}
|
|
60
|
+
cvSetTqBDF(mem, hsum, alpha0, alpha0_hat, xi_inv, xistar_inv);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* cvSetTqBDF - Set test quantity array for BDF method
|
|
64
|
+
*/
|
|
65
|
+
function cvSetTqBDF(mem, hsum, alpha0, alpha0_hat, xi_inv, xistar_inv) {
|
|
66
|
+
const A1 = 1.0 - alpha0_hat + alpha0;
|
|
67
|
+
const A2 = 1.0 + mem.cv_q * A1;
|
|
68
|
+
mem.cv_tq[2] = Math.abs(A1 / (alpha0 * A2));
|
|
69
|
+
mem.cv_tq[5] = Math.abs(A2 * xistar_inv / (mem.cv_l[mem.cv_q] * xi_inv));
|
|
70
|
+
if (mem.cv_qwait === 1) {
|
|
71
|
+
if (mem.cv_q > 1) {
|
|
72
|
+
const C = xistar_inv / mem.cv_l[mem.cv_q];
|
|
73
|
+
const A3 = alpha0 + 1.0 / mem.cv_q;
|
|
74
|
+
const A4 = alpha0_hat + xi_inv;
|
|
75
|
+
const Cpinv = (1.0 - A4 + A3) / A3;
|
|
76
|
+
mem.cv_tq[1] = Math.abs(C * Cpinv);
|
|
77
|
+
}
|
|
78
|
+
else
|
|
79
|
+
mem.cv_tq[1] = 1.0;
|
|
80
|
+
hsum += mem.cv_tau[mem.cv_q];
|
|
81
|
+
const xi_inv2 = mem.cv_h / hsum;
|
|
82
|
+
const A5 = alpha0 - 1.0 / (mem.cv_q + 1);
|
|
83
|
+
const A6 = alpha0_hat - xi_inv2;
|
|
84
|
+
const Cppinv = (1.0 - A6 + A5) / A2;
|
|
85
|
+
mem.cv_tq[3] = Math.abs(Cppinv / (xi_inv2 * (mem.cv_q + 2) * A5));
|
|
86
|
+
}
|
|
87
|
+
mem.cv_tq[4] = mem.cv_nlscoef / mem.cv_tq[2];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* cvIncreaseBDF - Adjust history array for BDF order increase
|
|
91
|
+
*/
|
|
92
|
+
export function cvIncreaseBDF(mem) {
|
|
93
|
+
const N = mem.cv_N;
|
|
94
|
+
for (let i = 0; i <= mem.cv_qmax; i++)
|
|
95
|
+
mem.cv_l[i] = 0.0;
|
|
96
|
+
mem.cv_l[2] = 1.0;
|
|
97
|
+
let alpha1 = 1.0;
|
|
98
|
+
let prod = 1.0;
|
|
99
|
+
let xiold = 1.0;
|
|
100
|
+
let alpha0 = -1.0;
|
|
101
|
+
let hsum = mem.cv_hscale;
|
|
102
|
+
if (mem.cv_q > 1) {
|
|
103
|
+
for (let j = 1; j < mem.cv_q; j++) {
|
|
104
|
+
hsum += mem.cv_tau[j + 1];
|
|
105
|
+
const xi = hsum / mem.cv_hscale;
|
|
106
|
+
prod *= xi;
|
|
107
|
+
alpha0 -= 1.0 / (j + 1);
|
|
108
|
+
alpha1 += 1.0 / xi;
|
|
109
|
+
for (let i = j + 2; i >= 2; i--)
|
|
110
|
+
mem.cv_l[i] = mem.cv_l[i] * xiold + mem.cv_l[i - 1];
|
|
111
|
+
xiold = xi;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const A1 = (-alpha0 - alpha1) / prod;
|
|
115
|
+
const znL = mem.cv_zn[mem.cv_L];
|
|
116
|
+
const znSaved = mem.cv_zn[mem.cv_indx_acor];
|
|
117
|
+
for (let i = 0; i < N; i++)
|
|
118
|
+
znL[i] = A1 * znSaved[i];
|
|
119
|
+
if (mem.cv_q > 1) {
|
|
120
|
+
for (let j = 2; j <= mem.cv_q; j++) {
|
|
121
|
+
const c = mem.cv_l[j];
|
|
122
|
+
const znj = mem.cv_zn[j];
|
|
123
|
+
for (let i = 0; i < N; i++)
|
|
124
|
+
znj[i] += c * znL[i];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* cvDecreaseBDF - Adjust history array for BDF order decrease
|
|
130
|
+
*/
|
|
131
|
+
export function cvDecreaseBDF(mem) {
|
|
132
|
+
const N = mem.cv_N;
|
|
133
|
+
for (let i = 0; i <= mem.cv_qmax; i++)
|
|
134
|
+
mem.cv_l[i] = 0.0;
|
|
135
|
+
mem.cv_l[2] = 1.0;
|
|
136
|
+
let hsum = 0.0;
|
|
137
|
+
for (let j = 1; j <= mem.cv_q - 2; j++) {
|
|
138
|
+
hsum += mem.cv_tau[j];
|
|
139
|
+
const xi = hsum / mem.cv_hscale;
|
|
140
|
+
for (let i = j + 2; i >= 2; i--)
|
|
141
|
+
mem.cv_l[i] = mem.cv_l[i] * xi + mem.cv_l[i - 1];
|
|
142
|
+
}
|
|
143
|
+
if (mem.cv_q > 2) {
|
|
144
|
+
const znq = mem.cv_zn[mem.cv_q];
|
|
145
|
+
for (let j = 2; j < mem.cv_q; j++) {
|
|
146
|
+
const c = -mem.cv_l[j];
|
|
147
|
+
const znj = mem.cv_zn[j];
|
|
148
|
+
for (let i = 0; i < N; i++)
|
|
149
|
+
znj[i] += c * znq[i];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=cvode_bdf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cvode_bdf.js","sourceRoot":"","sources":["cvode_bdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of SUNDIALS CVODE v7.5.0 (https://github.com/LLNL/sundials)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025, Lawrence Livermore National Security, University of
|
|
5
|
+
* Maryland Baltimore County, and the SUNDIALS contributors.
|
|
6
|
+
* Copyright (c) 2013-2025, Lawrence Livermore National Security and
|
|
7
|
+
* Southern Methodist University.
|
|
8
|
+
* Copyright (c) 2002-2013, Lawrence Livermore National Security.
|
|
9
|
+
* Copyright (c) 2026 Datagrok.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the BSD-3-Clause License. See THIRD_PARTY_LICENSES
|
|
12
|
+
* for the full license text and provenance chain of the original code.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {CvodeMem} from './common';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* cvSetBDF - Compute BDF method coefficients l[] and tq[]
|
|
19
|
+
*
|
|
20
|
+
* The polynomial l(x) = l_0 + l_1*x + ... + l_q*x^q is given by:
|
|
21
|
+
* Lambda(x) = (1 + x/xi*_q) * product_{i=1}^{q-1} (1 + x/xi_i)
|
|
22
|
+
* where xi_i = (t_n - t_{n-i}) / h
|
|
23
|
+
*
|
|
24
|
+
* The tq array holds test quantities for error and convergence tests:
|
|
25
|
+
* tq[1] = coefficient for error at order q-1
|
|
26
|
+
* tq[2] = coefficient for error at order q
|
|
27
|
+
* tq[3] = coefficient for error at order q+1
|
|
28
|
+
* tq[4] = convergence test coefficient
|
|
29
|
+
* tq[5] = derivative for order q+2 vector
|
|
30
|
+
*/
|
|
31
|
+
export function cvSetBDF(mem: CvodeMem): void {
|
|
32
|
+
let alpha0: number; let alpha0_hat: number; let xi_inv: number; let xistar_inv: number; let hsum: number;
|
|
33
|
+
|
|
34
|
+
mem.cv_l[0] = 1.0;
|
|
35
|
+
mem.cv_l[1] = 1.0;
|
|
36
|
+
xi_inv = 1.0;
|
|
37
|
+
xistar_inv = 1.0;
|
|
38
|
+
for (let i = 2; i <= mem.cv_q; i++) mem.cv_l[i] = 0.0;
|
|
39
|
+
|
|
40
|
+
alpha0 = -1.0;
|
|
41
|
+
alpha0_hat = -1.0;
|
|
42
|
+
hsum = mem.cv_h;
|
|
43
|
+
|
|
44
|
+
if (mem.cv_q > 1) {
|
|
45
|
+
for (let j = 2; j < mem.cv_q; j++) {
|
|
46
|
+
hsum += mem.cv_tau[j - 1];
|
|
47
|
+
xi_inv = mem.cv_h / hsum;
|
|
48
|
+
alpha0 -= 1.0 / j;
|
|
49
|
+
for (let i = j; i >= 1; i--)
|
|
50
|
+
mem.cv_l[i] += mem.cv_l[i - 1] * xi_inv;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// j = q
|
|
54
|
+
alpha0 -= 1.0 / mem.cv_q;
|
|
55
|
+
xistar_inv = -mem.cv_l[1] - alpha0;
|
|
56
|
+
hsum += mem.cv_tau[mem.cv_q - 1];
|
|
57
|
+
xi_inv = mem.cv_h / hsum;
|
|
58
|
+
alpha0_hat = -mem.cv_l[1] - xi_inv;
|
|
59
|
+
|
|
60
|
+
for (let i = mem.cv_q; i >= 1; i--)
|
|
61
|
+
mem.cv_l[i] += mem.cv_l[i - 1] * xistar_inv;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
cvSetTqBDF(mem, hsum, alpha0, alpha0_hat, xi_inv, xistar_inv);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* cvSetTqBDF - Set test quantity array for BDF method
|
|
69
|
+
*/
|
|
70
|
+
function cvSetTqBDF(mem: CvodeMem, hsum: number, alpha0: number,
|
|
71
|
+
alpha0_hat: number, xi_inv: number, xistar_inv: number): void {
|
|
72
|
+
const A1 = 1.0 - alpha0_hat + alpha0;
|
|
73
|
+
const A2 = 1.0 + mem.cv_q * A1;
|
|
74
|
+
mem.cv_tq[2] = Math.abs(A1 / (alpha0 * A2));
|
|
75
|
+
mem.cv_tq[5] = Math.abs(A2 * xistar_inv / (mem.cv_l[mem.cv_q] * xi_inv));
|
|
76
|
+
|
|
77
|
+
if (mem.cv_qwait === 1) {
|
|
78
|
+
if (mem.cv_q > 1) {
|
|
79
|
+
const C = xistar_inv / mem.cv_l[mem.cv_q];
|
|
80
|
+
const A3 = alpha0 + 1.0 / mem.cv_q;
|
|
81
|
+
const A4 = alpha0_hat + xi_inv;
|
|
82
|
+
const Cpinv = (1.0 - A4 + A3) / A3;
|
|
83
|
+
mem.cv_tq[1] = Math.abs(C * Cpinv);
|
|
84
|
+
} else
|
|
85
|
+
mem.cv_tq[1] = 1.0;
|
|
86
|
+
|
|
87
|
+
hsum += mem.cv_tau[mem.cv_q];
|
|
88
|
+
const xi_inv2 = mem.cv_h / hsum;
|
|
89
|
+
const A5 = alpha0 - 1.0 / (mem.cv_q + 1);
|
|
90
|
+
const A6 = alpha0_hat - xi_inv2;
|
|
91
|
+
const Cppinv = (1.0 - A6 + A5) / A2;
|
|
92
|
+
mem.cv_tq[3] = Math.abs(Cppinv / (xi_inv2 * (mem.cv_q + 2) * A5));
|
|
93
|
+
}
|
|
94
|
+
mem.cv_tq[4] = mem.cv_nlscoef / mem.cv_tq[2];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* cvIncreaseBDF - Adjust history array for BDF order increase
|
|
99
|
+
*/
|
|
100
|
+
export function cvIncreaseBDF(mem: CvodeMem): void {
|
|
101
|
+
const N = mem.cv_N;
|
|
102
|
+
|
|
103
|
+
for (let i = 0; i <= mem.cv_qmax; i++) mem.cv_l[i] = 0.0;
|
|
104
|
+
mem.cv_l[2] = 1.0;
|
|
105
|
+
let alpha1 = 1.0;
|
|
106
|
+
let prod = 1.0;
|
|
107
|
+
let xiold = 1.0;
|
|
108
|
+
let alpha0 = -1.0;
|
|
109
|
+
let hsum = mem.cv_hscale;
|
|
110
|
+
|
|
111
|
+
if (mem.cv_q > 1) {
|
|
112
|
+
for (let j = 1; j < mem.cv_q; j++) {
|
|
113
|
+
hsum += mem.cv_tau[j + 1];
|
|
114
|
+
const xi = hsum / mem.cv_hscale;
|
|
115
|
+
prod *= xi;
|
|
116
|
+
alpha0 -= 1.0 / (j + 1);
|
|
117
|
+
alpha1 += 1.0 / xi;
|
|
118
|
+
for (let i = j + 2; i >= 2; i--)
|
|
119
|
+
mem.cv_l[i] = mem.cv_l[i] * xiold + mem.cv_l[i - 1];
|
|
120
|
+
|
|
121
|
+
xiold = xi;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const A1 = (-alpha0 - alpha1) / prod;
|
|
126
|
+
const znL = mem.cv_zn[mem.cv_L];
|
|
127
|
+
const znSaved = mem.cv_zn[mem.cv_indx_acor];
|
|
128
|
+
for (let i = 0; i < N; i++) znL[i] = A1 * znSaved[i];
|
|
129
|
+
|
|
130
|
+
if (mem.cv_q > 1) {
|
|
131
|
+
for (let j = 2; j <= mem.cv_q; j++) {
|
|
132
|
+
const c = mem.cv_l[j];
|
|
133
|
+
const znj = mem.cv_zn[j];
|
|
134
|
+
for (let i = 0; i < N; i++) znj[i] += c * znL[i];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* cvDecreaseBDF - Adjust history array for BDF order decrease
|
|
141
|
+
*/
|
|
142
|
+
export function cvDecreaseBDF(mem: CvodeMem): void {
|
|
143
|
+
const N = mem.cv_N;
|
|
144
|
+
|
|
145
|
+
for (let i = 0; i <= mem.cv_qmax; i++) mem.cv_l[i] = 0.0;
|
|
146
|
+
mem.cv_l[2] = 1.0;
|
|
147
|
+
let hsum = 0.0;
|
|
148
|
+
|
|
149
|
+
for (let j = 1; j <= mem.cv_q - 2; j++) {
|
|
150
|
+
hsum += mem.cv_tau[j];
|
|
151
|
+
const xi = hsum / mem.cv_hscale;
|
|
152
|
+
for (let i = j + 2; i >= 2; i--)
|
|
153
|
+
mem.cv_l[i] = mem.cv_l[i] * xi + mem.cv_l[i - 1];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (mem.cv_q > 2) {
|
|
157
|
+
const znq = mem.cv_zn[mem.cv_q];
|
|
158
|
+
for (let j = 2; j < mem.cv_q; j++) {
|
|
159
|
+
const c = -mem.cv_l[j];
|
|
160
|
+
const znj = mem.cv_zn[j];
|
|
161
|
+
for (let i = 0; i < N; i++) znj[i] += c * znq[i];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|