1 // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. 2 // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3 // 4 // SPDX-License-Identifier: BSD-2-Clause 5 // 6 // This file is part of CEED: http://github.com/ceed 7 8 #include <ceed/ceed.h> 9 #include <ceed/backend.h> 10 #include <stdbool.h> 11 #include <string.h> 12 #include "ceed-opt.h" 13 14 //------------------------------------------------------------------------------ 15 // Backend Destroy 16 //------------------------------------------------------------------------------ 17 static int CeedDestroy_Opt(Ceed ceed) { 18 int ierr; 19 Ceed_Opt *data; 20 ierr = CeedGetData(ceed, &data); CeedChkBackend(ierr); 21 ierr = CeedFree(&data); CeedChkBackend(ierr); 22 23 return CEED_ERROR_SUCCESS; 24 } 25 26 //------------------------------------------------------------------------------ 27 // Backend Init 28 //------------------------------------------------------------------------------ 29 static int CeedInit_Opt_Blocked(const char *resource, Ceed ceed) { 30 int ierr; 31 if (strcmp(resource, "/cpu/self") && strcmp(resource, "/cpu/self/opt") && 32 strcmp(resource, "/cpu/self/opt/blocked")) 33 // LCOV_EXCL_START 34 return CeedError(ceed, CEED_ERROR_BACKEND, 35 "Opt backend cannot use resource: %s", resource); 36 // LCOV_EXCL_STOP 37 ierr = CeedSetDeterministic(ceed, true); CeedChkBackend(ierr); 38 39 // Create reference CEED that implementation will be dispatched 40 // through unless overridden 41 Ceed ceed_ref; 42 CeedInit("/cpu/self/ref/serial", &ceed_ref); 43 ierr = CeedSetDelegate(ceed, ceed_ref); CeedChkBackend(ierr); 44 45 // Set fallback CEED resource for advanced operator functionality 46 const char fallbackresource[] = "/cpu/self/ref/serial"; 47 ierr = CeedSetOperatorFallbackResource(ceed, fallbackresource); 48 CeedChkBackend(ierr); 49 50 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "Destroy", 51 CeedDestroy_Opt); CeedChkBackend(ierr); 52 ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "OperatorCreate", 53 CeedOperatorCreate_Opt); CeedChkBackend(ierr); 54 55 // Set blocksize 56 Ceed_Opt *data; 57 ierr = CeedCalloc(1, &data); CeedChkBackend(ierr); 58 data->blk_size = 8; 59 ierr = CeedSetData(ceed, data); CeedChkBackend(ierr); 60 61 return CEED_ERROR_SUCCESS; 62 } 63 64 //------------------------------------------------------------------------------ 65 // Backend Register 66 //------------------------------------------------------------------------------ 67 CEED_INTERN int CeedRegister_Opt_Blocked(void) { 68 return CeedRegister("/cpu/self/opt/blocked", CeedInit_Opt_Blocked, 40); 69 } 70 //------------------------------------------------------------------------------ 71