diff-grok 1.1.0 → 1.3.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 (487) hide show
  1. package/LICENSE +1 -1
  2. package/README.MD +80 -31
  3. package/dist/index.d.ts +6 -0
  4. package/{index.js → dist/index.js} +2 -1
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/examples/basic-use.d.ts +10 -0
  7. package/dist/src/examples/basic-use.js.map +1 -0
  8. package/dist/src/examples/check-methods.d.ts +1 -0
  9. package/{src → dist/src}/examples/check-methods.js +15 -3
  10. package/dist/src/examples/check-methods.js.map +1 -0
  11. package/dist/src/examples/corr-probs.d.ts +15 -0
  12. package/{src → dist/src}/examples/corr-probs.js +2 -2
  13. package/dist/src/examples/corr-probs.js.map +1 -0
  14. package/dist/src/examples/cyclic-model.d.ts +6 -0
  15. package/dist/src/examples/cyclic-model.js.map +1 -0
  16. package/dist/src/examples/e5.d.ts +15 -0
  17. package/dist/src/examples/e5.js.map +1 -0
  18. package/dist/src/examples/hires.d.ts +15 -0
  19. package/dist/src/examples/hires.js.map +1 -0
  20. package/dist/src/examples/index.d.ts +22 -0
  21. package/dist/src/examples/index.js.map +1 -0
  22. package/dist/src/examples/model-updates.d.ts +6 -0
  23. package/dist/src/examples/model-updates.js.map +1 -0
  24. package/dist/src/examples/orego.d.ts +15 -0
  25. package/dist/src/examples/orego.js.map +1 -0
  26. package/dist/src/examples/pipeline-use.d.ts +6 -0
  27. package/dist/src/examples/pipeline-use.js.map +1 -0
  28. package/dist/src/examples/pollution.d.ts +15 -0
  29. package/dist/src/examples/pollution.js.map +1 -0
  30. package/{src/examples/print-benchmark.ts → dist/src/examples/print-benchmark.d.ts} +8 -58
  31. package/dist/src/examples/print-benchmark.js.map +1 -0
  32. package/dist/src/examples/robertson.d.ts +15 -0
  33. package/{src → dist/src}/examples/robertson.js +2 -2
  34. package/dist/src/examples/robertson.js.map +1 -0
  35. package/dist/src/examples/scripting.d.ts +1 -0
  36. package/dist/src/examples/scripting.js.map +1 -0
  37. package/dist/src/examples/vdpol.d.ts +15 -0
  38. package/dist/src/examples/vdpol.js.map +1 -0
  39. package/dist/src/latex-export/examples/advanced-to-latex.d.ts +2 -0
  40. package/dist/src/latex-export/examples/advanced-to-latex.js +41 -0
  41. package/dist/src/latex-export/examples/advanced-to-latex.js.map +1 -0
  42. package/dist/src/latex-export/examples/basic-to-latex.d.ts +2 -0
  43. package/dist/src/latex-export/examples/basic-to-latex.js +17 -0
  44. package/dist/src/latex-export/examples/basic-to-latex.js.map +1 -0
  45. package/dist/src/latex-export/examples/bioreactor-to-latex-selective.d.ts +2 -0
  46. package/dist/src/latex-export/examples/bioreactor-to-latex-selective.js +145 -0
  47. package/dist/src/latex-export/examples/bioreactor-to-latex-selective.js.map +1 -0
  48. package/dist/src/latex-export/examples/chem-react-to-latex-no-cdot.d.ts +2 -0
  49. package/dist/src/latex-export/examples/chem-react-to-latex-no-cdot.js +41 -0
  50. package/dist/src/latex-export/examples/chem-react-to-latex-no-cdot.js.map +1 -0
  51. package/dist/src/latex-export/examples/energy-n-control-to-markdown.d.ts +2 -0
  52. package/dist/src/latex-export/examples/energy-n-control-to-markdown.js +58 -0
  53. package/dist/src/latex-export/examples/energy-n-control-to-markdown.js.map +1 -0
  54. package/dist/src/latex-export/examples/extended-to-markdown.d.ts +2 -0
  55. package/dist/src/latex-export/examples/extended-to-markdown.js +37 -0
  56. package/dist/src/latex-export/examples/extended-to-markdown.js.map +1 -0
  57. package/dist/src/latex-export/examples/fermentation-to-latex.d.ts +2 -0
  58. package/dist/src/latex-export/examples/fermentation-to-latex.js +32 -0
  59. package/dist/src/latex-export/examples/fermentation-to-latex.js.map +1 -0
  60. package/dist/src/latex-export/examples/ga-production-to-markdown.d.ts +2 -0
  61. package/dist/src/latex-export/examples/ga-production-to-markdown.js +58 -0
  62. package/dist/src/latex-export/examples/ga-production-to-markdown.js.map +1 -0
  63. package/dist/src/latex-export/examples/nimotuzumab-to-latex.d.ts +2 -0
  64. package/dist/src/latex-export/examples/nimotuzumab-to-latex.js +53 -0
  65. package/dist/src/latex-export/examples/nimotuzumab-to-latex.js.map +1 -0
  66. package/dist/src/latex-export/examples/pk-pd-to-markdown-minimal.d.ts +2 -0
  67. package/dist/src/latex-export/examples/pk-pd-to-markdown-minimal.js +50 -0
  68. package/dist/src/latex-export/examples/pk-pd-to-markdown-minimal.js.map +1 -0
  69. package/dist/src/latex-export/examples/pk-to-markdown.d.ts +2 -0
  70. package/dist/src/latex-export/examples/pk-to-markdown.js +35 -0
  71. package/dist/src/latex-export/examples/pk-to-markdown.js.map +1 -0
  72. package/dist/src/latex-export/examples/pollution-to-latex.d.ts +2 -0
  73. package/dist/src/latex-export/examples/pollution-to-latex.js +141 -0
  74. package/dist/src/latex-export/examples/pollution-to-latex.js.map +1 -0
  75. package/dist/src/latex-export/examples/robertson-to-latex-no-meta.d.ts +2 -0
  76. package/dist/src/latex-export/examples/robertson-to-latex-no-meta.js +25 -0
  77. package/dist/src/latex-export/examples/robertson-to-latex-no-meta.js.map +1 -0
  78. package/dist/src/latex-export/generator/bracket-manager.d.ts +19 -0
  79. package/dist/src/latex-export/generator/bracket-manager.js +58 -0
  80. package/dist/src/latex-export/generator/bracket-manager.js.map +1 -0
  81. package/dist/src/latex-export/generator/document-builder.d.ts +13 -0
  82. package/dist/src/latex-export/generator/document-builder.js +433 -0
  83. package/dist/src/latex-export/generator/document-builder.js.map +1 -0
  84. package/dist/src/latex-export/generator/latex-generator.d.ts +23 -0
  85. package/dist/src/latex-export/generator/latex-generator.js +176 -0
  86. package/dist/src/latex-export/generator/latex-generator.js.map +1 -0
  87. package/dist/src/latex-export/index.d.ts +8 -0
  88. package/dist/src/latex-export/index.js +25 -0
  89. package/dist/src/latex-export/index.js.map +1 -0
  90. package/dist/src/latex-export/output/md-formatter.d.ts +16 -0
  91. package/dist/src/latex-export/output/md-formatter.js +27 -0
  92. package/dist/src/latex-export/output/md-formatter.js.map +1 -0
  93. package/dist/src/latex-export/output/tex-formatter.d.ts +5 -0
  94. package/dist/src/latex-export/output/tex-formatter.js +20 -0
  95. package/dist/src/latex-export/output/tex-formatter.js.map +1 -0
  96. package/dist/src/latex-export/parser/ast-parser.d.ts +7 -0
  97. package/dist/src/latex-export/parser/ast-parser.js +153 -0
  98. package/dist/src/latex-export/parser/ast-parser.js.map +1 -0
  99. package/dist/src/latex-export/parser/ivp-parser.d.ts +6 -0
  100. package/dist/src/latex-export/parser/ivp-parser.js +219 -0
  101. package/dist/src/latex-export/parser/ivp-parser.js.map +1 -0
  102. package/dist/src/latex-export/parser/line-joiner.d.ts +25 -0
  103. package/dist/src/latex-export/parser/line-joiner.js +80 -0
  104. package/dist/src/latex-export/parser/line-joiner.js.map +1 -0
  105. package/dist/src/latex-export/parser/tokenizer.d.ts +7 -0
  106. package/dist/src/latex-export/parser/tokenizer.js +143 -0
  107. package/dist/src/latex-export/parser/tokenizer.js.map +1 -0
  108. package/dist/src/latex-export/transformer/functions.d.ts +12 -0
  109. package/dist/src/latex-export/transformer/functions.js +47 -0
  110. package/dist/src/latex-export/transformer/functions.js.map +1 -0
  111. package/dist/src/latex-export/transformer/identifier.d.ts +23 -0
  112. package/dist/src/latex-export/transformer/identifier.js +194 -0
  113. package/dist/src/latex-export/transformer/identifier.js.map +1 -0
  114. package/dist/src/latex-export/transformer/operators.d.ts +9 -0
  115. package/dist/src/latex-export/transformer/operators.js +41 -0
  116. package/dist/src/latex-export/transformer/operators.js.map +1 -0
  117. package/dist/src/latex-export/types.d.ts +122 -0
  118. package/dist/src/latex-export/types.js +10 -0
  119. package/dist/src/latex-export/types.js.map +1 -0
  120. package/{src/pipeline/basic-pipeline-creator.ts → dist/src/pipeline/basic-pipeline-creator.d.ts} +11 -28
  121. package/dist/src/pipeline/basic-pipeline-creator.js.map +1 -0
  122. package/dist/src/pipeline/constants.d.ts +14 -0
  123. package/dist/src/pipeline/constants.js.map +1 -0
  124. package/dist/src/pipeline/index.d.ts +7 -0
  125. package/dist/src/pipeline/index.js.map +1 -0
  126. package/dist/src/pipeline/input.d.ts +3 -0
  127. package/dist/src/pipeline/input.js.map +1 -0
  128. package/dist/src/pipeline/loops-pipeline-creator.d.ts +124 -0
  129. package/dist/src/pipeline/loops-pipeline-creator.js.map +1 -0
  130. package/dist/src/pipeline/output.d.ts +10 -0
  131. package/{src → dist/src}/pipeline/output.js +1 -1
  132. package/dist/src/pipeline/output.js.map +1 -0
  133. package/dist/src/pipeline/pipeline-creator.d.ts +12 -0
  134. package/{src → dist/src}/pipeline/pipeline-creator.js +2 -0
  135. package/dist/src/pipeline/pipeline-creator.js.map +1 -0
  136. package/{src/pipeline/pipeline.ts → dist/src/pipeline/pipeline.d.ts} +10 -97
  137. package/dist/src/pipeline/pipeline.js.map +1 -0
  138. package/{src/pipeline/updates-pipeline-creator.ts → dist/src/pipeline/updates-pipeline-creator.d.ts} +15 -131
  139. package/dist/src/pipeline/updates-pipeline-creator.js.map +1 -0
  140. package/dist/src/scripting-tools/constants.d.ts +59 -0
  141. package/dist/src/scripting-tools/constants.js.map +1 -0
  142. package/dist/src/scripting-tools/index.d.ts +3 -0
  143. package/dist/src/scripting-tools/index.js.map +1 -0
  144. package/dist/src/scripting-tools/model-error.d.ts +10 -0
  145. package/{src → dist/src}/scripting-tools/model-error.js +2 -1
  146. package/dist/src/scripting-tools/model-error.js.map +1 -0
  147. package/dist/src/scripting-tools/scripting-tools.d.ts +277 -0
  148. package/{src → dist/src}/scripting-tools/scripting-tools.js +2 -4
  149. package/dist/src/scripting-tools/scripting-tools.js.map +1 -0
  150. package/dist/src/solver-tools/ab4-method.d.ts +46 -0
  151. package/{src → dist/src}/solver-tools/ab4-method.js +3 -3
  152. package/dist/src/solver-tools/ab4-method.js.map +1 -0
  153. package/dist/src/solver-tools/ab5-method.d.ts +46 -0
  154. package/{src → dist/src}/solver-tools/ab5-method.js +3 -3
  155. package/dist/src/solver-tools/ab5-method.js.map +1 -0
  156. package/dist/src/solver-tools/callbacks/callback-base.d.ts +8 -0
  157. package/dist/src/solver-tools/callbacks/callback-base.js.map +1 -0
  158. package/dist/src/solver-tools/callbacks/callback-tools.d.ts +6 -0
  159. package/dist/src/solver-tools/callbacks/callback-tools.js.map +1 -0
  160. package/dist/src/solver-tools/callbacks/iter-checker-callback.d.ts +12 -0
  161. package/{src → dist/src}/solver-tools/callbacks/iter-checker-callback.js +2 -0
  162. package/dist/src/solver-tools/callbacks/iter-checker-callback.js.map +1 -0
  163. package/dist/src/solver-tools/callbacks/time-checker-callback.d.ts +12 -0
  164. package/{src → dist/src}/solver-tools/callbacks/time-checker-callback.js +2 -2
  165. package/dist/src/solver-tools/callbacks/time-checker-callback.js.map +1 -0
  166. package/dist/src/solver-tools/cvode/common.d.ts +395 -0
  167. package/dist/src/solver-tools/cvode/common.js +483 -0
  168. package/dist/src/solver-tools/cvode/common.js.map +1 -0
  169. package/dist/src/solver-tools/cvode/cvode.d.ts +23 -0
  170. package/dist/src/solver-tools/cvode/cvode.js +1062 -0
  171. package/dist/src/solver-tools/cvode/cvode.js.map +1 -0
  172. package/dist/src/solver-tools/cvode/cvode_adams.d.ts +22 -0
  173. package/dist/src/solver-tools/cvode/cvode_adams.js +124 -0
  174. package/dist/src/solver-tools/cvode/cvode_adams.js.map +1 -0
  175. package/dist/src/solver-tools/cvode/cvode_bdf.d.ts +37 -0
  176. package/dist/src/solver-tools/cvode/cvode_bdf.js +153 -0
  177. package/dist/src/solver-tools/cvode/cvode_bdf.js.map +1 -0
  178. package/dist/src/solver-tools/cvode/cvode_class.d.ts +116 -0
  179. package/dist/src/solver-tools/cvode/cvode_class.js +163 -0
  180. package/dist/src/solver-tools/cvode/cvode_class.js.map +1 -0
  181. package/dist/src/solver-tools/cvode/cvode_hin.d.ts +24 -0
  182. package/dist/src/solver-tools/cvode/cvode_hin.js +119 -0
  183. package/dist/src/solver-tools/cvode/cvode_hin.js.map +1 -0
  184. package/dist/src/solver-tools/cvode/cvode_io.d.ts +98 -0
  185. package/dist/src/solver-tools/cvode/cvode_io.js +202 -0
  186. package/dist/src/solver-tools/cvode/cvode_io.js.map +1 -0
  187. package/dist/src/solver-tools/cvode/cvode_ls.d.ts +23 -0
  188. package/dist/src/solver-tools/cvode/cvode_ls.js +210 -0
  189. package/dist/src/solver-tools/cvode/cvode_ls.js.map +1 -0
  190. package/dist/src/solver-tools/cvode/cvode_nls.d.ts +25 -0
  191. package/dist/src/solver-tools/cvode/cvode_nls.js +220 -0
  192. package/dist/src/solver-tools/cvode/cvode_nls.js.map +1 -0
  193. package/dist/src/solver-tools/cvode/cvode_root.d.ts +64 -0
  194. package/dist/src/solver-tools/cvode/cvode_root.js +415 -0
  195. package/dist/src/solver-tools/cvode/cvode_root.js.map +1 -0
  196. package/dist/src/solver-tools/cvode/dense_linalg.d.ts +50 -0
  197. package/dist/src/solver-tools/cvode/dense_linalg.js +131 -0
  198. package/dist/src/solver-tools/cvode/dense_linalg.js.map +1 -0
  199. package/dist/src/solver-tools/cvode/index.d.ts +24 -0
  200. package/dist/src/solver-tools/cvode/index.js +26 -0
  201. package/dist/src/solver-tools/cvode/index.js.map +1 -0
  202. package/dist/src/solver-tools/cvode-method.d.ts +47 -0
  203. package/dist/src/solver-tools/cvode-method.js +114 -0
  204. package/dist/src/solver-tools/cvode-method.js.map +1 -0
  205. package/dist/src/solver-tools/index.d.ts +16 -0
  206. package/{src → dist/src}/solver-tools/index.js +1 -0
  207. package/dist/src/solver-tools/index.js.map +1 -0
  208. package/dist/src/solver-tools/lin-alg-tools.d.ts +6 -0
  209. package/dist/src/solver-tools/lin-alg-tools.js.map +1 -0
  210. package/dist/src/solver-tools/lsoda/blas.d.ts +59 -0
  211. package/{src → dist/src}/solver-tools/lsoda/blas.js +11 -0
  212. package/dist/src/solver-tools/lsoda/blas.js.map +1 -0
  213. package/dist/src/solver-tools/lsoda/cfode.d.ts +18 -0
  214. package/{src → dist/src}/solver-tools/lsoda/cfode.js +11 -0
  215. package/dist/src/solver-tools/lsoda/cfode.js.map +1 -0
  216. package/dist/src/solver-tools/lsoda/common.d.ts +85 -0
  217. package/dist/src/solver-tools/lsoda/common.js +96 -0
  218. package/dist/src/solver-tools/lsoda/common.js.map +1 -0
  219. package/dist/src/solver-tools/lsoda/corfailure.d.ts +18 -0
  220. package/{src → dist/src}/solver-tools/lsoda/corfailure.js +11 -0
  221. package/dist/src/solver-tools/lsoda/corfailure.js.map +1 -0
  222. package/dist/src/solver-tools/lsoda/correction.d.ts +23 -0
  223. package/{src → dist/src}/solver-tools/lsoda/correction.js +11 -0
  224. package/dist/src/solver-tools/lsoda/correction.js.map +1 -0
  225. package/dist/src/solver-tools/lsoda/dense.d.ts +47 -0
  226. package/{src → dist/src}/solver-tools/lsoda/dense.js +13 -0
  227. package/dist/src/solver-tools/lsoda/dense.js.map +1 -0
  228. package/dist/src/solver-tools/lsoda/index.d.ts +16 -0
  229. package/dist/src/solver-tools/lsoda/index.js +15 -0
  230. package/dist/src/solver-tools/lsoda/index.js.map +1 -0
  231. package/dist/src/solver-tools/lsoda/intdy.d.ts +19 -0
  232. package/{src → dist/src}/solver-tools/lsoda/intdy.js +11 -0
  233. package/dist/src/solver-tools/lsoda/intdy.js.map +1 -0
  234. package/dist/src/solver-tools/lsoda/lsoda.d.ts +66 -0
  235. package/{src → dist/src}/solver-tools/lsoda/lsoda.js +24 -5
  236. package/dist/src/solver-tools/lsoda/lsoda.js.map +1 -0
  237. package/dist/src/solver-tools/lsoda/methodswitch.d.ts +21 -0
  238. package/{src → dist/src}/solver-tools/lsoda/methodswitch.js +11 -0
  239. package/dist/src/solver-tools/lsoda/methodswitch.js.map +1 -0
  240. package/dist/src/solver-tools/lsoda/orderswitch.d.ts +21 -0
  241. package/{src → dist/src}/solver-tools/lsoda/orderswitch.js +11 -0
  242. package/dist/src/solver-tools/lsoda/orderswitch.js.map +1 -0
  243. package/dist/src/solver-tools/lsoda/prja.d.ts +18 -0
  244. package/{src → dist/src}/solver-tools/lsoda/prja.js +11 -0
  245. package/dist/src/solver-tools/lsoda/prja.js.map +1 -0
  246. package/dist/src/solver-tools/lsoda/scaleh.d.ts +16 -0
  247. package/{src → dist/src}/solver-tools/lsoda/scaleh.js +11 -0
  248. package/dist/src/solver-tools/lsoda/scaleh.js.map +1 -0
  249. package/dist/src/solver-tools/lsoda/solsy.d.ts +17 -0
  250. package/dist/src/solver-tools/lsoda/solsy.js +25 -0
  251. package/dist/src/solver-tools/lsoda/solsy.js.map +1 -0
  252. package/dist/src/solver-tools/lsoda/stoda.d.ts +19 -0
  253. package/{src → dist/src}/solver-tools/lsoda/stoda.js +11 -0
  254. package/dist/src/solver-tools/lsoda/stoda.js.map +1 -0
  255. package/dist/src/solver-tools/lsoda-method.d.ts +46 -0
  256. package/{src → dist/src}/solver-tools/lsoda-method.js +23 -9
  257. package/dist/src/solver-tools/lsoda-method.js.map +1 -0
  258. package/dist/src/solver-tools/mrt-method.d.ts +47 -0
  259. package/{src → dist/src}/solver-tools/mrt-method.js +2 -2
  260. package/dist/src/solver-tools/mrt-method.js.map +1 -0
  261. package/dist/src/solver-tools/rk3-method.d.ts +46 -0
  262. package/{src → dist/src}/solver-tools/rk3-method.js +2 -2
  263. package/dist/src/solver-tools/rk3-method.js.map +1 -0
  264. package/dist/src/solver-tools/rk4-method.d.ts +46 -0
  265. package/{src → dist/src}/solver-tools/rk4-method.js +2 -2
  266. package/dist/src/solver-tools/rk4-method.js.map +1 -0
  267. package/dist/src/solver-tools/rkdp-method.d.ts +46 -0
  268. package/{src → dist/src}/solver-tools/rkdp-method.js +2 -2
  269. package/dist/src/solver-tools/rkdp-method.js.map +1 -0
  270. package/dist/src/solver-tools/ros34prw-method.d.ts +46 -0
  271. package/{src → dist/src}/solver-tools/ros34prw-method.js +2 -2
  272. package/dist/src/solver-tools/ros34prw-method.js.map +1 -0
  273. package/dist/src/solver-tools/ros3prw-method.d.ts +46 -0
  274. package/{src → dist/src}/solver-tools/ros3prw-method.js +2 -2
  275. package/dist/src/solver-tools/ros3prw-method.js.map +1 -0
  276. package/{src/solver-tools/solver-defs.ts → dist/src/solver-tools/solver-defs.d.ts} +45 -84
  277. package/{src → dist/src}/solver-tools/solver-defs.js +1 -0
  278. package/dist/src/solver-tools/solver-defs.js.map +1 -0
  279. package/dist/src/worker-tools/index.d.ts +2 -0
  280. package/dist/src/worker-tools/index.js.map +1 -0
  281. package/{src/worker-tools/scripting.ts → dist/src/worker-tools/scripting.d.ts} +9 -91
  282. package/dist/src/worker-tools/scripting.js.map +1 -0
  283. package/dist/src/worker-tools/solving.d.ts +7 -0
  284. package/{src → dist/src}/worker-tools/solving.js +3 -1
  285. package/dist/src/worker-tools/solving.js.map +1 -0
  286. package/package.json +13 -12
  287. package/.claude/settings.local.json +0 -11
  288. package/.eslintrc.json +0 -45
  289. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -29
  290. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  291. package/.github/PULL_REQUEST_TEMPLATE.md +0 -22
  292. package/.github/scripts/bump-js-api-version.sh +0 -106
  293. package/.github/scripts/check-output.sh +0 -20
  294. package/.github/scripts/iac-cfn-deploy.sh +0 -90
  295. package/.github/scripts/slack_api_request.sh +0 -65
  296. package/.github/scripts/test_package.sh +0 -270
  297. package/.github/workflows/deploy-docs.yml +0 -15
  298. package/.github/workflows/libraries.yaml +0 -305
  299. package/.github/workflows/test.yaml +0 -19
  300. package/CLAUDE.md +0 -98
  301. package/CONTRIBUTING.md +0 -74
  302. package/eslintrc.json +0 -45
  303. package/images/E5.png +0 -0
  304. package/images/HIRES.png +0 -0
  305. package/images/OREGO.png +0 -0
  306. package/images/POLL-full.png +0 -0
  307. package/images/POLL.png +0 -0
  308. package/images/ROBER.png +0 -0
  309. package/images/VDP0L.png +0 -0
  310. package/images/VDPOL.png +0 -0
  311. package/images/acid-prod.gif +0 -0
  312. package/index.js.map +0 -1
  313. package/index.ts +0 -17
  314. package/jest.config.js +0 -13
  315. package/src/examples/basic-use.js.map +0 -1
  316. package/src/examples/basic-use.ts +0 -44
  317. package/src/examples/bioreactor.js +0 -125
  318. package/src/examples/bioreactor.js.map +0 -1
  319. package/src/examples/bioreactor.ts +0 -132
  320. package/src/examples/check-methods.js.map +0 -1
  321. package/src/examples/check-methods.ts +0 -81
  322. package/src/examples/corr-probs.js.map +0 -1
  323. package/src/examples/corr-probs.ts +0 -155
  324. package/src/examples/cyclic-model.js.map +0 -1
  325. package/src/examples/cyclic-model.ts +0 -112
  326. package/src/examples/e5.js.map +0 -1
  327. package/src/examples/e5.ts +0 -36
  328. package/src/examples/hires.js.map +0 -1
  329. package/src/examples/hires.ts +0 -40
  330. package/src/examples/index.js.map +0 -1
  331. package/src/examples/index.ts +0 -34
  332. package/src/examples/model-updates.js.map +0 -1
  333. package/src/examples/model-updates.ts +0 -122
  334. package/src/examples/orego.js.map +0 -1
  335. package/src/examples/orego.ts +0 -25
  336. package/src/examples/pipeline-use.js.map +0 -1
  337. package/src/examples/pipeline-use.ts +0 -98
  338. package/src/examples/pollution.js.map +0 -1
  339. package/src/examples/pollution.ts +0 -133
  340. package/src/examples/print-benchmark.js.map +0 -1
  341. package/src/examples/robertson.js.map +0 -1
  342. package/src/examples/robertson.ts +0 -19
  343. package/src/examples/scripting.js.map +0 -1
  344. package/src/examples/scripting.ts +0 -35
  345. package/src/examples/vdpol.js.map +0 -1
  346. package/src/examples/vdpol.ts +0 -17
  347. package/src/pipeline/basic-pipeline-creator.js.map +0 -1
  348. package/src/pipeline/constants.js.map +0 -1
  349. package/src/pipeline/constants.ts +0 -21
  350. package/src/pipeline/index.js.map +0 -1
  351. package/src/pipeline/index.ts +0 -7
  352. package/src/pipeline/input.js.map +0 -1
  353. package/src/pipeline/input.ts +0 -55
  354. package/src/pipeline/loops-pipeline-creator.js.map +0 -1
  355. package/src/pipeline/loops-pipeline-creator.ts +0 -252
  356. package/src/pipeline/output.js.map +0 -1
  357. package/src/pipeline/output.ts +0 -201
  358. package/src/pipeline/pipeline-creator.js.map +0 -1
  359. package/src/pipeline/pipeline-creator.ts +0 -20
  360. package/src/pipeline/pipeline.js.map +0 -1
  361. package/src/pipeline/updates-pipeline-creator.js.map +0 -1
  362. package/src/scripting-tools/constants.js.map +0 -1
  363. package/src/scripting-tools/constants.ts +0 -69
  364. package/src/scripting-tools/index.js.map +0 -1
  365. package/src/scripting-tools/index.ts +0 -8
  366. package/src/scripting-tools/model-error.js.map +0 -1
  367. package/src/scripting-tools/model-error.ts +0 -21
  368. package/src/scripting-tools/scripting-tools.js.map +0 -1
  369. package/src/scripting-tools/scripting-tools.ts +0 -1582
  370. package/src/solver-tools/ab4-method.js.map +0 -1
  371. package/src/solver-tools/ab4-method.ts +0 -395
  372. package/src/solver-tools/ab5-method.js.map +0 -1
  373. package/src/solver-tools/ab5-method.ts +0 -397
  374. package/src/solver-tools/callbacks/callback-base.js.map +0 -1
  375. package/src/solver-tools/callbacks/callback-base.ts +0 -12
  376. package/src/solver-tools/callbacks/callback-tools.js.map +0 -1
  377. package/src/solver-tools/callbacks/callback-tools.ts +0 -22
  378. package/src/solver-tools/callbacks/iter-checker-callback.js.map +0 -1
  379. package/src/solver-tools/callbacks/iter-checker-callback.ts +0 -25
  380. package/src/solver-tools/callbacks/time-checker-callback.js.map +0 -1
  381. package/src/solver-tools/callbacks/time-checker-callback.ts +0 -23
  382. package/src/solver-tools/index.js.map +0 -1
  383. package/src/solver-tools/index.ts +0 -15
  384. package/src/solver-tools/lin-alg-tools.js.map +0 -1
  385. package/src/solver-tools/lin-alg-tools.ts +0 -75
  386. package/src/solver-tools/lsoda/blas.js.map +0 -1
  387. package/src/solver-tools/lsoda/blas.ts +0 -267
  388. package/src/solver-tools/lsoda/cfode.js.map +0 -1
  389. package/src/solver-tools/lsoda/cfode.ts +0 -83
  390. package/src/solver-tools/lsoda/common.js +0 -94
  391. package/src/solver-tools/lsoda/common.js.map +0 -1
  392. package/src/solver-tools/lsoda/common.ts +0 -135
  393. package/src/solver-tools/lsoda/corfailure.js.map +0 -1
  394. package/src/solver-tools/lsoda/corfailure.ts +0 -30
  395. package/src/solver-tools/lsoda/correction.js.map +0 -1
  396. package/src/solver-tools/lsoda/correction.ts +0 -119
  397. package/src/solver-tools/lsoda/dense.js.map +0 -1
  398. package/src/solver-tools/lsoda/dense.ts +0 -129
  399. package/src/solver-tools/lsoda/index.js +0 -4
  400. package/src/solver-tools/lsoda/index.js.map +0 -1
  401. package/src/solver-tools/lsoda/index.ts +0 -5
  402. package/src/solver-tools/lsoda/intdy.js.map +0 -1
  403. package/src/solver-tools/lsoda/intdy.ts +0 -50
  404. package/src/solver-tools/lsoda/lsoda.js.map +0 -1
  405. package/src/solver-tools/lsoda/lsoda.ts +0 -632
  406. package/src/solver-tools/lsoda/methodswitch.js.map +0 -1
  407. package/src/solver-tools/lsoda/methodswitch.ts +0 -107
  408. package/src/solver-tools/lsoda/orderswitch.js.map +0 -1
  409. package/src/solver-tools/lsoda/orderswitch.ts +0 -95
  410. package/src/solver-tools/lsoda/prja.js.map +0 -1
  411. package/src/solver-tools/lsoda/prja.ts +0 -49
  412. package/src/solver-tools/lsoda/scaleh.js.map +0 -1
  413. package/src/solver-tools/lsoda/scaleh.ts +0 -33
  414. package/src/solver-tools/lsoda/solsy.js +0 -14
  415. package/src/solver-tools/lsoda/solsy.js.map +0 -1
  416. package/src/solver-tools/lsoda/solsy.ts +0 -18
  417. package/src/solver-tools/lsoda/stoda.js.map +0 -1
  418. package/src/solver-tools/lsoda/stoda.ts +0 -286
  419. package/src/solver-tools/lsoda-method.js.map +0 -1
  420. package/src/solver-tools/lsoda-method.ts +0 -136
  421. package/src/solver-tools/mrt-method.js.map +0 -1
  422. package/src/solver-tools/mrt-method.ts +0 -398
  423. package/src/solver-tools/rk3-method.js.map +0 -1
  424. package/src/solver-tools/rk3-method.ts +0 -257
  425. package/src/solver-tools/rk4-method.js.map +0 -1
  426. package/src/solver-tools/rk4-method.ts +0 -286
  427. package/src/solver-tools/rkdp-method.js.map +0 -1
  428. package/src/solver-tools/rkdp-method.ts +0 -300
  429. package/src/solver-tools/ros34prw-method.js.map +0 -1
  430. package/src/solver-tools/ros34prw-method.ts +0 -373
  431. package/src/solver-tools/ros3prw-method.js.map +0 -1
  432. package/src/solver-tools/ros3prw-method.ts +0 -342
  433. package/src/solver-tools/solver-defs.js.map +0 -1
  434. package/src/tests/correctness.test.js +0 -15
  435. package/src/tests/correctness.test.js.map +0 -1
  436. package/src/tests/correctness.test.ts +0 -16
  437. package/src/tests/lsoda-lib-correctness.test.js +0 -223
  438. package/src/tests/lsoda-lib-correctness.test.js.map +0 -1
  439. package/src/tests/lsoda-lib-correctness.test.ts +0 -283
  440. package/src/tests/lsoda-lib-performance.test.js +0 -95
  441. package/src/tests/lsoda-lib-performance.test.js.map +0 -1
  442. package/src/tests/lsoda-lib-performance.test.ts +0 -126
  443. package/src/tests/performance.test.js +0 -16
  444. package/src/tests/performance.test.js.map +0 -1
  445. package/src/tests/performance.test.ts +0 -17
  446. package/src/tests/pipeline.test.js +0 -10
  447. package/src/tests/pipeline.test.js.map +0 -1
  448. package/src/tests/pipeline.test.ts +0 -11
  449. package/src/tests/test-defs.js +0 -207
  450. package/src/tests/test-defs.js.map +0 -1
  451. package/src/tests/test-defs.ts +0 -225
  452. package/src/tests/test-utils.js +0 -28
  453. package/src/tests/test-utils.js.map +0 -1
  454. package/src/tests/test-utils.ts +0 -37
  455. package/src/worker-tools/index.js.map +0 -1
  456. package/src/worker-tools/index.ts +0 -2
  457. package/src/worker-tools/scripting.js.map +0 -1
  458. package/src/worker-tools/solving.js.map +0 -1
  459. package/src/worker-tools/solving.ts +0 -83
  460. package/tsconfig.json +0 -71
  461. package/typedoc.json +0 -8
  462. /package/{src → dist/src}/examples/basic-use.js +0 -0
  463. /package/{src → dist/src}/examples/cyclic-model.js +0 -0
  464. /package/{src → dist/src}/examples/e5.js +0 -0
  465. /package/{src → dist/src}/examples/hires.js +0 -0
  466. /package/{src → dist/src}/examples/index.js +0 -0
  467. /package/{src → dist/src}/examples/model-updates.js +0 -0
  468. /package/{src → dist/src}/examples/orego.js +0 -0
  469. /package/{src → dist/src}/examples/pipeline-use.js +0 -0
  470. /package/{src → dist/src}/examples/pollution.js +0 -0
  471. /package/{src → dist/src}/examples/print-benchmark.js +0 -0
  472. /package/{src → dist/src}/examples/scripting.js +0 -0
  473. /package/{src → dist/src}/examples/vdpol.js +0 -0
  474. /package/{src → dist/src}/pipeline/basic-pipeline-creator.js +0 -0
  475. /package/{src → dist/src}/pipeline/constants.js +0 -0
  476. /package/{src → dist/src}/pipeline/index.js +0 -0
  477. /package/{src → dist/src}/pipeline/input.js +0 -0
  478. /package/{src → dist/src}/pipeline/loops-pipeline-creator.js +0 -0
  479. /package/{src → dist/src}/pipeline/pipeline.js +0 -0
  480. /package/{src → dist/src}/pipeline/updates-pipeline-creator.js +0 -0
  481. /package/{src → dist/src}/scripting-tools/constants.js +0 -0
  482. /package/{src → dist/src}/scripting-tools/index.js +0 -0
  483. /package/{src → dist/src}/solver-tools/callbacks/callback-base.js +0 -0
  484. /package/{src → dist/src}/solver-tools/callbacks/callback-tools.js +0 -0
  485. /package/{src → dist/src}/solver-tools/lin-alg-tools.js +0 -0
  486. /package/{src → dist/src}/worker-tools/index.js +0 -0
  487. /package/{src → dist/src}/worker-tools/scripting.js +0 -0
