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.
Files changed (226) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/.claude/skills/license-updater/SKILL.md +149 -0
  3. package/.claude/skills/license-updater/references/compatibility.md +68 -0
  4. package/.claude/skills/license-updater/references/templates.md +151 -0
  5. package/.claude/skills/license-updater/scripts/generate_license_files.py +467 -0
  6. package/CLAUDE.md +104 -0
  7. package/LICENSE +1 -1
  8. package/README.MD +121 -27
  9. package/THIRD_PARTY_LICENSES +135 -0
  10. package/docs/assets/hierarchy.js +1 -1
  11. package/docs/assets/navigation.js +1 -1
  12. package/docs/assets/search.js +1 -1
  13. package/docs/classes/BasicModelPipelineCreator.html +4 -4
  14. package/docs/classes/Callback.html +5 -5
  15. package/docs/classes/CyclicModelPipelineCreator.html +4 -4
  16. package/docs/classes/IterCheckerCallback.html +5 -5
  17. package/docs/classes/PipelineCreator.html +4 -4
  18. package/docs/classes/TimeCheckerCallback.html +5 -5
  19. package/docs/classes/UpdatesModelPipelineCreator.html +4 -4
  20. package/docs/functions/ab4.html +8 -0
  21. package/docs/functions/ab5.html +8 -0
  22. package/docs/functions/applyPipeline.html +2 -2
  23. package/docs/functions/getCallback.html +2 -2
  24. package/docs/functions/getIVP.html +2 -2
  25. package/docs/functions/getInputVector.html +2 -2
  26. package/docs/functions/getIvp2WebWorker.html +2 -2
  27. package/docs/functions/getJScode.html +2 -2
  28. package/docs/functions/getOutputNames.html +2 -2
  29. package/docs/functions/getPipelineCreator.html +2 -2
  30. package/docs/functions/lsoda.html +8 -0
  31. package/docs/functions/mrt.html +2 -2
  32. package/docs/functions/printE5.html +2 -2
  33. package/docs/functions/printHires.html +2 -2
  34. package/docs/functions/printOrego.html +2 -2
  35. package/docs/functions/printPollution.html +2 -2
  36. package/docs/functions/printRobertson.html +2 -2
  37. package/docs/functions/printVdpol.html +2 -2
  38. package/docs/functions/rk3.html +8 -0
  39. package/docs/functions/rk4.html +8 -0
  40. package/docs/functions/rkdp.html +8 -0
  41. package/docs/functions/ros34prw.html +2 -2
  42. package/docs/functions/ros3prw.html +2 -2
  43. package/docs/functions/solveIvp.html +2 -2
  44. package/docs/hierarchy.html +1 -1
  45. package/docs/index.html +100 -15
  46. package/docs/media/E5.png +0 -0
  47. package/docs/media/HIRES.png +0 -0
  48. package/docs/media/OREGO.png +0 -0
  49. package/docs/media/POLL-full.png +0 -0
  50. package/docs/media/ROBER.png +0 -0
  51. package/docs/media/VDP0L.png +0 -0
  52. package/docs/media/cyclic-model.js +3 -1
  53. package/docs/media/cyclic-model.js.map +1 -1
  54. package/docs/media/cyclic-model.ts +3 -1
  55. package/docs/modules.html +1 -1
  56. package/docs/types/Arg.html +7 -7
  57. package/docs/types/DifEqs.html +4 -4
  58. package/docs/types/Func.html +2 -2
  59. package/docs/types/IVP.html +20 -20
  60. package/docs/types/IVP2WebWorker.html +7 -7
  61. package/docs/types/Input.html +4 -4
  62. package/docs/types/Loop.html +4 -4
  63. package/docs/types/ODEs.html +8 -8
  64. package/docs/types/Output.html +4 -4
  65. package/docs/types/Pipeline.html +4 -4
  66. package/docs/types/SolverOptions.html +5 -5
  67. package/docs/types/Update.html +5 -5
  68. package/docs/types/Wrapper.html +5 -5
  69. package/images/E5.png +0 -0
  70. package/images/HIRES.png +0 -0
  71. package/images/OREGO.png +0 -0
  72. package/images/POLL-full.png +0 -0
  73. package/images/ROBER.png +0 -0
  74. package/images/VDP0L.png +0 -0
  75. package/index.js +1 -1
  76. package/index.js.map +1 -1
  77. package/index.ts +2 -1
  78. package/jest.config.js +1 -0
  79. package/package.json +4 -2
  80. package/src/examples/check-methods.js +15 -3
  81. package/src/examples/check-methods.js.map +1 -1
  82. package/src/examples/check-methods.ts +18 -3
  83. package/src/examples/cyclic-model.js +3 -1
  84. package/src/examples/cyclic-model.js.map +1 -1
  85. package/src/examples/cyclic-model.ts +3 -1
  86. package/src/solver-tools/ab4-method.js +332 -0
  87. package/src/solver-tools/ab4-method.js.map +1 -0
  88. package/src/solver-tools/ab4-method.ts +395 -0
  89. package/src/solver-tools/ab5-method.js +334 -0
  90. package/src/solver-tools/ab5-method.js.map +1 -0
  91. package/src/solver-tools/ab5-method.ts +397 -0
  92. package/src/solver-tools/cvode/common.js +487 -0
  93. package/src/solver-tools/cvode/common.js.map +1 -0
  94. package/src/solver-tools/cvode/common.ts +549 -0
  95. package/src/solver-tools/cvode/cvode.js +1062 -0
  96. package/src/solver-tools/cvode/cvode.js.map +1 -0
  97. package/src/solver-tools/cvode/cvode.ts +1226 -0
  98. package/src/solver-tools/cvode/cvode_adams.js +124 -0
  99. package/src/solver-tools/cvode/cvode_adams.js.map +1 -0
  100. package/src/solver-tools/cvode/cvode_adams.ts +142 -0
  101. package/src/solver-tools/cvode/cvode_bdf.js +153 -0
  102. package/src/solver-tools/cvode/cvode_bdf.js.map +1 -0
  103. package/src/solver-tools/cvode/cvode_bdf.ts +164 -0
  104. package/src/solver-tools/cvode/cvode_class.js +158 -0
  105. package/src/solver-tools/cvode/cvode_class.js.map +1 -0
  106. package/src/solver-tools/cvode/cvode_class.ts +271 -0
  107. package/src/solver-tools/cvode/cvode_hin.js +119 -0
  108. package/src/solver-tools/cvode/cvode_hin.js.map +1 -0
  109. package/src/solver-tools/cvode/cvode_hin.ts +150 -0
  110. package/src/solver-tools/cvode/cvode_io.js +203 -0
  111. package/src/solver-tools/cvode/cvode_io.js.map +1 -0
  112. package/src/solver-tools/cvode/cvode_io.ts +258 -0
  113. package/src/solver-tools/cvode/cvode_ls.js +210 -0
  114. package/src/solver-tools/cvode/cvode_ls.js.map +1 -0
  115. package/src/solver-tools/cvode/cvode_ls.ts +249 -0
  116. package/src/solver-tools/cvode/cvode_nls.js +220 -0
  117. package/src/solver-tools/cvode/cvode_nls.js.map +1 -0
  118. package/src/solver-tools/cvode/cvode_nls.ts +259 -0
  119. package/src/solver-tools/cvode/cvode_root.js +415 -0
  120. package/src/solver-tools/cvode/cvode_root.js.map +1 -0
  121. package/src/solver-tools/cvode/cvode_root.ts +503 -0
  122. package/src/solver-tools/cvode/dense_linalg.js +131 -0
  123. package/src/solver-tools/cvode/dense_linalg.js.map +1 -0
  124. package/src/solver-tools/cvode/dense_linalg.ts +144 -0
  125. package/src/solver-tools/cvode/index.js +26 -0
  126. package/src/solver-tools/cvode/index.js.map +1 -0
  127. package/src/solver-tools/cvode/index.ts +64 -0
  128. package/src/solver-tools/cvode-method.js +114 -0
  129. package/src/solver-tools/cvode-method.js.map +1 -0
  130. package/src/solver-tools/cvode-method.ts +129 -0
  131. package/src/solver-tools/index.js +7 -0
  132. package/src/solver-tools/index.js.map +1 -1
  133. package/src/solver-tools/index.ts +7 -0
  134. package/src/solver-tools/lsoda/blas.js +257 -0
  135. package/src/solver-tools/lsoda/blas.js.map +1 -0
  136. package/src/solver-tools/lsoda/blas.ts +279 -0
  137. package/src/solver-tools/lsoda/cfode.js +84 -0
  138. package/src/solver-tools/lsoda/cfode.js.map +1 -0
  139. package/src/solver-tools/lsoda/cfode.ts +95 -0
  140. package/src/solver-tools/lsoda/common.js +94 -0
  141. package/src/solver-tools/lsoda/common.js.map +1 -0
  142. package/src/solver-tools/lsoda/common.ts +135 -0
  143. package/src/solver-tools/lsoda/corfailure.js +36 -0
  144. package/src/solver-tools/lsoda/corfailure.js.map +1 -0
  145. package/src/solver-tools/lsoda/corfailure.ts +42 -0
  146. package/src/solver-tools/lsoda/correction.js +112 -0
  147. package/src/solver-tools/lsoda/correction.js.map +1 -0
  148. package/src/solver-tools/lsoda/correction.ts +131 -0
  149. package/src/solver-tools/lsoda/dense.js +121 -0
  150. package/src/solver-tools/lsoda/dense.js.map +1 -0
  151. package/src/solver-tools/lsoda/dense.ts +141 -0
  152. package/src/solver-tools/lsoda/index.js +15 -0
  153. package/src/solver-tools/lsoda/index.js.map +1 -0
  154. package/src/solver-tools/lsoda/index.ts +17 -0
  155. package/src/solver-tools/lsoda/intdy.js +54 -0
  156. package/src/solver-tools/lsoda/intdy.js.map +1 -0
  157. package/src/solver-tools/lsoda/intdy.ts +62 -0
  158. package/src/solver-tools/lsoda/lsoda.js +578 -0
  159. package/src/solver-tools/lsoda/lsoda.js.map +1 -0
  160. package/src/solver-tools/lsoda/lsoda.ts +644 -0
  161. package/src/solver-tools/lsoda/methodswitch.js +108 -0
  162. package/src/solver-tools/lsoda/methodswitch.js.map +1 -0
  163. package/src/solver-tools/lsoda/methodswitch.ts +119 -0
  164. package/src/solver-tools/lsoda/orderswitch.js +97 -0
  165. package/src/solver-tools/lsoda/orderswitch.js.map +1 -0
  166. package/src/solver-tools/lsoda/orderswitch.ts +107 -0
  167. package/src/solver-tools/lsoda/prja.js +54 -0
  168. package/src/solver-tools/lsoda/prja.js.map +1 -0
  169. package/src/solver-tools/lsoda/prja.ts +61 -0
  170. package/src/solver-tools/lsoda/scaleh.js +41 -0
  171. package/src/solver-tools/lsoda/scaleh.js.map +1 -0
  172. package/src/solver-tools/lsoda/scaleh.ts +45 -0
  173. package/src/solver-tools/lsoda/solsy.js +25 -0
  174. package/src/solver-tools/lsoda/solsy.js.map +1 -0
  175. package/src/solver-tools/lsoda/solsy.ts +30 -0
  176. package/src/solver-tools/lsoda/stoda.js +270 -0
  177. package/src/solver-tools/lsoda/stoda.js.map +1 -0
  178. package/src/solver-tools/lsoda/stoda.ts +298 -0
  179. package/src/solver-tools/lsoda-method.js +134 -0
  180. package/src/solver-tools/lsoda-method.js.map +1 -0
  181. package/src/solver-tools/lsoda-method.ts +154 -0
  182. package/src/solver-tools/mrt-method.js +81 -18
  183. package/src/solver-tools/mrt-method.js.map +1 -1
  184. package/src/solver-tools/mrt-method.ts +111 -21
  185. package/src/solver-tools/rk3-method.js +210 -0
  186. package/src/solver-tools/rk3-method.js.map +1 -0
  187. package/src/solver-tools/rk3-method.ts +257 -0
  188. package/src/solver-tools/rk4-method.js +236 -0
  189. package/src/solver-tools/rk4-method.js.map +1 -0
  190. package/src/solver-tools/rk4-method.ts +286 -0
  191. package/src/solver-tools/rkdp-method.js +247 -0
  192. package/src/solver-tools/rkdp-method.js.map +1 -0
  193. package/src/solver-tools/rkdp-method.ts +300 -0
  194. package/src/solver-tools/ros34prw-method.js +1 -1
  195. package/src/solver-tools/ros34prw-method.js.map +1 -1
  196. package/src/solver-tools/ros34prw-method.ts +1 -1
  197. package/src/solver-tools/ros3prw-method.js +1 -1
  198. package/src/solver-tools/ros3prw-method.js.map +1 -1
  199. package/src/solver-tools/ros3prw-method.ts +1 -1
  200. package/src/solver-tools/solver-defs.js +7 -0
  201. package/src/solver-tools/solver-defs.js.map +1 -1
  202. package/src/solver-tools/solver-defs.ts +7 -0
  203. package/src/tests/correctness.test.js +6 -4
  204. package/src/tests/correctness.test.js.map +1 -1
  205. package/src/tests/correctness.test.ts +6 -4
  206. package/src/tests/cvode-lib-correctness.test.js +404 -0
  207. package/src/tests/cvode-lib-correctness.test.js.map +1 -0
  208. package/src/tests/cvode-lib-correctness.test.ts +505 -0
  209. package/src/tests/cvode-lib-performance.test.js +103 -0
  210. package/src/tests/cvode-lib-performance.test.js.map +1 -0
  211. package/src/tests/cvode-lib-performance.test.ts +128 -0
  212. package/src/tests/lsoda-lib-correctness.test.js +223 -0
  213. package/src/tests/lsoda-lib-correctness.test.js.map +1 -0
  214. package/src/tests/lsoda-lib-correctness.test.ts +283 -0
  215. package/src/tests/lsoda-lib-performance.test.js +95 -0
  216. package/src/tests/lsoda-lib-performance.test.js.map +1 -0
  217. package/src/tests/lsoda-lib-performance.test.ts +126 -0
  218. package/src/tests/performance.test.js +12 -8
  219. package/src/tests/performance.test.js.map +1 -1
  220. package/src/tests/performance.test.ts +12 -8
  221. package/src/tests/test-defs.js +20 -1
  222. package/src/tests/test-defs.js.map +1 -1
  223. package/src/tests/test-defs.ts +22 -1
  224. package/src/worker-tools/solving.js +15 -1
  225. package/src/worker-tools/solving.js.map +1 -1
  226. package/src/worker-tools/solving.ts +23 -1
