7#ifndef __LINEAR_FORMS_INTEGRATORS_HPP__
8#define __LINEAR_FORMS_INTEGRATORS_HPP__
13 template <
typename OpBase>
struct S {
S() =
delete; };
18 template <
typename OpBase>
struct S {
S() =
delete; };
22template <
int BASE_DIM,
int FIELD_DIM, IntegrationType I,
typename OpBase>
30template <
typename OpBase>
42 boost::shared_ptr<Range> ents_ptr =
nullptr)
44 sourceFun(source_fun) {}
56 boost::shared_ptr<Range> ents_ptr =
nullptr)
58 sourceFun(source_fun) {}
65template <
int FIELD_DIM,
typename OpBase>
79 boost::shared_ptr<Range> ents_ptr =
nullptr)
90 boost::shared_ptr<Range> ents_ptr =
nullptr)
92 sourceFun(source_fun) {}
99template <
int FIELD_DIM,
typename OpBase>
105 boost::shared_ptr<Range> ents_ptr =
nullptr)
107 sourceFun(source_fun) {}
110 boost::shared_ptr<Range> ents_ptr =
nullptr)
112 sourceFun(source_fun) {}
119template <
int BASE_DIM,
int S, IntegrationType I,
typename OpBase>
122template <
int S,
typename OpBase>
126 const std::string
field_name, boost::shared_ptr<VectorDouble> vec,
127 ScalarFun beta_coeff = [](
double,
double,
double)
constexpr {
return 1; },
128 boost::shared_ptr<Range> ents_ptr =
nullptr)
130 betaCoeff(beta_coeff) {}
142template <
int FIELD_DIM,
int S,
typename OpBase>
146 const std::string
field_name, boost::shared_ptr<MatrixDouble> vec,
147 ScalarFun beta_coeff = [](
double,
double,
double)
constexpr {
return 1; },
148 boost::shared_ptr<Range> ents_ptr =
nullptr)
150 betaCoeff(beta_coeff) {}
159template <
int FIELD_DIM,
int S,
typename OpBase>
163 const std::string
field_name, boost::shared_ptr<MatrixDouble> vec,
164 ScalarFun beta_coeff = [](
double,
double,
double)
constexpr {
return 1; },
165 boost::shared_ptr<Range> ents_ptr =
nullptr)
167 betaCoeff(beta_coeff) {}
180template <
int SPACE_DIM,
int S,
typename OpBase>
187 const std::string
field_name, boost::shared_ptr<MatrixDouble> mat_vals,
188 ScalarFun beta_coeff = [](
double,
double,
double)
constexpr {
return 1; },
189 boost::shared_ptr<Range> ents_ptr =
nullptr)
191 matVals(mat_vals), betaCoeff(beta_coeff) {}
199template <
int SPACE_DIM,
int S,
typename OpBase>
207 const std::string
field_name, boost::shared_ptr<MatrixDouble> mat_vals,
208 ScalarFun beta_coeff = [](
double,
double,
double)
constexpr {
return 1; },
209 boost::shared_ptr<Range> ents_ptr =
nullptr)
211 matVals(mat_vals), betaCoeff(beta_coeff) {}
223template <
int SPACE_DIM,
int S,
typename OpBase>
228 const std::string
field_name, boost::shared_ptr<MatrixDouble> mat_vals,
229 ScalarFun beta_coeff = [](
double,
double,
double)
constexpr {
return 1; })
231 betaCoeff(beta_coeff) {}
245template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
249 const std::string
field_name, boost::shared_ptr<MatrixDouble> mat_vals,
250 ScalarFun beta = [](
double,
double,
double) {
return 1; },
251 boost::shared_ptr<Range> ents_ptr =
nullptr)
253 matVals(mat_vals), betaConst(beta) {}
263template <
int SPACE_DIM,
typename OpBase>
266 const std::string
field_name, boost::shared_ptr<VectorDouble> vec_vals,
267 ScalarFun beta = [](
double,
double,
double)
constexpr {
return 1; },
268 boost::shared_ptr<Range> ents_ptr =
nullptr)
270 vecVals(vec_vals), betaConst(beta) {}
279template <
int FIELD_DIM,
typename OpBase>
284 const std::string
field_name, boost::shared_ptr<VectorDouble> vec,
285 ScalarFun beta = [](
double,
double,
double)
constexpr {
return 1; },
286 boost::shared_ptr<Range> ents_ptr =
nullptr)
296template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
299template <
int SPACE_DIM,
typename OpBase>
302 boost::shared_ptr<MatrixDouble> mat_vals)
311template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
314template <
int SPACE_DIM,
typename OpBase>
317 boost::shared_ptr<MatrixDouble> mat_vals)
337template <
int SPACE_DIM, IntegrationType I,
typename OpBase>
346template <
int FIELD_DIM, IntegrationType I,
typename OpBase>
351 OpBase>::OpNormalMixVecTimesScalarImpl;
354template <
typename OpBase>
358 ScalarFun source_fun = [](
double,
double,
double)
constexpr {
return 1; },
359 boost::shared_ptr<Range> ents_ptr =
nullptr)
361 sourceFun(source_fun) {}
369template <
typename OpBase>
373 ScalarFun source_fun = [](
double,
double,
double)
constexpr {
return 1; },
374 boost::shared_ptr<Range> ents_ptr =
nullptr)
376 sourceFun(source_fun) {}
388template <
int SPACE_DIM,
typename OpBase>
391 const std::string
field_name, boost::shared_ptr<MatrixDouble> u_ptr,
392 boost::shared_ptr<MatrixDouble> y_grad_ptr,
393 ConstantFun source_fun = []()
constexpr {
return 1; })
395 yGradPtr(y_grad_ptr), alphaConstant(source_fun) {}
398 boost::shared_ptr<MatrixDouble>
uPtr;
404template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
408 const std::string
field_name, boost::shared_ptr<MatrixDouble> u_ptr,
409 boost::shared_ptr<MatrixDouble> y_grad_ptr,
410 ConstantFun source_fun = []()
constexpr {
return 1; })
412 yGradPtr(y_grad_ptr), alphaConstant(source_fun) {}
415 boost::shared_ptr<MatrixDouble>
uPtr;
429template <
typename EleOp>
430template <AssemblyType A>
431template <IntegrationType I>
454 template <
int BASE_DIM,
int S = 1>
459 template <
int BASE_DIM,
int S = 1>
470 template <
int BASE_DIM,
int FIELD_DIM,
int S>
471 using OpBaseTimesVector =
487 template <
int BASE_DIM,
int FIELD_DIM,
int SPACE_DIM,
int S = 1>
501 template <
int BASE_DIM,
int FIELD_DIM,
int SPACE_DIM,
int S = 1>
502 using OpGradTimesSymTensor =
512 template <
int BASE_DIM,
int FIELD_DIM,
int SPACE_DIM>
513 using OpMixDivTimesU =
521 template <
int SPACE_DIM>
529 template <
int SPACE_DIM>
530 using OpMixVecTimesDivLambda =
543 template <
int SPACE_DIM>
544 using OpNormalMixVecTimesScalar =
559 template <
int BASE_DIM,
int FIELD_DIM,
int SPACE_DIM>
564template <
typename OpBase>
571 const double vol = OpBase::getMeasure();
573 auto t_w = OpBase::getFTensor0IntegrationWeight();
577 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
582 t_w * vol * sourceFun(t_coords(0), t_coords(1), t_coords(2));
597template <
int FIELD_DIM,
typename OpBase>
605 const double vol = OpBase::getMeasure();
607 auto t_w = OpBase::getFTensor0IntegrationWeight();
611 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
615 auto t_source = sourceFun(t_coords(0), t_coords(1), t_coords(2));
617 const double alpha = t_w * vol;
619 auto t_nf = getFTensor1FromArray<FIELD_DIM, FIELD_DIM>(
OpBase::locF);
622 t_nf(
i) += alpha * t_row_base * t_source(
i);
634template <
int FIELD_DIM,
typename OpBase>
641 const size_t nb_base_functions = row_data.
getN().size2() / 3;
643 const double vol = OpBase::getMeasure();
645 auto t_w = OpBase::getFTensor0IntegrationWeight();
649 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
653 auto t_source = sourceFun(t_coords(0), t_coords(1), t_coords(2));
655 const double alpha = t_w * vol;
662 for (; rr < nb_base_functions; ++rr)
670template <
int S,
typename OpBase>
676 const double vol = OpBase::getMeasure();
678 auto t_w = OpBase::getFTensor0IntegrationWeight();
682 auto t_vec = getFTensor0FromVec<S>(*sourceVec);
687 "Wrong number of integration points %d != %d",
693 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
698 t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
714template <
int FIELD_DIM,
int S,
typename OpBase>
720 const double vol = OpBase::getMeasure();
722 auto t_w = OpBase::getFTensor0IntegrationWeight();
726 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
728 auto t_vec = getFTensor1FromMat<FIELD_DIM, S>(*sourceVec);
733 t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
735 auto t_nf = OpBase::template getNf<FIELD_DIM>();
739 t_nf(
i) += alpha * t_row_base * t_vec(
i);
752template <
int FIELD_DIM,
int S,
typename OpBase>
757 const size_t nb_base_functions = row_data.
getN().size2() / 3;
759 const double vol = OpBase::getMeasure();
761 auto t_w = OpBase::getFTensor0IntegrationWeight();
765 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
767 auto t_vec = getFTensor1FromMat<FIELD_DIM, S>(*sourceVec);
772 t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
779 for (; rr < nb_base_functions; ++rr)
788template <
int SPACE_DIM,
int S,
typename OpBase>
795 const double vol = OpBase::getMeasure();
797 auto t_w = OpBase::getFTensor0IntegrationWeight();
801 auto t_val_grad = getFTensor1FromMat<SPACE_DIM, S>(*(matVals));
803 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
806 const double beta = vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
808 const double alpha = t_w * beta;
827template <
int SPACE_DIM,
int S,
typename OpBase>
834 const double vol = OpBase::getMeasure();
836 auto t_w = OpBase::getFTensor0IntegrationWeight();
840 auto t_val_grad = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(matVals));
842 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
847 t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
849 auto t_nf = OpBase::template getNf<SPACE_DIM>();
854 t_nf(
i) += alpha * (t_row_grad(
j) * t_val_grad(
i,
j));
869template <
int SPACE_DIM,
int S,
typename OpBase>
875 const double vol = OpBase::getMeasure();
877 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
879 auto t_w = OpBase::getFTensor0IntegrationWeight();
883 auto t_val_mat = getFTensor2SymmetricFromMat<SPACE_DIM, S>(*(matVals));
888 t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
890 auto t_nf = OpBase::template getNf<SPACE_DIM>();
895 t_nf(
j) += alpha * (t_row_grad(
i) * t_val_mat(
i,
j));
909template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
915 const size_t nb_base_functions = row_data.
getN().size2() / 3;
916 auto t_w = this->getFTensor0IntegrationWeight();
918 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
920 auto t_u = getFTensor1FromMat<FIELD_DIM>(*(matVals));
924 const double alpha = this->getMeasure() * t_w *
925 betaConst(t_coords(0), t_coords(1), t_coords(2));
926 auto t_nf = OpBase::template getNf<FIELD_DIM>();
929 for (; bb != this->nbRows /
FIELD_DIM; ++bb) {
930 const double t_div_base = t_diff_base(
j,
j);
931 t_nf(
i) += alpha * t_div_base * t_u(
i);
935 for (; bb < nb_base_functions; ++bb)
946template <
int SPACE_DIM,
typename OpBase>
951 const size_t nb_base_functions = row_data.
getN().size2() / 3;
952 auto t_w = this->getFTensor0IntegrationWeight();
954 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
960 const double alpha = this->getMeasure() * t_w *
961 betaConst(t_coords(0), t_coords(1), t_coords(2));
965 for (; bb != this->nbRows; ++bb) {
966 const double t_div_base = t_diff_base(
j,
j);
970 for (; bb < nb_base_functions; ++bb)
1001template <
int FIELD_DIM,
typename OpBase>
1009 const double vol = OpBase::getMeasure();
1011 auto t_w = OpBase::getFTensor0IntegrationWeight();
1013 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
1021 const double alpha =
1022 t_w * vol * betaCoeff(t_coords(0), t_coords(1), t_coords(2));
1023 auto t_nf = getFTensor1FromArray<FIELD_DIM, FIELD_DIM>(
OpBase::locF);
1027 t_nf(
i) += alpha * t_row_grad(
i) * t_vec;
1040template <
int SPACE_DIM,
typename OpBase>
1045 const size_t nb_base_functions = row_data.
getN().size2() / 3;
1046 auto t_w = this->getFTensor0IntegrationWeight();
1048 auto t_grad = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*(matVals));
1052 const double alpha = this->getMeasure() * t_w;
1053 auto t_nf = OpBase::template getNf<SPACE_DIM>();
1056 for (; bb != this->nbRows /
SPACE_DIM; ++bb) {
1057 t_nf(
i) += alpha * t_base(
j) * t_grad(
i,
j);
1061 for (; bb < nb_base_functions; ++bb)
1071template <
int SPACE_DIM,
typename OpBase>
1076 const size_t nb_base_functions = row_data.
getN().size2();
1077 auto t_w = this->getFTensor0IntegrationWeight();
1079 auto t_div = getFTensor1FromMat<SPACE_DIM>(*(matVals));
1082 const double alpha = this->getMeasure() * t_w;
1083 auto t_nf = OpBase::template getNf<SPACE_DIM>();
1086 for (; bb != this->nbRows /
SPACE_DIM; ++bb) {
1087 t_nf(
i) += alpha * t_base * t_div(
i);
1091 for (; bb < nb_base_functions; ++bb)
1101template <
typename OpBase>
1106 const size_t nb_base_functions = row_data.
getN().size2() / 3;
1108 const double vol = OpBase::getMeasure();
1110 auto t_w = OpBase::getFTensor0IntegrationWeight();
1114 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
1116 auto t_normal = OpBase::getFTensor1NormalsAtGaussPts();
1120 const double alpha = t_w * sourceFun(t_coords(0), t_coords(1), t_coords(2));
1127 for (; rr < nb_base_functions; ++rr)
1136template <
typename OpBase>
1141 const size_t nb_base_functions = row_data.
getN().size2() / 3;
1144 const double vol = OpBase::getMeasure();
1146 auto t_w = OpBase::getFTensor0IntegrationWeight();
1150 auto t_coords = OpBase::getFTensor1CoordsAtGaussPts();
1152 auto t_tangent = OpBase::getFTensor1TangentAtGaussPts();
1156 const double alpha = t_w * sourceFun(t_coords(0), t_coords(1), t_coords(2));
1166 for (; rr < nb_base_functions; ++rr)
1175template <
int SPACE_DIM,
typename OpBase>
1181 const size_t nb_base_functions = row_data.
getN().size2();
1182 auto t_w = this->getFTensor0IntegrationWeight();
1185 auto t_u = getFTensor1FromMat<SPACE_DIM>(*uPtr);
1186 auto t_grad_y = getFTensor1FromMat<SPACE_DIM>(*yGradPtr);
1189 const double alpha_constant = alphaConstant();
1193 const double vol = OpBase::getMeasure();
1194 const double c = (t_grad_y(
i) * t_u(
i)) * (t_w * vol * alpha_constant);
1213template <
int FIELD_DIM,
int SPACE_DIM,
typename OpBase>
1219 const size_t nb_base_functions = row_data.
getN().size2();
1220 auto t_w = this->getFTensor0IntegrationWeight();
1223 auto t_u = getFTensor1FromMat<SPACE_DIM>(*uPtr);
1224 auto t_grad_y = getFTensor2FromMat<FIELD_DIM, SPACE_DIM>(*yGradPtr);
1228 const double alpha_constant = alphaConstant();
1232 const double vol = OpBase::getMeasure();
1235 t_c(
J) = (t_grad_y(
J,
i) * t_u(
i)) * (t_w * vol * alpha_constant);
1237 auto t_nf = getFTensor1FromArray<FIELD_DIM, FIELD_DIM>(
OpBase::locF);
1240 t_nf(
J) += t_base * t_c(
J);
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesScalar< 1, 1 > OpBaseTimesScalar
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
constexpr std::enable_if<(Dim0<=2 &&Dim1<=2), Tensor2_Expr< Levi_Civita< T >, T, Dim0, Dim1, i, j > >::type levi_civita(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
levi_civita functions to make for easy adhoc use
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
boost::function< double(double)> TimeFun
Lambda function used to scale with time.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
boost::function< double()> ConstantFun
Constant function type.
constexpr IntegrationType I
constexpr auto field_name
OpBaseImpl< PETSC, EdgeEleOp > OpBase
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor2< FTensor::PackPtr< double *, Tensor_Dim0 *Tensor_Dim1 >, Tensor_Dim0, Tensor_Dim1 > getFTensor2DiffN(FieldApproximationBase base)
Get derivatives of base functions for Hdiv space.
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1N(FieldApproximationBase base)
Get base functions for Hdiv/Hcurl spaces.
VectorDouble locF
local entity vector
int nbRows
number of dofs on rows
int nbIntegrationPts
number of integration points
int nbRowBaseFunctions
number or row base functions
OpBaseTimesScalarImpl(const std::string field_name, boost::shared_ptr< VectorDouble > vec, ScalarFun beta_coeff=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
boost::shared_ptr< VectorDouble > sourceVec
boost::shared_ptr< MatrixDouble > sourceVec
OpBaseTimesVectorImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > vec, ScalarFun beta_coeff=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
FTensor::Index< 'i', FIELD_DIM > i
boost::shared_ptr< MatrixDouble > sourceVec
FTensor::Index< 'i', FIELD_DIM > i
OpBaseTimesVectorImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > vec, ScalarFun beta_coeff=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
boost::shared_ptr< MatrixDouble > yGradPtr
boost::shared_ptr< MatrixDouble > uPtr
ConstantFun alphaConstant
OpConvectiveTermRhsImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > u_ptr, boost::shared_ptr< MatrixDouble > y_grad_ptr, ConstantFun source_fun=[]() constexpr { return 1;})
boost::shared_ptr< MatrixDouble > uPtr
ConstantFun alphaConstant
OpConvectiveTermRhsImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > u_ptr, boost::shared_ptr< MatrixDouble > y_grad_ptr, ConstantFun source_fun=[]() constexpr { return 1;})
boost::shared_ptr< MatrixDouble > yGradPtr
OpGradTimesSymTensorImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > mat_vals, ScalarFun beta_coeff=[](double, double, double) constexpr { return 1;})
boost::shared_ptr< MatrixDouble > matVals
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'j', SPACE_DIM > j
OpGradTimesTensorImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > mat_vals, ScalarFun beta_coeff=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
FTensor::Index< 'i', SPACE_DIM > i
summit Index
boost::shared_ptr< MatrixDouble > matVals
OpGradTimesTensorImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > mat_vals, ScalarFun beta_coeff=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
boost::shared_ptr< MatrixDouble > matVals
FTensor::Index< 'j', SPACE_DIM > j
summit Index
FTensor::Index< 'i', SPACE_DIM > i
summit Index
OpMixDivTimesUImpl(const std::string field_name, boost::shared_ptr< VectorDouble > vec, ScalarFun beta=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
boost::shared_ptr< VectorDouble > sourceVec
FTensor::Index< 'j', SPACE_DIM > j
OpMixDivTimesUImpl(const std::string field_name, boost::shared_ptr< VectorDouble > vec_vals, ScalarFun beta=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
boost::shared_ptr< VectorDouble > vecVals
FTensor::Index< 'j', SPACE_DIM > j
boost::shared_ptr< MatrixDouble > matVals
OpMixDivTimesUImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > mat_vals, ScalarFun beta=[](double, double, double) { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
FTensor::Index< 'i', FIELD_DIM > i
boost::shared_ptr< MatrixDouble > matVals
FTensor::Index< 'j', SPACE_DIM > j
FTensor::Index< 'i', SPACE_DIM > i
OpMixTensorTimesGradUImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > mat_vals)
OpMixVecTimesDivLambdaImpl(const std::string field_name, boost::shared_ptr< MatrixDouble > mat_vals)
boost::shared_ptr< MatrixDouble > matVals
FTensor::Index< 'i', SPACE_DIM > i
OpNormalMixVecTimesScalarImpl(const std::string field_name, ScalarFun source_fun=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
FTensor::Index< 'i', 3 > i
FTensor::Index< 'i', 3 > i
OpNormalMixVecTimesScalarImpl(const std::string field_name, ScalarFun source_fun=[](double, double, double) constexpr { return 1;}, boost::shared_ptr< Range > ents_ptr=nullptr)
Multiply vector times normal on the face times scalar function.
OpSourceImpl(const std::string field_name, ScalarFun source_fun, boost::shared_ptr< Range > ents_ptr=nullptr)
Construct a new Op Source Impl object.
OpSourceImpl(const std::string field_name, TimeFun time_fun, ScalarFun source_fun, boost::shared_ptr< Range > ents_ptr=nullptr)
Construct a new Op Source Impl object.
VectorFun< FIELD_DIM > sourceFun
OpSourceImpl(const std::string field_name, VectorFun< FIELD_DIM > source_fun, boost::shared_ptr< Range > ents_ptr=nullptr)
Construct a new Op Source Impl object.
OpSourceImpl(const std::string field_name, TimeFun time_fun, VectorFun< FIELD_DIM > source_fun, boost::shared_ptr< Range > ents_ptr=nullptr)
Construct a new Op Source Impl object.
OpSourceImpl(const std::string field_name, TimeFun time_fun, VectorFun< FIELD_DIM > source_fun, boost::shared_ptr< Range > ents_ptr=nullptr)
OpSourceImpl(const std::string field_name, VectorFun< FIELD_DIM > source_fun, boost::shared_ptr< Range > ents_ptr=nullptr)
VectorFun< FIELD_DIM > sourceFun
SourceBoundaryNormalSpecialization()=delete
SourceFunctionSpecialization()=delete