Re: question on source term

2014-06-20 Thread Daniel Wheeler
On Thu, Jun 19, 2014 at 11:53 AM, Benny Malengier
benny.maleng...@gmail.com wrote:
 Hi,

 another question. This time on SourceTerm use. I'm checking an article with
 diffusion and reaction. So some species diffuse, others only react (waiting
 for diffused species to start). If there is an example with this floating on
 the internet, do point it my way!

Not that I'm aware of.

 You then have a coupled set of equations, of which one of the non diffusive
 species will have equation like

 eqn3 = TransientTerm(var=P0) == ImplicitSourceTerm(-k3*M1, var=P0) +
 ImplicitSourceTerm(-k5*M2, var=P0)


 eqn4 = TransientTerm(var=P1) == ImplicitSourceTerm(k3*P0, var=M1)


 M1 will have another equation that has a diffusionterm.

 In eqn3 it is normal to use ImplicitSourceTerm as the rhs has -k3 M1 P0.

Yes, but the right splitting for -k3 * M1 * P0 is probably

   k3 * M1 * P0 - ImplicitSourceTerm(k3 * M1, var=P0) -
ImplicitSourceTerm(k3 * P0, var=M1)

 In eqn4, we could actually write


 eqn4 = TransientTerm(var=P1) == k3*P0*M1


 or


 eqn4 = TransientTerm(var=P1) == ImplicitSourceTerm(k3*M1, var=P0)


 In light that all will be coupled in one equation to solve, will this lead
 to different solutions?

It shouldn't assuming that there isn't an instability. Eventually,
they should converge to the same result, but not at the the same rate.

 Or will fipy internally all give this the same
 matrix formulation?

It certainly won't give the same matrix formulation for different
implicit / explicit choices. User needs to be aware of what's going
on.

 Also, in eqn3, the first term in rhs is actually -k3 M1 P0. It seems nicest
 if somehow it is guaranteed that values as in eqn4 for this term would be
 used. Will this be the case in this formulation?

Don't understand the question fully. Do you mean that it would be nice
to be using the latest value of M1? This won't happen as M1 is
explicit in Equation 3. Either P0 is explicit or M1 will be
explicit in Equation 3 (or both). There is no way to avoid this.

 Perhaps there is a way to do this nicer and introduce a helper variable,
 U=M1*P0, so as to have only in eqn3 and eqn4 ImplicitSourceTerm(-k3, var=U)
 and ImplicitSourceTerm(k3, var=U) respectively. If so, how to go about to do
 this. If I do ImplicitSourceTerm(-k3, var=M1*P0) I get immediately the error

 fipy.terms.SolutionVariableNumberError: Different number of solution
 variables and equations.

The helper variable won't buy you anything. Use a Taylor expansion to
make the correct explicit / implicit choice

S = Sc + var1 * dS / dvar1 + var2 * dS / dvar2

if S is the source term. The other choice would be to do full Newton iteration.

 So, I would need an equation for U, would that be

 eqnhelper = ImplicitSourceTerm(1, var=U) == M1*P0

 Or am I making things too complicated now.

This doesn't help since you still have an explicit representation for
M1 and P0 in one of the equations.

Cheers,

Daniel


-- 
Daniel Wheeler
___
fipy mailing list
fipy@nist.gov
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]


Re: question on source term

2014-06-20 Thread Benny Malengier
2014-06-20 16:24 GMT+02:00 Daniel Wheeler daniel.wheel...@gmail.com:

 On Thu, Jun 19, 2014 at 11:53 AM, Benny Malengier
 benny.maleng...@gmail.com wrote:
  Hi,
 
  another question. This time on SourceTerm use. I'm checking an article
 with
  diffusion and reaction. So some species diffuse, others only react
 (waiting
  for diffused species to start). If there is an example with this
 floating on
  the internet, do point it my way!

 Not that I'm aware of.

  You then have a coupled set of equations, of which one of the non
 diffusive
  species will have equation like
 
  eqn3 = TransientTerm(var=P0) == ImplicitSourceTerm(-k3*M1, var=P0) +
  ImplicitSourceTerm(-k5*M2, var=P0)
 
 
  eqn4 = TransientTerm(var=P1) == ImplicitSourceTerm(k3*P0, var=M1)
 
 
  M1 will have another equation that has a diffusionterm.
 
  In eqn3 it is normal to use ImplicitSourceTerm as the rhs has -k3 M1 P0.

 Yes, but the right splitting for -k3 * M1 * P0 is probably

