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