diff-grok 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.claude/skills/license-updater/SKILL.md +149 -0
  2. package/.claude/skills/license-updater/references/compatibility.md +68 -0
  3. package/.claude/skills/license-updater/references/templates.md +151 -0
  4. package/.claude/skills/license-updater/scripts/generate_license_files.py +467 -0
  5. package/CLAUDE.md +10 -4
  6. package/LICENSE +1 -1
  7. package/README.MD +41 -23
  8. package/THIRD_PARTY_LICENSES +135 -0
  9. package/docs/.nojekyll +1 -0
  10. package/docs/assets/hierarchy.js +1 -0
  11. package/docs/assets/highlight.css +99 -0
  12. package/docs/assets/icons.js +18 -0
  13. package/docs/assets/icons.svg +1 -0
  14. package/docs/assets/main.js +60 -0
  15. package/docs/assets/navigation.js +1 -0
  16. package/docs/assets/search.js +1 -0
  17. package/docs/assets/style.css +1633 -0
  18. package/docs/classes/BasicModelPipelineCreator.html +10 -0
  19. package/docs/classes/Callback.html +7 -0
  20. package/docs/classes/CyclicModelPipelineCreator.html +10 -0
  21. package/docs/classes/IterCheckerCallback.html +8 -0
  22. package/docs/classes/PipelineCreator.html +6 -0
  23. package/docs/classes/TimeCheckerCallback.html +8 -0
  24. package/docs/classes/UpdatesModelPipelineCreator.html +10 -0
  25. package/docs/functions/ab4.html +8 -0
  26. package/docs/functions/ab5.html +8 -0
  27. package/docs/functions/applyPipeline.html +9 -0
  28. package/docs/functions/getCallback.html +3 -0
  29. package/docs/functions/getIVP.html +6 -0
  30. package/docs/functions/getInputVector.html +2 -0
  31. package/docs/functions/getIvp2WebWorker.html +6 -0
  32. package/docs/functions/getJScode.html +6 -0
  33. package/docs/functions/getOutputNames.html +4 -0
  34. package/docs/functions/getPipelineCreator.html +7 -0
  35. package/docs/functions/lsoda.html +8 -0
  36. package/docs/functions/mrt.html +11 -0
  37. package/docs/functions/printE5.html +76 -0
  38. package/docs/functions/printHires.html +76 -0
  39. package/docs/functions/printOrego.html +66 -0
  40. package/docs/functions/printPollution.html +163 -0
  41. package/docs/functions/printRobertson.html +60 -0
  42. package/docs/functions/printVdpol.html +66 -0
  43. package/docs/functions/rk3.html +8 -0
  44. package/docs/functions/rk4.html +8 -0
  45. package/docs/functions/rkdp.html +8 -0
  46. package/docs/functions/ros34prw.html +8 -0
  47. package/docs/functions/ros3prw.html +8 -0
  48. package/docs/functions/solveIvp.html +5 -0
  49. package/docs/hierarchy.html +1 -0
  50. package/docs/index.html +768 -0
  51. package/docs/media/CONTRIBUTING.md +74 -0
  52. package/docs/media/E5.png +0 -0
  53. package/docs/media/HIRES.png +0 -0
  54. package/docs/media/OREGO.png +0 -0
  55. package/docs/media/POLL-full.png +0 -0
  56. package/docs/media/POLL.png +0 -0
  57. package/docs/media/ROBER.png +0 -0
  58. package/docs/media/VDP0L.png +0 -0
  59. package/docs/media/VDPOL.png +0 -0
  60. package/docs/media/acid-prod.gif +0 -0
  61. package/docs/media/basic-use.js +40 -0
  62. package/docs/media/basic-use.js.map +1 -0
  63. package/docs/media/basic-use.ts +44 -0
  64. package/docs/media/check-methods.js +59 -0
  65. package/docs/media/check-methods.js.map +1 -0
  66. package/docs/media/check-methods.ts +81 -0
  67. package/docs/media/corr-probs.js +132 -0
  68. package/docs/media/corr-probs.js.map +1 -0
  69. package/docs/media/corr-probs.ts +155 -0
  70. package/docs/media/cyclic-model.js +102 -0
  71. package/docs/media/cyclic-model.js.map +1 -0
  72. package/docs/media/cyclic-model.ts +112 -0
  73. package/docs/media/e5.js +36 -0
  74. package/docs/media/e5.js.map +1 -0
  75. package/docs/media/e5.ts +36 -0
  76. package/docs/media/hires.js +39 -0
  77. package/docs/media/hires.js.map +1 -0
  78. package/docs/media/hires.ts +40 -0
  79. package/docs/media/model-updates.js +112 -0
  80. package/docs/media/model-updates.js.map +1 -0
  81. package/docs/media/model-updates.ts +122 -0
  82. package/docs/media/orego.js +24 -0
  83. package/docs/media/orego.js.map +1 -0
  84. package/docs/media/orego.ts +25 -0
  85. package/docs/media/pipeline-use.js +87 -0
  86. package/docs/media/pipeline-use.js.map +1 -0
  87. package/docs/media/pipeline-use.ts +98 -0
  88. package/docs/media/pollution.js +132 -0
  89. package/docs/media/pollution.js.map +1 -0
  90. package/docs/media/pollution.ts +133 -0
  91. package/docs/media/print-benchmark.js +581 -0
  92. package/docs/media/print-benchmark.js.map +1 -0
  93. package/docs/media/print-benchmark.ts +594 -0
  94. package/docs/media/robertson.js +19 -0
  95. package/docs/media/robertson.js.map +1 -0
  96. package/docs/media/robertson.ts +19 -0
  97. package/docs/media/scripting.js +30 -0
  98. package/docs/media/scripting.js.map +1 -0
  99. package/docs/media/scripting.ts +35 -0
  100. package/docs/media/vdpol.js +17 -0
  101. package/docs/media/vdpol.js.map +1 -0
  102. package/docs/media/vdpol.ts +17 -0
  103. package/docs/modules.html +1 -0
  104. package/docs/types/Arg.html +12 -0
  105. package/docs/types/DifEqs.html +8 -0
  106. package/docs/types/Func.html +7 -0
  107. package/docs/types/IVP.html +40 -0
  108. package/docs/types/IVP2WebWorker.html +12 -0
  109. package/docs/types/Input.html +8 -0
  110. package/docs/types/Loop.html +7 -0
  111. package/docs/types/ODEs.html +31 -0
  112. package/docs/types/Output.html +6 -0
  113. package/docs/types/Pipeline.html +6 -0
  114. package/docs/types/SolverOptions.html +8 -0
  115. package/docs/types/Update.html +9 -0
  116. package/docs/types/Wrapper.html +8 -0
  117. package/index.js +1 -1
  118. package/index.js.map +1 -1
  119. package/index.ts +1 -1
  120. package/package.json +4 -2
  121. package/src/examples/check-methods.js +15 -3
  122. package/src/examples/check-methods.js.map +1 -1
  123. package/src/examples/check-methods.ts +18 -3
  124. package/src/solver-tools/cvode/common.js +487 -0
  125. package/src/solver-tools/cvode/common.js.map +1 -0
  126. package/src/solver-tools/cvode/common.ts +549 -0
  127. package/src/solver-tools/cvode/cvode.js +1062 -0
  128. package/src/solver-tools/cvode/cvode.js.map +1 -0
  129. package/src/solver-tools/cvode/cvode.ts +1226 -0
  130. package/src/solver-tools/cvode/cvode_adams.js +124 -0
  131. package/src/solver-tools/cvode/cvode_adams.js.map +1 -0
  132. package/src/solver-tools/cvode/cvode_adams.ts +142 -0
  133. package/src/solver-tools/cvode/cvode_bdf.js +153 -0
  134. package/src/solver-tools/cvode/cvode_bdf.js.map +1 -0
  135. package/src/solver-tools/cvode/cvode_bdf.ts +164 -0
  136. package/src/solver-tools/cvode/cvode_class.js +158 -0
  137. package/src/solver-tools/cvode/cvode_class.js.map +1 -0
  138. package/src/solver-tools/cvode/cvode_class.ts +271 -0
  139. package/src/solver-tools/cvode/cvode_hin.js +119 -0
  140. package/src/solver-tools/cvode/cvode_hin.js.map +1 -0
  141. package/src/solver-tools/cvode/cvode_hin.ts +150 -0
  142. package/src/solver-tools/cvode/cvode_io.js +203 -0
  143. package/src/solver-tools/cvode/cvode_io.js.map +1 -0
  144. package/src/solver-tools/cvode/cvode_io.ts +258 -0
  145. package/src/solver-tools/cvode/cvode_ls.js +210 -0
  146. package/src/solver-tools/cvode/cvode_ls.js.map +1 -0
  147. package/src/solver-tools/cvode/cvode_ls.ts +249 -0
  148. package/src/solver-tools/cvode/cvode_nls.js +220 -0
  149. package/src/solver-tools/cvode/cvode_nls.js.map +1 -0
  150. package/src/solver-tools/cvode/cvode_nls.ts +259 -0
  151. package/src/solver-tools/cvode/cvode_root.js +415 -0
  152. package/src/solver-tools/cvode/cvode_root.js.map +1 -0
  153. package/src/solver-tools/cvode/cvode_root.ts +503 -0
  154. package/src/solver-tools/cvode/dense_linalg.js +131 -0
  155. package/src/solver-tools/cvode/dense_linalg.js.map +1 -0
  156. package/src/solver-tools/cvode/dense_linalg.ts +144 -0
  157. package/src/solver-tools/cvode/index.js +26 -0
  158. package/src/solver-tools/cvode/index.js.map +1 -0
  159. package/src/solver-tools/cvode/index.ts +64 -0
  160. package/src/solver-tools/cvode-method.js +114 -0
  161. package/src/solver-tools/cvode-method.js.map +1 -0
  162. package/src/solver-tools/cvode-method.ts +129 -0
  163. package/src/solver-tools/index.js +1 -0
  164. package/src/solver-tools/index.js.map +1 -1
  165. package/src/solver-tools/index.ts +1 -0
  166. package/src/solver-tools/lsoda/blas.js +11 -0
  167. package/src/solver-tools/lsoda/blas.js.map +1 -1
  168. package/src/solver-tools/lsoda/blas.ts +12 -0
  169. package/src/solver-tools/lsoda/cfode.js +11 -0
  170. package/src/solver-tools/lsoda/cfode.js.map +1 -1
  171. package/src/solver-tools/lsoda/cfode.ts +12 -0
  172. package/src/solver-tools/lsoda/corfailure.js +11 -0
  173. package/src/solver-tools/lsoda/corfailure.js.map +1 -1
  174. package/src/solver-tools/lsoda/corfailure.ts +12 -0
  175. package/src/solver-tools/lsoda/correction.js +11 -0
  176. package/src/solver-tools/lsoda/correction.js.map +1 -1
  177. package/src/solver-tools/lsoda/correction.ts +12 -0
  178. package/src/solver-tools/lsoda/dense.js +11 -0
  179. package/src/solver-tools/lsoda/dense.js.map +1 -1
  180. package/src/solver-tools/lsoda/dense.ts +12 -0
  181. package/src/solver-tools/lsoda/index.js +11 -0
  182. package/src/solver-tools/lsoda/index.js.map +1 -1
  183. package/src/solver-tools/lsoda/index.ts +12 -0
  184. package/src/solver-tools/lsoda/intdy.js +11 -0
  185. package/src/solver-tools/lsoda/intdy.js.map +1 -1
  186. package/src/solver-tools/lsoda/intdy.ts +12 -0
  187. package/src/solver-tools/lsoda/lsoda.js +11 -0
  188. package/src/solver-tools/lsoda/lsoda.js.map +1 -1
  189. package/src/solver-tools/lsoda/lsoda.ts +12 -0
  190. package/src/solver-tools/lsoda/methodswitch.js +11 -0
  191. package/src/solver-tools/lsoda/methodswitch.js.map +1 -1
  192. package/src/solver-tools/lsoda/methodswitch.ts +12 -0
  193. package/src/solver-tools/lsoda/orderswitch.js +11 -0
  194. package/src/solver-tools/lsoda/orderswitch.js.map +1 -1
  195. package/src/solver-tools/lsoda/orderswitch.ts +12 -0
  196. package/src/solver-tools/lsoda/prja.js +11 -0
  197. package/src/solver-tools/lsoda/prja.js.map +1 -1
  198. package/src/solver-tools/lsoda/prja.ts +12 -0
  199. package/src/solver-tools/lsoda/scaleh.js +11 -0
  200. package/src/solver-tools/lsoda/scaleh.js.map +1 -1
  201. package/src/solver-tools/lsoda/scaleh.ts +12 -0
  202. package/src/solver-tools/lsoda/solsy.js +11 -0
  203. package/src/solver-tools/lsoda/solsy.js.map +1 -1
  204. package/src/solver-tools/lsoda/solsy.ts +12 -0
  205. package/src/solver-tools/lsoda/stoda.js +11 -0
  206. package/src/solver-tools/lsoda/stoda.js.map +1 -1
  207. package/src/solver-tools/lsoda/stoda.ts +12 -0
  208. package/src/solver-tools/lsoda-method.js +23 -9
  209. package/src/solver-tools/lsoda-method.js.map +1 -1
  210. package/src/solver-tools/lsoda-method.ts +27 -9
  211. package/src/solver-tools/solver-defs.js +1 -0
  212. package/src/solver-tools/solver-defs.js.map +1 -1
  213. package/src/solver-tools/solver-defs.ts +1 -0
  214. package/src/tests/cvode-lib-correctness.test.js +404 -0
  215. package/src/tests/cvode-lib-correctness.test.js.map +1 -0
  216. package/src/tests/cvode-lib-correctness.test.ts +505 -0
  217. package/src/tests/cvode-lib-performance.test.js +103 -0
  218. package/src/tests/cvode-lib-performance.test.js.map +1 -0
  219. package/src/tests/cvode-lib-performance.test.ts +128 -0
  220. package/src/tests/performance.test.js +4 -2
  221. package/src/tests/performance.test.js.map +1 -1
  222. package/src/tests/performance.test.ts +4 -2
  223. package/src/tests/test-defs.js +7 -1
  224. package/src/tests/test-defs.js.map +1 -1
  225. package/src/tests/test-defs.ts +8 -1
  226. package/src/worker-tools/solving.js +3 -1
  227. package/src/worker-tools/solving.js.map +1 -1
  228. package/src/worker-tools/solving.ts +4 -1
  229. package/src/examples/bioreactor.js +0 -125
  230. package/src/examples/bioreactor.js.map +0 -1
  231. package/src/examples/bioreactor.ts +0 -132
@@ -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