CFD Online Discussion Forums

CFD Online Discussion Forums (
-   OpenFOAM Programming & Development (
-   -   Problem with simple if-comparison (

sega September 7, 2009 15:09

Problem with simple if-comparison
Hello World.

I'm completely confused ...
This is really embarrassing as it's about a simple if condition ...

Have a look at the code-(sniped):
Don't mind what it's actually doing, concentrate on the bold red if-condition.


int main(int argc, char *argv[])
    faceSet facesSet(mesh, setName);
    labelList faces(facesSet.toc());
    vectorField faceCenterCoordinates(facesSet.size());

    for (label i=startTime; i<endTime; i++)

        for (label k=0; k<facesSet.size(); k++)
            int faceNumber = faces[k];
            if (i == startTime)
                faceCenterCoordinates[k] = mesh.Cf()[faceNumber];

            if (i == startTime)
              Info<< "faceCenterCoordinates[1].component(2) = " << faceCenterCoordinates[1].component(2) <<endl;
              Info<< "faceCenterCoordinates[2].component(2) = " << faceCenterCoordinates[2].component(2) <<endl;

              if ( faceCenterCoordinates[1].component(2) == faceCenterCoordinates[2].component(2) )
                  Info << " Components identical !!! " << endl;



Although this is looking rather cryptic its about the bold red if-condition.
It is not satisfied (meaning its Info-line "Components identical !!!" is not displayed while running the program) although the bold black italic Info-line displays the following:


faceCenterCoordinates[1].component(2) = 1.5625
faceCenterCoordinates[2].component(2) = 1.5625

So from the Info-output the if-condition should be satisfied as the two numbers (1.5625) appear to be equal, but it's not because the Info-line (Components identical !!!) in this particular if-bracket is not displayed!

So what's wrong with this?!
Is there any difference between the displayed values and the contents of the vectorField?!

In the further progress of this code I'm writing this faceCenterCoordinates vectorField to a file an it displayed 5-digit-numbers (4 digits after the dot). So there can't be any problem with this ...

Hope for your ideas ...

mkraposhin September 7, 2009 15:17

Values displayed with some tolerance (it means, that difference could be after 6 or N digits after dot)

Try to calculate and output difference between two values, or refomulate condition like inequality:

mag(faceCenterCoordinates[1].component(2) - faceCenterCoordinates[2].component(2)) < VSMALL
/// do something

sega September 8, 2009 07:06

Yes this worked!
The output from

mag(faceCenterCoordinates[1].component(2) - faceCenterCoordinates[2].component(2))
was 2.22045e-16 in my case and I had to use SMALL instead of VSMALL to make the comparison work.

By the way: What is the difference between SMALL and VSMALL and where is it defined?

mkraposhin September 8, 2009 07:21

VSMALL - means Very SMALL.

For single precision:
SMALL = 1e-6, VSMALL = 1e-37

For double precision:
SMALL = 1e-15, VSMALL = 1e-300

this definitions are related with machine word length, and, i think, it's done for independence of platform type

for more information, see file scalar.H

All times are GMT -4. The time now is 01:19.