CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Odd problem with reference to cell centres (https://www.cfd-online.com/Forums/openfoam-programming-development/104788-odd-problem-reference-cell-centres.html)

akidess July 16, 2012 07:38

Odd problem with reference to cell centres
 
Hello all, suppose I have the following code

Code:

volScalarField ypos = mesh.C().component(1);
volScalarField xpos = mesh.C().component(0);

Info << ypos.internalField() << endl;
Info << xpos.internalField() << endl;

This will print out all the x and y coordinates of the cell centres in my mesh. I thought I could be smart and use references, i. e.

Code:

const volScalarField& ypos = mesh.C().component(1);
const volScalarField& xpos = mesh.C().component(0);

Info << ypos.internalField() << endl;
Info << xpos.internalField() << endl;

But now I get the same field printed twice (always the field for which I get the reference last, i.e. X in this example). Can anyone explain what's happening here?

wyldckat July 16, 2012 10:02

Hi Anton,

Possibly because the component method is giving a result as its own variable, not as a reference to the real variable. And the reference value is pointing to the variable space of the method itself.

Although, if I found the correct method (source):
Code:

00062 template<class Form, class Cmpt, int nCmpt>
00063 inline const Cmpt& VectorSpace<Form, Cmpt, nCmpt>::component
00064 (
00065    const direction d
00066 ) const
00067 {
00068 #  ifdef FULLDEBUG
00069    if (d >= nCmpt)
00070    {
00071        FatalErrorIn
00072        (
00073            "VectorSpace<Form, Cmpt, nCmpt>::component(direction) const"
00074        )  << "index out of range"
00075            << abort(FatalError);
00076    }
00077 #  endif
00078
00079    return v_[d];
00080 }

It does seem a bit odd that this didn't work as intended...

Which Gcc version are you using? It might influence this result you're getting, since this method is part of a template.

Best regards,
Bruno

akidess July 16, 2012 10:32

Thanks for digging in the code for me, I should have done that myself as a first step. The method returns "const Cmpt& v_[d];", which is part of the array "Cmpt v_[nCmpt];". I think it's not possible to reference an element within an array, I should have used a pointer. But I'll investigate further and report back.

I'm using gcc 4.4.6.

akidess July 16, 2012 11:26

Ok, so I still do not fully understand whats happening with the references, but I do now see that I was doing something very stupid :o

mesh.C().component(N) gives back a tmp field, which is already kind of a reference. I then forced unpacking of the tmp field by using () and was then able to copy over the reference. Of course this doesn't make sense.

I conclude that finally the original formulation without any explicit reference/pointer-handling was already the optimal solution.

wyldckat July 16, 2012 18:36

I did think about "tmp" being the culprit here, but since I couldn't find it in a quick search via Doxygen, I simply didn't have the proof to point the finger :rolleyes:


All times are GMT -4. The time now is 14:26.