pass a member function to MatShellSetOperation
Hi: I want to have the shell matrix-vector multiplication written as a class member function and pass it to the shell matrix via MatShellSetOperation. MatShellSetOperation(A, MATOP_MULT, (void (*)(void))(&Global_Assem::MyMatMult)); Perhaps I have a wrong understanding of function pointers, and I am constantly getting warnings that say I cannot convert a member function to a void type. The warning indeed makes sense to me, as the function pointer passed in the above manner is independent of an instance. Perhaps there are other ways of passing a member function that I don't know of. If you know how to address this, I would appreciate it a lot! Thanks, Mike
I have used something like this in similar situation auto MatMult = [this](…args…) { this->MyMatMult(…args…); }; Then pass MatMult to petsc. this refers to the class Global_Assem and we are assuming you are inside this class when doing the above. best praveen
On 30-Sep-2021, at 3:25 PM, Michael Wick <[email protected]> wrote:
Hi:
I want to have the shell matrix-vector multiplication written as a class member function and pass it to the shell matrix via MatShellSetOperation.
MatShellSetOperation(A, MATOP_MULT, (void (*)(void))(&Global_Assem::MyMatMult));
Perhaps I have a wrong understanding of function pointers, and I am constantly getting warnings that say I cannot convert a member function to a void type. The warning indeed makes sense to me, as the function pointer passed in the above manner is independent of an instance. Perhaps there are other ways of passing a member function that I don't know of. If you know how to address this, I would appreciate it a lot!
Thanks,
Mike
That is the new way to do it. The other way to do it is to have it be a static member function, so that it does not take "this". Thanks, Matt On Thu, Sep 30, 2021 at 6:11 AM Praveen C <[email protected]> wrote:
I have used something like this in similar situation
auto MatMult = [this](…args…) { this->MyMatMult(…args…); };
Then pass MatMult to petsc.
*this* refers to the class Global_Assem and we are assuming you are inside this class when doing the above.
best praveen
On 30-Sep-2021, at 3:25 PM, Michael Wick <[email protected]> wrote:
Hi:
I want to have the shell matrix-vector multiplication written as a class member function and pass it to the shell matrix via MatShellSetOperation.
MatShellSetOperation(A, MATOP_MULT, (void (*)(void))(&Global_Assem::MyMatMult));
Perhaps I have a wrong understanding of function pointers, and I am constantly getting warnings that say I cannot convert a member function to a void type. The warning indeed makes sense to me, as the function pointer passed in the above manner is independent of an instance. Perhaps there are other ways of passing a member function that I don't know of. If you know how to address this, I would appreciate it a lot!
Thanks,
Mike
-- What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. -- Norbert Wiener https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
participants (3)
-
Matthew Knepley -
Michael Wick -
Praveen C