@@ -0,0 +1,1062 @@
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 TypeScript port - Main integration loop
15
+ // Ported from SUNDIALS CVODE v7.5.0 cvode.c
16
+ import { CvodeMem, CV_ADAMS, CV_BDF, CV_NORMAL, CV_ONE_STEP, CV_SUCCESS, CV_TSTOP_RETURN, CV_ROOT_RETURN, CV_TOO_MUCH_WORK, CV_TOO_MUCH_ACC, CV_ERR_FAILURE, CV_CONV_FAILURE, CV_RHSFUNC_FAIL, CV_FIRST_RHSFUNC_ERR, CV_RTFUNC_FAIL, CV_TOO_CLOSE, CV_LSETUP_FAIL, CV_LSOLVE_FAIL, CV_UNREC_RHSFUNC_ERR, CV_REPTD_RHSFUNC_ERR, CV_LINIT_FAIL, CV_NLS_FAIL, CV_NN, CV_SS, CV_SV, ADAMS_Q_MAX, BDF_Q_MAX, MXNEF1, DO_ERROR_TEST, PREDICT_AGAIN, TRY_AGAIN, FIRST_CALL, PREV_CONV_FAIL, PREV_ERR_FAIL, RHSFUNC_RECVR, SUN_NLS_CONV_RECVR, FUZZ_FACTOR, UROUND, CORTES, ONEPSM, TINY, ADDON, BIAS1, BIAS2, BIAS3, LONG_WAIT, RTFOUND, CLOSERT, wrmsNorm, vScale, cvodeGetDky, } from './common';
17
+ import { cvSetBDF, cvIncreaseBDF, cvDecreaseBDF } from './cvode_bdf';
18
+ import { cvSetAdams, cvAdjustAdams } from './cvode_adams';
19
+ import { cvHin } from './cvode_hin';
20
+ import { cvNls } from './cvode_nls';
21
+ import { cvRcheck1, cvRcheck2, cvRcheck3 } from './cvode_root';
22
+ // ============================================================================
23
+ // PUBLIC EXPORTED FUNCTIONS
24
+ // ============================================================================
25
+ /** cvodeCreate - Create and initialize CvodeMem */
26
+ export function cvodeCreate(lmm) {
27
+ if (lmm !== CV_ADAMS && lmm !== CV_BDF)
28
+ throw new Error('cvodeCreate: bad lmm, must be CV_ADAMS or CV_BDF');
29
+ const maxord = (lmm === CV_ADAMS) ? ADAMS_Q_MAX : BDF_Q_MAX;
30
+ const mem = new CvodeMem();
31
+ mem.cv_lmm = lmm;
32
+ mem.cv_qmax = maxord;
33
+ mem.cv_qmax_alloc = maxord;
34
+ // Initialize ssdat as 6x4 array of zeros (1-based indexing: i=1..5, k=1..3)
35
+ mem.cv_ssdat = [];
36
+ for (let i = 0; i < 6; i++)
37
+ mem.cv_ssdat[i] = [0, 0, 0, 0];
38
+ mem.cv_nlscoef = CORTES;
39
+ return mem;
40
+ }
41
+ /** cvodeInit - Initialize problem */
42
+ export function cvodeInit(mem, f, t0, y0) {
43
+ mem.cv_f = f;
44
+ mem.cv_tn = t0;
45
+ mem.cv_N = y0.length;
46
+ const N = mem.cv_N;
47
+ // Allocate Nordsieck history array: zn[0..qmax_alloc+1]
48
+ const allocQ = mem.cv_qmax_alloc;
49
+ mem.cv_zn = [];
50
+ for (let i = 0; i <= allocQ + 1; i++)
51
+ mem.cv_zn[i] = new Float64Array(N);
52
+ // Allocate work vectors
53
+ mem.cv_ewt = new Float64Array(N);
54
+ mem.cv_acor = new Float64Array(N);
55
+ mem.cv_tempv = new Float64Array(N);
56
+ mem.cv_ftemp = new Float64Array(N);
57
+ mem.cv_vtemp1 = new Float64Array(N);
58
+ mem.cv_vtemp2 = new Float64Array(N);
59
+ mem.cv_vtemp3 = new Float64Array(N);
60
+ mem.cv_y = new Float64Array(N);
61
+ // Copy y0 into zn[0]
62
+ mem.cv_zn[0].set(y0);
63
+ // Set step parameters
64
+ mem.cv_q = 1;
65
+ mem.cv_L = 2;
66
+ mem.cv_qwait = mem.cv_L;
67
+ mem.cv_etamax = mem.cv_eta_max_fs;
68
+ mem.cv_qu = 0;
69
+ mem.cv_hu = 0.0;
70
+ mem.cv_tolsf = 1.0;
71
+ // Reset all counters
72
+ mem.cv_nst = 0;
73
+ mem.cv_nfe = 0;
74
+ mem.cv_ncfn = 0;
75
+ mem.cv_netf = 0;
76
+ mem.cv_nni = 0;
77
+ mem.cv_nnf = 0;
78
+ mem.cv_nsetups = 0;
79
+ mem.cv_nhnil = 0;
80
+ mem.cv_nstlp = 0;
81
+ mem.cv_nscon = 0;
82
+ mem.cv_nge = 0;
83
+ mem.cv_irfnd = 0;
84
+ mem.cv_h0u = 0.0;
85
+ mem.cv_next_h = 0.0;
86
+ mem.cv_next_q = 0;
87
+ // Initialize stability limit detection data
88
+ mem.cv_nor = 0;
89
+ mem.cv_ssdat = [];
90
+ for (let i = 0; i < 6; i++)
91
+ mem.cv_ssdat[i] = [0, 0, 0, 0];
92
+ // Set indx_acor to qmax_alloc (the zn slot used to save acor)
93
+ mem.cv_indx_acor = mem.cv_qmax_alloc;
94
+ mem.cv_MallocDone = true;
95
+ return CV_SUCCESS;
96
+ }
97
+ /** cvode - Main integration loop */
98
+ export function cvode(mem, tout, yout, itask) {
99
+ let istate;
100
+ let troundoff;
101
+ let retval;
102
+ let ier;
103
+ let tret = mem.cv_tn;
104
+ // Check itask
105
+ if (itask !== CV_NORMAL && itask !== CV_ONE_STEP)
106
+ return { flag: -99, t: mem.cv_tn };
107
+ if (itask === CV_NORMAL)
108
+ mem.cv_toutc = tout;
109
+ mem.cv_taskc = itask;
110
+ // --- nst == 0: first step initialization ---
111
+ if (mem.cv_nst === 0) {
112
+ mem.cv_tretlast = tret = mem.cv_tn;
113
+ // Check inputs
114
+ ier = cvInitialSetup(mem);
115
+ if (ier !== CV_SUCCESS)
116
+ return { flag: ier, t: tret };
117
+ // Call f at (t0, y0), set zn[1] = y'(t0)
118
+ retval = mem.cv_f(mem.cv_tn, mem.cv_zn[0], mem.cv_zn[1], mem.cv_user_data);
119
+ mem.cv_nfe++;
120
+ if (retval < 0)
121
+ return { flag: CV_RHSFUNC_FAIL, t: tret };
122
+ if (retval > 0)
123
+ return { flag: CV_FIRST_RHSFUNC_ERR, t: tret };
124
+ // Test tstop legality
125
+ if (mem.cv_tstopset) {
126
+ if ((mem.cv_tstop - mem.cv_tn) * (tout - mem.cv_tn) <= 0.0)
127
+ return { flag: -99, t: tret }; // CV_ILL_INPUT
128
+ }
129
+ // Set initial h
130
+ mem.cv_h = mem.cv_hin;
131
+ if (mem.cv_h !== 0.0 && (tout - mem.cv_tn) * mem.cv_h < 0.0)
132
+ return { flag: -99, t: tret };
133
+ if (mem.cv_h === 0.0) {
134
+ let tout_hin = tout;
135
+ if (mem.cv_tstopset && (tout - mem.cv_tn) * (tout - mem.cv_tstop) > 0.0)
136
+ tout_hin = mem.cv_tstop;
137
+ const hflag = cvHin(mem, tout_hin);
138
+ if (hflag !== CV_SUCCESS) {
139
+ istate = cvHandleFailure(mem, hflag);
140
+ return { flag: istate, t: tret };
141
+ }
142
+ }
143
+ // Enforce hmax and hmin
144
+ const rh = Math.abs(mem.cv_h) * mem.cv_hmax_inv;
145
+ if (rh > 1.0)
146
+ mem.cv_h /= rh;
147
+ if (Math.abs(mem.cv_h) < mem.cv_hmin)
148
+ mem.cv_h *= mem.cv_hmin / Math.abs(mem.cv_h);
149
+ // Check for approach to tstop
150
+ if (mem.cv_tstopset) {
151
+ if ((mem.cv_tn + mem.cv_h - mem.cv_tstop) * mem.cv_h > 0.0)
152
+ mem.cv_h = (mem.cv_tstop - mem.cv_tn) * (1.0 - 4.0 * UROUND);
153
+ }
154
+ // Scale zn[1] by h
155
+ mem.cv_hscale = mem.cv_h;
156
+ mem.cv_h0u = mem.cv_h;
157
+ mem.cv_hprime = mem.cv_h;
158
+ vScale(mem.cv_h, mem.cv_zn[1], mem.cv_zn[1], mem.cv_N);
159
+ // Check for roots at/near t0
160
+ if (mem.cv_nrtfn > 0) {
161
+ retval = cvRcheck1(mem);
162
+ if (retval === CV_RTFUNC_FAIL)
163
+ return { flag: CV_RTFUNC_FAIL, t: tret };
164
+ }
165
+ }
166
+ // --- nst > 0: stop tests ---
167
+ if (mem.cv_nst > 0) {
168
+ troundoff = FUZZ_FACTOR * UROUND *
169
+ (Math.abs(mem.cv_tn) + Math.abs(mem.cv_h));
170
+ // Root check from last step
171
+ if (mem.cv_nrtfn > 0) {
172
+ const irfndp = mem.cv_irfnd;
173
+ retval = cvRcheck2(mem);
174
+ if (retval === CLOSERT)
175
+ return { flag: -99, t: mem.cv_tlo };
176
+ else if (retval === CV_RTFUNC_FAIL)
177
+ return { flag: CV_RTFUNC_FAIL, t: mem.cv_tlo };
178
+ else if (retval === RTFOUND) {
179
+ mem.cv_tretlast = tret = mem.cv_tlo;
180
+ return { flag: CV_ROOT_RETURN, t: tret };
181
+ }
182
+ // If tn is distinct from tretlast, check remaining interval
183
+ if (Math.abs(mem.cv_tn - mem.cv_tretlast) > troundoff) {
184
+ retval = cvRcheck3(mem);
185
+ if (retval === CV_SUCCESS) {
186
+ mem.cv_irfnd = 0;
187
+ if (irfndp === 1 && itask === CV_ONE_STEP) {
188
+ mem.cv_tretlast = tret = mem.cv_tn;
189
+ yout.set(mem.cv_zn[0]);
190
+ return { flag: CV_SUCCESS, t: tret };
191
+ }
192
+ }
193
+ else if (retval === RTFOUND) {
194
+ mem.cv_irfnd = 1;
195
+ mem.cv_tretlast = tret = mem.cv_tlo;
196
+ return { flag: CV_ROOT_RETURN, t: tret };
197
+ }
198
+ else if (retval === CV_RTFUNC_FAIL)
199
+ return { flag: CV_RTFUNC_FAIL, t: mem.cv_tlo };
200
+ }
201
+ }
202
+ // Test for tn at tstop
203
+ if (mem.cv_tstopset) {
204
+ if (Math.abs(mem.cv_tn - mem.cv_tstop) <= troundoff) {
205
+ if ((tout - mem.cv_tstop) * mem.cv_h >= 0.0 ||
206
+ Math.abs(tout - mem.cv_tstop) <= troundoff) {
207
+ if (mem.cv_tstopinterp)
208
+ cvodeGetDky(mem, mem.cv_tstop, 0, yout);
209
+ else
210
+ yout.set(mem.cv_zn[0]);
211
+ mem.cv_tretlast = tret = mem.cv_tstop;
212
+ mem.cv_tstopset = false;
213
+ return { flag: CV_TSTOP_RETURN, t: tret };
214
+ }
215
+ }
216
+ else if ((mem.cv_tn + mem.cv_hprime - mem.cv_tstop) * mem.cv_h > 0.0) {
217
+ mem.cv_hprime = (mem.cv_tstop - mem.cv_tn) * (1.0 - 4.0 * UROUND);
218
+ mem.cv_eta = mem.cv_hprime / mem.cv_h;
219
+ }
220
+ }
221
+ // In NORMAL mode, test if tout was reached
222
+ if (itask === CV_NORMAL && (mem.cv_tn - tout) * mem.cv_h >= 0.0) {
223
+ mem.cv_tretlast = tret = tout;
224
+ cvodeGetDky(mem, tout, 0, yout);
225
+ return { flag: CV_SUCCESS, t: tret };
226
+ }
227
+ // In ONE_STEP mode, test if tn was returned
228
+ if (itask === CV_ONE_STEP &&
229
+ Math.abs(mem.cv_tn - mem.cv_tretlast) > troundoff) {
230
+ mem.cv_tretlast = tret = mem.cv_tn;
231
+ yout.set(mem.cv_zn[0]);
232
+ return { flag: CV_SUCCESS, t: tret };
233
+ }
234
+ }
235
+ // --- Main integration loop ---
236
+ let nstloc = 0;
237
+ istate = CV_SUCCESS; // will be overwritten
238
+ for (;;) {
239
+ mem.cv_next_h = mem.cv_h;
240
+ mem.cv_next_q = mem.cv_q;
241
+ // Reset and check ewt
242
+ if (mem.cv_nst > 0) {
243
+ const ewtsetOK = cvEwtSet(mem);
244
+ if (ewtsetOK !== 0) {
245
+ istate = -99; // CV_ILL_INPUT
246
+ mem.cv_tretlast = tret = mem.cv_tn;
247
+ yout.set(mem.cv_zn[0]);
248
+ break;
249
+ }
250
+ }
251
+ // Check for too many steps
252
+ if (mem.cv_mxstep > 0 && nstloc >= mem.cv_mxstep) {
253
+ istate = CV_TOO_MUCH_WORK;
254
+ mem.cv_tretlast = tret = mem.cv_tn;
255
+ yout.set(mem.cv_zn[0]);
256
+ break;
257
+ }
258
+ // Check for too much accuracy requested
259
+ const nrm = wrmsNorm(mem.cv_N, mem.cv_zn[0], mem.cv_ewt);
260
+ mem.cv_tolsf = UROUND * nrm;
261
+ if (mem.cv_tolsf > 1.0) {
262
+ istate = CV_TOO_MUCH_ACC;
263
+ mem.cv_tretlast = tret = mem.cv_tn;
264
+ yout.set(mem.cv_zn[0]);
265
+ mem.cv_tolsf *= 2.0;
266
+ break;
267
+ }
268
+ else
269
+ mem.cv_tolsf = 1.0;
270
+ // Check for h below roundoff
271
+ if (mem.cv_tn + mem.cv_h === mem.cv_tn)
272
+ mem.cv_nhnil++;
273
+ // Take a step
274
+ const kflag = cvStep(mem);
275
+ // Process failed step
276
+ if (kflag !== CV_SUCCESS) {
277
+ istate = cvHandleFailure(mem, kflag);
278
+ mem.cv_tretlast = tret = mem.cv_tn;
279
+ yout.set(mem.cv_zn[0]);
280
+ break;
281
+ }
282
+ nstloc++;
283
+ // If tstop was reached, reset tn
284
+ if (mem.cv_tstopset) {
285
+ troundoff = FUZZ_FACTOR * UROUND *
286
+ (Math.abs(mem.cv_tn) + Math.abs(mem.cv_h));
287
+ if (Math.abs(mem.cv_tn - mem.cv_tstop) <= troundoff)
288
+ mem.cv_tn = mem.cv_tstop;
289
+ }
290
+ // Check for root in last step
291
+ if (mem.cv_nrtfn > 0) {
292
+ retval = cvRcheck3(mem);
293
+ if (retval === RTFOUND) {
294
+ mem.cv_irfnd = 1;
295
+ istate = CV_ROOT_RETURN;
296
+ mem.cv_tretlast = tret = mem.cv_tlo;
297
+ break;
298
+ }
299
+ else if (retval === CV_RTFUNC_FAIL) {
300
+ istate = CV_RTFUNC_FAIL;
301
+ break;
302
+ }
303
+ }
304
+ // Check tstop in loop
305
+ if (mem.cv_tstopset) {
306
+ troundoff = FUZZ_FACTOR * UROUND *
307
+ (Math.abs(mem.cv_tn) + Math.abs(mem.cv_h));
308
+ if (Math.abs(mem.cv_tn - mem.cv_tstop) <= troundoff) {
309
+ if ((tout - mem.cv_tstop) * mem.cv_h >= 0.0 ||
310
+ Math.abs(tout - mem.cv_tstop) <= troundoff) {
311
+ if (mem.cv_tstopinterp)
312
+ cvodeGetDky(mem, mem.cv_tstop, 0, yout);
313
+ else
314
+ yout.set(mem.cv_zn[0]);
315
+ mem.cv_tretlast = tret = mem.cv_tstop;
316
+ mem.cv_tstopset = false;
317
+ istate = CV_TSTOP_RETURN;
318
+ break;
319
+ }
320
+ }
321
+ else if ((mem.cv_tn + mem.cv_hprime - mem.cv_tstop) * mem.cv_h > 0.0) {
322
+ mem.cv_hprime = (mem.cv_tstop - mem.cv_tn) * (1.0 - 4.0 * UROUND);
323
+ mem.cv_eta = mem.cv_hprime / mem.cv_h;
324
+ }
325
+ }
326
+ // In NORMAL mode, check if tout reached
327
+ if (itask === CV_NORMAL && (mem.cv_tn - tout) * mem.cv_h >= 0.0) {
328
+ istate = CV_SUCCESS;
329
+ mem.cv_tretlast = tret = tout;
330
+ cvodeGetDky(mem, tout, 0, yout);
331
+ mem.cv_next_q = mem.cv_qprime;
332
+ mem.cv_next_h = mem.cv_hprime;
333
+ break;
334
+ }
335
+ // In ONE_STEP mode, copy y and exit
336
+ if (itask === CV_ONE_STEP) {
337
+ istate = CV_SUCCESS;
338
+ mem.cv_tretlast = tret = mem.cv_tn;
339
+ yout.set(mem.cv_zn[0]);
340
+ mem.cv_next_q = mem.cv_qprime;
341
+ mem.cv_next_h = mem.cv_hprime;
342
+ break;
343
+ }
344
+ }
345
+ return { flag: istate, t: tret };
346
+ }
347
+ // ============================================================================
348
+ // INTERNAL FUNCTIONS
349
+ // ============================================================================
350
+ /** cvInitialSetup - First-step checks */
351
+ function cvInitialSetup(mem) {
352
+ // Did the user specify tolerances?
353
+ if (mem.cv_itol === CV_NN) {
354
+ mem.cv_error = 'cvInitialSetup: no tolerances set';
355
+ return -99; // CV_ILL_INPUT
356
+ }
357
+ // Load initial error weights
358
+ const ier = cvEwtSet(mem);
359
+ if (ier !== 0) {
360
+ mem.cv_error = 'cvInitialSetup: bad ewt';
361
+ return -99; // CV_ILL_INPUT
362
+ }
363
+ // Call linit function if it exists
364
+ if (mem.cv_linit !== null) {
365
+ const linit_ret = mem.cv_linit(mem);
366
+ if (linit_ret !== 0) {
367
+ mem.cv_error = 'cvInitialSetup: linear solver init failed';
368
+ return CV_LINIT_FAIL;
369
+ }
370
+ }
371
+ return CV_SUCCESS;
372
+ }
373
+ /** cvEwtSet - Set error weights based on tolerance type */
374
+ function cvEwtSet(mem) {
375
+ switch (mem.cv_itol) {
376
+ case CV_SS: return cvEwtSetSS(mem);
377
+ case CV_SV: return cvEwtSetSV(mem);
378
+ default: return -1;
379
+ }
380
+ }
381
+ /** cvEwtSetSS - ewt[i] = 1/(reltol*|y[i]| + Sabstol) */
382
+ function cvEwtSetSS(mem) {
383
+ const N = mem.cv_N;
384
+ const rtol = mem.cv_reltol;
385
+ const atol = mem.cv_Sabstol;
386
+ const y = mem.cv_zn[0];
387
+ const ewt = mem.cv_ewt;
388
+ for (let i = 0; i < N; i++) {
389
+ const tol = rtol * Math.abs(y[i]) + atol;
390
+ if (mem.cv_atolmin0 && tol <= 0.0)
391
+ return -1;
392
+ ewt[i] = 1.0 / tol;
393
+ }
394
+ return 0;
395
+ }
396
+ /** cvEwtSetSV - ewt[i] = 1/(reltol*|y[i]| + Vabstol[i]) */
397
+ function cvEwtSetSV(mem) {
398
+ const N = mem.cv_N;
399
+ const rtol = mem.cv_reltol;
400
+ const vatol = mem.cv_Vabstol;
401
+ const y = mem.cv_zn[0];
402
+ const ewt = mem.cv_ewt;
403
+ for (let i = 0; i < N; i++) {
404
+ const tol = rtol * Math.abs(y[i]) + vatol[i];
405
+ if (mem.cv_atolmin0 && tol <= 0.0)
406
+ return -1;
407
+ ewt[i] = 1.0 / tol;
408
+ }
409
+ return 0;
410
+ }
411
+ /** cvStep - One internal step */
412
+ function cvStep(mem) {
413
+ let dsm = 0.0;
414
+ let ncf = 0;
415
+ let nef = 0;
416
+ let nflag;
417
+ let kflag;
418
+ let eflag;
419
+ // If step size changed, update history array
420
+ if (mem.cv_nst > 0 && mem.cv_hprime !== mem.cv_h)
421
+ cvAdjustParams(mem);
422
+ const saved_t = mem.cv_tn;
423
+ nflag = FIRST_CALL;
424
+ // Looping point for step attempts
425
+ for (;;) {
426
+ cvPredict(mem);
427
+ cvSet(mem);
428
+ nflag = cvNls(mem, nflag);
429
+ const nflagRef = { value: nflag };
430
+ const ncfRef = { value: ncf };
431
+ kflag = cvHandleNFlag(mem, nflagRef, saved_t, ncfRef);
432
+ nflag = nflagRef.value;
433
+ ncf = ncfRef.value;
434
+ // Go back if we need to predict again
435
+ if (kflag === PREDICT_AGAIN)
436
+ continue;
437
+ // Return if nonlinear solve failed and recovery is not possible
438
+ if (kflag !== DO_ERROR_TEST)
439
+ return kflag;
440
+ // Perform error test
441
+ const nflagRef2 = { value: nflag };
442
+ const nefRef = { value: nef };
443
+ const dsmRef = { value: dsm };
444
+ eflag = cvDoErrorTest(mem, nflagRef2, saved_t, nefRef, dsmRef);
445
+ nflag = nflagRef2.value;
446
+ nef = nefRef.value;
447
+ dsm = dsmRef.value;
448
+ // Go back if we need to try again
449
+ if (eflag === TRY_AGAIN)
450
+ continue;
451
+ // Return if error test failed and recovery is not possible
452
+ if (eflag !== CV_SUCCESS)
453
+ return eflag;
454
+ // Error test passed, break from loop
455
+ break;
456
+ }
457
+ // Step successful: update data and consider order/step changes
458
+ cvCompleteStep(mem);
459
+ cvPrepareNextStep(mem, dsm);
460
+ // BDF stability limit detection
461
+ if (mem.cv_sldeton)
462
+ cvBDFStab(mem);
463
+ mem.cv_etamax = (mem.cv_nst <= mem.cv_small_nst) ?
464
+ mem.cv_eta_max_es :
465
+ mem.cv_eta_max_gs;
466
+ // Rescale acor to be the estimated local error vector
467
+ vScale(mem.cv_tq[2], mem.cv_acor, mem.cv_acor, mem.cv_N);
468
+ return CV_SUCCESS;
469
+ }
470
+ /** cvAdjustParams - adjust order and rescale when step size changes */
471
+ function cvAdjustParams(mem) {
472
+ if (mem.cv_qprime !== mem.cv_q) {
473
+ if (!mem.first_step_after_resize)
474
+ cvAdjustOrder(mem, mem.cv_qprime - mem.cv_q);
475
+ mem.cv_q = mem.cv_qprime;
476
+ mem.cv_L = mem.cv_q + 1;
477
+ mem.cv_qwait = mem.cv_L;
478
+ }
479
+ cvRescale(mem);
480
+ }
481
+ /** cvAdjustOrder - handle order change by deltaq */
482
+ function cvAdjustOrder(mem, deltaq) {
483
+ if (mem.cv_q === 2 && deltaq !== 1)
484
+ return;
485
+ if (mem.cv_lmm === CV_ADAMS)
486
+ cvAdjustAdams(mem, deltaq);
487
+ else if (mem.cv_lmm === CV_BDF) {
488
+ if (deltaq === 1)
489
+ cvIncreaseBDF(mem);
490
+ else if (deltaq === -1)
491
+ cvDecreaseBDF(mem);
492
+ }
493
+ }
494
+ /** cvRescale - multiply zn[j] by eta^j for j=1..q */
495
+ function cvRescale(mem) {
496
+ const N = mem.cv_N;
497
+ let factor = mem.cv_eta;
498
+ for (let j = 1; j <= mem.cv_q; j++) {
499
+ const znj = mem.cv_zn[j];
500
+ for (let i = 0; i < N; i++)
501
+ znj[i] *= factor;
502
+ factor *= mem.cv_eta;
503
+ }
504
+ mem.cv_h = mem.cv_hscale * mem.cv_eta;
505
+ mem.cv_next_h = mem.cv_h;
506
+ mem.cv_hscale = mem.cv_h;
507
+ mem.cv_nscon = 0;
508
+ }
509
+ /** cvPredict - advance tn and compute predicted Nordsieck array */
510
+ function cvPredict(mem) {
511
+ const N = mem.cv_N;
512
+ mem.cv_tn += mem.cv_h;
513
+ if (mem.cv_tstopset) {
514
+ if ((mem.cv_tn - mem.cv_tstop) * mem.cv_h > 0.0)
515
+ mem.cv_tn = mem.cv_tstop;
516
+ }
517
+ for (let k = 1; k <= mem.cv_q; k++) {
518
+ for (let j = mem.cv_q; j >= k; j--) {
519
+ const znjm1 = mem.cv_zn[j - 1];
520
+ const znj = mem.cv_zn[j];
521
+ for (let i = 0; i < N; i++)
522
+ znjm1[i] += znj[i];
523
+ }
524
+ }
525
+ }
526
+ /** cvSet - compute method coefficients l, tq, rl1, gamma, gamrat */
527
+ function cvSet(mem) {
528
+ if (mem.cv_lmm === CV_ADAMS)
529
+ cvSetAdams(mem);
530
+ else
531
+ cvSetBDF(mem);
532
+ mem.cv_rl1 = 1.0 / mem.cv_l[1];
533
+ mem.cv_gamma = mem.cv_h * mem.cv_rl1;
534
+ if (mem.cv_nst === 0)
535
+ mem.cv_gammap = mem.cv_gamma;
536
+ mem.cv_gamrat = (mem.cv_nst > 0) ?
537
+ mem.cv_gamma / mem.cv_gammap :
538
+ 1.0;
539
+ }
540
+ /** cvHandleNFlag - take action on nonlinear solver return */
541
+ function cvHandleNFlag(mem, nflagRef, saved_t, ncfRef) {
542
+ const nflag = nflagRef.value;
543
+ if (nflag === CV_SUCCESS)
544
+ return DO_ERROR_TEST;
545
+ // Nonlinear solve failed; increment ncfn and restore zn
546
+ mem.cv_ncfn++;
547
+ cvRestore(mem, saved_t);
548
+ // Return if failed unrecoverably
549
+ if (nflag < 0) {
550
+ if (nflag === CV_LSETUP_FAIL)
551
+ return CV_LSETUP_FAIL;
552
+ else if (nflag === CV_LSOLVE_FAIL)
553
+ return CV_LSOLVE_FAIL;
554
+ else if (nflag === CV_RHSFUNC_FAIL)
555
+ return CV_RHSFUNC_FAIL;
556
+ else
557
+ return CV_NLS_FAIL;
558
+ }
559
+ // Recoverable error
560
+ ncfRef.value++;
561
+ mem.cv_etamax = 1.0;
562
+ // If maxncf failures or |h| = hmin, return failure
563
+ if (Math.abs(mem.cv_h) <= mem.cv_hmin * ONEPSM ||
564
+ ncfRef.value === mem.cv_maxncf) {
565
+ if (nflag === SUN_NLS_CONV_RECVR)
566
+ return CV_CONV_FAILURE;
567
+ if (nflag === RHSFUNC_RECVR)
568
+ return CV_REPTD_RHSFUNC_ERR;
569
+ }
570
+ // Reduce step size; return to reattempt
571
+ mem.cv_eta = Math.max(mem.cv_eta_cf, mem.cv_hmin / Math.abs(mem.cv_h));
572
+ nflagRef.value = PREV_CONV_FAIL;
573
+ cvRescale(mem);
574
+ return PREDICT_AGAIN;
575
+ }
576
+ /** cvRestore - undo prediction, restore tn and zn */
577
+ function cvRestore(mem, saved_t) {
578
+ const N = mem.cv_N;
579
+ mem.cv_tn = saved_t;
580
+ for (let k = 1; k <= mem.cv_q; k++) {
581
+ for (let j = mem.cv_q; j >= k; j--) {
582
+ const znjm1 = mem.cv_zn[j - 1];
583
+ const znj = mem.cv_zn[j];
584
+ for (let i = 0; i < N; i++)
585
+ znjm1[i] -= znj[i];
586
+ }
587
+ }
588
+ }
589
+ /** cvDoErrorTest - local error test */
590
+ function cvDoErrorTest(mem, nflagRef, saved_t, nefRef, dsmRef) {
591
+ const dsm = mem.cv_acnrm * mem.cv_tq[2];
592
+ dsmRef.value = dsm;
593
+ // If dsm <= 1, test passed
594
+ if (dsm <= 1.0)
595
+ return CV_SUCCESS;
596
+ // Test failed
597
+ nefRef.value++;
598
+ mem.cv_netf++;
599
+ nflagRef.value = PREV_ERR_FAIL;
600
+ cvRestore(mem, saved_t);
601
+ // At maxnef failures or |h| = hmin, return failure
602
+ if (Math.abs(mem.cv_h) <= mem.cv_hmin * ONEPSM ||
603
+ nefRef.value === mem.cv_maxnef)
604
+ return CV_ERR_FAILURE;
605
+ // Set etamax = 1 to prevent step size increase
606
+ mem.cv_etamax = 1.0;
607
+ // Compute eta from dsm and rescale
608
+ if (nefRef.value <= MXNEF1) {
609
+ mem.cv_eta = 1.0 / (Math.pow(BIAS2 * dsm, 1.0 / mem.cv_L) + ADDON);
610
+ mem.cv_eta = Math.max(mem.cv_eta_min_ef, Math.max(mem.cv_eta, mem.cv_hmin / Math.abs(mem.cv_h)));
611
+ if (nefRef.value >= mem.cv_small_nef)
612
+ mem.cv_eta = Math.min(mem.cv_eta, mem.cv_eta_max_ef);
613
+ cvRescale(mem);
614
+ return TRY_AGAIN;
615
+ }
616
+ // After MXNEF1 failures, force order reduction
617
+ if (mem.cv_q > 1) {
618
+ mem.cv_eta = Math.max(mem.cv_eta_min_ef, mem.cv_hmin / Math.abs(mem.cv_h));
619
+ cvAdjustOrder(mem, -1);
620
+ mem.cv_L = mem.cv_q;
621
+ mem.cv_q--;
622
+ mem.cv_qwait = mem.cv_L;
623
+ cvRescale(mem);
624
+ return TRY_AGAIN;
625
+ }
626
+ // Already at order 1: restart by reloading zn
627
+ mem.cv_eta = Math.max(mem.cv_eta_min_ef, mem.cv_hmin / Math.abs(mem.cv_h));
628
+ mem.cv_h *= mem.cv_eta;
629
+ mem.cv_next_h = mem.cv_h;
630
+ mem.cv_hscale = mem.cv_h;
631
+ mem.cv_qwait = LONG_WAIT;
632
+ mem.cv_nscon = 0;
633
+ const retval = mem.cv_f(mem.cv_tn, mem.cv_zn[0], mem.cv_tempv, mem.cv_user_data);
634
+ mem.cv_nfe++;
635
+ if (retval < 0)
636
+ return CV_RHSFUNC_FAIL;
637
+ if (retval > 0)
638
+ return CV_UNREC_RHSFUNC_ERR;
639
+ vScale(mem.cv_h, mem.cv_tempv, mem.cv_zn[1], mem.cv_N);
640
+ return TRY_AGAIN;
641
+ }
642
+ /** cvCompleteStep - update state after successful step */
643
+ function cvCompleteStep(mem) {
644
+ const N = mem.cv_N;
645
+ mem.cv_nst++;
646
+ mem.cv_nscon++;
647
+ mem.cv_hu = mem.cv_h;
648
+ mem.cv_qu = mem.cv_q;
649
+ mem.first_step_after_resize = false;
650
+ // Shift tau array
651
+ for (let i = mem.cv_q; i >= 2; i--)
652
+ mem.cv_tau[i] = mem.cv_tau[i - 1];
653
+ if (mem.cv_q === 1 && mem.cv_nst > 1)
654
+ mem.cv_tau[2] = mem.cv_tau[1];
655
+ mem.cv_tau[1] = mem.cv_h;
656
+ // Apply corrections to zn: zn[j] += l[j] * acor
657
+ for (let j = 0; j <= mem.cv_q; j++) {
658
+ const lj = mem.cv_l[j];
659
+ const znj = mem.cv_zn[j];
660
+ const acor = mem.cv_acor;
661
+ for (let i = 0; i < N; i++)
662
+ znj[i] += lj * acor[i];
663
+ }
664
+ // Decrement qwait, save acor if qwait==1 and q < qmax
665
+ mem.cv_qwait--;
666
+ if (mem.cv_qwait === 1 && mem.cv_q !== mem.cv_qmax) {
667
+ mem.cv_zn[mem.cv_qmax].set(mem.cv_acor);
668
+ mem.cv_saved_tq5 = mem.cv_tq[5];
669
+ mem.cv_indx_acor = mem.cv_qmax;
670
+ }
671
+ }
672
+ /** cvPrepareNextStep - set stepsize and order for next step */
673
+ function cvPrepareNextStep(mem, dsm) {
674
+ if (mem.cv_etamax === 1.0) {
675
+ // Defer step size or order changes
676
+ mem.cv_qwait = Math.max(mem.cv_qwait, 2);
677
+ mem.cv_qprime = mem.cv_q;
678
+ mem.cv_hprime = mem.cv_h;
679
+ mem.cv_eta = 1.0;
680
+ }
681
+ else {
682
+ // Compute etaq
683
+ mem.cv_etaq = 1.0 / (Math.pow(BIAS2 * dsm, 1.0 / mem.cv_L) + ADDON);
684
+ if (mem.cv_qwait !== 0) {
685
+ // No order change, just adjust eta
686
+ mem.cv_eta = mem.cv_etaq;
687
+ mem.cv_qprime = mem.cv_q;
688
+ cvSetEta(mem);
689
+ }
690
+ else {
691
+ // Consider order change
692
+ mem.cv_qwait = 2;
693
+ mem.cv_etaqm1 = cvComputeEtaqm1(mem);
694
+ mem.cv_etaqp1 = cvComputeEtaqp1(mem);
695
+ cvChooseEta(mem);
696
+ cvSetEta(mem);
697
+ }
698
+ }
699
+ }
700
+ /** cvSetEta - adjust eta by heuristic limits and hmax */
701
+ function cvSetEta(mem) {
702
+ if (mem.cv_eta > mem.cv_eta_min_fx && mem.cv_eta < mem.cv_eta_max_fx) {
703
+ // Eta within fixed-step bounds, retain step size
704
+ mem.cv_eta = 1.0;
705
+ mem.cv_hprime = mem.cv_h;
706
+ }
707
+ else {
708
+ if (mem.cv_eta >= mem.cv_eta_max_fx) {
709
+ // Increase step size
710
+ mem.cv_eta = Math.min(mem.cv_eta, mem.cv_etamax);
711
+ mem.cv_eta /= Math.max(1.0, Math.abs(mem.cv_h) * mem.cv_hmax_inv * mem.cv_eta);
712
+ }
713
+ else {
714
+ // Reduce step size
715
+ mem.cv_eta = Math.max(mem.cv_eta, mem.cv_eta_min);
716
+ mem.cv_eta = Math.max(mem.cv_eta, mem.cv_hmin / Math.abs(mem.cv_h));
717
+ }
718
+ mem.cv_hprime = mem.cv_h * mem.cv_eta;
719
+ if (mem.cv_qprime < mem.cv_q)
720
+ mem.cv_nscon = 0;
721
+ }
722
+ }
723
+ /** cvComputeEtaqm1 - eta for possible order decrease */
724
+ function cvComputeEtaqm1(mem) {
725
+ mem.cv_etaqm1 = 0.0;
726
+ if (mem.cv_q > 1) {
727
+ const ddn = wrmsNorm(mem.cv_N, mem.cv_zn[mem.cv_q], mem.cv_ewt) * mem.cv_tq[1];
728
+ mem.cv_etaqm1 = 1.0 / (Math.pow(BIAS1 * ddn, 1.0 / mem.cv_q) + ADDON);
729
+ }
730
+ return mem.cv_etaqm1;
731
+ }
732
+ /** cvComputeEtaqp1 - eta for possible order increase */
733
+ function cvComputeEtaqp1(mem) {
734
+ mem.cv_etaqp1 = 0.0;
735
+ if (mem.cv_q !== mem.cv_qmax) {
736
+ if (mem.cv_saved_tq5 === 0.0)
737
+ return mem.cv_etaqp1;
738
+ const cquot = (mem.cv_tq[5] / mem.cv_saved_tq5) *
739
+ Math.pow(mem.cv_h / mem.cv_tau[2], mem.cv_L);
740
+ // tempv = acor - cquot * zn[qmax]
741
+ const N = mem.cv_N;
742
+ const tempv = mem.cv_tempv;
743
+ const znqmax = mem.cv_zn[mem.cv_qmax];
744
+ const acor = mem.cv_acor;
745
+ for (let i = 0; i < N; i++)
746
+ tempv[i] = acor[i] - cquot * znqmax[i];
747
+ const dup = wrmsNorm(N, tempv, mem.cv_ewt) * mem.cv_tq[3];
748
+ mem.cv_etaqp1 = 1.0 / (Math.pow(BIAS3 * dup, 1.0 / (mem.cv_L + 1)) + ADDON);
749
+ }
750
+ return mem.cv_etaqp1;
751
+ }
752
+ /** cvChooseEta - choose max of etaqm1, etaq, etaqp1 */
753
+ function cvChooseEta(mem) {
754
+ const etam = Math.max(mem.cv_etaqm1, Math.max(mem.cv_etaq, mem.cv_etaqp1));
755
+ if (etam > mem.cv_eta_min_fx && etam < mem.cv_eta_max_fx) {
756
+ mem.cv_eta = 1.0;
757
+ mem.cv_qprime = mem.cv_q;
758
+ }
759
+ else {
760
+ // Preference: keep > decrease > increase
761
+ if (etam === mem.cv_etaq) {
762
+ mem.cv_eta = mem.cv_etaq;
763
+ mem.cv_qprime = mem.cv_q;
764
+ }
765
+ else if (etam === mem.cv_etaqm1) {
766
+ mem.cv_eta = mem.cv_etaqm1;
767
+ mem.cv_qprime = mem.cv_q - 1;
768
+ }
769
+ else {
770
+ mem.cv_eta = mem.cv_etaqp1;
771
+ mem.cv_qprime = mem.cv_q + 1;
772
+ if (mem.cv_lmm === CV_BDF) {
773
+ // Store Delta_n in zn[qmax] for order increase
774
+ mem.cv_zn[mem.cv_qmax].set(mem.cv_acor);
775
+ }
776
+ }
777
+ }
778
+ }
779
+ /** cvHandleFailure - set error and return flag */
780
+ function cvHandleFailure(mem, flag) {
781
+ switch (flag) {
782
+ case CV_ERR_FAILURE:
783
+ mem.cv_error = `Error test failures at t=${mem.cv_tn}, h=${mem.cv_h}`;
784
+ break;
785
+ case CV_CONV_FAILURE:
786
+ mem.cv_error = `Convergence failures at t=${mem.cv_tn}, h=${mem.cv_h}`;
787
+ break;
788
+ case CV_LSETUP_FAIL:
789
+ mem.cv_error = `Linear solver setup failed at t=${mem.cv_tn}`;
790
+ break;
791
+ case CV_LSOLVE_FAIL:
792
+ mem.cv_error = `Linear solver solve failed at t=${mem.cv_tn}`;
793
+ break;
794
+ case CV_RHSFUNC_FAIL:
795
+ mem.cv_error = `RHS function failed at t=${mem.cv_tn}`;
796
+ break;
797
+ case CV_UNREC_RHSFUNC_ERR:
798
+ mem.cv_error = `Unrecoverable RHS function error at t=${mem.cv_tn}`;
799
+ break;
800
+ case CV_REPTD_RHSFUNC_ERR:
801
+ mem.cv_error = `Repeated RHS function errors at t=${mem.cv_tn}`;
802
+ break;
803
+ case CV_RTFUNC_FAIL:
804
+ mem.cv_error = `Root function failed at t=${mem.cv_tn}`;
805
+ break;
806
+ case CV_TOO_CLOSE:
807
+ mem.cv_error = 'tout too close to t0';
808
+ break;
809
+ default:
810
+ mem.cv_error = `Unrecognized failure flag: ${flag}`;
811
+ break;
812
+ }
813
+ return flag;
814
+ }
815
+ /** cvBDFStab - BDF stability limit detection (STALD) */
816
+ function cvBDFStab(mem) {
817
+ // If order >= 3, save scaled derivative data
818
+ if (mem.cv_q >= 3) {
819
+ for (let k = 1; k <= 3; k++) {
820
+ for (let i = 5; i >= 2; i--)
821
+ mem.cv_ssdat[i][k] = mem.cv_ssdat[i - 1][k];
822
+ }
823
+ let factorial = 1;
824
+ for (let i = 1; i <= mem.cv_q - 1; i++)
825
+ factorial *= i;
826
+ const sq = factorial * mem.cv_q * (mem.cv_q + 1) * mem.cv_acnrm /
827
+ Math.max(mem.cv_tq[5], TINY);
828
+ const sqm1 = factorial * mem.cv_q *
829
+ wrmsNorm(mem.cv_N, mem.cv_zn[mem.cv_q], mem.cv_ewt);
830
+ const sqm2 = factorial *
831
+ wrmsNorm(mem.cv_N, mem.cv_zn[mem.cv_q - 1], mem.cv_ewt);
832
+ mem.cv_ssdat[1][1] = sqm2 * sqm2;
833
+ mem.cv_ssdat[1][2] = sqm1 * sqm1;
834
+ mem.cv_ssdat[1][3] = sq * sq;
835
+ }
836
+ if (mem.cv_qprime >= mem.cv_q) {
837
+ // If enough data, call stability limit detection
838
+ if (mem.cv_q >= 3 && mem.cv_nscon >= mem.cv_q + 5) {
839
+ const ldflag = cvSLdet(mem);
840
+ if (ldflag > 3) {
841
+ // Stability limit violation: reduce order
842
+ mem.cv_qprime = mem.cv_q - 1;
843
+ mem.cv_eta = mem.cv_etaqm1;
844
+ mem.cv_eta = Math.min(mem.cv_eta, mem.cv_etamax);
845
+ mem.cv_eta = mem.cv_eta /
846
+ Math.max(1.0, Math.abs(mem.cv_h) * mem.cv_hmax_inv * mem.cv_eta);
847
+ mem.cv_hprime = mem.cv_h * mem.cv_eta;
848
+ mem.cv_nor = mem.cv_nor + 1;
849
+ }
850
+ }
851
+ }
852
+ else {
853
+ // Let order increase happen, reset nscon
854
+ mem.cv_nscon = 0;
855
+ }
856
+ }
857
+ /** cvSLdet - Stability limit detection algorithm (~300 lines from C) */
858
+ function cvSLdet(mem) {
859
+ let kmin = 0;
860
+ let kflag = 0;
861
+ // Allocate local arrays with 1-based indexing
862
+ const rat = [];
863
+ for (let i = 0; i < 5; i++)
864
+ rat[i] = [0, 0, 0, 0];
865
+ const rav = [0, 0, 0, 0];
866
+ const qkr = [0, 0, 0, 0];
867
+ const sigsq = [0, 0, 0, 0];
868
+ const smax = [0, 0, 0, 0];
869
+ const ssmax = [0, 0, 0, 0];
870
+ const drr = [0, 0, 0, 0];
871
+ const rrc = [0, 0, 0, 0];
872
+ const sqmx = [0, 0, 0, 0];
873
+ const vrat = [0, 0, 0, 0, 0];
874
+ // qjk[j][k], qc[i][k], qco[i][k] - all 1-based
875
+ const qjk = [];
876
+ for (let j = 0; j < 4; j++)
877
+ qjk[j] = [0, 0, 0, 0];
878
+ const qc = [];
879
+ for (let i = 0; i < 6; i++)
880
+ qc[i] = [0, 0, 0, 0];
881
+ const qco = [];
882
+ for (let i = 0; i < 6; i++)
883
+ qco[i] = [0, 0, 0, 0];
884
+ // Cutoffs and tolerances
885
+ const rrcut = 0.98;
886
+ const vrrtol = 1.0e-4;
887
+ const vrrt2 = 5.0e-4;
888
+ const sqtol = 1.0e-3;
889
+ const rrtol = 1.0e-2;
890
+ let rr = 0.0;
891
+ // Get maxima, minima, and variances, form quartic coefficients
892
+ for (let k = 1; k <= 3; k++) {
893
+ let smink = mem.cv_ssdat[1][k];
894
+ let smaxk = 0.0;
895
+ for (let i = 1; i <= 5; i++) {
896
+ smink = Math.min(smink, mem.cv_ssdat[i][k]);
897
+ smaxk = Math.max(smaxk, mem.cv_ssdat[i][k]);
898
+ }
899
+ if (smink < TINY * smaxk)
900
+ return -1;
901
+ smax[k] = smaxk;
902
+ ssmax[k] = smaxk * smaxk;
903
+ let sumrat = 0.0;
904
+ let sumrsq = 0.0;
905
+ for (let i = 1; i <= 4; i++) {
906
+ rat[i][k] = mem.cv_ssdat[i][k] / mem.cv_ssdat[i + 1][k];
907
+ sumrat += rat[i][k];
908
+ sumrsq += rat[i][k] * rat[i][k];
909
+ }
910
+ rav[k] = 0.25 * sumrat;
911
+ vrat[k] = Math.abs(0.25 * sumrsq - rav[k] * rav[k]);
912
+ qc[5][k] = mem.cv_ssdat[1][k] * mem.cv_ssdat[3][k] -
913
+ mem.cv_ssdat[2][k] * mem.cv_ssdat[2][k];
914
+ qc[4][k] = mem.cv_ssdat[2][k] * mem.cv_ssdat[3][k] -
915
+ mem.cv_ssdat[1][k] * mem.cv_ssdat[4][k];
916
+ qc[3][k] = 0.0;
917
+ qc[2][k] = mem.cv_ssdat[2][k] * mem.cv_ssdat[5][k] -
918
+ mem.cv_ssdat[3][k] * mem.cv_ssdat[4][k];
919
+ qc[1][k] = mem.cv_ssdat[4][k] * mem.cv_ssdat[4][k] -
920
+ mem.cv_ssdat[3][k] * mem.cv_ssdat[5][k];
921
+ for (let i = 1; i <= 5; i++)
922
+ qco[i][k] = qc[i][k];
923
+ }
924
+ // Isolate normal or nearly-normal matrix case
925
+ const vmin = Math.min(vrat[1], Math.min(vrat[2], vrat[3]));
926
+ const vmax = Math.max(vrat[1], Math.max(vrat[2], vrat[3]));
927
+ if (vmin < vrrtol * vrrtol) {
928
+ if (vmax > vrrt2 * vrrt2)
929
+ return -2;
930
+ else {
931
+ rr = (rav[1] + rav[2] + rav[3]) / 3.0;
932
+ let drrmax = 0.0;
933
+ for (let k = 1; k <= 3; k++) {
934
+ const adrr = Math.abs(rav[k] - rr);
935
+ drrmax = Math.max(drrmax, adrr);
936
+ }
937
+ if (drrmax > vrrt2)
938
+ return -3;
939
+ kflag = 1;
940
+ }
941
+ }
942
+ else {
943
+ // Use quartics to get rr
944
+ if (Math.abs(qco[1][1]) < TINY * ssmax[1])
945
+ return -4;
946
+ let tem = qco[1][2] / qco[1][1];
947
+ for (let i = 2; i <= 5; i++)
948
+ qco[i][2] = qco[i][2] - tem * qco[i][1];
949
+ qco[1][2] = 0.0;
950
+ tem = qco[1][3] / qco[1][1];
951
+ for (let i = 2; i <= 5; i++)
952
+ qco[i][3] = qco[i][3] - tem * qco[i][1];
953
+ qco[1][3] = 0.0;
954
+ if (Math.abs(qco[2][2]) < TINY * ssmax[2])
955
+ return -4;
956
+ tem = qco[2][3] / qco[2][2];
957
+ for (let i = 3; i <= 5; i++)
958
+ qco[i][3] = qco[i][3] - tem * qco[i][2];
959
+ if (Math.abs(qco[4][3]) < TINY * ssmax[3])
960
+ return -4;
961
+ rr = -qco[5][3] / qco[4][3];
962
+ if (rr < TINY || rr > 100.0)
963
+ return -5;
964
+ for (let k = 1; k <= 3; k++)
965
+ qkr[k] = qc[5][k] + rr * (qc[4][k] + rr * rr * (qc[2][k] + rr * qc[1][k]));
966
+ let sqmax = 0.0;
967
+ for (let k = 1; k <= 3; k++) {
968
+ const saqk = Math.abs(qkr[k]) / ssmax[k];
969
+ if (saqk > sqmax)
970
+ sqmax = saqk;
971
+ }
972
+ if (sqmax < sqtol)
973
+ kflag = 2;
974
+ else {
975
+ // Newton corrections to improve rr
976
+ for (let it = 1; it <= 3; it++) {
977
+ for (let k = 1; k <= 3; k++) {
978
+ const qp = qc[4][k] + rr * rr * (3.0 * qc[2][k] + rr * 4.0 * qc[1][k]);
979
+ drr[k] = 0.0;
980
+ if (Math.abs(qp) > TINY * ssmax[k])
981
+ drr[k] = -qkr[k] / qp;
982
+ rrc[k] = rr + drr[k];
983
+ }
984
+ for (let k = 1; k <= 3; k++) {
985
+ const s = rrc[k];
986
+ let sqmaxk = 0.0;
987
+ for (let j = 1; j <= 3; j++) {
988
+ qjk[j][k] = qc[5][j] + s * (qc[4][j] + s * s * (qc[2][j] + s * qc[1][j]));
989
+ const saqj = Math.abs(qjk[j][k]) / ssmax[j];
990
+ if (saqj > sqmaxk)
991
+ sqmaxk = saqj;
992
+ }
993
+ sqmx[k] = sqmaxk;
994
+ }
995
+ let sqmin = sqmx[1] + 1.0;
996
+ for (let k = 1; k <= 3; k++) {
997
+ if (sqmx[k] < sqmin) {
998
+ kmin = k;
999
+ sqmin = sqmx[k];
1000
+ }
1001
+ }
1002
+ rr = rrc[kmin];
1003
+ if (sqmin < sqtol) {
1004
+ kflag = 3;
1005
+ break;
1006
+ }
1007
+ else
1008
+ for (let j = 1; j <= 3; j++)
1009
+ qkr[j] = qjk[j][kmin];
1010
+ }
1011
+ if (kflag !== 3) {
1012
+ // sqmin > sqtol after all Newton iterations
1013
+ return -6;
1014
+ }
1015
+ }
1016
+ }
1017
+ // Given rr, find sigsq[k] and verify rr
1018
+ for (let k = 1; k <= 3; k++) {
1019
+ const rsa = mem.cv_ssdat[1][k];
1020
+ const rsb = mem.cv_ssdat[2][k] * rr;
1021
+ const rsc = mem.cv_ssdat[3][k] * rr * rr;
1022
+ const rsd = mem.cv_ssdat[4][k] * rr * rr * rr;
1023
+ const rd1a = rsa - rsb;
1024
+ const rd1b = rsb - rsc;
1025
+ const rd1c = rsc - rsd;
1026
+ const rd2a = rd1a - rd1b;
1027
+ const rd2b = rd1b - rd1c;
1028
+ const rd3a = rd2a - rd2b;
1029
+ if (Math.abs(rd1b) < TINY * smax[k])
1030
+ return -7;
1031
+ const cest1 = -rd3a / rd1b;
1032
+ if (cest1 < TINY || cest1 > 4.0)
1033
+ return -7;
1034
+ const corr1 = (rd2b / cest1) / (rr * rr);
1035
+ sigsq[k] = mem.cv_ssdat[3][k] + corr1;
1036
+ }
1037
+ if (sigsq[2] < TINY)
1038
+ return -8;
1039
+ const ratp = sigsq[3] / sigsq[2];
1040
+ const ratm = sigsq[1] / sigsq[2];
1041
+ const qfac1 = 0.25 * (mem.cv_q * mem.cv_q - 1);
1042
+ const qfac2 = 2.0 / (mem.cv_q - 1);
1043
+ const bb = ratp * ratm - 1.0 - qfac1 * ratp;
1044
+ const tem2 = 1.0 - qfac2 * bb;
1045
+ if (Math.abs(tem2) < TINY)
1046
+ return -8;
1047
+ const rrb = 1.0 / tem2;
1048
+ if (Math.abs(rrb - rr) > rrtol)
1049
+ return -9;
1050
+ // Check if rr is above cutoff
1051
+ if (rr > rrcut) {
1052
+ if (kflag === 1)
1053
+ kflag = 4;
1054
+ if (kflag === 2)
1055
+ kflag = 5;
1056
+ if (kflag === 3)
1057
+ kflag = 6;
1058
+ }
1059
+ return kflag;
1060
+ }
1061
+ // Rootfinding functions imported from cvode_root.ts (cvRcheck1, cvRcheck2, cvRcheck3)
1062
+ //# sourceMappingURL=cvode.js.map