Hi Robert,
I am currently facing a new difficulty using Sfepy for solving nonlinear PDEs. I have coded my own
Newton’s iterative method that simply consists in linearizing the PDE F(u)=0 around the previous
iteration u_k. I have two questions:
1) At each iteration, I create a `Problem` instance for the linearized PDE and solve it the usual
way in Sfepy. However, only the “linearized-nonlinear” terms need to be recomputed from one iteration
to another. For the sake of computational efficiency, I wish not to reconstruct all matrices / rhs vectors
but only the ones that need to be updated. How would you achieve that? In other words, how can you
store some assembled terms while re-assembling some others?
2) For some reason, I need to evaluate another function, say G (a residual), at each iteration in
the weak form. Again, some terms in G are constant while others are iteration-dependent (through
their material). How would you efficiently evaluate G(u_k) at each iteration? Currently, the only way
I found is to do
dummy_ts = TimeStepper(0, 100) # ficticious time-stepper
eqs = Equations([my_equation]) # equation associated with function G
eqs.init_state()
ebcs = Conditions(my_ebcs)
epbcs = Conditions(my_epbcs)
eqs.time_update(dummy_ts, ebcs=ebcs, epbcs=epbcs)
res_vec = eqs.eval_residuals(sol) # sol is the solution at current iteration
which I guess this is not Sfepy’s philosophy…
I hope my questions are clear enough. Thank you very much in advance for your help.
Best regards,
Hugo L.