Basically, the unsigned int cell, CUDAWrappers::MatrixFree::Data *, and CUDAWrappers::SharedData * are data that is produced by MatrixFree and that are needed by FEEvalution. The user needs to pass this data to initialize the FEEvaluation object, this is very similar to what is done on the CPU where you need to pass a MatrixFree object to initialize the FEEvaluation. The user is not supposed to touch CUDAWrappers::MatrixFree::Data *, everything that you want to pass needs to be stored inside the functor. If you look at the latest version of the matrix_vector_mf.h, we store the coefficients inside the functor (re-reading the post I wrote in the other thread, it was definitely not clear that it is what you are supposed to do).
You should copy the signature of HelmholtzOperator::operator() and ask questions when you have a problem. Also I would advise you to use master not only for your code but also for the documentation. We did add the signature of the functors in the documentation a couple of months ago see
here.
In more details the difference between the CPU and the GPU operator are:
- (const unsigned int cell, const typename CUDAWrappers::MatrixFree<dim, Number>::Data *gpu_data, CUDAWrappers::SharedData<dim, Number> * shared_data) is equivalent to (const MatrixFree<dim, typename VectorType::value_type> &data).
- instead of having access to cell_range like in the CPU case, we perform the loop ourselves in apply_quad_point_operations() and so what would have been inside the for loop needs to be in a functor.
Best,