|
[Sponsors] |
July 16, 2012, 07:38 |
Odd problem with reference to cell centres
|
#1 |
Senior Member
Anton Kidess
Join Date: May 2009
Location: Germany
Posts: 1,377
Rep Power: 29 |
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; Code:
const volScalarField& ypos = mesh.C().component(1); const volScalarField& xpos = mesh.C().component(0); Info << ypos.internalField() << endl; Info << xpos.internalField() << endl;
__________________
*On twitter @akidTwit *Spend as much time formulating your questions as you expect people to spend on their answer. |
|
July 16, 2012, 10:02 |
|
#2 |
Retired Super Moderator
Bruno Santos
Join Date: Mar 2009
Location: Lisbon, Portugal
Posts: 10,975
Blog Entries: 45
Rep Power: 128 |
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 } 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
__________________
|
|
July 16, 2012, 10:32 |
|
#3 |
Senior Member
Anton Kidess
Join Date: May 2009
Location: Germany
Posts: 1,377
Rep Power: 29 |
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.
__________________
*On twitter @akidTwit *Spend as much time formulating your questions as you expect people to spend on their answer. |
|
July 16, 2012, 11:26 |
|
#4 |
Senior Member
Anton Kidess
Join Date: May 2009
Location: Germany
Posts: 1,377
Rep Power: 29 |
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
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.
__________________
*On twitter @akidTwit *Spend as much time formulating your questions as you expect people to spend on their answer. |
|
July 16, 2012, 18:36 |
|
#5 |
Retired Super Moderator
Bruno Santos
Join Date: Mar 2009
Location: Lisbon, Portugal
Posts: 10,975
Blog Entries: 45
Rep Power: 128 |
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
__________________
|
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Problem / Misunderstanding with mesh.C() : get the cell centers | Edy | OpenFOAM Programming & Development | 21 | June 15, 2020 03:49 |
Problem with reference area | alfaben | STAR-CCM+ | 3 | April 21, 2020 09:46 |
mass flow in is not equal to mass flow out | saii | CFX | 12 | March 19, 2018 05:21 |
OpenFOAM 1.6-ext git installation on Ubuntu 11.10 x64 | Attesz | OpenFOAM Installation | 45 | January 13, 2012 12:38 |
G95 + CGNS | Bruno | Main CFD Forum | 1 | January 30, 2007 00:34 |