Skip to content

Commit f0a56d1

Browse files
Get integral data from static data structures, not a function (#2744)
* Interface change for ffcx * Fix difference
1 parent 1be215d commit f0a56d1

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

cpp/dolfinx/fem/utils.h

+25-14
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,14 @@ Form<T, U> create_form(
331331
assert(topology);
332332
const int tdim = topology->dim();
333333

334+
const int* integral_offsets = ufcx_form.form_integral_offsets;
335+
std::vector<int> num_integrals_type(3);
336+
for (int i = 0; i < 3; ++i)
337+
num_integrals_type[i] = integral_offsets[i + 1] - integral_offsets[i];
338+
334339
// Create facets, if required
335-
if (ufcx_form.num_integrals(exterior_facet) > 0
336-
or ufcx_form.num_integrals(interior_facet) > 0)
340+
if (num_integrals_type[exterior_facet] > 0
341+
or num_integrals_type[interior_facet] > 0)
337342
{
338343
mesh->topology_mutable()->create_entities(tdim - 1);
339344
mesh->topology_mutable()->create_connectivity(tdim - 1, tdim);
@@ -353,14 +358,16 @@ Form<T, U> create_form(
353358

354359
// Attach cell kernels
355360
{
356-
std::span<const int> ids(ufcx_form.integral_ids(cell),
357-
ufcx_form.num_integrals(cell));
361+
std::span<const int> ids(ufcx_form.form_integral_ids
362+
+ integral_offsets[cell],
363+
num_integrals_type[cell]);
358364
auto itg = integral_data.insert({IntegralType::cell, {}});
359365
auto sd = subdomains.find(IntegralType::cell);
360-
for (int i = 0; i < ufcx_form.num_integrals(cell); ++i)
366+
for (int i = 0; i < num_integrals_type[cell]; ++i)
361367
{
362368
const int id = ids[i];
363-
ufcx_integral* integral = ufcx_form.integrals(cell)[i];
369+
ufcx_integral* integral
370+
= ufcx_form.form_integrals[integral_offsets[cell] + i];
364371
assert(integral);
365372

366373
kern k = nullptr;
@@ -411,14 +418,16 @@ Form<T, U> create_form(
411418

412419
// Attach exterior facet kernels
413420
{
414-
std::span<const int> ids(ufcx_form.integral_ids(exterior_facet),
415-
ufcx_form.num_integrals(exterior_facet));
421+
std::span<const int> ids(ufcx_form.form_integral_ids
422+
+ integral_offsets[exterior_facet],
423+
num_integrals_type[exterior_facet]);
416424
auto itg = integral_data.insert({IntegralType::exterior_facet, {}});
417425
auto sd = subdomains.find(IntegralType::exterior_facet);
418-
for (int i = 0; i < ufcx_form.num_integrals(exterior_facet); ++i)
426+
for (int i = 0; i < num_integrals_type[exterior_facet]; ++i)
419427
{
420428
const int id = ids[i];
421-
ufcx_integral* integral = ufcx_form.integrals(exterior_facet)[i];
429+
ufcx_integral* integral
430+
= ufcx_form.form_integrals[integral_offsets[exterior_facet] + i];
422431
assert(integral);
423432

424433
kern k = nullptr;
@@ -479,14 +488,16 @@ Form<T, U> create_form(
479488

480489
// Attach interior facet kernels
481490
{
482-
std::span<const int> ids(ufcx_form.integral_ids(interior_facet),
483-
ufcx_form.num_integrals(interior_facet));
491+
std::span<const int> ids(ufcx_form.form_integral_ids
492+
+ integral_offsets[interior_facet],
493+
num_integrals_type[interior_facet]);
484494
auto itg = integral_data.insert({IntegralType::interior_facet, {}});
485495
auto sd = subdomains.find(IntegralType::interior_facet);
486-
for (int i = 0; i < ufcx_form.num_integrals(interior_facet); ++i)
496+
for (int i = 0; i < num_integrals_type[interior_facet]; ++i)
487497
{
488498
const int id = ids[i];
489-
ufcx_integral* integral = ufcx_form.integrals(interior_facet)[i];
499+
ufcx_integral* integral
500+
= ufcx_form.form_integrals[integral_offsets[interior_facet] + i];
490501
assert(integral);
491502

492503
kern k = nullptr;

0 commit comments

Comments
 (0)