diff-grok 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.claude/skills/license-updater/SKILL.md +149 -0
  2. package/.claude/skills/license-updater/references/compatibility.md +68 -0
  3. package/.claude/skills/license-updater/references/templates.md +151 -0
  4. package/.claude/skills/license-updater/scripts/generate_license_files.py +467 -0
  5. package/CLAUDE.md +10 -4
  6. package/LICENSE +1 -1
  7. package/README.MD +41 -23
  8. package/THIRD_PARTY_LICENSES +135 -0
  9. package/docs/.nojekyll +1 -0
  10. package/docs/assets/hierarchy.js +1 -0
  11. package/docs/assets/highlight.css +99 -0
  12. package/docs/assets/icons.js +18 -0
  13. package/docs/assets/icons.svg +1 -0
  14. package/docs/assets/main.js +60 -0
  15. package/docs/assets/navigation.js +1 -0
  16. package/docs/assets/search.js +1 -0
  17. package/docs/assets/style.css +1633 -0
  18. package/docs/classes/BasicModelPipelineCreator.html +10 -0
  19. package/docs/classes/Callback.html +7 -0
  20. package/docs/classes/CyclicModelPipelineCreator.html +10 -0
  21. package/docs/classes/IterCheckerCallback.html +8 -0
  22. package/docs/classes/PipelineCreator.html +6 -0
  23. package/docs/classes/TimeCheckerCallback.html +8 -0
  24. package/docs/classes/UpdatesModelPipelineCreator.html +10 -0
  25. package/docs/functions/ab4.html +8 -0
  26. package/docs/functions/ab5.html +8 -0
  27. package/docs/functions/applyPipeline.html +9 -0
  28. package/docs/functions/getCallback.html +3 -0
  29. package/docs/functions/getIVP.html +6 -0
  30. package/docs/functions/getInputVector.html +2 -0
  31. package/docs/functions/getIvp2WebWorker.html +6 -0
  32. package/docs/functions/getJScode.html +6 -0
  33. package/docs/functions/getOutputNames.html +4 -0
  34. package/docs/functions/getPipelineCreator.html +7 -0
  35. package/docs/functions/lsoda.html +8 -0
  36. package/docs/functions/mrt.html +11 -0
  37. package/docs/functions/printE5.html +76 -0
  38. package/docs/functions/printHires.html +76 -0
  39. package/docs/functions/printOrego.html +66 -0
  40. package/docs/functions/printPollution.html +163 -0
  41. package/docs/functions/printRobertson.html +60 -0
  42. package/docs/functions/printVdpol.html +66 -0
  43. package/docs/functions/rk3.html +8 -0
  44. package/docs/functions/rk4.html +8 -0
  45. package/docs/functions/rkdp.html +8 -0
  46. package/docs/functions/ros34prw.html +8 -0
  47. package/docs/functions/ros3prw.html +8 -0
  48. package/docs/functions/solveIvp.html +5 -0
  49. package/docs/hierarchy.html +1 -0
  50. package/docs/index.html +768 -0
  51. package/docs/media/CONTRIBUTING.md +74 -0
  52. package/docs/media/E5.png +0 -0
  53. package/docs/media/HIRES.png +0 -0
  54. package/docs/media/OREGO.png +0 -0
  55. package/docs/media/POLL-full.png +0 -0
  56. package/docs/media/POLL.png +0 -0
  57. package/docs/media/ROBER.png +0 -0
  58. package/docs/media/VDP0L.png +0 -0
  59. package/docs/media/VDPOL.png +0 -0
  60. package/docs/media/acid-prod.gif +0 -0
  61. package/docs/media/basic-use.js +40 -0
  62. package/docs/media/basic-use.js.map +1 -0
  63. package/docs/media/basic-use.ts +44 -0
  64. package/docs/media/check-methods.js +59 -0
  65. package/docs/media/check-methods.js.map +1 -0
  66. package/docs/media/check-methods.ts +81 -0
  67. package/docs/media/corr-probs.js +132 -0
  68. package/docs/media/corr-probs.js.map +1 -0
  69. package/docs/media/corr-probs.ts +155 -0
  70. package/docs/media/cyclic-model.js +102 -0
  71. package/docs/media/cyclic-model.js.map +1 -0
  72. package/docs/media/cyclic-model.ts +112 -0
  73. package/docs/media/e5.js +36 -0
  74. package/docs/media/e5.js.map +1 -0
  75. package/docs/media/e5.ts +36 -0
  76. package/docs/media/hires.js +39 -0
  77. package/docs/media/hires.js.map +1 -0
  78. package/docs/media/hires.ts +40 -0
  79. package/docs/media/model-updates.js +112 -0
  80. package/docs/media/model-updates.js.map +1 -0
  81. package/docs/media/model-updates.ts +122 -0
  82. package/docs/media/orego.js +24 -0
  83. package/docs/media/orego.js.map +1 -0
  84. package/docs/media/orego.ts +25 -0
  85. package/docs/media/pipeline-use.js +87 -0
  86. package/docs/media/pipeline-use.js.map +1 -0
  87. package/docs/media/pipeline-use.ts +98 -0
  88. package/docs/media/pollution.js +132 -0
  89. package/docs/media/pollution.js.map +1 -0
  90. package/docs/media/pollution.ts +133 -0
  91. package/docs/media/print-benchmark.js +581 -0
  92. package/docs/media/print-benchmark.js.map +1 -0
  93. package/docs/media/print-benchmark.ts +594 -0
  94. package/docs/media/robertson.js +19 -0
  95. package/docs/media/robertson.js.map +1 -0
  96. package/docs/media/robertson.ts +19 -0
  97. package/docs/media/scripting.js +30 -0
  98. package/docs/media/scripting.js.map +1 -0
  99. package/docs/media/scripting.ts +35 -0
  100. package/docs/media/vdpol.js +17 -0
  101. package/docs/media/vdpol.js.map +1 -0
  102. package/docs/media/vdpol.ts +17 -0
  103. package/docs/modules.html +1 -0
  104. package/docs/types/Arg.html +12 -0
  105. package/docs/types/DifEqs.html +8 -0
  106. package/docs/types/Func.html +7 -0
  107. package/docs/types/IVP.html +40 -0
  108. package/docs/types/IVP2WebWorker.html +12 -0
  109. package/docs/types/Input.html +8 -0
  110. package/docs/types/Loop.html +7 -0
  111. package/docs/types/ODEs.html +31 -0
  112. package/docs/types/Output.html +6 -0
  113. package/docs/types/Pipeline.html +6 -0
  114. package/docs/types/SolverOptions.html +8 -0
  115. package/docs/types/Update.html +9 -0
  116. package/docs/types/Wrapper.html +8 -0
  117. package/index.js +1 -1
  118. package/index.js.map +1 -1
  119. package/index.ts +1 -1
  120. package/package.json +4 -2
  121. package/src/examples/check-methods.js +15 -3
  122. package/src/examples/check-methods.js.map +1 -1
  123. package/src/examples/check-methods.ts +18 -3
  124. package/src/solver-tools/cvode/common.js +487 -0
  125. package/src/solver-tools/cvode/common.js.map +1 -0
  126. package/src/solver-tools/cvode/common.ts +549 -0
  127. package/src/solver-tools/cvode/cvode.js +1062 -0
  128. package/src/solver-tools/cvode/cvode.js.map +1 -0
  129. package/src/solver-tools/cvode/cvode.ts +1226 -0
  130. package/src/solver-tools/cvode/cvode_adams.js +124 -0
  131. package/src/solver-tools/cvode/cvode_adams.js.map +1 -0
  132. package/src/solver-tools/cvode/cvode_adams.ts +142 -0
  133. package/src/solver-tools/cvode/cvode_bdf.js +153 -0
  134. package/src/solver-tools/cvode/cvode_bdf.js.map +1 -0
  135. package/src/solver-tools/cvode/cvode_bdf.ts +164 -0
  136. package/src/solver-tools/cvode/cvode_class.js +158 -0
  137. package/src/solver-tools/cvode/cvode_class.js.map +1 -0
  138. package/src/solver-tools/cvode/cvode_class.ts +271 -0
  139. package/src/solver-tools/cvode/cvode_hin.js +119 -0
  140. package/src/solver-tools/cvode/cvode_hin.js.map +1 -0
  141. package/src/solver-tools/cvode/cvode_hin.ts +150 -0
  142. package/src/solver-tools/cvode/cvode_io.js +203 -0
  143. package/src/solver-tools/cvode/cvode_io.js.map +1 -0
  144. package/src/solver-tools/cvode/cvode_io.ts +258 -0
  145. package/src/solver-tools/cvode/cvode_ls.js +210 -0
  146. package/src/solver-tools/cvode/cvode_ls.js.map +1 -0
  147. package/src/solver-tools/cvode/cvode_ls.ts +249 -0
  148. package/src/solver-tools/cvode/cvode_nls.js +220 -0
  149. package/src/solver-tools/cvode/cvode_nls.js.map +1 -0
  150. package/src/solver-tools/cvode/cvode_nls.ts +259 -0
  151. package/src/solver-tools/cvode/cvode_root.js +415 -0
  152. package/src/solver-tools/cvode/cvode_root.js.map +1 -0
  153. package/src/solver-tools/cvode/cvode_root.ts +503 -0
  154. package/src/solver-tools/cvode/dense_linalg.js +131 -0
  155. package/src/solver-tools/cvode/dense_linalg.js.map +1 -0
  156. package/src/solver-tools/cvode/dense_linalg.ts +144 -0
  157. package/src/solver-tools/cvode/index.js +26 -0
  158. package/src/solver-tools/cvode/index.js.map +1 -0
  159. package/src/solver-tools/cvode/index.ts +64 -0
  160. package/src/solver-tools/cvode-method.js +114 -0
  161. package/src/solver-tools/cvode-method.js.map +1 -0
  162. package/src/solver-tools/cvode-method.ts +129 -0
  163. package/src/solver-tools/index.js +1 -0
  164. package/src/solver-tools/index.js.map +1 -1
  165. package/src/solver-tools/index.ts +1 -0
  166. package/src/solver-tools/lsoda/blas.js +11 -0
  167. package/src/solver-tools/lsoda/blas.js.map +1 -1
  168. package/src/solver-tools/lsoda/blas.ts +12 -0
  169. package/src/solver-tools/lsoda/cfode.js +11 -0
  170. package/src/solver-tools/lsoda/cfode.js.map +1 -1
  171. package/src/solver-tools/lsoda/cfode.ts +12 -0
  172. package/src/solver-tools/lsoda/corfailure.js +11 -0
  173. package/src/solver-tools/lsoda/corfailure.js.map +1 -1
  174. package/src/solver-tools/lsoda/corfailure.ts +12 -0
  175. package/src/solver-tools/lsoda/correction.js +11 -0
  176. package/src/solver-tools/lsoda/correction.js.map +1 -1
  177. package/src/solver-tools/lsoda/correction.ts +12 -0
  178. package/src/solver-tools/lsoda/dense.js +11 -0
  179. package/src/solver-tools/lsoda/dense.js.map +1 -1
  180. package/src/solver-tools/lsoda/dense.ts +12 -0
  181. package/src/solver-tools/lsoda/index.js +11 -0
  182. package/src/solver-tools/lsoda/index.js.map +1 -1
  183. package/src/solver-tools/lsoda/index.ts +12 -0
  184. package/src/solver-tools/lsoda/intdy.js +11 -0
  185. package/src/solver-tools/lsoda/intdy.js.map +1 -1
  186. package/src/solver-tools/lsoda/intdy.ts +12 -0
  187. package/src/solver-tools/lsoda/lsoda.js +11 -0
  188. package/src/solver-tools/lsoda/lsoda.js.map +1 -1
  189. package/src/solver-tools/lsoda/lsoda.ts +12 -0
  190. package/src/solver-tools/lsoda/methodswitch.js +11 -0
  191. package/src/solver-tools/lsoda/methodswitch.js.map +1 -1
  192. package/src/solver-tools/lsoda/methodswitch.ts +12 -0
  193. package/src/solver-tools/lsoda/orderswitch.js +11 -0
  194. package/src/solver-tools/lsoda/orderswitch.js.map +1 -1
  195. package/src/solver-tools/lsoda/orderswitch.ts +12 -0
  196. package/src/solver-tools/lsoda/prja.js +11 -0
  197. package/src/solver-tools/lsoda/prja.js.map +1 -1
  198. package/src/solver-tools/lsoda/prja.ts +12 -0
  199. package/src/solver-tools/lsoda/scaleh.js +11 -0
  200. package/src/solver-tools/lsoda/scaleh.js.map +1 -1
  201. package/src/solver-tools/lsoda/scaleh.ts +12 -0
  202. package/src/solver-tools/lsoda/solsy.js +11 -0
  203. package/src/solver-tools/lsoda/solsy.js.map +1 -1
  204. package/src/solver-tools/lsoda/solsy.ts +12 -0
  205. package/src/solver-tools/lsoda/stoda.js +11 -0
  206. package/src/solver-tools/lsoda/stoda.js.map +1 -1
  207. package/src/solver-tools/lsoda/stoda.ts +12 -0
  208. package/src/solver-tools/lsoda-method.js +23 -9
  209. package/src/solver-tools/lsoda-method.js.map +1 -1
  210. package/src/solver-tools/lsoda-method.ts +27 -9
  211. package/src/solver-tools/solver-defs.js +1 -0
  212. package/src/solver-tools/solver-defs.js.map +1 -1
  213. package/src/solver-tools/solver-defs.ts +1 -0
  214. package/src/tests/cvode-lib-correctness.test.js +404 -0
  215. package/src/tests/cvode-lib-correctness.test.js.map +1 -0
  216. package/src/tests/cvode-lib-correctness.test.ts +505 -0
  217. package/src/tests/cvode-lib-performance.test.js +103 -0
  218. package/src/tests/cvode-lib-performance.test.js.map +1 -0
  219. package/src/tests/cvode-lib-performance.test.ts +128 -0
  220. package/src/tests/performance.test.js +4 -2
  221. package/src/tests/performance.test.js.map +1 -1
  222. package/src/tests/performance.test.ts +4 -2
  223. package/src/tests/test-defs.js +7 -1
  224. package/src/tests/test-defs.js.map +1 -1
  225. package/src/tests/test-defs.ts +8 -1
  226. package/src/worker-tools/solving.js +3 -1
  227. package/src/worker-tools/solving.js.map +1 -1
  228. package/src/worker-tools/solving.ts +4 -1
  229. package/src/examples/bioreactor.js +0 -125
  230. package/src/examples/bioreactor.js.map +0 -1
  231. package/src/examples/bioreactor.ts +0 -132
