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,97 @@
|
|
|
1
|
+
import { ETA, RATIO, sm1, cm1, cm2 } from './common';
|
|
2
|
+
import { vmnorm } from './blas';
|
|
3
|
+
/**
|
|
4
|
+
* Consider switching between Adams (meth=1) and BDF (meth=2).
|
|
5
|
+
* Modifies ctx.common.meth, miter, nq, icount, pdlast on switch.
|
|
6
|
+
*/
|
|
7
|
+
export function methodswitch(ctx, dsm, pnorm, out) {
|
|
8
|
+
const c = ctx.common;
|
|
9
|
+
const neq = ctx.neq;
|
|
10
|
+
const mxordn = ctx.opt.mxordn;
|
|
11
|
+
const mxords = ctx.opt.mxords;
|
|
12
|
+
if (c.meth === 1) {
|
|
13
|
+
// Currently Adams, consider switching to BDF
|
|
14
|
+
if (c.nq > 5)
|
|
15
|
+
return;
|
|
16
|
+
let rh2;
|
|
17
|
+
let nqm2;
|
|
18
|
+
if (dsm <= (100. * pnorm * ETA) || c.pdest === 0.) {
|
|
19
|
+
if (c.irflag === 0)
|
|
20
|
+
return;
|
|
21
|
+
rh2 = 2.;
|
|
22
|
+
nqm2 = Math.min(c.nq, mxords);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
const exsm = 1. / (c.nq + 1);
|
|
26
|
+
let rh1 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
27
|
+
let rh1it = 2. * rh1;
|
|
28
|
+
const pdh = c.pdlast * Math.abs(c.h);
|
|
29
|
+
if ((pdh * rh1) > 0.00001)
|
|
30
|
+
rh1it = sm1[c.nq] / pdh;
|
|
31
|
+
rh1 = Math.min(rh1, rh1it);
|
|
32
|
+
if (c.nq > mxords) {
|
|
33
|
+
nqm2 = mxords;
|
|
34
|
+
const lm2 = mxords + 1;
|
|
35
|
+
const exm2 = 1. / lm2;
|
|
36
|
+
const lm2p1 = lm2 + 1;
|
|
37
|
+
const dm2 = vmnorm(neq, c.yh[lm2p1], c.ewt) / cm2[mxords];
|
|
38
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exm2) + 0.0000012);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const dm2 = dsm * (cm1[c.nq] / cm2[c.nq]);
|
|
42
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exsm) + 0.0000012);
|
|
43
|
+
nqm2 = c.nq;
|
|
44
|
+
}
|
|
45
|
+
if (rh2 < RATIO * rh1)
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Switch to BDF
|
|
49
|
+
out.rh = rh2;
|
|
50
|
+
c.icount = 20;
|
|
51
|
+
c.meth = 2;
|
|
52
|
+
c.miter = 2;
|
|
53
|
+
c.pdlast = 0.;
|
|
54
|
+
c.nq = nqm2;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Currently BDF (meth=2), consider switching to Adams
|
|
58
|
+
const exsm = 1. / (c.nq + 1);
|
|
59
|
+
let nqm1;
|
|
60
|
+
let exm1;
|
|
61
|
+
let rh1;
|
|
62
|
+
let dm1;
|
|
63
|
+
if (mxordn < c.nq) {
|
|
64
|
+
nqm1 = mxordn;
|
|
65
|
+
const lm1 = mxordn + 1;
|
|
66
|
+
exm1 = 1. / lm1;
|
|
67
|
+
const lm1p1 = lm1 + 1;
|
|
68
|
+
dm1 = vmnorm(neq, c.yh[lm1p1], c.ewt) / cm1[mxordn];
|
|
69
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exm1) + 0.0000012);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
dm1 = dsm * (cm2[c.nq] / cm1[c.nq]);
|
|
73
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exsm) + 0.0000012);
|
|
74
|
+
nqm1 = c.nq;
|
|
75
|
+
exm1 = exsm;
|
|
76
|
+
}
|
|
77
|
+
let rh1it = 2. * rh1;
|
|
78
|
+
const pdh = c.pdnorm * Math.abs(c.h);
|
|
79
|
+
if ((pdh * rh1) > 0.00001)
|
|
80
|
+
rh1it = sm1[nqm1] / pdh;
|
|
81
|
+
rh1 = Math.min(rh1, rh1it);
|
|
82
|
+
const rh2 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
83
|
+
if ((rh1 * RATIO) < (5. * rh2))
|
|
84
|
+
return;
|
|
85
|
+
const alpha = Math.max(0.001, rh1);
|
|
86
|
+
dm1 *= Math.pow(alpha, exm1);
|
|
87
|
+
if (dm1 <= 1000. * ETA * pnorm)
|
|
88
|
+
return;
|
|
89
|
+
// Switch to Adams
|
|
90
|
+
out.rh = rh1;
|
|
91
|
+
c.icount = 20;
|
|
92
|
+
c.meth = 1;
|
|
93
|
+
c.miter = 0;
|
|
94
|
+
c.pdlast = 0.;
|
|
95
|
+
c.nq = nqm1;
|
|
96
|
+
}
|
|
97
|
+
//# 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,107 @@
|
|
|
1
|
+
import {LsodaContext, ETA, RATIO, sm1, cm1, cm2} from './common';
|
|
2
|
+
import {vmnorm} from './blas';
|
|
3
|
+
|
|
4
|
+
/** Mutable rh output */
|
|
5
|
+
export interface MethodSwitchResult {
|
|
6
|
+
rh: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Consider switching between Adams (meth=1) and BDF (meth=2).
|
|
11
|
+
* Modifies ctx.common.meth, miter, nq, icount, pdlast on switch.
|
|
12
|
+
*/
|
|
13
|
+
export function methodswitch(
|
|
14
|
+
ctx: LsodaContext, dsm: number, pnorm: number, out: MethodSwitchResult,
|
|
15
|
+
): void {
|
|
16
|
+
const c = ctx.common!;
|
|
17
|
+
const neq = ctx.neq;
|
|
18
|
+
const mxordn = ctx.opt!.mxordn;
|
|
19
|
+
const mxords = ctx.opt!.mxords;
|
|
20
|
+
|
|
21
|
+
if (c.meth === 1) {
|
|
22
|
+
// Currently Adams, consider switching to BDF
|
|
23
|
+
if (c.nq > 5) return;
|
|
24
|
+
|
|
25
|
+
let rh2: number;
|
|
26
|
+
let nqm2: number;
|
|
27
|
+
|
|
28
|
+
if (dsm <= (100. * pnorm * ETA) || c.pdest === 0.) {
|
|
29
|
+
if (c.irflag === 0) return;
|
|
30
|
+
rh2 = 2.;
|
|
31
|
+
nqm2 = Math.min(c.nq, mxords);
|
|
32
|
+
} else {
|
|
33
|
+
const exsm = 1. / (c.nq + 1);
|
|
34
|
+
let rh1 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
35
|
+
let rh1it = 2. * rh1;
|
|
36
|
+
const pdh = c.pdlast * Math.abs(c.h);
|
|
37
|
+
if ((pdh * rh1) > 0.00001)
|
|
38
|
+
rh1it = sm1[c.nq] / pdh;
|
|
39
|
+
rh1 = Math.min(rh1, rh1it);
|
|
40
|
+
|
|
41
|
+
if (c.nq > mxords) {
|
|
42
|
+
nqm2 = mxords;
|
|
43
|
+
const lm2 = mxords + 1;
|
|
44
|
+
const exm2 = 1. / lm2;
|
|
45
|
+
const lm2p1 = lm2 + 1;
|
|
46
|
+
const dm2 = vmnorm(neq, c.yh[lm2p1], c.ewt) / cm2[mxords];
|
|
47
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exm2) + 0.0000012);
|
|
48
|
+
} else {
|
|
49
|
+
const dm2 = dsm * (cm1[c.nq] / cm2[c.nq]);
|
|
50
|
+
rh2 = 1. / (1.2 * Math.pow(dm2, exsm) + 0.0000012);
|
|
51
|
+
nqm2 = c.nq;
|
|
52
|
+
}
|
|
53
|
+
if (rh2 < RATIO * rh1) return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Switch to BDF
|
|
57
|
+
out.rh = rh2;
|
|
58
|
+
c.icount = 20;
|
|
59
|
+
c.meth = 2;
|
|
60
|
+
c.miter = 2;
|
|
61
|
+
c.pdlast = 0.;
|
|
62
|
+
c.nq = nqm2;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Currently BDF (meth=2), consider switching to Adams
|
|
67
|
+
const exsm = 1. / (c.nq + 1);
|
|
68
|
+
let nqm1: number;
|
|
69
|
+
let exm1: number;
|
|
70
|
+
let rh1: number;
|
|
71
|
+
let dm1: number;
|
|
72
|
+
|
|
73
|
+
if (mxordn < c.nq) {
|
|
74
|
+
nqm1 = mxordn;
|
|
75
|
+
const lm1 = mxordn + 1;
|
|
76
|
+
exm1 = 1. / lm1;
|
|
77
|
+
const lm1p1 = lm1 + 1;
|
|
78
|
+
dm1 = vmnorm(neq, c.yh[lm1p1], c.ewt) / cm1[mxordn];
|
|
79
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exm1) + 0.0000012);
|
|
80
|
+
} else {
|
|
81
|
+
dm1 = dsm * (cm2[c.nq] / cm1[c.nq]);
|
|
82
|
+
rh1 = 1. / (1.2 * Math.pow(dm1, exsm) + 0.0000012);
|
|
83
|
+
nqm1 = c.nq;
|
|
84
|
+
exm1 = exsm;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let rh1it = 2. * rh1;
|
|
88
|
+
const pdh = c.pdnorm * Math.abs(c.h);
|
|
89
|
+
if ((pdh * rh1) > 0.00001)
|
|
90
|
+
rh1it = sm1[nqm1] / pdh;
|
|
91
|
+
rh1 = Math.min(rh1, rh1it);
|
|
92
|
+
|
|
93
|
+
const rh2 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
94
|
+
if ((rh1 * RATIO) < (5. * rh2)) return;
|
|
95
|
+
|
|
96
|
+
const alpha = Math.max(0.001, rh1);
|
|
97
|
+
dm1 *= Math.pow(alpha, exm1);
|
|
98
|
+
if (dm1 <= 1000. * ETA * pnorm) return;
|
|
99
|
+
|
|
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
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { sm1 } from './common';
|
|
2
|
+
import { vmnorm } from './blas';
|
|
3
|
+
/**
|
|
4
|
+
* Decide whether to change the order and/or step size.
|
|
5
|
+
* Returns orderflag: 0 = no change, 1 = change h only, 2 = change both h and nq.
|
|
6
|
+
*/
|
|
7
|
+
export function orderswitch(ctx, rhup, dsm, out, kflag, maxord) {
|
|
8
|
+
const c = ctx.common;
|
|
9
|
+
const neq = ctx.neq;
|
|
10
|
+
const exsm = 1. / (c.nq + 1);
|
|
11
|
+
let rhsm = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
12
|
+
let rhdn = 0.;
|
|
13
|
+
if (c.nq !== 1) {
|
|
14
|
+
const ddn = vmnorm(neq, c.yh[c.nq + 1], c.ewt) / c.tesco[c.nq][1];
|
|
15
|
+
const exdn = 1. / c.nq;
|
|
16
|
+
rhdn = 1. / (1.3 * Math.pow(ddn, exdn) + 0.0000013);
|
|
17
|
+
}
|
|
18
|
+
// If meth = 1, limit rh according to stability region
|
|
19
|
+
if (c.meth === 1) {
|
|
20
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
21
|
+
if (c.nq + 1 < maxord + 1)
|
|
22
|
+
rhup = Math.min(rhup, sm1[c.nq + 1] / pdh);
|
|
23
|
+
rhsm = Math.min(rhsm, sm1[c.nq] / pdh);
|
|
24
|
+
if (c.nq > 1)
|
|
25
|
+
rhdn = Math.min(rhdn, sm1[c.nq - 1] / pdh);
|
|
26
|
+
c.pdest = 0.;
|
|
27
|
+
}
|
|
28
|
+
let newq;
|
|
29
|
+
if (rhsm >= rhup) {
|
|
30
|
+
if (rhsm >= rhdn) {
|
|
31
|
+
newq = c.nq;
|
|
32
|
+
out.rh = rhsm;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
newq = c.nq - 1;
|
|
36
|
+
out.rh = rhdn;
|
|
37
|
+
if (kflag < 0 && out.rh > 1.)
|
|
38
|
+
out.rh = 1.;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (rhup <= rhdn) {
|
|
43
|
+
newq = c.nq - 1;
|
|
44
|
+
out.rh = rhdn;
|
|
45
|
+
if (kflag < 0 && out.rh > 1.)
|
|
46
|
+
out.rh = 1.;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
out.rh = rhup;
|
|
50
|
+
if (out.rh >= 1.1) {
|
|
51
|
+
const r = c.el[c.nq + 1] / (c.nq + 1);
|
|
52
|
+
c.nq = c.nq + 1;
|
|
53
|
+
for (let i = 1; i <= neq; i++)
|
|
54
|
+
c.yh[c.nq + 1][i] = c.acor[i] * r;
|
|
55
|
+
return 2;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
c.ialth = 3;
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// If meth = 1 and h is restricted by stability, bypass 10% test
|
|
64
|
+
if (c.meth === 1) {
|
|
65
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
66
|
+
if (out.rh * pdh * 1.00001 < sm1[newq]) {
|
|
67
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
68
|
+
c.ialth = 3;
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
75
|
+
c.ialth = 3;
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (kflag <= -2)
|
|
80
|
+
out.rh = Math.min(out.rh, 0.2);
|
|
81
|
+
if (newq === c.nq)
|
|
82
|
+
return 1;
|
|
83
|
+
c.nq = newq;
|
|
84
|
+
return 2;
|
|
85
|
+
}
|
|
86
|
+
//# 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,95 @@
|
|
|
1
|
+
import {LsodaContext, sm1} from './common';
|
|
2
|
+
import {vmnorm} from './blas';
|
|
3
|
+
|
|
4
|
+
/** Mutable rh output */
|
|
5
|
+
export interface OrderSwitchResult {
|
|
6
|
+
rh: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Decide whether to change the order and/or step size.
|
|
11
|
+
* Returns orderflag: 0 = no change, 1 = change h only, 2 = change both h and nq.
|
|
12
|
+
*/
|
|
13
|
+
export function orderswitch(
|
|
14
|
+
ctx: LsodaContext, rhup: number, dsm: number,
|
|
15
|
+
out: OrderSwitchResult, kflag: number, maxord: number,
|
|
16
|
+
): number {
|
|
17
|
+
const c = ctx.common!;
|
|
18
|
+
const neq = ctx.neq;
|
|
19
|
+
|
|
20
|
+
const exsm = 1. / (c.nq + 1);
|
|
21
|
+
let rhsm = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
|
|
22
|
+
|
|
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
|
+
|
|
30
|
+
// If meth = 1, limit rh according to stability region
|
|
31
|
+
if (c.meth === 1) {
|
|
32
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
33
|
+
if (c.nq + 1 < maxord + 1)
|
|
34
|
+
rhup = Math.min(rhup, sm1[c.nq + 1] / pdh);
|
|
35
|
+
rhsm = Math.min(rhsm, sm1[c.nq] / pdh);
|
|
36
|
+
if (c.nq > 1)
|
|
37
|
+
rhdn = Math.min(rhdn, sm1[c.nq - 1] / pdh);
|
|
38
|
+
c.pdest = 0.;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let newq: number;
|
|
42
|
+
if (rhsm >= rhup) {
|
|
43
|
+
if (rhsm >= rhdn) {
|
|
44
|
+
newq = c.nq;
|
|
45
|
+
out.rh = rhsm;
|
|
46
|
+
} else {
|
|
47
|
+
newq = c.nq - 1;
|
|
48
|
+
out.rh = rhdn;
|
|
49
|
+
if (kflag < 0 && out.rh > 1.) out.rh = 1.;
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
if (rhup <= rhdn) {
|
|
53
|
+
newq = c.nq - 1;
|
|
54
|
+
out.rh = rhdn;
|
|
55
|
+
if (kflag < 0 && out.rh > 1.) out.rh = 1.;
|
|
56
|
+
} else {
|
|
57
|
+
out.rh = rhup;
|
|
58
|
+
if (out.rh >= 1.1) {
|
|
59
|
+
const r = c.el[c.nq + 1] / (c.nq + 1);
|
|
60
|
+
c.nq = c.nq + 1;
|
|
61
|
+
for (let i = 1; i <= neq; i++)
|
|
62
|
+
c.yh[c.nq + 1][i] = c.acor[i] * r;
|
|
63
|
+
return 2;
|
|
64
|
+
} else {
|
|
65
|
+
c.ialth = 3;
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// If meth = 1 and h is restricted by stability, bypass 10% test
|
|
72
|
+
if (c.meth === 1) {
|
|
73
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
74
|
+
if (out.rh * pdh * 1.00001 < sm1[newq]) {
|
|
75
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
76
|
+
c.ialth = 3;
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
if (kflag === 0 && out.rh < 1.1) {
|
|
82
|
+
c.ialth = 3;
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (kflag <= -2)
|
|
88
|
+
out.rh = Math.min(out.rh, 0.2);
|
|
89
|
+
|
|
90
|
+
if (newq === c.nq)
|
|
91
|
+
return 1;
|
|
92
|
+
|
|
93
|
+
c.nq = newq;
|
|
94
|
+
return 2;
|
|
95
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ETA, SQRTETA } from './common';
|
|
2
|
+
import { vmnorm, fnorm, dgefa } from './blas';
|
|
3
|
+
/**
|
|
4
|
+
* Compute and process the matrix P = I - h * el[1] * J,
|
|
5
|
+
* where J is approximated by finite differences.
|
|
6
|
+
* Returns 1 on success, 0 on failure (singular matrix).
|
|
7
|
+
*/
|
|
8
|
+
export function prja(ctx, y) {
|
|
9
|
+
const c = ctx.common;
|
|
10
|
+
const neq = ctx.neq;
|
|
11
|
+
c.nje++;
|
|
12
|
+
const hl0 = c.h * c.el[1];
|
|
13
|
+
if (c.miter !== 2) {
|
|
14
|
+
console.error('[prja] miter != 2');
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
let fac = vmnorm(neq, c.savf, c.ewt);
|
|
18
|
+
let r0 = 1000. * Math.abs(c.h) * ETA * neq * fac;
|
|
19
|
+
if (r0 === 0.)
|
|
20
|
+
r0 = 1.;
|
|
21
|
+
for (let j = 1; j <= neq; j++) {
|
|
22
|
+
const yj = y[j];
|
|
23
|
+
const r = Math.max(SQRTETA * Math.abs(yj), r0 / c.ewt[j]);
|
|
24
|
+
y[j] += r;
|
|
25
|
+
fac = -hl0 / r;
|
|
26
|
+
ctx.func(c.tn, y.subarray(1), c.acor.subarray(1), ctx.data);
|
|
27
|
+
for (let i = 1; i <= neq; i++)
|
|
28
|
+
c.wm[i][j] = (c.acor[i] - c.savf[i]) * fac;
|
|
29
|
+
y[j] = yj;
|
|
30
|
+
}
|
|
31
|
+
c.nfe += neq;
|
|
32
|
+
// Compute norm of Jacobian
|
|
33
|
+
c.pdnorm = fnorm(neq, c.wm, c.ewt) / Math.abs(hl0);
|
|
34
|
+
// Add identity matrix
|
|
35
|
+
for (let i = 1; i <= neq; i++)
|
|
36
|
+
c.wm[i][i] += 1.;
|
|
37
|
+
// LU decomposition on P
|
|
38
|
+
const ier = dgefa(c.wm, neq, c.ipvt);
|
|
39
|
+
if (ier !== 0)
|
|
40
|
+
return 0;
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=prja.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prja.js","sourceRoot":"","sources":["prja.ts"],"names":[],"mappings":"AAAA,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,49 @@
|
|
|
1
|
+
import {LsodaContext, ETA, SQRTETA} from './common';
|
|
2
|
+
import {vmnorm, fnorm, dgefa} from './blas';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Compute and process the matrix P = I - h * el[1] * J,
|
|
6
|
+
* where J is approximated by finite differences.
|
|
7
|
+
* Returns 1 on success, 0 on failure (singular matrix).
|
|
8
|
+
*/
|
|
9
|
+
export function prja(ctx: LsodaContext, y: Float64Array): number {
|
|
10
|
+
const c = ctx.common!;
|
|
11
|
+
const neq = ctx.neq;
|
|
12
|
+
|
|
13
|
+
c.nje++;
|
|
14
|
+
const hl0 = c.h * c.el[1];
|
|
15
|
+
|
|
16
|
+
if (c.miter !== 2) {
|
|
17
|
+
console.error('[prja] miter != 2');
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let fac = vmnorm(neq, c.savf, c.ewt);
|
|
22
|
+
let r0 = 1000. * Math.abs(c.h) * ETA * neq * fac;
|
|
23
|
+
if (r0 === 0.) r0 = 1.;
|
|
24
|
+
|
|
25
|
+
for (let j = 1; j <= neq; j++) {
|
|
26
|
+
const yj = y[j];
|
|
27
|
+
const r = Math.max(SQRTETA * Math.abs(yj), r0 / c.ewt[j]);
|
|
28
|
+
y[j] += r;
|
|
29
|
+
fac = -hl0 / r;
|
|
30
|
+
ctx.func(c.tn, y.subarray(1), c.acor.subarray(1), ctx.data);
|
|
31
|
+
for (let i = 1; i <= neq; i++)
|
|
32
|
+
c.wm[i][j] = (c.acor[i] - c.savf[i]) * fac;
|
|
33
|
+
y[j] = yj;
|
|
34
|
+
}
|
|
35
|
+
c.nfe += neq;
|
|
36
|
+
|
|
37
|
+
// Compute norm of Jacobian
|
|
38
|
+
c.pdnorm = fnorm(neq, c.wm, c.ewt) / Math.abs(hl0);
|
|
39
|
+
|
|
40
|
+
// Add identity matrix
|
|
41
|
+
for (let i = 1; i <= neq; i++)
|
|
42
|
+
c.wm[i][i] += 1.;
|
|
43
|
+
|
|
44
|
+
// LU decomposition on P
|
|
45
|
+
const ier = dgefa(c.wm, neq, c.ipvt);
|
|
46
|
+
if (ier !== 0) return 0;
|
|
47
|
+
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { sm1 } from './common';
|
|
2
|
+
/**
|
|
3
|
+
* Scale step size. Rescales the yh array when h changes.
|
|
4
|
+
*/
|
|
5
|
+
export function scaleh(ctx, rh) {
|
|
6
|
+
const c = ctx.common;
|
|
7
|
+
const neq = ctx.neq;
|
|
8
|
+
const hmxi = ctx.opt.hmxi;
|
|
9
|
+
rh = Math.min(rh, c.rmax);
|
|
10
|
+
rh = rh / Math.max(1., Math.abs(c.h) * hmxi * rh);
|
|
11
|
+
// If meth = 1, restrict by stability region
|
|
12
|
+
if (c.meth === 1) {
|
|
13
|
+
c.irflag = 0;
|
|
14
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
15
|
+
if ((rh * pdh * 1.00001) >= sm1[c.nq]) {
|
|
16
|
+
rh = sm1[c.nq] / pdh;
|
|
17
|
+
c.irflag = 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
let r = 1.;
|
|
21
|
+
for (let j = 2; j <= c.nq + 1; j++) {
|
|
22
|
+
r *= rh;
|
|
23
|
+
for (let i = 1; i <= neq; i++)
|
|
24
|
+
c.yh[j][i] *= r;
|
|
25
|
+
}
|
|
26
|
+
c.h *= rh;
|
|
27
|
+
c.rc *= rh;
|
|
28
|
+
c.ialth = c.nq + 1;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=scaleh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleh.js","sourceRoot":"","sources":["scaleh.ts"],"names":[],"mappings":"AAAA,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,33 @@
|
|
|
1
|
+
import {LsodaContext, sm1} from './common';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Scale step size. Rescales the yh array when h changes.
|
|
5
|
+
*/
|
|
6
|
+
export function scaleh(ctx: LsodaContext, rh: number): void {
|
|
7
|
+
const c = ctx.common!;
|
|
8
|
+
const neq = ctx.neq;
|
|
9
|
+
const hmxi = ctx.opt!.hmxi;
|
|
10
|
+
|
|
11
|
+
rh = Math.min(rh, c.rmax);
|
|
12
|
+
rh = rh / Math.max(1., Math.abs(c.h) * hmxi * rh);
|
|
13
|
+
|
|
14
|
+
// If meth = 1, restrict by stability region
|
|
15
|
+
if (c.meth === 1) {
|
|
16
|
+
c.irflag = 0;
|
|
17
|
+
const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
|
|
18
|
+
if ((rh * pdh * 1.00001) >= sm1[c.nq]) {
|
|
19
|
+
rh = sm1[c.nq] / pdh;
|
|
20
|
+
c.irflag = 1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let r = 1.;
|
|
25
|
+
for (let j = 2; j <= c.nq + 1; j++) {
|
|
26
|
+
r *= rh;
|
|
27
|
+
for (let i = 1; i <= neq; i++)
|
|
28
|
+
c.yh[j][i] *= r;
|
|
29
|
+
}
|
|
30
|
+
c.h *= rh;
|
|
31
|
+
c.rc *= rh;
|
|
32
|
+
c.ialth = c.nq + 1;
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { dgesl } from './blas';
|
|
2
|
+
/**
|
|
3
|
+
* Solve the linear system arising from a chord iteration.
|
|
4
|
+
* Only miter=2 (dense) is supported.
|
|
5
|
+
*/
|
|
6
|
+
export function solsy(ctx, y) {
|
|
7
|
+
const c = ctx.common;
|
|
8
|
+
const neq = ctx.neq;
|
|
9
|
+
if (c.miter !== 2)
|
|
10
|
+
throw new Error('[solsy] miter != 2 not implemented');
|
|
11
|
+
dgesl(c.wm, neq, c.ipvt, y, 0);
|
|
12
|
+
return 1;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=solsy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solsy.js","sourceRoot":"","sources":["solsy.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,QAAQ,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,GAAiB,EAAE,CAAe;IACtD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAO,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAEpB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAGxD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {LsodaContext} from './common';
|
|
2
|
+
import {dgesl} from './blas';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Solve the linear system arising from a chord iteration.
|
|
6
|
+
* Only miter=2 (dense) is supported.
|
|
7
|
+
*/
|
|
8
|
+
export function solsy(ctx: LsodaContext, y: Float64Array): number {
|
|
9
|
+
const c = ctx.common!;
|
|
10
|
+
const neq = ctx.neq;
|
|
11
|
+
|
|
12
|
+
if (c.miter !== 2)
|
|
13
|
+
throw new Error('[solsy] miter != 2 not implemented');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
dgesl(c.wm, neq, c.ipvt, y, 0);
|
|
17
|
+
return 1;
|
|
18
|
+
}
|