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 @@
|
|
|
1
|
+
{"version":3,"file":"cvode_nls.js","sourceRoot":"","sources":["cvode_nls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of SUNDIALS CVODE v7.5.0 (https://github.com/LLNL/sundials)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025, Lawrence Livermore National Security, University of
|
|
5
|
+
* Maryland Baltimore County, and the SUNDIALS contributors.
|
|
6
|
+
* Copyright (c) 2013-2025, Lawrence Livermore National Security and
|
|
7
|
+
* Southern Methodist University.
|
|
8
|
+
* Copyright (c) 2002-2013, Lawrence Livermore National Security.
|
|
9
|
+
* Copyright (c) 2026 Datagrok.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the BSD-3-Clause License. See THIRD_PARTY_LICENSES
|
|
12
|
+
* for the full license text and provenance chain of the original code.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {CvodeMem, wrmsNorm, vLinearSum, vScale, vConst,
|
|
16
|
+
CV_SUCCESS, CV_BDF, CV_ADAMS, CV_RHSFUNC_FAIL, CV_LSETUP_FAIL, CV_LSOLVE_FAIL,
|
|
17
|
+
RHSFUNC_RECVR, SUN_NLS_CONV_RECVR, SUN_NLS_CONTINUE,
|
|
18
|
+
CV_NO_FAILURES, CV_FAIL_BAD_J, CV_FAIL_OTHER,
|
|
19
|
+
FIRST_CALL, PREV_CONV_FAIL, PREV_ERR_FAIL, DO_ERROR_TEST,
|
|
20
|
+
NLS_MAXCOR, CRDOWN, RDIV, ONEPSM} from './common';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* cvNls - Solve the nonlinear system for one step.
|
|
24
|
+
*
|
|
25
|
+
* For BDF: Newton iteration solving G(ycor) = 0 where
|
|
26
|
+
* G(ycor) = rl1*zn[1] + ycor - gamma*f(tn, zn[0]+ycor)
|
|
27
|
+
* The Newton update is: (I - gamma*J) * delta = -G(ycor)
|
|
28
|
+
*
|
|
29
|
+
* For Adams: Fixed-point iteration
|
|
30
|
+
* ycor_new = h * rl1 * f(tn, zn[0]+ycor) - rl1*zn[1]
|
|
31
|
+
*/
|
|
32
|
+
export function cvNls(mem: CvodeMem, nflag: number): number {
|
|
33
|
+
const N = mem.cv_N;
|
|
34
|
+
let callSetup: boolean;
|
|
35
|
+
|
|
36
|
+
// Decide whether to call linear solver setup
|
|
37
|
+
if (mem.cv_lsetup) {
|
|
38
|
+
mem.convfail = (nflag === FIRST_CALL || nflag === PREV_ERR_FAIL) ?
|
|
39
|
+
CV_NO_FAILURES :
|
|
40
|
+
CV_FAIL_OTHER;
|
|
41
|
+
|
|
42
|
+
callSetup = (nflag === PREV_CONV_FAIL) || (nflag === PREV_ERR_FAIL) ||
|
|
43
|
+
(mem.cv_nst === 0) || (mem.first_step_after_resize) ||
|
|
44
|
+
(mem.cv_nst >= mem.cv_nstlp + mem.cv_msbp) ||
|
|
45
|
+
(Math.abs(mem.cv_gamrat - 1.0) > mem.cv_dgmax_lsetup);
|
|
46
|
+
} else {
|
|
47
|
+
mem.cv_crate = 1.0;
|
|
48
|
+
callSetup = false;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Initial guess for correction: acor = 0
|
|
52
|
+
vConst(0.0, mem.cv_acor, N);
|
|
53
|
+
|
|
54
|
+
// Set acnrmcur to false
|
|
55
|
+
mem.cv_acnrmcur = false;
|
|
56
|
+
|
|
57
|
+
// Dispatch to Newton or fixed-point
|
|
58
|
+
let flag: number;
|
|
59
|
+
if (mem.cv_lmm === CV_BDF)
|
|
60
|
+
flag = cvNewtonIteration(mem, callSetup);
|
|
61
|
+
else
|
|
62
|
+
flag = cvFixedPointIteration(mem);
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
if (flag !== CV_SUCCESS) return flag;
|
|
66
|
+
|
|
67
|
+
// Solve successful - update y = zn[0] + acor
|
|
68
|
+
vLinearSum(1.0, mem.cv_zn[0], 1.0, mem.cv_acor, mem.cv_y, N);
|
|
69
|
+
|
|
70
|
+
// Compute acnrm if not already done
|
|
71
|
+
if (!mem.cv_acnrmcur)
|
|
72
|
+
mem.cv_acnrm = wrmsNorm(N, mem.cv_acor, mem.cv_ewt);
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
// Update Jacobian status
|
|
76
|
+
mem.cv_jcur = false;
|
|
77
|
+
|
|
78
|
+
return CV_SUCCESS;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Newton iteration for BDF method.
|
|
83
|
+
* Solves: (I - gamma*J) * delta = -G(ycor)
|
|
84
|
+
* where G(ycor) = rl1*zn[1] + ycor - gamma*f(tn, zn[0]+ycor)
|
|
85
|
+
*/
|
|
86
|
+
function cvNewtonIteration(mem: CvodeMem, callSetup: boolean): number {
|
|
87
|
+
const N = mem.cv_N;
|
|
88
|
+
let retval: number;
|
|
89
|
+
|
|
90
|
+
// Call linear solver setup if needed
|
|
91
|
+
if (callSetup && mem.cv_lsetup) {
|
|
92
|
+
// y = zn[0] + acor (current approximation)
|
|
93
|
+
vLinearSum(1.0, mem.cv_zn[0], 1.0, mem.cv_acor, mem.cv_y, N);
|
|
94
|
+
|
|
95
|
+
// Evaluate f at current approximation
|
|
96
|
+
retval = mem.cv_f!(mem.cv_tn, mem.cv_y, mem.cv_ftemp, mem.cv_user_data);
|
|
97
|
+
mem.cv_nfe++;
|
|
98
|
+
if (retval < 0) return CV_RHSFUNC_FAIL;
|
|
99
|
+
if (retval > 0) return RHSFUNC_RECVR;
|
|
100
|
+
|
|
101
|
+
// Call lsetup
|
|
102
|
+
const jcurPtr = {value: false};
|
|
103
|
+
retval = mem.cv_lsetup!(mem, mem.convfail, mem.cv_y, mem.cv_ftemp, jcurPtr,
|
|
104
|
+
mem.cv_vtemp1, mem.cv_vtemp2, mem.cv_vtemp3);
|
|
105
|
+
mem.cv_nsetups++;
|
|
106
|
+
|
|
107
|
+
mem.cv_jcur = jcurPtr.value;
|
|
108
|
+
mem.cv_gamrat = 1.0;
|
|
109
|
+
mem.cv_gammap = mem.cv_gamma;
|
|
110
|
+
mem.cv_crate = 1.0;
|
|
111
|
+
mem.cv_nstlp = mem.cv_nst;
|
|
112
|
+
|
|
113
|
+
if (retval < 0) return CV_LSETUP_FAIL;
|
|
114
|
+
if (retval > 0) return SUN_NLS_CONV_RECVR;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Newton iteration loop
|
|
118
|
+
for (let m = 0; m < NLS_MAXCOR; m++) {
|
|
119
|
+
mem.cv_nni++;
|
|
120
|
+
|
|
121
|
+
// y = zn[0] + acor
|
|
122
|
+
vLinearSum(1.0, mem.cv_zn[0], 1.0, mem.cv_acor, mem.cv_y, N);
|
|
123
|
+
|
|
124
|
+
// Evaluate f(tn, y)
|
|
125
|
+
retval = mem.cv_f!(mem.cv_tn, mem.cv_y, mem.cv_ftemp, mem.cv_user_data);
|
|
126
|
+
mem.cv_nfe++;
|
|
127
|
+
if (retval < 0) return CV_RHSFUNC_FAIL;
|
|
128
|
+
if (retval > 0) return RHSFUNC_RECVR;
|
|
129
|
+
|
|
130
|
+
// Compute residual: b = rl1*zn[1] + acor - gamma*ftemp
|
|
131
|
+
// Store in tempv as the RHS for the linear solve
|
|
132
|
+
const b = mem.cv_tempv;
|
|
133
|
+
for (let i = 0; i < N; i++)
|
|
134
|
+
b[i] = mem.cv_rl1 * mem.cv_zn[1][i] + mem.cv_acor[i] - mem.cv_gamma * mem.cv_ftemp[i];
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
// Solve: (I - gamma*J) * delta = -b, so pass b (which is G, so we negate)
|
|
138
|
+
// Actually the convention is lsolve solves (I-gamma*J)*x = b
|
|
139
|
+
// and b here is -G so we negate
|
|
140
|
+
for (let i = 0; i < N; i++) b[i] = -b[i];
|
|
141
|
+
|
|
142
|
+
retval = mem.cv_lsolve!(mem, b, mem.cv_ewt, mem.cv_y, mem.cv_ftemp);
|
|
143
|
+
if (retval < 0) return CV_LSOLVE_FAIL;
|
|
144
|
+
if (retval > 0) return SUN_NLS_CONV_RECVR;
|
|
145
|
+
|
|
146
|
+
// Update acor += delta (delta is in b after solve)
|
|
147
|
+
for (let i = 0; i < N; i++) mem.cv_acor[i] += b[i];
|
|
148
|
+
|
|
149
|
+
// Convergence test
|
|
150
|
+
const del = wrmsNorm(N, b, mem.cv_ewt);
|
|
151
|
+
const convTestResult = cvNlsConvTest(mem, del, m, mem.cv_tq[4]);
|
|
152
|
+
|
|
153
|
+
if (convTestResult === CV_SUCCESS) return CV_SUCCESS;
|
|
154
|
+
if (convTestResult === SUN_NLS_CONV_RECVR) {
|
|
155
|
+
mem.cv_nnf++;
|
|
156
|
+
return SUN_NLS_CONV_RECVR;
|
|
157
|
+
}
|
|
158
|
+
// SUN_NLS_CONTINUE: continue iterating
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Max iterations reached without convergence
|
|
162
|
+
mem.cv_nnf++;
|
|
163
|
+
return SUN_NLS_CONV_RECVR;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Fixed-point iteration for Adams method.
|
|
168
|
+
* ycor = rl1 * (h * f(tn, zn[0]+ycor) - zn[1])
|
|
169
|
+
*/
|
|
170
|
+
function cvFixedPointIteration(mem: CvodeMem): number {
|
|
171
|
+
const N = mem.cv_N;
|
|
172
|
+
let retval: number;
|
|
173
|
+
|
|
174
|
+
for (let m = 0; m < NLS_MAXCOR; m++) {
|
|
175
|
+
mem.cv_nni++;
|
|
176
|
+
|
|
177
|
+
// y = zn[0] + acor
|
|
178
|
+
vLinearSum(1.0, mem.cv_zn[0], 1.0, mem.cv_acor, mem.cv_y, N);
|
|
179
|
+
|
|
180
|
+
// Evaluate f(tn, y) -> store in tempv
|
|
181
|
+
retval = mem.cv_f!(mem.cv_tn, mem.cv_y, mem.cv_tempv, mem.cv_user_data);
|
|
182
|
+
mem.cv_nfe++;
|
|
183
|
+
if (retval < 0) return CV_RHSFUNC_FAIL;
|
|
184
|
+
if (retval > 0) return RHSFUNC_RECVR;
|
|
185
|
+
|
|
186
|
+
// Compute new ycor: rl1 * (h * f - zn[1])
|
|
187
|
+
// First: tempv = h * tempv - zn[1]
|
|
188
|
+
for (let i = 0; i < N; i++)
|
|
189
|
+
mem.cv_tempv[i] = mem.cv_h * mem.cv_tempv[i] - mem.cv_zn[1][i];
|
|
190
|
+
|
|
191
|
+
// Then scale by rl1
|
|
192
|
+
const newAcor = mem.cv_vtemp1;
|
|
193
|
+
vScale(mem.cv_rl1, mem.cv_tempv, newAcor, N);
|
|
194
|
+
|
|
195
|
+
// Compute delta = newAcor - acor
|
|
196
|
+
const delta = mem.cv_tempv;
|
|
197
|
+
for (let i = 0; i < N; i++)
|
|
198
|
+
delta[i] = newAcor[i] - mem.cv_acor[i];
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
// Update acor
|
|
202
|
+
for (let i = 0; i < N; i++) mem.cv_acor[i] = newAcor[i];
|
|
203
|
+
|
|
204
|
+
// Convergence test
|
|
205
|
+
const del = wrmsNorm(N, delta, mem.cv_ewt);
|
|
206
|
+
const convTestResult = cvNlsConvTest(mem, del, m, mem.cv_tq[4]);
|
|
207
|
+
|
|
208
|
+
if (convTestResult === CV_SUCCESS) return CV_SUCCESS;
|
|
209
|
+
if (convTestResult === SUN_NLS_CONV_RECVR) {
|
|
210
|
+
mem.cv_nnf++;
|
|
211
|
+
return SUN_NLS_CONV_RECVR;
|
|
212
|
+
}
|
|
213
|
+
// SUN_NLS_CONTINUE: continue iterating
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Max iterations reached
|
|
217
|
+
mem.cv_nnf++;
|
|
218
|
+
return SUN_NLS_CONV_RECVR;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* cvNlsConvTest - Test for convergence of the nonlinear iteration.
|
|
223
|
+
*
|
|
224
|
+
* del: WRMS norm of the current update
|
|
225
|
+
* m: iteration count (0-based)
|
|
226
|
+
* tol: tolerance (tq[4])
|
|
227
|
+
*
|
|
228
|
+
* Returns: CV_SUCCESS if converged, SUN_NLS_CONV_RECVR if diverging,
|
|
229
|
+
* SUN_NLS_CONTINUE if not yet converged
|
|
230
|
+
*/
|
|
231
|
+
function cvNlsConvTest(mem: CvodeMem, del: number, m: number, tol: number): number {
|
|
232
|
+
// Update convergence rate estimate
|
|
233
|
+
if (m > 0)
|
|
234
|
+
mem.cv_crate = Math.max(CRDOWN * mem.cv_crate, del / mem.cv_delp);
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
// Test for convergence
|
|
238
|
+
const dcon = del * Math.min(1.0, mem.cv_crate) / tol;
|
|
239
|
+
|
|
240
|
+
if (dcon <= 1.0) {
|
|
241
|
+
// Converged
|
|
242
|
+
if (m === 0)
|
|
243
|
+
mem.cv_acnrm = del;
|
|
244
|
+
else
|
|
245
|
+
mem.cv_acnrm = wrmsNorm(mem.cv_N, mem.cv_acor, mem.cv_ewt);
|
|
246
|
+
|
|
247
|
+
mem.cv_acnrmcur = true;
|
|
248
|
+
return CV_SUCCESS;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Check for divergence
|
|
252
|
+
if (m >= 1 && del > RDIV * mem.cv_delp)
|
|
253
|
+
return SUN_NLS_CONV_RECVR;
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
// Save del and continue
|
|
257
|
+
mem.cv_delp = del;
|
|
258
|
+
return SUN_NLS_CONTINUE;
|
|
259
|
+
}
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of SUNDIALS CVODE v7.5.0 (https://github.com/LLNL/sundials)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025, Lawrence Livermore National Security, University of
|
|
5
|
+
* Maryland Baltimore County, and the SUNDIALS contributors.
|
|
6
|
+
* Copyright (c) 2013-2025, Lawrence Livermore National Security and
|
|
7
|
+
* Southern Methodist University.
|
|
8
|
+
* Copyright (c) 2002-2013, Lawrence Livermore National Security.
|
|
9
|
+
* Copyright (c) 2026 Datagrok.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the BSD-3-Clause License. See THIRD_PARTY_LICENSES
|
|
12
|
+
* for the full license text and provenance chain of the original code.
|
|
13
|
+
*/
|
|
14
|
+
// CVODE rootfinding routines
|
|
15
|
+
// Ported from SUNDIALS cvode.c v7.5.0 (rootfinding section, lines ~821-4737)
|
|
16
|
+
import { cvodeGetDky, vLinearSum, vScale, CV_SUCCESS, CV_RTFUNC_FAIL, RTFOUND, CLOSERT, UROUND, CV_NORMAL, CV_ONE_STEP, } from './common';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Local constants (matching SUNDIALS cvode.c)
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const ZERO = 0.0;
|
|
21
|
+
const HALF = 0.5;
|
|
22
|
+
const ONE = 1.0;
|
|
23
|
+
const TWO = 2.0;
|
|
24
|
+
const FIVE = 5.0;
|
|
25
|
+
const HUNDRED = 100.0;
|
|
26
|
+
const PT1 = 0.1;
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Exported functions
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* CVodeRootInit - Initialize rootfinding for CVODE.
|
|
32
|
+
*
|
|
33
|
+
* C reference: CVodeRootInit (cvode.c, lines ~821-1012)
|
|
34
|
+
*
|
|
35
|
+
* If nrtfn <= 0, disables rootfinding and returns CV_SUCCESS.
|
|
36
|
+
* Otherwise, allocates arrays for root functions and sets defaults.
|
|
37
|
+
*
|
|
38
|
+
* @param mem - CVODE memory block
|
|
39
|
+
* @param nrtfn - number of root functions
|
|
40
|
+
* @param g - root function callback
|
|
41
|
+
* @returns CV_SUCCESS on success
|
|
42
|
+
*/
|
|
43
|
+
export function cvodeRootInit(mem, nrtfn, g) {
|
|
44
|
+
// If nrtfn <= 0, disable rootfinding
|
|
45
|
+
if (nrtfn <= 0) {
|
|
46
|
+
mem.cv_nrtfn = 0;
|
|
47
|
+
mem.cv_gfun = null;
|
|
48
|
+
return CV_SUCCESS;
|
|
49
|
+
}
|
|
50
|
+
mem.cv_nrtfn = nrtfn;
|
|
51
|
+
mem.cv_gfun = g;
|
|
52
|
+
// Allocate Float64Arrays for g values
|
|
53
|
+
mem.cv_glo = new Float64Array(nrtfn);
|
|
54
|
+
mem.cv_ghi = new Float64Array(nrtfn);
|
|
55
|
+
mem.cv_grout = new Float64Array(nrtfn);
|
|
56
|
+
// Allocate Int32Arrays for root info and direction
|
|
57
|
+
mem.cv_iroots = new Int32Array(nrtfn);
|
|
58
|
+
mem.cv_rootdir = new Int32Array(nrtfn);
|
|
59
|
+
// Allocate Uint8Array for active flags
|
|
60
|
+
mem.cv_gactive = new Uint8Array(nrtfn);
|
|
61
|
+
// Set default values: rootdir = 0 (both directions), gactive = 1 (all active)
|
|
62
|
+
mem.cv_rootdir.fill(0);
|
|
63
|
+
mem.cv_gactive.fill(1);
|
|
64
|
+
return CV_SUCCESS;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* cvRcheck1 - First-step root check.
|
|
68
|
+
*
|
|
69
|
+
* C reference: cvRcheck1 (cvode.c, lines ~4251-4300)
|
|
70
|
+
*
|
|
71
|
+
* Completes initialization of rootfinding memory and checks whether g
|
|
72
|
+
* has a zero both at and very near the initial point of the IVP.
|
|
73
|
+
*
|
|
74
|
+
* @param mem - CVODE memory block
|
|
75
|
+
* @returns CV_SUCCESS or CV_RTFUNC_FAIL
|
|
76
|
+
*/
|
|
77
|
+
export function cvRcheck1(mem) {
|
|
78
|
+
const nrtfn = mem.cv_nrtfn;
|
|
79
|
+
const N = mem.cv_N;
|
|
80
|
+
for (let i = 0; i < nrtfn; i++)
|
|
81
|
+
mem.cv_iroots[i] = 0;
|
|
82
|
+
mem.cv_tlo = mem.cv_tn;
|
|
83
|
+
mem.cv_ttol = (Math.abs(mem.cv_tn) + Math.abs(mem.cv_h)) * UROUND * HUNDRED;
|
|
84
|
+
// Evaluate g at initial t and check for zero values
|
|
85
|
+
const retval = mem.cv_gfun(mem.cv_tlo, mem.cv_zn[0], mem.cv_glo, mem.cv_user_data);
|
|
86
|
+
mem.cv_nge = 1;
|
|
87
|
+
if (retval !== 0)
|
|
88
|
+
return CV_RTFUNC_FAIL;
|
|
89
|
+
let zroot = false;
|
|
90
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
91
|
+
if (Math.abs(mem.cv_glo[i]) === ZERO) {
|
|
92
|
+
zroot = true;
|
|
93
|
+
mem.cv_gactive[i] = 0; // SUNFALSE
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (!zroot)
|
|
97
|
+
return CV_SUCCESS;
|
|
98
|
+
// Some g_i is zero at t0; look at g at t0+(small increment)
|
|
99
|
+
const hratio = Math.max(mem.cv_ttol / Math.abs(mem.cv_h), PT1);
|
|
100
|
+
const smallh = hratio * mem.cv_h;
|
|
101
|
+
const tplus = mem.cv_tlo + smallh;
|
|
102
|
+
// y = zn[0] + hratio * zn[1]
|
|
103
|
+
vLinearSum(ONE, mem.cv_zn[0], hratio, mem.cv_zn[1], mem.cv_y, N);
|
|
104
|
+
const retval2 = mem.cv_gfun(tplus, mem.cv_y, mem.cv_ghi, mem.cv_user_data);
|
|
105
|
+
mem.cv_nge++;
|
|
106
|
+
if (retval2 !== 0)
|
|
107
|
+
return CV_RTFUNC_FAIL;
|
|
108
|
+
// Re-activate components where g moved away from zero
|
|
109
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
110
|
+
if (mem.cv_gactive[i] === 0 && Math.abs(mem.cv_ghi[i]) !== ZERO) {
|
|
111
|
+
mem.cv_gactive[i] = 1; // SUNTRUE
|
|
112
|
+
mem.cv_glo[i] = mem.cv_ghi[i];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return CV_SUCCESS;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* cvRcheck2 - Subsequent-step root check for exact zeros at last root.
|
|
119
|
+
*
|
|
120
|
+
* C reference: cvRcheck2 (cvode.c, lines ~4323-4385)
|
|
121
|
+
*
|
|
122
|
+
* Checks for exact zeros of g at the last root found, for close pairs
|
|
123
|
+
* of zeros (error condition), and for a new root at a nearby point.
|
|
124
|
+
*
|
|
125
|
+
* @param mem - CVODE memory block
|
|
126
|
+
* @returns CV_SUCCESS, CLOSERT, RTFOUND, or CV_RTFUNC_FAIL
|
|
127
|
+
*/
|
|
128
|
+
export function cvRcheck2(mem) {
|
|
129
|
+
const nrtfn = mem.cv_nrtfn;
|
|
130
|
+
const N = mem.cv_N;
|
|
131
|
+
if (mem.cv_irfnd === 0)
|
|
132
|
+
return CV_SUCCESS;
|
|
133
|
+
// Get y at tlo via interpolation
|
|
134
|
+
cvodeGetDky(mem, mem.cv_tlo, 0, mem.cv_y);
|
|
135
|
+
// Evaluate g(tlo, y)
|
|
136
|
+
let retval = mem.cv_gfun(mem.cv_tlo, mem.cv_y, mem.cv_glo, mem.cv_user_data);
|
|
137
|
+
mem.cv_nge++;
|
|
138
|
+
if (retval !== 0)
|
|
139
|
+
return CV_RTFUNC_FAIL;
|
|
140
|
+
let zroot = false;
|
|
141
|
+
for (let i = 0; i < nrtfn; i++)
|
|
142
|
+
mem.cv_iroots[i] = 0;
|
|
143
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
144
|
+
if (mem.cv_gactive[i] === 0)
|
|
145
|
+
continue;
|
|
146
|
+
if (Math.abs(mem.cv_glo[i]) === ZERO) {
|
|
147
|
+
zroot = true;
|
|
148
|
+
mem.cv_iroots[i] = 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (!zroot)
|
|
152
|
+
return CV_SUCCESS;
|
|
153
|
+
// One or more g_i has a zero at tlo. Check g at tlo+smallh.
|
|
154
|
+
mem.cv_ttol = (Math.abs(mem.cv_tn) + Math.abs(mem.cv_h)) * UROUND * HUNDRED;
|
|
155
|
+
const smallh = (mem.cv_h > ZERO) ? mem.cv_ttol : -mem.cv_ttol;
|
|
156
|
+
const tplus = mem.cv_tlo + smallh;
|
|
157
|
+
if ((tplus - mem.cv_tn) * mem.cv_h >= ZERO) {
|
|
158
|
+
const hratio = smallh / mem.cv_h;
|
|
159
|
+
// y = y + hratio * zn[1]
|
|
160
|
+
vLinearSum(ONE, mem.cv_y, hratio, mem.cv_zn[1], mem.cv_y, N);
|
|
161
|
+
}
|
|
162
|
+
else
|
|
163
|
+
cvodeGetDky(mem, tplus, 0, mem.cv_y);
|
|
164
|
+
retval = mem.cv_gfun(tplus, mem.cv_y, mem.cv_ghi, mem.cv_user_data);
|
|
165
|
+
mem.cv_nge++;
|
|
166
|
+
if (retval !== 0)
|
|
167
|
+
return CV_RTFUNC_FAIL;
|
|
168
|
+
// Check for close roots (error return), new zero at tlo+smallh,
|
|
169
|
+
// and g_i that changed from zero to nonzero.
|
|
170
|
+
zroot = false;
|
|
171
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
172
|
+
if (mem.cv_gactive[i] === 0)
|
|
173
|
+
continue;
|
|
174
|
+
if (Math.abs(mem.cv_ghi[i]) === ZERO) {
|
|
175
|
+
if (mem.cv_iroots[i] === 1)
|
|
176
|
+
return CLOSERT;
|
|
177
|
+
zroot = true;
|
|
178
|
+
mem.cv_iroots[i] = 1;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
if (mem.cv_iroots[i] === 1)
|
|
182
|
+
mem.cv_glo[i] = mem.cv_ghi[i];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (zroot)
|
|
186
|
+
return RTFOUND;
|
|
187
|
+
return CV_SUCCESS;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* cvRcheck3 - Root search between tlo and tn (or tout).
|
|
191
|
+
*
|
|
192
|
+
* C reference: cvRcheck3 (cvode.c, lines ~4400-4453)
|
|
193
|
+
*
|
|
194
|
+
* Interfaces to cvRootfind to look for a root of g between tlo and
|
|
195
|
+
* either tn or tout, whichever comes first.
|
|
196
|
+
*
|
|
197
|
+
* @param mem - CVODE memory block
|
|
198
|
+
* @returns CV_SUCCESS, RTFOUND, or CV_RTFUNC_FAIL
|
|
199
|
+
*/
|
|
200
|
+
export function cvRcheck3(mem) {
|
|
201
|
+
const nrtfn = mem.cv_nrtfn;
|
|
202
|
+
const N = mem.cv_N;
|
|
203
|
+
// Set thi = tn or tout, whichever comes first; set y = y(thi)
|
|
204
|
+
if (mem.cv_taskc === CV_ONE_STEP) {
|
|
205
|
+
mem.cv_thi = mem.cv_tn;
|
|
206
|
+
vScale(ONE, mem.cv_zn[0], mem.cv_y, N);
|
|
207
|
+
}
|
|
208
|
+
if (mem.cv_taskc === CV_NORMAL) {
|
|
209
|
+
if ((mem.cv_toutc - mem.cv_tn) * mem.cv_h >= ZERO) {
|
|
210
|
+
mem.cv_thi = mem.cv_tn;
|
|
211
|
+
vScale(ONE, mem.cv_zn[0], mem.cv_y, N);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
mem.cv_thi = mem.cv_toutc;
|
|
215
|
+
cvodeGetDky(mem, mem.cv_thi, 0, mem.cv_y);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Evaluate g(thi, y) and call cvRootfind
|
|
219
|
+
const retval = mem.cv_gfun(mem.cv_thi, mem.cv_y, mem.cv_ghi, mem.cv_user_data);
|
|
220
|
+
mem.cv_nge++;
|
|
221
|
+
if (retval !== 0)
|
|
222
|
+
return CV_RTFUNC_FAIL;
|
|
223
|
+
mem.cv_ttol = (Math.abs(mem.cv_tn) + Math.abs(mem.cv_h)) * UROUND * HUNDRED;
|
|
224
|
+
const ier = cvRootfind(mem);
|
|
225
|
+
if (ier === CV_RTFUNC_FAIL)
|
|
226
|
+
return CV_RTFUNC_FAIL;
|
|
227
|
+
// Re-activate g components that moved away from zero
|
|
228
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
229
|
+
if (mem.cv_gactive[i] === 0 && mem.cv_grout[i] !== ZERO)
|
|
230
|
+
mem.cv_gactive[i] = 1; // SUNTRUE
|
|
231
|
+
}
|
|
232
|
+
mem.cv_tlo = mem.cv_trout;
|
|
233
|
+
for (let i = 0; i < nrtfn; i++)
|
|
234
|
+
mem.cv_glo[i] = mem.cv_grout[i];
|
|
235
|
+
// If no root found, return CV_SUCCESS
|
|
236
|
+
if (ier === CV_SUCCESS)
|
|
237
|
+
return CV_SUCCESS;
|
|
238
|
+
// If a root was found, interpolate to get y(trout) and return
|
|
239
|
+
cvodeGetDky(mem, mem.cv_trout, 0, mem.cv_y);
|
|
240
|
+
return RTFOUND;
|
|
241
|
+
}
|
|
242
|
+
// ============================================================================
|
|
243
|
+
// Internal (non-exported) functions
|
|
244
|
+
// ============================================================================
|
|
245
|
+
/**
|
|
246
|
+
* cvRootfind - Illinois algorithm for root finding.
|
|
247
|
+
*
|
|
248
|
+
* C reference: cvRootfind (cvode.c, lines ~4532-4737)
|
|
249
|
+
*
|
|
250
|
+
* Solves for a root of g(t) between tlo and thi using a modified secant
|
|
251
|
+
* method (Illinois algorithm). Only roots of odd multiplicity (sign changes)
|
|
252
|
+
* or exact zeros are found. When multiple roots exist, the one closest to
|
|
253
|
+
* tlo is returned.
|
|
254
|
+
*
|
|
255
|
+
* @param mem - CVODE memory block
|
|
256
|
+
* @returns CV_SUCCESS, RTFOUND, or CV_RTFUNC_FAIL
|
|
257
|
+
*/
|
|
258
|
+
function cvRootfind(mem) {
|
|
259
|
+
const nrtfn = mem.cv_nrtfn;
|
|
260
|
+
let imax = 0;
|
|
261
|
+
let alph;
|
|
262
|
+
let tmid;
|
|
263
|
+
let gfrac;
|
|
264
|
+
let maxfrac;
|
|
265
|
+
let fracint;
|
|
266
|
+
let fracsub;
|
|
267
|
+
// First check for change in sign in ghi or for a zero in ghi.
|
|
268
|
+
maxfrac = ZERO;
|
|
269
|
+
let zroot = false;
|
|
270
|
+
let sgnchg = false;
|
|
271
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
272
|
+
if (mem.cv_gactive[i] === 0)
|
|
273
|
+
continue;
|
|
274
|
+
if (Math.abs(mem.cv_ghi[i]) === ZERO) {
|
|
275
|
+
if (mem.cv_rootdir[i] * mem.cv_glo[i] <= ZERO)
|
|
276
|
+
zroot = true;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
if ((mem.cv_glo[i] * mem.cv_ghi[i] < 0) &&
|
|
280
|
+
(mem.cv_rootdir[i] * mem.cv_glo[i] <= ZERO)) {
|
|
281
|
+
gfrac = Math.abs(mem.cv_ghi[i] / (mem.cv_ghi[i] - mem.cv_glo[i]));
|
|
282
|
+
if (gfrac > maxfrac) {
|
|
283
|
+
sgnchg = true;
|
|
284
|
+
maxfrac = gfrac;
|
|
285
|
+
imax = i;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// If no sign change was found, reset trout and grout.
|
|
291
|
+
// Return CV_SUCCESS if no zero was found, or set iroots and return RTFOUND.
|
|
292
|
+
if (!sgnchg) {
|
|
293
|
+
mem.cv_trout = mem.cv_thi;
|
|
294
|
+
for (let i = 0; i < nrtfn; i++)
|
|
295
|
+
mem.cv_grout[i] = mem.cv_ghi[i];
|
|
296
|
+
if (!zroot)
|
|
297
|
+
return CV_SUCCESS;
|
|
298
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
299
|
+
mem.cv_iroots[i] = 0;
|
|
300
|
+
if (mem.cv_gactive[i] === 0)
|
|
301
|
+
continue;
|
|
302
|
+
if ((Math.abs(mem.cv_ghi[i]) === ZERO) &&
|
|
303
|
+
(mem.cv_rootdir[i] * mem.cv_glo[i] <= ZERO))
|
|
304
|
+
mem.cv_iroots[i] = mem.cv_glo[i] > 0 ? -1 : 1;
|
|
305
|
+
}
|
|
306
|
+
return RTFOUND;
|
|
307
|
+
}
|
|
308
|
+
// Initialize alph
|
|
309
|
+
alph = ONE;
|
|
310
|
+
// A sign change was found. Loop to locate nearest root.
|
|
311
|
+
let side = 0;
|
|
312
|
+
let sideprev = -1;
|
|
313
|
+
for (;;) {
|
|
314
|
+
// If interval size is already less than tolerance ttol, break.
|
|
315
|
+
if (Math.abs(mem.cv_thi - mem.cv_tlo) <= mem.cv_ttol)
|
|
316
|
+
break;
|
|
317
|
+
// Set weight alph.
|
|
318
|
+
// On the first two passes, set alph = 1. Thereafter, reset alph
|
|
319
|
+
// according to the side of the subinterval where the sign change was found.
|
|
320
|
+
if (sideprev === side)
|
|
321
|
+
alph = (side === 2) ? alph * TWO : alph * HALF;
|
|
322
|
+
else
|
|
323
|
+
alph = ONE;
|
|
324
|
+
// Set next root approximation tmid and get g(tmid).
|
|
325
|
+
// If tmid is too close to tlo or thi, adjust it inward.
|
|
326
|
+
tmid = mem.cv_thi -
|
|
327
|
+
(mem.cv_thi - mem.cv_tlo) * mem.cv_ghi[imax] /
|
|
328
|
+
(mem.cv_ghi[imax] - alph * mem.cv_glo[imax]);
|
|
329
|
+
if (Math.abs(tmid - mem.cv_tlo) < HALF * mem.cv_ttol) {
|
|
330
|
+
fracint = Math.abs(mem.cv_thi - mem.cv_tlo) / mem.cv_ttol;
|
|
331
|
+
fracsub = (fracint > FIVE) ? PT1 : HALF / fracint;
|
|
332
|
+
tmid = mem.cv_tlo + fracsub * (mem.cv_thi - mem.cv_tlo);
|
|
333
|
+
}
|
|
334
|
+
if (Math.abs(mem.cv_thi - tmid) < HALF * mem.cv_ttol) {
|
|
335
|
+
fracint = Math.abs(mem.cv_thi - mem.cv_tlo) / mem.cv_ttol;
|
|
336
|
+
fracsub = (fracint > FIVE) ? PT1 : HALF / fracint;
|
|
337
|
+
tmid = mem.cv_thi - fracsub * (mem.cv_thi - mem.cv_tlo);
|
|
338
|
+
}
|
|
339
|
+
// Interpolate to get y(tmid) and evaluate g(tmid)
|
|
340
|
+
cvodeGetDky(mem, tmid, 0, mem.cv_y);
|
|
341
|
+
const retval = mem.cv_gfun(tmid, mem.cv_y, mem.cv_grout, mem.cv_user_data);
|
|
342
|
+
mem.cv_nge++;
|
|
343
|
+
if (retval !== 0)
|
|
344
|
+
return CV_RTFUNC_FAIL;
|
|
345
|
+
// Check in which subinterval g changes sign, and reset imax.
|
|
346
|
+
// Set side = 1 if sign change is on low side, or 2 if on high side.
|
|
347
|
+
maxfrac = ZERO;
|
|
348
|
+
zroot = false;
|
|
349
|
+
sgnchg = false;
|
|
350
|
+
sideprev = side;
|
|
351
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
352
|
+
if (mem.cv_gactive[i] === 0)
|
|
353
|
+
continue;
|
|
354
|
+
if (Math.abs(mem.cv_grout[i]) === ZERO) {
|
|
355
|
+
if (mem.cv_rootdir[i] * mem.cv_glo[i] <= ZERO)
|
|
356
|
+
zroot = true;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
if ((mem.cv_glo[i] * mem.cv_grout[i] < 0) &&
|
|
360
|
+
(mem.cv_rootdir[i] * mem.cv_glo[i] <= ZERO)) {
|
|
361
|
+
gfrac = Math.abs(mem.cv_grout[i] /
|
|
362
|
+
(mem.cv_grout[i] - mem.cv_glo[i]));
|
|
363
|
+
if (gfrac > maxfrac) {
|
|
364
|
+
sgnchg = true;
|
|
365
|
+
maxfrac = gfrac;
|
|
366
|
+
imax = i;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (sgnchg) {
|
|
372
|
+
// Sign change found in (tlo, tmid); replace thi with tmid.
|
|
373
|
+
mem.cv_thi = tmid;
|
|
374
|
+
for (let i = 0; i < nrtfn; i++)
|
|
375
|
+
mem.cv_ghi[i] = mem.cv_grout[i];
|
|
376
|
+
side = 1;
|
|
377
|
+
// Stop at root thi if converged; otherwise loop.
|
|
378
|
+
if (Math.abs(mem.cv_thi - mem.cv_tlo) <= mem.cv_ttol)
|
|
379
|
+
break;
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
if (zroot) {
|
|
383
|
+
// No sign change in (tlo, tmid), but g = 0 at tmid; return root tmid.
|
|
384
|
+
mem.cv_thi = tmid;
|
|
385
|
+
for (let i = 0; i < nrtfn; i++)
|
|
386
|
+
mem.cv_ghi[i] = mem.cv_grout[i];
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
// No sign change in (tlo, tmid), and no zero at tmid.
|
|
390
|
+
// Sign change must be in (tmid, thi). Replace tlo with tmid.
|
|
391
|
+
mem.cv_tlo = tmid;
|
|
392
|
+
for (let i = 0; i < nrtfn; i++)
|
|
393
|
+
mem.cv_glo[i] = mem.cv_grout[i];
|
|
394
|
+
side = 2;
|
|
395
|
+
// Stop at root thi if converged; otherwise loop back.
|
|
396
|
+
if (Math.abs(mem.cv_thi - mem.cv_tlo) <= mem.cv_ttol)
|
|
397
|
+
break;
|
|
398
|
+
} // End of root-search loop
|
|
399
|
+
// Reset trout and grout, set iroots, and return RTFOUND.
|
|
400
|
+
mem.cv_trout = mem.cv_thi;
|
|
401
|
+
for (let i = 0; i < nrtfn; i++) {
|
|
402
|
+
mem.cv_grout[i] = mem.cv_ghi[i];
|
|
403
|
+
mem.cv_iroots[i] = 0;
|
|
404
|
+
if (mem.cv_gactive[i] === 0)
|
|
405
|
+
continue;
|
|
406
|
+
if ((Math.abs(mem.cv_ghi[i]) === ZERO) &&
|
|
407
|
+
(mem.cv_rootdir[i] * mem.cv_glo[i] <= ZERO))
|
|
408
|
+
mem.cv_iroots[i] = mem.cv_glo[i] > 0 ? -1 : 1;
|
|
409
|
+
if ((mem.cv_glo[i] * mem.cv_ghi[i] < 0) &&
|
|
410
|
+
(mem.cv_rootdir[i] * mem.cv_glo[i] <= ZERO))
|
|
411
|
+
mem.cv_iroots[i] = mem.cv_glo[i] > 0 ? -1 : 1;
|
|
412
|
+
}
|
|
413
|
+
return RTFOUND;
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=cvode_root.js.map
|