@@ -0,0 +1,108 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+ import { ETA, RATIO, sm1, cm1, cm2 } from './common';
13
+ import { vmnorm } from './blas';
14
+ /**
15
+ * Consider switching between Adams (meth=1) and BDF (meth=2).
16
+ * Modifies ctx.common.meth, miter, nq, icount, pdlast on switch.
17
+ */
18
+ export function methodswitch(ctx, dsm, pnorm, out) {
19
+ const c = ctx.common;
20
+ const neq = ctx.neq;
21
+ const mxordn = ctx.opt.mxordn;
22
+ const mxords = ctx.opt.mxords;
23
+ if (c.meth === 1) {
24
+ // Currently Adams, consider switching to BDF
25
+ if (c.nq > 5)
26
+ return;
27
+ let rh2;
28
+ let nqm2;
29
+ if (dsm <= (100. * pnorm * ETA) || c.pdest === 0.) {
30
+ if (c.irflag === 0)
31
+ return;
32
+ rh2 = 2.;
33
+ nqm2 = Math.min(c.nq, mxords);
34
+ }
35
+ else {
36
+ const exsm = 1. / (c.nq + 1);
37
+ let rh1 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
38
+ let rh1it = 2. * rh1;
39
+ const pdh = c.pdlast * Math.abs(c.h);
40
+ if ((pdh * rh1) > 0.00001)
41
+ rh1it = sm1[c.nq] / pdh;
42
+ rh1 = Math.min(rh1, rh1it);
43
+ if (c.nq > mxords) {
44
+ nqm2 = mxords;
45
+ const lm2 = mxords + 1;
46
+ const exm2 = 1. / lm2;
47
+ const lm2p1 = lm2 + 1;
48
+ const dm2 = vmnorm(neq, c.yh[lm2p1], c.ewt) / cm2[mxords];
49
+ rh2 = 1. / (1.2 * Math.pow(dm2, exm2) + 0.0000012);
50
+ }
51
+ else {
52
+ const dm2 = dsm * (cm1[c.nq] / cm2[c.nq]);
53
+ rh2 = 1. / (1.2 * Math.pow(dm2, exsm) + 0.0000012);
54
+ nqm2 = c.nq;
55
+ }
56
+ if (rh2 < RATIO * rh1)
57
+ return;
58
+ }
59
+ // Switch to BDF
60
+ out.rh = rh2;
61
+ c.icount = 20;
62
+ c.meth = 2;
63
+ c.miter = 2;
64
+ c.pdlast = 0.;
65
+ c.nq = nqm2;
66
+ return;
67
+ }
68
+ // Currently BDF (meth=2), consider switching to Adams
69
+ const exsm = 1. / (c.nq + 1);
70
+ let nqm1;
71
+ let exm1;
72
+ let rh1;
73
+ let dm1;
74
+ if (mxordn < c.nq) {
75
+ nqm1 = mxordn;
76
+ const lm1 = mxordn + 1;
77
+ exm1 = 1. / lm1;
78
+ const lm1p1 = lm1 + 1;
79
+ dm1 = vmnorm(neq, c.yh[lm1p1], c.ewt) / cm1[mxordn];
80
+ rh1 = 1. / (1.2 * Math.pow(dm1, exm1) + 0.0000012);
81
+ }
82
+ else {
83
+ dm1 = dsm * (cm2[c.nq] / cm1[c.nq]);
84
+ rh1 = 1. / (1.2 * Math.pow(dm1, exsm) + 0.0000012);
85
+ nqm1 = c.nq;
86
+ exm1 = exsm;
87
+ }
88
+ let rh1it = 2. * rh1;
89
+ const pdh = c.pdnorm * Math.abs(c.h);
90
+ if ((pdh * rh1) > 0.00001)
91
+ rh1it = sm1[nqm1] / pdh;
92
+ rh1 = Math.min(rh1, rh1it);
93
+ const rh2 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
94
+ if ((rh1 * RATIO) < (5. * rh2))
95
+ return;
96
+ const alpha = Math.max(0.001, rh1);
97
+ dm1 *= Math.pow(alpha, exm1);
98
+ if (dm1 <= 1000. * ETA * pnorm)
99
+ return;
100
+ // Switch to Adams
101
+ out.rh = rh1;
102
+ c.icount = 20;
103
+ c.meth = 1;
104
+ c.miter = 0;
105
+ c.pdlast = 0.;
106
+ c.nq = nqm1;
107
+ }
108
+ //# sourceMappingURL=methodswitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"methodswitch.js","sourceRoot":"","sources":["methodswitch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+
13
+ import {LsodaContext, ETA, RATIO, sm1, cm1, cm2} from './common';
14
+ import {vmnorm} from './blas';
15
+
16
+ /** Mutable rh output */
17
+ export interface MethodSwitchResult {
18
+ rh: number;
19
+ }
20
+
21
+ /**
22
+ * Consider switching between Adams (meth=1) and BDF (meth=2).
23
+ * Modifies ctx.common.meth, miter, nq, icount, pdlast on switch.
24
+ */
25
+ export function methodswitch(
26
+ ctx: LsodaContext, dsm: number, pnorm: number, out: MethodSwitchResult,
27
+ ): void {
28
+ const c = ctx.common!;
29
+ const neq = ctx.neq;
30
+ const mxordn = ctx.opt!.mxordn;
31
+ const mxords = ctx.opt!.mxords;
32
+
33
+ if (c.meth === 1) {
34
+ // Currently Adams, consider switching to BDF
35
+ if (c.nq > 5) return;
36
+
37
+ let rh2: number;
38
+ let nqm2: number;
39
+
40
+ if (dsm <= (100. * pnorm * ETA) || c.pdest === 0.) {
41
+ if (c.irflag === 0) return;
42
+ rh2 = 2.;
43
+ nqm2 = Math.min(c.nq, mxords);
44
+ } else {
45
+ const exsm = 1. / (c.nq + 1);
46
+ let rh1 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
47
+ let rh1it = 2. * rh1;
48
+ const pdh = c.pdlast * Math.abs(c.h);
49
+ if ((pdh * rh1) > 0.00001)
50
+ rh1it = sm1[c.nq] / pdh;
51
+ rh1 = Math.min(rh1, rh1it);
52
+
53
+ if (c.nq > mxords) {
54
+ nqm2 = mxords;
55
+ const lm2 = mxords + 1;
56
+ const exm2 = 1. / lm2;
57
+ const lm2p1 = lm2 + 1;
58
+ const dm2 = vmnorm(neq, c.yh[lm2p1], c.ewt) / cm2[mxords];
59
+ rh2 = 1. / (1.2 * Math.pow(dm2, exm2) + 0.0000012);
60
+ } else {
61
+ const dm2 = dsm * (cm1[c.nq] / cm2[c.nq]);
62
+ rh2 = 1. / (1.2 * Math.pow(dm2, exsm) + 0.0000012);
63
+ nqm2 = c.nq;
64
+ }
65
+ if (rh2 < RATIO * rh1) return;
66
+ }
67
+
68
+ // Switch to BDF
69
+ out.rh = rh2;
70
+ c.icount = 20;
71
+ c.meth = 2;
72
+ c.miter = 2;
73
+ c.pdlast = 0.;
74
+ c.nq = nqm2;
75
+ return;
76
+ }
77
+
78
+ // Currently BDF (meth=2), consider switching to Adams
79
+ const exsm = 1. / (c.nq + 1);
80
+ let nqm1: number;
81
+ let exm1: number;
82
+ let rh1: number;
83
+ let dm1: number;
84
+
85
+ if (mxordn < c.nq) {
86
+ nqm1 = mxordn;
87
+ const lm1 = mxordn + 1;
88
+ exm1 = 1. / lm1;
89
+ const lm1p1 = lm1 + 1;
90
+ dm1 = vmnorm(neq, c.yh[lm1p1], c.ewt) / cm1[mxordn];
91
+ rh1 = 1. / (1.2 * Math.pow(dm1, exm1) + 0.0000012);
92
+ } else {
93
+ dm1 = dsm * (cm2[c.nq] / cm1[c.nq]);
94
+ rh1 = 1. / (1.2 * Math.pow(dm1, exsm) + 0.0000012);
95
+ nqm1 = c.nq;
96
+ exm1 = exsm;
97
+ }
98
+
99
+ let rh1it = 2. * rh1;
100
+ const pdh = c.pdnorm * Math.abs(c.h);
101
+ if ((pdh * rh1) > 0.00001)
102
+ rh1it = sm1[nqm1] / pdh;
103
+ rh1 = Math.min(rh1, rh1it);
104
+
105
+ const rh2 = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
106
+ if ((rh1 * RATIO) < (5. * rh2)) return;
107
+
108
+ const alpha = Math.max(0.001, rh1);
109
+ dm1 *= Math.pow(alpha, exm1);
110
+ if (dm1 <= 1000. * ETA * pnorm) return;
111
+
112
+ // Switch to Adams
113
+ out.rh = rh1;
114
+ c.icount = 20;
115
+ c.meth = 1;
116
+ c.miter = 0;
117
+ c.pdlast = 0.;
118
+ c.nq = nqm1;
119
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+ import { sm1 } from './common';
13
+ import { vmnorm } from './blas';
14
+ /**
15
+ * Decide whether to change the order and/or step size.
16
+ * Returns orderflag: 0 = no change, 1 = change h only, 2 = change both h and nq.
17
+ */
18
+ export function orderswitch(ctx, rhup, dsm, out, kflag, maxord) {
19
+ const c = ctx.common;
20
+ const neq = ctx.neq;
21
+ const exsm = 1. / (c.nq + 1);
22
+ let rhsm = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
23
+ let rhdn = 0.;
24
+ if (c.nq !== 1) {
25
+ const ddn = vmnorm(neq, c.yh[c.nq + 1], c.ewt) / c.tesco[c.nq][1];
26
+ const exdn = 1. / c.nq;
27
+ rhdn = 1. / (1.3 * Math.pow(ddn, exdn) + 0.0000013);
28
+ }
29
+ // If meth = 1, limit rh according to stability region
30
+ if (c.meth === 1) {
31
+ const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
32
+ if (c.nq + 1 < maxord + 1)
33
+ rhup = Math.min(rhup, sm1[c.nq + 1] / pdh);
34
+ rhsm = Math.min(rhsm, sm1[c.nq] / pdh);
35
+ if (c.nq > 1)
36
+ rhdn = Math.min(rhdn, sm1[c.nq - 1] / pdh);
37
+ c.pdest = 0.;
38
+ }
39
+ let newq;
40
+ if (rhsm >= rhup) {
41
+ if (rhsm >= rhdn) {
42
+ newq = c.nq;
43
+ out.rh = rhsm;
44
+ }
45
+ else {
46
+ newq = c.nq - 1;
47
+ out.rh = rhdn;
48
+ if (kflag < 0 && out.rh > 1.)
49
+ out.rh = 1.;
50
+ }
51
+ }
52
+ else {
53
+ if (rhup <= rhdn) {
54
+ newq = c.nq - 1;
55
+ out.rh = rhdn;
56
+ if (kflag < 0 && out.rh > 1.)
57
+ out.rh = 1.;
58
+ }
59
+ else {
60
+ out.rh = rhup;
61
+ if (out.rh >= 1.1) {
62
+ const r = c.el[c.nq + 1] / (c.nq + 1);
63
+ c.nq = c.nq + 1;
64
+ for (let i = 1; i <= neq; i++)
65
+ c.yh[c.nq + 1][i] = c.acor[i] * r;
66
+ return 2;
67
+ }
68
+ else {
69
+ c.ialth = 3;
70
+ return 0;
71
+ }
72
+ }
73
+ }
74
+ // If meth = 1 and h is restricted by stability, bypass 10% test
75
+ if (c.meth === 1) {
76
+ const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
77
+ if (out.rh * pdh * 1.00001 < sm1[newq]) {
78
+ if (kflag === 0 && out.rh < 1.1) {
79
+ c.ialth = 3;
80
+ return 0;
81
+ }
82
+ }
83
+ }
84
+ else {
85
+ if (kflag === 0 && out.rh < 1.1) {
86
+ c.ialth = 3;
87
+ return 0;
88
+ }
89
+ }
90
+ if (kflag <= -2)
91
+ out.rh = Math.min(out.rh, 0.2);
92
+ if (newq === c.nq)
93
+ return 1;
94
+ c.nq = newq;
95
+ return 2;
96
+ }
97
+ //# sourceMappingURL=orderswitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderswitch.js","sourceRoot":"","sources":["orderswitch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+
13
+ import {LsodaContext, sm1} from './common';
14
+ import {vmnorm} from './blas';
15
+
16
+ /** Mutable rh output */
17
+ export interface OrderSwitchResult {
18
+ rh: number;
19
+ }
20
+
21
+ /**
22
+ * Decide whether to change the order and/or step size.
23
+ * Returns orderflag: 0 = no change, 1 = change h only, 2 = change both h and nq.
24
+ */
25
+ export function orderswitch(
26
+ ctx: LsodaContext, rhup: number, dsm: number,
27
+ out: OrderSwitchResult, kflag: number, maxord: number,
28
+ ): number {
29
+ const c = ctx.common!;
30
+ const neq = ctx.neq;
31
+
32
+ const exsm = 1. / (c.nq + 1);
33
+ let rhsm = 1. / (1.2 * Math.pow(dsm, exsm) + 0.0000012);
34
+
35
+ let rhdn = 0.;
36
+ if (c.nq !== 1) {
37
+ const ddn = vmnorm(neq, c.yh[c.nq + 1], c.ewt) / c.tesco[c.nq][1];
38
+ const exdn = 1. / c.nq;
39
+ rhdn = 1. / (1.3 * Math.pow(ddn, exdn) + 0.0000013);
40
+ }
41
+
42
+ // If meth = 1, limit rh according to stability region
43
+ if (c.meth === 1) {
44
+ const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
45
+ if (c.nq + 1 < maxord + 1)
46
+ rhup = Math.min(rhup, sm1[c.nq + 1] / pdh);
47
+ rhsm = Math.min(rhsm, sm1[c.nq] / pdh);
48
+ if (c.nq > 1)
49
+ rhdn = Math.min(rhdn, sm1[c.nq - 1] / pdh);
50
+ c.pdest = 0.;
51
+ }
52
+
53
+ let newq: number;
54
+ if (rhsm >= rhup) {
55
+ if (rhsm >= rhdn) {
56
+ newq = c.nq;
57
+ out.rh = rhsm;
58
+ } else {
59
+ newq = c.nq - 1;
60
+ out.rh = rhdn;
61
+ if (kflag < 0 && out.rh > 1.) out.rh = 1.;
62
+ }
63
+ } else {
64
+ if (rhup <= rhdn) {
65
+ newq = c.nq - 1;
66
+ out.rh = rhdn;
67
+ if (kflag < 0 && out.rh > 1.) out.rh = 1.;
68
+ } else {
69
+ out.rh = rhup;
70
+ if (out.rh >= 1.1) {
71
+ const r = c.el[c.nq + 1] / (c.nq + 1);
72
+ c.nq = c.nq + 1;
73
+ for (let i = 1; i <= neq; i++)
74
+ c.yh[c.nq + 1][i] = c.acor[i] * r;
75
+ return 2;
76
+ } else {
77
+ c.ialth = 3;
78
+ return 0;
79
+ }
80
+ }
81
+ }
82
+
83
+ // If meth = 1 and h is restricted by stability, bypass 10% test
84
+ if (c.meth === 1) {
85
+ const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
86
+ if (out.rh * pdh * 1.00001 < sm1[newq]) {
87
+ if (kflag === 0 && out.rh < 1.1) {
88
+ c.ialth = 3;
89
+ return 0;
90
+ }
91
+ }
92
+ } else {
93
+ if (kflag === 0 && out.rh < 1.1) {
94
+ c.ialth = 3;
95
+ return 0;
96
+ }
97
+ }
98
+
99
+ if (kflag <= -2)
100
+ out.rh = Math.min(out.rh, 0.2);
101
+
102
+ if (newq === c.nq)
103
+ return 1;
104
+
105
+ c.nq = newq;
106
+ return 2;
107
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+ import { ETA, SQRTETA } from './common';
13
+ import { vmnorm, fnorm, dgefa } from './blas';
14
+ /**
15
+ * Compute and process the matrix P = I - h * el[1] * J,
16
+ * where J is approximated by finite differences.
17
+ * Returns 1 on success, 0 on failure (singular matrix).
18
+ */
19
+ export function prja(ctx, y) {
20
+ const c = ctx.common;
21
+ const neq = ctx.neq;
22
+ c.nje++;
23
+ const hl0 = c.h * c.el[1];
24
+ if (c.miter !== 2) {
25
+ console.error('[prja] miter != 2');
26
+ return 0;
27
+ }
28
+ let fac = vmnorm(neq, c.savf, c.ewt);
29
+ let r0 = 1000. * Math.abs(c.h) * ETA * neq * fac;
30
+ if (r0 === 0.)
31
+ r0 = 1.;
32
+ for (let j = 1; j <= neq; j++) {
33
+ const yj = y[j];
34
+ const r = Math.max(SQRTETA * Math.abs(yj), r0 / c.ewt[j]);
35
+ y[j] += r;
36
+ fac = -hl0 / r;
37
+ ctx.func(c.tn, y.subarray(1), c.acor.subarray(1), ctx.data);
38
+ for (let i = 1; i <= neq; i++)
39
+ c.wm[i][j] = (c.acor[i] - c.savf[i]) * fac;
40
+ y[j] = yj;
41
+ }
42
+ c.nfe += neq;
43
+ // Compute norm of Jacobian
44
+ c.pdnorm = fnorm(neq, c.wm, c.ewt) / Math.abs(hl0);
45
+ // Add identity matrix
46
+ for (let i = 1; i <= neq; i++)
47
+ c.wm[i][i] += 1.;
48
+ // LU decomposition on P
49
+ const ier = dgefa(c.wm, neq, c.ipvt);
50
+ if (ier !== 0)
51
+ return 0;
52
+ return 1;
53
+ }
54
+ //# sourceMappingURL=prja.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prja.js","sourceRoot":"","sources":["prja.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAe,GAAG,EAAE,OAAO,EAAC,MAAM,UAAU,CAAC;AACpD,OAAO,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,QAAQ,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,GAAiB,EAAE,CAAe;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAO,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAEpB,CAAC,CAAC,GAAG,EAAE,CAAC;IACR,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1B,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACjD,IAAI,EAAE,KAAK,EAAE;QAAE,EAAE,GAAG,EAAE,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACV,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;YAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IACD,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;IAEb,2BAA2B;IAC3B,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEnD,sBAAsB;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;QAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEnB,wBAAwB;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAExB,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+
13
+ import {LsodaContext, ETA, SQRTETA} from './common';
14
+ import {vmnorm, fnorm, dgefa} from './blas';
15
+
16
+ /**
17
+ * Compute and process the matrix P = I - h * el[1] * J,
18
+ * where J is approximated by finite differences.
19
+ * Returns 1 on success, 0 on failure (singular matrix).
20
+ */
21
+ export function prja(ctx: LsodaContext, y: Float64Array): number {
22
+ const c = ctx.common!;
23
+ const neq = ctx.neq;
24
+
25
+ c.nje++;
26
+ const hl0 = c.h * c.el[1];
27
+
28
+ if (c.miter !== 2) {
29
+ console.error('[prja] miter != 2');
30
+ return 0;
31
+ }
32
+
33
+ let fac = vmnorm(neq, c.savf, c.ewt);
34
+ let r0 = 1000. * Math.abs(c.h) * ETA * neq * fac;
35
+ if (r0 === 0.) r0 = 1.;
36
+
37
+ for (let j = 1; j <= neq; j++) {
38
+ const yj = y[j];
39
+ const r = Math.max(SQRTETA * Math.abs(yj), r0 / c.ewt[j]);
40
+ y[j] += r;
41
+ fac = -hl0 / r;
42
+ ctx.func(c.tn, y.subarray(1), c.acor.subarray(1), ctx.data);
43
+ for (let i = 1; i <= neq; i++)
44
+ c.wm[i][j] = (c.acor[i] - c.savf[i]) * fac;
45
+ y[j] = yj;
46
+ }
47
+ c.nfe += neq;
48
+
49
+ // Compute norm of Jacobian
50
+ c.pdnorm = fnorm(neq, c.wm, c.ewt) / Math.abs(hl0);
51
+
52
+ // Add identity matrix
53
+ for (let i = 1; i <= neq; i++)
54
+ c.wm[i][i] += 1.;
55
+
56
+ // LU decomposition on P
57
+ const ier = dgefa(c.wm, neq, c.ipvt);
58
+ if (ier !== 0) return 0;
59
+
60
+ return 1;
61
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+ import { sm1 } from './common';
13
+ /**
14
+ * Scale step size. Rescales the yh array when h changes.
15
+ */
16
+ export function scaleh(ctx, rh) {
17
+ const c = ctx.common;
18
+ const neq = ctx.neq;
19
+ const hmxi = ctx.opt.hmxi;
20
+ rh = Math.min(rh, c.rmax);
21
+ rh = rh / Math.max(1., Math.abs(c.h) * hmxi * rh);
22
+ // If meth = 1, restrict by stability region
23
+ if (c.meth === 1) {
24
+ c.irflag = 0;
25
+ const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
26
+ if ((rh * pdh * 1.00001) >= sm1[c.nq]) {
27
+ rh = sm1[c.nq] / pdh;
28
+ c.irflag = 1;
29
+ }
30
+ }
31
+ let r = 1.;
32
+ for (let j = 2; j <= c.nq + 1; j++) {
33
+ r *= rh;
34
+ for (let i = 1; i <= neq; i++)
35
+ c.yh[j][i] *= r;
36
+ }
37
+ c.h *= rh;
38
+ c.rc *= rh;
39
+ c.ialth = c.nq + 1;
40
+ }
41
+ //# sourceMappingURL=scaleh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleh.js","sourceRoot":"","sources":["scaleh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAe,GAAG,EAAC,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,GAAiB,EAAE,EAAU;IAClD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAO,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAI,CAAC,IAAI,CAAC;IAE3B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1B,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAElD,4CAA4C;IAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACjB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACrB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,CAAC,IAAI,EAAE,CAAC;QACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;YAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACV,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACX,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * TypeScript port of liblsoda (https://github.com/sdwfrost/liblsoda)
3
+ * Original LSODA algorithm by Linda Petzold & Alan Hindmarsh (1983)
4
+ *
5
+ * Copyright (c) 2011 Yu Feng, McWilliam Cosmology Center, Carnegie Mellon University
6
+ * Copyright (c) 2016 Simon Frost
7
+ * Copyright (c) 2026 Datagrok
8
+ *
9
+ * Licensed under the MIT License. See THIRD_PARTY_LICENSES for the full
10
+ * license text and provenance chain of the original code.
11
+ */
12
+
13
+ import {LsodaContext, sm1} from './common';
14
+
15
+ /**
16
+ * Scale step size. Rescales the yh array when h changes.
17
+ */
18
+ export function scaleh(ctx: LsodaContext, rh: number): void {
19
+ const c = ctx.common!;
20
+ const neq = ctx.neq;
21
+ const hmxi = ctx.opt!.hmxi;
22
+
23
+ rh = Math.min(rh, c.rmax);
24
+ rh = rh / Math.max(1., Math.abs(c.h) * hmxi * rh);
25
+
26
+ // If meth = 1, restrict by stability region
27
+ if (c.meth === 1) {
28
+ c.irflag = 0;
29
+ const pdh = Math.max(Math.abs(c.h) * c.pdlast, 0.000001);
30
+ if ((rh * pdh * 1.00001) >= sm1[c.nq]) {
31
+ rh = sm1[c.nq] / pdh;
32
+ c.irflag = 1;
33
+ }
34
+ }
35
+
36
+ let r = 1.;
37
+ for (let j = 2; j <= c.nq + 1; j++) {
38
+ r *= rh;
39
+ for (let i = 1; i <= neq; i++)
40
+ c.yh[j][i] *= r;
41
+ }
42
+ c.h *= rh;
43
+ c.rc *= rh;
44
+ c.ialth = c.nq + 1;
45
+ }