2727#include < deal.II/matrix_free/tools.h>
2828
2929// libCEED includes
30- #include < ceed/ceed.h>
30+ #include < ceed.h>
31+ #include < ceed/backend.h>
3132
3233// QFunction source
3334#include " bps-qfunctions.h"
@@ -160,6 +161,8 @@ class OperatorCeed : public OperatorBase<Number>
160161 */
161162 ~OperatorCeed ()
162163 {
164+ CeedVectorDestroy (&src_ceed);
165+ CeedVectorDestroy (&dst_ceed);
163166 CeedOperatorDestroy (&op_apply);
164167 CeedDestroy (&ceed);
165168 }
@@ -302,7 +305,11 @@ class OperatorCeed : public OperatorBase<Number>
302305 CeedOperatorSetField (op_apply, " qdata" , q_data_restriction, CEED_BASIS_NONE, q_data);
303306 CeedOperatorSetField (op_apply, " v" , sol_restriction, sol_basis, CEED_VECTOR_ACTIVE);
304307
305- // 7) cleanup
308+ // 7) libCEED vectors
309+ CeedElemRestrictionCreateVector (sol_restriction, &src_ceed, NULL );
310+ CeedElemRestrictionCreateVector (sol_restriction, &dst_ceed, NULL );
311+
312+ // 8) cleanup
306313 CeedVectorDestroy (&q_data);
307314 CeedElemRestrictionDestroy (&q_data_restriction);
308315 CeedElemRestrictionDestroy (&sol_restriction);
@@ -322,30 +329,43 @@ class OperatorCeed : public OperatorBase<Number>
322329
323330 if (dof_handler.get_fe ().n_components () == 1 )
324331 {
325- // create libCEED view on deal.II vectors
326- VectorTypeCeed src_ceed (ceed, src);
327- VectorTypeCeed dst_ceed (ceed, dst);
332+ // pass memory buffers to libCEED
333+ VectorTypeCeed x (src_ceed);
334+ VectorTypeCeed y (dst_ceed);
335+ x.import_array (src, CEED_MEM_HOST);
336+ y.import_array (dst, CEED_MEM_HOST);
328337
329338 // apply operator
330- CeedOperatorApply (op_apply, src_ceed (), dst_ceed (), CEED_REQUEST_IMMEDIATE);
339+ CeedOperatorApply (op_apply, x (), y (), CEED_REQUEST_IMMEDIATE);
340+
341+ // pull arrays back to deal.II
342+ x.sync_array ();
343+ y.sync_array ();
331344 }
332345 else // TODO: needed for multiple components
333346 {
334347 // allocate space for block vectors
335348 src_tmp.reinit (this ->extended_local_size (), true );
336349 dst_tmp.reinit (this ->extended_local_size (), true );
337350
338- copy_to_block_vector (src_tmp, src); // copy to block vector
351+ // copy to block vector
352+ copy_to_block_vector (src_tmp, src);
339353
340- // create libCEED view on deal.II vectors
341- VectorTypeCeed src_ceed (ceed, src_tmp);
342- VectorTypeCeed dst_ceed (ceed, dst_tmp);
354+ // pass memory buffers to libCEED
355+ VectorTypeCeed x (src_ceed);
356+ VectorTypeCeed y (dst_ceed);
357+ x.import_array (src_tmp, CEED_MEM_HOST);
358+ y.import_array (dst_tmp, CEED_MEM_HOST);
343359
344360 // apply operator
345- CeedOperatorApply (op_apply, src_ceed (), dst_ceed (), CEED_REQUEST_IMMEDIATE);
361+ CeedOperatorApply (op_apply, x (), y (), CEED_REQUEST_IMMEDIATE);
346362
347- dst_ceed.sync_to_host (); // pull libCEED data back to host
348- copy_from_block_vector (dst, dst_tmp); // copy from block vector
363+ // pull arrays back to deal.II
364+ x.sync_array ();
365+ y.sync_array ();
366+
367+ // copy from block vector
368+ copy_from_block_vector (dst, dst_tmp);
349369 }
350370
351371 // communicate: compress
@@ -373,9 +393,14 @@ class OperatorCeed : public OperatorBase<Number>
373393 {
374394 this ->initialize_dof_vector (diagonal);
375395
376- VectorTypeCeed diagonal_ceed (ceed, diagonal);
396+ // pass memory buffer to libCEED
397+ VectorTypeCeed y (dst_ceed);
398+ y.import_array (diagonal, CEED_MEM_HOST);
399+
400+ CeedOperatorLinearAssembleDiagonal (op_apply, y (), CEED_REQUEST_IMMEDIATE);
377401
378- CeedOperatorLinearAssembleDiagonal (op_apply, diagonal_ceed (), CEED_REQUEST_IMMEDIATE);
402+ // pull array back to deal.II
403+ y.sync_array ();
379404
380405 const unsigned int n_components = dof_handler.get_fe ().n_components ();
381406
@@ -404,13 +429,10 @@ class OperatorCeed : public OperatorBase<Number>
404429 /* *
405430 * Constructor.
406431 */
407- VectorTypeCeed (const Ceed &ceed, const VectorType &vec )
432+ VectorTypeCeed (const CeedVector &vec_orig )
408433 {
409- const unsigned int n_dofs =
410- vec.get_partitioner ()->locally_owned_size () + vec.get_partitioner ()->n_ghost_indices ();
411-
412- CeedVectorCreate (ceed, n_dofs, &vec_ceed);
413- CeedVectorSetArray (vec_ceed, CEED_MEM_HOST, CEED_USE_POINTER, vec.get_values ());
434+ vec_ceed = NULL ;
435+ CeedVectorReferenceCopy (vec_orig, &vec_ceed);
414436 }
415437
416438 /* *
@@ -422,30 +444,46 @@ class OperatorCeed : public OperatorBase<Number>
422444 return vec_ceed;
423445 }
424446
447+ /* *
448+ * Set deal.II memory in libCEED vector.
449+ */
450+ void
451+ import_array (const VectorType &vec, const CeedMemType space)
452+ {
453+ mem_space = space;
454+ CeedVectorSetArray (vec_ceed, mem_space, CEED_USE_POINTER, vec.get_values ());
455+ }
456+
425457 /* *
426458 * Sync memory from device to host.
427459 */
428460 void
429- sync_to_host ()
461+ sync_array ()
430462 {
431- CeedVectorSyncArray (vec_ceed, CEED_MEM_HOST );
463+ CeedVectorSyncArray (vec_ceed, mem_space );
432464 }
433465
434466 /* *
435467 * Destructor: destroy vector view.
436468 */
437469 ~VectorTypeCeed ()
438470 {
439- CeedScalar *ptr;
440- CeedVectorTakeArray (vec_ceed, CEED_MEM_HOST, &ptr);
471+ bool has_array;
472+ CeedVectorHasBorrowedArrayOfType (vec_ceed, mem_space, &has_array);
473+ if (has_array)
474+ {
475+ CeedScalar *ptr;
476+ CeedVectorTakeArray (vec_ceed, mem_space, &ptr);
477+ }
441478 CeedVectorDestroy (&vec_ceed);
442479 }
443480
444481 private:
445482 /* *
446483 * libCEED vector view.
447484 */
448- CeedVector vec_ceed;
485+ CeedMemType mem_space;
486+ CeedVector vec_ceed;
449487 };
450488
451489 /* *
@@ -705,6 +743,8 @@ class OperatorCeed : public OperatorBase<Number>
705743 Ceed ceed;
706744 std::vector<double > weights;
707745 std::array<CeedInt, 3 > strides;
746+ CeedVector src_ceed;
747+ CeedVector dst_ceed;
708748 CeedOperator op_apply;
709749
710750 /* *
0 commit comments