Oh no, I was mistaken: I meant that the objective function is continuous, but 
its derivative is not. That is why I am using snesvinewtonssls. 

* However, the problem is that the nonlinear constraints I define in " 
ComputeBounds " are always inactive. As you can see in the output: 

0 SNES Function norm 1.562978975444e+07 
0 SNES VI Function norm 1.56298e+07 Active lower constraints 0/0 upper 
constraints 0/0 Percent of total 0. Percent of bounded 0. 
0 KSP Residual norm 1.976350248286e+04 
1 KSP Residual norm 1.483291315197e+04 
2 KSP Residual norm 1.358944289069e+04 
3 KSP Residual norm 1.276791956295e+04 
4 KSP Residual norm 1.275078123378e+04 
5 KSP Residual norm 1.253064296351e+04 
6 KSP Residual norm 1.232954788760e+04 
7 KSP Residual norm 1.232684700773e+04 
8 KSP Residual norm 1.165265510468e+04 
9 KSP Residual norm 1.159313964889e+04 
10 KSP Residual norm 1.098241228864e+04 
11 KSP Residual norm 1.063610434231e+04 
12 KSP Residual norm 8.556981786904e+03 
13 KSP Residual norm 7.792752698989e+03 
14 KSP Residual norm 6.260039598596e+03 
15 KSP Residual norm 3.025534878795e+03 
16 KSP Residual norm 8.343990389000e+02 
17 KSP Residual norm 2.591011944960e+02 
18 KSP Residual norm 9.212497850148e+01 
19 KSP Residual norm 4.137422005070e+01 
20 KSP Residual norm 1.345189115925e+01 
21 KSP Residual norm 2.795423327875e+00 
22 KSP Residual norm 5.068536677416e-01 
23 KSP Residual norm 1.167594367615e-01 
Linear solve converged due to CONVERGED_RTOL iterations 23 
[Non physique] pression négative ou NaN à la cellule 61 : p = -1.66778e+14 
Line search: objective function at lambdas = 1. is Inf or Nan, cutting lambda 
[Non physique] pression négative ou NaN à la cellule 61 : p = -4.06293e+13 
Line search: objective function at lambdas = 0.5 is Inf or Nan, cutting lambda 
[Non physique] pression négative ou NaN à la cellule 61 : p = -9.63498e+12 
Line search: objective function at lambdas = 0.25 is Inf or Nan, cutting lambda 
[Non physique] pression négative ou NaN à la cellule 61 : p = -2.15792e+12 
Line search: objective function at lambdas = 0.125 is Inf or Nan, cutting 
lambda 
[Non physique] pression négative ou NaN à la cellule 61 : p = -1568.11 
Line search: objective function at lambdas = 0.0625 is Inf or Nan, cutting 
lambda 
[Non physique] pression négative ou NaN à la cellule 788 : p = -11.2882 
Line search: objective function at lambdas = 0.03125 is Inf or Nan, cutting 
lambda 
Line search: Using full step: fnorm 1.562978975444e+07 gnorm 1.519904837982e+07 

So none of my lower or upper bounds are active during the iterations. 

* Here is my ComputeBounds function, where I try to enforce positivity of 
density and pressure: 

