Skip to content

Commit

Permalink
Merge pull request #4032 from mfem/sjg/ceed-chk-fix
Browse files Browse the repository at this point in the history
Fix libCEED compilation after `CeedChk` removal
  • Loading branch information
pazner committed Dec 21, 2023
2 parents 38c27df + 59fd822 commit 79b6098
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 164 deletions.
4 changes: 4 additions & 0 deletions fem/ceed/interface/ceed.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
#ifndef MFEM_LIBCEED_CEED
#define MFEM_LIBCEED_CEED

#include "../../../config/config.hpp"

#ifdef MFEM_USE_CEED

#include <ceed.h>

#if !CEED_VERSION_GE(0,12,0)
#error MFEM requires a libCEED version >= 0.12.0
#endif
Expand Down
18 changes: 9 additions & 9 deletions fem/ceed/interface/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,45 +132,45 @@ int CeedOperatorGetActiveField(CeedOperator oper, CeedOperatorField *field)
{
int ierr;
Ceed ceed;
ierr = CeedOperatorGetCeed(oper, &ceed); CeedChk(ierr);
ierr = CeedOperatorGetCeed(oper, &ceed); PCeedChk(ierr);

CeedQFunction qf;
bool isComposite;
ierr = CeedOperatorIsComposite(oper, &isComposite); CeedChk(ierr);
ierr = CeedOperatorIsComposite(oper, &isComposite); PCeedChk(ierr);
CeedOperator *subops;
if (isComposite)
{
#if CEED_VERSION_GE(0, 10, 2)
ierr = CeedCompositeOperatorGetSubList(oper, &subops); CeedChk(ierr);
ierr = CeedCompositeOperatorGetSubList(oper, &subops); PCeedChk(ierr);
#else
ierr = CeedOperatorGetSubList(oper, &subops); CeedChk(ierr);
ierr = CeedOperatorGetSubList(oper, &subops); PCeedChk(ierr);
#endif
ierr = CeedOperatorGetQFunction(subops[0], &qf); CeedChk(ierr);
ierr = CeedOperatorGetQFunction(subops[0], &qf); PCeedChk(ierr);
}
else
{
ierr = CeedOperatorGetQFunction(oper, &qf); CeedChk(ierr);
ierr = CeedOperatorGetQFunction(oper, &qf); PCeedChk(ierr);
}
CeedInt numinputfields, numoutputfields;
ierr = CeedQFunctionGetNumArgs(qf, &numinputfields, &numoutputfields);
CeedOperatorField *inputfields;
if (isComposite)
{
ierr = CeedOperatorGetFields(subops[0], &numinputfields, &inputfields,
&numoutputfields, NULL); CeedChk(ierr);
&numoutputfields, NULL); PCeedChk(ierr);
}
else
{
ierr = CeedOperatorGetFields(oper, &numinputfields, &inputfields,
&numoutputfields, NULL); CeedChk(ierr);
&numoutputfields, NULL); PCeedChk(ierr);
}

