This issue is also partially "solved" by using the FEMSystem
framework.  In there, the cell residual and jacobian assembly functions
are class members.

If we were smart, we probably should have initially created a

class AssemblyFunction;

from which you would have derived your own assembly routine, and then
the user attaches an AssemblyFunction& reference to the System rather
than a C-style function pointer.  I think it would be possible to
extend the System interface in a backward-compatibility preserving
manner to add this functionality, but I don't think anyone will
volunteer to do it and in any event we have the FEMSystem.


-John



Derek Gaston writes:
 > (Note: The correct mailing list for this type of question is
 > [email protected] )
 > 
 > In general, using pointers to class methods doesn't really work like
 > you would expect.... the reason?  Because you have to have a class
 > instance to call it on... meaning you have to store two pieces of
 > data... the pointer to the method and a pointer to a class instance.
 > Here is some reading on the subject:
 > 
 > http://www.parashift.com/c++-faq-lite/pointers-to-members.html
 > 
 > I do believe that you can do exactly what you were suggesting if you
 > make the function "static".... but at that point you might as well
 > just make it external to the class because a static member function
 > can't access any data internal to the class anyway...
 > 
 > Basically, the answer is no...
 > 
 > Derek
 > 
 > 
 > On Jan 14, 2008 5:51 AM, Mathias Nenning <[EMAIL PROTECTED]> wrote:
 > > Hello!
 > >
 > > I'm programming a Newmarksystem...
 > >
 > > My question is, if it is possible to attach a "assemble function" which
 > > is a method of a class...
 > >
 > > Example:
 > >
 > > PoroNewmark
 > > {
 > > private:
 > > // declaration of a function pointer
 > > void (PoroNewmark::*funcP)( EquationSystems &es, const std::string&
 > > system_name );
 > > public:
 > > //...
 > > //...
 > > void MatrixAssembler( EquationSystems &es, const std::string& system_name 
 > > );
 > >
 > > };
 > >
 > > PoroNewmark::PoroNewmark (...)
 > > {
 > > //...
 > > //...
 > > funcPtrAssembler = & PoroNewmark::MatrixAssembler
 > >
 > > rNewmark_system.attach_assemble_function ( funcPtrAssembler);
 > >
 > > //...
 > > //...
 > > }
 > >
 > > This will giva a comilation error
 > >
 > > $ make
 > > creating dependencies for src/poro_newmark.C ...
 > > make[1]: Entering directory `/../main'
 > > compiling src/poro_newmark.C ...
 > > src/poro_newmark.C: In constructor 'PoroNewmark::PoroNewmark(const
 > > inp::Input*, Mesh*, MeshData*, Material*, Analysis*, MeshOptions*)':
 > > src/poro_newmark.C:78: error: no matching function for call to
 > > 'NewmarkSystem::attach_assemble_function(void
 > > (PoroNewmark::*&)(EquationSystems&, const std::string&))'
 > > /opt/libMesh/libmeshOPT/include/solvers/system.h:450: note: candidates
 > > are: void System::attach_assemble_function(void (*)(EquationSystems&,
 > > const std::string&))
 > > make[1]: *** [poro_newmark.o] Error 1
 > >
 > > Any suggestions?
 > >
 > > Thanks in advance
 > > Mathias
 > >
 > >
 > 
 > -------------------------------------------------------------------------
 > Check out the new SourceForge.net Marketplace.
 > It's the best place to buy or sell services for
 > just about anything Open Source.
 > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
 > _______________________________________________
 > Libmesh-users mailing list
 > [email protected]
 > https://lists.sourceforge.net/lists/listinfo/libmesh-users

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Libmesh-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users

Reply via email to