diff-grok 1.0.9 → 1.1.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/settings.local.json +11 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/.github/workflows/deploy-docs.yml +15 -0
- package/CLAUDE.md +98 -0
- package/CONTRIBUTING.md +74 -0
- package/README.MD +272 -18
- package/images/E5.png +0 -0
- package/images/HIRES.png +0 -0
- package/images/OREGO.png +0 -0
- package/images/POLL-full.png +0 -0
- package/images/POLL.png +0 -0
- package/images/ROBER.png +0 -0
- package/images/VDP0L.png +0 -0
- package/images/VDPOL.png +0 -0
- package/index.js +2 -2
- package/index.js.map +1 -1
- package/index.ts +7 -5
- package/jest.config.js +1 -0
- package/package.json +2 -1
- package/src/examples/bioreactor.js +125 -0
- package/src/examples/bioreactor.js.map +1 -0
- package/src/examples/bioreactor.ts +132 -0
- package/src/examples/check-methods.js +23 -9
- package/src/examples/check-methods.js.map +1 -1
- package/src/examples/check-methods.ts +28 -9
- package/src/examples/corr-probs.js +3 -1
- package/src/examples/corr-probs.js.map +1 -1
- package/src/examples/corr-probs.ts +7 -3
- package/src/examples/cyclic-model.js +3 -1
- package/src/examples/cyclic-model.js.map +1 -1
- package/src/examples/cyclic-model.ts +3 -1
- package/src/examples/e5.js +6 -0
- package/src/examples/e5.js.map +1 -1
- package/src/examples/e5.ts +7 -0
- package/src/examples/hires.js +10 -0
- package/src/examples/hires.js.map +1 -1
- package/src/examples/hires.ts +11 -0
- package/src/examples/index.js +21 -7
- package/src/examples/index.js.map +1 -1
- package/src/examples/index.ts +23 -7
- package/src/examples/orego.js +5 -0
- package/src/examples/orego.js.map +1 -1
- package/src/examples/orego.ts +6 -0
- package/src/examples/pollution.js +22 -0
- package/src/examples/pollution.js.map +1 -1
- package/src/examples/pollution.ts +23 -0
- package/src/examples/print-benchmark.js +581 -0
- package/src/examples/print-benchmark.js.map +1 -0
- package/src/examples/print-benchmark.ts +594 -0
- package/src/examples/robertson.js +6 -1
- package/src/examples/robertson.js.map +1 -1
- package/src/examples/robertson.ts +7 -1
- package/src/examples/scripting.js +1 -1
- package/src/examples/scripting.js.map +1 -1
- package/src/examples/scripting.ts +1 -1
- package/src/examples/vdpol.js +4 -0
- package/src/examples/vdpol.js.map +1 -1
- package/src/examples/vdpol.ts +5 -0
- package/src/pipeline/basic-pipeline-creator.js +96 -1
- package/src/pipeline/basic-pipeline-creator.js.map +1 -1
- package/src/pipeline/basic-pipeline-creator.ts +97 -1
- package/src/pipeline/loops-pipeline-creator.js +115 -2
- package/src/pipeline/loops-pipeline-creator.js.map +1 -1
- package/src/pipeline/loops-pipeline-creator.ts +116 -2
- package/src/pipeline/output.js +7 -2
- package/src/pipeline/output.js.map +1 -1
- package/src/pipeline/output.ts +7 -2
- package/src/pipeline/pipeline-creator.js.map +1 -1
- package/src/pipeline/pipeline-creator.ts +4 -0
- package/src/pipeline/pipeline.js +193 -2
- package/src/pipeline/pipeline.js.map +1 -1
- package/src/pipeline/pipeline.ts +206 -4
- package/src/pipeline/updates-pipeline-creator.js +130 -2
- package/src/pipeline/updates-pipeline-creator.js.map +1 -1
- package/src/pipeline/updates-pipeline-creator.ts +131 -2
- package/src/scripting-tools/constants.js +18 -4
- package/src/scripting-tools/constants.js.map +1 -1
- package/src/scripting-tools/constants.ts +22 -4
- package/src/scripting-tools/index.js.map +1 -1
- package/src/scripting-tools/index.ts +3 -2
- package/src/scripting-tools/model-error.js +3 -1
- package/src/scripting-tools/model-error.js.map +1 -1
- package/src/scripting-tools/model-error.ts +3 -1
- package/src/scripting-tools/scripting-tools.js +139 -9
- package/src/scripting-tools/scripting-tools.js.map +1 -1
- package/src/scripting-tools/scripting-tools.ts +228 -21
- package/src/solver-tools/ab4-method.js +332 -0
- package/src/solver-tools/ab4-method.js.map +1 -0
- package/src/solver-tools/ab4-method.ts +395 -0
- package/src/solver-tools/ab5-method.js +334 -0
- package/src/solver-tools/ab5-method.js.map +1 -0
- package/src/solver-tools/ab5-method.ts +397 -0
- package/src/solver-tools/callbacks/callback-base.js +2 -0
- package/src/solver-tools/callbacks/callback-base.js.map +1 -1
- package/src/solver-tools/callbacks/callback-base.ts +4 -0
- package/src/solver-tools/callbacks/callback-tools.js +3 -1
- package/src/solver-tools/callbacks/callback-tools.js.map +1 -1
- package/src/solver-tools/callbacks/callback-tools.ts +3 -1
- package/src/solver-tools/callbacks/iter-checker-callback.js +4 -0
- package/src/solver-tools/callbacks/iter-checker-callback.js.map +1 -1
- package/src/solver-tools/callbacks/iter-checker-callback.ts +4 -0
- package/src/solver-tools/callbacks/time-checker-callback.js +4 -0
- package/src/solver-tools/callbacks/time-checker-callback.js.map +1 -1
- package/src/solver-tools/callbacks/time-checker-callback.ts +4 -0
- package/src/solver-tools/index.js +9 -0
- package/src/solver-tools/index.js.map +1 -1
- package/src/solver-tools/index.ts +9 -0
- package/src/solver-tools/lsoda/blas.js +246 -0
- package/src/solver-tools/lsoda/blas.js.map +1 -0
- package/src/solver-tools/lsoda/blas.ts +267 -0
- package/src/solver-tools/lsoda/cfode.js +73 -0
- package/src/solver-tools/lsoda/cfode.js.map +1 -0
- package/src/solver-tools/lsoda/cfode.ts +83 -0
- package/src/solver-tools/lsoda/common.js +94 -0
- package/src/solver-tools/lsoda/common.js.map +1 -0
- package/src/solver-tools/lsoda/common.ts +135 -0
- package/src/solver-tools/lsoda/corfailure.js +25 -0
- package/src/solver-tools/lsoda/corfailure.js.map +1 -0
- package/src/solver-tools/lsoda/corfailure.ts +30 -0
- package/src/solver-tools/lsoda/correction.js +101 -0
- package/src/solver-tools/lsoda/correction.js.map +1 -0
- package/src/solver-tools/lsoda/correction.ts +119 -0
- package/src/solver-tools/lsoda/dense.js +110 -0
- package/src/solver-tools/lsoda/dense.js.map +1 -0
- package/src/solver-tools/lsoda/dense.ts +129 -0
- package/src/solver-tools/lsoda/index.js +4 -0
- package/src/solver-tools/lsoda/index.js.map +1 -0
- package/src/solver-tools/lsoda/index.ts +5 -0
- package/src/solver-tools/lsoda/intdy.js +43 -0
- package/src/solver-tools/lsoda/intdy.js.map +1 -0
- package/src/solver-tools/lsoda/intdy.ts +50 -0
- package/src/solver-tools/lsoda/lsoda.js +567 -0
- package/src/solver-tools/lsoda/lsoda.js.map +1 -0
- package/src/solver-tools/lsoda/lsoda.ts +632 -0
- package/src/solver-tools/lsoda/methodswitch.js +97 -0
- package/src/solver-tools/lsoda/methodswitch.js.map +1 -0
- package/src/solver-tools/lsoda/methodswitch.ts +107 -0
- package/src/solver-tools/lsoda/orderswitch.js +86 -0
- package/src/solver-tools/lsoda/orderswitch.js.map +1 -0
- package/src/solver-tools/lsoda/orderswitch.ts +95 -0
- package/src/solver-tools/lsoda/prja.js +43 -0
- package/src/solver-tools/lsoda/prja.js.map +1 -0
- package/src/solver-tools/lsoda/prja.ts +49 -0
- package/src/solver-tools/lsoda/scaleh.js +30 -0
- package/src/solver-tools/lsoda/scaleh.js.map +1 -0
- package/src/solver-tools/lsoda/scaleh.ts +33 -0
- package/src/solver-tools/lsoda/solsy.js +14 -0
- package/src/solver-tools/lsoda/solsy.js.map +1 -0
- package/src/solver-tools/lsoda/solsy.ts +18 -0
- package/src/solver-tools/lsoda/stoda.js +259 -0
- package/src/solver-tools/lsoda/stoda.js.map +1 -0
- package/src/solver-tools/lsoda/stoda.ts +286 -0
- package/src/solver-tools/lsoda-method.js +120 -0
- package/src/solver-tools/lsoda-method.js.map +1 -0
- package/src/solver-tools/lsoda-method.ts +136 -0
- package/src/solver-tools/mrt-method.js +121 -19
- package/src/solver-tools/mrt-method.js.map +1 -1
- package/src/solver-tools/mrt-method.ts +151 -22
- package/src/solver-tools/rk3-method.js +210 -0
- package/src/solver-tools/rk3-method.js.map +1 -0
- package/src/solver-tools/rk3-method.ts +257 -0
- package/src/solver-tools/rk4-method.js +236 -0
- package/src/solver-tools/rk4-method.js.map +1 -0
- package/src/solver-tools/rk4-method.ts +286 -0
- package/src/solver-tools/rkdp-method.js +247 -0
- package/src/solver-tools/rkdp-method.js.map +1 -0
- package/src/solver-tools/rkdp-method.ts +300 -0
- package/src/solver-tools/ros34prw-method.js +40 -2
- package/src/solver-tools/ros34prw-method.js.map +1 -1
- package/src/solver-tools/ros34prw-method.ts +40 -2
- package/src/solver-tools/ros3prw-method.js +40 -2
- package/src/solver-tools/ros3prw-method.js.map +1 -1
- package/src/solver-tools/ros3prw-method.ts +40 -2
- package/src/solver-tools/solver-defs.js +15 -3
- package/src/solver-tools/solver-defs.js.map +1 -1
- package/src/solver-tools/solver-defs.ts +91 -7
- package/src/tests/correctness.test.js +6 -4
- package/src/tests/correctness.test.js.map +1 -1
- package/src/tests/correctness.test.ts +6 -4
- package/src/tests/lsoda-lib-correctness.test.js +223 -0
- package/src/tests/lsoda-lib-correctness.test.js.map +1 -0
- package/src/tests/lsoda-lib-correctness.test.ts +283 -0
- package/src/tests/lsoda-lib-performance.test.js +95 -0
- package/src/tests/lsoda-lib-performance.test.js.map +1 -0
- package/src/tests/lsoda-lib-performance.test.ts +126 -0
- package/src/tests/performance.test.js +10 -8
- package/src/tests/performance.test.js.map +1 -1
- package/src/tests/performance.test.ts +10 -8
- package/src/tests/test-defs.js +14 -1
- package/src/tests/test-defs.js.map +1 -1
- package/src/tests/test-defs.ts +15 -1
- package/src/worker-tools/scripting.js +95 -1
- package/src/worker-tools/scripting.js.map +1 -1
- package/src/worker-tools/scripting.ts +104 -2
- package/src/worker-tools/solving.js +18 -2
- package/src/worker-tools/solving.js.map +1 -1
- package/src/worker-tools/solving.ts +25 -2
- package/typedoc.json +8 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Constants from common.h
|
|
2
|
+
export const ETA = 2.2204460492503131e-16;
|
|
3
|
+
export const SQRTETA = 1.4901161193847656e-08;
|
|
4
|
+
export const CCMAX = 0.3;
|
|
5
|
+
export const MAXCOR = 3;
|
|
6
|
+
export const MSBP = 20;
|
|
7
|
+
export const MXNCF = 10;
|
|
8
|
+
export const RATIO = 5.0;
|
|
9
|
+
// Stability region limits for Adams method (from common.c)
|
|
10
|
+
export const sm1 = [
|
|
11
|
+
0., 0.5, 0.575, 0.55, 0.45, 0.35, 0.25, 0.2, 0.15, 0.1, 0.075, 0.05, 0.025,
|
|
12
|
+
];
|
|
13
|
+
// Method switch coefficients (from methodswitch.c)
|
|
14
|
+
// cm1 and cm2 are calculated from tesco/elco 1 and 2 formula in cfode.c
|
|
15
|
+
export const cm1 = [
|
|
16
|
+
0, 2.0, 5.999999999999998, 4.0,
|
|
17
|
+
1.5780346820809881, 0.44444444444444464, 0.09712509625876042, 0.017636684303350972,
|
|
18
|
+
0.002666977809498494, 0.00033760591160674403, 0.000035714285714285924, 3.1001984126984256e-06,
|
|
19
|
+
2.1543369643350994e-07,
|
|
20
|
+
];
|
|
21
|
+
export const cm2 = [
|
|
22
|
+
0, 2.0, 1.5, 0.6666666666666667,
|
|
23
|
+
0.20833333333333348, 0.04999999999999998, 0.09712509625876042, 0.017636684303350972,
|
|
24
|
+
0.002666977809498494, 0.00033760591160674403, 0.000035714285714285924, 3.1001984126984256e-06,
|
|
25
|
+
2.1543369643350994e-07,
|
|
26
|
+
];
|
|
27
|
+
// Internal solver state (mirrors lsoda_common_t)
|
|
28
|
+
export class LsodaCommon {
|
|
29
|
+
constructor() {
|
|
30
|
+
// Solution history (2D: yh[j][i], 1-indexed)
|
|
31
|
+
this.yh = [];
|
|
32
|
+
// Working matrix for Jacobian/LU (2D: wm[i][j], 1-indexed)
|
|
33
|
+
this.wm = [];
|
|
34
|
+
// Error weights (1-indexed)
|
|
35
|
+
this.ewt = new Float64Array(0);
|
|
36
|
+
// Saved function values (1-indexed)
|
|
37
|
+
this.savf = new Float64Array(0);
|
|
38
|
+
// Accumulated corrections (1-indexed)
|
|
39
|
+
this.acor = new Float64Array(0);
|
|
40
|
+
// Pivot indices for LU (1-indexed)
|
|
41
|
+
this.ipvt = new Int32Array(0);
|
|
42
|
+
// Step size
|
|
43
|
+
this.h = 0;
|
|
44
|
+
this.hu = 0;
|
|
45
|
+
this.rc = 0;
|
|
46
|
+
this.tn = 0;
|
|
47
|
+
this.tsw = 0;
|
|
48
|
+
this.pdnorm = 0;
|
|
49
|
+
// Convergence
|
|
50
|
+
this.crate = 0;
|
|
51
|
+
this.el = new Float64Array(14);
|
|
52
|
+
this.hold = 0;
|
|
53
|
+
this.rmax = 0;
|
|
54
|
+
this.pdest = 0;
|
|
55
|
+
this.pdlast = 0;
|
|
56
|
+
// Method coefficients (2D arrays, 1-indexed)
|
|
57
|
+
this.elco = [];
|
|
58
|
+
this.tesco = [];
|
|
59
|
+
// Counters and flags
|
|
60
|
+
this.ialth = 0;
|
|
61
|
+
this.ipup = 0;
|
|
62
|
+
this.nslp = 0;
|
|
63
|
+
this.icount = 0;
|
|
64
|
+
this.irflag = 0;
|
|
65
|
+
this.imxer = 0;
|
|
66
|
+
this.illin = 0;
|
|
67
|
+
this.nhnil = 0;
|
|
68
|
+
this.nslast = 0;
|
|
69
|
+
this.jcur = 0;
|
|
70
|
+
this.meth = 0;
|
|
71
|
+
this.mused = 0;
|
|
72
|
+
this.nq = 0;
|
|
73
|
+
this.nst = 0;
|
|
74
|
+
this.ncf = 0;
|
|
75
|
+
this.nfe = 0;
|
|
76
|
+
this.nje = 0;
|
|
77
|
+
this.nqu = 0;
|
|
78
|
+
this.miter = 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Solver context
|
|
82
|
+
export class LsodaContext {
|
|
83
|
+
constructor(func, neq, data) {
|
|
84
|
+
this.error = null;
|
|
85
|
+
this.common = null;
|
|
86
|
+
this.opt = null;
|
|
87
|
+
this.snapshots = null;
|
|
88
|
+
this.func = func;
|
|
89
|
+
this.neq = neq;
|
|
90
|
+
this.data = data !== null && data !== void 0 ? data : null;
|
|
91
|
+
this.state = 1;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["common.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,MAAM,CAAC,MAAM,GAAG,GAAG,sBAAsB,CAAC;AAC1C,MAAM,CAAC,MAAM,OAAO,GAAG,sBAAsB,CAAC;AAC9C,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC;AACzB,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC;AACxB,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;AACvB,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;AACxB,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC;AAEzB,2DAA2D;AAC3D,MAAM,CAAC,MAAM,GAAG,GAAa;IAC3B,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;CAC3E,CAAC;AAEF,mDAAmD;AACnD,wEAAwE;AACxE,MAAM,CAAC,MAAM,GAAG,GAAa;IAC3B,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG;IAC9B,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB;IAClF,oBAAoB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,sBAAsB;IAC7F,sBAAsB;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAa;IAC3B,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,kBAAkB;IAC/B,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB;IACnF,oBAAoB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,sBAAsB;IAC7F,sBAAsB;CACvB,CAAC;AAuBF,iDAAiD;AACjD,MAAM,OAAO,WAAW;IAAxB;QACE,6CAA6C;QAC7C,OAAE,GAAmB,EAAE,CAAC;QACxB,2DAA2D;QAC3D,OAAE,GAAmB,EAAE,CAAC;QACxB,4BAA4B;QAC5B,QAAG,GAAiB,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,oCAAoC;QACpC,SAAI,GAAiB,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,sCAAsC;QACtC,SAAI,GAAiB,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,mCAAmC;QACnC,SAAI,GAAe,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAErC,YAAY;QACZ,MAAC,GAAW,CAAC,CAAC;QACd,OAAE,GAAW,CAAC,CAAC;QACf,OAAE,GAAW,CAAC,CAAC;QACf,OAAE,GAAW,CAAC,CAAC;QACf,QAAG,GAAW,CAAC,CAAC;QAChB,WAAM,GAAW,CAAC,CAAC;QAEnB,cAAc;QACd,UAAK,GAAW,CAAC,CAAC;QAClB,OAAE,GAAiB,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;QACxC,SAAI,GAAW,CAAC,CAAC;QACjB,SAAI,GAAW,CAAC,CAAC;QACjB,UAAK,GAAW,CAAC,CAAC;QAClB,WAAM,GAAW,CAAC,CAAC;QAEnB,6CAA6C;QAC7C,SAAI,GAAmB,EAAE,CAAC;QAC1B,UAAK,GAAmB,EAAE,CAAC;QAE3B,qBAAqB;QACrB,UAAK,GAAW,CAAC,CAAC;QAClB,SAAI,GAAW,CAAC,CAAC;QACjB,SAAI,GAAW,CAAC,CAAC;QACjB,WAAM,GAAW,CAAC,CAAC;QACnB,WAAM,GAAW,CAAC,CAAC;QACnB,UAAK,GAAW,CAAC,CAAC;QAClB,UAAK,GAAW,CAAC,CAAC;QAClB,UAAK,GAAW,CAAC,CAAC;QAClB,WAAM,GAAW,CAAC,CAAC;QACnB,SAAI,GAAW,CAAC,CAAC;QACjB,SAAI,GAAW,CAAC,CAAC;QACjB,UAAK,GAAW,CAAC,CAAC;QAClB,OAAE,GAAW,CAAC,CAAC;QACf,QAAG,GAAW,CAAC,CAAC;QAChB,QAAG,GAAW,CAAC,CAAC;QAChB,QAAG,GAAW,CAAC,CAAC;QAChB,QAAG,GAAW,CAAC,CAAC;QAChB,QAAG,GAAW,CAAC,CAAC;QAChB,UAAK,GAAW,CAAC,CAAC;IACpB,CAAC;CAAA;AAWD,iBAAiB;AACjB,MAAM,OAAO,YAAY;IAUvB,YAAY,IAAe,EAAE,GAAW,EAAE,IAAU;QALpD,UAAK,GAAkB,IAAI,CAAC;QAC5B,WAAM,GAAuB,IAAI,CAAC;QAClC,QAAG,GAAoB,IAAI,CAAC;QAC5B,cAAS,GAA+B,IAAI,CAAC;QAG3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Constants from common.h
|
|
2
|
+
export const ETA = 2.2204460492503131e-16;
|
|
3
|
+
export const SQRTETA = 1.4901161193847656e-08;
|
|
4
|
+
export const CCMAX = 0.3;
|
|
5
|
+
export const MAXCOR = 3;
|
|
6
|
+
export const MSBP = 20;
|
|
7
|
+
export const MXNCF = 10;
|
|
8
|
+
export const RATIO = 5.0;
|
|
9
|
+
|
|
10
|
+
// Stability region limits for Adams method (from common.c)
|
|
11
|
+
export const sm1: number[] = [
|
|
12
|
+
0., 0.5, 0.575, 0.55, 0.45, 0.35, 0.25, 0.2, 0.15, 0.1, 0.075, 0.05, 0.025,
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
// Method switch coefficients (from methodswitch.c)
|
|
16
|
+
// cm1 and cm2 are calculated from tesco/elco 1 and 2 formula in cfode.c
|
|
17
|
+
export const cm1: number[] = [
|
|
18
|
+
0, 2.0, 5.999999999999998, 4.0,
|
|
19
|
+
1.5780346820809881, 0.44444444444444464, 0.09712509625876042, 0.017636684303350972,
|
|
20
|
+
0.002666977809498494, 0.00033760591160674403, 0.000035714285714285924, 3.1001984126984256e-06,
|
|
21
|
+
2.1543369643350994e-07,
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
export const cm2: number[] = [
|
|
25
|
+
0, 2.0, 1.5, 0.6666666666666667,
|
|
26
|
+
0.20833333333333348, 0.04999999999999998, 0.09712509625876042, 0.017636684303350972,
|
|
27
|
+
0.002666977809498494, 0.00033760591160674403, 0.000035714285714285924, 3.1001984126984256e-06,
|
|
28
|
+
2.1543369643350994e-07,
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
// User-provided ODE function type
|
|
32
|
+
// t: current time, y: state vector (0-based), ydot: output derivatives (0-based), data: user data
|
|
33
|
+
export type LsodaFunc = (t: number, y: Float64Array, ydot: Float64Array, data: any) => number;
|
|
34
|
+
|
|
35
|
+
// Solver options
|
|
36
|
+
export interface LsodaOpt {
|
|
37
|
+
ixpr: number; // print flag
|
|
38
|
+
mxstep: number; // max internal steps per call
|
|
39
|
+
mxhnil: number; // max step size warnings
|
|
40
|
+
mxordn: number; // max Adams order (1-12)
|
|
41
|
+
mxords: number; // max BDF order (1-5)
|
|
42
|
+
tcrit: number; // critical time for itask 4,5
|
|
43
|
+
h0: number; // initial step size (0 = auto)
|
|
44
|
+
hmax: number; // max absolute step size
|
|
45
|
+
hmin: number; // min absolute step size
|
|
46
|
+
hmxi: number; // 1/hmax (computed)
|
|
47
|
+
itask: number; // integration task (1-5)
|
|
48
|
+
rtol: Float64Array; // relative tolerance (1-indexed)
|
|
49
|
+
atol: Float64Array; // absolute tolerance (1-indexed)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Internal solver state (mirrors lsoda_common_t)
|
|
53
|
+
export class LsodaCommon {
|
|
54
|
+
// Solution history (2D: yh[j][i], 1-indexed)
|
|
55
|
+
yh: Float64Array[] = [];
|
|
56
|
+
// Working matrix for Jacobian/LU (2D: wm[i][j], 1-indexed)
|
|
57
|
+
wm: Float64Array[] = [];
|
|
58
|
+
// Error weights (1-indexed)
|
|
59
|
+
ewt: Float64Array = new Float64Array(0);
|
|
60
|
+
// Saved function values (1-indexed)
|
|
61
|
+
savf: Float64Array = new Float64Array(0);
|
|
62
|
+
// Accumulated corrections (1-indexed)
|
|
63
|
+
acor: Float64Array = new Float64Array(0);
|
|
64
|
+
// Pivot indices for LU (1-indexed)
|
|
65
|
+
ipvt: Int32Array = new Int32Array(0);
|
|
66
|
+
|
|
67
|
+
// Step size
|
|
68
|
+
h: number = 0;
|
|
69
|
+
hu: number = 0;
|
|
70
|
+
rc: number = 0;
|
|
71
|
+
tn: number = 0;
|
|
72
|
+
tsw: number = 0;
|
|
73
|
+
pdnorm: number = 0;
|
|
74
|
+
|
|
75
|
+
// Convergence
|
|
76
|
+
crate: number = 0;
|
|
77
|
+
el: Float64Array = new Float64Array(14);
|
|
78
|
+
hold: number = 0;
|
|
79
|
+
rmax: number = 0;
|
|
80
|
+
pdest: number = 0;
|
|
81
|
+
pdlast: number = 0;
|
|
82
|
+
|
|
83
|
+
// Method coefficients (2D arrays, 1-indexed)
|
|
84
|
+
elco: Float64Array[] = [];
|
|
85
|
+
tesco: Float64Array[] = [];
|
|
86
|
+
|
|
87
|
+
// Counters and flags
|
|
88
|
+
ialth: number = 0;
|
|
89
|
+
ipup: number = 0;
|
|
90
|
+
nslp: number = 0;
|
|
91
|
+
icount: number = 0;
|
|
92
|
+
irflag: number = 0;
|
|
93
|
+
imxer: number = 0;
|
|
94
|
+
illin: number = 0;
|
|
95
|
+
nhnil: number = 0;
|
|
96
|
+
nslast: number = 0;
|
|
97
|
+
jcur: number = 0;
|
|
98
|
+
meth: number = 0;
|
|
99
|
+
mused: number = 0;
|
|
100
|
+
nq: number = 0;
|
|
101
|
+
nst: number = 0;
|
|
102
|
+
ncf: number = 0;
|
|
103
|
+
nfe: number = 0;
|
|
104
|
+
nje: number = 0;
|
|
105
|
+
nqu: number = 0;
|
|
106
|
+
miter: number = 0;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Snapshot of the Nordsieck array at a successful step (0-based arrays)
|
|
110
|
+
export interface NordsieckSnapshot {
|
|
111
|
+
tn: number; // right edge of the step
|
|
112
|
+
h: number; // step size used
|
|
113
|
+
hu: number; // last successful step size (for range check)
|
|
114
|
+
nq: number; // method order
|
|
115
|
+
yh: Float64Array[]; // yh[0..nq], each of length neq (0-based copies)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Solver context
|
|
119
|
+
export class LsodaContext {
|
|
120
|
+
func: LsodaFunc;
|
|
121
|
+
data: any;
|
|
122
|
+
neq: number;
|
|
123
|
+
state: number;
|
|
124
|
+
error: string | null = null;
|
|
125
|
+
common: LsodaCommon | null = null;
|
|
126
|
+
opt: LsodaOpt | null = null;
|
|
127
|
+
snapshots: NordsieckSnapshot[] | null = null;
|
|
128
|
+
|
|
129
|
+
constructor(func: LsodaFunc, neq: number, data?: any) {
|
|
130
|
+
this.func = func;
|
|
131
|
+
this.neq = neq;
|
|
132
|
+
this.data = data ?? null;
|
|
133
|
+
this.state = 1;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MXNCF } from './common';
|
|
2
|
+
/**
|
|
3
|
+
* Handle corrector convergence failure.
|
|
4
|
+
* Retracts yh array and increments ncf.
|
|
5
|
+
* Returns 2 if unrecoverable, 1 if step can be retried.
|
|
6
|
+
*/
|
|
7
|
+
export function corfailure(ctx, told) {
|
|
8
|
+
const c = ctx.common;
|
|
9
|
+
const neq = ctx.neq;
|
|
10
|
+
const hmin = ctx.opt.hmin;
|
|
11
|
+
c.ncf++;
|
|
12
|
+
c.rmax = 2.;
|
|
13
|
+
c.tn = told;
|
|
14
|
+
for (let j = c.nq; j >= 1; j--) {
|
|
15
|
+
for (let i1 = j; i1 <= c.nq; i1++) {
|
|
16
|
+
for (let i = 1; i <= neq; i++)
|
|
17
|
+
c.yh[i1][i] -= c.yh[i1 + 1][i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (Math.abs(c.h) <= hmin * 1.00001 || c.ncf === MXNCF)
|
|
21
|
+
return 2;
|
|
22
|
+
c.ipup = c.miter;
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=corfailure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corfailure.js","sourceRoot":"","sources":["corfailure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAC,MAAM,UAAU,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAiB,EAAE,IAAY;IACxD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAO,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAI,CAAC,IAAI,CAAC;IAE3B,CAAC,CAAC,GAAG,EAAE,CAAC;IACR,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC;IAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;gBAC3B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;QACpD,OAAO,CAAC,CAAC;IAGX,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;IACjB,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {LsodaContext, MXNCF} from './common';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Handle corrector convergence failure.
|
|
5
|
+
* Retracts yh array and increments ncf.
|
|
6
|
+
* Returns 2 if unrecoverable, 1 if step can be retried.
|
|
7
|
+
*/
|
|
8
|
+
export function corfailure(ctx: LsodaContext, told: number): number {
|
|
9
|
+
const c = ctx.common!;
|
|
10
|
+
const neq = ctx.neq;
|
|
11
|
+
const hmin = ctx.opt!.hmin;
|
|
12
|
+
|
|
13
|
+
c.ncf++;
|
|
14
|
+
c.rmax = 2.;
|
|
15
|
+
c.tn = told;
|
|
16
|
+
|
|
17
|
+
for (let j = c.nq; j >= 1; j--) {
|
|
18
|
+
for (let i1 = j; i1 <= c.nq; i1++) {
|
|
19
|
+
for (let i = 1; i <= neq; i++)
|
|
20
|
+
c.yh[i1][i] -= c.yh[i1 + 1][i];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (Math.abs(c.h) <= hmin * 1.00001 || c.ncf === MXNCF)
|
|
25
|
+
return 2;
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
c.ipup = c.miter;
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ETA, MAXCOR } from './common';
|
|
2
|
+
import { vmnorm } from './blas';
|
|
3
|
+
import { prja } from './prja';
|
|
4
|
+
import { solsy } from './solsy';
|
|
5
|
+
import { corfailure } from './corfailure';
|
|
6
|
+
/**
|
|
7
|
+
* Corrector iteration.
|
|
8
|
+
* Returns corflag: 0 = converged, 1 = reduce step & redo prediction, 2 = failure.
|
|
9
|
+
*/
|
|
10
|
+
export function correction(ctx, y, pnorm, cs, told) {
|
|
11
|
+
const c = ctx.common;
|
|
12
|
+
const neq = ctx.neq;
|
|
13
|
+
cs.m = 0;
|
|
14
|
+
let rate = 0.;
|
|
15
|
+
cs.del = 0.;
|
|
16
|
+
for (let i = 1; i <= neq; i++)
|
|
17
|
+
y[i] = c.yh[1][i];
|
|
18
|
+
ctx.func(c.tn, y.subarray(1), c.savf.subarray(1), ctx.data);
|
|
19
|
+
c.nfe++;
|
|
20
|
+
while (true) {
|
|
21
|
+
if (cs.m === 0) {
|
|
22
|
+
if (c.ipup > 0) {
|
|
23
|
+
const ierpj = prja(ctx, y);
|
|
24
|
+
c.jcur = 1;
|
|
25
|
+
c.ipup = 0;
|
|
26
|
+
c.rc = 1.;
|
|
27
|
+
c.nslp = c.nst;
|
|
28
|
+
c.crate = 0.7;
|
|
29
|
+
if (!ierpj)
|
|
30
|
+
return corfailure(ctx, told);
|
|
31
|
+
}
|
|
32
|
+
for (let i = 1; i <= neq; i++)
|
|
33
|
+
c.acor[i] = 0.;
|
|
34
|
+
}
|
|
35
|
+
if (c.miter === 0) {
|
|
36
|
+
// Functional iteration
|
|
37
|
+
for (let i = 1; i <= neq; i++) {
|
|
38
|
+
c.savf[i] = c.h * c.savf[i] - c.yh[2][i];
|
|
39
|
+
y[i] = c.savf[i] - c.acor[i];
|
|
40
|
+
}
|
|
41
|
+
cs.del = vmnorm(neq, y, c.ewt);
|
|
42
|
+
for (let i = 1; i <= neq; i++) {
|
|
43
|
+
y[i] = c.yh[1][i] + c.el[1] * c.savf[i];
|
|
44
|
+
c.acor[i] = c.savf[i];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Chord method
|
|
49
|
+
for (let i = 1; i <= neq; i++)
|
|
50
|
+
y[i] = c.h * c.savf[i] - (c.yh[2][i] + c.acor[i]);
|
|
51
|
+
solsy(ctx, y);
|
|
52
|
+
cs.del = vmnorm(neq, y, c.ewt);
|
|
53
|
+
for (let i = 1; i <= neq; i++) {
|
|
54
|
+
c.acor[i] += y[i];
|
|
55
|
+
y[i] = c.yh[1][i] + c.el[1] * c.acor[i];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Test for convergence
|
|
59
|
+
if (cs.del <= 100. * pnorm * ETA)
|
|
60
|
+
break;
|
|
61
|
+
if (cs.m !== 0 || c.meth !== 1) {
|
|
62
|
+
if (cs.m !== 0) {
|
|
63
|
+
let rm = 1024.0;
|
|
64
|
+
if (cs.del <= 1024. * cs.delp)
|
|
65
|
+
rm = cs.del / cs.delp;
|
|
66
|
+
rate = Math.max(rate, rm);
|
|
67
|
+
c.crate = Math.max(0.2 * c.crate, rm);
|
|
68
|
+
}
|
|
69
|
+
const conit = 0.5 / (c.nq + 2);
|
|
70
|
+
const dcon = cs.del * Math.min(1., 1.5 * c.crate) / (c.tesco[c.nq][2] * conit);
|
|
71
|
+
if (dcon <= 1.) {
|
|
72
|
+
c.pdest = Math.max(c.pdest, rate / Math.abs(c.h * c.el[1]));
|
|
73
|
+
if (c.pdest !== 0.)
|
|
74
|
+
c.pdlast = c.pdest;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Corrector iteration failed to converge
|
|
79
|
+
cs.m++;
|
|
80
|
+
if (cs.m === MAXCOR || (cs.m >= 2 && cs.del > 2. * cs.delp)) {
|
|
81
|
+
if (c.miter === 0 || c.jcur === 1)
|
|
82
|
+
return corfailure(ctx, told);
|
|
83
|
+
c.ipup = c.miter;
|
|
84
|
+
// Restart corrector if Jacobian is recomputed
|
|
85
|
+
cs.m = 0;
|
|
86
|
+
rate = 0.;
|
|
87
|
+
cs.del = 0.;
|
|
88
|
+
for (let i = 1; i <= neq; i++)
|
|
89
|
+
y[i] = c.yh[1][i];
|
|
90
|
+
ctx.func(c.tn, y.subarray(1), c.savf.subarray(1), ctx.data);
|
|
91
|
+
c.nfe++;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
cs.delp = cs.del;
|
|
95
|
+
ctx.func(c.tn, y.subarray(1), c.savf.subarray(1), ctx.data);
|
|
96
|
+
c.nfe++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=correction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction.js","sourceRoot":"","sources":["correction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {LsodaContext, ETA, MAXCOR} from './common';
|
|
2
|
+
import {vmnorm} from './blas';
|
|
3
|
+
import {prja} from './prja';
|
|
4
|
+
import {solsy} from './solsy';
|
|
5
|
+
import {corfailure} from './corfailure';
|
|
6
|
+
|
|
7
|
+
/** Mutable state passed between correction and stoda */
|
|
8
|
+
export interface CorrectionState {
|
|
9
|
+
del: number;
|
|
10
|
+
delp: number;
|
|
11
|
+
m: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Corrector iteration.
|
|
16
|
+
* Returns corflag: 0 = converged, 1 = reduce step & redo prediction, 2 = failure.
|
|
17
|
+
*/
|
|
18
|
+
export function correction(
|
|
19
|
+
ctx: LsodaContext, y: Float64Array, pnorm: number,
|
|
20
|
+
cs: CorrectionState, told: number,
|
|
21
|
+
): number {
|
|
22
|
+
const c = ctx.common!;
|
|
23
|
+
const neq = ctx.neq;
|
|
24
|
+
|
|
25
|
+
cs.m = 0;
|
|
26
|
+
let rate = 0.;
|
|
27
|
+
cs.del = 0.;
|
|
28
|
+
|
|
29
|
+
for (let i = 1; i <= neq; i++)
|
|
30
|
+
y[i] = c.yh[1][i];
|
|
31
|
+
|
|
32
|
+
ctx.func(c.tn, y.subarray(1), c.savf.subarray(1), ctx.data);
|
|
33
|
+
c.nfe++;
|
|
34
|
+
|
|
35
|
+
while (true) {
|
|
36
|
+
if (cs.m === 0) {
|
|
37
|
+
if (c.ipup > 0) {
|
|
38
|
+
const ierpj = prja(ctx, y);
|
|
39
|
+
c.jcur = 1;
|
|
40
|
+
c.ipup = 0;
|
|
41
|
+
c.rc = 1.;
|
|
42
|
+
c.nslp = c.nst;
|
|
43
|
+
c.crate = 0.7;
|
|
44
|
+
if (!ierpj)
|
|
45
|
+
return corfailure(ctx, told);
|
|
46
|
+
}
|
|
47
|
+
for (let i = 1; i <= neq; i++)
|
|
48
|
+
c.acor[i] = 0.;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (c.miter === 0) {
|
|
52
|
+
// Functional iteration
|
|
53
|
+
for (let i = 1; i <= neq; i++) {
|
|
54
|
+
c.savf[i] = c.h * c.savf[i] - c.yh[2][i];
|
|
55
|
+
y[i] = c.savf[i] - c.acor[i];
|
|
56
|
+
}
|
|
57
|
+
cs.del = vmnorm(neq, y, c.ewt);
|
|
58
|
+
for (let i = 1; i <= neq; i++) {
|
|
59
|
+
y[i] = c.yh[1][i] + c.el[1] * c.savf[i];
|
|
60
|
+
c.acor[i] = c.savf[i];
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
// Chord method
|
|
64
|
+
for (let i = 1; i <= neq; i++)
|
|
65
|
+
y[i] = c.h * c.savf[i] - (c.yh[2][i] + c.acor[i]);
|
|
66
|
+
solsy(ctx, y);
|
|
67
|
+
cs.del = vmnorm(neq, y, c.ewt);
|
|
68
|
+
for (let i = 1; i <= neq; i++) {
|
|
69
|
+
c.acor[i] += y[i];
|
|
70
|
+
y[i] = c.yh[1][i] + c.el[1] * c.acor[i];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Test for convergence
|
|
75
|
+
if (cs.del <= 100. * pnorm * ETA)
|
|
76
|
+
break;
|
|
77
|
+
|
|
78
|
+
if (cs.m !== 0 || c.meth !== 1) {
|
|
79
|
+
if (cs.m !== 0) {
|
|
80
|
+
let rm = 1024.0;
|
|
81
|
+
if (cs.del <= 1024. * cs.delp)
|
|
82
|
+
rm = cs.del / cs.delp;
|
|
83
|
+
rate = Math.max(rate, rm);
|
|
84
|
+
c.crate = Math.max(0.2 * c.crate, rm);
|
|
85
|
+
}
|
|
86
|
+
const conit = 0.5 / (c.nq + 2);
|
|
87
|
+
const dcon = cs.del * Math.min(1., 1.5 * c.crate) / (c.tesco[c.nq][2] * conit);
|
|
88
|
+
if (dcon <= 1.) {
|
|
89
|
+
c.pdest = Math.max(c.pdest, rate / Math.abs(c.h * c.el[1]));
|
|
90
|
+
if (c.pdest !== 0.)
|
|
91
|
+
c.pdlast = c.pdest;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Corrector iteration failed to converge
|
|
97
|
+
cs.m++;
|
|
98
|
+
if (cs.m === MAXCOR || (cs.m >= 2 && cs.del > 2. * cs.delp)) {
|
|
99
|
+
if (c.miter === 0 || c.jcur === 1)
|
|
100
|
+
return corfailure(ctx, told);
|
|
101
|
+
|
|
102
|
+
c.ipup = c.miter;
|
|
103
|
+
// Restart corrector if Jacobian is recomputed
|
|
104
|
+
cs.m = 0;
|
|
105
|
+
rate = 0.;
|
|
106
|
+
cs.del = 0.;
|
|
107
|
+
for (let i = 1; i <= neq; i++)
|
|
108
|
+
y[i] = c.yh[1][i];
|
|
109
|
+
ctx.func(c.tn, y.subarray(1), c.savf.subarray(1), ctx.data);
|
|
110
|
+
c.nfe++;
|
|
111
|
+
} else {
|
|
112
|
+
cs.delp = cs.del;
|
|
113
|
+
ctx.func(c.tn, y.subarray(1), c.savf.subarray(1), ctx.data);
|
|
114
|
+
c.nfe++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dense output interpolator. Given a sequence of Nordsieck snapshots
|
|
3
|
+
* captured during integration, evaluates the solution at arbitrary points
|
|
4
|
+
* via Taylor/Horner interpolation.
|
|
5
|
+
*/
|
|
6
|
+
export class DenseOutput {
|
|
7
|
+
constructor(snapshots, neq) {
|
|
8
|
+
if (snapshots.length === 0)
|
|
9
|
+
throw new Error('[DenseOutput] no snapshots collected');
|
|
10
|
+
this.snaps = snapshots;
|
|
11
|
+
this.neq = neq;
|
|
12
|
+
}
|
|
13
|
+
/** Leftmost reachable time. */
|
|
14
|
+
get tMin() {
|
|
15
|
+
const s = this.snaps[0];
|
|
16
|
+
return s.tn - s.hu;
|
|
17
|
+
}
|
|
18
|
+
/** Rightmost reachable time. */
|
|
19
|
+
get tMax() {
|
|
20
|
+
return this.snaps[this.snaps.length - 1].tn;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Evaluate the solution at a single time point.
|
|
24
|
+
* Uses Horner's method on the Nordsieck array of the enclosing step.
|
|
25
|
+
*/
|
|
26
|
+
evaluateAt(t) {
|
|
27
|
+
const snap = this.findSnap(t);
|
|
28
|
+
return this.horner(snap, t, new Float64Array(this.neq));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Evaluate the solution at each point in a sorted ascending array.
|
|
32
|
+
* Uses a linear scan over snapshots for efficiency.
|
|
33
|
+
*/
|
|
34
|
+
solveAtTimes(tArray) {
|
|
35
|
+
if (tArray.length === 0)
|
|
36
|
+
return [];
|
|
37
|
+
const snaps = this.snaps;
|
|
38
|
+
// Validate range
|
|
39
|
+
const tFirst = tArray[0];
|
|
40
|
+
const tLast = tArray[tArray.length - 1];
|
|
41
|
+
if (tFirst < this.tMin - 1e-14 * Math.abs(this.tMin))
|
|
42
|
+
throw new Error(`[DenseOutput] t=${tFirst} is before tMin=${this.tMin}`);
|
|
43
|
+
if (tLast > this.tMax + 1e-14 * Math.abs(this.tMax))
|
|
44
|
+
throw new Error(`[DenseOutput] t=${tLast} is after tMax=${this.tMax}`);
|
|
45
|
+
const dky = new Float64Array(this.neq);
|
|
46
|
+
const result = [];
|
|
47
|
+
for (let i = 0; i < this.neq; ++i)
|
|
48
|
+
result.push(new Float64Array(tArray.length));
|
|
49
|
+
let si = 0; // snapshot pointer
|
|
50
|
+
for (let qi = 0; qi < tArray.length; qi++) {
|
|
51
|
+
const t = tArray[qi];
|
|
52
|
+
// Advance snapshot pointer until we find an interval containing t
|
|
53
|
+
while (si < snaps.length - 1 && t > snaps[si].tn + 1e-14 * Math.abs(snaps[si].tn))
|
|
54
|
+
si++;
|
|
55
|
+
this.horner(snaps[si], t, dky);
|
|
56
|
+
for (let i = 0; i < this.neq; ++i)
|
|
57
|
+
result[i][qi] = dky[i];
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Evaluate the solution on a uniform grid from tStart to tEnd with given step.
|
|
63
|
+
*/
|
|
64
|
+
solveOnGrid(tStart, tEnd, step) {
|
|
65
|
+
if (step <= 0)
|
|
66
|
+
throw new Error('[DenseOutput] step must be positive');
|
|
67
|
+
const n = Math.floor((tEnd - tStart) / step) + 1;
|
|
68
|
+
const tArr = new Float64Array(n);
|
|
69
|
+
for (let i = 0; i < n - 1; i++)
|
|
70
|
+
tArr[i] = tStart + i * step;
|
|
71
|
+
tArr[n - 1] = tEnd;
|
|
72
|
+
const t = tArr;
|
|
73
|
+
const y = this.solveAtTimes(t);
|
|
74
|
+
return { t, y };
|
|
75
|
+
}
|
|
76
|
+
/** Find the snapshot whose interval contains t via binary search. */
|
|
77
|
+
findSnap(t) {
|
|
78
|
+
const snaps = this.snaps;
|
|
79
|
+
// Quick boundary checks
|
|
80
|
+
if (t <= snaps[0].tn)
|
|
81
|
+
return snaps[0];
|
|
82
|
+
if (t >= snaps[snaps.length - 1].tn)
|
|
83
|
+
return snaps[snaps.length - 1];
|
|
84
|
+
// Binary search: find first snap with tn >= t
|
|
85
|
+
let lo = 0;
|
|
86
|
+
let hi = snaps.length - 1;
|
|
87
|
+
while (lo < hi) {
|
|
88
|
+
const mid = (lo + hi) >>> 1;
|
|
89
|
+
if (snaps[mid].tn < t)
|
|
90
|
+
lo = mid + 1;
|
|
91
|
+
else
|
|
92
|
+
hi = mid;
|
|
93
|
+
}
|
|
94
|
+
return snaps[lo];
|
|
95
|
+
}
|
|
96
|
+
/** Horner evaluation of the Nordsieck polynomial at time t. */
|
|
97
|
+
horner(snap, t, dky) {
|
|
98
|
+
const { nq, h, yh } = snap;
|
|
99
|
+
const neq = this.neq;
|
|
100
|
+
const s = (t - snap.tn) / h;
|
|
101
|
+
for (let i = 0; i < neq; i++) {
|
|
102
|
+
let val = yh[nq][i];
|
|
103
|
+
for (let j = nq - 1; j >= 0; j--)
|
|
104
|
+
val = yh[j][i] + s * val;
|
|
105
|
+
dky[i] = val;
|
|
106
|
+
}
|
|
107
|
+
return dky;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=dense.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dense.js","sourceRoot":"","sources":["dense.ts"],"names":[],"mappings":"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"}
|