|
From: Andrew F. <af...@ph...> - 2006-04-19 13:12:17
|
Rainer
strange
I have the declaration at=20
SBML_odeSolver\src\sbmlsolver\integratorInstance.h line 143
my CVS is saying that I'm in sync
what do you have?
yours Andrew
> -----Original Message-----
> From: Rainer Machne [mailto:ra...@tb...]=20
> Sent: 19 April 2006 12:42
> To: Andrew Finney
> Cc: SOSlib Development
> Subject: RE: comment on proposed exact event implementation[Scanned]
>=20
> Andrew
>=20
> I have correct the simple event detection, so that it doesn't=20
> set trigger flags to 0, if the trigger is actually still fired.
>=20
> Some questions regarding the new code:
>=20
> Now that enginge->processEvents is set either to 1 or to 0 in=20
> II_integrateOneStep and II_integrateOneStepWithoutEventProcessing,
> respectively, the functions
>=20
> II_simpleOneStep and II_cvodeOneStep
>=20
> shouldn't be public anymore.
>=20
> Before this new switch, they were public, so that=20
> applications which knew what type of solver is required=20
> (currently ODEs or no ODEs, but eventually also DAEs or even=20
> stochastic solvers) can use these `solver'OneStep functions directly.
>=20
> Should we remove these functions from the API or should we=20
> keep the possibility to use different solvers directly?
>=20
> In the second case we need to move the engine->processEvents=20
> setting to some other place!
>=20
> Also I didn't find a function declaration for=20
> II_integrateOneStepWithoutEventProcessing. I guess you wanted=20
> this function to be public, or did you just use it for testing?
>=20
>=20
> Rainer
>=20
>=20
>=20
>=20
> On Wed, 19 Apr 2006, Andrew Finney wrote:
>=20
> > Rainer
> >
> > I guess you need to go ahead and modify the code.
> > Any performance hit is my problem.
> >
> > yours Andrew
> >
> >> -----Original Message-----
> >> From: Rainer Machne [mailto:ra...@tb...]
> >> Sent: 19 April 2006 11:47
> >> To: Andrew Finney
> >> Subject: RE: comment on proposed exact event=20
> implementation[Scanned]
> >>
> >> Andrew
> >>
> >>> I'm more worried about the performance hit of evaluating the not=20
> >>> trigger expression.
> >>
> >> Ok, I still don't get what you mean.
> >>
> >> Do you mind, if I correct the current event handling - as outlined=20
> >> two emails below - and submit it, or do you think it would=20
> slow down=20
> >> your models?
> >>
> >> Rainer
> >>
> >>
> >>
> >> On Wed, 12 Apr 2006, Andrew Finney wrote:
> >>
> >>> Rainer
> >>>
> >>> you're doing the right thing don't worry :-)
> >>>
> >>>> -----Original Message-----
> >>>> From: Rainer Machne [mailto:ra...@tb...]
> >>>> Sent: 12 April 2006 17:53
> >>>> To: Andrew Finney
> >>>> Cc: Christoph Flamm
> >>>> Subject: RE: comment on proposed exact event
> >> implementation[Scanned]
> >>>>
> >>>> Andrew
> >>>>
> >>>> On Wed, 12 Apr 2006, Andrew Finney wrote:
> >>>>
> >>>>> Rainer
> >>>>>
> >>>>> Our model is based on simple Jarnac code.
> >>>>>
> >>>>> I'm more worried about the performance hit of=20
> evaluating the not=20
> >>>>> trigger expression.
> >>>>
> >>>> I don't really understand what you mean.
> >>>>
> >>>>
> >>>> You mean the additional evaluations when
> >>>>
> >>>>>>> else
> >>>>>>> data->trigger[i] =3D 0;
> >>>>
> >>>> would be replaced by
> >>>>
> >>>>>>> else if ( evaluateAST(trigger, data) =3D=3D 0 )
> >>>>>>> data->trigger[i] =3D 0;
> >>>>
> >>>>
> >>>> ??
> >>>>
> >>>>
> >>>> The double evaluation could be avoided by putting the=20
> evaluations=20
> >>>> within the if/else blocks:
> >>>>
> >>>> if ( data->trigger[i] =3D=3D 0 )
> >>>> {
> >>>> if ( evaluateAST(trigger, data) )
> >>>> {
> >>>> data->trigger[i] =3D 1;
> >>>> }
> >>>> }
> >>>> else /* only if trigger is 1 */
> >>>> {
> >>>> if ( !evaluateAST(trigger, data) )
> >>>> {
> >>>> data->trigger[i] =3D 0;
> >>>> }
> >>>> }
> >>>>
> >>>> but I don't see a way around the evaluation of each trigger.
> >>>>
> >>>> Do I get something wrong?
> >>>>
> >>>>
> >>>> Rainer
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>
> >>>>>
> >>>>> yours Andrew
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Rainer Machne [mailto:ra...@tb...]
> >>>>>> Sent: 12 April 2006 17:37
> >>>>>> To: Andrew Finney
> >>>>>> Cc: Christoph Flamm
> >>>>>> Subject: RE: comment on proposed exact event
> >>>> implementation[Scanned]
> >>>>>>
> >>>>>> Andrew
> >>>>>>
> >>>>>>
> >>>>>> On Wed, 12 Apr 2006, Andrew Finney wrote:
> >>>>>>
> >>>>>>> Rainer
> >>>>>>>
> >>>>>>> below is all correct
> >>>>>>>
> >>>>>>> it will make our model run slower or even incorrectly but
> >>>> I'll work
> >>>>>>> around it perhaps we'll need yet another option.
> >>>>>>
> >>>>>>
> >>>>>> The current implementation
> >>>>>>
> >>>>>>> if ( data->trigger[i] =3D=3D 0 && evaluateAST(trigger, data) =
)
> >>>>>>> fired++; (leading to assignment execution in calling code)
> >>>>>>> data->trigger[i] =3D 1;
> >>>>>>> else
> >>>>>>> data->trigger[i] =3D 0;
> >>>>>>
> >>>>>> means that event triggers are set to 0, whenever they
> >> have already
> >>>>>> been fired, even when the trigger is still true.
> >>>>>>
> >>>>>> That means that events are again executed in the time step=20
> >>>>>> afterwards, even if they have been true ever since their last=20
> >>>>>> execution.
> >>>>>> It is a completely wrong interpretation of events!
> >>>>>>
> >>>>>> Does your model really require this?
> >>>>>>
> >>>>>> As in the very old version, triggers should be=20
> evaluated before=20
> >>>>>> integration and only set to 0 if they are really false.
> >>>>>>
> >>>>>> Rainer
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>>> -----Original Message-----
> >>>>>>>> From: Rainer Machne [mailto:ra...@tb...]
> >>>>>>>> Sent: 12 April 2006 17:15
> >>>>>>>> To: Andrew Finney
> >>>>>>>> Cc: Christoph Flamm
> >>>>>>>> Subject: RE: comment on proposed exact event
> >>>>>> implementation[Scanned]
> >>>>>>>>
> >>>>>>>> Andrew
> >>>>>>>>
> >>>>>>>>>
> >>>>>>>>>> Why do we cheat? As I remember, we do exactly the
> >>>> above for the
> >>>>>>>>>> inexact event handling!
> >>>>>>>>>
> >>>>>>>>> I have not got the code in front of me...
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> It was more correct in a very old version and seems to be
> >>>>>> incorrect
> >>>>>>>> for a while now!
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> In the former file odeIntegrate.c did:
> >>>>>>>>
> >>>>>>>> the function integrate() did
> >>>>>>>>
> >>>>>>>> for ( i=3D0; i<data->nt; i++ ) {
> >>>>>>>> data->flag[i] =3D evaluateAST(data->trigger[i],data);
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>> before integration, i.e. evaluate trigger state at=20
> time 0. So=20
> >>>>>>>> triggers that are already true are set to 1, others to 0.
> >>>>>>>>
> >>>>>>>> Then in the integration loop the function checkTrigger
> >>>> was called
> >>>>>>>> after the CVode call. It did
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> if(evaluateAST(data->trigger[i],data)=3D=3D0)
> >>>>>>>> {
> >>>>>>>> data->flag[i] =3D 0;
> >>>>>>>> }
> >>>>>>>> else if((data->flag[i]=3D=3D0) &&
> >>>>>>>> (evaluateAST(data->trigger[i],data)=3D=3D1))
> >>>>>>>> {
> >>>>>>>> data->flag[i] =3D 1;
> >>>>>>>> ...
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>> So trigger flags were set to 0 only when the trigger
> >>>> condition is
> >>>>>>>> really false and to 1 as soon as they become true.=20
> They stay 1=20
> >>>>>>>> (eventually having been set at time 0) as long as they are
> >>>>>> true, but
> >>>>>>>> their assignments are only evaluated when they were 0 before.
> >>>>>>>>
> >>>>>>>> This should do it, right?
> >>>>>>>>
> >>>>>>>> In the current version it is wrong:
> >>>>>>>>
> >>>>>>>> It's the line 636 in integratorInstance
> >>>>>>>>
> >>>>>>>> if ( data->trigger[i] =3D=3D 0 && evaluateAST(trigger, =
data) )
> >>>>>>>> fired++; (leading to assignment execution in=20
> calling code)
> >>>>>>>> data->trigger[i] =3D 1;
> >>>>>>>> else
> >>>>>>>> data->trigger[i] =3D 0;
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> I.e. it misses the evaluation for false triggers, but just
> >>>>>> sets any
> >>>>>>>> trigger false that was true, even if they are still true.
> >>>>>>>>
> >>>>>>>> It might just require to add
> >>>>>>>>
> >>>>>>>> else if ( evaluateAST(trigger, data) =3D=3D 0 )
> >>>>>>>> data->trigger[i] =3D 0;
> >>>>>>>>
> >>>>>>>> instead of the simple else.
> >>>>>>>>
> >>>>>>>> Right?
> >>>>>>>>
> >>>>>>>> We should correct that for the simple event handling!
> >>>>>>>>
> >>>>>>>> I have to think about the other stuff.
> >>>>>>>>
> >>>>>>>> Rainer
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>>
> >>>>>>>>> you wrote:
> >>>>>>>>>
> >>>>>>>>>> This can become tricky. As far as I understood the root
> >>>>>> finder, it
> >>>>>>>>>> stops integrating at the time where it found the root.
> >>>>>>>>>
> >>>>>>>>>> Thus we might have to include a code
> >>>>>>>>>>
> >>>>>>>>>> if ( triggerWasTrue )
> >>>>>>>>>> rootFunction =3D 1.0;
> >>>>>>>>>>
> >>>>>>>>>> to suppress root finding for triggers that are=20
> already true.
> >>>>>>>>>> The same should probably be done for combined
> >>>> triggers, for the
> >>>>>>>>>> expression that becomes true first and needs to wait for
> >>>>>> the second
> >>>>>>>>>> (or all) other inequalities of the trigger.
> >>>>>>>>>
> >>>>>>>>> My understanding is that the root finder only detects
> >>>> transitions
> >>>>>>>>> because x < 10 maps to x - 10 =3D=3D 0. The root is only
> >>>> true at the
> >>>>>>>>> transition not at all points x < 10.
> >>>>>>>>>
> >>>>>>>>> I think we need to be very careful about when and how
> >>>> we suppress
> >>>>>>>>> root expressions. Any suppression inevitably means you
> >>>>>> potentially
> >>>>>>>>> miss a transition. Having written that I don't know the
> >>>>>> theory but
> >>>>>>>>> I intuitively think that its not possible to resolve
> >> very close
> >>>>>>>>> transitions.
> >>>>>>>>>
> >>>>>>>>> The issues that I think we need to look out for are:
> >>>>>>>>>
> >>>>>>>>> a) restarting integration where the root is still true
> >>>>>>>>> we might get stuck there!
> >>>>>>>>>
> >>>>>>>>> Is that what you were worried about?
> >>>>>>>>>
> >>>>>>>>> either fingers crossed cvode will ignore the initial
> >>>>>>>> state when root
> >>>>>>>>> finding
> >>>>>>>>> or if not we might need to nudge forward by an epsilon
> >>>>>> with root
> >>>>>>>>> finding switched off :-(
> >>>>>>>>> (the algorithm I posted didn't include this concept)
> >>>>>>>>> this might be a good idea since it forces time
> >>>> forward and the
> >>>>>>>>> simulation out of deadlocks.
> >>>>>>>>> the problem is choosing an epsilon. I guess it could
> >>>>>> be a very
> >>>>>>>>> small fraction of the time step length.
> >>>>>>>>>
> >>>>>>>>> Perhaps this should be a constant set by the user: it
> >>>>>>>> represents the
> >>>>>>>>> minimum gap between event transitions.
> >>>>>>>>>
> >>>>>>>>> b) the integration, correctly, settles in a state with
> >>>> a root true
> >>>>>>>>> this untypical behaviour but could happen. it would be
> >>>>>> nice not to
> >>>>>>>>> blow up
> >>>>>>>>>
> >>>>>>>>> this should be a test case
> >>>>>>>>>
> >>>>>>>>> e.g. x tends to 10 with a trigger x < 10
> >>>>>>>>>
> >>>>>>>>> The problem is that the algorithm may end up being very
> >>>>>>>> inefficient
> >>>>>>>>> in this case.
> >>>>>>>>>
> >>>>>>>>> ideally the nudge described above needs to be
> >>>>>> proportional to the
> >>>>>>>>> internal cvode step size
> >>>>>>>>> can we get the internal integration step size
> >>>> from cvode?
> >>>>>>>>>
> >>>>>>>>> c) a model with an event based feedback loop that drives
> >>>>>>>> the model to a
> >>>>>>>>> state where events
> >>>>>>>>> are firing all the time.
> >>>>>>>>>
> >>>>>>>>> yours Andrew
> >>>>>>>>>
> >>>>>>>>>> -----Original Message-----
> >>>>>>>>>> From: Rainer Machne [mailto:ra...@tb...]
> >>>>>>>>>> Sent: 12 April 2006 15:51
> >>>>>>>>>> To: Andrew Finney
> >>>>>>>>>> Cc: Christoph Flamm
> >>>>>>>>>> Subject: RE: comment on proposed exact event
> >>>>>>>> implementation[Scanned]
> >>>>>>>>>>
> >>>>>>>>>> Andrew
> >>>>>>>>>>
> >>>>>>>>>> On Wed, 12 Apr 2006, Andrew Finney wrote:
> >>>>>>>>>>
> >>>>>>>>>>> Rainer
> >>>>>>>>>>>
> >>>>>>>>>>> a trigger can contain inequality and equality
> >>>>>>>>>>>
> >>>>>>>>>>> but they are found by equivalent root expressions so I
> >>>>>> don't think
> >>>>>>>>>>> they are important
> >>>>>>>>>>>
> >>>>>>>>>>> Oh there is one other really important issue:
> >>>>>>>>>>>
> >>>>>>>>>>> We need to be careful about the SBML requirement that
> >>>>>> events are
> >>>>>>>>>>> triggered on all transitions from false to true
> >>>>>>>>>>>
> >>>>>>>>>>> In MathSBML Bruce Shapiro created following logic=20
> >roughly<
> >>>>>>>>>> (assume no
> >>>>>>>>>>> delays on events)
> >>>>>>>>>>>
> >>>>>>>>>>> starting integration....
> >>>>>>>>>>> triggerWasTrue =3D false;
> >>>>>>>>>>>
> >>>>>>>>>>> OnRootFound:
> >>>>>>>>>>>
> >>>>>>>>>>> if (triggerExpression and !triggerWasTrue)
> >>>>>>>>>>> {
> >>>>>>>>>>> fire event;
> >>>>>>>>>>> triggerWasTrue =3D true;
> >>>>>>>>>>> }
> >>>>>>>>>>>
> >>>>>>>>>>> if (!triggerExpression)
> >>>>>>>>>>> triggerWasTrue =3D false;
> >>>>>>>>>>>
> >>>>>>>>>>> We kind achive this in the inexact method but its really a
> >>>>>>>>>> cheat the
> >>>>>>>>>>> above I think is the only way to do it properly...
> >>>>>>>>>>
> >>>>>>>>>> Why do we cheat? As I remember, we do exactly the
> >>>> above for the
> >>>>>>>>>> inexact event handling!
> >>>>>>>>>>
> >>>>>>>>>> The exact detection/root finder code needs to
> >>>>>>>>>>
> >>>>>>>>>> * do the same, i.e. handle false/true transitions when a
> >>>>>>>> root is found
> >>>>>>>>>>
> >>>>>>>>>> and additionally
> >>>>>>>>>>
> >>>>>>>>>> * handle triggers that are (logic) combinations of
> >>>>>>>> in/equalities, i.e.
> >>>>>>>>>> both must be true.
> >>>>>>>>>>
> >>>>>>>>>> In/equalities combined by logic operators can further be
> >>>>>>>> subdivided:
> >>>>>>>>>>
> >>>>>>>>>> e.g.:
> >>>>>>>>>> trigger a < 10 || b > 20
> >>>>>>>>>>
> >>>>>>>>>> can be handled as two separate triggers, while and
> >>>> exclusive OR
> >>>>>>>>>> needs combined handling again as outlined before:
> >>>>>>>>>>
> >>>>>>>>>> e.g.
> >>>>>>>>>>
> >>>>>>>>>> trigger: a < 10 && b > 20
> >>>>>>>>>>
> >>>>>>>>>> becomes to root conditions in the function g:
> >>>>>>>>>>
> >>>>>>>>>> a - 10 =3D 0;
> >>>>>>>>>> b - 20 =3D 0;
> >>>>>>>>>>
> >>>>>>>>>> * keep integrating if only a or b is true
> >>>>>>>>>> * exact event happens when the second conditions also
> >>>>>> becomes true
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> This can become tricky. As far as I understood the root
> >>>>>> finder, it
> >>>>>>>>>> stops integrating at the time where it found the root.
> >>>>>>>>>>
> >>>>>>>>>> Thus we might have to include a code
> >>>>>>>>>>
> >>>>>>>>>> if ( triggerWasTrue )
> >>>>>>>>>> rootFunction =3D 1.0;
> >>>>>>>>>>
> >>>>>>>>>> to supress root finding for triggers that are already true.
> >>>>>>>>>> The same should probably be done for combined
> >>>> triggers, for the
> >>>>>>>>>> expression that becomes true first and needs to wait for
> >>>>>> the second
> >>>>>>>>>> (or all) other inequalities of the trigger.
> >>>>>>>>>>
> >>>>>>>>>> Rainer
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> yours Andrew
> >>>>>>>>>>>
> >>>>>>>>>>>> -----Original Message-----
> >>>>>>>>>>>> From: Rainer Machne [mailto:ra...@tb...]
> >>>>>>>>>>>> Sent: 12 April 2006 15:21
> >>>>>>>>>>>> To: Christoph Flamm
> >>>>>>>>>>>> Cc: Andrew Finney
> >>>>>>>>>>>> Subject: RE: comment on proposed exact event
> >>>>>>>>>> implementation[Scanned]
> >>>>>>>>>>>>
> >>>>>>>>>>>> Hi Xtof,
> >>>>>>>>>>>>
> >>>>>>>>>>>> On Wed, 12 Apr 2006, Christoph Flamm wrote:
> >>>>>>>>>>>>
> >>>>>>>>>>>>> hi andrew,
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> am i getting that right, in essence the recipe=20
> to evaluate
> >>>>>>>>>>>> letfChild -
> >>>>>>>>>>>>> rightChild works in general to find the exact=20
> timepoint of
> >>>>>>>>>>>> the event
> >>>>>>>>>>>>> with root finding?
> >>>>>>>>>>>>
> >>>>>>>>>>>> No, for this example of an event:
> >>>>>>>>>>>>
> >>>>>>>>>>>>> e.g. a < 10 && b > 10 becomes 2 root expressions 10 - a
> >>>>>>>>>> =3D=3D 0 and b
> >>>>>>>>>>>> - 10 > =3D=3D 0
> >>>>>>>>>>>>
> >>>>>>>>>>>> we need to separately evaluate both trigger
> >> conditions, i.e.
> >>>>>>>>>>>> as Andrew said the event trigger becomes 2 root
> >>>>>>>>>> expressions for the
> >>>>>>>>>>>> g(x,p,t) root finding function!!
> >>>>>>>>>>>>
> >>>>>>>>>>>> That means that not every root found be the root=20
> finder is
> >>>>>>>>>> an event.
> >>>>>>>>>>>> For above event, the first (e.g. a) that moved beyond the
> >>>>>>>>>> threshold
> >>>>>>>>>>>> (10) must wait for the second (b) to also move
> >>>> beyond its own
> >>>>>>>>>>>> threshold. I.e. for such event structures the event
> >>>> assignment
> >>>>>>>>>>>> evaluation must wait until the second root.
> >>>>>>>>>>>> ... or somehow like this.
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>> ... let's try to formulate this generally:
> >>>>>>>>>>>>
> >>>>>>>>>>>> * An event trigger is a boolean expression, but can
> >>>> be a logic
> >>>>>>>>>>>> combination of different boolean expressions ... ?
> >>>>>>>>>>>>
> >>>>>>>>>>>> * Only equalities and inequalities can be=20
> evaluated by our
> >>>>>>>>>> leftChild
> >>>>>>>>>>>> - rightChild =3D=3D 0 condition in the root function
> >>>>>>>>>>>>
> >>>>>>>>>>>> * logic operators must be broken down into their
> >>>>>>>>>> in/equality relation
> >>>>>>>>>>>> (which must be in there somewhere??)
> >>>>>>>>>>>>
> >>>>>>>>>>>> mmhm ... questions:
> >>>>>>>>>>>>
> >>>>>>>>>>>> 1) we only need to care about logic operators vs.
> >>>> in/equality
> >>>>>>>>>>>> operators ?
> >>>>>>>>>>>>
> >>>>>>>>>>>> 2) must there be in/equalities in a trigger?
> >>>>>>>>>>>>
> >>>>>>>>>>>> Rainer
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> =3D;) xtof
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> Andrew Finney writes:
> >>>>>>>>>>>>>> Rainer
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> First I assume you run-through a trigger expression
> >>>>>>>>>>>> separating out
> >>>>>>>>>>>>>> all the inequalities
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> e.g. a < 10 && b > 10 becomes 2 root expressions 10 - a
> >>>>>>>>>>>> =3D=3D 0 and b -
> >>>>>>>>>>>>>> 10 =3D=3D 0
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> when you find a root you re-evaluate the complete
> >>>>>>>>>> triggers to see
> >>>>>>>>>>>>>> what's really fired.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> or is there a better approach?
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Are there other forms of events, where this method can
> >>>>>>>>>>>> not be applied?
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Well there is equality e.g. x =3D=3D 40 I think that =
should
> >>>>>>>>>> work as x -
> >>>>>>>>>>>>>> 40 =3D=3D 0 Inequality is fine to you map x !=3D 40 to =
x
> >>>> - 40 =3D=3D 0
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> In both cases you need to revaluate the trigger
> >>>>>> expression but
> >>>>>>>>>>>>>> probably with an epsilon (especially equality) or you
> >>>>>>>>>> may have to
> >>>>>>>>>>>>>> force a value from 39.9999 to 40 after the root
> >>>>>>>> finding process.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> One thing to very careful of is time dependant
> >>>>>>>> expressions (ones
> >>>>>>>>>>>>>> containing the csymbol for time) not so much in the
> >>>>>>>> triggers but
> >>>>>>>>>>>>>> make sure time is set right when you roll
> >>>>>> integration back or
> >>>>>>>>>>>>>> forward...hopefully that's obvious.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> yours Andrew
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> -----Original Message-----
> >>>>>>>>>>>>>>> From: Rainer Machne [mailto:ra...@tb...]
> >>>>>>>>>>>>>>> Sent: 12 April 2006 14:40
> >>>>>>>>>>>>>>> To: Christoph Flamm
> >>>>>>>>>>>>>>> Cc: Andrew Finney
> >>>>>>>>>>>>>>> Subject: Re: comment on proposed exact event=20
> >>>>>>>>>>>>>>> implementation[Scanned]
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Hi Andrew and Xtof
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> another question:
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Currently we tell the root function to evaluate the
> >>>>>> expression
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> leftChildofTrigger - rightChildOfTrigger
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> for which the root finder tries to find a root, i.e.
> >>>>>>>>>>>> time points
> >>>>>>>>>>>>>>> where this expression evaluates to 0.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> This is valid for event like
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> if x > 40
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> where the method will try find a time point where
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> x - 40 =3D=3D 0.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Is this generally valid? Are there other forms of
> >>>>>>>> events, where
> >>>>>>>>>>>>>>> this method can not be applied?
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Rainer
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> On Wed, 12 Apr 2006, Christoph Flamm wrote:
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> hi andrew,
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> yes, you are right root finding is the only proper
> >>>>>>>>>>>> way to detect
> >>>>>>>>>>>>>>>> events accurately. also the code we need to implement
> >>>>>>>>>>>> would be
> >>>>>>>>>>>>>>>> much simpler with root finding. the down side of
> >>>>>>>> this approach
> >>>>>>>>>>>>>>> is, that the
> >>>>>>>>>>>>>>>> integration with root finding turned on drastically
> >>>>>>>>>>>> slowes down
> >>>>>>>>>>>>>>>> the integration speed especially if we have a lot of
> >>>>>>>> triggers!
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> the other problem which we did not touch during the
> >>>>>>>>>>>>>>> hackathon is what
> >>>>>>>>>>>>>>>> happens if to events trigger exactely at the
> >>>> same time but
> >>>>>>>>>>>>>>>> influence each other.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> suppose the following two events:
> >>>>>>>>>>>>>>>> (1) if x > 20 then diminish the concentration
> >> of y to 10
> >>>>>>>>>>>>>>>> (2) if y > 20 then diminish the concentration
> >> of x to 10
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> this is something like a cyclic dependency of the
> >>>>>>>>>> events. if both
> >>>>>>>>>>>>>>>> events are triggered at the same time, which
> >>>>>>>>>>>> could happen,
> >>>>>>>>>>>>>>> what shall
> >>>>>>>>>>>>>>>> we do? which ever event we execute first
> >> invalidates the
> >>>>>>>>>>>>>>> trigger for
> >>>>>>>>>>>>>>>> the second one.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> in such a case an priority ordering of the
> >>>> events is needed
> >>>>>>>>>>>>>>> to resolve
> >>>>>>>>>>>>>>>> the problem right? is an answer to something like
> >>>>>> that in the
> >>>>>>>>>>>>>>>> SBML specs?
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> i think that the method i suggested at the hackaton
> >>>>>>>>>>>> would give
> >>>>>>>>>>>>>>>> us a good balance between speed and "accuracy of
> >>>> the event
> >>>>>>>>>>>>>>> detection" (but
> >>>>>>>>>>>>>>>> the coding is more difficult!)
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> rainer suggested as an alternative to the mixed=20
> >>>>>>>>>>>>>>>> root-finding/non-root-finding strategy to make the
> >>>>>>>>>>>> integration
> >>>>>>>>>>>>>>>> step smaller until the exact time of an event is
> >>>>>>>>>>>> localized (this
> >>>>>>>>>>>>>>> also slows
> >>>>>>>>>>>>>>>> down integration speed).
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> so for which solution should we head?
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> =3D;) xtof
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> p.s. next week i meet an mathematician from the
> >>>>>>>>>>>> MPI-MIS who is
> >>>>>>>>>>>>>>>> an expert for DDEs to discuss which solving method
> >>>>>>>>>>>> would be best
> >>>>>>>>>>>>>>>> to incooporate into the SOSlib.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
> >
>=20
|