Skip to content

Commit e64d66b

Browse files
Good default quadrature rules
1 parent a7d1715 commit e64d66b

1 file changed

Lines changed: 22 additions & 1 deletion

File tree

src/geometry/integrate.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1973,6 +1973,14 @@ quadraturerule *quadrules[] = {
19731973
NULL
19741974
};
19751975

1976+
// Specify a list of default rules for each grade
1977+
quadraturerule *defaultquadrule[] = {
1978+
&gauss5,
1979+
&cubtri7,
1980+
&grundmann3d0,
1981+
NULL
1982+
};
1983+
19761984
/* **********************************************
19771985
* Subdivision rules
19781986
* ********************************************** */
@@ -2617,6 +2625,17 @@ bool integrator_matchrulebyorder(int grade, int minorder, int maxorder, bool hig
26172625
return (best>=0);
26182626
}
26192627

2628+
/** Returns a default rule for each grade */
2629+
bool integrator_matchrulebygrade(int grade, quadraturerule **out) {
2630+
for (int i=0; defaultquadrule[i]!=NULL; i++) {
2631+
if (defaultquadrule[i]->grade==grade) {
2632+
*out = defaultquadrule[i];
2633+
return true;
2634+
}
2635+
}
2636+
return false;
2637+
}
2638+
26202639
/** Configures an integrator based on the grade to integrate and hints for order and rule type
26212640
* @param[in] integrate - integrator structure to be configured
26222641
* @param[in] err - error structure to report errors to
@@ -2637,8 +2656,10 @@ bool integrator_configure(integrator *integrate, error *err, bool adapt, int gra
26372656
error_writewithid(err, INTEGRATE_RLNTFND, name);
26382657
return false;
26392658
}
2659+
} else if (order>=0) {
2660+
integrator_matchrulebyorder(grade, order, INT_MAX, false, &integrate->rule);
26402661
} else {
2641-
integrator_matchrulebyorder(grade, (order<0 ? 0 : order), INT_MAX, (order<0), &integrate->rule);
2662+
integrator_matchrulebygrade(grade, &integrate->rule);
26422663
}
26432664

26442665
// Check we succeeded in finding a rule

0 commit comments

Comments
 (0)