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