ceed-operator.c (356036fa84f714fa73ef64c9a80ce2028dde816f) ceed-operator.c (f754c1774ebf078fd65e2fa160223ced3afca842)
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-impl.h>

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

39
40 // Restriction
41 CeedCheck((r == CEED_ELEMRESTRICTION_NONE) == (eval_mode == CEED_EVAL_WEIGHT), ceed, CEED_ERROR_INCOMPATIBLE,
42 "CEED_ELEMRESTRICTION_NONE and CEED_EVAL_WEIGHT must be used together.");
43 if (r != CEED_ELEMRESTRICTION_NONE) {
44 CeedCall(CeedElemRestrictionGetNumComponents(r, &restr_num_comp));
45 }
46 // Basis
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-impl.h>

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

39
40 // Restriction
41 CeedCheck((r == CEED_ELEMRESTRICTION_NONE) == (eval_mode == CEED_EVAL_WEIGHT), ceed, CEED_ERROR_INCOMPATIBLE,
42 "CEED_ELEMRESTRICTION_NONE and CEED_EVAL_WEIGHT must be used together.");
43 if (r != CEED_ELEMRESTRICTION_NONE) {
44 CeedCall(CeedElemRestrictionGetNumComponents(r, &restr_num_comp));
45 }
46 // Basis
47 CeedCheck((b == CEED_BASIS_NONE) == (eval_mode == CEED_EVAL_NONE), ceed, CEED_ERROR_INCOMPATIBLE,
48 "CEED_BASIS_NONE and CEED_EVAL_NONE must be used together.");
49 if (b != CEED_BASIS_NONE) {
47 CeedCheck((b == CEED_BASIS_COLLOCATED) == (eval_mode == CEED_EVAL_NONE), ceed, CEED_ERROR_INCOMPATIBLE,
48 "CEED_BASIS_COLLOCATED and CEED_EVAL_NONE must be used together.");
49 if (b != CEED_BASIS_COLLOCATED) {
50 CeedCall(CeedBasisGetDimension(b, &dim));
51 CeedCall(CeedBasisGetNumComponents(b, &num_comp));
52 CeedCall(CeedBasisGetNumQuadratureComponents(b, eval_mode, &q_comp));
53 CeedCheck(r == CEED_ELEMRESTRICTION_NONE || restr_num_comp == num_comp, ceed, CEED_ERROR_DIMENSION,
54 "Field '%s' of size %" CeedInt_FMT " and EvalMode %s: ElemRestriction has %" CeedInt_FMT " components, but Basis has %" CeedInt_FMT
55 " components",
56 qf_field->field_name, qf_field->size, CeedEvalModes[qf_field->eval_mode], restr_num_comp, num_comp);
57 }

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

97
98 fprintf(stream,
99 "%s %s field %" CeedInt_FMT
100 ":\n"
101 "%s Name: \"%s\"\n",
102 pre, in_out, field_number, pre, qf_field->field_name);
103 fprintf(stream, "%s Size: %" CeedInt_FMT "\n", pre, qf_field->size);
104 fprintf(stream, "%s EvalMode: %s\n", pre, CeedEvalModes[qf_field->eval_mode]);
50 CeedCall(CeedBasisGetDimension(b, &dim));
51 CeedCall(CeedBasisGetNumComponents(b, &num_comp));
52 CeedCall(CeedBasisGetNumQuadratureComponents(b, eval_mode, &q_comp));
53 CeedCheck(r == CEED_ELEMRESTRICTION_NONE || restr_num_comp == num_comp, ceed, CEED_ERROR_DIMENSION,
54 "Field '%s' of size %" CeedInt_FMT " and EvalMode %s: ElemRestriction has %" CeedInt_FMT " components, but Basis has %" CeedInt_FMT
55 " components",
56 qf_field->field_name, qf_field->size, CeedEvalModes[qf_field->eval_mode], restr_num_comp, num_comp);
57 }

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

