From: Raimar S. <rai...@ui...> - 2012-05-04 10:15:11
|
Dear András, thanks for merging. The bugfix branch is removed now. On Thursday 03 May 2012 16:51:25 Andras Vukics wrote: > > (*) Actually the stepsize can only decrease in the case ha_==0, li_!=0, > > which might be inefficient. Maybe we should consider to increase the > > stepsize if dpLimit is undershot significantly? Take for example a driven > > three level atom in V configuration with a strong transition and a > > metastable excited state (optical shelving). In periods where many > > photons are scattered we need a small timestep, but when the atom is > > "shelved" larger timesteps are sufficient. > Yes, it's definitely a problem that the timestep can only decrease in > this case. In the case of ha_=0, we should completely delegate > timestep management to the Liouvillean part, so that it can also > increase the timestep. > > What we need is this: > * timestep can increase if both the Hamiltonian and the Liouvillean > agree with this > * timestep should decrease if either requires this > (if either ha_ or li_ is 0, it always agrees with an increase and > never requires a decrease) > * timestep should be Dt if both ha_ and li_ are 0, in which case the > dc!=0 case doesn't even make sense, really (so this should maybe be > filtered out when constructing MCWF_Trajectory) Yes. The second requirement is already implemented, the third requirement is also implemented but maybe not in the right way. I agree that this is better handled in the constructor, the check in every timestep will always give the same result. Should we just set DtTry to Dt in the constructor if ha_==li_==0 and throw an exception if dc != 0? The first requirement is partially implemented for the case ha_!=0. For the other case maybe something like this? if (!ha_ && dpOverDt*dtDid<undershootTolerance_*dpLimit_){ getEvolved()->setDtTry(dpLimit_/dpOverDt); } Best regards Raimar |