std::unique_ptr<typename ElementaryLocalOperator<BasisFunctionType, ResultType>::LocalAssembler> ElementaryLocalOperator<BasisFunctionType, ResultType>::makeAssembler( const QuadratureStrategy &quadStrategy, const AssemblyOptions &options) const { typedef Fiber::RawGridGeometry<CoordinateType> RawGridGeometry; typedef std::vector<const Fiber::Shapeset<BasisFunctionType> *> ShapesetPtrVector; shared_ptr<RawGridGeometry> testRawGeometry, trialRawGeometry; shared_ptr<GeometryFactory> testGeometryFactory, trialGeometryFactory; shared_ptr<Fiber::OpenClHandler> openClHandler; shared_ptr<ShapesetPtrVector> testShapesets, trialShapesets; bool cacheSingularIntegrals; this->collectDataForAssemblerConstruction( options, testRawGeometry, trialRawGeometry, testGeometryFactory, trialGeometryFactory, testShapesets, trialShapesets, openClHandler, cacheSingularIntegrals); assert(testRawGeometry == trialRawGeometry); assert(testGeometryFactory == trialGeometryFactory); return quadStrategy.makeAssemblerForLocalOperators( testGeometryFactory, testRawGeometry, testShapesets, trialShapesets, make_shared_from_ref(testTransformations()), make_shared_from_ref(trialTransformations()), make_shared_from_ref(integral()), openClHandler); }
std::unique_ptr<typename ElementaryPotentialOperator< BasisFunctionType, KernelType, ResultType>::LocalAssembler> ElementaryPotentialOperator<BasisFunctionType, KernelType, ResultType>:: makeAssembler(const Space<BasisFunctionType> &space, const arma::Mat<CoordinateType> &evaluationPoints, const QuadratureStrategy &quadStrategy, const EvaluationOptions &options) const { // Collect the standard set of data necessary for construction of // assemblers typedef Fiber::RawGridGeometry<CoordinateType> RawGridGeometry; typedef std::vector<const Fiber::Shapeset<BasisFunctionType> *> ShapesetPtrVector; typedef std::vector<std::vector<ResultType>> CoefficientsVector; typedef LocalAssemblerConstructionHelper Helper; shared_ptr<RawGridGeometry> rawGeometry; shared_ptr<GeometryFactory> geometryFactory; shared_ptr<Fiber::OpenClHandler> openClHandler; shared_ptr<ShapesetPtrVector> shapesets; shared_ptr<const Grid> grid = space.grid(); Helper::collectGridData(space, rawGeometry, geometryFactory); Helper::makeOpenClHandler(options.parallelizationOptions().openClOptions(), rawGeometry, openClHandler); Helper::collectShapesets(space, shapesets); // Now create the assembler return quadStrategy.makeAssemblerForPotentialOperators( evaluationPoints, geometryFactory, rawGeometry, shapesets, make_shared_from_ref(kernels()), make_shared_from_ref(trialTransformations()), make_shared_from_ref(integral()), openClHandler, options.parallelizationOptions(), options.verbosityLevel()); }
std::auto_ptr<typename ElementaryPotentialOperator< BasisFunctionType, KernelType, ResultType>::Evaluator> ElementaryPotentialOperator<BasisFunctionType, KernelType, ResultType>:: makeEvaluator( const GridFunction<BasisFunctionType, ResultType>& argument, const QuadratureStrategy& quadStrategy, const EvaluationOptions& options) const { // Collect the standard set of data necessary for construction of // evaluators and assemblers typedef Fiber::RawGridGeometry<CoordinateType> RawGridGeometry; typedef std::vector<const Fiber::Shapeset<BasisFunctionType>*> ShapesetPtrVector; typedef std::vector<std::vector<ResultType> > CoefficientsVector; typedef LocalAssemblerConstructionHelper Helper; shared_ptr<RawGridGeometry> rawGeometry; shared_ptr<GeometryFactory> geometryFactory; shared_ptr<Fiber::OpenClHandler> openClHandler; shared_ptr<ShapesetPtrVector> shapesets; const Space<BasisFunctionType>& space = *argument.space(); shared_ptr<const Grid> grid = space.grid(); Helper::collectGridData(space, rawGeometry, geometryFactory); Helper::makeOpenClHandler(options.parallelizationOptions().openClOptions(), rawGeometry, openClHandler); Helper::collectShapesets(space, shapesets); // In addition, get coefficients of argument's expansion in each element const GridView& view = space.gridView(); const int elementCount = view.entityCount(0); shared_ptr<CoefficientsVector> localCoefficients = boost::make_shared<CoefficientsVector>(elementCount); std::auto_ptr<EntityIterator<0> > it = view.entityIterator<0>(); for (int i = 0; i < elementCount; ++i) { const Entity<0>& element = it->entity(); argument.getLocalCoefficients(element, (*localCoefficients)[i]); it->next(); } // Now create the evaluator return quadStrategy.makeEvaluatorForIntegralOperators( geometryFactory, rawGeometry, shapesets, make_shared_from_ref(kernels()), make_shared_from_ref(trialTransformations()), make_shared_from_ref(integral()), localCoefficients, openClHandler, options.parallelizationOptions()); }
std::pair< shared_ptr<typename HypersingularIntegralOperator< BasisFunctionType, KernelType, ResultType>::LocalAssembler>, shared_ptr<typename HypersingularIntegralOperator< BasisFunctionType, KernelType, ResultType>::LocalAssembler> > HypersingularIntegralOperator<BasisFunctionType, KernelType, ResultType>:: reallyMakeAssemblers( const QuadratureStrategy& quadStrategy, const shared_ptr<const GeometryFactory>& testGeometryFactory, const shared_ptr<const GeometryFactory>& trialGeometryFactory, const shared_ptr<const Fiber::RawGridGeometry<CoordinateType> >& testRawGeometry, const shared_ptr<const Fiber::RawGridGeometry<CoordinateType> >& trialRawGeometry, const shared_ptr<const std::vector<const Fiber::Shapeset<BasisFunctionType>*> >& testShapesets, const shared_ptr<const std::vector<const Fiber::Shapeset<BasisFunctionType>*> >& trialShapesets, const shared_ptr<const Fiber::OpenClHandler>& openClHandler, const ParallelizationOptions& parallelizationOptions, VerbosityLevel::Level verbosityLevel, bool cacheSingularIntegrals, bool makeSeparateOffDiagonalAssembler) const { std::pair<shared_ptr<LocalAssembler>, shared_ptr<LocalAssembler> > result; // first element: "standard" assembler // second element: assembler used for admissible (off-diagonal) // H-matrix blocks in "disassembled mode" result.first.reset(quadStrategy.makeAssemblerForIntegralOperators( testGeometryFactory, trialGeometryFactory, testRawGeometry, trialRawGeometry, testShapesets, trialShapesets, make_shared_from_ref(testTransformations()), make_shared_from_ref(kernels()), make_shared_from_ref(trialTransformations()), make_shared_from_ref(integral()), openClHandler, parallelizationOptions, verbosityLevel, cacheSingularIntegrals).release()); if (makeSeparateOffDiagonalAssembler) result.second.reset(quadStrategy.makeAssemblerForIntegralOperators( testGeometryFactory, trialGeometryFactory, testRawGeometry, trialRawGeometry, testShapesets, trialShapesets, make_shared_from_ref(offDiagonalTestTransformations()), make_shared_from_ref(offDiagonalKernels()), make_shared_from_ref(offDiagonalTrialTransformations()), make_shared_from_ref(offDiagonalIntegral()), openClHandler, parallelizationOptions, verbosityLevel, false /*cacheSingularIntegrals*/).release()); else result.second = result.first; return result; }