diff --git a/include/ceed-impl.h b/include/ceed-impl.h index 0fa7de80d2..311d0c1bba 100644 --- a/include/ceed-impl.h +++ b/include/ceed-impl.h @@ -368,6 +368,7 @@ struct CeedOperator_private { CeedOperatorField *input_fields; CeedOperatorField *output_fields; CeedSize input_size, output_size; + CeedInt num_tabs; /* Viewing offset */ CeedInt num_elem; /* Number of elements */ CeedInt num_qpts; /* Number of quadrature points over all elements */ CeedInt num_fields; /* Number of fields that have been set */ diff --git a/include/ceed/backend.h b/include/ceed/backend.h index 6bf1ba3bb6..ec4534b298 100644 --- a/include/ceed/backend.h +++ b/include/ceed/backend.h @@ -446,6 +446,7 @@ CEED_EXTERN int CeedOperatorAssemblyDataGetElemRestrictions(CeedOperatorAssembly CeedElemRestriction **active_elem_rstrs_out); CEED_EXTERN int CeedOperatorAssemblyDataDestroy(CeedOperatorAssemblyData *data); +CEED_EXTERN int CeedOperatorGetNumViewTabs(CeedOperator op, CeedInt *num_tabs); CEED_EXTERN int CeedOperatorGetActiveBasis(CeedOperator op, CeedBasis *active_basis); CEED_EXTERN int CeedOperatorGetActiveBases(CeedOperator op, CeedBasis *active_input_basis, CeedBasis *active_output_basis); CEED_EXTERN int CeedOperatorGetActiveElemRestriction(CeedOperator op, CeedElemRestriction *active_rstr); diff --git a/include/ceed/ceed.h b/include/ceed/ceed.h index f0207d6abf..a4ed4a9006 100644 --- a/include/ceed/ceed.h +++ b/include/ceed/ceed.h @@ -453,6 +453,7 @@ CEED_EXTERN int CeedOperatorMultigridLevelCreateH1(CeedOperator op_fine, CeedVe CEED_EXTERN int CeedOperatorCreateFDMElementInverse(CeedOperator op, CeedOperator *fdm_inv, CeedRequest *request); CEED_EXTERN int CeedOperatorSetName(CeedOperator op, const char *name); CEED_EXTERN int CeedOperatorGetName(CeedOperator op, const char **name); +CEED_EXTERN int CeedOperatorSetNumViewTabs(CeedOperator op, CeedInt num_tabs); CEED_EXTERN int CeedOperatorView(CeedOperator op, FILE *stream); CEED_EXTERN int CeedOperatorViewTerse(CeedOperator op, FILE *stream); CEED_EXTERN int CeedOperatorGetCeed(CeedOperator op, Ceed *ceed); diff --git a/interface/ceed-fortran.c b/interface/ceed-fortran.c index e62cb30360..5da94e1b02 100644 --- a/interface/ceed-fortran.c +++ b/interface/ceed-fortran.c @@ -1019,6 +1019,13 @@ CEED_EXTERN void fCeedOperatorSetName(int *op, const char *name, int *err, fortr *err = CeedOperatorSetName(op_, name_c); } +#define fCeedOperatorSetNumViewTabs FORTRAN_NAME(ceedoperatorsetnumviewtabs, CEEDOPERATORSETNUMVIEWTABS) +CEED_EXTERN void fCeedOperatorSetNumViewTabs(int *op, int *ntabs, int *err) { + CeedOperator op_ = CeedOperator_dict[*op]; + + *err = CeedOperatorSetNumViewTabs(op_, *ntabs); +} + #define fCeedOperatorLinearAssembleQFunction FORTRAN_NAME(ceedoperatorlinearassembleqfunction, CEEDOPERATORLINEARASSEMBLEQFUNCTION) CEED_EXTERN void fCeedOperatorLinearAssembleQFunction(int *op, int *assembledvec, int *assembledrstr, int *rqst, int *err) { // Vector diff --git a/interface/ceed-operator.c b/interface/ceed-operator.c index 3a0a0ddfe7..907b4e8a8b 100644 --- a/interface/ceed-operator.c +++ b/interface/ceed-operator.c @@ -87,17 +87,17 @@ static int CeedOperatorCheckField(Ceed ceed, CeedQFunctionField qf_field, CeedEl @param[in] op_field `CeedOperator` Field to view @param[in] qf_field `CeedQFunction` Field (carries field name) @param[in] field_number Number of field being viewed - @param[in] sub true indicates sub-operator, which increases indentation; false for top-level operator - @param[in] input true for an input field; false for output field + @param[in] tabs Tabs to append before each line + @param[in] is_input `true` for an input field; `false` for output field @param[in] stream Stream to view to, e.g., `stdout` @return An error code: 0 - success, otherwise - failure @ref Utility **/ -static int CeedOperatorFieldView(CeedOperatorField op_field, CeedQFunctionField qf_field, CeedInt field_number, bool sub, bool input, FILE *stream) { - const char *pre = sub ? " " : ""; - const char *in_out = input ? "Input" : "Output"; +static int CeedOperatorFieldView(CeedOperatorField op_field, CeedQFunctionField qf_field, CeedInt field_number, const char *tabs, bool is_input, + FILE *stream) { + const char *field_type = is_input ? "Input" : "Output"; const char *field_name; CeedInt size; CeedEvalMode eval_mode; @@ -112,12 +112,12 @@ static int CeedOperatorFieldView(CeedOperatorField op_field, CeedQFunctionField "%s %s field %" CeedInt_FMT ":\n" "%s Name: \"%s\"\n", - pre, in_out, field_number, pre, field_name); - fprintf(stream, "%s Size: %" CeedInt_FMT "\n", pre, size); - fprintf(stream, "%s EvalMode: %s\n", pre, CeedEvalModes[eval_mode]); - if (basis == CEED_BASIS_NONE) fprintf(stream, "%s No basis\n", pre); - if (vec == CEED_VECTOR_ACTIVE) fprintf(stream, "%s Active vector\n", pre); - else if (vec == CEED_VECTOR_NONE) fprintf(stream, "%s No vector\n", pre); + tabs, field_type, field_number, tabs, field_name); + fprintf(stream, "%s Size: %" CeedInt_FMT "\n", tabs, size); + fprintf(stream, "%s EvalMode: %s\n", tabs, CeedEvalModes[eval_mode]); + if (basis == CEED_BASIS_NONE) fprintf(stream, "%s No basis\n", tabs); + if (vec == CEED_VECTOR_ACTIVE) fprintf(stream, "%s Active vector\n", tabs); + else if (vec == CEED_VECTOR_NONE) fprintf(stream, "%s No vector\n", tabs); CeedCall(CeedVectorDestroy(&vec)); CeedCall(CeedBasisDestroy(&basis)); @@ -128,16 +128,15 @@ static int CeedOperatorFieldView(CeedOperatorField op_field, CeedQFunctionField @brief View a single `CeedOperator` @param[in] op `CeedOperator` to view - @param[in] sub Boolean flag for sub-operator + @param[in] tabs Tabs to append before each new line @param[in] stream Stream to write; typically `stdout` or a file @return Error code: 0 - success, otherwise - failure @ref Utility **/ -int CeedOperatorSingleView(CeedOperator op, bool sub, FILE *stream) { +int CeedOperatorSingleView(CeedOperator op, const char *tabs, FILE *stream) { bool is_at_points; - const char *pre = sub ? " " : ""; CeedInt num_elem, num_qpts, total_fields = 0, num_input_fields, num_output_fields; CeedQFunction qf; CeedQFunctionField *qf_input_fields, *qf_output_fields; @@ -158,23 +157,38 @@ int CeedOperatorSingleView(CeedOperator op, bool sub, FILE *stream) { CeedCall(CeedOperatorAtPointsGetPoints(op, &rstr_points, NULL)); CeedCall(CeedElemRestrictionGetMaxPointsInElement(rstr_points, &max_points)); - fprintf(stream, "%s %" CeedInt_FMT " elements with %" CeedInt_FMT " max points each\n", pre, num_elem, max_points); + fprintf(stream, "%s %" CeedInt_FMT " elements with %" CeedInt_FMT " max points each\n", tabs, num_elem, max_points); CeedCall(CeedElemRestrictionDestroy(&rstr_points)); } else { - fprintf(stream, "%s %" CeedInt_FMT " elements with %" CeedInt_FMT " quadrature points each\n", pre, num_elem, num_qpts); + fprintf(stream, "%s %" CeedInt_FMT " elements with %" CeedInt_FMT " quadrature points each\n", tabs, num_elem, num_qpts); } - fprintf(stream, "%s %" CeedInt_FMT " field%s\n", pre, total_fields, total_fields > 1 ? "s" : ""); - fprintf(stream, "%s %" CeedInt_FMT " input field%s:\n", pre, num_input_fields, num_input_fields > 1 ? "s" : ""); + fprintf(stream, "%s %" CeedInt_FMT " field%s\n", tabs, total_fields, total_fields > 1 ? "s" : ""); + fprintf(stream, "%s %" CeedInt_FMT " input field%s:\n", tabs, num_input_fields, num_input_fields > 1 ? "s" : ""); for (CeedInt i = 0; i < num_input_fields; i++) { - CeedCall(CeedOperatorFieldView(op_input_fields[i], qf_input_fields[i], i, sub, 1, stream)); + CeedCall(CeedOperatorFieldView(op_input_fields[i], qf_input_fields[i], i, tabs, 1, stream)); } - fprintf(stream, "%s %" CeedInt_FMT " output field%s:\n", pre, num_output_fields, num_output_fields > 1 ? "s" : ""); + fprintf(stream, "%s %" CeedInt_FMT " output field%s:\n", tabs, num_output_fields, num_output_fields > 1 ? "s" : ""); for (CeedInt i = 0; i < num_output_fields; i++) { - CeedCall(CeedOperatorFieldView(op_output_fields[i], qf_output_fields[i], i, sub, 0, stream)); + CeedCall(CeedOperatorFieldView(op_output_fields[i], qf_output_fields[i], i, tabs, 0, stream)); } return CEED_ERROR_SUCCESS; } +/** + @brief Get the number of tabs to indent for @ref CeedOperatorView() output + + @param[in] op `CeedOperator` to get the number of view tabs + @param[out] num_tabs Number of view tabs + + @return Error code: 0 - success, otherwise - failure + + @ref User +**/ +int CeedOperatorGetNumViewTabs(CeedOperator op, CeedInt *num_tabs) { + *num_tabs = op->num_tabs; + return CEED_ERROR_SUCCESS; +} + /** @brief Find the active input vector `CeedBasis` for a non-composite `CeedOperator`. @@ -1588,31 +1602,58 @@ int CeedOperatorGetName(CeedOperator op, const char **name) { @ref Developer **/ static int CeedOperatorView_Core(CeedOperator op, FILE *stream, bool is_full) { - bool has_name, is_composite, is_at_points; - const char *name = NULL; + bool has_name, is_composite, is_at_points; + char *tabs = NULL; + const char *name = NULL; + const CeedInt tab_width = 2; + CeedInt num_tabs = 0; CeedCall(CeedOperatorGetName(op, &name)); has_name = name ? strlen(name) : false; CeedCall(CeedOperatorIsComposite(op, &is_composite)); CeedCall(CeedOperatorIsAtPoints(op, &is_at_points)); + // Set tabs + CeedCall(CeedOperatorGetNumViewTabs(op, &num_tabs)); + CeedCall(CeedCalloc(tab_width * (num_tabs + is_composite) + 1, &tabs)); + for (CeedInt i = 0; i < tab_width * num_tabs; i++) tabs[i] = ' '; if (is_composite) { CeedInt num_suboperators; CeedOperator *sub_operators; CeedCall(CeedOperatorCompositeGetNumSub(op, &num_suboperators)); CeedCall(CeedOperatorCompositeGetSubList(op, &sub_operators)); + fprintf(stream, tabs); fprintf(stream, "Composite CeedOperator%s%s\n", has_name ? " - " : "", has_name ? name : ""); - + for (CeedInt i = 0; i < tab_width; i++) tabs[tab_width * num_tabs + i] = ' '; for (CeedInt i = 0; i < num_suboperators; i++) { has_name = sub_operators[i]->name; - fprintf(stream, " SubOperator%s %" CeedInt_FMT "%s%s%s\n", is_at_points ? " AtPoints" : "", i, has_name ? " - " : "", + fprintf(stream, tabs); + fprintf(stream, "SubOperator%s %" CeedInt_FMT "%s%s%s\n", is_at_points ? " AtPoints" : "", i, has_name ? " - " : "", has_name ? sub_operators[i]->name : "", is_full ? ":" : ""); - if (is_full) CeedCall(CeedOperatorSingleView(sub_operators[i], 1, stream)); + if (is_full) CeedCall(CeedOperatorSingleView(sub_operators[i], tabs, stream)); } } else { + fprintf(stream, tabs); fprintf(stream, "CeedOperator%s%s%s\n", is_at_points ? " AtPoints" : "", has_name ? " - " : "", has_name ? name : ""); - if (is_full) CeedCall(CeedOperatorSingleView(op, 0, stream)); + if (is_full) CeedCall(CeedOperatorSingleView(op, tabs, stream)); } + CeedCall(CeedFree(&tabs)); + return CEED_ERROR_SUCCESS; +} + +/** + @brief Set the number of tabs to indent for @ref CeedOperatorView() output + + @param[in] op `CeedOperator` to set the number of view tabs + @param[in] num_tabs Number of view tabs to set + + @return Error code: 0 - success, otherwise - failure + + @ref User +**/ +int CeedOperatorSetNumViewTabs(CeedOperator op, CeedInt num_tabs) { + CeedCheck(num_tabs >= 0, CeedOperatorReturnCeed(op), CEED_ERROR_MINOR, "Number of view tabs must be non-negative"); + op->num_tabs = num_tabs; return CEED_ERROR_SUCCESS; } diff --git a/tests/output/t504-operator-f.out b/tests/output/t504-operator-f.out index 41b0ea772b..3b5857619f 100644 --- a/tests/output/t504-operator-f.out +++ b/tests/output/t504-operator-f.out @@ -19,23 +19,23 @@ CeedOperator - setup EvalMode: none No basis Active vector -CeedOperator - mass - 15 elements with 8 quadrature points each - 3 fields - 2 input fields: - Input field 0: - Name: "rho" - Size: 1 - EvalMode: none - No basis - Input field 1: - Name: "u" - Size: 2 - EvalMode: interpolation - Active vector - 1 output field: - Output field 0: - Name: "v" - Size: 2 - EvalMode: interpolation - Active vector + CeedOperator - mass + 15 elements with 8 quadrature points each + 3 fields + 2 input fields: + Input field 0: + Name: "rho" + Size: 1 + EvalMode: none + No basis + Input field 1: + Name: "u" + Size: 2 + EvalMode: interpolation + Active vector + 1 output field: + Output field 0: + Name: "v" + Size: 2 + EvalMode: interpolation + Active vector diff --git a/tests/output/t504-operator.out b/tests/output/t504-operator.out index 3f1a31a7d4..4f23570743 100644 --- a/tests/output/t504-operator.out +++ b/tests/output/t504-operator.out @@ -20,24 +20,24 @@ CeedOperator - setup EvalMode: none No basis Active vector -CeedOperator - mass -CeedOperator - mass - 15 elements with 8 quadrature points each - 3 fields - 2 input fields: - Input field 0: - Name: "rho" - Size: 1 - EvalMode: none - No basis - Input field 1: - Name: "u" - Size: 2 - EvalMode: interpolation - Active vector - 1 output field: - Output field 0: - Name: "v" - Size: 2 - EvalMode: interpolation - Active vector + CeedOperator - mass + CeedOperator - mass + 15 elements with 8 quadrature points each + 3 fields + 2 input fields: + Input field 0: + Name: "rho" + Size: 1 + EvalMode: none + No basis + Input field 1: + Name: "u" + Size: 2 + EvalMode: interpolation + Active vector + 1 output field: + Output field 0: + Name: "v" + Size: 2 + EvalMode: interpolation + Active vector diff --git a/tests/output/t523-operator-f.out b/tests/output/t523-operator-f.out index 1817a8a2cf..2a17d484bb 100644 --- a/tests/output/t523-operator-f.out +++ b/tests/output/t523-operator-f.out @@ -39,44 +39,44 @@ Composite CeedOperator - setup Size: 1 EvalMode: none No basis -Composite CeedOperator - mass - SubOperator 0 - triangle elements: - 6 elements with 4 quadrature points each - 3 fields - 2 input fields: - Input field 0: - Name: "rho" - Size: 1 - EvalMode: none - No basis - Input field 1: - Name: "u" - Size: 1 - EvalMode: interpolation - Active vector - 1 output field: - Output field 0: - Name: "v" - Size: 1 - EvalMode: interpolation - Active vector - SubOperator 1 - quadrilateral elements: - 6 elements with 16 quadrature points each - 3 fields - 2 input fields: - Input field 0: - Name: "rho" - Size: 1 - EvalMode: none - No basis - Input field 1: - Name: "u" - Size: 1 - EvalMode: interpolation - Active vector - 1 output field: - Output field 0: - Name: "v" - Size: 1 - EvalMode: interpolation - Active vector + Composite CeedOperator - mass + SubOperator 0 - triangle elements: + 6 elements with 4 quadrature points each + 3 fields + 2 input fields: + Input field 0: + Name: "rho" + Size: 1 + EvalMode: none + No basis + Input field 1: + Name: "u" + Size: 1 + EvalMode: interpolation + Active vector + 1 output field: + Output field 0: + Name: "v" + Size: 1 + EvalMode: interpolation + Active vector + SubOperator 1 - quadrilateral elements: + 6 elements with 16 quadrature points each + 3 fields + 2 input fields: + Input field 0: + Name: "rho" + Size: 1 + EvalMode: none + No basis + Input field 1: + Name: "u" + Size: 1 + EvalMode: interpolation + Active vector + 1 output field: + Output field 0: + Name: "v" + Size: 1 + EvalMode: interpolation + Active vector diff --git a/tests/output/t523-operator.out b/tests/output/t523-operator.out index 87d61f5b0a..742f6954a7 100644 --- a/tests/output/t523-operator.out +++ b/tests/output/t523-operator.out @@ -42,47 +42,47 @@ Composite CeedOperator - setup Size: 1 EvalMode: none No basis -Composite CeedOperator - mass - SubOperator 0 - triangle elements - SubOperator 1 - quadrilateral elements -Composite CeedOperator - mass - SubOperator 0 - triangle elements: - 6 elements with 4 quadrature points each - 3 fields - 2 input fields: - Input field 0: - Name: "rho" - Size: 1 - EvalMode: none - No basis - Input field 1: - Name: "u" - Size: 1 - EvalMode: interpolation - Active vector - 1 output field: - Output field 0: - Name: "v" - Size: 1 - EvalMode: interpolation - Active vector - SubOperator 1 - quadrilateral elements: - 6 elements with 16 quadrature points each - 3 fields - 2 input fields: - Input field 0: - Name: "rho" - Size: 1 - EvalMode: none - No basis - Input field 1: - Name: "u" - Size: 1 - EvalMode: interpolation - Active vector - 1 output field: - Output field 0: - Name: "v" - Size: 1 - EvalMode: interpolation - Active vector + Composite CeedOperator - mass + SubOperator 0 - triangle elements + SubOperator 1 - quadrilateral elements + Composite CeedOperator - mass + SubOperator 0 - triangle elements: + 6 elements with 4 quadrature points each + 3 fields + 2 input fields: + Input field 0: + Name: "rho" + Size: 1 + EvalMode: none + No basis + Input field 1: + Name: "u" + Size: 1 + EvalMode: interpolation + Active vector + 1 output field: + Output field 0: + Name: "v" + Size: 1 + EvalMode: interpolation + Active vector + SubOperator 1 - quadrilateral elements: + 6 elements with 16 quadrature points each + 3 fields + 2 input fields: + Input field 0: + Name: "rho" + Size: 1 + EvalMode: none + No basis + Input field 1: + Name: "u" + Size: 1 + EvalMode: interpolation + Active vector + 1 output field: + Output field 0: + Name: "v" + Size: 1 + EvalMode: interpolation + Active vector diff --git a/tests/t504-operator-f.f90 b/tests/t504-operator-f.f90 index 5e555d5c13..beedfda264 100644 --- a/tests/t504-operator-f.f90 +++ b/tests/t504-operator-f.f90 @@ -95,6 +95,7 @@ program test call ceedoperatorsetname(op_setup,'setup',err) call ceedoperatorview(op_setup,err) call ceedoperatorsetname(op_mass,'mass',err) + call ceedoperatorsetnumviewtabs(op_mass,1,err) call ceedoperatorview(op_mass,err) call ceedvectordestroy(qdata,err) diff --git a/tests/t504-operator.c b/tests/t504-operator.c index 4d75c79b0c..d7046ab08d 100644 --- a/tests/t504-operator.c +++ b/tests/t504-operator.c @@ -70,6 +70,7 @@ int main(int argc, char **argv) { CeedOperatorViewTerse(op_setup, stdout); CeedOperatorView(op_setup, stdout); CeedOperatorSetName(op_mass, "mass"); + CeedOperatorSetNumViewTabs(op_mass, 1); CeedOperatorViewTerse(op_mass, stdout); CeedOperatorView(op_mass, stdout); diff --git a/tests/t523-operator-f.f90 b/tests/t523-operator-f.f90 index ea20128d3c..fcd4504fe5 100644 --- a/tests/t523-operator-f.f90 +++ b/tests/t523-operator-f.f90 @@ -212,6 +212,7 @@ program test call ceedoperatorcreatecomposite(ceed,op_mass,err) call ceedoperatorsetname(op_mass,'mass',err) + call ceedoperatorsetnumviewtabs(op_mass,1,err) call ceedoperatorcompositeaddsub(op_mass,op_masstet,err) call ceedoperatorcompositeaddsub(op_mass,op_masshex,err) diff --git a/tests/t523-operator.c b/tests/t523-operator.c index 2e9dd5c264..a1e2307839 100644 --- a/tests/t523-operator.c +++ b/tests/t523-operator.c @@ -166,6 +166,7 @@ int main(int argc, char **argv) { // View CeedOperatorViewTerse(op_setup, stdout); CeedOperatorView(op_setup, stdout); + CeedOperatorSetNumViewTabs(op_mass, 1); CeedOperatorViewTerse(op_mass, stdout); CeedOperatorView(op_mass, stdout);