771 {
773
774 const double vol = getMeasure();
775 auto t_dot_u = getFTensor1FromMat<U_FIELD_DIM>(*
dotUPtr);
776 auto t_u = getFTensor1FromMat<U_FIELD_DIM>(*
uPtr);
777 auto t_grad_u = getFTensor2FromMat<U_FIELD_DIM, SPACE_DIM>(*
gradUPtr);
778 auto t_h = getFTensor0FromVec(*
hPtr);
779 auto t_g = getFTensor0FromVec(*
gPtr);
780 auto t_coords = getFTensor1CoordsAtGaussPts();
781
782 auto t_row_base = row_data.getFTensor0N();
783 auto t_row_diff_base = row_data.getFTensor1DiffN<
SPACE_DIM>();
784
785 auto t_w = getFTensor0IntegrationWeight();
786
794
795 t_buoyancy_dh(
i) = 0;
797
798 for (int gg = 0; gg != nbIntegrationPts; gg++) {
799
800 const double r = t_coords(0);
802
805
806 auto t_D_dh =
get_D(2 * mu_dh);
807
808 t_inertia_force_dh(
i) = (alpha * rho_dh) * t_dot_u(
i);
809
810 t_gravity_dh(
SPACE_DIM - 1) = (alpha * rho_dh *
a0);
811 t_convection_dh(
i) = (rho_dh * alpha) * (t_u(
j) * t_grad_u(
i,
j));
812 const double t_phase_force_g_dh = -alpha *
kappa * t_g;
813 t_forces_dh(
i) = t_inertia_force_dh(
i) + t_buoyancy_dh(
i) +
814 t_gravity_dh(
i) + t_convection_dh(
i);
815
816 t_stress_dh(
i,
j) = alpha * (t_D_dh(
i,
j,
k,
l) * t_grad_u(
k,
l));
817
818 int rr = 0;
820
821 auto t_mat =
823 DataLayoutTraits<DataLayout::CoeffsByGauss>>(
825 auto t_col_base = col_data.getFTensor0N(gg, 0);
826 auto t_col_diff_base = col_data.getFTensor1DiffN<
SPACE_DIM>(gg, 0);
827
828 for (int cc = 0; cc != nbCols; ++cc) {
829
830 const double bb = t_row_base * t_col_base;
831 t_mat(
i) += t_forces_dh(
i) * bb;
832 t_mat(
i) += (t_phase_force_g_dh * t_row_base) * t_col_diff_base(
i);
833 t_mat(
i) += (t_row_diff_base(
j) * t_col_base) * t_stress_dh(
i,
j);
834
836 t_mat(0) += (bb * (alpha / t_coords(0))) * (2 * mu_dh * t_u(0));
837 }
838
839 ++t_mat;
840 ++t_col_base;
841 ++t_col_diff_base;
842 }
843
844 ++t_row_base;
845 ++t_row_diff_base;
846 }
847
848 for (; rr < nbRowBaseFunctions; ++rr) {
849 ++t_row_diff_base;
850 ++t_row_base;
851 }
852
853 ++t_dot_u;
854 ++t_u;
855 ++t_grad_u;
856 ++t_h;
857 ++t_g;
858 ++t_coords;
859 ++t_w;
860 }
861
863 }
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
auto cylindrical
[cylindrical]
constexpr int U_FIELD_DIM
auto d_phase_function_h
Derivative of phase function with respect to h.
auto get_D
Create deviatoric stress tensor.
FTensor::Index< 'i', SPACE_DIM > i
constexpr CoordinateTypes coord_type
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
auto getFTensor1FromMat(M &data, int rr=0, int cc=0)
Get tensor rank 1 (vector) form data matrix.