CeedVector if_vector;
bool found = false;
int found_index = -1;
for (int i = 0; i < numinputfields; ++i)
{
ierr = CeedOperatorFieldGetVector(inputfields[i], &if_vector); CeedChk(ierr);
ierr = CeedOperatorFieldGetVector(inputfields[i], &if_vector); PCeedChk(ierr);
if (if_vector == CEED_VECTOR_ACTIVE)
{
if (found)
Expand Down
5 changes: 5 additions & 0 deletions fem/ceed/interface/util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@
#define MFEM_LIBCEED_UTIL

#include "../../../config/config.hpp"
#include "../../../general/error.hpp"

#include <functional>
#include <string>
#include <tuple>
#include <unordered_map>

#include "ceed.hpp"

#ifdef MFEM_USE_CEED
#include <ceed/backend.h> // for CeedOperatorField
#endif
Expand Down Expand Up @@ -170,10 +173,12 @@ namespace internal
{

#ifdef MFEM_USE_CEED

/** @warning These maps have a tendency to create bugs when adding new "types"
of CeedBasis and CeedElemRestriction. */
extern ceed::BasisMap ceed_basis_map;
extern ceed::RestrMap ceed_restr_map;

#endif

} // namespace internal
Expand Down
71 changes: 36 additions & 35 deletions fem/ceed/solvers/algebraic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ int CeedOperatorGetSize(CeedOperator oper, CeedInt * size)
{
CeedSize in_len, out_len;
int ierr = CeedOperatorGetActiveVectorLengths(oper, &in_len, &out_len);
CeedChk(ierr);
PCeedChk(ierr);
*size = (CeedInt)in_len;
MFEM_VERIFY(in_len == out_len, "not a square CeedOperator");
MFEM_VERIFY(in_len == *size, "size overflow");
Expand Down Expand Up @@ -378,67 +378,68 @@ int AlgebraicInterpolation::Initialize(

CeedSize height, width;
ierr = CeedElemRestrictionGetLVectorSize(erestrictu_coarse, &width);
CeedChk(ierr);
PCeedChk(ierr);
ierr = CeedElemRestrictionGetLVectorSize(erestrictu_fine, &height);
CeedChk(ierr);
PCeedChk(ierr);

// interpolation qfunction
const int bp3_ncompu = 1;
CeedQFunction l_qf_restrict, l_qf_prolong;
ierr = CeedQFunctionCreateIdentity(ceed, bp3_ncompu, CEED_EVAL_NONE,
CEED_EVAL_INTERP, &l_qf_restrict); CeedChk(ierr);
CEED_EVAL_INTERP, &l_qf_restrict); PCeedChk(ierr);
ierr = CeedQFunctionCreateIdentity(ceed, bp3_ncompu, CEED_EVAL_INTERP,
CEED_EVAL_NONE, &l_qf_prolong); CeedChk(ierr);
CEED_EVAL_NONE, &l_qf_prolong); PCeedChk(ierr);

qf_restrict = l_qf_restrict;
qf_prolong = l_qf_prolong;

CeedVector c_fine_multiplicity;
ierr = CeedVectorCreate(ceed, height, &c_fine_multiplicity); CeedChk(ierr);
ierr = CeedVectorSetValue(c_fine_multiplicity, 0.0); CeedChk(ierr);
ierr = CeedVectorCreate(ceed, height, &c_fine_multiplicity); PCeedChk(ierr);
ierr = CeedVectorSetValue(c_fine_multiplicity, 0.0); PCeedChk(ierr);

// Create the restriction operator
// Restriction - Fine to coarse
ierr = CeedOperatorCreate(ceed, qf_restrict, CEED_QFUNCTION_NONE,
CEED_QFUNCTION_NONE, &op_restrict); CeedChk(ierr);
CEED_QFUNCTION_NONE, &op_restrict); PCeedChk(ierr);
ierr = CeedOperatorSetField(op_restrict, "input", erestrictu_fine,
CEED_BASIS_NONE, CEED_VECTOR_ACTIVE); CeedChk(ierr);
CEED_BASIS_NONE, CEED_VECTOR_ACTIVE); PCeedChk(ierr);
ierr = CeedOperatorSetField(op_restrict, "output", erestrictu_coarse,
basisctof, CEED_VECTOR_ACTIVE); CeedChk(ierr);
basisctof, CEED_VECTOR_ACTIVE); PCeedChk(ierr);

// Interpolation - Coarse to fine
// Create the prolongation operator
ierr = CeedOperatorCreate(ceed, qf_prolong, CEED_QFUNCTION_NONE,
CEED_QFUNCTION_NONE, &op_interp); CeedChk(ierr);
CEED_QFUNCTION_NONE, &op_interp); PCeedChk(ierr);
ierr = CeedOperatorSetField(op_interp, "input", erestrictu_coarse,
basisctof, CEED_VECTOR_ACTIVE); CeedChk(ierr);
basisctof, CEED_VECTOR_ACTIVE); PCeedChk(ierr);
ierr = CeedOperatorSetField(op_interp, "output", erestrictu_fine,
CEED_BASIS_NONE, CEED_VECTOR_ACTIVE); CeedChk(ierr);
CEED_BASIS_NONE, CEED_VECTOR_ACTIVE); PCeedChk(ierr);

ierr = CeedElemRestrictionGetMultiplicity(erestrictu_fine,
c_fine_multiplicity); CeedChk(ierr);
ierr = CeedVectorCreate(ceed, height, &fine_multiplicity_r); CeedChk(ierr);
c_fine_multiplicity); PCeedChk(ierr);
ierr = CeedVectorCreate(ceed, height, &fine_multiplicity_r); PCeedChk(ierr);

CeedScalar* fine_r_data;
const CeedScalar* fine_data;
ierr = CeedVectorGetArrayWrite(fine_multiplicity_r, CEED_MEM_HOST,
&fine_r_data); CeedChk(ierr);
&fine_r_data); PCeedChk(ierr);
ierr = CeedVectorGetArrayRead(c_fine_multiplicity, CEED_MEM_HOST,
&fine_data); CeedChk(ierr);
&fine_data); PCeedChk(ierr);
for (CeedSize i = 0; i < height; ++i)
{
fine_r_data[i] = 1.0 / fine_data[i];
}

