Skip to content

Commit fe329bd

Browse files
authored
Merge pull request #970 from CEED/jeremy/interface-audit
Audit object encapsulation
2 parents e3d63e5 + 21d1e94 commit fe329bd

File tree

8 files changed

+119
-92
lines changed

8 files changed

+119
-92
lines changed

include/ceed/backend.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ CEED_EXTERN int CeedOperatorGetActiveBasis(CeedOperator op,
119119
CEED_EXTERN int CeedOperatorGetActiveElemRestriction(CeedOperator op, CeedElemRestriction *active_rstr);
120120
CEED_EXTERN int CeedGetOperatorFallbackResource(Ceed ceed,
121121
const char **resource);
122+
CEED_EXTERN int CeedGetOperatorFallbackCeed(Ceed ceed, Ceed *fallback_ceed);
122123
CEED_EXTERN int CeedSetOperatorFallbackResource(Ceed ceed,
123124
const char *resource);
124125
CEED_EXTERN int CeedGetOperatorFallbackParentCeed(Ceed ceed, Ceed *parent);

interface/ceed-basis.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,12 @@ static int CeedGivensRotation(CeedScalar *A, CeedScalar c, CeedScalar s,
158158
**/
159159
static int CeedScalarView(const char *name, const char *fp_fmt, CeedInt m,
160160
CeedInt n, const CeedScalar *a, FILE *stream) {
161-
for (int i=0; i<m; i++) {
161+
for (CeedInt i=0; i<m; i++) {
162162
if (m > 1)
163163
fprintf(stream, "%12s[%d]:", name, i);
164164
else
165165
fprintf(stream, "%12s:", name);
166-
for (int j=0; j<n; j++)
166+
for (CeedInt j=0; j<n; j++)
167167
fprintf(stream, fp_fmt, fabs(a[i*n+j]) > 1E-14 ? a[i*n+j] : 0);
168168
fputs("\n", stream);
169169
}
@@ -1366,14 +1366,14 @@ int CeedGaussQuadrature(CeedInt Q, CeedScalar *q_ref_1d,
13661366
// Allocate
13671367
CeedScalar P0, P1, P2, dP2, xi, wi, PI = 4.0*atan(1.0);
13681368
// Build q_ref_1d, q_weight_1d
1369-
for (int i = 0; i <= Q/2; i++) {
1369+
for (CeedInt i = 0; i <= Q/2; i++) {
13701370
// Guess
13711371
xi = cos(PI*(CeedScalar)(2*i+1)/((CeedScalar)(2*Q)));
13721372
// Pn(xi)
13731373
P0 = 1.0;
13741374
P1 = xi;
13751375
P2 = 0.0;
1376-
for (int j = 2; j <= Q; j++) {
1376+
for (CeedInt j = 2; j <= Q; j++) {
13771377
P2 = (((CeedScalar)(2*j-1))*xi*P1-((CeedScalar)(j-1))*P0)/((CeedScalar)(j));
13781378
P0 = P1;
13791379
P1 = P2;
@@ -1382,10 +1382,10 @@ int CeedGaussQuadrature(CeedInt Q, CeedScalar *q_ref_1d,
13821382
dP2 = (xi*P2 - P0)*(CeedScalar)Q/(xi*xi-1.0);
13831383
xi = xi-P2/dP2;
13841384
// Newton to convergence
1385-
for (int k=0; k<100 && fabs(P2)>10*CEED_EPSILON; k++) {
1385+
for (CeedInt k=0; k<100 && fabs(P2)>10*CEED_EPSILON; k++) {
13861386
P0 = 1.0;
13871387
P1 = xi;
1388-
for (int j = 2; j <= Q; j++) {
1388+
for (CeedInt j = 2; j <= Q; j++) {
13891389
P2 = (((CeedScalar)(2*j-1))*xi*P1-((CeedScalar)(j-1))*P0)/((CeedScalar)(j));
13901390
P0 = P1;
13911391
P1 = P2;
@@ -1434,14 +1434,14 @@ int CeedLobattoQuadrature(CeedInt Q, CeedScalar *q_ref_1d,
14341434
q_ref_1d[0] = -1.0;
14351435
q_ref_1d[Q-1] = 1.0;
14361436
// Interior
1437-
for (int i = 1; i <= (Q-1)/2; i++) {
1437+
for (CeedInt i = 1; i <= (Q-1)/2; i++) {
14381438
// Guess
14391439
xi = cos(PI*(CeedScalar)(i)/(CeedScalar)(Q-1));
14401440
// Pn(xi)
14411441
P0 = 1.0;
14421442
P1 = xi;
14431443
P2 = 0.0;
1444-
for (int j = 2; j < Q; j++) {
1444+
for (CeedInt j = 2; j < Q; j++) {
14451445
P2 = (((CeedScalar)(2*j-1))*xi*P1-((CeedScalar)(j-1))*P0)/((CeedScalar)(j));
14461446
P0 = P1;
14471447
P1 = P2;
@@ -1451,10 +1451,10 @@ int CeedLobattoQuadrature(CeedInt Q, CeedScalar *q_ref_1d,
14511451
d2P2 = (2*xi*dP2 - (CeedScalar)(Q*(Q-1))*P2)/(1.0-xi*xi);
14521452
xi = xi-dP2/d2P2;
14531453
// Newton to convergence
1454-
for (int k=0; k<100 && fabs(dP2)>10*CEED_EPSILON; k++) {
1454+
for (CeedInt k=0; k<100 && fabs(dP2)>10*CEED_EPSILON; k++) {
14551455
P0 = 1.0;
14561456
P1 = xi;
1457-
for (int j = 2; j < Q; j++) {
1457+
for (CeedInt j = 2; j < Q; j++) {
14581458
P2 = (((CeedScalar)(2*j-1))*xi*P1-((CeedScalar)(j-1))*P0)/((CeedScalar)(j));
14591459
P0 = P1;
14601460
P1 = P2;

interface/ceed-elemrestriction.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ int CeedPermutePadOffsets(const CeedInt *offsets, CeedInt *blk_offsets,
4343
CeedInt num_blk, CeedInt num_elem, CeedInt blk_size,
4444
CeedInt elem_size) {
4545
for (CeedInt e=0; e<num_blk*blk_size; e+=blk_size)
46-
for (int j=0; j<blk_size; j++)
47-
for (int k=0; k<elem_size; k++)
46+
for (CeedInt j=0; j<blk_size; j++)
47+
for (CeedInt k=0; k<elem_size; k++)
4848
blk_offsets[e*elem_size + k*blk_size + j]
4949
= offsets[CeedIntMin(e+j,num_elem-1)*elem_size + k];
5050
return CEED_ERROR_SUCCESS;
@@ -77,7 +77,7 @@ int CeedElemRestrictionGetStrides(CeedElemRestriction rstr,
7777
"ElemRestriction has no stride data");
7878
// LCOV_EXCL_STOP
7979

80-
for (int i=0; i<3; i++)
80+
for (CeedInt i=0; i<3; i++)
8181
(*strides)[i] = rstr->strides[i];
8282
return CEED_ERROR_SUCCESS;
8383
}
@@ -205,7 +205,7 @@ int CeedElemRestrictionGetELayout(CeedElemRestriction rstr,
205205
"ElemRestriction has no layout data");
206206
// LCOV_EXCL_STOP
207207

208-
for (int i=0; i<3; i++)
208+
for (CeedInt i=0; i<3; i++)
209209
(*layout)[i] = rstr->layout[i];
210210
return CEED_ERROR_SUCCESS;
211211
}
@@ -227,7 +227,7 @@ int CeedElemRestrictionGetELayout(CeedElemRestriction rstr,
227227
**/
228228
int CeedElemRestrictionSetELayout(CeedElemRestriction rstr,
229229
CeedInt layout[3]) {
230-
for (int i = 0; i<3; i++)
230+
for (CeedInt i = 0; i<3; i++)
231231
rstr->layout[i] = layout[i];
232232
return CEED_ERROR_SUCCESS;
233233
}
@@ -570,7 +570,7 @@ int CeedElemRestrictionCreateStrided(Ceed ceed, CeedInt num_elem,
570570
(*rstr)->blk_size = 1;
571571
(*rstr)->is_oriented = 0;
572572
ierr = CeedMalloc(3, &(*rstr)->strides); CeedChk(ierr);
573-
for (int i=0; i<3; i++)
573+
for (CeedInt i=0; i<3; i++)
574574
(*rstr)->strides[i] = strides[i];
575575
ierr = ceed->ElemRestrictionCreate(CEED_MEM_HOST, CEED_OWN_POINTER, NULL,
576576
*rstr);
@@ -765,7 +765,7 @@ int CeedElemRestrictionCreateBlockedStrided(Ceed ceed, CeedInt num_elem,
765765
(*rstr)->blk_size = blk_size;
766766
(*rstr)->is_oriented = 0;
767767
ierr = CeedMalloc(3, &(*rstr)->strides); CeedChk(ierr);
768-
for (int i=0; i<3; i++)
768+
for (CeedInt i=0; i<3; i++)
769769
(*rstr)->strides[i] = strides[i];
770770
ierr = ceed->ElemRestrictionCreateBlocked(CEED_MEM_HOST, CEED_OWN_POINTER,
771771
NULL, *rstr); CeedChk(ierr);

interface/ceed-operator.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ int CeedOperatorSingleView(CeedOperator op, bool sub, FILE *stream) {
213213
int CeedOperatorGetActiveBasis(CeedOperator op, CeedBasis *active_basis) {
214214
*active_basis = NULL;
215215
if (op->is_composite) return CEED_ERROR_SUCCESS;
216-
for (int i = 0; i < op->qf->num_input_fields; i++)
216+
for (CeedInt i = 0; i < op->qf->num_input_fields; i++)
217217
if (op->input_fields[i]->vec == CEED_VECTOR_ACTIVE) {
218218
*active_basis = op->input_fields[i]->basis;
219219
break;
@@ -245,7 +245,7 @@ int CeedOperatorGetActiveElemRestriction(CeedOperator op,
245245
CeedElemRestriction *active_rstr) {
246246
*active_rstr = NULL;
247247
if (op->is_composite) return CEED_ERROR_SUCCESS;
248-
for (int i = 0; i < op->qf->num_input_fields; i++)
248+
for (CeedInt i = 0; i < op->qf->num_input_fields; i++)
249249
if (op->input_fields[i]->vec == CEED_VECTOR_ACTIVE) {
250250
*active_rstr = op->input_fields[i]->elem_restr;
251251
break;

interface/ceed-preconditioning.c

Lines changed: 51 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -34,42 +34,25 @@
3434
**/
3535
int CeedOperatorCreateFallback(CeedOperator op) {
3636
int ierr;
37+
Ceed fallback_ceed;
3738

3839
// Check not already created
3940
if (op->op_fallback) return CEED_ERROR_SUCCESS;
4041

4142
// Fallback Ceed
42-
const char *resource, *fallback_resource;
43-
ierr = CeedGetResource(op->ceed, &resource); CeedChk(ierr);
44-
ierr = CeedGetOperatorFallbackResource(op->ceed, &fallback_resource);
45-
CeedChk(ierr);
46-
if (!strcmp(resource, fallback_resource))
47-
// LCOV_EXCL_START
48-
return CeedError(op->ceed, CEED_ERROR_UNSUPPORTED,
49-
"Backend %s cannot create an operator"
50-
"fallback to resource %s", resource, fallback_resource);
51-
// LCOV_EXCL_STOP
52-
53-
// Fallback Ceed
54-
if (!op->ceed->op_fallback_ceed) {
55-
Ceed ceed_ref;
56-
ierr = CeedInit(fallback_resource, &ceed_ref); CeedChk(ierr);
57-
ceed_ref->op_fallback_parent = op->ceed;
58-
ceed_ref->Error = op->ceed->Error;
59-
op->ceed->op_fallback_ceed = ceed_ref;
60-
}
43+
ierr = CeedGetOperatorFallbackCeed(op->ceed, &fallback_ceed); CeedChk(ierr);
6144

6245
// Clone Op
6346
CeedOperator op_fallback;
6447
if (op->is_composite) {
65-
ierr = CeedCompositeOperatorCreate(op->ceed->op_fallback_ceed, &op_fallback);
48+
ierr = CeedCompositeOperatorCreate(fallback_ceed, &op_fallback);
6649
CeedChk(ierr);
6750
for (CeedInt i = 0; i < op->num_suboperators; i++) {
6851
ierr = CeedCompositeOperatorAddSub(op_fallback, op->sub_operators[i]);
6952
CeedChk(ierr);
7053
}
7154
} else {
72-
ierr = CeedOperatorCreate(op->ceed->op_fallback_ceed, op->qf, op->dqf, op->dqfT,
55+
ierr = CeedOperatorCreate(fallback_ceed, op->qf, op->dqf, op->dqfT,
7356
&op_fallback); CeedChk(ierr);
7457
for (CeedInt i = 0; i < op->qf->num_input_fields; i++) {
7558
ierr = CeedOperatorSetField(op_fallback, op->input_fields[i]->field_name,
@@ -500,11 +483,11 @@ static int CeedSingleOperatorAssembleSymbolic(CeedOperator op, CeedInt offset,
500483

501484
// Determine i, j locations for element matrices
502485
CeedInt count = 0;
503-
for (int e = 0; e < num_elem; ++e) {
504-
for (int comp_in = 0; comp_in < num_comp; ++comp_in) {
505-
for (int comp_out = 0; comp_out < num_comp; ++comp_out) {
506-
for (int i = 0; i < elem_size; ++i) {
507-
for (int j = 0; j < elem_size; ++j) {
486+
for (CeedInt e = 0; e < num_elem; ++e) {
487+
for (CeedInt comp_in = 0; comp_in < num_comp; ++comp_in) {
488+
for (CeedInt comp_out = 0; comp_out < num_comp; ++comp_out) {
489+
for (CeedInt i = 0; i < elem_size; ++i) {
490+
for (CeedInt j = 0; j < elem_size; ++j) {
508491
const CeedInt elem_dof_index_row = (i)*layout_er[0] +
509492
(comp_out)*layout_er[1] + e*layout_er[2];
510493
const CeedInt elem_dof_index_col = (j)*layout_er[0] +
@@ -685,31 +668,32 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
685668
num_qpts]; // logically 3-tensor
686669
CeedScalar BTD[elem_size * num_qpts*num_eval_mode_in];
687670
CeedScalar elem_mat[elem_size * elem_size];
688-
int count = 0;
671+
CeedInt count = 0;
689672
CeedScalar *vals;
690673
ierr = CeedVectorGetArrayWrite(values, CEED_MEM_HOST, &vals); CeedChk(ierr);
691-
for (int e = 0; e < num_elem; ++e) {
692-
for (int comp_in = 0; comp_in < num_comp; ++comp_in) {
693-
for (int comp_out = 0; comp_out < num_comp; ++comp_out) {
694-
for (int ell = 0; ell < (num_qpts * num_eval_mode_in) * elem_size; ++ell) {
674+
for (CeedInt e = 0; e < num_elem; ++e) {
675+
for (CeedInt comp_in = 0; comp_in < num_comp; ++comp_in) {
676+
for (CeedInt comp_out = 0; comp_out < num_comp; ++comp_out) {
677+
for (CeedInt ell = 0; ell < (num_qpts * num_eval_mode_in) * elem_size; ++ell) {
695678
B_mat_in[ell] = 0.0;
696679
}
697-
for (int ell = 0; ell < (num_qpts * num_eval_mode_out) * elem_size; ++ell) {
680+
for (CeedInt ell = 0; ell < (num_qpts * num_eval_mode_out) * elem_size; ++ell) {
698681
B_mat_out[ell] = 0.0;
699682
}
700683
// Store block-diagonal D matrix as collection of small dense blocks
701-
for (int ell = 0; ell < num_eval_mode_in*num_eval_mode_out*num_qpts; ++ell) {
684+
for (CeedInt ell = 0; ell < num_eval_mode_in*num_eval_mode_out*num_qpts;
685+
++ell) {
702686
D_mat[ell] = 0.0;
703687
}
704688
// form element matrix itself (for each block component)
705-
for (int ell = 0; ell < elem_size*elem_size; ++ell) {
689+
for (CeedInt ell = 0; ell < elem_size*elem_size; ++ell) {
706690
elem_mat[ell] = 0.0;
707691
}
708-
for (int q = 0; q < num_qpts; ++q) {
709-
for (int n = 0; n < elem_size; ++n) {
692+
for (CeedInt q = 0; q < num_qpts; ++q) {
693+
for (CeedInt n = 0; n < elem_size; ++n) {
710694
CeedInt d_in = -1;
711-
for (int e_in = 0; e_in < num_eval_mode_in; ++e_in) {
712-
const int qq = num_eval_mode_in*q;
695+
for (CeedInt e_in = 0; e_in < num_eval_mode_in; ++e_in) {
696+
const CeedInt qq = num_eval_mode_in*q;
713697
if (eval_mode_in[e_in] == CEED_EVAL_INTERP) {
714698
B_mat_in[(qq+e_in)*elem_size + n] += interp_in[q * elem_size + n];
715699
} else if (eval_mode_in[e_in] == CEED_EVAL_GRAD) {
@@ -723,8 +707,8 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
723707
}
724708
}
725709
CeedInt d_out = -1;
726-
for (int e_out = 0; e_out < num_eval_mode_out; ++e_out) {
727-
const int qq = num_eval_mode_out*q;
710+
for (CeedInt e_out = 0; e_out < num_eval_mode_out; ++e_out) {
711+
const CeedInt qq = num_eval_mode_out*q;
728712
if (eval_mode_out[e_out] == CEED_EVAL_INTERP) {
729713
B_mat_out[(qq+e_out)*elem_size + n] += interp_in[q * elem_size + n];
730714
} else if (eval_mode_out[e_out] == CEED_EVAL_GRAD) {
@@ -738,25 +722,26 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
738722
}
739723
}
740724
}
741-
for (int ei = 0; ei < num_eval_mode_out; ++ei) {
742-
for (int ej = 0; ej < num_eval_mode_in; ++ej) {
743-
const int eval_mode_index = ((ei*num_comp+comp_in)*num_eval_mode_in+ej)*num_comp
744-
+comp_out;
745-
const int index = q*layout_qf[0] + eval_mode_index*layout_qf[1] +
746-
e*layout_qf[2];
725+
for (CeedInt ei = 0; ei < num_eval_mode_out; ++ei) {
726+
for (CeedInt ej = 0; ej < num_eval_mode_in; ++ej) {
727+
const CeedInt eval_mode_index = ((ei*num_comp+comp_in)*num_eval_mode_in+ej)
728+
*num_comp
729+
+comp_out;
730+
const CeedInt index = q*layout_qf[0] + eval_mode_index*layout_qf[1] +
731+
e*layout_qf[2];
747732
D_mat[(ei*num_eval_mode_in+ej)*num_qpts + q] += assembled_qf_array[index];
748733
}
749734
}
750735
}
751736
// Compute B^T*D
752-
for (int ell = 0; ell < elem_size*num_qpts*num_eval_mode_in; ++ell) {
737+
for (CeedInt ell = 0; ell < elem_size*num_qpts*num_eval_mode_in; ++ell) {
753738
BTD[ell] = 0.0;
754739
}
755-
for (int j = 0; j<elem_size; ++j) {
756-
for (int q = 0; q<num_qpts; ++q) {
757-
int qq = num_eval_mode_out*q;
758-
for (int ei = 0; ei < num_eval_mode_in; ++ei) {
759-
for (int ej = 0; ej < num_eval_mode_out; ++ej) {
740+
for (CeedInt j = 0; j<elem_size; ++j) {
741+
for (CeedInt q = 0; q<num_qpts; ++q) {
742+
const CeedInt qq = num_eval_mode_out*q;
743+
for (CeedInt ei = 0; ei < num_eval_mode_in; ++ei) {
744+
for (CeedInt ej = 0; ej < num_eval_mode_out; ++ej) {
760745
BTD[j*(num_qpts*num_eval_mode_in) + (qq+ei)] +=
761746
B_mat_out[(qq+ej)*elem_size + j] * D_mat[(ei*num_eval_mode_in+ej)*num_qpts + q];
762747
}
@@ -768,8 +753,8 @@ static int CeedSingleOperatorAssemble(CeedOperator op, CeedInt offset,
768753
elem_size, num_qpts*num_eval_mode_in); CeedChk(ierr);
769754

770755
// put element matrix in coordinate data structure
771-
for (int i = 0; i < elem_size; ++i) {
772-
for (int j = 0; j < elem_size; ++j) {
756+
for (CeedInt i = 0; i < elem_size; ++i) {
757+
for (CeedInt j = 0; j < elem_size; ++j) {
773758
vals[offset + count] = elem_mat[i*elem_size + j];
774759
count++;
775760
}
@@ -861,7 +846,7 @@ static int CeedSingleOperatorMultigridLevel(CeedOperator op_fine,
861846
op_coarse); CeedChk(ierr);
862847
CeedElemRestriction rstr_fine = NULL;
863848
// -- Clone input fields
864-
for (int i = 0; i < op_fine->qf->num_input_fields; i++) {
849+
for (CeedInt i = 0; i < op_fine->qf->num_input_fields; i++) {
865850
if (op_fine->input_fields[i]->vec == CEED_VECTOR_ACTIVE) {
866851
rstr_fine = op_fine->input_fields[i]->elem_restr;
867852
ierr = CeedOperatorSetField(*op_coarse, op_fine->input_fields[i]->field_name,
@@ -875,7 +860,7 @@ static int CeedSingleOperatorMultigridLevel(CeedOperator op_fine,
875860
}
876861
}
877862
// -- Clone output fields
878-
for (int i = 0; i < op_fine->qf->num_output_fields; i++) {
863+
for (CeedInt i = 0; i < op_fine->qf->num_output_fields; i++) {
879864
if (op_fine->output_fields[i]->vec == CEED_VECTOR_ACTIVE) {
880865
ierr = CeedOperatorSetField(*op_coarse, op_fine->output_fields[i]->field_name,
881866
rstr_coarse, basis_coarse, CEED_VECTOR_ACTIVE);
@@ -1722,7 +1707,7 @@ int CeedOperatorLinearAssembleSymbolic(CeedOperator op, CeedSize *num_entries,
17221707
if (is_composite) {
17231708
ierr = CeedOperatorGetNumSub(op, &num_suboperators); CeedChk(ierr);
17241709
ierr = CeedOperatorGetSubList(op, &sub_operators); CeedChk(ierr);
1725-
for (int k = 0; k < num_suboperators; ++k) {
1710+
for (CeedInt k = 0; k < num_suboperators; ++k) {
17261711
ierr = CeedSingleOperatorAssemblyCountEntries(sub_operators[k],
17271712
&single_entries); CeedChk(ierr);
17281713
*num_entries += single_entries;
@@ -1740,7 +1725,7 @@ int CeedOperatorLinearAssembleSymbolic(CeedOperator op, CeedSize *num_entries,
17401725
if (is_composite) {
17411726
ierr = CeedOperatorGetNumSub(op, &num_suboperators); CeedChk(ierr);
17421727
ierr = CeedOperatorGetSubList(op, &sub_operators); CeedChk(ierr);
1743-
for (int k = 0; k < num_suboperators; ++k) {
1728+
for (CeedInt k = 0; k < num_suboperators; ++k) {
17441729
ierr = CeedSingleOperatorAssembleSymbolic(sub_operators[k], offset, *rows,
17451730
*cols); CeedChk(ierr);
17461731
ierr = CeedSingleOperatorAssemblyCountEntries(sub_operators[k],
@@ -1812,7 +1797,7 @@ int CeedOperatorLinearAssemble(CeedOperator op, CeedVector values) {
18121797
if (is_composite) {
18131798
ierr = CeedOperatorGetNumSub(op, &num_suboperators); CeedChk(ierr);
18141799
ierr = CeedOperatorGetSubList(op, &sub_operators); CeedChk(ierr);
1815-
for (int k = 0; k < num_suboperators; ++k) {
1800+
for (CeedInt k = 0; k < num_suboperators; ++k) {
18161801
ierr = CeedSingleOperatorAssemble(sub_operators[k], offset, values);
18171802
CeedChk(ierr);
18181803
ierr = CeedSingleOperatorAssemblyCountEntries(sub_operators[k],
@@ -1893,14 +1878,16 @@ int CeedOperatorMultigridLevelCreate(CeedOperator op_fine,
18931878
ierr = CeedMalloc(Q*P_c, &interp_c); CeedChk(ierr);
18941879
ierr = CeedCalloc(P_c*P_f, &interp_c_to_f); CeedChk(ierr);
18951880
ierr = CeedMalloc(Q, &tau); CeedChk(ierr);
1881+
const CeedScalar *interp_f_source = NULL, *interp_c_source = NULL;
18961882
if (is_tensor_f) {
1897-
memcpy(interp_f, basis_fine->interp_1d, Q*P_f*sizeof basis_fine->interp_1d[0]);
1898-
memcpy(interp_c, basis_coarse->interp_1d,
1899-
Q*P_c*sizeof basis_coarse->interp_1d[0]);
1883+
ierr = CeedBasisGetInterp1D(basis_fine, &interp_f_source); CeedChk(ierr);
1884+
ierr = CeedBasisGetInterp1D(basis_coarse, &interp_c_source); CeedChk(ierr);
19001885
} else {
1901-
memcpy(interp_f, basis_fine->interp, Q*P_f*sizeof basis_fine->interp[0]);
1902-
memcpy(interp_c, basis_coarse->interp, Q*P_c*sizeof basis_coarse->interp[0]);
1886+
ierr = CeedBasisGetInterp(basis_fine, &interp_f_source); CeedChk(ierr);
1887+
ierr = CeedBasisGetInterp(basis_coarse, &interp_c_source); CeedChk(ierr);
19031888
}
1889+
memcpy(interp_f, interp_f_source, Q*P_f*sizeof interp_f_source[0]);
1890+
memcpy(interp_c, interp_c_source, Q*P_c*sizeof interp_c_source[0]);
19041891

19051892
// -- QR Factorization, interp_f = Q R
19061893
ierr = CeedQRFactorization(ceed, interp_f, tau, Q, P_f); CeedChk(ierr);

0 commit comments

Comments
 (0)