97
98 fprintf(stream,
99 "%s %s field %" CeedInt_FMT
100 ":\n"
101 "%s Name: \"%s\"\n",
102 pre, in_out, field_number, pre, qf_field->field_name);
103 fprintf(stream, "%s Size: %" CeedInt_FMT "\n", pre, qf_field->size);
104 fprintf(stream, "%s EvalMode: %s\n", pre, CeedEvalModes[qf_field->eval_mode]);
105 if (field->basis == CEED_BASIS_NONE) fprintf(stream, "%s No basis\n", pre);
105 if (field->basis == CEED_BASIS_COLLOCATED) fprintf(stream, "%s Collocated basis\n", pre);
106 if (field->vec == CEED_VECTOR_ACTIVE) fprintf(stream, "%s Active vector\n", pre);
107 else if (field->vec == CEED_VECTOR_NONE) fprintf(stream, "%s No vector\n", pre);
108 return CEED_ERROR_SUCCESS;
109}
110
111/**
112 @brief View a single CeedOperator
113

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

605 This function is used to specify both active and passive fields to a CeedOperator.
606 For passive fields, a vector @arg v must be provided.
607 Passive fields can inputs or outputs (updated in-place when operator is applied).
608
609 Active fields must be specified using this function, but their data (in a CeedVector) is passed in CeedOperatorApply().
610 There can be at most one active input CeedVector and at most one active output CeedVector passed to CeedOperatorApply().
611
612 The number of quadrature points must agree across all points.
106 if (field->vec == CEED_VECTOR_ACTIVE) fprintf(stream, "%s Active vector\n", pre);
107 else if (field->vec == CEED_VECTOR_NONE) fprintf(stream, "%s No vector\n", pre);
108 return CEED_ERROR_SUCCESS;
109}
110
111/**
112 @brief View a single CeedOperator
113

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

605 This function is used to specify both active and passive fields to a CeedOperator.
606 For passive fields, a vector @arg v must be provided.
607 Passive fields can inputs or outputs (updated in-place when operator is applied).
608
609 Active fields must be specified using this function, but their data (in a CeedVector) is passed in CeedOperatorApply().
610 There can be at most one active input CeedVector and at most one active output CeedVector passed to CeedOperatorApply().
611
612 The number of quadrature points must agree across all points.
613 When using @ref CEED_BASIS_NONE, the number of quadrature points is determined by the element size of r.
613 When using @ref CEED_BASIS_COLLOCATED, the number of quadrature points is determined by the element size of r.
614
615 @param[in,out] op CeedOperator on which to provide the field
616 @param[in] field_name Name of the field (to be matched with the name used by CeedQFunction)
617 @param[in] r CeedElemRestriction
614
615 @param[in,out] op CeedOperator on which to provide the field
616 @param[in] field_name Name of the field (to be matched with the name used by CeedQFunction)
617 @param[in] r CeedElemRestriction
618 @param[in] b CeedBasis in which the field resides or @ref CEED_BASIS_NONE if collocated with quadrature points
618 @param[in] b CeedBasis in which the field resides or @ref CEED_BASIS_COLLOCATED if collocated with quadrature points
619 @param[in] v CeedVector to be used by CeedOperator or @ref CEED_VECTOR_ACTIVE if field is active or @ref CEED_VECTOR_NONE
620 if using @ref CEED_EVAL_WEIGHT in the QFunction
621
622 @return An error code: 0 - success, otherwise - failure
623
624 @ref User
625**/
626int CeedOperatorSetField(CeedOperator op, const char *field_name, CeedElemRestriction r, CeedBasis b, CeedVector v) {

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

634 CeedCheck(r, op->ceed, CEED_ERROR_INCOMPATIBLE, "ElemRestriction r for field \"%s\" must be non-NULL.", field_name);
635 CeedCheck(b, op->ceed, CEED_ERROR_INCOMPATIBLE, "Basis b for field \"%s\" must be non-NULL.", field_name);
636 CeedCheck(v, op->ceed, CEED_ERROR_INCOMPATIBLE, "Vector v for field \"%s\" must be non-NULL.", field_name);
637
638 CeedCall(CeedElemRestrictionGetNumElements(r, &num_elem));
639 CeedCheck(r == CEED_ELEMRESTRICTION_NONE || !op->has_restriction || op->num_elem == num_elem, op->ceed, CEED_ERROR_DIMENSION,
640 "ElemRestriction with %" CeedInt_FMT " elements incompatible with prior %" CeedInt_FMT " elements", num_elem, op->num_elem);
641
619 @param[in] v CeedVector to be used by CeedOperator or @ref CEED_VECTOR_ACTIVE if field is active or @ref CEED_VECTOR_NONE
620 if using @ref CEED_EVAL_WEIGHT in the QFunction
621
622 @return An error code: 0 - success, otherwise - failure
623
624 @ref User
625**/
626int CeedOperatorSetField(CeedOperator op, const char *field_name, CeedElemRestriction r, CeedBasis b, CeedVector v) {

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

634 CeedCheck(r, op->ceed, CEED_ERROR_INCOMPATIBLE, "ElemRestriction r for field \"%s\" must be non-NULL.", field_name);
635 CeedCheck(b, op->ceed, CEED_ERROR_INCOMPATIBLE, "Basis b for field \"%s\" must be non-NULL.", field_name);
636 CeedCheck(v, op->ceed, CEED_ERROR_INCOMPATIBLE, "Vector v for field \"%s\" must be non-NULL.", field_name);
637
638 CeedCall(CeedElemRestrictionGetNumElements(r, &num_elem));
639 CeedCheck(r == CEED_ELEMRESTRICTION_NONE || !op->has_restriction || op->num_elem == num_elem, op->ceed, CEED_ERROR_DIMENSION,
640 "ElemRestriction with %" CeedInt_FMT " elements incompatible with prior %" CeedInt_FMT " elements", num_elem, op->num_elem);
641
642 if (b == CEED_BASIS_NONE) CeedCall(CeedElemRestrictionGetElementSize(r, &num_qpts));
642 if (b == CEED_BASIS_COLLOCATED) CeedCall(CeedElemRestrictionGetElementSize(r, &num_qpts));
643 else CeedCall(CeedBasisGetNumQuadraturePoints(b, &num_qpts));
644 CeedCheck(op->num_qpts == 0 || op->num_qpts == num_qpts, op->ceed, CEED_ERROR_DIMENSION,
645 "%s must correspond to the same number of quadrature points as previously added Bases. Found %" CeedInt_FMT
646 " quadrature points but expected %" CeedInt_FMT " quadrature points.",
643 else CeedCall(CeedBasisGetNumQuadraturePoints(b, &num_qpts));
644 CeedCheck(op->num_qpts == 0 || op->num_qpts == num_qpts, op->ceed, CEED_ERROR_DIMENSION,
645 "%s must correspond to the same number of quadrature points as previously added Bases. Found %" CeedInt_FMT
646 " quadrature points but expected %" CeedInt_FMT " quadrature points.",
647 b == CEED_BASIS_NONE ? "ElemRestriction" : "Basis", num_qpts, op->num_qpts);
647 b == CEED_BASIS_COLLOCATED ? "ElemRestriction" : "Basis", num_qpts, op->num_qpts);
648 for (CeedInt i = 0; i < op->qf->num_input_fields; i++) {
649 if (!strcmp(field_name, (*op->qf->input_fields[i]).field_name)) {
650 qf_field = op->qf->input_fields[i];
651 op_field = &op->input_fields[i];
652 goto found;
653 }
654 }
655 is_input = false;

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

1493 CeedVector vec = sub_operators[i]->output_fields[j]->vec;
1494
1495 if (vec != CEED_VECTOR_ACTIVE && vec != CEED_VECTOR_NONE) {
1496 CeedCall(CeedVectorSetValue(vec, 0.0));
1497 }
1498 }
1499 }
1500 // Apply
648 for (CeedInt i = 0; i < op->qf->num_input_fields; i++) {
649 if (!strcmp(field_name, (*op->qf->input_fields[i]).field_name)) {
650 qf_field = op->qf->input_fields[i];
651 op_field = &op->input_fields[i];
652 goto found;
653 }
654 }
655 is_input = false;

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