PetscErrorCode ComputeBounds(SNES snes, Vec xl, Vec xu) { 
PetscFunctionBeginUser; 

// 1) Get user context (must have been set via SNESSetApplicationContext) 
void *ctx = NULL; 
PetscCall(SNESGetApplicationContext(snes, &ctx)); 
euler *e = (euler*)ctx; 

// Minimal positive thresholds 
const double eps_rho = 1e-8; // minimal density 
const double pmin = 1e-8; // minimal pressure 

// 2) Access current solution X (used here to build *dynamic* bounds) 
Vec X; 
const PetscScalar *x = NULL; 
PetscCall(SNESGetSolution(snes, &X)); 
PetscCall(VecGetArrayRead(X, &x)); 

// 3) Fill lower bounds 'xl' 
PetscScalar *l = NULL; 
PetscCall(VecGetArray(xl, &l)); 

for (int K = 0; K < e->N_cells; ++K) { 
const int i_rho = Ncomp*K + 0; // density index 
const int i_m = Ncomp*K + 1; // momentum (1D). In 2D use mx,my and adjust 
kinetic term. 
const int i_rhoE = Ncomp*K + 2; // total energy index 

const double rho = (double)x[i_rho]; 
const double m = (double)x[i_m]; 

// Use a safe density to avoid division by ~0 in kinetic energy 
const double rho_safe = PetscMax(rho, eps_rho); 

// Kinetic energy per unit volume: |m|^2/(2*rho) 
const double kin_vol = 0.5 * (m*m) / rho_safe; 

// Enforce p >= pmin via total energy lower bound: 
// rhoE >= kinetic + p/(gamma-1) 
const double rhoEmin = kin_vol + pmin/(_gamma - 1.0); 

// Set lower bounds 
l[i_rho] = eps_rho; // rho >= eps_rho 
l[i_m] = PETSC_NINFINITY; // no lower bound on momentum 
l[i_rhoE] = rhoEmin; // rhoE >= rhoEmin (to keep p >= pmin) 
} 

// 4) Restore arrays 
PetscCall(VecRestoreArrayRead(X, &x)); 
PetscCall(VecRestoreArray(xl, &l)); 

// 5) Set upper bounds to +infinity (no upper constraints) 
PetscCall(VecSet(xu, PETSC_INFINITY)); 

PetscFunctionReturn(PETSC_SUCCESS); 
} 

But when I run the solver, PETSc always reports Active lower constraints 0/0 . 
Why are my constraints not activated? 

Best regards, 
ALI ALI AHMAD 


De: "Matthew Knepley" <knep...@gmail.com> 
À: "Ali ALI AHMAD" <ali.ali_ah...@utt.fr> 
Cc: "petsc-maint" <petsc-ma...@mcs.anl.gov>, "petsc-users" 
<petsc-users@mcs.anl.gov>, "Barry Smith" <bsm...@petsc.dev> 
Envoyé: Lundi 25 Août 2025 03:42:36 
Objet: Re: [petsc-maint] Question about NewtonTR / Inexact Newton with 
piecewise continuous functions 

On Sun, Aug 24, 2025 at 8:16 PM Ali ALI AHMAD < [ mailto:ali.ali_ah...@utt.fr | 
ali.ali_ah...@utt.fr ] > wrote: 



Hello, 
I am currently working with PETSc to solve a nonlinear system. My function is 
piecewise continuous (so it can be discontinuous), and its derivative 
(Jacobian) is also piecewise continuous. 



I am not aware of any convergence framework for piecewise continuous functions. 
They are not technically computable, meaning you could have to compute for a 
very very long time, and still not get an accurate output (since you have the 
jump). This also means that the derivative is not computable, and you can have 
arbitrarily large errors near the discontinuity. I don't see how you could 
prove convergence here, but maybe someone else knows something I don't. 

Thanks, 

Matt 

BQ_BEGIN

I implemented the residual and also compute the Jacobian analytically. 
When the discontinuities are small, both Inexact Newton and NewtonTR (with 
scaled Newton direction) converge without problem. 
However, for test cases with larger discontinuities, sometimes the solver 
converges, but in other cases it fails to converge. 
I initially tried <vinewtonssls,vinewtonrsls> , but I cannot use them in my 
case, because my problem involves nonlinear constraints. 
So my question is: how does PETSc handle such situations internally (piecewise 
continuous objective/residual functions)? 
And is there a recommended strategy within PETSc to deal with nonlinear solvers 
when and are discontinuous? 
I would like to continue working with PETSc and I am looking for a robust 
method to treat this type of problem. 
Thank you very much for your help and suggestions. 
Best regards, 
ALI ALI AHMAD 

BQ_END



-- 
What most experimenters take for granted before they begin their experiments is 
infinitely more interesting than any results to which their experiments lead. 
-- Norbert Wiener 

[ 
https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!c59r-_cWhRyXgrv6zPsyXOKKCkQh6vxCZENKwjHfU9j8W-SbCNE9hvNJQKo-F6mc6MAmkFUmr5Ysk_S5VvLlpZfDMhUtWg$
  | 
https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!c59r-_cWhRyXgrv6zPsyXOKKCkQh6vxCZENKwjHfU9j8W-SbCNE9hvNJQKo-F6mc6MAmkFUmr5Ysk_S5VvLlpZeH41xL_Q$
  ] 

Reply via email to