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