1493 CeedVector vec = sub_operators[i]->output_fields[j]->vec;
1494
1495 if (vec != CEED_VECTOR_ACTIVE && vec != CEED_VECTOR_NONE) {
1496 CeedCall(CeedVectorSetValue(vec, 0.0));
1497 }
1498 }
1499 }
1500 // Apply
1501 for (CeedInt i = 0; i < op->num_suboperators; i++) {
1502 CeedCall(CeedOperatorApplyAdd(op->sub_operators[i], in, out, request));
1501 for (CeedInt i = 0; i < num_suboperators; i++) {
1502 CeedCall(CeedOperatorApplyAdd(sub_operators[i], in, out, request));
1503 }
1504 }
1505 } else {
1506 // Standard Operator
1507 if (op->Apply) {
1508 CeedCall(op->Apply(op, in, out, request));
1509 } else {
1510 // Zero all output vectors

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

1579 if ((*op)->Destroy) CeedCall((*op)->Destroy(*op));
1580 CeedCall(CeedDestroy(&(*op)->ceed));
1581 // Free fields
1582 for (CeedInt i = 0; i < (*op)->num_fields; i++) {
1583 if ((*op)->input_fields[i]) {
1584 if ((*op)->input_fields[i]->elem_rstr != CEED_ELEMRESTRICTION_NONE) {
1585 CeedCall(CeedElemRestrictionDestroy(&(*op)->input_fields[i]->elem_rstr));
1586 }
1503 }
1504 }
1505 } else {
1506 // Standard Operator
1507 if (op->Apply) {
1508 CeedCall(op->Apply(op, in, out, request));
1509 } else {
1510 // Zero all output vectors

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

1579 if ((*op)->Destroy) CeedCall((*op)->Destroy(*op));
1580 CeedCall(CeedDestroy(&(*op)->ceed));
1581 // Free fields
1582 for (CeedInt i = 0; i < (*op)->num_fields; i++) {
1583 if ((*op)->input_fields[i]) {
1584 if ((*op)->input_fields[i]->elem_rstr != CEED_ELEMRESTRICTION_NONE) {
1585 CeedCall(CeedElemRestrictionDestroy(&(*op)->input_fields[i]->elem_rstr));
1586 }
1587 if ((*op)->input_fields[i]->basis != CEED_BASIS_NONE) {
1587 if ((*op)->input_fields[i]->basis != CEED_BASIS_COLLOCATED) {
1588 CeedCall(CeedBasisDestroy(&(*op)->input_fields[i]->basis));
1589 }
1590 if ((*op)->input_fields[i]->vec != CEED_VECTOR_ACTIVE && (*op)->input_fields[i]->vec != CEED_VECTOR_NONE) {
1591 CeedCall(CeedVectorDestroy(&(*op)->input_fields[i]->vec));
1592 }
1593 CeedCall(CeedFree(&(*op)->input_fields[i]->field_name));
1594 CeedCall(CeedFree(&(*op)->input_fields[i]));
1595 }
1596 }
1597 for (CeedInt i = 0; i < (*op)->num_fields; i++) {
1598 if ((*op)->output_fields[i]) {
1599 CeedCall(CeedElemRestrictionDestroy(&(*op)->output_fields[i]->elem_rstr));
1588 CeedCall(CeedBasisDestroy(&(*op)->input_fields[i]->basis));
1589 }
1590 if ((*op)->input_fields[i]->vec != CEED_VECTOR_ACTIVE && (*op)->input_fields[i]->vec != CEED_VECTOR_NONE) {
1591 CeedCall(CeedVectorDestroy(&(*op)->input_fields[i]->vec));
1592 }
1593 CeedCall(CeedFree(&(*op)->input_fields[i]->field_name));
1594 CeedCall(CeedFree(&(*op)->input_fields[i]));
1595 }
1596 }
1597 for (CeedInt i = 0; i < (*op)->num_fields; i++) {
1598 if ((*op)->output_fields[i]) {
1599 CeedCall(CeedElemRestrictionDestroy(&(*op)->output_fields[i]->elem_rstr));
1600 if ((*op)->output_fields[i]->basis != CEED_BASIS_NONE) {
1600 if ((*op)->output_fields[i]->basis != CEED_BASIS_COLLOCATED) {
1601 CeedCall(CeedBasisDestroy(&(*op)->output_fields[i]->basis));
1602 }
1603 if ((*op)->output_fields[i]->vec != CEED_VECTOR_ACTIVE && (*op)->output_fields[i]->vec != CEED_VECTOR_NONE) {
1604 CeedCall(CeedVectorDestroy(&(*op)->output_fields[i]->vec));
1605 }
1606 CeedCall(CeedFree(&(*op)->output_fields[i]->field_name));
1607 CeedCall(CeedFree(&(*op)->output_fields[i]));
1608 }

--- 35 unchanged lines hidden ---
1601 CeedCall(CeedBasisDestroy(&(*op)->output_fields[i]->basis));
1602 }
1603 if ((*op)->output_fields[i]->vec != CEED_VECTOR_ACTIVE && (*op)->output_fields[i]->vec != CEED_VECTOR_NONE) {
1604 CeedCall(CeedVectorDestroy(&(*op)->output_fields[i]->vec));
1605 }
1606 CeedCall(CeedFree(&(*op)->output_fields[i]->field_name));
1607 CeedCall(CeedFree(&(*op)->output_fields[i]));
1608 }

--- 35 unchanged lines hidden ---