BUG: regIOobject: handle overflow correctly

This commit is contained in:
mattijs
2015-12-02 15:54:02 +00:00
parent f4e38fa67c
commit a1f25b8746

View File

@ -325,13 +325,41 @@ bool Foam::regIOobject::checkOut()
bool Foam::regIOobject::upToDate(const regIOobject& a) const bool Foam::regIOobject::upToDate(const regIOobject& a) const
{ {
if (a.eventNo() >= eventNo_) label da = a.eventNo()-eventNo_;
// In case of overflow *this.event() might be 2G but a.event() might
// have overflowed to 0.
// Detect this by detecting a massive difference (labelMax/2) between
// the two events.
//
// a *this return
// - ----- ------
// normal operation:
// 11 10 false
// 11 11 false
// 10 11 true
// overflow situation:
// 0 big false
// big 0 true
if (da > labelMax/2)
{ {
// *this.event overflowed but a.event not yet
return true;
}
else if (da < -labelMax/2)
{
// a.event overflowed but *this not yet
return false; return false;
} }
else if (da < 0)
{
// My event number higher than a
return true;
}
else else
{ {
return true; return false;
} }
} }
@ -342,18 +370,7 @@ bool Foam::regIOobject::upToDate
const regIOobject& b const regIOobject& b
) const ) const
{ {
if return upToDate(a) && upToDate(b);
(
a.eventNo() >= eventNo_
|| b.eventNo() >= eventNo_
)
{
return false;
}
else
{
return true;
}
} }
@ -364,19 +381,7 @@ bool Foam::regIOobject::upToDate
const regIOobject& c const regIOobject& c
) const ) const
{ {
if return upToDate(a) && upToDate(b) && upToDate(c);
(
a.eventNo() >= eventNo_
|| b.eventNo() >= eventNo_
|| c.eventNo() >= eventNo_
)
{
return false;
}
else
{
return true;
}
} }
@ -388,20 +393,7 @@ bool Foam::regIOobject::upToDate
const regIOobject& d const regIOobject& d
) const ) const
{ {
if return upToDate(a) && upToDate(b) && upToDate(c) && upToDate(d);
(
a.eventNo() >= eventNo_
|| b.eventNo() >= eventNo_
|| c.eventNo() >= eventNo_
|| d.eventNo() >= eventNo_
)
{
return false;
}
else
{
return true;
}
} }