BoundaryOperator<BasisFunctionType, ResultType> laplace3dSingleLayerBoundaryOperator( const shared_ptr<const Context<BasisFunctionType, ResultType> >& context, const shared_ptr<const Space<BasisFunctionType> >& domain, const shared_ptr<const Space<BasisFunctionType> >& range, const shared_ptr<const Space<BasisFunctionType> >& dualToRange, const std::string& label, int symmetry) { const AssemblyOptions& assemblyOptions = context->assemblyOptions(); if (assemblyOptions.assemblyMode() == AssemblyOptions::ACA && assemblyOptions.acaOptions().mode == AcaOptions::LOCAL_ASSEMBLY) return laplace3dSyntheticBoundaryOperator( &laplace3dSingleLayerBoundaryOperator<BasisFunctionType, ResultType>, context, domain, range, dualToRange, label, symmetry, // maximum synthese symmetry (if spaces match) (boost::is_complex<BasisFunctionType>() ? 0 : SYMMETRIC) | HERMITIAN); typedef typename ScalarTraits<BasisFunctionType>::RealType KernelType; typedef typename ScalarTraits<BasisFunctionType>::RealType CoordinateType; typedef Fiber::Laplace3dSingleLayerPotentialKernelFunctor<KernelType> KernelFunctor; typedef Fiber::ScalarFunctionValueFunctor<CoordinateType> TransformationFunctor; typedef Fiber::SimpleTestScalarKernelTrialIntegrandFunctorExt< BasisFunctionType, KernelType, ResultType, 1> IntegrandFunctor; typedef GeneralElementarySingularIntegralOperator< BasisFunctionType, KernelType, ResultType> Op; shared_ptr<Fiber::TestKernelTrialIntegral< BasisFunctionType, KernelType, ResultType> > integral; if (shouldUseBlasInQuadrature(assemblyOptions, *domain, *dualToRange)) integral.reset(new Fiber::TypicalTestScalarKernelTrialIntegral< BasisFunctionType, KernelType, ResultType>()); else integral.reset(new Fiber::DefaultTestKernelTrialIntegral<IntegrandFunctor>( IntegrandFunctor())); shared_ptr<Op> newOp(new Op( domain, range, dualToRange, label, symmetry, KernelFunctor(), TransformationFunctor(), TransformationFunctor(), integral)); return BoundaryOperator<BasisFunctionType, ResultType>(context, newOp); }
BoundaryOperator<BasisFunctionType, ResultType> modifiedHelmholtz3dAdjointDoubleLayerBoundaryOperator( const shared_ptr<const Context<BasisFunctionType, ResultType>> &context, const shared_ptr<const Space<BasisFunctionType>> &domain, const shared_ptr<const Space<BasisFunctionType>> &range, const shared_ptr<const Space<BasisFunctionType>> &dualToRange, KernelType waveNumber, const std::string &label, int symmetry, bool useInterpolation, int interpPtsPerWavelength) { const AssemblyOptions &assemblyOptions = context->assemblyOptions(); if (assemblyOptions.assemblyMode() == AssemblyOptions::ACA && assemblyOptions.acaOptions().mode == AcaOptions::LOCAL_ASSEMBLY) return modifiedHelmholtz3dSyntheticBoundaryOperator( &modifiedHelmholtz3dAdjointDoubleLayerBoundaryOperator< BasisFunctionType, KernelType, ResultType>, context, domain, range, dualToRange, waveNumber, label, symmetry, useInterpolation, interpPtsPerWavelength, NO_SYMMETRY); typedef typename ScalarTraits<BasisFunctionType>::RealType CoordinateType; typedef Fiber::ModifiedHelmholtz3dAdjointDoubleLayerPotentialKernelFunctor< KernelType> NoninterpolatedKernelFunctor; typedef Fiber:: ModifiedHelmholtz3dAdjointDoubleLayerPotentialKernelInterpolatedFunctor< KernelType> InterpolatedKernelFunctor; typedef Fiber::ScalarFunctionValueFunctor<CoordinateType> TransformationFunctor; typedef Fiber::SimpleTestScalarKernelTrialIntegrandFunctorExt< BasisFunctionType, KernelType, ResultType, 1> IntegrandFunctor; if (!domain || !range || !dualToRange) throw std::invalid_argument( "modifiedHelmholtz3dAdjointDoubleLayerBoundaryOperator(): " "domain, range and dualToRange must not be null"); shared_ptr<Fiber::TestKernelTrialIntegral<BasisFunctionType, KernelType, ResultType>> integral; if (shouldUseBlasInQuadrature(assemblyOptions, *domain, *dualToRange)) integral.reset(new Fiber::TypicalTestScalarKernelTrialIntegral< BasisFunctionType, KernelType, ResultType>()); else integral.reset(new Fiber::DefaultTestKernelTrialIntegral<IntegrandFunctor>( IntegrandFunctor())); typedef GeneralElementarySingularIntegralOperator<BasisFunctionType, KernelType, ResultType> Op; shared_ptr<Op> newOp; if (useInterpolation) newOp.reset( new Op(domain, range, dualToRange, label, symmetry, InterpolatedKernelFunctor( waveNumber, 1.1 * maxDistance(*domain->grid(), *dualToRange->grid()), interpPtsPerWavelength), TransformationFunctor(), TransformationFunctor(), integral)); else newOp.reset(new Op(domain, range, dualToRange, label, symmetry, NoninterpolatedKernelFunctor(waveNumber), TransformationFunctor(), TransformationFunctor(), integral)); return BoundaryOperator<BasisFunctionType, ResultType>(context, newOp); }
BoundaryOperator<BasisFunctionType, ResultType> modifiedHelmholtz3dHypersingularBoundaryOperator( const shared_ptr<const Context<BasisFunctionType, ResultType>> &context, const shared_ptr<const Space<BasisFunctionType>> &domain, const shared_ptr<const Space<BasisFunctionType>> &range, const shared_ptr<const Space<BasisFunctionType>> &dualToRange, KernelType waveNumber, const std::string &label, int symmetry, bool useInterpolation, int interpPtsPerWavelength, const BoundaryOperator<BasisFunctionType, ResultType> &externalSlp) { const AssemblyOptions &assemblyOptions = context->assemblyOptions(); if ((assemblyOptions.assemblyMode() == AssemblyOptions::ACA && assemblyOptions.acaOptions().mode == AcaOptions::LOCAL_ASSEMBLY) || externalSlp.isInitialized()) return modifiedHelmholtz3dSyntheticHypersingularBoundaryOperator( context, domain, range, dualToRange, waveNumber, label, symmetry, useInterpolation, interpPtsPerWavelength, externalSlp); typedef typename ScalarTraits<BasisFunctionType>::RealType CoordinateType; typedef Fiber::ModifiedHelmholtz3dHypersingularKernelFunctor<KernelType> NoninterpolatedKernelFunctor; typedef Fiber::ModifiedHelmholtz3dHypersingularKernelInterpolatedFunctor< KernelType> InterpolatedKernelFunctor; typedef Fiber::ModifiedHelmholtz3dHypersingularTransformationFunctor< CoordinateType> TransformationFunctor; typedef Fiber::ModifiedHelmholtz3dHypersingularIntegrandFunctor2< BasisFunctionType, KernelType, ResultType> IntegrandFunctor; typedef Fiber::ModifiedHelmholtz3dHypersingularTransformationFunctor2< CoordinateType> TransformationFunctorWithBlas; typedef Fiber:: ModifiedHelmholtz3dHypersingularOffDiagonalInterpolatedKernelFunctor< KernelType> OffDiagonalInterpolatedKernelFunctor; typedef Fiber::ModifiedHelmholtz3dHypersingularOffDiagonalKernelFunctor< KernelType> OffDiagonalNoninterpolatedKernelFunctor; typedef Fiber::ScalarFunctionValueFunctor<CoordinateType> OffDiagonalTransformationFunctor; typedef Fiber::SimpleTestScalarKernelTrialIntegrandFunctorExt< BasisFunctionType, KernelType, ResultType, 1> OffDiagonalIntegrandFunctor; CoordinateType maxDistance_ = static_cast<CoordinateType>(1.1) * maxDistance(*domain->grid(), *dualToRange->grid()); shared_ptr<Fiber::TestKernelTrialIntegral<BasisFunctionType, KernelType, ResultType>> integral, offDiagonalIntegral; if (shouldUseBlasInQuadrature(assemblyOptions, *domain, *dualToRange)) { integral.reset(new Fiber::TypicalTestScalarKernelTrialIntegral< BasisFunctionType, KernelType, ResultType>()); offDiagonalIntegral = integral; } else { integral.reset(new Fiber::DefaultTestKernelTrialIntegral<IntegrandFunctor>( IntegrandFunctor())); offDiagonalIntegral.reset( new Fiber::DefaultTestKernelTrialIntegral<OffDiagonalIntegrandFunctor>( OffDiagonalIntegrandFunctor())); } typedef GeneralHypersingularIntegralOperator<BasisFunctionType, KernelType, ResultType> Op; shared_ptr<Op> newOp; if (shouldUseBlasInQuadrature(assemblyOptions, *domain, *dualToRange)) { shared_ptr<Fiber::TestKernelTrialIntegral<BasisFunctionType, KernelType, ResultType>> integral, offDiagonalIntegral; integral.reset(new Fiber::TypicalTestScalarKernelTrialIntegral< BasisFunctionType, KernelType, ResultType>()); offDiagonalIntegral = integral; if (useInterpolation) newOp.reset(new Op( domain, range, dualToRange, label, symmetry, InterpolatedKernelFunctor(waveNumber, maxDistance_, interpPtsPerWavelength), TransformationFunctorWithBlas(), TransformationFunctorWithBlas(), integral, OffDiagonalInterpolatedKernelFunctor( waveNumber, maxDistance_, interpPtsPerWavelength), OffDiagonalTransformationFunctor(), OffDiagonalTransformationFunctor(), offDiagonalIntegral)); else newOp.reset(new Op( domain, range, dualToRange, label, symmetry, NoninterpolatedKernelFunctor(waveNumber), TransformationFunctorWithBlas(), TransformationFunctorWithBlas(), integral, OffDiagonalNoninterpolatedKernelFunctor(waveNumber), OffDiagonalTransformationFunctor(), OffDiagonalTransformationFunctor(), offDiagonalIntegral)); } else { // no blas if (useInterpolation) newOp.reset(new Op( domain, range, dualToRange, label, symmetry, InterpolatedKernelFunctor(waveNumber, maxDistance_, interpPtsPerWavelength), TransformationFunctor(), TransformationFunctor(), IntegrandFunctor(), OffDiagonalInterpolatedKernelFunctor(waveNumber, maxDistance_, interpPtsPerWavelength), OffDiagonalTransformationFunctor(), OffDiagonalTransformationFunctor(), OffDiagonalIntegrandFunctor())); else newOp.reset(new Op( domain, range, dualToRange, label, symmetry, NoninterpolatedKernelFunctor(waveNumber), TransformationFunctor(), TransformationFunctor(), IntegrandFunctor(), OffDiagonalNoninterpolatedKernelFunctor(waveNumber), OffDiagonalTransformationFunctor(), OffDiagonalTransformationFunctor(), OffDiagonalIntegrandFunctor())); } return BoundaryOperator<BasisFunctionType, ResultType>(context, newOp); }