k3 * M1 * P0 - ImplicitSourceTerm(k3 * M1, var=P0) -
 ImplicitSourceTerm(k3 * P0, var=M1)

  In eqn4, we could actually write
 
 
  eqn4 = TransientTerm(var=P1) == k3*P0*M1
 
 
  or
 
 
  eqn4 = TransientTerm(var=P1) == ImplicitSourceTerm(k3*M1, var=P0)
 
 
  In light that all will be coupled in one equation to solve, will this
 lead
  to different solutions?

 It shouldn't assuming that there isn't an instability. Eventually,
 they should converge to the same result, but not at the the same rate.

  Or will fipy internally all give this the same
  matrix formulation?

 It certainly won't give the same matrix formulation for different
 implicit / explicit choices. User needs to be aware of what's going
 on.

  Also, in eqn3, the first term in rhs is actually -k3 M1 P0. It seems
 nicest
  if somehow it is guaranteed that values as in eqn4 for this term would be
  used. Will this be the case in this formulation?

 Don't understand the question fully. Do you mean that it would be nice
 to be using the latest value of M1? This won't happen as M1 is
 explicit in Equation 3. Either P0 is explicit or M1 will be
 explicit in Equation 3 (or both). There is no way to avoid this.

  Perhaps there is a way to do this nicer and introduce a helper variable,
  U=M1*P0, so as to have only in eqn3 and eqn4 ImplicitSourceTerm(-k3,
 var=U)
  and ImplicitSourceTerm(k3, var=U) respectively. If so, how to go about
 to do
  this. If I do ImplicitSourceTerm(-k3, var=M1*P0) I get immediately the
 error
 
  fipy.terms.SolutionVariableNumberError: Different number of solution
  variables and equations.

 The helper variable won't buy you anything. Use a Taylor expansion to
 make the correct explicit / implicit choice

 S = Sc + var1 * dS / dvar1 + var2 * dS / dvar2

 if S is the source term. The other choice would be to do full Newton
 iteration.

  So, I would need an equation for U, would that be
 
  eqnhelper = ImplicitSourceTerm(1, var=U) == M1*P0
 
  Or am I making things too complicated now.

 This doesn't help since you still have an explicit representation for
 M1 and P0 in one of the equations.


Thanks for the pointers, I'll try some things. My FiPy knowledge is slowly
getting back.

My main question seems to have come down on how intelligent the coupling
mechanism in fipy is as opposed to using the old sweep and updating values
when finished. If I understand you correctly, only the var option of
ImplicitSourceTerm comes into play (
http://www.ctcms.nist.gov/fipy/examples/diffusion/generated/examples.diffusion.coupled.html
) so the other var present are explicit, also after coupling. Seems the
logical thing.

So, next question would be, can I use the nicer new notation suitable for
coupling, and nevertheless sweep the coupled equation? But sweep requires a
var option, so that seems not possible on the coupled equation, but perhaps
is still possible on the seperate equations (would be nice if the coupled
equation var could be passed in some way ...). So I could envision, doing
one solve on the coupled equation, then doing sweep equation per equation,
and continuing that till low residuals are obtained.

If no sweeping is used, I would expect it best to take equal parts explicit
and implicit. So not as you say

   k3 * M1 * P0 - ImplicitSourceTerm(k3 * M1, var=P0) -
ImplicitSourceTerm(k3 * P0, var=M1)

but

  - 1/2 *ImplicitSourceTerm(k3 * M1, var=P0) - 1/2*ImplicitSourceTerm(k3 *
P0, var=M1)

or if a fully explicit term is used, then 1/3 of three terms.
If sweeping of equations written like that is supported, then sweeping this
should go to full implicit.

Anyway, my code is working already, so I can try different formulations out
myself and see how much they result in different solutions.

In case you wonder what I try to reproduce, see figures and equation in

http://rspb.royalsocietypublishing.org/content/271/1548/1565

It's nice that after some hours with fipy you have a fully working script
:-). But then the nagging question of how correct everything is pops up off

Re: question on source term

2014-06-20 Thread Guyer, Jonathan E. Dr.
On Jun 20, 2014, at 12:08 PM, Benny Malengier benny.maleng...@gmail.com wrote:

 So, next question would be, can I use the nicer new notation suitable for 
 coupling, and nevertheless sweep the coupled equation? But sweep requires a 
 var option, so that seems not possible on the coupled equation, but perhaps 
 is still possible on the seperate equations (would be nice if the coupled 
 equation var could be passed in some way ...). So I could envision, doing one 
 solve on the coupled equation, then doing sweep equation per equation, and 
 continuing that till low residuals are obtained.

Short answer is that both sweep() and solve() take a var= argument for 
backwards compatibility, but if you specify a var= argument to your equation 
terms (coupled or not), then you don’t need to pass the argument to sweep() or 
solve() (in fact, should not).


 But then the nagging question of how correct everything is pops up off 
 course, and you need to put in the effort of verifying and checking...

There’s no cure for that, I’m afraid (and I wouldn’t trust it if there was)


___
fipy mailing list
fipy@nist.gov
http://www.ctcms.nist.gov/fipy
  [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]