xref: /petsc/src/dm/interface/dmceed.c (revision 7ce467fce31f25e225373fadec9318b793af96d4)
1 #include <petsc/private/dmimpl.h> /*I      "petscdm.h"          I*/
2 
3 #ifdef PETSC_HAVE_LIBCEED
4   #include <petscdmceed.h>
5 
6 /*@C
7   DMGetCeed - Get the LibCEED context associated with this `DM`
8 
9   Not Collective
10 
11   Input Parameter:
12 . DM   - The `DM`
13 
14   Output Parameter:
15 . ceed - The LibCEED context
16 
17   Level: intermediate
18 
19 .seealso: `DM`, `DMCreate()`
20 @*/
21 PetscErrorCode DMGetCeed(DM dm, Ceed *ceed)
22 {
23   PetscFunctionBegin;
24   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
25   PetscAssertPointer(ceed, 2);
26   if (!dm->ceed) {
27     char        ceedresource[PETSC_MAX_PATH_LEN]; /* libCEED resource specifier */
28     const char *prefix;
29 
30     PetscCall(PetscStrncpy(ceedresource, "/cpu/self", sizeof(ceedresource)));
31     PetscCall(PetscObjectGetOptionsPrefix((PetscObject)dm, &prefix));
32     PetscCall(PetscOptionsGetString(NULL, prefix, "-dm_ceed", ceedresource, sizeof(ceedresource), NULL));
33     PetscCallCEED(CeedInit(ceedresource, &dm->ceed));
34   }
35   *ceed = dm->ceed;
36   PetscFunctionReturn(PETSC_SUCCESS);
37 }
38 
39 static CeedMemType PetscMemType2Ceed(PetscMemType mem_type) {
40   return PetscMemTypeDevice(mem_type) ? CEED_MEM_DEVICE : CEED_MEM_HOST;
41 }
42 
43 PetscErrorCode VecGetCeedVector(Vec X, Ceed ceed, CeedVector *cx)
44 {
45   PetscMemType memtype;
46   PetscScalar *x;
47   PetscInt     n;
48 
49   PetscFunctionBegin;
50   PetscCall(VecGetLocalSize(X, &n));
51   PetscCall(VecGetArrayAndMemType(X, &x, &memtype));
52   PetscCallCEED(CeedVectorCreate(ceed, n, cx));
53   PetscCallCEED(CeedVectorSetArray(*cx, PetscMemType2Ceed(memtype), CEED_USE_POINTER, x));
54   PetscFunctionReturn(0);
55 }
56 
57 PetscErrorCode VecRestoreCeedVector(Vec X, CeedVector *cx)
58 {
59   PetscFunctionBegin;
60   PetscCall(VecRestoreArrayAndMemType(X, NULL));
61   PetscCallCEED(CeedVectorDestroy(cx));
62   PetscFunctionReturn(0);
63 }
64 
65 PetscErrorCode VecGetCeedVectorRead(Vec X, Ceed ceed, CeedVector *cx)
66 {
67   PetscMemType       memtype;
68   const PetscScalar *x;
69   PetscInt           n;
70   PetscFunctionBegin;
71   PetscCall(VecGetLocalSize(X, &n));
72   PetscCall(VecGetArrayReadAndMemType(X, &x, &memtype));
73   PetscCallCEED(CeedVectorCreate(ceed, n, cx));
74   PetscCallCEED(CeedVectorSetArray(*cx, PetscMemType2Ceed(memtype), CEED_USE_POINTER, (PetscScalar*)x));
75   PetscFunctionReturn(0);
76 }
77 
78 PetscErrorCode VecRestoreCeedVectorRead(Vec X, CeedVector *cx)
79 {
80   PetscFunctionBegin;
81   PetscCall(VecRestoreArrayReadAndMemType(X, NULL));
82   PetscCallCEED(CeedVectorDestroy(cx));
83   PetscFunctionReturn(0);
84 }
85 
86 #endif
87