コード例 #1
0
WeakFormAcaAssemblyHelper<BasisFunctionType, ResultType>::
    WeakFormAcaAssemblyHelper(
        const Space<BasisFunctionType> &testSpace,
        const Space<BasisFunctionType> &trialSpace,
        const std::vector<unsigned int> &p2oTestDofs,
        const std::vector<unsigned int> &p2oTrialDofs,
        const std::vector<LocalAssembler *> &assemblers,
        const std::vector<const DiscreteLinOp *> &sparseTermsToAdd,
        const std::vector<ResultType> &denseTermsMultipliers,
        const std::vector<ResultType> &sparseTermsMultipliers,
        const AssemblyOptions &options)
    : m_testSpace(testSpace), m_trialSpace(trialSpace),
      m_p2oTestDofs(p2oTestDofs), m_p2oTrialDofs(p2oTrialDofs),
      m_assemblers(assemblers), m_sparseTermsToAdd(sparseTermsToAdd),
      m_denseTermsMultipliers(denseTermsMultipliers),
      m_sparseTermsMultipliers(sparseTermsMultipliers), m_options(options),
      m_indexWithGlobalDofs(m_options.acaOptions().mode !=
                            AcaOptions::HYBRID_ASSEMBLY),
      m_uniformQuadratureOrder(
          m_options.isQuadratureOrderUniformInEachCluster()),
      m_testDofListsCache(new LocalDofListsCache<BasisFunctionType>(
          m_testSpace, m_p2oTestDofs, m_indexWithGlobalDofs)),
      m_trialDofListsCache(new LocalDofListsCache<BasisFunctionType>(
          m_trialSpace, m_p2oTrialDofs, m_indexWithGlobalDofs))
      //,
      //    m_trialDofListsCache(&testSpace == &trialSpace &&
      //                         std::equal(p2oTestDofs.begin(),
      // p2oTestDofs.end(),
      //                                    p2oTrialDofs.begin()) ?
      //                             m_testDofListsCache :
      //                             boost::make_shared<LocalDofListsCache<BasisFunctionType>
      // >(
      //                                 m_trialSpace, m_p2oTrialDofs,
      // m_indexWithGlobalDofs))
{
  if (!m_indexWithGlobalDofs && !m_sparseTermsToAdd.empty())
    throw std::invalid_argument(
        "WeakFormAcaAssemblyHelper::WeakFormAcaAssemblyHelper(): "
        "combining sparse and dense terms in hybrid ACA mode "
        "is not supported at present");
  for (size_t i = 0; i < assemblers.size(); ++i)
    if (!assemblers[i])
      throw std::invalid_argument(
          "WeakFormAcaAssemblyHelper::WeakFormAcaAssemblyHelper(): "
          "no elements of the 'assemblers' vector may be null");
  for (size_t i = 0; i < sparseTermsToAdd.size(); ++i)
    if (!sparseTermsToAdd[i])
      throw std::invalid_argument(
          "WeakFormAcaAssemblyHelper::WeakFormAcaAssemblyHelper(): "
          "no elements of the 'sparseTermsToAdd' vector may be null");
  resetAccessedEntryCount();
}
コード例 #2
0
PotentialOperatorAcaAssemblyHelper<BasisFunctionType, ResultType>::
PotentialOperatorAcaAssemblyHelper(
        const arma::Mat<CoordinateType>& points,
        const Space<BasisFunctionType>& trialSpace,
        const std::vector<unsigned int>& p2oPoints,
        const std::vector<unsigned int>& p2oTrialDofs,
        const std::vector<LocalAssembler*>& assemblers,
        const std::vector<ResultType>& termMultipliers,
        const EvaluationOptions& options) :
    m_points(points), m_trialSpace(trialSpace),
    m_p2oPoints(p2oPoints), m_p2oTrialDofs(p2oTrialDofs),
    m_assemblers(assemblers),
    m_termMultipliers(termMultipliers),
    m_options(options),
    m_indexWithGlobalDofs(m_options.acaOptions().mode != AcaOptions::HYBRID_ASSEMBLY),
    m_trialDofListsCache(new LocalDofListsCache<BasisFunctionType>(
                            m_trialSpace, m_p2oTrialDofs, m_indexWithGlobalDofs))
{
    if (assemblers.empty())
        throw std::invalid_argument(
                "PotentialOperatorAcaAssemblyHelper::"
                "PotentialOperatorAcaAssemblyHelper(): "
                "the 'assemblers' vector must not be null");
    if (assemblers.size() != termMultipliers.size())
        throw std::invalid_argument(
                "PotentialOperatorAcaAssemblyHelper::"
                "PotentialOperatorAcaAssemblyHelper(): "
                "the 'assemblers' and 'termMultipliers' vectors must have the "
                "same length");
    for (size_t i = 0; i < assemblers.size(); ++i)
        if (!assemblers[i])
            throw std::invalid_argument(
                    "PotentialOperatorAcaAssemblyHelper::"
                    "PotentialOperatorAcaAssemblyHelper(): "
                    "no elements of the 'assemblers' vector may be null");
    m_componentCount = assemblers[0]->resultDimension();
    for (size_t i = 1; i < assemblers.size(); ++i)
        if (assemblers[i]->resultDimension() != m_componentCount)
            throw std::invalid_argument(
                    "PotentialOperatorAcaAssemblyHelper::"
                    "PotentialOperatorAcaAssemblyHelper(): "
                    "all assemblers must produce results with the same number "
                    "of components");
    m_componentListsCache.reset(
                new ComponentListsCache(m_p2oPoints, m_componentCount));
    resetAccessedEntryCount();
}