/* File ptstbref.c. Contains functions relating to refinements based on the pointstabilizerproperty(therefinementsSSS_{alpha,i}inthereference), asfollows:
pointStabRefine:Arefinementfamilybasedonthepointstabilizer property. isPointStabReducible:Afunctiontocheckswhetherthetoppartition onapartitionstackisSSS-reducibleand returnsarefinementactingnontriviallyonthe
top partition if so. */
/* The function implements the refinement family pointStabRefine (denoted SSS_alphainthereference).Thisfamilyconsistsoftheelementary refinementsssS_{alpha,i},wherealphaisinOmegaandwhere1<=i<= degree.ApplicationofsSS_{alpha,i}toUpsilonStacksplitsoffpointalpha fromcelliofthetoppartitionofUpsilonStackandpushestheresulting partitionontoUpsilonStack,unlesssSS_{alpha,i}actstriviallyonthetop partition,inwhichcaseUpsilonStackremainsunchanged.
Therefinementparametersareasfollows: refnParm[0].intParm:alpha, refnParm[1].intParm:i.
There are no refinement family parameters. */
/* First check if the refinement acts nontrivially on UpsilonTop. If not
return immediately. */ if ( cellNumber[alpha] != cellToSplit || cellSize[cellToSplit] == 1 ) {
split.oldCellSize = cellSize[cellToSplit];
split.newCellSize = 0; return split;
}
/* The function isPointStabReducible checks whether the top partition UpsilonTop ongivenpartitionstackUpsilonStackisSSS_alpha-reducible.(In applications,itwillbe.)Assumingso,itreturnsarefinement-priority pairconsistingofarefinementactingnontriviallyonUpsilonTopanda priority.Thepriority(includedforconsistency,butnotnormallyused) willbeveryhigh.TherefinementwillbesSS_{alpha,i},whereiissuch thatcelliofUpsilonTopcontainingalpha,andwherealphaischosento minimizetheexpression
RefinementPriorityPair isPointStabReducible( const RefinementFamily *family, /* The refinement family (mapping mustbepointStabRefn;there
are no genuine parms. */ const PartitionStack *const UpsilonStack, /* The partition stack above. */
PermGroup *G, /* For optimization. */
RBase *AAA, /* For optimization. */ Unsigned level) /* For optimization. */
{ Unsigned pt, orbitNo, i, alpha; #ifndef NOFLOAT float priority, minPriority, orbitLen; #endif #ifdef NOFLOAT unsignedlong priority, minPriority, orbitLen, cubeRoot; #endif
RefinementPriorityPair reducingRefn; constUnsigned degree = UpsilonStack->degree; const UnsignedS *const cellNumber = UpsilonStack->cellNumber,
*const cellSize = UpsilonStack->cellSize;
/* Check that the refinement mapping really is pointStabRefn, as required. */ if ( family->refine != pointStabRefine )
ERROR( "isPointStabReducible", "Error: incorrect refinement mapping");
/* Here we compute an internal priority for each possible value of alpha andfindwhichalphaminimizesthepriority.Notetheinternalpriority
is not the priority in the return value. */
alpha = 0; if ( options.alphaHat1 >= 1 && options.alphaHat1 <= degree &&
cellSize[cellNumber[options.alphaHat1]] > 1 )
alpha = options.alphaHat1; elseif ( chooseNextBasePoint )
alpha = chooseNextBasePoint( G, UpsilonStack); elseif ( !IS_SYMMETRIC(G) ) for ( pt = 1 ; pt <= degree ; ++pt ) { if ( cellSize[cellNumber[pt]] > 1 ) { #ifndef NOFLOAT
priority = ( cellSize[cellNumber[pt]] >= options.idealBasicCellSize ) ?
(float) cellSize[cellNumber[pt]] :
(float) (2 * options.idealBasicCellSize -
cellSize[cellNumber[pt]]);
orbitNo = G->orbNumberOfPt[level][pt];
orbitLen = (float) (G->startOfOrbitNo[level][orbitNo+1] -
G->startOfOrbitNo[level][orbitNo]);
priority *= priority * priority;
priority /= orbitLen; for ( i = 1 ; i < level ; ++i) if ( cellNumberAtDepth( AAA->PsiStack, i, pt) == AAA->p_[i] )
priority /= 1.2; #endif #ifdef NOFLOAT
priority = ( cellSize[cellNumber[pt]] >= options.idealBasicCellSize ) ?
(unsignedlong) cellSize[cellNumber[pt]] :
(unsignedlong) (2 * options.idealBasicCellSize -
cellSize[cellNumber[pt]]);
orbitNo = G->orbNumberOfPt[level][pt];
orbitLen = G->startOfOrbitNo[level][orbitNo+1] -
G->startOfOrbitNo[level][orbitNo]; for ( cubeRoot = 1 ; cubeRoot * cubeRoot * cubeRoot <= orbitLen ;
++cubeRoot )
;
priority /= cubeRoot - 1; for ( i = 1 ; i < level ; ++i) if ( cellNumberAtDepth( AAA->PsiStack, i, pt) == AAA->p_[i] ) {
priority *= 11;
priority /= 12;
} #endif if ( alpha == 0 || priority < minPriority ) {
minPriority = priority;
alpha = pt;
}
}
} else for ( pt = 1 ; pt <= degree ; ++pt ) if ( cellSize[cellNumber[pt]] > 1 ) {
priority = cellSize[cellNumber[pt]]; if ( alpha == 0 || priority < minPriority ) {
minPriority = priority;
alpha = pt;
}
}
/* Set return value and return to caller. */ if ( alpha == 0 )
reducingRefn.priority = IRREDUCIBLE; else {
reducingRefn.refn.family = (RefinementFamily *) family;
reducingRefn.refn.refnParm[0].intParm = alpha;
reducingRefn.refn.refnParm[1].intParm = cellNumber[alpha];
reducingRefn.priority = 30000;
} return reducingRefn;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet am 2026-06-26)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.