ceed-operator.c (5da5ab9fd3cba19342bf8c55e0062d74fad46ef3) ceed-operator.c (0db52efc76395f116dcbcc2ef5af6412f2cc714a)
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>

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

2154 @ref User
2155**/
2156int CeedOperatorApply(CeedOperator op, CeedVector in, CeedVector out, CeedRequest *request) {
2157 bool is_composite;
2158
2159 CeedCall(CeedOperatorCheckReady(op));
2160
2161 CeedCall(CeedOperatorIsComposite(op, &is_composite));
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>

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

2154 @ref User
2155**/
2156int CeedOperatorApply(CeedOperator op, CeedVector in, CeedVector out, CeedRequest *request) {
2157 bool is_composite;
2158
2159 CeedCall(CeedOperatorCheckReady(op));
2160
2161 CeedCall(CeedOperatorIsComposite(op, &is_composite));
2162 if (is_composite) {
2162 if (is_composite && op->ApplyComposite) {
2163 // Composite Operator
2163 // Composite Operator
2164 if (op->ApplyComposite) {
2165 CeedCall(op->ApplyComposite(op, in, out, request));
2166 } else {
2167 CeedInt num_suboperators;
2168 CeedOperator *sub_operators;
2169
2170 CeedCall(CeedCompositeOperatorGetNumSub(op, &num_suboperators));
2171 CeedCall(CeedCompositeOperatorGetSubList(op, &sub_operators));
2172
2173 // Zero all output vectors
2174 if (out != CEED_VECTOR_NONE) CeedCall(CeedVectorSetValue(out, 0.0));
2175 for (CeedInt i = 0; i < num_suboperators; i++) {
2176 CeedInt num_output_fields;
2177 CeedOperatorField *output_fields;
2178
2179 CeedCall(CeedOperatorGetFields(sub_operators[i], NULL, NULL, &num_output_fields, &output_fields));
2180 for (CeedInt j = 0; j < num_output_fields; j++) {
2181 CeedVector vec;
2182
2183 CeedCall(CeedOperatorFieldGetVector(output_fields[j], &vec));
2184 if (vec != CEED_VECTOR_ACTIVE && vec != CEED_VECTOR_NONE) {
2185 CeedCall(CeedVectorSetValue(vec, 0.0));
2186 }
2187 CeedCall(CeedVectorDestroy(&vec));
2188 }
2189 }
2190 // ApplyAdd
2191 CeedCall(CeedOperatorApplyAdd(op, in, out, request));
2192 }
2193 } else {
2164 CeedCall(op->ApplyComposite(op, in, out, request));
2165 } else if (!is_composite && op->Apply) {
2194 // Standard Operator
2166 // Standard Operator
2195 if (op->Apply) {
2196 CeedCall(op->Apply(op, in, out, request));
2197 } else {
2198 CeedInt num_output_fields;
2199 CeedOperatorField *output_fields;
2167 CeedCall(op->Apply(op, in, out, request));
2168 } else {
2169 // Standard or composite, default to zeroing out and calling ApplyAddActive
2170 // Zero active output
2171 if (out != CEED_VECTOR_NONE) CeedCall(CeedVectorSetValue(out, 0.0));
2200
2172
2201 CeedCall(CeedOperatorGetFields(op, NULL, NULL, &num_output_fields, &output_fields));
2202 // Zero all output vectors
2203 for (CeedInt i = 0; i < num_output_fields; i++) {
2204 bool is_active;
2205 CeedVector vec;
2206
2207 CeedCall(CeedOperatorFieldGetVector(output_fields[i], &vec));
2208 is_active = vec == CEED_VECTOR_ACTIVE;
2209 if (is_active) vec = out;
2210 if (vec != CEED_VECTOR_NONE) CeedCall(CeedVectorSetValue(vec, 0.0));
2211 if (!is_active) CeedCall(CeedVectorDestroy(&vec));
2212 }
2213 // Apply
2214 if (op->num_elem > 0) CeedCall(op->ApplyAdd(op, in, out, request));
2215 }
2173 // ApplyAddActive
2174 CeedCall(CeedOperatorApplyAddActive(op, in, out, request));
2216 }
2217 return CEED_ERROR_SUCCESS;
2218}
2219
2220/**
2221 @brief Apply `CeedOperator` to a `CeedVector` and add result to output `CeedVector`.
2222
2223 This computes the action of the operator on the specified (active) input, yielding its (active) output.

--- 222 unchanged lines hidden ---
2175 }
2176 return CEED_ERROR_SUCCESS;
2177}
2178
2179/**
2180 @brief Apply `CeedOperator` to a `CeedVector` and add result to output `CeedVector`.
2181
2182 This computes the action of the operator on the specified (active) input, yielding its (active) output.

--- 222 unchanged lines hidden ---