00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef SUNDANCE_FUNCTIONALGRADIENTASSEMBLYKERNEL_H
00032 #define SUNDANCE_FUNCTIONALGRADIENTASSEMBLYKERNEL_H
00033
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceVectorFillingAssemblyKernel.hpp"
00036 #include "SundanceFunctionalAssemblyKernel.hpp"
00037
00038 namespace Sundance
00039 {
00040 using namespace Teuchos;
00041
00042
00043
00044
00045
00046 class FunctionalGradientAssemblyKernel : public AssemblyKernelBase
00047 {
00048 public:
00049
00050 FunctionalGradientAssemblyKernel(const MPIComm& comm,
00051 const Array<RCP<DOFMapBase> >& dofMap,
00052 const Array<RCP<Array<int> > >& isBCIndex,
00053 const Array<int>& lowestLocalIndex,
00054 Array<Vector<double> >& grad,
00055 bool partitionBCs,
00056 double* value,
00057 int verb)
00058 : AssemblyKernelBase(verb),
00059 funcKernel_(rcp(new FunctionalAssemblyKernel(comm, value, verb))),
00060 vecKernel_(rcp(new VectorAssemblyKernel(dofMap, isBCIndex,
00061 lowestLocalIndex, grad, partitionBCs, verb)))
00062 {
00063 TEUCHOS_TEST_FOR_EXCEPTION(grad.size() != 1, std::logic_error,
00064 "assembly target in FunctionalGradientAssemblyKernel should not "
00065 "be a multivector");
00066 }
00067
00068
00069 void prepareForWorkSet(
00070 const Array<Set<int> >& requiredTests,
00071 const Array<Set<int> >& requiredUnks,
00072 RCP<StdFwkEvalMediator> mediator)
00073 {
00074 funcKernel_->prepareForWorkSet(requiredTests, requiredUnks, mediator);
00075 vecKernel_->prepareForWorkSet(requiredTests, requiredUnks, mediator);
00076 }
00077
00078
00079 void fill(bool isBC,
00080 const IntegralGroup& group,
00081 const RCP<Array<double> >& localValues)
00082 {
00083 if (group.isOneForm())
00084 {
00085 vecKernel_->fill(isBC, group, localValues);
00086 }
00087 else if (group.isZeroForm())
00088 {
00089 funcKernel_->fill(isBC, group, localValues);
00090 }
00091 else
00092 {
00093 TEUCHOS_TEST_FOR_EXCEPT(group.isTwoForm());
00094 }
00095 }
00096
00097
00098 void postLoopFinalization()
00099 {
00100 funcKernel_->postLoopFinalization();
00101 vecKernel_->postLoopFinalization();
00102 }
00103
00104
00105 void setVerb(int verb)
00106 {
00107 AssemblyKernelBase::setVerb(verb);
00108 funcKernel_->setVerb(verb);
00109 vecKernel_->setVerb(verb);
00110 }
00111
00112 private:
00113 RCP<FunctionalAssemblyKernel> funcKernel_;
00114 RCP<VectorAssemblyKernel> vecKernel_;
00115 };
00116
00117
00118 }
00119
00120
00121
00122 #endif