void EminPFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node, LocalMatOps>::DeclareInput(Level& fineLevel, Level& coarseLevel) const { Input(fineLevel, "A"); static bool isAvailableP0 = false; static bool isAvailableConstraint0 = false; // Here is a tricky little piece of code // We don't want to request (aka call Input) when we reuse and P0 is available // However, we cannot run something simple like this: // if (!coarseLevel.IsAvailable("P0", this)) // Input(coarseLevel, "P"); // The reason is that it works fine during the request stage, but fails // in the release stage as we _construct_ P0 during Build process. Therefore, // we need to understand whether we are in Request or Release mode // NOTE: This is a very unique situation, please try not to propagate the // mode check any further if (coarseLevel.GetRequestMode() == Level::REQUEST) { isAvailableP0 = coarseLevel.IsAvailable("P0", this); isAvailableConstraint0 = coarseLevel.IsAvailable("Constraint0", this); } if (isAvailableP0 == false) Input(coarseLevel, "P"); if (isAvailableConstraint0 == false) Input(coarseLevel, "Constraint"); }
void CoordinatesTransferFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::DeclareInput(Level& fineLevel, Level& coarseLevel) const { static bool isAvailableCoords = false; if (coarseLevel.GetRequestMode() == Level::REQUEST) isAvailableCoords = coarseLevel.IsAvailable("Coordinates", this); if (isAvailableCoords == false) { Input(fineLevel, "Coordinates"); Input(fineLevel, "Aggregates"); Input(fineLevel, "CoarseMap"); } }