1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
use c_void;
use crateSUNErrCode;
// /* -----------------------------------------------------------------------------
// * Programmer(s): David J. Gardner, and Cody J. Balos @ LLNL
// * -----------------------------------------------------------------------------
// * SUNDIALS Copyright Start
// * Copyright (c) 2025-2026, Lawrence Livermore National Security,
// * University of Maryland Baltimore County, and the SUNDIALS contributors.
// * Copyright (c) 2013-2025, Lawrence Livermore National Security
// * and Southern Methodist University.
// * Copyright (c) 2002-2013, Lawrence Livermore National Security.
// * All rights reserved.
// *
// * See the top-level LICENSE and NOTICE files for details.
// *
// * SPDX-License-Identifier: BSD-3-Clause
// * SUNDIALS Copyright End
// * -----------------------------------------------------------------------------
// * This is the header file for a generic nonlinear solver package. It defines
// * the SUNNonlinearSolver structure (_generic_SUNNonlinearSolver) which contains
// * the following fields:
// * - an implementation-dependent 'content' field which contains any internal
// * data required by the solver
// * - an 'ops' filed which contains a structure listing operations acting on/by
// * such solvers
// *
// * We consider iterative nonlinear solvers for systems in both root finding
// * (F(y) = 0) or fixed-point (G(y) = y) form. As a result, some of the routines
// * are applicable only to one type of nonlinear solver.
// * -----------------------------------------------------------------------------
// * This header file contains:
// * - function types supplied to a SUNNonlinearSolver,
// * - enumeration constants for SUNDIALS-defined nonlinear solver types,
// * - type declarations for the _generic_SUNNonlinearSolver and
// * _generic_SUNNonlinearSolver_Ops structures, as well as references to
// * pointers to such structures (SUNNonlinearSolver),
// * - prototypes for the nonlinear solver functions which operate
// * on/by SUNNonlinearSolver objects, and
// * - return codes for SUNNonLinearSolver objects.
// * -----------------------------------------------------------------------------
// * At a minimum, a particular implementation of a SUNNonlinearSolver must do the
// * following:
// * - specify the 'content' field of a SUNNonlinearSolver,
// * - implement the operations on/by the SUNNonlinearSovler objects,
// * - provide a constructor routine for new SUNNonlinearSolver objects
// *
// * Additionally, a SUNNonlinearSolver implementation may provide the following:
// * - "Set" routines to control solver-specific parameters/options
// * - "Get" routines to access solver-specific performance metrics
// * ---------------------------------------------------------------------------*/
// #ifndef _SUNNONLINEARSOLVER_H
// #define _SUNNONLINEARSOLVER_H
// #include <sundials/sundials_config.h>
// #include <sundials/sundials_context.h>
// #include <sundials/sundials_errors.h>
// #include <sundials/sundials_nvector.h>
// #include <sundials/sundials_types.h>
// #ifdef __cplusplus /* wrapper to enable C++ usage */
// extern "C" {
// #endif
// /* -----------------------------------------------------------------------------
// * Forward references for SUNNonlinearSolver types defined below
// * ---------------------------------------------------------------------------*/
// /* Forward reference for pointer to SUNNonlinearSolver_Ops object */
// typedef _SUNDIALS_STRUCT_ _generic_SUNNonlinearSolver_Ops* SUNNonlinearSolver_Ops;
// /* Forward reference for pointer to SUNNonlinearSolver object */
// typedef _SUNDIALS_STRUCT_ _generic_SUNNonlinearSolver* SUNNonlinearSolver;
pub type SUNNonlinearSolver = *mut c_void;
// /* -----------------------------------------------------------------------------
// * Integrator supplied function types
// * ---------------------------------------------------------------------------*/
// typedef int (*SUNNonlinSolSysFn)(N_Vector y, N_Vector F, void* mem);
// typedef int (*SUNNonlinSolLSetupFn)(sunbooleantype jbad, sunbooleantype* jcur,
// void* mem);
// typedef int (*SUNNonlinSolLSolveFn)(N_Vector b, void* mem);
// typedef int (*SUNNonlinSolConvTestFn)(SUNNonlinearSolver NLS, N_Vector y,
// N_Vector del, sunrealtype tol,
// N_Vector ewt, void* mem);
// typedef SUNErrCode (*SUNNonlinSolNormFn)(N_Vector del, N_Vector w,
// sunrealtype* delnrm, void* mem);
// typedef SUNErrCode (*SUNNonlinSolGetUpdateNormFn)(sunrealtype* delnrm, void* mem);
// typedef SUNErrCode (*SUNNonlinSolGetConvRateFn)(sunrealtype* crate, void* mem);
// /* -----------------------------------------------------------------------------
// * SUNNonlinearSolver types
// * ---------------------------------------------------------------------------*/
// enum SUNNonlinearSolver_Type
// {
// SUNNONLINEARSOLVER_ROOTFIND,
// SUNNONLINEARSOLVER_FIXEDPOINT,
// SUNNONLINEARSOLVER_HYBRID
// };
// #ifndef SWIG
// typedef enum SUNNonlinearSolver_Type SUNNonlinearSolver_Type;
// #endif
// /* -----------------------------------------------------------------------------
// * Generic definition of SUNNonlinearSolver
// * ---------------------------------------------------------------------------*/
// /* Structure containing function pointers to nonlinear solver operations */
// struct _generic_SUNNonlinearSolver_Ops
// {
// SUNNonlinearSolver_Type (*gettype)(SUNNonlinearSolver);
// SUNErrCode (*initialize)(SUNNonlinearSolver);
// int (*setup)(SUNNonlinearSolver, N_Vector, void*);
// int (*solve)(SUNNonlinearSolver, N_Vector, N_Vector, N_Vector, sunrealtype,
// sunbooleantype, void*);
// SUNErrCode (*free)(SUNNonlinearSolver);
// SUNErrCode (*setsysfn)(SUNNonlinearSolver, SUNNonlinSolSysFn);
// SUNErrCode (*setsysfns)(SUNNonlinearSolver, SUNNonlinSolSysFn,
// SUNNonlinSolSysFn);
// SUNErrCode (*setlsetupfn)(SUNNonlinearSolver, SUNNonlinSolLSetupFn);
// SUNErrCode (*setlsolvefn)(SUNNonlinearSolver, SUNNonlinSolLSolveFn);
// SUNErrCode (*setctestfn)(SUNNonlinearSolver, SUNNonlinSolConvTestFn, void*);
// SUNErrCode (*setnormfn)(SUNNonlinearSolver, SUNNonlinSolNormFn, void*);
// SUNErrCode (*setgetupdatenormfn)(SUNNonlinearSolver,
// SUNNonlinSolGetUpdateNormFn, void*);
// SUNErrCode (*setgetconvratefn)(SUNNonlinearSolver, SUNNonlinSolGetConvRateFn,
// void*);
// SUNErrCode (*setoptions)(SUNNonlinearSolver NLS, const char* NLSid,
// const char* file_name, int argc, char* argv[]);
// SUNErrCode (*setmaxiters)(SUNNonlinearSolver, int);
// SUNErrCode (*getnumiters)(SUNNonlinearSolver, long int*);
// SUNErrCode (*getcuriter)(SUNNonlinearSolver, int*);
// SUNErrCode (*getnumconvfails)(SUNNonlinearSolver, long int*);
// };
// /* A nonlinear solver is a structure with an implementation-dependent 'content'
// field, and a pointer to a structure of solver nonlinear solver operations
// corresponding to that implementation. */
// struct _generic_SUNNonlinearSolver
// {
// void* content;
// void* python;
// SUNNonlinearSolver_Ops ops;
// SUNContext sunctx;
// };
unsafe extern "C"
// /* -----------------------------------------------------------------------------
// * SUNNonlinearSolver return values
// * ---------------------------------------------------------------------------*/
// /* Recoverable */
// #define SUN_NLS_CONTINUE +901 /* not converged, keep iterating */
// #define SUN_NLS_CONV_RECVR +902 /* convergece failure, try to recover */
// #define SUN_NLS_SWITCH +903 /* auto solver decided to switch algorithms */
// #ifdef __cplusplus
// }
// #endif
// #endif