mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
BUG: regIOobject: handle overflow correctly
This commit is contained in:
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user