|
[Sponsors] |
August 12, 2011, 15:54 |
Introducing the IOReferencer
|
#1 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
Hi Foamers,
I've thrown together a simple piece of code that allows you to look up non-IOobjects from the objectRegistry. It's fairly straightforward:
Download it from: http://openfoam-extend.svn.sourcefor...ject/?view=tar The wiki page is currently down, but once it's up again, I'll upload the more detailed instructions to: http://openfoamwiki.net/index.php/Contrib_IOReferencer |
|
August 12, 2011, 16:27 |
Introducing the IOReferencer
|
#2 |
New Member
Brent Craven
Join Date: Mar 2009
Location: University Park, PA, USA
Posts: 21
Rep Power: 17 |
Very nice! Thanks for the contribution.
|
|
August 13, 2011, 12:38 |
|
#3 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
Wiki instructions uploaded.
|
|
December 7, 2012, 11:33 |
|
#4 |
Member
Björn Windén
Join Date: Feb 2012
Location: National Maritime Research Institute, Tokyo, Japan
Posts: 37
Rep Power: 14 |
Hi.
Thanks for a great contribution. I'm having some trouble and I was wondering if it is the IOReferencer or if I have done something else that is stupid I would like to keep a pointer to a class (which class gets decided in the solver based on a dictionary) in the registry to access its member functions in other parts of the code. In the solver I have: Code:
autoPtr<myClass> pPtr = myClass::New(dict); IOReferencer< autoPtr<myClass> > myObject ( IOobject ( "pControl", runTime.constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), pPtr ); Code:
pC = db.lookupObject<IOReferencer<autoPtr<myClass> > >("pControl")(); pForce_ = (pC->myMemberFunction(*this,deltaT)); Code:
--> FOAM FATAL ERROR: lookup of pControl from objectRegistry region0 successful but it is not a regIOobject, it is a regIOobject From function objectRegistry::lookupObject<Type>(const word&) const in file /opt/openfoam171/src/OpenFOAM/lnInclude/objectRegistryTemplates.C at line 120. FOAM aborting //Björn |
|
December 7, 2012, 11:47 |
|
#5 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
I've encountered this before... it's ugly. That last error you get occurs during an object registry lookup when the type name is correct, but the dynamic_cast still fails. This is one of those compiler issues. If I recall, the cast fails because the object is not the correct size. I can only guess that this occurs when "myClass" is complex. Is it templated, by chance?
The IOReferencer was mostly designed for primitives. If you have a complex custom class, it may be easier to just make it an IOobject, if you can. However, you may find that it still fails the object lookup even without IOReferencer... in which case I'd suggest trying to change the class structure.
__________________
~~~ Follow me on twitter @DavidGaden |
|
December 7, 2012, 12:08 |
|
#6 |
Member
Björn Windén
Join Date: Feb 2012
Location: National Maritime Research Institute, Tokyo, Japan
Posts: 37
Rep Power: 14 |
Hi. Thanks for the quick reply. myClass is indeed complex. It is a base class for selecting different propeller modelling techniques. (I modified it from the way constraints are selected for sixdofrigidbodymotion and I can't say I fully understand what all of it does.)
Hopefully, I can find another solution. There is always the possibility to change the structure so that I have direct access to the class where I wanted to use it. However that would mean having to create a lot of custom solutions for many of the base classes that lie above the class where I want to access it so I was hoping to avoid that. Anyway, thanks for letting me know what the problem was. //Björn |
|
September 3, 2014, 13:54 |
why not using scalarIOField?
|
#7 |
Member
Andreas Ruopp
Join Date: Aug 2009
Location: Stuttgart / Germany
Posts: 31
Rep Power: 17 |
Hi,
maybe too late but why not using for example in main solver: Code:
scalarIOField test ( IOobject ( "test", runTime.constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), <sizeOfWishedScalarList< ); test = <valuesToBePutIntotest>; Code:
scalarIOField test = const_cast<scalarIOField&> ( db().lookupObject<scalarIOField>("test") ); If you want to get only one scalar, then you have to use scalarIOField with size one, since there is no scalarIO.H... I hope this helps! Andy |
|
July 28, 2016, 11:07 |
|
#8 |
New Member
Join Date: Jul 2016
Posts: 3
Rep Power: 10 |
Hello,
I am trying to use the IOReferencer to pass a vector from a custom fvOptions to a custom dynamicFvMesh class. Is this possible? When executing a solver, I get the following error: Code:
--> FOAM FATAL ERROR: request for regIOobject testVector from objectRegistry region0 failed available objects of type regIOobject are 0() From function objectRegistry::lookupObject<Type>(const word&) const in file /home/OpenFOAM/OpenFOAM-2.4.x/src/OpenFOAM/lnInclude/objectRegistryTemplates.C at line 198. FOAM aborting Code:
vector testVector = vector(1, 2, 3); IOReferencer<vector> testVectorRef ( IOobject ( "testVector", mesh_.time().timeName(), //can be anything mesh_, //can be anything IOobject::NO_READ, //must be NO_READ IOobject::NO_WRITE //must be NO_WRITE ), testVector ); Code:
const fvMesh& mesh = time().db().parent().lookupObject<fvMesh>("region0"); const vector& Tout = mesh.lookupObject<IOReferencer<vector> > ( "testVector" )(); |
|
July 28, 2016, 11:46 |
|
#9 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
It looks okay. Probably a scope issue. Does the testVector thing go out of scope? If it does, you can make it a member variable <-- probably the best option. Otherwise, try adding testVector.store(); just before the end of the function... but then I'm not sure how it will behave if you do this on the second iteration.
__________________
~~~ Follow me on twitter @DavidGaden |
|
July 28, 2016, 11:46 |
|
#10 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
Also note that IOReferencer was incorporated by the community into foam-extend, and has since been improved there.
__________________
~~~ Follow me on twitter @DavidGaden |
|
July 28, 2016, 12:32 |
|
#11 |
New Member
Join Date: Jul 2016
Posts: 3
Rep Power: 10 |
Hi David,
The compiler doesn't complain about going out of scope. I tried adding testVector.store(); at the end of the fvOptions source but store() does not appear to be a member function of a vector: Code:
error: ‘Foam::vector’ has no member named ‘store’ |
|
July 28, 2016, 16:54 |
|
#12 |
New Member
Join Date: Jul 2016
Posts: 3
Rep Power: 10 |
I've looked into using the foam-extend version of the IOReferencer and I get the following error upon compilation:
Code:
test.C:100:5: error: no matching function for call to ‘Foam::IOReferencer<Foam::Vector<double> >::IOReferencer(Foam::IOobject, Foam::vector&)’ test.C:100:5: note: candidates are: /home/OpenFOAM/OpenFOAM-2.4.x/src/OpenFOAM/lnInclude/IOReferencer.C:53:1: note: Foam::IOReferencer<Type>::IOReferencer(const Foam::IOobject&, Type*) [with Type = Foam::Vector<double>, Foam::IOobject = Foam::IOobject] /home/OpenFOAM/OpenFOAM-2.4.x/src/OpenFOAM/lnInclude/IOReferencer.C:53:1: note: no known conversion for argument 2 from ‘Foam::vector {aka Foam::Vector<double>}’ to ‘Foam::Vector<double>*’ /home/OpenFOAM/OpenFOAM-2.4.x/src/OpenFOAM/lnInclude/IOReferencer.C:31:1: note: Foam::IOReferencer<Type>::IOReferencer(const Foam::IOobject&) [with Type = Foam::Vector<double>, Foam::IOobject = Foam::IOobject] /home/OpenFOAM/OpenFOAM-2.4.x/src/OpenFOAM/lnInclude/IOReferencer.C:31:1: note: candidate expects 1 argument, 2 provided /home/OpenFOAM/OpenFOAM-2.4.x/src/OpenFOAM/lnInclude/IOReferencer.H:85:7: note: Foam::IOReferencer<Foam::Vector<double> >::IOReferencer(const Foam::IOReferencer<Foam::Vector<double> >&) /home/OpenFOAM/OpenFOAM-2.4.x/src/OpenFOAM/lnInclude/IOReferencer.H:85:7: note: candidate expects 1 argument, 2 provided |
|
March 9, 2022, 06:34 |
|
#13 |
Member
UOCFD
Join Date: Oct 2020
Posts: 40
Rep Power: 6 |
Is this tool available for OpenFOAM8??
|
|
May 18, 2022, 16:26 |
|
#14 | |
Member
Al
Join Date: May 2019
Posts: 37
Rep Power: 7 |
Quote:
I am using the method you suggested, first in the createFields I will write Code:
scalarIOField phiNF ( IOobject ( "test", runTime.constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), 1 ); phiNF = phiP_*liquidToTotal_*domainVolume/liquidVolume; and then in the library that I want use phiNF I will write Code:
template<class Thermo, int PolySize> inline Foam::scalar Foam::myPolynomialTransport<Thermo, PolySize>::mu ( const fvMesh& mesh, const scalar p, const scalar T ) const { scalarIOField phiNF_ = const_cast<scalarIOField&>(db().lookupObject<scalarIOField>("phiNF")); Code:
const_cast<scalarIOField&>(T.db().lookupObject<scalarIOField>("phiNF")); Code:
const objectRegistry& db = Foam::IOobject::db(); Code:
request for member ‘db’ in ‘T’, which is of non-class type ‘const scalar’ {aka ‘const double’} Thanks Last edited by aliyah.; May 19, 2022 at 04:23. Reason: I am explaining my question with more details now |
||
May 19, 2022, 04:40 |
|
#15 |
Senior Member
Mark Olesen
Join Date: Mar 2009
Location: https://olesenm.github.io/
Posts: 1,714
Rep Power: 40 |
Since you registered it on the 'mesh' db, this would be the place you would expect to find it.
It is beyond me why a primitive like bool/int/scalar etc would be expected to have a db() method. |
|
May 19, 2022, 09:04 |
|
#16 | |
Member
Al
Join Date: May 2019
Posts: 37
Rep Power: 7 |
Quote:
I tried mesh and got the following error, Code:
In member function ‘Foam::scalar Foam::CorcioneCorcionePolynomialTransport<Thermo, PolySize>::mu(const Foam::fvMesh&, Foam::scalar, Foam::scalar) const’: lnInclude/APolynomialTransportI.H:138:35: error: request for member ‘db’ is ambiguous 138 | const_cast<scalarIOField&>(mesh.db().lookupObject<scalarIOField>("phiNF")); candidates are: ‘const Foam::objectRegistry& Foam::IOobject::db() const’ 361 | const objectRegistry& db() const; Thanks Edited, and added I tried again and just used Code:
scalarIOField phiNF_ = const_cast<scalarIOField&>(mesh.lookupObject<scalarIOField>("phiNF")); Code:
return muBF(mesh,p,T)/pow(phiNF_.value() , 1.03)); Code:
error: ‘Foam::scalarIOField’ {aka ‘class Foam::IOField<double>’} has no member named ‘value’ Code:
scalarIOField phiNF ( IOobject ( "phiNF", runTime.constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), 1//here I specified the size of field, Is it correct? ); phiNF = phiP_*liquidToTotal_*domainVolume/liquidVolume; Thanks Last edited by aliyah.; May 19, 2022 at 10:25. Reason: I am explaining my question with more details now |
||
May 19, 2022, 10:52 |
|
#17 |
Senior Member
Mark Olesen
Join Date: Mar 2009
Location: https://olesenm.github.io/
Posts: 1,714
Rep Power: 40 |
Often mesh.thisDb() but mesh.objectRegistry::thisDb() should do it without ambiguity. BTW: generally less messy to use lookupObjectRef() and avoid the const_cast
|
|
May 19, 2022, 12:16 |
|
#18 | |
Member
Al
Join Date: May 2019
Posts: 37
Rep Power: 7 |
Quote:
I am using this scalarIOFIeld phiNF_ in Code:
return muBF(mesh,p,T)/pow(phiNF_.value() , 1.03)); Code:
error: ‘Foam::scalarIOField’ {aka ‘class Foam::IOField<double>’} has no member named ‘value’ Code:
scalarIOField phiNF ( IOobject ( "phiNF", runTime.constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), 1//here I specified the size of field, Is it correct? ); phiNF = phiP_*liquidToTotal_*domainVolume/liquidVolume; Thanks |
||
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Discreate Particle Method: Introducing solids | kris | FLUENT | 3 | August 18, 2010 03:39 |
introducing angle of attack on ICEMCFD HEXA | icem beginner | Main CFD Forum | 3 | December 17, 2008 06:05 |
introducing angle of attack on ICEMCFD HEXA | icem beginner | FLUENT | 2 | December 6, 2008 16:34 |
Introducing Tracer | jan | FLUENT | 0 | December 2, 2005 10:17 |
Introducing revolutionary product MBAEdge- smarter | surya_mba | Siemens | 0 | February 16, 2005 05:20 |