@@ -0,0 +1,581 @@
1
+ import { robertson } from './robertson';
2
+ import { hires } from './hires';
3
+ import { vdpol } from './vdpol';
4
+ import { orego } from './orego';
5
+ import { e5 } from './e5';
6
+ import { pollution } from './pollution';
7
+ import { mrt, ros34prw } from '../../index';
8
+ /** Solve the given problem and output to console the solution */
9
+ export function printSolution(task, method, separator) {
10
+ try {
11
+ // Solve the problem
12
+ const solution = method(task);
13
+ // Output results
14
+ console.log(task.name);
15
+ let line = [task.arg.name].concat(task.solutionColNames).join(separator);
16
+ console.log(line);
17
+ const length = solution[0].length;
18
+ for (let i = 0; i < length; ++i) {
19
+ line = solution.map((col) => col[i].toString()).join(separator);
20
+ console.log(line);
21
+ }
22
+ }
23
+ catch (err) {
24
+ console.log('Solver failed: ', err instanceof Error ? err.message : 'Unknown problem!');
25
+ }
26
+ }
27
+ const SEPARATOR = ' '; // use ',' to get csv
28
+ /** Print solution of the ROBER benchmark problem
29
+ * @example
30
+ * ```ts
31
+ * // TypeScript usage example
32
+ * import {printRobertson} from 'diff-grok';
33
+ *
34
+ * printRobertson();
35
+ * ```
36
+ *
37
+ * ```python
38
+ * # Python reference calculation for comparison
39
+ * import numpy as np
40
+ import pandas as pd
41
+ from scipy.integrate import solve_ivp
42
+
43
+ METHOD = "Radau" # "BDF" or "LSODA"
44
+
45
+ # -------------------------
46
+ # 1. Define Robertson ODE
47
+ # -------------------------
48
+ def robertson(t, y):
49
+ A, B, C = y
50
+ dA = -0.04 * A + 1e4 * B * C
51
+ dB = 0.04 * A - 1e4 * B * C - 3e7 * B**2
52
+ dC = 3e7 * B**2
53
+ return [dA, dB, dC]
54
+
55
+ # -------------------------
56
+ # 2. Initial conditions
57
+ # -------------------------
58
+ y0 = [1.0, 0.0, 0.0]
59
+ t_start = 0.0
60
+ t_end = 1e11
61
+ t_step = 2.5e6
62
+ t_span = (t_start, t_end)
63
+
64
+ # Output points
65
+ t_eval = np.arange(t_start, t_end + t_step, t_step)
66
+
67
+ # -------------------------
68
+ # 3. Solve ODE
69
+ # -------------------------
70
+ sol = solve_ivp(
71
+ robertson,
72
+ t_span,
73
+ y0,
74
+ method=METHOD,
75
+ t_eval=t_eval,
76
+ rtol=1e-7,
77
+ atol=1e-7
78
+ )
79
+
80
+ print("Success:", sol.success)
81
+ print("Message:", sol.message)
82
+
83
+ # sol.t → time array, sol.y.T → concentrations (n_points, 3)
84
+ data = np.column_stack((sol.t, sol.y.T))
85
+
86
+ # Create DataFrame with headers
87
+ df = pd.DataFrame(data, columns=['time', 'A', 'B', 'C'])
88
+
89
+ # Save to CSV
90
+ df.to_csv(f'ROBER-using-{METHOD}.csv', index=False)
91
+ ```
92
+ */
93
+ export function printRobertson() {
94
+ printSolution(robertson, mrt, SEPARATOR);
95
+ }
96
+ /** Print solution of the HIRES benchmark problem
97
+ * @example
98
+ * ```ts
99
+ * // TypeScript usage example
100
+ * import {printHires} from 'diff-grok';
101
+ *
102
+ * printHires();
103
+ * ```
104
+ *
105
+ * ```python
106
+ * # Python reference calculation for comparison
107
+ * import numpy as np
108
+ import pandas as pd
109
+ from scipy.integrate import solve_ivp
110
+
111
+ # -------------------------
112
+ # 0. Solver method
113
+ # -------------------------
114
+ METHOD = "Radau" # stiff solver suitable for HIRES
115
+
116
+ # -------------------------
117
+ # 1. Define HIRES ODE
118
+ # -------------------------
119
+ def hires(t, y):
120
+ y1, y2, y3, y4, y5, y6, y7, y8 = y
121
+ dy = np.zeros(8)
122
+ dy[0] = -1.71 * y1 + 0.43 * y2 + 8.32 * y3 + 0.0007
123
+ dy[1] = 1.71 * y1 - 8.75 * y2
124
+ dy[2] = -10.03 * y3 + 0.43 * y4 + 0.035 * y5
125
+ dy[3] = 8.32 * y2 + 1.71 * y3 - 1.12 * y4
126
+ dy[4] = -1.745 * y5 + 0.43 * y6 + 0.43 * y7
127
+ dy[5] = -280 * y6 * y8 + 0.69 * y4 + 1.71 * y5 - 0.43 * y6 + 0.69 * y7
128
+ dy[6] = 280 * y6 * y8 - 1.81 * y7
129
+ dy[7] = -280 * y6 * y8 + 1.81 * y7
130
+ return dy
131
+
132
+ # -------------------------
133
+ # 2. Initial conditions and time
134
+ # -------------------------
135
+ y0 = [1, 0, 0, 0, 0, 0, 0, 0.0057]
136
+
137
+ t_start = 0.0
138
+ t_end = 321.8122
139
+ t_step = 0.01
140
+ n_points = int(np.ceil((t_end - t_start) / t_step)) + 1
141
+ t_eval = np.linspace(t_start, t_end, n_points)
142
+
143
+ # -------------------------
144
+ # 3. Solve ODE
145
+ # -------------------------
146
+ sol = solve_ivp(
147
+ hires,
148
+ t_span,
149
+ y0,
150
+ method=METHOD,
151
+ t_eval=t_eval,
152
+ rtol=1e-10,
153
+ atol=1e-10
154
+ )
155
+
156
+ print("Success:", sol.success)
157
+ print("Message:", sol.message)
158
+
159
+ # -------------------------
160
+ # 4. Save solution to CSV
161
+ # -------------------------
162
+ # Combine time + concentrations
163
+ data = np.column_stack((sol.t, sol.y.T))
164
+
165
+ # Column names
166
+ col_names = ['t'] + ['y1','y2','y3','y4','y5','y6','y7','y8']
167
+
168
+ # Create DataFrame and save
169
+ df = pd.DataFrame(data, columns=col_names)
170
+ filename = f'HIRES-using-{METHOD}.csv'
171
+ df.to_csv(filename, index=False)
172
+
173
+ print(f"Solution saved to '{filename}'")
174
+
175
+ ```
176
+ */
177
+ export function printHires() {
178
+ printSolution(hires, ros34prw, SEPARATOR);
179
+ }
180
+ /** Print solution of the VDPOL benchmark problem
181
+ * @example
182
+ * ```ts
183
+ * // TypeScript usage example
184
+ * import {printVdpol} from 'diff-grok';
185
+ *
186
+ * printVdpol();
187
+ * ```
188
+ *
189
+ * ```python
190
+ * # Python reference calculation for comparison
191
+ * import numpy as np
192
+ import pandas as pd
193
+ from scipy.integrate import solve_ivp
194
+
195
+ # -------------------------
196
+ # 0. Solver method
197
+ # -------------------------
198
+ METHOD = "Radau" # stiff solver recommended for van der Pol with large mu
199
+
200
+ # -------------------------
201
+ # 1. Define van der Pol ODE (stiff)
202
+ # -------------------------
203
+ def vdpol(t, y):
204
+ x1, x2 = y
205
+ dx1 = x2
206
+ dx2 = -x1 + 1000 * (1 - x1**2) * x2 # mu = 1000
207
+ return [dx1, dx2]
208
+
209
+ # -------------------------
210
+ # 2. Initial conditions and time
211
+ # -------------------------
212
+ y0 = [-1, 1]
213
+ t_start = 0.0
214
+ t_end = 2000.0
215
+ t_step = 0.1
216
+
217
+ # Use linspace to avoid "t_eval not in t_span" error
218
+ n_points = int(np.ceil((t_end - t_start) / t_step)) + 1
219
+ t_eval = np.linspace(t_start, t_end, n_points)
220
+
221
+ # -------------------------
222
+ # 3. Solve ODE
223
+ # -------------------------
224
+ sol = solve_ivp(
225
+ vdpol,
226
+ (t_start, t_end),
227
+ y0,
228
+ method=METHOD,
229
+ t_eval=t_eval,
230
+ rtol=1e-12,
231
+ atol=1e-12
232
+ )
233
+
234
+ print("Success:", sol.success)
235
+ print("Message:", sol.message)
236
+
237
+ # -------------------------
238
+ # 4. Save solution to CSV
239
+ # -------------------------
240
+ data = np.column_stack((sol.t, sol.y.T))
241
+ col_names = ['t', 'x1', 'x2']
242
+
243
+ df = pd.DataFrame(data, columns=col_names)
244
+ filename = f"VANDERPOL-using-{METHOD}.csv"
245
+ df.to_csv(filename, index=False)
246
+
247
+ print(f"Solution saved to '{filename}'")
248
+
249
+ ```
250
+ */
251
+ export function printVdpol() {
252
+ printSolution(vdpol, ros34prw, SEPARATOR);
253
+ }
254
+ /** Print solution of the OREGO benchmark problem
255
+ * @example
256
+ * ```ts
257
+ * // TypeScript usage example
258
+ * import {printOrego} from 'diff-grok';
259
+ *
260
+ * printOrego();
261
+ * ```
262
+ *
263
+ * ```python
264
+ * # Python reference calculation for comparison
265
+ * import numpy as np
266
+ import pandas as pd
267
+ from scipy.integrate import solve_ivp
268
+
269
+ # -------------------------
270
+ # 0. Solver method
271
+ # -------------------------
272
+ METHOD = "Radau" # stiff solver recommended
273
+
274
+ # -------------------------
275
+ # 1. Define OREGO ODE
276
+ # -------------------------
277
+ def orego(t, y):
278
+ y1, y2, y3 = y
279
+ dy1 = 77.27 * (y2 - y1 * y2 + y1 - 0.000008375 * y1**2)
280
+ dy2 = ( -y2 - y1 * y2 + y3 ) / 77.27
281
+ dy3 = 0.161 * (y1 - y3)
282
+ return [dy1, dy2, dy3]
283
+
284
+ # -------------------------
285
+ # 2. Initial conditions and time
286
+ # -------------------------
287
+ y0 = [1, 2, 3]
288
+ t_start = 0.0
289
+ t_end = 360.0
290
+ t_step = 0.01
291
+
292
+ # Use linspace to ensure t_eval within t_span
293
+ n_points = int(np.ceil((t_end - t_start) / t_step)) + 1
294
+ t_eval = np.linspace(t_start, t_end, n_points)
295
+
296
+ # -------------------------
297
+ # 3. Solve ODE
298
+ # -------------------------
299
+ sol = solve_ivp(
300
+ orego,
301
+ (t_start, t_end),
302
+ y0,
303
+ method=METHOD,
304
+ t_eval=t_eval,
305
+ rtol=1e-8,
306
+ atol=1e-8
307
+ )
308
+
309
+ print("Success:", sol.success)
310
+ print("Message:", sol.message)
311
+
312
+ # -------------------------
313
+ # 4. Save solution to CSV
314
+ # -------------------------
315
+ data = np.column_stack((sol.t, sol.y.T))
316
+ col_names = ['t', 'y1', 'y2', 'y3']
317
+
318
+ df = pd.DataFrame(data, columns=col_names)
319
+ filename = f"OREGO-using-{METHOD}.csv"
320
+ df.to_csv(filename, index=False)
321
+
322
+ print(f"Solution saved to '{filename}'")
323
+ ```
324
+ */
325
+ export function printOrego() {
326
+ printSolution(orego, ros34prw, SEPARATOR);
327
+ }
328
+ /** Print solution of the E5 benchmark problem
329
+ * @example
330
+ * ```ts
331
+ * // TypeScript usage example
332
+ * import {printE5} from 'diff-grok';
333
+ *
334
+ * printE5();
335
+ * ```
336
+ *
337
+ * ```python
338
+ * # Python reference calculation for comparison
339
+ * import numpy as np
340
+ import pandas as pd
341
+ from scipy.integrate import solve_ivp
342
+
343
+ # -------------------------
344
+ # 0. Solver method
345
+ # -------------------------
346
+ METHOD = "Radau" # stiff solver recommended
347
+
348
+ # -------------------------
349
+ # 1. Define E5 constants
350
+ # -------------------------
351
+ K1 = 7.89e-10
352
+ K2 = 1.13e9
353
+ K3 = 1.1e7
354
+ K4 = 1.13e3
355
+
356
+ # -------------------------
357
+ # 2. Define E5 ODE
358
+ # -------------------------
359
+ def e5(t, y):
360
+ y1, y2, y3, y4 = y
361
+ dy = np.zeros(4)
362
+ dy[0] = -K1 * y1 - K3 * y1 * y3
363
+ dy[1] = K1 * y1 - K2 * y2 * y3
364
+ dy[2] = K1 * y1 - K2 * y2 * y3 - K3 * y1 * y3 + K4 * y4
365
+ dy[3] = K3 * y1 * y3 - K4 * y4
366
+ return dy
367
+
368
+ # -------------------------
369
+ # 3. Initial conditions and time
370
+ # -------------------------
371
+ y0 = [0.00176, 0, 0, 0]
372
+ t_start = 0.0
373
+ t_end = 1e6
374
+ t_step = 2.5e3
375
+
376
+ # Ensure t_eval is within t_span
377
+ n_points = int(np.ceil((t_end - t_start) / t_step)) + 1
378
+ t_eval = np.linspace(t_start, t_end, n_points)
379
+
380
+ # -------------------------
381
+ # 4. Solve ODE
382
+ # -------------------------
383
+ sol = solve_ivp(
384
+ e5,
385
+ (t_start, t_end),
386
+ y0,
387
+ method=METHOD,
388
+ t_eval=t_eval,
389
+ rtol=1e-6,
390
+ atol=1e-6
391
+ )
392
+
393
+ print("Success:", sol.success)
394
+ print("Message:", sol.message)
395
+
396
+ # -------------------------
397
+ # 5. Save solution to CSV
398
+ # -------------------------
399
+ data = np.column_stack((sol.t, sol.y.T))
400
+ col_names = ['t', 'y1', 'y2', 'y3', 'y4']
401
+
402
+ df = pd.DataFrame(data, columns=col_names)
403
+ filename = f"E5-using-{METHOD}.csv"
404
+ df.to_csv(filename, index=False)
405
+
406
+ print(f"Solution saved to '{filename}'")
407
+ */
408
+ export function printE5() {
409
+ printSolution(e5, ros34prw, SEPARATOR);
410
+ }
411
+ /** Print solution of the POLL benchmark problem
412
+ * @example
413
+ * ```ts
414
+ * // TypeScript usage example
415
+ * import {printPollution} from 'diff-grok';
416
+ *
417
+ * printPollution();
418
+ * ```
419
+ *
420
+ * ```python
421
+ * # Python reference calculation for comparisonimport numpy as np
422
+ import pandas as pd
423
+ from scipy.integrate import solve_ivp
424
+
425
+ # -------------------------
426
+ # 0. Solver method and tolerance
427
+ # -------------------------
428
+ METHOD = "Radau" # stiff solver
429
+ RTOL = 1e-6
430
+ ATOL = 1e-6
431
+
432
+ # -------------------------
433
+ # 1. Reaction constants
434
+ # -------------------------
435
+ k1 = 0.35
436
+ k2 = 26.6
437
+ k3 = 1.23e4
438
+ k4 = 8.6e-4
439
+ k5 = 8.2e-4
440
+ k6 = 1.5e4
441
+ k7 = 1.3e-4
442
+ k8 = 2.4e4
443
+ k9 = 1.65e4
444
+ k10 = 9e3
445
+ k11 = 0.022
446
+ k12 = 1.2e4
447
+ k13 = 1.88
448
+ k14 = 1.63e4
449
+ k15 = 4.8e6
450
+ k16 = 3.5e-4
451
+ k17 = 0.0175
452
+ k18 = 1e8
453
+ k19 = 4.44e11
454
+ k20 = 1240
455
+ k21 = 2.1
456
+ k22 = 5.78
457
+ k23 = 0.0474
458
+ k24 = 1780
459
+ k25 = 3.12
460
+
461
+ # -------------------------
462
+ # 2. Initial conditions
463
+ # -------------------------
464
+ y0 = [
465
+ 0, # y1 NO2
466
+ 0.2, # y2 NO
467
+ 0, # y3 O3P
468
+ 0.04, # y4 O3
469
+ 0, # y5 HO2
470
+ 0, # y6 OH
471
+ 0.1, # y7 HCHO
472
+ 0.3, # y8 CO
473
+ 0.01, # y9 ALD
474
+ 0, # y10 MEO2
475
+ 0, # y11 C2O3
476
+ 0, # y12 CO2
477
+ 0, # y13 PAN
478
+ 0, # y14 CH3O
479
+ 0, # y15 HNO3
480
+ 0, # y16 O1D
481
+ 0.007, # y17 SO2
482
+ 0, # y18 SO4
483
+ 0, # y19 NO3
484
+ 0 # y20 N2O5
485
+ ]
486
+
487
+ # -------------------------
488
+ # 3. Define POLL ODE system
489
+ # -------------------------
490
+ def poll(t, y):
491
+ y = np.array(y)
492
+ r1 = k1*y[0]
493
+ r2 = k2*y[1]*y[3]
494
+ r3 = k3*y[4]*y[1]
495
+ r4 = k4*y[6]
496
+ r5 = k5*y[6]
497
+ r6 = k6*y[6]*y[5]
498
+ r7 = k7*y[8]
499
+ r8 = k8*y[8]*y[5]
500
+ r9 = k9*y[10]*y[1]
501
+ r10 = k10*y[10]*y[0]
502
+ r11 = k11*y[12]
503
+ r12 = k12*y[9]*y[1]
504
+ r13 = k13*y[13]
505
+ r14 = k14*y[0]*y[5]
506
+ r15 = k15*y[2]
507
+ r16 = k16*y[3]
508
+ r17 = k17*y[3]
509
+ r18 = k18*y[15]
510
+ r19 = k19*y[15]
511
+ r20 = k20*y[16]*y[5]
512
+ r21 = k21*y[18]
513
+ r22 = k22*y[18]
514
+ r23 = k23*y[0]*y[3]
515
+ r24 = k24*y[18]*y[0]
516
+ r25 = k25*y[19]
517
+
518
+ dy = np.zeros(20)
519
+ dy[0] = -(r1 + r10 + r14 + r23 + r24) + (r2 + r3 + r9 + r11 + r12 + r22 + r25)
520
+ dy[1] = -r2 - r3 - r9 - r12 + r1 + r21
521
+ dy[2] = -r15 + r1 + r17 + r19 + r22
522
+ dy[3] = -r2 - r16 - r17 - r23 + r15
523
+ dy[4] = -r3 + 2*r4 + r6 + r7 + r13 + r20
524
+ dy[5] = -r6 - r8 - r14 - r20 + r3 + 2*r18
525
+ dy[6] = -r4 - r5 - r6 + r13
526
+ dy[7] = r4 + r5 + r6 + r7
527
+ dy[8] = -r7 - r8
528
+ dy[9] = -r12 + r7 + r9
529
+ dy[10] = -r9 - r10 + r8 + r11
530
+ dy[11] = r9
531
+ dy[12] = -r11 + r10
532
+ dy[13] = -r13 + r12
533
+ dy[14] = r14
534
+ dy[15] = -r18 - r19 + r16
535
+ dy[16] = -r20
536
+ dy[17] = r20
537
+ dy[18] = -r21 - r22 - r24 + r23 + r25
538
+ dy[19] = -r25 + r24
539
+
540
+ return dy
541
+
542
+ # -------------------------
543
+ # 4. Time array
544
+ # -------------------------
545
+ t_start = 0
546
+ t_end = 60 # final time
547
+ t_step = 0.002
548
+ n_points = int(np.ceil((t_end - t_start)/t_step)) + 1
549
+ t_eval = np.linspace(t_start, t_end, n_points)
550
+
551
+ # -------------------------
552
+ # 5. Solve ODE
553
+ # -------------------------
554
+ sol = solve_ivp(
555
+ poll,
556
+ (t_start, t_end),
557
+ y0,
558
+ method=METHOD,
559
+ t_eval=t_eval,
560
+ rtol=RTOL,
561
+ atol=ATOL
562
+ )
563
+
564
+ print("Success:", sol.success)
565
+ print("Message:", sol.message)
566
+
567
+ # -------------------------
568
+ # 6. Save solution to CSV
569
+ # -------------------------
570
+ col_names = ['t'] + [f'y{i+1}' for i in range(20)]
571
+ data = np.column_stack((sol.t, sol.y.T))
572
+ df = pd.DataFrame(data, columns=col_names)
573
+ filename = f"POLL-using-{METHOD}.csv"
574
+ df.to_csv(filename, index=False)
575
+
576
+ print(f"Solution saved to '{filename}'")
577
+ */
578
+ export function printPollution() {
579
+ printSolution(pollution, ros34prw, SEPARATOR);
580
+ }
581
+ //# sourceMappingURL=print-benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-benchmark.js","sourceRoot":"","sources":["print-benchmark.ts"],"names":[],"mappings":"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"}