ceed-preconditioning.c (0183ed61035d97ff853cf8c8e722c0fda76e54df) ceed-preconditioning.c (915834c9f1e582e3fdfc87db6b4fa4e010d293bb)
1// Copyright (c) 2017-2025, 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-impl.h>

--- 2437 unchanged lines hidden (view full) ---

2446 Note: Calling this function asserts that setup is complete and sets the `CeedOperator` as immutable.
2447
2448 @param[in] op `CeedOperator` to assemble
2449 @param[out] values Values to assemble into matrix
2450
2451 @ref User
2452**/
2453int CeedOperatorLinearAssemble(CeedOperator op, CeedVector values) {
1// Copyright (c) 2017-2025, 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-impl.h>

--- 2437 unchanged lines hidden (view full) ---

2446 Note: Calling this function asserts that setup is complete and sets the `CeedOperator` as immutable.
2447
2448 @param[in] op `CeedOperator` to assemble
2449 @param[out] values Values to assemble into matrix
2450
2451 @ref User
2452**/
2453int CeedOperatorLinearAssemble(CeedOperator op, CeedVector values) {
2454 bool is_composite;
2454 bool is_composite, has_linear_assemble_single;
2455 CeedInt num_suboperators, offset = 0;
2456 CeedSize single_entries = 0;
2457 CeedOperator *sub_operators;
2458
2459 CeedCall(CeedOperatorCheckReady(op));
2460 CeedCall(CeedOperatorIsComposite(op, &is_composite));
2461
2462 // Early exit for empty operator
2463 if (!is_composite) {
2464 CeedInt num_elem = 0;
2465
2466 CeedCall(CeedOperatorGetNumElements(op, &num_elem));
2467 if (num_elem == 0) return CEED_ERROR_SUCCESS;
2455 CeedInt num_suboperators, offset = 0;
2456 CeedSize single_entries = 0;
2457 CeedOperator *sub_operators;
2458
2459 CeedCall(CeedOperatorCheckReady(op));
2460 CeedCall(CeedOperatorIsComposite(op, &is_composite));
2461
2462 // Early exit for empty operator
2463 if (!is_composite) {
2464 CeedInt num_elem = 0;
2465
2466 CeedCall(CeedOperatorGetNumElements(op, &num_elem));
2467 if (num_elem == 0) return CEED_ERROR_SUCCESS;
2468 has_linear_assemble_single = op->LinearAssembleSingle != NULL;
2469 } else {
2470 CeedCall(CeedCompositeOperatorGetNumSub(op, &num_suboperators));
2471 CeedCall(CeedCompositeOperatorGetSubList(op, &sub_operators));
2472 has_linear_assemble_single = true;
2473 for (CeedInt i = 0; i < num_suboperators; i++) {
2474 has_linear_assemble_single = has_linear_assemble_single && sub_operators[i]->LinearAssembleSingle != NULL;
2475 }
2468 }
2469
2470 if (op->LinearAssemble) {
2471 // Backend version
2472 CeedCall(op->LinearAssemble(op, values));
2473 return CEED_ERROR_SUCCESS;
2476 }
2477
2478 if (op->LinearAssemble) {
2479 // Backend version
2480 CeedCall(op->LinearAssemble(op, values));
2481 return CEED_ERROR_SUCCESS;
2482 } else if (has_linear_assemble_single) {
2483 // Default to summing contributions of suboperators
2484 CeedCall(CeedVectorSetValue(values, 0.0));
2485 if (is_composite && num_suboperators > 0 && sub_operators[0]) {
2486 CeedCall(CeedCompositeOperatorGetNumSub(op, &num_suboperators));
2487 CeedCall(CeedCompositeOperatorGetSubList(op, &sub_operators));
2488 for (CeedInt k = 0; k < num_suboperators; k++) {
2489 CeedCall(CeedSingleOperatorAssemble(sub_operators[k], offset, values));
2490 CeedCall(CeedSingleOperatorAssemblyCountEntries(sub_operators[k], &single_entries));
2491 offset += single_entries;
2492 }
2493 } else {
2494 CeedCall(CeedSingleOperatorAssemble(op, offset, values));
2495 }
2496 return CEED_ERROR_SUCCESS;
2474 } else {
2475 // Operator fallback
2476 CeedOperator op_fallback;
2477
2478 CeedCall(CeedOperatorGetFallback(op, &op_fallback));
2479 if (op_fallback) {
2480 CeedCall(CeedOperatorLinearAssemble(op_fallback, values));
2481 return CEED_ERROR_SUCCESS;

--- 504 unchanged lines hidden ---
2497 } else {
2498 // Operator fallback
2499 CeedOperator op_fallback;
2500
2501 CeedCall(CeedOperatorGetFallback(op, &op_fallback));
2502 if (op_fallback) {
2503 CeedCall(CeedOperatorLinearAssemble(op_fallback, values));
2504 return CEED_ERROR_SUCCESS;

--- 504 unchanged lines hidden ---