ierr = CeedVectorRestoreArray(fine_multiplicity_r, &fine_r_data); CeedChk(ierr);
ierr = CeedVectorRestoreArray(fine_multiplicity_r, &fine_r_data);
PCeedChk(ierr);
ierr = CeedVectorRestoreArrayRead(c_fine_multiplicity, &fine_data);
CeedChk(ierr);
ierr = CeedVectorDestroy(&c_fine_multiplicity); CeedChk(ierr);
PCeedChk(ierr);
ierr = CeedVectorDestroy(&c_fine_multiplicity); PCeedChk(ierr);

ierr = CeedVectorCreate(ceed, height, &fine_work); CeedChk(ierr);
ierr = CeedVectorCreate(ceed, height, &fine_work); PCeedChk(ierr);

ierr = CeedVectorCreate(ceed, height, &v_); CeedChk(ierr);
ierr = CeedVectorCreate(ceed, width, &u_); CeedChk(ierr);
ierr = CeedVectorCreate(ceed, height, &v_); PCeedChk(ierr);
ierr = CeedVectorCreate(ceed, width, &u_); PCeedChk(ierr);

return 0;
}
Expand All @@ -447,12 +448,12 @@ int AlgebraicInterpolation::Finalize()
{
int ierr;

ierr = CeedQFunctionDestroy(&qf_restrict); CeedChk(ierr);
ierr = CeedQFunctionDestroy(&qf_prolong); CeedChk(ierr);
ierr = CeedOperatorDestroy(&op_interp); CeedChk(ierr);
ierr = CeedOperatorDestroy(&op_restrict); CeedChk(ierr);
ierr = CeedVectorDestroy(&fine_multiplicity_r); CeedChk(ierr);
ierr = CeedVectorDestroy(&fine_work); CeedChk(ierr);
ierr = CeedQFunctionDestroy(&qf_restrict); PCeedChk(ierr);
ierr = CeedQFunctionDestroy(&qf_prolong); PCeedChk(ierr);
ierr = CeedOperatorDestroy(&op_interp); PCeedChk(ierr);
ierr = CeedOperatorDestroy(&op_restrict); PCeedChk(ierr);
ierr = CeedVectorDestroy(&fine_multiplicity_r); PCeedChk(ierr);
ierr = CeedVectorDestroy(&fine_work); PCeedChk(ierr);

return 0;
}
Expand Down Expand Up @@ -498,8 +499,8 @@ int CeedVectorPointwiseMult(CeedVector a, const CeedVector b)
CeedVectorGetCeed(a, &ceed);

CeedSize length, length2;
ierr = CeedVectorGetLength(a, &length); CeedChk(ierr);
ierr = CeedVectorGetLength(b, &length2); CeedChk(ierr);
ierr = CeedVectorGetLength(a, &length); PCeedChk(ierr);
ierr = CeedVectorGetLength(b, &length2); PCeedChk(ierr);
if (length != length2)
{
return CeedError(ceed, 1, "Vector sizes don't match");
Expand All @@ -516,14 +517,14 @@ int CeedVectorPointwiseMult(CeedVector a, const CeedVector b)
}
CeedScalar *a_data;
const CeedScalar *b_data;
ierr = CeedVectorGetArray(a, mem, &a_data); CeedChk(ierr);
ierr = CeedVectorGetArrayRead(b, mem, &b_data); CeedChk(ierr);
ierr = CeedVectorGetArray(a, mem, &a_data); PCeedChk(ierr);
ierr = CeedVectorGetArrayRead(b, mem, &b_data); PCeedChk(ierr);
MFEM_VERIFY(int(length) == length, "length overflow");
mfem::forall(length, [=] MFEM_HOST_DEVICE (int i)
{a_data[i] *= b_data[i];});

ierr = CeedVectorRestoreArray(a, &a_data); CeedChk(ierr);
ierr = CeedVectorRestoreArrayRead(b, &b_data); CeedChk(ierr);
ierr = CeedVectorRestoreArray(a, &a_data); PCeedChk(ierr);
ierr = CeedVectorRestoreArrayRead(b, &b_data); PCeedChk(ierr);

return 0;
}
Expand Down

0 comments on commit 79b6098

Please sign in to comment.