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(); }
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(); }