@@ -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