5 boost::shared_ptr<VectorDouble> p_ptr,
6 boost::shared_ptr<VectorDouble> lift_ptr,
7 boost::shared_ptr<Range> ents_ptr)
10 std::fill(&doEntities[MBVERTEX], &doEntities[MBMAXTYPE],
false);
11 doEntities[MBEDGE] =
true;
14 MoFEMErrorCode
doWork(
int row_side, EntityType row_type,
15 EntitiesFieldData::EntData &data) {
18 const auto fe_ent = getFEEntityHandle();
21 auto t_w = getFTensor0IntegrationWeight();
22 auto t_p = getFTensor0FromVec(*
pPtr);
23 auto t_normal = getFTensor1Normal();
24 auto t_coords = getFTensor1CoordsAtGaussPts();
25 auto t_lift = getFTensor1FromArray<SPACE_DIM, SPACE_DIM>(*
liftPtr);
27 const auto nb_int_points = getGaussPts().size2();
29 for (
int gg = 0; gg != nb_int_points; gg++) {
31 const double r = t_coords(0);
33 t_lift(
i) -= t_normal(
i) * (t_p * alpha);
45 boost::shared_ptr<VectorDouble>
pPtr;
52 boost::shared_ptr<MatrixDouble> u_ptr)
57 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data) {
60 auto t_w = getFTensor0IntegrationWeight();
61 auto t_normal = getFTensor1Normal();
62 auto t_u = getFTensor1FromMat<SPACE_DIM>(*
uPtr);
63 auto t_row_base = row_data.getFTensor0N();
64 auto t_coords = getFTensor1CoordsAtGaussPts();
66 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
68 const double r = t_coords(0);
72 for (; bb != nbRows; ++bb) {
73 locF[bb] += alpha * t_row_base * (t_normal(
i) * t_u(
i));
77 for (; bb < nbRowBaseFunctions; ++bb)
89 boost::shared_ptr<MatrixDouble>
uPtr;
94 boost::shared_ptr<VectorDouble> lambda_ptr)
99 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data) {
102 auto t_w = getFTensor0IntegrationWeight();
103 auto t_normal = getFTensor1Normal();
104 auto t_lambda = getFTensor0FromVec(*
lambdaPtr);
105 auto t_row_base = row_data.getFTensor0N();
106 auto t_coords = getFTensor1CoordsAtGaussPts();
108 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
110 auto t_nf = getFTensor1FromArray<U_FIELD_DIM, U_FIELD_DIM>(locF);
112 const double r = t_coords(0);
118 t_nf(
i) += alpha * t_row_base * t_normal(
i) * t_lambda;
123 for (; bb < nbRowBaseFunctions; ++bb)
140 boost::shared_ptr<MatrixDouble> grad_h_ptr,
141 boost::shared_ptr<Range> ents_ptr =
nullptr,
147 MoFEMErrorCode
iNtegrate(DataForcesAndSourcesCore::EntData &row_data) {
150 if (
entsPtr->find(AssemblyBoundaryEleOp::getFEEntityHandle()) ==
154 const double area = getMeasure();
155 auto t_w = getFTensor0IntegrationWeight();
156 auto t_row_base = row_data.getFTensor0N();
157 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
158 auto t_coords = getFTensor1CoordsAtGaussPts();
162 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
164 const double r = t_coords(0);
166 const double h_grad_norm = sqrt(t_grad_h(
i) * t_grad_h(
i) +
eps);
167 const double cos_angle = std::cos(M_PI *
wettingAngle / 180);
168 const double rhs_wetting = s *
eta2 * h_grad_norm * cos_angle;
173 for (; bb != nbRows; ++bb) {
174 locF[bb] += alpha * t_row_base * rhs_wetting;
178 for (; bb < nbRowBaseFunctions; ++bb)
198 const std::string field_name_col)
201 assembleTranspose =
true;
205 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
206 EntitiesFieldData::EntData &col_data) {
209 auto t_w = getFTensor0IntegrationWeight();
210 auto t_normal = getFTensor1Normal();
211 auto t_row_base = row_data.getFTensor0N();
212 auto t_coords = getFTensor1CoordsAtGaussPts();
214 for (
int gg = 0; gg != nbIntegrationPts; ++gg) {
216 auto t_mat = getFTensor1FromPtr<U_FIELD_DIM>(&locMat(0, 0));
218 const double r = t_coords(0);
222 for (; rr != nbRows; ++rr) {
224 auto t_col_base = col_data.getFTensor0N(gg, 0);
225 const double a = alpha * t_row_base;
227 for (
int cc = 0; cc != nbCols /
U_FIELD_DIM; ++cc) {
228 t_mat(
i) += (
a * t_col_base) * t_normal(
i);
235 for (; rr < nbRowBaseFunctions; ++rr)
249 const std::string row_field_name,
250 boost::shared_ptr<MatrixDouble> grad_h_ptr,
251 boost::shared_ptr<std::vector<VectorInt>> col_ind_ptr,
252 boost::shared_ptr<std::vector<MatrixDouble>> col_diff_base_ptr,
253 boost::shared_ptr<Range> ents_ptr =
nullptr,
double wetting_angle = 0)
259 MoFEMErrorCode
doWork(
int side, EntityType type,
260 DataForcesAndSourcesCore::EntData &data) {
263 if (
entsPtr->find(BoundaryEleOp::getFEEntityHandle()) ==
entsPtr->end())
266 const double area = getMeasure();
268 const auto row_size = data.getIndices().size();
272 auto integrate = [&](
auto col_indicies,
auto &col_diff_base_functions) {
275 const auto col_size = col_indicies.size();
277 locMat.resize(row_size, col_size,
false);
279 int nb_gp = getGaussPts().size2();
280 int nb_rows = data.getIndices().size();
282 auto t_w = getFTensor0IntegrationWeight();
283 auto t_coords = getFTensor1CoordsAtGaussPts();
284 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
285 auto t_row_base = data.getFTensor0N();
286 int nb_row_base_functions = data.getN().size2();
290 for (
int gg = 0; gg != nb_gp; ++gg) {
292 const double r = t_coords(0);
294 const double h_grad_norm = sqrt(t_grad_h(
i) * t_grad_h(
i) +
eps);
295 const double one_over_h_grad_norm = 1. / h_grad_norm;
296 const double beta = s * alpha *
eta2 * one_over_h_grad_norm *
300 for (; rr != nb_rows; ++rr) {
301 const double delta = beta * t_row_base;
303 auto ptr = &col_diff_base_functions(gg, 0);
304 auto t_col_diff_base = getFTensor1FromPtr<SPACE_DIM>(ptr);
306 for (
int cc = 0; cc != col_size; ++cc) {
307 locMat(rr, cc) += t_col_diff_base(
i) * (
delta * t_grad_h(
i));
313 for (; rr < nb_row_base_functions; ++rr) {
327 auto &col_ind = (*colIndicesPtr)[
c];
328 if (col_ind.size()) {
329 auto &diff_base = (*colDiffBaseFunctionsPtr)[
c];
331 CHKERR integrate(col_ind, diff_base);
333 CHKERR MatSetValues(getKSPB(), data.getIndices().size(),
334 &*data.getIndices().begin(), col_ind.size(),
335 &*col_ind.begin(), &
locMat(0, 0), ADD_VALUES);
359 boost::shared_ptr<MatrixDouble> dot_u_ptr,
360 boost::shared_ptr<MatrixDouble> u_ptr,
361 boost::shared_ptr<MatrixDouble> grad_u_ptr,
362 boost::shared_ptr<VectorDouble> h_ptr,
363 boost::shared_ptr<MatrixDouble> grad_h_ptr,
364 boost::shared_ptr<VectorDouble> g_ptr,
365 boost::shared_ptr<VectorDouble> p_ptr)
370 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &data) {
373 const double vol = getMeasure();
374 auto t_dot_u = getFTensor1FromMat<U_FIELD_DIM>(*
dotUPtr);
375 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
376 auto t_p = getFTensor0FromVec(*
pPtr);
377 auto t_grad_u = getFTensor2FromMat<U_FIELD_DIM, SPACE_DIM>(*
gradUPtr);
378 auto t_h = getFTensor0FromVec(*
hPtr);
379 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
380 auto t_g = getFTensor0FromVec(*
gPtr);
381 auto t_coords = getFTensor1CoordsAtGaussPts();
383 auto t_base = data.getFTensor0N();
384 auto t_diff_base = data.getFTensor1DiffN<
SPACE_DIM>();
386 auto t_w = getFTensor0IntegrationWeight();
400 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
402 const double r = t_coords(0);
410 t_inertia_force(
i) = (
rho * alpha) * (t_dot_u(
i));
413 t_phase_force(
i) = -alpha *
kappa * t_g * t_grad_h(
i);
414 t_convection(
i) = (
rho * alpha) * (t_u(
j) * t_grad_u(
i,
j));
417 alpha * (t_D(
i,
j,
k,
l) * t_grad_u(
k,
l) +
t_kd(
i,
j) * t_p);
419 auto t_nf = getFTensor1FromArray<U_FIELD_DIM, U_FIELD_DIM>(locF);
421 t_forces(
i) = t_inertia_force(
i) + t_buoyancy(
i) + t_gravity(
i) +
422 t_convection(
i) + t_phase_force(
i);
427 t_nf(
i) += t_base * t_forces(
i);
428 t_nf(
i) += t_diff_base(
j) * t_stress(
i,
j);
431 t_nf(0) += (t_base * (alpha / t_coords(0))) * (2 *
mu * t_u(0) + t_p);
439 for (; bb < nbRowBaseFunctions; ++bb) {
461 boost::shared_ptr<MatrixDouble>
uPtr;
463 boost::shared_ptr<VectorDouble>
hPtr;
465 boost::shared_ptr<VectorDouble>
gPtr;
466 boost::shared_ptr<VectorDouble>
pPtr;
476 boost::shared_ptr<MatrixDouble> grad_u_ptr,
477 boost::shared_ptr<VectorDouble> h_ptr)
482 assembleTranspose =
false;
485 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
486 EntitiesFieldData::EntData &col_data) {
489 const double vol = getMeasure();
490 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
491 auto t_grad_u = getFTensor2FromMat<U_FIELD_DIM, SPACE_DIM>(*
gradUPtr);
492 auto t_h = getFTensor0FromVec(*
hPtr);
493 auto t_coords = getFTensor1CoordsAtGaussPts();
495 auto t_row_base = row_data.getFTensor0N();
496 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
498 auto t_w = getFTensor0IntegrationWeight();
500 auto get_mat = [&](
const int rr) {
501 return getFTensor2FromArray<SPACE_DIM, SPACE_DIM, SPACE_DIM>(locMat, rr);
504 auto ts_a = getTSa();
507 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
509 const double r = t_coords(0);
514 const double beta0 = alpha *
rho;
515 const double beta1 = beta0 * ts_a;
522 auto t_col_base = col_data.getFTensor0N(gg, 0);
523 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
529 t_d_stress(
l,
j,
k) = t_D(
i,
j,
k,
l) * (alpha * t_row_diff_base(
i));
531 for (
int cc = 0; cc != nbCols /
U_FIELD_DIM; ++cc) {
533 const double bb = t_row_base * t_col_base;
535 t_mat(
i,
j) += (beta1 * bb) *
t_kd(
i,
j);
536 t_mat(
i,
j) += (beta0 * bb) * t_grad_u(
i,
j);
538 (beta0 * t_row_base) *
t_kd(
i,
j) * (t_col_diff_base(
k) * t_u(
k));
539 t_mat(
i,
j) += t_d_stress(
i,
j,
k) * t_col_diff_base(
k);
542 t_mat(0, 0) += (bb * (alpha / t_coords(0))) * (2 *
mu);
554 for (; rr < nbRowBaseFunctions; ++rr) {
571 boost::shared_ptr<MatrixDouble>
uPtr;
573 boost::shared_ptr<VectorDouble>
hPtr;
578 using UDO = ForcesAndSourcesCore::UserDataOperator;
582 boost::shared_ptr<std::vector<VectorInt>> col_indices_ptr,
583 boost::shared_ptr<std::vector<MatrixDouble>> col_diff_basefunctions_ptr)
587 MoFEMErrorCode
doWork(
int side, EntityType type,
588 DataForcesAndSourcesCore::EntData &data) {
591 if (type == MBVERTEX) {
613 OpLhsU_dH(
const std::string field_name_u,
const std::string field_name_h,
614 boost::shared_ptr<MatrixDouble> dot_u_ptr,
615 boost::shared_ptr<MatrixDouble> u_ptr,
616 boost::shared_ptr<MatrixDouble> grad_u_ptr,
617 boost::shared_ptr<VectorDouble> h_ptr,
618 boost::shared_ptr<VectorDouble> g_ptr)
624 assembleTranspose =
false;
627 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
628 EntitiesFieldData::EntData &col_data) {
631 const double vol = getMeasure();
632 auto t_dot_u = getFTensor1FromMat<U_FIELD_DIM>(*
dotUPtr);
633 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
634 auto t_grad_u = getFTensor2FromMat<U_FIELD_DIM, SPACE_DIM>(*
gradUPtr);
635 auto t_h = getFTensor0FromVec(*
hPtr);
636 auto t_g = getFTensor0FromVec(*
gPtr);
637 auto t_coords = getFTensor1CoordsAtGaussPts();
639 auto t_row_base = row_data.getFTensor0N();
640 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
642 auto t_w = getFTensor0IntegrationWeight();
652 t_buoyancy_dh(
i) = 0;
655 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
657 const double r = t_coords(0);
663 auto t_D_dh =
get_D(2 * mu_dh);
665 t_inertia_force_dh(
i) = (alpha * rho_dh) * t_dot_u(
i);
667 t_gravity_dh(
SPACE_DIM - 1) = (alpha * rho_dh *
a0);
668 t_convection_dh(
i) = (rho_dh * alpha) * (t_u(
j) * t_grad_u(
i,
j));
669 const double t_phase_force_g_dh = -alpha *
kappa * t_g;
670 t_forces_dh(
i) = t_inertia_force_dh(
i) + t_buoyancy_dh(
i) +
671 t_gravity_dh(
i) + t_convection_dh(
i);
673 t_stress_dh(
i,
j) = alpha * (t_D_dh(
i,
j,
k,
l) * t_grad_u(
k,
l));
679 getFTensor1FromMat<U_FIELD_DIM, 1>(locMat, rr *
U_FIELD_DIM);
680 auto t_col_base = col_data.getFTensor0N(gg, 0);
681 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
683 for (
int cc = 0; cc != nbCols; ++cc) {
685 const double bb = t_row_base * t_col_base;
686 t_mat(
i) += t_forces_dh(
i) * bb;
687 t_mat(
i) += (t_phase_force_g_dh * t_row_base) * t_col_diff_base(
i);
688 t_mat(
i) += (t_row_diff_base(
j) * t_col_base) * t_stress_dh(
i,
j);
691 t_mat(0) += (bb * (alpha / t_coords(0))) * (2 * mu_dh * t_u(0));
703 for (; rr < nbRowBaseFunctions; ++rr) {
722 boost::shared_ptr<MatrixDouble>
uPtr;
724 boost::shared_ptr<VectorDouble>
hPtr;
725 boost::shared_ptr<VectorDouble>
gPtr;
734 OpLhsU_dG(
const std::string field_name_u,
const std::string field_name_h,
735 boost::shared_ptr<MatrixDouble> grad_h_ptr)
740 assembleTranspose =
false;
743 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
744 EntitiesFieldData::EntData &col_data) {
747 const double vol = getMeasure();
748 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
749 auto t_coords = getFTensor1CoordsAtGaussPts();
751 auto t_row_base = row_data.getFTensor0N();
752 auto t_w = getFTensor0IntegrationWeight();
754 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
756 const double r = t_coords(0);
760 t_phase_force_dg(
i) = -alpha *
kappa * t_grad_h(
i);
765 getFTensor1FromMat<U_FIELD_DIM, 1>(locMat, rr *
U_FIELD_DIM);
766 auto t_col_base = col_data.getFTensor0N(gg, 0);
768 for (
int cc = 0; cc != nbCols; ++cc) {
769 const double bb = t_row_base * t_col_base;
770 t_mat(
i) += t_phase_force_dg(
i) * bb;
779 for (; rr < nbRowBaseFunctions; ++rr) {
798 boost::shared_ptr<VectorDouble> dot_h_ptr,
799 boost::shared_ptr<VectorDouble> h_ptr,
800 boost::shared_ptr<MatrixDouble> grad_h_ptr,
801 boost::shared_ptr<MatrixDouble> grad_g_ptr)
806 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &data) {
809 const double vol = getMeasure();
810 auto t_w = getFTensor0IntegrationWeight();
811 auto t_coords = getFTensor1CoordsAtGaussPts();
812 auto t_base = data.getFTensor0N();
813 auto t_diff_base = data.getFTensor1DiffN<
SPACE_DIM>();
816 if (data.getDiffN().size1() != data.getN().size1())
818 if (data.getDiffN().size2() != data.getN().size2() *
SPACE_DIM) {
820 <<
"Side " << rowSide <<
" " << CN::EntityTypeName(rowType);
821 MOFEM_LOG(
"SELF", Sev::error) << data.getN();
822 MOFEM_LOG(
"SELF", Sev::error) << data.getDiffN();
829 auto t_h = getFTensor0FromVec(*
hPtr);
830 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
832 for (
int gg = 0; gg != nbIntegrationPts; ++gg) {
834 const double r = t_coords(0);
837 const double set_h =
init_h(t_coords(0), t_coords(1), t_coords(2));
838 const double m =
get_M(set_h) * alpha;
841 for (; bb != nbRows; ++bb) {
842 locF[bb] += (t_base * alpha) * (t_h - set_h);
843 locF[bb] += (t_diff_base(
i) *
m) * t_grad_g(
i);
848 for (; bb < nbRowBaseFunctions; ++bb) {
862 auto t_dot_h = getFTensor0FromVec(*
dotHPtr);
863 auto t_h = getFTensor0FromVec(*
hPtr);
864 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
865 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
866 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
868 for (
int gg = 0; gg != nbIntegrationPts; ++gg) {
870 const double r = t_coords(0);
873 const double m =
get_M(t_h) * alpha;
876 for (; bb != nbRows; ++bb) {
877 locF[bb] += (t_base * alpha) * (t_dot_h);
878 locF[bb] += (t_base * alpha) * (t_grad_h(
i) * t_u(
i));
879 locF[bb] += (t_diff_base(
i) * t_grad_g(
i)) *
m;
884 for (; bb < nbRowBaseFunctions; ++bb) {
904 boost::shared_ptr<MatrixDouble>
uPtr;
906 boost::shared_ptr<VectorDouble>
hPtr;
916 OpLhsH_dU(
const std::string h_field_name,
const std::string u_field_name,
917 boost::shared_ptr<MatrixDouble> grad_h_ptr)
922 assembleTranspose =
false;
924 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
925 EntitiesFieldData::EntData &col_data) {
928 const double vol = getMeasure();
929 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
930 auto t_coords = getFTensor1CoordsAtGaussPts();
932 auto t_row_base = row_data.getFTensor0N();
933 auto t_w = getFTensor0IntegrationWeight();
935 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
937 const auto r = t_coords(0);
939 auto t_mat = getFTensor1FromPtr<U_FIELD_DIM>(&locMat(0, 0));
943 for (; rr != nbRows; ++rr) {
944 t_row(
i) = (alpha * t_row_base) * t_grad_h(
i);
945 auto t_col_base = col_data.getFTensor0N(gg, 0);
946 for (
int cc = 0; cc != nbCols /
U_FIELD_DIM; ++cc) {
947 t_mat(
i) += t_row(
i) * t_col_base;
954 for (; rr < nbRowBaseFunctions; ++rr)
976 boost::shared_ptr<VectorDouble> h_ptr,
977 boost::shared_ptr<MatrixDouble> grad_g_ptr)
984 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
985 EntitiesFieldData::EntData &col_data) {
988 const double vol = getMeasure();
989 auto t_w = getFTensor0IntegrationWeight();
990 auto t_coords = getFTensor1CoordsAtGaussPts();
991 auto t_row_base = row_data.getFTensor0N();
992 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
995 if (row_data.getDiffN().size1() != row_data.getN().size1())
997 if (row_data.getDiffN().size2() != row_data.getN().size2() *
SPACE_DIM) {
999 <<
"Side " << rowSide <<
" " << CN::EntityTypeName(rowType);
1000 MOFEM_LOG(
"SELF", Sev::error) << row_data.getN();
1001 MOFEM_LOG(
"SELF", Sev::error) << row_data.getDiffN();
1005 if (col_data.getDiffN().size1() != col_data.getN().size1())
1007 if (col_data.getDiffN().size2() != col_data.getN().size2() *
SPACE_DIM) {
1009 <<
"Side " << rowSide <<
" " << CN::EntityTypeName(rowType);
1010 MOFEM_LOG(
"SELF", Sev::error) << col_data.getN();
1011 MOFEM_LOG(
"SELF", Sev::error) << col_data.getDiffN();
1018 auto t_h = getFTensor0FromVec(*
hPtr);
1019 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
1021 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
1023 const double r = t_coords(0);
1027 for (; rr != nbRows; ++rr) {
1029 auto t_col_base = col_data.getFTensor0N(gg, 0);
1030 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1032 for (
int cc = 0; cc != nbCols; ++cc) {
1034 locMat(rr, cc) += (t_row_base * t_col_base * alpha);
1044 for (; rr < nbRowBaseFunctions; ++rr) {
1057 auto t_h = getFTensor0FromVec(*
hPtr);
1058 auto t_grad_g = getFTensor1FromMat<SPACE_DIM>(*
gradGPtr);
1059 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
1061 auto ts_a = getTSa();
1063 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
1065 const double r = t_coords(0);
1070 for (; rr != nbRows; ++rr) {
1072 auto t_col_base = col_data.getFTensor0N(gg, 0);
1073 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1075 for (
int cc = 0; cc != nbCols; ++cc) {
1077 locMat(rr, cc) += (t_row_base * t_col_base * alpha) * ts_a;
1079 (t_row_base * alpha) * (t_col_diff_base(
i) * t_u(
i));
1081 (t_row_diff_base(
i) * t_grad_g(
i)) * (t_col_base * m_dh);
1091 for (; rr < nbRowBaseFunctions; ++rr) {
1108 boost::shared_ptr<MatrixDouble>
uPtr;
1109 boost::shared_ptr<VectorDouble>
hPtr;
1119 OpLhsH_dG(
const std::string field_name_h,
const std::string field_name_g,
1120 boost::shared_ptr<VectorDouble> h_ptr)
1125 assembleTranspose =
false;
1128 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
1129 EntitiesFieldData::EntData &col_data) {
1132 const double vol = getMeasure();
1133 auto t_h = getFTensor0FromVec(*
hPtr);
1135 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
1136 auto t_w = getFTensor0IntegrationWeight();
1137 auto t_coords = getFTensor1CoordsAtGaussPts();
1139 for (
int gg = 0; gg != nbIntegrationPts; gg++) {
1141 const double r = t_coords(0);
1146 set_h =
init_h(t_coords(0), t_coords(1), t_coords(2));
1150 auto m =
get_M(set_h) * alpha;
1153 for (; rr != nbRows; ++rr) {
1154 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1156 for (
int cc = 0; cc != nbCols; ++cc) {
1157 locMat(rr, cc) += (t_row_diff_base(
i) * t_col_diff_base(
i)) *
m;
1165 for (; rr < nbRowBaseFunctions; ++rr) {
1178 boost::shared_ptr<VectorDouble>
hPtr;
1184 boost::shared_ptr<MatrixDouble> grad_h_ptr,
1185 boost::shared_ptr<VectorDouble> g_ptr)
1189 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &data) {
1192 const double vol = getMeasure();
1193 auto t_h = getFTensor0FromVec(*
hPtr);
1194 auto t_grad_h = getFTensor1FromMat<SPACE_DIM>(*
gradHPtr);
1195 auto t_g = getFTensor0FromVec(*
gPtr);
1196 auto t_coords = getFTensor1CoordsAtGaussPts();
1198 auto t_base = data.getFTensor0N();
1199 auto t_diff_base = data.getFTensor1DiffN<
SPACE_DIM>();
1200 auto t_w = getFTensor0IntegrationWeight();
1202 for (
int gg = 0; gg != nbIntegrationPts; ++gg) {
1204 const double r = t_coords(0);
1209 set_h =
init_h(t_coords(0), t_coords(1), t_coords(2));
1213 const double f =
get_f(set_h);
1216 for (; bb != nbRows; ++bb) {
1217 locF[bb] += (t_base * alpha) * (t_g - f);
1218 locF[bb] -= (t_diff_base(
i) * (
eta2 * alpha)) * t_grad_h(
i);
1223 for (; bb < nbRowBaseFunctions; ++bb) {
1240 boost::shared_ptr<VectorDouble>
hPtr;
1242 boost::shared_ptr<VectorDouble>
gPtr;
1251 OpLhsG_dH(
const std::string field_name_g,
const std::string field_name_h,
1252 boost::shared_ptr<VectorDouble> h_ptr)
1257 assembleTranspose =
false;
1260 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
1261 EntitiesFieldData::EntData &col_data) {
1264 const double vol = getMeasure();
1265 auto t_h = getFTensor0FromVec(*
hPtr);
1267 auto t_row_base = row_data.getFTensor0N();
1268 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
1269 auto t_w = getFTensor0IntegrationWeight();
1270 auto t_coords = getFTensor1CoordsAtGaussPts();
1272 for (
int gg = 0; gg != nbIntegrationPts; ++gg) {
1274 const double r = t_coords(0);
1277 const double f_dh =
get_f_dh(t_h) * alpha;
1278 const double beta =
eta2 * alpha;
1281 for (; rr != nbRows; ++rr) {
1283 auto t_col_base = col_data.getFTensor0N(gg, 0);
1284 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
1286 for (
int cc = 0; cc != nbCols; ++cc) {
1288 if constexpr (
I ==
false)
1289 locMat(rr, cc) -= (t_row_base * t_col_base) * f_dh;
1290 locMat(rr, cc) -= (t_row_diff_base(
i) * beta) * t_col_diff_base(
i);
1300 for (; rr < nbRowBaseFunctions; ++rr) {
1314 boost::shared_ptr<VectorDouble>
hPtr;
1329 MoFEMErrorCode
iNtegrate(EntitiesFieldData::EntData &row_data,
1330 EntitiesFieldData::EntData &col_data) {
1333 const double vol = getMeasure();
1335 auto t_row_base = row_data.getFTensor0N();
1336 auto t_w = getFTensor0IntegrationWeight();
1337 auto t_coords = getFTensor1CoordsAtGaussPts();
1339 for (
int gg = 0; gg != nbIntegrationPts; ++gg) {
1341 const double r = t_coords(0);
1345 for (; rr != nbRows; ++rr) {
1346 auto t_col_base = col_data.getFTensor0N(gg, 0);
1347 const double beta = alpha * t_row_base;
1348 for (
int cc = 0; cc != nbCols; ++cc) {
1349 locMat(rr, cc) += (t_col_base * beta);
1356 for (; rr < nbRowBaseFunctions; ++rr) {
Kronecker Delta class symmetric.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#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()
#define CHKERR
Inline error check.
constexpr int U_FIELD_DIM
auto init_h
Initialisation function.
auto wetting_angle_sub_stepping
#define MOFEM_LOG(channel, severity)
Log.
FTensor::Index< 'i', SPACE_DIM > i
constexpr CoordinateTypes coord_type
const double c
speed of light (cm/ns)
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
constexpr IntegrationType I
constexpr auto field_name
static constexpr double delta
FTensor::Index< 'm', 3 > m
MoFEMErrorCode doWork(int row_side, EntityType row_type, EntitiesFieldData::EntData &data)
boost::shared_ptr< VectorDouble > liftPtr
OpCalculateLift(const std::string field_name, boost::shared_ptr< VectorDouble > p_ptr, boost::shared_ptr< VectorDouble > lift_ptr, boost::shared_ptr< Range > ents_ptr)
boost::shared_ptr< VectorDouble > pPtr
boost::shared_ptr< Range > entsPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpLhsG_dG(const std::string field_name)
boost::shared_ptr< VectorDouble > hPtr
OpLhsG_dH(const std::string field_name_g, const std::string field_name_h, boost::shared_ptr< VectorDouble > h_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpLhsH_dG(const std::string field_name_h, const std::string field_name_g, boost::shared_ptr< VectorDouble > h_ptr)
boost::shared_ptr< VectorDouble > hPtr
boost::shared_ptr< MatrixDouble > uPtr
OpLhsH_dH(const std::string field_name, boost::shared_ptr< MatrixDouble > u_ptr, boost::shared_ptr< VectorDouble > h_ptr, boost::shared_ptr< MatrixDouble > grad_g_ptr)
boost::shared_ptr< MatrixDouble > gradGPtr
boost::shared_ptr< VectorDouble > hPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
boost::shared_ptr< MatrixDouble > gradHPtr
OpLhsH_dU(const std::string h_field_name, const std::string u_field_name, boost::shared_ptr< MatrixDouble > grad_h_ptr)
OpLhsU_dG(const std::string field_name_u, const std::string field_name_h, boost::shared_ptr< MatrixDouble > grad_h_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
boost::shared_ptr< MatrixDouble > gradHPtr
boost::shared_ptr< VectorDouble > gPtr
OpLhsU_dH(const std::string field_name_u, const std::string field_name_h, boost::shared_ptr< MatrixDouble > dot_u_ptr, boost::shared_ptr< MatrixDouble > u_ptr, boost::shared_ptr< MatrixDouble > grad_u_ptr, boost::shared_ptr< VectorDouble > h_ptr, boost::shared_ptr< VectorDouble > g_ptr)
boost::shared_ptr< VectorDouble > hPtr
boost::shared_ptr< MatrixDouble > uPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
boost::shared_ptr< MatrixDouble > gradUPtr
boost::shared_ptr< MatrixDouble > dotUPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
boost::shared_ptr< MatrixDouble > gradUPtr
OpLhsU_dU(const std::string field_name, boost::shared_ptr< MatrixDouble > u_ptr, boost::shared_ptr< MatrixDouble > grad_u_ptr, boost::shared_ptr< VectorDouble > h_ptr)
boost::shared_ptr< MatrixDouble > uPtr
boost::shared_ptr< VectorDouble > hPtr
boost::shared_ptr< std::vector< VectorInt > > colIndicesPtr
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpLoopSideGetDataForSideEle(const std::string field_name, boost::shared_ptr< std::vector< VectorInt > > col_indices_ptr, boost::shared_ptr< std::vector< MatrixDouble > > col_diff_basefunctions_ptr)
ForcesAndSourcesCore::UserDataOperator UDO
boost::shared_ptr< std::vector< MatrixDouble > > colDiffBaseFunctionsPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data, EntitiesFieldData::EntData &col_data)
OpNormalConstrainLhs(const std::string field_name_row, const std::string field_name_col)
OpNormalConstrainRhs(const std::string field_name, boost::shared_ptr< MatrixDouble > u_ptr)
boost::shared_ptr< MatrixDouble > uPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data)
boost::shared_ptr< VectorDouble > lambdaPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &row_data)
OpNormalForceRhs(const std::string field_name, boost::shared_ptr< VectorDouble > lambda_ptr)
OpRhsG(const std::string field_name, boost::shared_ptr< VectorDouble > h_ptr, boost::shared_ptr< MatrixDouble > grad_h_ptr, boost::shared_ptr< VectorDouble > g_ptr)
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data)
boost::shared_ptr< MatrixDouble > gradHPtr
boost::shared_ptr< VectorDouble > hPtr
boost::shared_ptr< VectorDouble > gPtr
boost::shared_ptr< VectorDouble > hPtr
boost::shared_ptr< MatrixDouble > gradGPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data)
boost::shared_ptr< MatrixDouble > uPtr
boost::shared_ptr< VectorDouble > dotHPtr
boost::shared_ptr< MatrixDouble > gradHPtr
OpRhsH(const std::string field_name, boost::shared_ptr< MatrixDouble > u_ptr, boost::shared_ptr< VectorDouble > dot_h_ptr, boost::shared_ptr< VectorDouble > h_ptr, boost::shared_ptr< MatrixDouble > grad_h_ptr, boost::shared_ptr< MatrixDouble > grad_g_ptr)
boost::shared_ptr< MatrixDouble > gradUPtr
boost::shared_ptr< VectorDouble > pPtr
OpRhsU(const std::string field_name, boost::shared_ptr< MatrixDouble > dot_u_ptr, boost::shared_ptr< MatrixDouble > u_ptr, boost::shared_ptr< MatrixDouble > grad_u_ptr, boost::shared_ptr< VectorDouble > h_ptr, boost::shared_ptr< MatrixDouble > grad_h_ptr, boost::shared_ptr< VectorDouble > g_ptr, boost::shared_ptr< VectorDouble > p_ptr)
boost::shared_ptr< VectorDouble > gPtr
MoFEMErrorCode iNtegrate(EntitiesFieldData::EntData &data)
boost::shared_ptr< VectorDouble > hPtr
boost::shared_ptr< MatrixDouble > dotUPtr
boost::shared_ptr< MatrixDouble > uPtr
boost::shared_ptr< MatrixDouble > gradHPtr
boost::shared_ptr< MatrixDouble > gradHPtr
boost::shared_ptr< std::vector< VectorInt > > colIndicesPtr
boost::shared_ptr< std::vector< MatrixDouble > > colDiffBaseFunctionsPtr
boost::shared_ptr< Range > entsPtr
OpWettingAngleLhs(const std::string row_field_name, boost::shared_ptr< MatrixDouble > grad_h_ptr, boost::shared_ptr< std::vector< VectorInt > > col_ind_ptr, boost::shared_ptr< std::vector< MatrixDouble > > col_diff_base_ptr, boost::shared_ptr< Range > ents_ptr=nullptr, double wetting_angle=0)
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
boost::shared_ptr< MatrixDouble > gradHPtr
OpWettingAngleRhs(const std::string field_name, boost::shared_ptr< MatrixDouble > grad_h_ptr, boost::shared_ptr< Range > ents_ptr=nullptr, double wetting_angle=0)
MoFEMErrorCode iNtegrate(DataForcesAndSourcesCore::EntData &row_data)
boost::shared_ptr< Range > entsPtr