diff-grok 1.0.10 → 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/settings.local.json +11 -0
- 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 +104 -0
- package/LICENSE +1 -1
- package/README.MD +121 -27
- package/THIRD_PARTY_LICENSES +135 -0
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/BasicModelPipelineCreator.html +4 -4
- package/docs/classes/Callback.html +5 -5
- package/docs/classes/CyclicModelPipelineCreator.html +4 -4
- package/docs/classes/IterCheckerCallback.html +5 -5
- package/docs/classes/PipelineCreator.html +4 -4
- package/docs/classes/TimeCheckerCallback.html +5 -5
- package/docs/classes/UpdatesModelPipelineCreator.html +4 -4
- package/docs/functions/ab4.html +8 -0
- package/docs/functions/ab5.html +8 -0
- package/docs/functions/applyPipeline.html +2 -2
- package/docs/functions/getCallback.html +2 -2
- package/docs/functions/getIVP.html +2 -2
- package/docs/functions/getInputVector.html +2 -2
- package/docs/functions/getIvp2WebWorker.html +2 -2
- package/docs/functions/getJScode.html +2 -2
- package/docs/functions/getOutputNames.html +2 -2
- package/docs/functions/getPipelineCreator.html +2 -2
- package/docs/functions/lsoda.html +8 -0
- package/docs/functions/mrt.html +2 -2
- package/docs/functions/printE5.html +2 -2
- package/docs/functions/printHires.html +2 -2
- package/docs/functions/printOrego.html +2 -2
- package/docs/functions/printPollution.html +2 -2
- package/docs/functions/printRobertson.html +2 -2
- package/docs/functions/printVdpol.html +2 -2
- 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 +2 -2
- package/docs/functions/ros3prw.html +2 -2
- package/docs/functions/solveIvp.html +2 -2
- package/docs/hierarchy.html +1 -1
- package/docs/index.html +100 -15
- 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/ROBER.png +0 -0
- package/docs/media/VDP0L.png +0 -0
- package/docs/media/cyclic-model.js +3 -1
- package/docs/media/cyclic-model.js.map +1 -1
- package/docs/media/cyclic-model.ts +3 -1
- package/docs/modules.html +1 -1
- package/docs/types/Arg.html +7 -7
- package/docs/types/DifEqs.html +4 -4
- package/docs/types/Func.html +2 -2
- package/docs/types/IVP.html +20 -20
- package/docs/types/IVP2WebWorker.html +7 -7
- package/docs/types/Input.html +4 -4
- package/docs/types/Loop.html +4 -4
- package/docs/types/ODEs.html +8 -8
- package/docs/types/Output.html +4 -4
- package/docs/types/Pipeline.html +4 -4
- package/docs/types/SolverOptions.html +5 -5
- package/docs/types/Update.html +5 -5
- package/docs/types/Wrapper.html +5 -5
- 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/ROBER.png +0 -0
- package/images/VDP0L.png +0 -0
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/index.ts +2 -1
- package/jest.config.js +1 -0
- 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/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/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/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 +7 -0
- package/src/solver-tools/index.js.map +1 -1
- package/src/solver-tools/index.ts +7 -0
- package/src/solver-tools/lsoda/blas.js +257 -0
- package/src/solver-tools/lsoda/blas.js.map +1 -0
- package/src/solver-tools/lsoda/blas.ts +279 -0
- package/src/solver-tools/lsoda/cfode.js +84 -0
- package/src/solver-tools/lsoda/cfode.js.map +1 -0
- package/src/solver-tools/lsoda/cfode.ts +95 -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 +36 -0
- package/src/solver-tools/lsoda/corfailure.js.map +1 -0
- package/src/solver-tools/lsoda/corfailure.ts +42 -0
- package/src/solver-tools/lsoda/correction.js +112 -0
- package/src/solver-tools/lsoda/correction.js.map +1 -0
- package/src/solver-tools/lsoda/correction.ts +131 -0
- package/src/solver-tools/lsoda/dense.js +121 -0
- package/src/solver-tools/lsoda/dense.js.map +1 -0
- package/src/solver-tools/lsoda/dense.ts +141 -0
- package/src/solver-tools/lsoda/index.js +15 -0
- package/src/solver-tools/lsoda/index.js.map +1 -0
- package/src/solver-tools/lsoda/index.ts +17 -0
- package/src/solver-tools/lsoda/intdy.js +54 -0
- package/src/solver-tools/lsoda/intdy.js.map +1 -0
- package/src/solver-tools/lsoda/intdy.ts +62 -0
- package/src/solver-tools/lsoda/lsoda.js +578 -0
- package/src/solver-tools/lsoda/lsoda.js.map +1 -0
- package/src/solver-tools/lsoda/lsoda.ts +644 -0
- package/src/solver-tools/lsoda/methodswitch.js +108 -0
- package/src/solver-tools/lsoda/methodswitch.js.map +1 -0
- package/src/solver-tools/lsoda/methodswitch.ts +119 -0
- package/src/solver-tools/lsoda/orderswitch.js +97 -0
- package/src/solver-tools/lsoda/orderswitch.js.map +1 -0
- package/src/solver-tools/lsoda/orderswitch.ts +107 -0
- package/src/solver-tools/lsoda/prja.js +54 -0
- package/src/solver-tools/lsoda/prja.js.map +1 -0
- package/src/solver-tools/lsoda/prja.ts +61 -0
- package/src/solver-tools/lsoda/scaleh.js +41 -0
- package/src/solver-tools/lsoda/scaleh.js.map +1 -0
- package/src/solver-tools/lsoda/scaleh.ts +45 -0
- package/src/solver-tools/lsoda/solsy.js +25 -0
- package/src/solver-tools/lsoda/solsy.js.map +1 -0
- package/src/solver-tools/lsoda/solsy.ts +30 -0
- package/src/solver-tools/lsoda/stoda.js +270 -0
- package/src/solver-tools/lsoda/stoda.js.map +1 -0
- package/src/solver-tools/lsoda/stoda.ts +298 -0
- package/src/solver-tools/lsoda-method.js +134 -0
- package/src/solver-tools/lsoda-method.js.map +1 -0
- package/src/solver-tools/lsoda-method.ts +154 -0
- package/src/solver-tools/mrt-method.js +81 -18
- package/src/solver-tools/mrt-method.js.map +1 -1
- package/src/solver-tools/mrt-method.ts +111 -21
- 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 +1 -1
- package/src/solver-tools/ros34prw-method.js.map +1 -1
- package/src/solver-tools/ros34prw-method.ts +1 -1
- package/src/solver-tools/ros3prw-method.js +1 -1
- package/src/solver-tools/ros3prw-method.js.map +1 -1
- package/src/solver-tools/ros3prw-method.ts +1 -1
- package/src/solver-tools/solver-defs.js +7 -0
- package/src/solver-tools/solver-defs.js.map +1 -1
- package/src/solver-tools/solver-defs.ts +7 -0
- 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/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/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 +12 -8
- package/src/tests/performance.test.js.map +1 -1
- package/src/tests/performance.test.ts +12 -8
- package/src/tests/test-defs.js +20 -1
- package/src/tests/test-defs.js.map +1 -1
- package/src/tests/test-defs.ts +22 -1
- package/src/worker-tools/solving.js +15 -1
- package/src/worker-tools/solving.js.map +1 -1
- package/src/worker-tools/solving.ts +23 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
import { ETA, RATIO, sm1, cm1, cm2 } from './common';
|
|
13
|
+
import { vmnorm } from './blas';
|
|
14
|
+
/**
|
|
15
|
+
* Consider switching between Adams (meth=1) and BDF (meth=2).
|
|
16
|
+
* Modifies ctx.common.meth, miter, nq, icount, pdlast on switch.
|
|
17
|
+
*/
|
|
18
|
+
export function methodswitch(ctx, dsm, pnorm, out) {
|
|
19
|
+
const c = ctx.common;
|
|
20
|
+
const neq = ctx.neq;
|
|
21
|
+
const mxordn = ctx.opt.mxordn;
|
|
22
|
+
const mxords = ctx.opt.mxords;
|
|
23
|
+
if (c.meth === 1) {
|
|
24
|
+
// Currently Adams, consider switching to BDF
|
|
25
|
+
if (c.nq > 5)
|
|
26
|
+
return;
|
|
27
|
+
let rh2;
|
|
28
|
+
let nqm2;
|
|
29
|
+
if (dsm <= (100. * pnorm * ETA) || c.pdest === 0.) {
|
|
30
|
+
if (c.irflag === 0)
|
|
31
|
+
return;
|
|
32
|
+
rh2 = 2.;
|
|
33
|
+
nqm2 = Math.min(c.nq, mxords);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const exsm = 1. / (c.nq + 1);
|
|
37
|
+
let rh1 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
38
|
+
let rh1it = 2. * rh1;
|
|
39
|
+
const pdh = c.pdlast * Math.abs(c.h);
|
|
40
|
+
if ((pdh * rh1) > 0.00001)
|
|
41
|
+
rh1it = sm1[c.nq] / pdh;
|
|
42
|
+
rh1 = Math.min(rh1, rh1it);
|
|
43
|
+
if (c.nq > mxords) {
|
|
44
|
+
nqm2 = mxords;
|
|
45
|
+
const lm2 = mxords + 1;
|
|
46
|
+
const exm2 = 1. / lm2;
|
|
47
|
+
const lm2p1 = lm2 + 1;
|
|
48
|
+
const dm2 = vmnorm(neq, c.yh[lm2p1], c.ewt) / cm2[mxords];
|
|
49
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exm2) + 0.0000012);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const dm2 = dsm * (cm1[c.nq] / cm2[c.nq]);
|
|
53
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exsm) + 0.0000012);
|
|
54
|
+
nqm2 = c.nq;
|
|
55
|
+
}
|
|
56
|
+
if (rh2 < RATIO * rh1)
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Switch to BDF
|
|
60
|
+
out.rh = rh2;
|
|
61
|
+
c.icount = 20;
|
|
62
|
+
c.meth = 2;
|
|
63
|
+
c.miter = 2;
|
|
64
|
+
c.pdlast = 0.;
|
|
65
|
+
c.nq = nqm2;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Currently BDF (meth=2), consider switching to Adams
|
|
69
|
+
const exsm = 1. / (c.nq + 1);
|
|
70
|
+
let nqm1;
|
|
71
|
+
let exm1;
|
|
72
|
+
let rh1;
|
|
73
|
+
let dm1;
|
|
74
|
+
if (mxordn < c.nq) {
|
|
75
|
+
nqm1 = mxordn;
|
|
76
|
+
const lm1 = mxordn + 1;
|
|
77
|
+
exm1 = 1. / lm1;
|
|
78
|
+
const lm1p1 = lm1 + 1;
|
|
79
|
+
dm1 = vmnorm(neq, c.yh[lm1p1], c.ewt) / cm1[mxordn];
|
|
80
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exm1) + 0.0000012);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
dm1 = dsm * (cm2[c.nq] / cm1[c.nq]);
|
|
84
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exsm) + 0.0000012);
|
|
85
|
+
nqm1 = c.nq;
|
|
86
|
+
exm1 = exsm;
|
|
87
|
+
}
|
|
88
|
+
let rh1it = 2. * rh1;
|
|
89
|
+
const pdh = c.pdnorm * Math.abs(c.h);
|
|
90
|
+
if ((pdh * rh1) > 0.00001)
|
|
91
|
+
rh1it = sm1[nqm1] / pdh;
|
|
92
|
+
rh1 = Math.min(rh1, rh1it);
|
|
93
|
+
const rh2 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
94
|
+
if ((rh1 * RATIO) < (5. * rh2))
|
|
95
|
+
return;
|
|
96
|
+
const alpha = Math.max(0.001, rh1);
|
|
97
|
+
dm1 *= Math.pow(alpha, exm1);
|
|
98
|
+
if (dm1 <= 1000. * ETA * pnorm)
|
|
99
|
+
return;
|
|
100
|
+
// Switch to Adams
|
|
101
|
+
out.rh = rh1;
|
|
102
|
+
c.icount = 20;
|
|
103
|
+
c.meth = 1;
|
|
104
|
+
c.miter = 0;
|
|
105
|
+
c.pdlast = 0.;
|
|
106
|
+
c.nq = nqm1;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=methodswitch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methodswitch.js","sourceRoot":"","sources":["methodswitch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {LsodaContext, ETA, RATIO, sm1, cm1, cm2} from './common';
|
|
14
|
+
import {vmnorm} from './blas';
|
|
15
|
+
|
|
16
|
+
/** Mutable rh output */
|
|
17
|
+
export interface MethodSwitchResult {
|
|
18
|
+
rh: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Consider switching between Adams (meth=1) and BDF (meth=2).
|
|
23
|
+
* Modifies ctx.common.meth, miter, nq, icount, pdlast on switch.
|
|
24
|
+
*/
|
|
25
|
+
export function methodswitch(
|
|
26
|
+
ctx: LsodaContext, dsm: number, pnorm: number, out: MethodSwitchResult,
|
|
27
|
+
): void {
|
|
28
|
+
const c = ctx.common!;
|
|
29
|
+
const neq = ctx.neq;
|
|
30
|
+
const mxordn = ctx.opt!.mxordn;
|
|
31
|
+
const mxords = ctx.opt!.mxords;
|
|
32
|
+
|
|
33
|
+
if (c.meth === 1) {
|
|
34
|
+
// Currently Adams, consider switching to BDF
|
|
35
|
+
if (c.nq > 5) return;
|
|
36
|
+
|
|
37
|
+
let rh2: number;
|
|
38
|
+
let nqm2: number;
|
|
39
|
+
|
|
40
|
+
if (dsm <= (100. * pnorm * ETA) || c.pdest === 0.) {
|
|
41
|
+
if (c.irflag === 0) return;
|
|
42
|
+
rh2 = 2.;
|
|
43
|
+
nqm2 = Math.min(c.nq, mxords);
|
|
44
|
+
} else {
|
|
45
|
+
const exsm = 1. / (c.nq + 1);
|
|
46
|
+
let rh1 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
47
|
+
let rh1it = 2. * rh1;
|
|
48
|
+
const pdh = c.pdlast * Math.abs(c.h);
|
|
49
|
+
if ((pdh * rh1) > 0.00001)
|
|
50
|
+
rh1it = sm1[c.nq] / pdh;
|
|
51
|
+
rh1 = Math.min(rh1, rh1it);
|
|
52
|
+
|
|
53
|
+
if (c.nq > mxords) {
|
|
54
|
+
nqm2 = mxords;
|
|
55
|
+
const lm2 = mxords + 1;
|
|
56
|
+
const exm2 = 1. / lm2;
|
|
57
|
+
const lm2p1 = lm2 + 1;
|
|
58
|
+
const dm2 = vmnorm(neq, c.yh[lm2p1], c.ewt) / cm2[mxords];
|
|
59
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exm2) + 0.0000012);
|
|
60
|
+
} else {
|
|
61
|
+
const dm2 = dsm * (cm1[c.nq] / cm2[c.nq]);
|
|
62
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exsm) + 0.0000012);
|
|
63
|
+
nqm2 = c.nq;
|
|
64
|
+
}
|
|
65
|
+
if (rh2 < RATIO * rh1) return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Switch to BDF
|
|
69
|
+
out.rh = rh2;
|
|
70
|
+
c.icount = 20;
|
|
71
|
+
c.meth = 2;
|
|
72
|
+
c.miter = 2;
|
|
73
|
+
c.pdlast = 0.;
|
|
74
|
+
c.nq = nqm2;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Currently BDF (meth=2), consider switching to Adams
|
|
79
|
+
const exsm = 1. / (c.nq + 1);
|
|
80
|
+
let nqm1: number;
|
|
81
|
+
let exm1: number;
|
|
82
|
+
let rh1: number;
|
|
83
|
+
let dm1: number;
|
|
84
|
+
|
|
85
|
+
if (mxordn < c.nq) {
|
|
86
|
+
nqm1 = mxordn;
|
|
87
|
+
const lm1 = mxordn + 1;
|
|
88
|
+
exm1 = 1. / lm1;
|
|
89
|
+
const lm1p1 = lm1 + 1;
|
|
90
|
+
dm1 = vmnorm(neq, c.yh[lm1p1], c.ewt) / cm1[mxordn];
|
|
91
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exm1) + 0.0000012);
|
|
92
|
+
} else {
|
|
93
|
+
dm1 = dsm * (cm2[c.nq] / cm1[c.nq]);
|
|
94
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exsm) + 0.0000012);
|
|
95
|
+
nqm1 = c.nq;
|
|
96
|
+
exm1 = exsm;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
let rh1it = 2. * rh1;
|
|
100
|
+
const pdh = c.pdnorm * Math.abs(c.h);
|
|
101
|
+
if ((pdh * rh1) > 0.00001)
|
|
102
|
+
rh1it = sm1[nqm1] / pdh;
|
|
103
|
+
rh1 = Math.min(rh1, rh1it);
|
|
104
|
+
|
|
105
|
+
const rh2 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
106
|
+
if ((rh1 * RATIO) < (5. * rh2)) return;
|
|
107
|
+
|
|
108
|
+
const alpha = Math.max(0.001, rh1);
|
|
109
|
+
dm1 *= Math.pow(alpha, exm1);
|
|
110
|
+
if (dm1 <= 1000. * ETA * pnorm) return;
|
|
111
|
+
|
|
112
|
+
// Switch to Adams
|
|
113
|
+
out.rh = rh1;
|
|
114
|
+
c.icount = 20;
|
|
115
|
+
c.meth = 1;
|
|
116
|
+
c.miter = 0;
|
|
117
|
+
c.pdlast = 0.;
|
|
118
|
+
c.nq = nqm1;
|
|
119
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
import { sm1 } from './common';
|
|
13
|
+
import { vmnorm } from './blas';
|
|
14
|
+
/**
|
|
15
|
+
* Decide whether to change the order and/or step size.
|
|
16
|
+
* Returns orderflag: 0 = no change, 1 = change h only, 2 = change both h and nq.
|
|
17
|
+
*/
|
|
18
|
+
export function orderswitch(ctx, rhup, dsm, out, kflag, maxord) {
|
|
19
|
+
const c = ctx.common;
|
|
20
|
+
const neq = ctx.neq;
|
|
21
|
+
const exsm = 1. / (c.nq + 1);
|
|
22
|
+
let rhsm = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
23
|
+
let rhdn = 0.;
|
|
24
|
+
if (c.nq !== 1) {
|
|
25
|
+
const ddn = vmnorm(neq, c.yh[c.nq + 1], c.ewt) / c.tesco[c.nq][1];
|
|
26
|
+
const exdn = 1. / c.nq;
|
|
27
|
+
rhdn = 1. / (1.3 * Math.pow(ddn, exdn) + 0.0000013);
|
|
28
|
+
}
|
|
29
|
+
// If meth = 1, limit rh according to stability region
|
|
30
|
+
if (c.meth === 1) {
|
|
31
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
32
|
+
if (c.nq + 1 < maxord + 1)
|
|
33
|
+
rhup = Math.min(rhup, sm1[c.nq + 1] / pdh);
|
|
34
|
+
rhsm = Math.min(rhsm, sm1[c.nq] / pdh);
|
|
35
|
+
if (c.nq > 1)
|
|
36
|
+
rhdn = Math.min(rhdn, sm1[c.nq - 1] / pdh);
|
|
37
|
+
c.pdest = 0.;
|
|
38
|
+
}
|
|
39
|
+
let newq;
|
|
40
|
+
if (rhsm >= rhup) {
|
|
41
|
+
if (rhsm >= rhdn) {
|
|
42
|
+
newq = c.nq;
|
|
43
|
+
out.rh = rhsm;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
newq = c.nq - 1;
|
|
47
|
+
out.rh = rhdn;
|
|
48
|
+
if (kflag < 0 && out.rh > 1.)
|
|
49
|
+
out.rh = 1.;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
if (rhup <= rhdn) {
|
|
54
|
+
newq = c.nq - 1;
|
|
55
|
+
out.rh = rhdn;
|
|
56
|
+
if (kflag < 0 && out.rh > 1.)
|
|
57
|
+
out.rh = 1.;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
out.rh = rhup;
|
|
61
|
+
if (out.rh >= 1.1) {
|
|
62
|
+
const r = c.el[c.nq + 1] / (c.nq + 1);
|
|
63
|
+
c.nq = c.nq + 1;
|
|
64
|
+
for (let i = 1; i <= neq; i++)
|
|
65
|
+
c.yh[c.nq + 1][i] = c.acor[i] * r;
|
|
66
|
+
return 2;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
c.ialth = 3;
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// If meth = 1 and h is restricted by stability, bypass 10% test
|
|
75
|
+
if (c.meth === 1) {
|
|
76
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
77
|
+
if (out.rh * pdh * 1.00001 < sm1[newq]) {
|
|
78
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
79
|
+
c.ialth = 3;
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
86
|
+
c.ialth = 3;
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (kflag <= -2)
|
|
91
|
+
out.rh = Math.min(out.rh, 0.2);
|
|
92
|
+
if (newq === c.nq)
|
|
93
|
+
return 1;
|
|
94
|
+
c.nq = newq;
|
|
95
|
+
return 2;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=orderswitch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderswitch.js","sourceRoot":"","sources":["orderswitch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {LsodaContext, sm1} from './common';
|
|
14
|
+
import {vmnorm} from './blas';
|
|
15
|
+
|
|
16
|
+
/** Mutable rh output */
|
|
17
|
+
export interface OrderSwitchResult {
|
|
18
|
+
rh: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Decide whether to change the order and/or step size.
|
|
23
|
+
* Returns orderflag: 0 = no change, 1 = change h only, 2 = change both h and nq.
|
|
24
|
+
*/
|
|
25
|
+
export function orderswitch(
|
|
26
|
+
ctx: LsodaContext, rhup: number, dsm: number,
|
|
27
|
+
out: OrderSwitchResult, kflag: number, maxord: number,
|
|
28
|
+
): number {
|
|
29
|
+
const c = ctx.common!;
|
|
30
|
+
const neq = ctx.neq;
|
|
31
|
+
|
|
32
|
+
const exsm = 1. / (c.nq + 1);
|
|
33
|
+
let rhsm = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
34
|
+
|
|
35
|
+
let rhdn = 0.;
|
|
36
|
+
if (c.nq !== 1) {
|
|
37
|
+
const ddn = vmnorm(neq, c.yh[c.nq + 1], c.ewt) / c.tesco[c.nq][1];
|
|
38
|
+
const exdn = 1. / c.nq;
|
|
39
|
+
rhdn = 1. / (1.3 * Math.pow(ddn, exdn) + 0.0000013);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// If meth = 1, limit rh according to stability region
|
|
43
|
+
if (c.meth === 1) {
|
|
44
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
45
|
+
if (c.nq + 1 < maxord + 1)
|
|
46
|
+
rhup = Math.min(rhup, sm1[c.nq + 1] / pdh);
|
|
47
|
+
rhsm = Math.min(rhsm, sm1[c.nq] / pdh);
|
|
48
|
+
if (c.nq > 1)
|
|
49
|
+
rhdn = Math.min(rhdn, sm1[c.nq - 1] / pdh);
|
|
50
|
+
c.pdest = 0.;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let newq: number;
|
|
54
|
+
if (rhsm >= rhup) {
|
|
55
|
+
if (rhsm >= rhdn) {
|
|
56
|
+
newq = c.nq;
|
|
57
|
+
out.rh = rhsm;
|
|
58
|
+
} else {
|
|
59
|
+
newq = c.nq - 1;
|
|
60
|
+
out.rh = rhdn;
|
|
61
|
+
if (kflag < 0 && out.rh > 1.) out.rh = 1.;
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
if (rhup <= rhdn) {
|
|
65
|
+
newq = c.nq - 1;
|
|
66
|
+
out.rh = rhdn;
|
|
67
|
+
if (kflag < 0 && out.rh > 1.) out.rh = 1.;
|
|
68
|
+
} else {
|
|
69
|
+
out.rh = rhup;
|
|
70
|
+
if (out.rh >= 1.1) {
|
|
71
|
+
const r = c.el[c.nq + 1] / (c.nq + 1);
|
|
72
|
+
c.nq = c.nq + 1;
|
|
73
|
+
for (let i = 1; i <= neq; i++)
|
|
74
|
+
c.yh[c.nq + 1][i] = c.acor[i] * r;
|
|
75
|
+
return 2;
|
|
76
|
+
} else {
|
|
77
|
+
c.ialth = 3;
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// If meth = 1 and h is restricted by stability, bypass 10% test
|
|
84
|
+
if (c.meth === 1) {
|
|
85
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
86
|
+
if (out.rh * pdh * 1.00001 < sm1[newq]) {
|
|
87
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
88
|
+
c.ialth = 3;
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
94
|
+
c.ialth = 3;
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (kflag <= -2)
|
|
100
|
+
out.rh = Math.min(out.rh, 0.2);
|
|
101
|
+
|
|
102
|
+
if (newq === c.nq)
|
|
103
|
+
return 1;
|
|
104
|
+
|
|
105
|
+
c.nq = newq;
|
|
106
|
+
return 2;
|
|
107
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
import { ETA, SQRTETA } from './common';
|
|
13
|
+
import { vmnorm, fnorm, dgefa } from './blas';
|
|
14
|
+
/**
|
|
15
|
+
* Compute and process the matrix P = I - h * el[1] * J,
|
|
16
|
+
* where J is approximated by finite differences.
|
|
17
|
+
* Returns 1 on success, 0 on failure (singular matrix).
|
|
18
|
+
*/
|
|
19
|
+
export function prja(ctx, y) {
|
|
20
|
+
const c = ctx.common;
|
|
21
|
+
const neq = ctx.neq;
|
|
22
|
+
c.nje++;
|
|
23
|
+
const hl0 = c.h * c.el[1];
|
|
24
|
+
if (c.miter !== 2) {
|
|
25
|
+
console.error('[prja] miter != 2');
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
let fac = vmnorm(neq, c.savf, c.ewt);
|
|
29
|
+
let r0 = 1000. * Math.abs(c.h) * ETA * neq * fac;
|
|
30
|
+
if (r0 === 0.)
|
|
31
|
+
r0 = 1.;
|
|
32
|
+
for (let j = 1; j <= neq; j++) {
|
|
33
|
+
const yj = y[j];
|
|
34
|
+
const r = Math.max(SQRTETA * Math.abs(yj), r0 / c.ewt[j]);
|
|
35
|
+
y[j] += r;
|
|
36
|
+
fac = -hl0 / r;
|
|
37
|
+
ctx.func(c.tn, y.subarray(1), c.acor.subarray(1), ctx.data);
|
|
38
|
+
for (let i = 1; i <= neq; i++)
|
|
39
|
+
c.wm[i][j] = (c.acor[i] - c.savf[i]) * fac;
|
|
40
|
+
y[j] = yj;
|
|
41
|
+
}
|
|
42
|
+
c.nfe += neq;
|
|
43
|
+
// Compute norm of Jacobian
|
|
44
|
+
c.pdnorm = fnorm(neq, c.wm, c.ewt) / Math.abs(hl0);
|
|
45
|
+
// Add identity matrix
|
|
46
|
+
for (let i = 1; i <= neq; i++)
|
|
47
|
+
c.wm[i][i] += 1.;
|
|
48
|
+
// LU decomposition on P
|
|
49
|
+
const ier = dgefa(c.wm, neq, c.ipvt);
|
|
50
|
+
if (ier !== 0)
|
|
51
|
+
return 0;
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=prja.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prja.js","sourceRoot":"","sources":["prja.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAe,GAAG,EAAE,OAAO,EAAC,MAAM,UAAU,CAAC;AACpD,OAAO,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,QAAQ,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,GAAiB,EAAE,CAAe;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAO,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAEpB,CAAC,CAAC,GAAG,EAAE,CAAC;IACR,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1B,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACjD,IAAI,EAAE,KAAK,EAAE;QAAE,EAAE,GAAG,EAAE,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACV,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;YAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IACD,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;IAEb,2BAA2B;IAC3B,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEnD,sBAAsB;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;QAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEnB,wBAAwB;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAExB,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {LsodaContext, ETA, SQRTETA} from './common';
|
|
14
|
+
import {vmnorm, fnorm, dgefa} from './blas';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Compute and process the matrix P = I - h * el[1] * J,
|
|
18
|
+
* where J is approximated by finite differences.
|
|
19
|
+
* Returns 1 on success, 0 on failure (singular matrix).
|
|
20
|
+
*/
|
|
21
|
+
export function prja(ctx: LsodaContext, y: Float64Array): number {
|
|
22
|
+
const c = ctx.common!;
|
|
23
|
+
const neq = ctx.neq;
|
|
24
|
+
|
|
25
|
+
c.nje++;
|
|
26
|
+
const hl0 = c.h * c.el[1];
|
|
27
|
+
|
|
28
|
+
if (c.miter !== 2) {
|
|
29
|
+
console.error('[prja] miter != 2');
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let fac = vmnorm(neq, c.savf, c.ewt);
|
|
34
|
+
let r0 = 1000. * Math.abs(c.h) * ETA * neq * fac;
|
|
35
|
+
if (r0 === 0.) r0 = 1.;
|
|
36
|
+
|
|
37
|
+
for (let j = 1; j <= neq; j++) {
|
|
38
|
+
const yj = y[j];
|
|
39
|
+
const r = Math.max(SQRTETA * Math.abs(yj), r0 / c.ewt[j]);
|
|
40
|
+
y[j] += r;
|
|
41
|
+
fac = -hl0 / r;
|
|
42
|
+
ctx.func(c.tn, y.subarray(1), c.acor.subarray(1), ctx.data);
|
|
43
|
+
for (let i = 1; i <= neq; i++)
|
|
44
|
+
c.wm[i][j] = (c.acor[i] - c.savf[i]) * fac;
|
|
45
|
+
y[j] = yj;
|
|
46
|
+
}
|
|
47
|
+
c.nfe += neq;
|
|
48
|
+
|
|
49
|
+
// Compute norm of Jacobian
|
|
50
|
+
c.pdnorm = fnorm(neq, c.wm, c.ewt) / Math.abs(hl0);
|
|
51
|
+
|
|
52
|
+
// Add identity matrix
|
|
53
|
+
for (let i = 1; i <= neq; i++)
|
|
54
|
+
c.wm[i][i] += 1.;
|
|
55
|
+
|
|
56
|
+
// LU decomposition on P
|
|
57
|
+
const ier = dgefa(c.wm, neq, c.ipvt);
|
|
58
|
+
if (ier !== 0) return 0;
|
|
59
|
+
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
import { sm1 } from './common';
|
|
13
|
+
/**
|
|
14
|
+
* Scale step size. Rescales the yh array when h changes.
|
|
15
|
+
*/
|
|
16
|
+
export function scaleh(ctx, rh) {
|
|
17
|
+
const c = ctx.common;
|
|
18
|
+
const neq = ctx.neq;
|
|
19
|
+
const hmxi = ctx.opt.hmxi;
|
|
20
|
+
rh = Math.min(rh, c.rmax);
|
|
21
|
+
rh = rh / Math.max(1., Math.abs(c.h) * hmxi * rh);
|
|
22
|
+
// If meth = 1, restrict by stability region
|
|
23
|
+
if (c.meth === 1) {
|
|
24
|
+
c.irflag = 0;
|
|
25
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
26
|
+
if ((rh * pdh * 1.00001) >= sm1[c.nq]) {
|
|
27
|
+
rh = sm1[c.nq] / pdh;
|
|
28
|
+
c.irflag = 1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let r = 1.;
|
|
32
|
+
for (let j = 2; j <= c.nq + 1; j++) {
|
|
33
|
+
r *= rh;
|
|
34
|
+
for (let i = 1; i <= neq; i++)
|
|
35
|
+
c.yh[j][i] *= r;
|
|
36
|
+
}
|
|
37
|
+
c.h *= rh;
|
|
38
|
+
c.rc *= rh;
|
|
39
|
+
c.ialth = c.nq + 1;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=scaleh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleh.js","sourceRoot":"","sources":["scaleh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAe,GAAG,EAAC,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,GAAiB,EAAE,EAAU;IAClD,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,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1B,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAElD,4CAA4C;IAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACrB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,CAAC,IAAI,EAAE,CAAC;QACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;YAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACV,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACX,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
|
|
3
|
+
* Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
|
|
6
|
+
* Copyright (c) 2016 Simon Frost
|
|
7
|
+
* Copyright (c) 2026 Datagrok
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
|
|
10
|
+
* license text and provenance chain of the original code.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {LsodaContext, sm1} from './common';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Scale step size. Rescales the yh array when h changes.
|
|
17
|
+
*/
|
|
18
|
+
export function scaleh(ctx: LsodaContext, rh: number): void {
|
|
19
|
+
const c = ctx.common!;
|
|
20
|
+
const neq = ctx.neq;
|
|
21
|
+
const hmxi = ctx.opt!.hmxi;
|
|
22
|
+
|
|
23
|
+
rh = Math.min(rh, c.rmax);
|
|
24
|
+
rh = rh / Math.max(1., Math.abs(c.h) * hmxi * rh);
|
|
25
|
+
|
|
26
|
+
// If meth = 1, restrict by stability region
|
|
27
|
+
if (c.meth === 1) {
|
|
28
|
+
c.irflag = 0;
|
|
29
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
30
|
+
if ((rh * pdh * 1.00001) >= sm1[c.nq]) {
|
|
31
|
+
rh = sm1[c.nq] / pdh;
|
|
32
|
+
c.irflag = 1;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let r = 1.;
|
|
37
|
+
for (let j = 2; j <= c.nq + 1; j++) {
|
|
38
|
+
r *= rh;
|
|
39
|
+
for (let i = 1; i <= neq; i++)
|
|
40
|
+
c.yh[j][i] *= r;
|
|
41
|
+
}
|
|
42
|
+
c.h *= rh;
|
|
43
|
+
c.rc *= rh;
|
|
44
|
+
c.ialth = c.nq + 1;
|
|
45
|
+
}
|