48 unsigned n_node =
nnode();
57 unsigned u_nodal_index[3];
58 for (
unsigned i = 0;
i < 3; ++
i)
69 bool pressure_dof_is_hanging[n_pres];
74 for (
unsigned l = 0; l < n_pres; ++l)
82 for (
unsigned l = 0; l < n_pres; ++l)
84 pressure_dof_is_hanging[l] =
false;
90 Shape psif(n_node), testf(n_node);
91 DShape dpsifdx(n_node, DIM), dtestfdx(n_node, DIM);
95 Shape psip(n_pres), testp(n_pres);
115 int local_eqn = 0, local_unknown = 0;
118 HangInfo *hang_info_pt = 0, *hang_info2_pt = 0;
121 for (
unsigned ipt = 0; ipt < Nintpt; ipt++)
124 for (
unsigned i = 0;
i < DIM;
i++)
134 ipt, psif, dpsifdx, testf, dtestfdx);
144 double interpolated_p = 0.0;
152 for (
unsigned l = 0; l < n_pres; l++)
154 interpolated_p +=
p_axi_nst(l) * psip[l];
161 for (
unsigned l = 0; l < n_node; l++)
164 const double psif_ = psif(l);
166 for (
unsigned i = 0;
i < DIM;
i++)
172 for (
unsigned i = 0;
i < DIM + 1;
i++)
174 const double u_value =
nodal_value(l, u_nodal_index[
i]);
175 interpolated_u[
i] += u_value * psif_;
178 for (
unsigned j = 0; j < DIM; j++)
180 interpolated_dudx(
i, j) += u_value * dpsifdx(l, j);
189 for (
unsigned l = 0; l < n_node; l++)
192 for (
unsigned i = 0;
i < 2;
i++)
216 strainrate_to_compute_second_invariant);
240 double dviscosity_dsecond_invariant =
252 dinvariant_dstrainrate(0, 0) =
253 strainrate_ref(1, 1) + strainrate_ref(2, 2);
255 dinvariant_dstrainrate(1, 1) =
256 strainrate_ref(0, 0) + strainrate_ref(2, 2);
258 dinvariant_dstrainrate(2, 2) =
259 strainrate_ref(0, 0) + strainrate_ref(1, 1);
261 dinvariant_dstrainrate(0, 1) = -strainrate_ref(1, 0);
263 dinvariant_dstrainrate(1, 0) = -strainrate_ref(0, 1);
265 dinvariant_dstrainrate(0, 2) = -strainrate_ref(2, 0);
267 dinvariant_dstrainrate(2, 0) = -strainrate_ref(0, 2);
269 dinvariant_dstrainrate(2, 1) = -strainrate_ref(1, 2);
271 dinvariant_dstrainrate(1, 2) = -strainrate_ref(2, 1);
274 for (
unsigned l = 0; l < n_node; l++)
280 for (
unsigned i = 0;
i < 3;
i++)
284 double dinvariant_dunknown = 0.0;
287 for (
unsigned m = 0; m < 3; m++)
289 for (
unsigned n = 0; n < 3; n++)
293 double dstrainrate_dunknown = 0.0;
308 dstrainrate_dunknown = dpsifdx(l, 0);
316 dstrainrate_dunknown = 0.5 * dpsifdx(l, 1);
320 dstrainrate_dunknown = 0.5 * dpsifdx(l, 0);
328 dstrainrate_dunknown =
329 0.5 * dpsifdx(l, 0) - 0.5 / r * psif[l];
334 std::ostringstream error_stream;
335 error_stream <<
"Should never get here...";
337 OOMPH_CURRENT_FUNCTION,
338 OOMPH_EXCEPTION_LOCATION);
353 dstrainrate_dunknown = 0.5 * dpsifdx(l, 1);
357 dstrainrate_dunknown = 0.5 * dpsifdx(l, 0);
365 dstrainrate_dunknown = dpsifdx(l, 1);
377 dstrainrate_dunknown = 0.5 * dpsifdx(l, 1);
382 std::ostringstream error_stream;
383 error_stream <<
"Should never get here...";
385 OOMPH_CURRENT_FUNCTION,
386 OOMPH_EXCEPTION_LOCATION);
401 dstrainrate_dunknown =
402 0.5 * dpsifdx(l, 0) - 0.5 / r * psif[l];
410 dstrainrate_dunknown = 0.5 * dpsifdx(l, 1);
418 dstrainrate_dunknown = 1.0 / r * psif[l];
423 std::ostringstream error_stream;
424 error_stream <<
"Should never get here...";
426 OOMPH_CURRENT_FUNCTION,
427 OOMPH_EXCEPTION_LOCATION);
433 std::ostringstream error_stream;
434 error_stream <<
"Should never get here...";
436 OOMPH_CURRENT_FUNCTION,
437 OOMPH_EXCEPTION_LOCATION);
440 dinvariant_dunknown +=
441 dinvariant_dstrainrate(m, n) * dstrainrate_dunknown;
449 dviscosity_dsecond_invariant * dinvariant_dunknown;
454 dviscosity_dsecond_invariant * dinvariant_dunknown;
458 dviscosity_dUphi[l] =
459 dviscosity_dsecond_invariant * dinvariant_dunknown;
463 std::ostringstream error_stream;
464 error_stream <<
"Should never get here...";
466 OOMPH_CURRENT_FUNCTION,
467 OOMPH_EXCEPTION_LOCATION);
477 unsigned n_master = 1;
478 double hang_weight = 1.0;
482 for (
unsigned l = 0; l < n_node; l++)
493 n_master = hang_info_pt->
nmaster();
502 for (
unsigned m = 0; m < n_master; m++)
505 for (
unsigned i = 0;
i < DIM + 1;
i++)
537 sum += r * body_force[0] * testf[l] *
W * hang_weight;
541 r * scaled_re_inv_fr * testf[l] * G[0] *
W * hang_weight;
544 sum += interpolated_p * (testf[l] + r * dtestfdx(l, 0)) *
W *
552 sum -= visc_ratio * viscosity * r * (1.0 +
Gamma[0]) *
553 interpolated_dudx(0, 0) * dtestfdx(l, 0) *
W *
557 sum -= visc_ratio * viscosity * r *
558 (interpolated_dudx(0, 1) +
559 Gamma[0] * interpolated_dudx(1, 0)) *
560 dtestfdx(l, 1) *
W * hang_weight;
563 sum -= visc_ratio * viscosity * (1.0 +
Gamma[0]) *
564 interpolated_u[0] * testf[l] *
W * hang_weight / r;
569 scaled_re_st * r * dudt[0] * testf[l] *
W * hang_weight;
573 (r * interpolated_u[0] * interpolated_dudx(0, 0) -
574 interpolated_u[2] * interpolated_u[2] +
575 r * interpolated_u[1] * interpolated_dudx(0, 1)) *
576 testf[l] *
W * hang_weight;
581 for (
unsigned k = 0; k < 2; k++)
583 sum += scaled_re_st * r * mesh_veloc[k] *
584 interpolated_dudx(0, k) * testf[l] *
W *
590 sum += 2.0 * r * scaled_re_inv_ro * interpolated_u[2] *
591 testf[l] *
W * hang_weight;
600 sum += r * body_force[1] * testf[l] *
W * hang_weight;
604 r * scaled_re_inv_fr * testf[l] * G[1] *
W * hang_weight;
607 sum += r * interpolated_p * dtestfdx(l, 1) *
W * hang_weight;
614 sum -= visc_ratio * viscosity * r *
615 (interpolated_dudx(1, 0) +
616 Gamma[1] * interpolated_dudx(0, 1)) *
617 dtestfdx(l, 0) *
W * hang_weight;
620 sum -= visc_ratio * viscosity * r * (1.0 +
Gamma[1]) *
621 interpolated_dudx(1, 1) * dtestfdx(l, 1) *
W *
627 scaled_re_st * r * dudt[1] * testf[l] *
W * hang_weight;
631 (r * interpolated_u[0] * interpolated_dudx(1, 0) +
632 r * interpolated_u[1] * interpolated_dudx(1, 1)) *
633 testf[l] *
W * hang_weight;
638 for (
unsigned k = 0; k < 2; k++)
640 sum += scaled_re_st * r * mesh_veloc[k] *
641 interpolated_dudx(1, k) * testf[l] *
W *
651 sum += r * body_force[2] * testf[l] *
W * hang_weight;
655 r * scaled_re_inv_fr * testf[l] * G[2] *
W * hang_weight;
664 sum -= visc_ratio * viscosity *
665 (r * interpolated_dudx(2, 0) -
666 Gamma[0] * interpolated_u[2]) *
667 dtestfdx(l, 0) *
W * hang_weight;
670 sum -= visc_ratio * viscosity * r * interpolated_dudx(2, 1) *
671 dtestfdx(l, 1) *
W * hang_weight;
674 sum -= visc_ratio * viscosity *
675 ((interpolated_u[2] / r) -
676 Gamma[0] * interpolated_dudx(2, 0)) *
677 testf[l] *
W * hang_weight;
683 scaled_re_st * r * dudt[2] * testf[l] *
W * hang_weight;
687 (r * interpolated_u[0] * interpolated_dudx(2, 0) +
688 interpolated_u[0] * interpolated_u[2] +
689 r * interpolated_u[1] * interpolated_dudx(2, 1)) *
690 testf[l] *
W * hang_weight;
695 for (
unsigned k = 0; k < 2; k++)
697 sum += scaled_re_st * r * mesh_veloc[k] *
698 interpolated_dudx(2, k) * testf[l] *
W *
704 sum -= 2.0 * r * scaled_re_inv_ro * interpolated_u[0] *
705 testf[l] *
W * hang_weight;
711 residuals[local_eqn] += sum;
717 unsigned n_master2 = 1;
718 double hang_weight2 = 1.0;
720 for (
unsigned l2 = 0; l2 < n_node; l2++)
726 if (is_node2_hanging)
730 n_master2 = hang_info2_pt->
nmaster();
739 for (
unsigned m2 = 0; m2 < n_master2; m2++)
742 for (
unsigned i2 = 0; i2 < DIM + 1; i2++)
746 if (is_node2_hanging)
750 hang_info2_pt->master_node_pt(m2), u_nodal_index[i2]);
751 hang_weight2 = hang_info2_pt->master_weight(m2);
761 if (local_unknown >= 0)
776 mass_matrix(local_eqn, local_unknown) +=
777 scaled_re_st * r * psif[l2] * testf[l] *
W *
778 hang_weight * hang_weight2;
783 jacobian(local_eqn, local_unknown) -=
784 visc_ratio * viscosity * r *
785 (1.0 +
Gamma[0]) * dpsifdx(l2, 0) *
786 dtestfdx(l, 0) *
W * hang_weight *
794 jacobian(local_eqn, local_unknown) -=
795 visc_ratio * dviscosity_dUr[l2] * r *
796 (1.0 +
Gamma[0]) * interpolated_dudx(0, 0) *
797 dtestfdx(l, 0) *
W * hang_weight *
802 jacobian(local_eqn, local_unknown) -=
803 visc_ratio * viscosity * r * dpsifdx(l2, 1) *
804 dtestfdx(l, 1) *
W * hang_weight *
812 jacobian(local_eqn, local_unknown) -=
813 visc_ratio * dviscosity_dUr[l2] * r *
814 (interpolated_dudx(0, 1) +
815 Gamma[0] * interpolated_dudx(1, 0)) *
816 dtestfdx(l, 1) *
W * hang_weight *
821 jacobian(local_eqn, local_unknown) -=
822 visc_ratio * viscosity * (1.0 +
Gamma[0]) *
823 psif[l2] * testf[l] *
W * hang_weight *
831 jacobian(local_eqn, local_unknown) -=
832 visc_ratio * dviscosity_dUr[l2] *
833 (1.0 +
Gamma[0]) * interpolated_u[0] *
834 testf[l] *
W * hang_weight * hang_weight2 /
840 jacobian(local_eqn, local_unknown) -=
843 psif[l2] * testf[l] *
W * hang_weight *
847 jacobian(local_eqn, local_unknown) -=
849 (r * psif[l2] * interpolated_dudx(0, 0) +
850 r * interpolated_u[0] * dpsifdx(l2, 0) +
851 r * interpolated_u[1] * dpsifdx(l2, 1)) *
852 testf[l] *
W * hang_weight * hang_weight2;
857 for (
unsigned k = 0; k < 2; k++)
859 jacobian(local_eqn, local_unknown) +=
860 scaled_re_st * r * mesh_veloc[k] *
861 dpsifdx(l2, k) * testf[l] *
W *
862 hang_weight * hang_weight2;
877 jacobian(local_eqn, local_unknown) -=
878 visc_ratio * dviscosity_dUz[l2] * r *
879 (1.0 +
Gamma[0]) * interpolated_dudx(0, 0) *
880 dtestfdx(l, 0) *
W * hang_weight *
885 jacobian(local_eqn, local_unknown) -=
886 visc_ratio * viscosity * r *
Gamma[0] *
887 dpsifdx(l2, 0) * dtestfdx(l, 1) *
W *
888 hang_weight * hang_weight2;
895 jacobian(local_eqn, local_unknown) -=
896 visc_ratio * dviscosity_dUz[l2] * r *
897 (interpolated_dudx(0, 1) +
898 Gamma[0] * interpolated_dudx(1, 0)) *
899 dtestfdx(l, 1) *
W * hang_weight *
910 jacobian(local_eqn, local_unknown) -=
911 visc_ratio * dviscosity_dUz[l2] *
912 (1.0 +
Gamma[0]) * interpolated_u[0] *
913 testf[l] *
W * hang_weight * hang_weight2 /
918 jacobian(local_eqn, local_unknown) -=
919 scaled_re * r * psif[l2] *
920 interpolated_dudx(0, 1) * testf[l] *
W *
921 hang_weight * hang_weight2;
934 jacobian(local_eqn, local_unknown) -=
935 visc_ratio * dviscosity_dUphi[l2] * r *
936 (1.0 +
Gamma[0]) * interpolated_dudx(0, 0) *
937 dtestfdx(l, 0) *
W * hang_weight *
948 jacobian(local_eqn, local_unknown) -=
949 visc_ratio * dviscosity_dUphi[l2] * r *
950 (interpolated_dudx(0, 1) +
951 Gamma[0] * interpolated_dudx(1, 0)) *
952 dtestfdx(l, 1) *
W * hang_weight *
963 jacobian(local_eqn, local_unknown) -=
964 visc_ratio * dviscosity_dUphi[l2] *
965 (1.0 +
Gamma[0]) * interpolated_u[0] *
966 testf[l] *
W * hang_weight * hang_weight2 /
971 jacobian(local_eqn, local_unknown) -=
972 -scaled_re * 2.0 * interpolated_u[2] *
973 psif[l2] * testf[l] *
W * hang_weight *
977 jacobian(local_eqn, local_unknown) +=
978 2.0 * r * scaled_re_inv_ro * psif[l2] *
979 testf[l] *
W * hang_weight * hang_weight2;
997 jacobian(local_eqn, local_unknown) -=
998 visc_ratio * viscosity * r *
Gamma[1] *
999 dpsifdx(l2, 1) * dtestfdx(l, 0) *
W *
1000 hang_weight * hang_weight2;
1007 jacobian(local_eqn, local_unknown) -=
1008 visc_ratio * dviscosity_dUr[l2] * r *
1009 (interpolated_dudx(1, 0) +
1010 Gamma[1] * interpolated_dudx(0, 1)) *
1011 dtestfdx(l, 0) *
W * hang_weight *
1022 jacobian(local_eqn, local_unknown) -=
1023 visc_ratio * dviscosity_dUr[l2] * r *
1024 (1.0 +
Gamma[1]) * interpolated_dudx(1, 1) *
1025 dtestfdx(l, 1) *
W * hang_weight *
1030 jacobian(local_eqn, local_unknown) -=
1031 scaled_re * r * psif[l2] *
1032 interpolated_dudx(1, 0) * testf[l] *
W *
1033 hang_weight * hang_weight2;
1042 mass_matrix(local_eqn, local_unknown) +=
1043 scaled_re_st * r * psif[l2] * testf[l] *
W *
1044 hang_weight * hang_weight2;
1053 jacobian(local_eqn, local_unknown) -=
1054 visc_ratio * viscosity * r * dpsifdx(l2, 0) *
1055 dtestfdx(l, 0) *
W * hang_weight *
1063 jacobian(local_eqn, local_unknown) -=
1064 visc_ratio * dviscosity_dUz[l2] * r *
1065 (interpolated_dudx(1, 0) +
1066 Gamma[1] * interpolated_dudx(0, 1)) *
1067 dtestfdx(l, 0) *
W * hang_weight *
1072 jacobian(local_eqn, local_unknown) -=
1073 visc_ratio * viscosity * r *
1074 (1.0 +
Gamma[1]) * dpsifdx(l2, 1) *
1075 dtestfdx(l, 1) *
W * hang_weight *
1083 jacobian(local_eqn, local_unknown) -=
1084 visc_ratio * dviscosity_dUz[l2] * r *
1085 (1.0 +
Gamma[1]) * interpolated_dudx(1, 1) *
1086 dtestfdx(l, 1) *
W * hang_weight *
1092 jacobian(local_eqn, local_unknown) -=
1095 psif[l2] * testf[l] *
W * hang_weight *
1099 jacobian(local_eqn, local_unknown) -=
1101 (r * interpolated_u[0] * dpsifdx(l2, 0) +
1102 r * psif[l2] * interpolated_dudx(1, 1) +
1103 r * interpolated_u[1] * dpsifdx(l2, 1)) *
1104 testf[l] *
W * hang_weight * hang_weight2;
1109 for (
unsigned k = 0; k < 2; k++)
1111 jacobian(local_eqn, local_unknown) +=
1112 scaled_re_st * r * mesh_veloc[k] *
1113 dpsifdx(l2, k) * testf[l] *
W *
1114 hang_weight * hang_weight2;
1131 jacobian(local_eqn, local_unknown) -=
1132 visc_ratio * dviscosity_dUphi[l2] * r *
1133 (interpolated_dudx(1, 0) +
1134 Gamma[1] * interpolated_dudx(0, 1)) *
1135 dtestfdx(l, 0) *
W * hang_weight *
1140 jacobian(local_eqn, local_unknown) -=
1141 visc_ratio * dviscosity_dUphi[l2] * r *
1142 (1.0 +
Gamma[1]) * interpolated_dudx(1, 1) *
1143 dtestfdx(l, 1) *
W * hang_weight *
1161 jacobian(local_eqn, local_unknown) -=
1162 visc_ratio * dviscosity_dUr[l2] *
1163 (r * interpolated_dudx(2, 0) -
1164 Gamma[0] * interpolated_u[2]) *
1165 dtestfdx(l, 0) *
W * hang_weight *
1170 jacobian(local_eqn, local_unknown) -=
1171 visc_ratio * dviscosity_dUr[l2] * r *
1172 interpolated_dudx(2, 1) * dtestfdx(l, 1) *
1173 W * hang_weight * hang_weight2;
1177 jacobian(local_eqn, local_unknown) -=
1178 visc_ratio * dviscosity_dUr[l2] *
1179 ((interpolated_u[2] / r) -
1180 Gamma[0] * interpolated_dudx(2, 0)) *
1181 testf[l] *
W * hang_weight * hang_weight2;
1185 jacobian(local_eqn, local_unknown) -=
1187 (r * psif[l2] * interpolated_dudx(2, 0) +
1188 psif[l2] * interpolated_u[2]) *
1189 testf[l] *
W * hang_weight * hang_weight2;
1192 jacobian(local_eqn, local_unknown) -=
1193 2.0 * r * scaled_re_inv_ro * psif[l2] *
1194 testf[l] *
W * hang_weight * hang_weight2;
1205 jacobian(local_eqn, local_unknown) -=
1206 visc_ratio * dviscosity_dUz[l2] *
1207 (r * interpolated_dudx(2, 0) -
1208 Gamma[0] * interpolated_u[2]) *
1209 dtestfdx(l, 0) *
W * hang_weight *
1214 jacobian(local_eqn, local_unknown) -=
1215 visc_ratio * dviscosity_dUz[l2] * r *
1216 interpolated_dudx(2, 1) * dtestfdx(l, 1) *
1217 W * hang_weight * hang_weight2;
1221 jacobian(local_eqn, local_unknown) -=
1222 visc_ratio * dviscosity_dUz[l2] *
1223 ((interpolated_u[2] / r) -
1224 Gamma[0] * interpolated_dudx(2, 0)) *
1225 testf[l] *
W * hang_weight * hang_weight2;
1229 jacobian(local_eqn, local_unknown) -=
1230 scaled_re * r * psif[l2] *
1231 interpolated_dudx(2, 1) * testf[l] *
W *
1232 hang_weight * hang_weight2;
1241 mass_matrix(local_eqn, local_unknown) +=
1242 scaled_re_st * r * psif[l2] * testf[l] *
W *
1243 hang_weight * hang_weight2;
1252 jacobian(local_eqn, local_unknown) -=
1253 visc_ratio * viscosity *
1254 (r * dpsifdx(l2, 0) -
Gamma[0] * psif[l2]) *
1255 dtestfdx(l, 0) *
W * hang_weight *
1263 jacobian(local_eqn, local_unknown) -=
1264 visc_ratio * dviscosity_dUphi[l2] *
1265 (r * interpolated_dudx(2, 0) -
1266 Gamma[0] * interpolated_u[2]) *
1267 dtestfdx(l, 0) *
W * hang_weight *
1272 jacobian(local_eqn, local_unknown) -=
1273 visc_ratio * viscosity * r * dpsifdx(l2, 1) *
1274 dtestfdx(l, 1) *
W * hang_weight *
1282 jacobian(local_eqn, local_unknown) -=
1283 visc_ratio * dviscosity_dUphi[l2] * r *
1284 interpolated_dudx(2, 1) * dtestfdx(l, 1) *
1285 W * hang_weight * hang_weight2;
1289 jacobian(local_eqn, local_unknown) -=
1290 visc_ratio * viscosity *
1291 ((psif[l2] / r) -
Gamma[0] * dpsifdx(l2, 0)) *
1292 testf[l] *
W * hang_weight * hang_weight2;
1299 jacobian(local_eqn, local_unknown) -=
1300 visc_ratio * dviscosity_dUphi[l2] *
1301 ((interpolated_u[2] / r) -
1302 Gamma[0] * interpolated_dudx(2, 0)) *
1303 testf[l] *
W * hang_weight * hang_weight2;
1308 jacobian(local_eqn, local_unknown) -=
1311 psif[l2] * testf[l] *
W * hang_weight *
1315 jacobian(local_eqn, local_unknown) -=
1317 (r * interpolated_u[0] * dpsifdx(l2, 0) +
1318 interpolated_u[0] * psif[l2] +
1319 r * interpolated_u[1] * dpsifdx(l2, 1)) *
1320 testf[l] *
W * hang_weight * hang_weight2;
1325 for (
unsigned k = 0; k < 2; k++)
1327 jacobian(local_eqn, local_unknown) +=
1328 scaled_re_st * r * mesh_veloc[k] *
1329 dpsifdx(l2, k) * testf[l] *
W *
1330 hang_weight * hang_weight2;
1344 for (
unsigned l2 = 0; l2 < n_pres; l2++)
1347 if (pressure_dof_is_hanging[l2])
1353 n_master2 = hang_info2_pt->
nmaster();
1362 for (
unsigned m2 = 0; m2 < n_master2; m2++)
1366 if (pressure_dof_is_hanging[l2])
1370 hang_info2_pt->master_node_pt(m2), p_index);
1372 hang_weight2 = hang_info2_pt->master_weight(m2);
1381 if (local_unknown >= 0)
1388 jacobian(local_eqn, local_unknown) +=
1389 psip[l2] * (testf[l] + r * dtestfdx(l, 0)) *
W *
1390 hang_weight * hang_weight2;
1395 jacobian(local_eqn, local_unknown) +=
1396 r * psip[l2] * dtestfdx(l, 1) *
W * hang_weight *
1418 for (
unsigned l = 0; l < n_pres; l++)
1421 if (pressure_dof_is_hanging[l])
1426 n_master = hang_info_pt->
nmaster();
1435 for (
unsigned m = 0; m < n_master; m++)
1439 if (pressure_dof_is_hanging[l])
1455 residuals[local_eqn] -= r * source * testp[l] *
W * hang_weight;
1458 residuals[local_eqn] +=
1459 (interpolated_u[0] + r * interpolated_dudx(0, 0) +
1460 r * interpolated_dudx(1, 1)) *
1461 testp[l] *
W * hang_weight;
1467 unsigned n_master2 = 1;
1468 double hang_weight2 = 1.0;
1470 for (
unsigned l2 = 0; l2 < n_node; l2++)
1476 if (is_node2_hanging)
1480 n_master2 = hang_info2_pt->
nmaster();
1489 for (
unsigned m2 = 0; m2 < n_master2; m2++)
1492 for (
unsigned i2 = 0; i2 < DIM + 1; i2++)
1496 if (is_node2_hanging)
1500 hang_info2_pt->master_node_pt(m2), u_nodal_index[i2]);
1501 hang_weight2 = hang_info2_pt->master_weight(m2);
1511 if (local_unknown >= 0)
1517 jacobian(local_eqn, local_unknown) +=
1518 (psif[l2] + r * dpsifdx(l2, 0)) * testp[l] *
W *
1519 hang_weight * hang_weight2;
1524 jacobian(local_eqn, local_unknown) +=
1525 r * dpsifdx(l2, 1) * testp[l] *
W * hang_weight *
1561 std::string warning_message =
"This function has not been tested.\n";
1563 "RefineableGeneralisedNewtonianAxisymmetricNavierStokesEquations::\n";
1564 function +=
"get_dresidual_dnodal_coordinates(...)";
1574 const unsigned n_node =
nnode();
1583 unsigned u_nodal_index[3];
1584 for (
unsigned i = 0;
i < 3;
i++)
1595 bool pressure_dof_is_hanging[n_pres];
1601 for (
unsigned l = 0; l < n_pres; ++l)
1609 for (
unsigned l = 0; l < n_pres; ++l)
1611 pressure_dof_is_hanging[l] =
false;
1617 Shape psif(n_node), testf(n_node);
1618 DShape dpsifdx(n_node, 2), dtestfdx(n_node, 2);
1621 Shape psip(n_pres), testp(n_pres);
1629 2, n_shape_controlling_node, n_node, 2);
1671 bool element_has_node_with_aux_node_update_fct =
false;
1673 std::map<Node*, unsigned> local_shape_controlling_node_lookup =
1677 for (std::map<Node*, unsigned>::iterator it =
1678 local_shape_controlling_node_lookup.begin();
1679 it != local_shape_controlling_node_lookup.end();
1683 Node* nod_pt = it->first;
1686 unsigned q = it->second;
1691 element_has_node_with_aux_node_update_fct =
true;
1695 std::ostringstream warning_stream;
1696 warning_stream <<
"\nThe functionality to evaluate the additional"
1697 <<
"\ncontribution to the deriv of the residual eqn"
1698 <<
"\nw.r.t. the nodal coordinates which comes about"
1699 <<
"\nif a node's values are updated using an auxiliary"
1700 <<
"\nnode update function has NOT been tested for"
1701 <<
"\nrefineable axisymmetric Navier-Stokes elements."
1702 <<
"\nUse at your own risk" << std::endl;
1704 "RefineableGeneralisedNewtonianAxisymmetricNavierStokes"
1705 "Equations::get_dresidual_dnodal_coordinates",
1706 OOMPH_EXCEPTION_LOCATION);
1710 for (
unsigned i = 0;
i < 3;
i++)
1712 u_ref[
i] = *(nod_pt->
value_pt(u_nodal_index[
i]));
1716 for (
unsigned p = 0; p < 2; p++)
1719 double backup = nod_pt->
x(p);
1723 nod_pt->
x(p) += eps_fd;
1729 for (
unsigned i = 0;
i < 3;
i++)
1733 (*(nod_pt->
value_pt(u_nodal_index[p])) - u_ref[p]) / eps_fd;
1737 nod_pt->
x(p) = backup;
1752 for (
unsigned ipt = 0; ipt < n_intpt; ipt++)
1755 for (
unsigned i = 0;
i < 2;
i++)
1784 double interpolated_p = 0.0;
1790 for (
unsigned l = 0; l < n_pres; l++)
1792 interpolated_p += this->
p_axi_nst(l) * psip[l];
1799 for (
unsigned l = 0; l < n_node; l++)
1802 const double psif_ = psif(l);
1805 for (
unsigned i = 0;
i < 2;
i++)
1811 for (
unsigned i = 0;
i < 3;
i++)
1814 const double u_value =
nodal_value(l, u_nodal_index[
i]);
1815 interpolated_u[
i] += u_value * psif_;
1819 for (
unsigned j = 0; j < 2; j++)
1821 interpolated_dudx(
i, j) += u_value * dpsifdx(l, j);
1830 for (
unsigned l = 0; l < n_node; l++)
1833 for (
unsigned i = 0;
i < 2;
i++)
1843 for (
unsigned q = 0; q < n_shape_controlling_node; q++)
1846 for (
unsigned p = 0; p < 2; p++)
1849 for (
unsigned i = 0;
i < 3;
i++)
1852 for (
unsigned k = 0; k < 2; k++)
1857 for (
unsigned j = 0; j < n_node; j++)
1860 nodal_value(j, u_nodal_index[
i]) * d_dpsifdx_dX(p, q, j, k);
1862 d_dudx_dX(p, q,
i, k) = aux;
1870 const double pos_time_weight =
1872 const double val_time_weight =
1902 unsigned n_master = 1;
1903 double hang_weight = 1.0;
1906 for (
unsigned l = 0; l < n_node; l++)
1909 const double testf_ = testf[l];
1915 if (is_node_hanging)
1920 n_master = hang_info_pt->
nmaster();
1929 for (
unsigned m = 0; m < n_master; m++)
1937 if (is_node_hanging)
1959 for (
unsigned p = 0; p < 2; p++)
1962 for (
unsigned q = 0; q < n_shape_controlling_node; q++)
1968 double sum = r * body_force[0] * testf_;
1971 sum += r * scaled_re_inv_fr * testf_ * G[0];
1974 sum += interpolated_p * (testf_ + r * dtestfdx(l, 0));
1980 sum -= visc_ratio * r * (1.0 +
Gamma[0]) *
1981 interpolated_dudx(0, 0) * dtestfdx(l, 0);
1983 sum -= visc_ratio * r *
1984 (interpolated_dudx(0, 1) +
1985 Gamma[0] * interpolated_dudx(1, 0)) *
1988 sum -= visc_ratio * (1.0 +
Gamma[0]) * interpolated_u[0] *
1992 sum -= scaled_re_st * r * dudt[0] * testf_;
1996 (r * interpolated_u[0] * interpolated_dudx(0, 0) -
1997 interpolated_u[2] * interpolated_u[2] +
1998 r * interpolated_u[1] * interpolated_dudx(0, 1)) *
2004 for (
unsigned k = 0; k < 2; k++)
2006 sum += scaled_re_st * r * mesh_velocity[k] *
2007 interpolated_dudx(0, k) * testf_;
2012 sum += 2.0 * r * scaled_re_inv_ro * interpolated_u[2] * testf_;
2015 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2016 sum * dJ_dX(p, q) * w * hang_weight;
2022 sum = r * d_body_force_dx(0, p) * psif[q] * testf_;
2025 sum += body_force[0] * psif[q] * testf_;
2031 sum += scaled_re_inv_fr * G[0] * psif[q] * testf_;
2035 sum += r * interpolated_p * d_dtestfdx_dX(p, q, l, 0);
2038 sum += interpolated_p * psif[q] * dtestfdx(l, 0);
2045 (d_dudx_dX(p, q, 0, 0) * dtestfdx(l, 0) +
2046 interpolated_dudx(0, 0) * d_dtestfdx_dX(p, q, l, 0)) +
2047 (d_dudx_dX(p, q, 0, 1) +
Gamma[0] * d_dudx_dX(p, q, 1, 0)) *
2049 (interpolated_dudx(0, 1) +
2050 Gamma[0] * interpolated_dudx(1, 0)) *
2051 d_dtestfdx_dX(p, q, l, 1));
2057 (interpolated_dudx(0, 0) * psif[q] * dtestfdx(l, 0) -
2058 interpolated_u[0] * psif[q] * testf_ / (r * r)) +
2059 (interpolated_dudx(0, 1) +
2060 Gamma[0] * interpolated_dudx(1, 0)) *
2061 psif[q] * dtestfdx(l, 1));
2065 for (
unsigned k = 0; k < 2; k++)
2067 double tmp = scaled_re * interpolated_u[k];
2070 tmp -= scaled_re_st * mesh_velocity[k];
2072 sum -= r * tmp * d_dudx_dX(p, q, 0, k) * testf_;
2075 sum -= tmp * interpolated_dudx(0, k) * psif[q] * testf_;
2080 sum += scaled_re_st * r * pos_time_weight *
2081 interpolated_dudx(0, p) * psif[q] * testf_;
2087 sum -= scaled_re_st * dudt[0] * psif[q] * testf_;
2093 sum += 2.0 * scaled_re_inv_ro * interpolated_u[2] * psif[q] *
2098 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2099 sum * J * w * hang_weight;
2106 if (element_has_node_with_aux_node_update_fct)
2109 for (
unsigned q_local = 0; q_local < n_node; q_local++)
2113 unsigned n_master2 = 1;
2114 double hang_weight2 = 1.0;
2120 Node* actual_shape_controlling_node_pt =
node_pt(q_local);
2123 if (is_node_hanging2)
2128 n_master2 = hang_info2_pt->
nmaster();
2137 for (
unsigned mm = 0; mm < n_master2; mm++)
2139 if (is_node_hanging2)
2141 actual_shape_controlling_node_pt =
2147 unsigned q = local_shape_controlling_node_lookup
2148 [actual_shape_controlling_node_pt];
2151 for (
unsigned p = 0; p < 2; p++)
2154 double tmp = scaled_re_st * r * val_time_weight *
2155 psif[q_local] * testf_;
2156 tmp += r * scaled_re * interpolated_dudx(0, 0) *
2157 psif[q_local] * testf_;
2159 for (
unsigned k = 0; k < 2; k++)
2161 double tmp2 = scaled_re * interpolated_u[k];
2164 tmp2 -= scaled_re_st * mesh_velocity[k];
2166 tmp += r * tmp2 * dpsifdx(q_local, k) * testf_;
2169 tmp += r * visc_ratio * (1.0 +
Gamma[0]) *
2170 dpsifdx(q_local, 0) * dtestfdx(l, 0);
2172 r * visc_ratio * dpsifdx(q_local, 1) * dtestfdx(l, 1);
2173 tmp += visc_ratio * (1.0 +
Gamma[0]) * psif[q_local] *
2177 double sum = -d_U_dX(p, q_local, 0) * tmp;
2180 tmp = scaled_re * r * interpolated_dudx(0, 1) *
2181 psif[q_local] * testf_;
2182 tmp += r * visc_ratio *
Gamma[0] * dpsifdx(q_local, 0) *
2186 sum -= d_U_dX(p, q, 1) * tmp;
2191 (r * scaled_re_inv_ro + scaled_re * interpolated_u[2]) *
2192 psif[q_local] * testf_;
2195 sum += d_U_dX(p, q, 2) * tmp;
2198 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2199 sum * J * w * hang_weight * hang_weight2;
2212 if (is_node_hanging)
2234 for (
unsigned p = 0; p < 2; p++)
2237 for (
unsigned q = 0; q < n_shape_controlling_node; q++)
2243 double sum = r * body_force[1] * testf_;
2246 sum += r * scaled_re_inv_fr * testf_ * G[1];
2249 sum += r * interpolated_p * dtestfdx(l, 1);
2255 sum -= visc_ratio * r *
2256 (interpolated_dudx(1, 0) +
2257 Gamma[1] * interpolated_dudx(0, 1)) *
2260 sum -= visc_ratio * r * (1.0 +
Gamma[1]) *
2261 interpolated_dudx(1, 1) * dtestfdx(l, 1);
2264 sum -= scaled_re_st * r * dudt[1] * testf_;
2268 (r * interpolated_u[0] * interpolated_dudx(1, 0) +
2269 r * interpolated_u[1] * interpolated_dudx(1, 1)) *
2275 for (
unsigned k = 0; k < 2; k++)
2277 sum += scaled_re_st * r * mesh_velocity[k] *
2278 interpolated_dudx(1, k) * testf_;
2283 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2284 sum * dJ_dX(p, q) * w * hang_weight;
2290 sum = r * d_body_force_dx(1, p) * psif[q] * testf_;
2293 sum += body_force[1] * psif[q] * testf_;
2299 sum += scaled_re_inv_fr * G[1] * psif[q] * testf_;
2303 sum += r * interpolated_p * d_dtestfdx_dX(p, q, l, 1);
2306 sum += interpolated_p * psif[q] * dtestfdx(l, 1);
2312 ((d_dudx_dX(p, q, 1, 0) +
Gamma[1] * d_dudx_dX(p, q, 0, 1)) *
2314 (interpolated_dudx(1, 0) +
2315 Gamma[1] * interpolated_dudx(0, 1)) *
2316 d_dtestfdx_dX(p, q, l, 0) +
2317 (1.0 +
Gamma[1]) * d_dudx_dX(p, q, 1, 1) * dtestfdx(l, 1) +
2318 (1.0 +
Gamma[1]) * interpolated_dudx(1, 1) *
2319 d_dtestfdx_dX(p, q, l, 1));
2323 visc_ratio * ((interpolated_dudx(1, 0) +
2324 Gamma[1] * interpolated_dudx(0, 1)) *
2325 psif[q] * dtestfdx(l, 0) +
2326 (1.0 +
Gamma[1]) * interpolated_dudx(1, 1) *
2327 psif[q] * dtestfdx(l, 1));
2331 for (
unsigned k = 0; k < 2; k++)
2333 double tmp = scaled_re * interpolated_u[k];
2336 tmp -= scaled_re_st * mesh_velocity[k];
2338 sum -= r * tmp * d_dudx_dX(p, q, 1, k) * testf_;
2341 sum -= tmp * interpolated_dudx(1, k) * psif[q] * testf_;
2346 sum += scaled_re_st * r * pos_time_weight *
2347 interpolated_dudx(1, p) * psif[q] * testf_;
2353 sum -= scaled_re_st * dudt[1] * psif[q] * testf_;
2357 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2358 sum * J * w * hang_weight;
2365 if (element_has_node_with_aux_node_update_fct)
2368 for (
unsigned q_local = 0; q_local < n_node; q_local++)
2372 unsigned n_master2 = 1;
2373 double hang_weight2 = 1.0;
2379 Node* actual_shape_controlling_node_pt =
node_pt(q_local);
2382 if (is_node_hanging2)
2387 n_master2 = hang_info2_pt->
nmaster();
2396 for (
unsigned mm = 0; mm < n_master2; mm++)
2398 if (is_node_hanging2)
2400 actual_shape_controlling_node_pt =
2406 unsigned q = local_shape_controlling_node_lookup
2407 [actual_shape_controlling_node_pt];
2410 for (
unsigned p = 0; p < 2; p++)
2413 double tmp = scaled_re * r * interpolated_dudx(1, 0) *
2414 psif[q_local] * testf_;
2415 tmp += r * visc_ratio *
Gamma[1] * dpsifdx(q_local, 1) *
2419 double sum = -d_U_dX(p, q, 0) * tmp;
2422 tmp = scaled_re_st * r * val_time_weight * psif[q_local] *
2424 tmp += r * scaled_re * interpolated_dudx(1, 1) *
2425 psif[q_local] * testf_;
2427 for (
unsigned k = 0; k < 2; k++)
2429 double tmp2 = scaled_re * interpolated_u[k];
2432 tmp2 -= scaled_re_st * mesh_velocity[k];
2434 tmp += r * tmp2 * dpsifdx(q_local, k) * testf_;
2438 (dpsifdx(q_local, 0) * dtestfdx(l, 0) +
2439 (1.0 +
Gamma[1]) * dpsifdx(q_local, 1) * dtestfdx(l, 1));
2442 sum -= d_U_dX(p, q, 1) * tmp;
2445 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2446 sum * J * w * hang_weight * hang_weight2;
2459 if (is_node_hanging)
2481 for (
unsigned p = 0; p < 2; p++)
2484 for (
unsigned q = 0; q < n_shape_controlling_node; q++)
2490 double sum = r * body_force[2] * testf_;
2493 sum += r * scaled_re_inv_fr * testf_ * G[2];
2503 (r * interpolated_dudx(2, 0) -
Gamma[0] * interpolated_u[2]) *
2507 visc_ratio * r * interpolated_dudx(2, 1) * dtestfdx(l, 1);
2510 ((interpolated_u[2] / r) -
2511 Gamma[0] * interpolated_dudx(2, 0)) *
2515 sum -= scaled_re_st * r * dudt[2] * testf_;
2519 (r * interpolated_u[0] * interpolated_dudx(2, 0) +
2520 interpolated_u[0] * interpolated_u[2] +
2521 r * interpolated_u[1] * interpolated_dudx(2, 1)) *
2527 for (
unsigned k = 0; k < 2; k++)
2529 sum += scaled_re_st * r * mesh_velocity[k] *
2530 interpolated_dudx(2, k) * testf_;
2535 sum -= 2.0 * r * scaled_re_inv_ro * interpolated_u[0] * testf_;
2538 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2539 sum * dJ_dX(p, q) * w * hang_weight;
2545 sum = r * d_body_force_dx(2, p) * psif[q] * testf_;
2548 sum += body_force[2] * psif[q] * testf_;
2554 sum += scaled_re_inv_fr * G[2] * psif[q] * testf_;
2560 sum -= visc_ratio * r *
2561 (d_dudx_dX(p, q, 2, 0) * dtestfdx(l, 0) +
2562 interpolated_dudx(2, 0) * d_dtestfdx_dX(p, q, l, 0) +
2563 d_dudx_dX(p, q, 2, 1) * dtestfdx(l, 1) +
2564 interpolated_dudx(2, 1) * d_dtestfdx_dX(p, q, l, 1));
2566 sum += visc_ratio *
Gamma[0] * d_dudx_dX(p, q, 2, 0) * testf_;
2571 (interpolated_dudx(2, 0) * psif[q] * dtestfdx(l, 0) +
2572 interpolated_dudx(2, 1) * psif[q] * dtestfdx(l, 1) +
2573 interpolated_u[2] * psif[q] * testf_ / (r * r));
2577 for (
unsigned k = 0; k < 2; k++)
2579 double tmp = scaled_re * interpolated_u[k];
2582 tmp -= scaled_re_st * mesh_velocity[k];
2584 sum -= r * tmp * d_dudx_dX(p, q, 2, k) * testf_;
2587 sum -= tmp * interpolated_dudx(2, k) * psif[q] * testf_;
2592 sum += scaled_re_st * r * pos_time_weight *
2593 interpolated_dudx(2, p) * psif[q] * testf_;
2599 sum -= scaled_re_st * dudt[2] * psif[q] * testf_;
2605 sum -= 2.0 * scaled_re_inv_ro * interpolated_u[0] * psif[q] *
2610 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2611 sum * J * w * hang_weight;
2618 if (element_has_node_with_aux_node_update_fct)
2621 for (
unsigned q_local = 0; q_local < n_node; q_local++)
2625 unsigned n_master2 = 1;
2626 double hang_weight2 = 1.0;
2632 Node* actual_shape_controlling_node_pt =
node_pt(q_local);
2635 if (is_node_hanging2)
2640 n_master2 = hang_info2_pt->
nmaster();
2649 for (
unsigned mm = 0; mm < n_master2; mm++)
2651 if (is_node_hanging2)
2653 actual_shape_controlling_node_pt =
2659 unsigned q = local_shape_controlling_node_lookup
2660 [actual_shape_controlling_node_pt];
2663 for (
unsigned p = 0; p < 2; p++)
2666 double tmp = (2.0 * r * scaled_re_inv_ro +
2667 r * scaled_re * interpolated_dudx(2, 0) -
2668 scaled_re * interpolated_u[2]) *
2669 psif[q_local] * testf_;
2672 double sum = -d_U_dX(p, q, 0) * tmp;
2676 sum -= d_U_dX(p, q, 1) * scaled_re * r *
2677 interpolated_dudx(2, 1) * psif[q_local] * testf_;
2680 tmp = scaled_re_st * r * val_time_weight * psif[q_local] *
2683 scaled_re * interpolated_u[0] * psif[q_local] * testf_;
2685 for (
unsigned k = 0; k < 2; k++)
2687 double tmp2 = scaled_re * interpolated_u[k];
2690 tmp2 -= scaled_re_st * mesh_velocity[k];
2692 tmp += r * tmp2 * dpsifdx(q_local, k) * testf_;
2696 (r * dpsifdx(q_local, 0) -
Gamma[0] * psif[q_local]) *
2699 r * visc_ratio * dpsifdx(q_local, 1) * dtestfdx(l, 1);
2702 ((psif[q_local] / r) -
Gamma[0] * dpsifdx(q_local, 0)) *
2706 sum -= d_U_dX(p, q, 2) * tmp;
2709 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2710 sum * J * w * hang_weight * hang_weight2;
2725 for (
unsigned l = 0; l < n_pres; l++)
2728 if (pressure_dof_is_hanging[l])
2735 n_master = hang_info_pt->
nmaster();
2744 for (
unsigned m = 0; m < n_master; m++)
2748 if (pressure_dof_is_hanging[l])
2763 const double testp_ = testp[l];
2769 for (
unsigned p = 0; p < 2; p++)
2772 for (
unsigned q = 0; q < n_shape_controlling_node; q++)
2778 double aux = -r * source;
2781 aux += (interpolated_u[0] + r * interpolated_dudx(0, 0) +
2782 r * interpolated_dudx(1, 1));
2785 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2786 aux * dJ_dX(p, q) * testp_ * w * hang_weight;
2792 aux = -r * source_gradient[p] * psif[q];
2795 aux -= source * psif[q];
2799 aux += r * (d_dudx_dX(p, q, 0, 0) + d_dudx_dX(p, q, 1, 1));
2802 aux += (interpolated_dudx(0, 0) + interpolated_dudx(1, 1)) *
2807 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2808 aux * testp_ * J * w * hang_weight;
2814 if (element_has_node_with_aux_node_update_fct)
2817 for (
unsigned q_local = 0; q_local < n_node; q_local++)
2821 unsigned n_master2 = 1;
2822 double hang_weight2 = 1.0;
2828 Node* actual_shape_controlling_node_pt =
node_pt(q_local);
2831 if (is_node_hanging2)
2836 n_master2 = hang_info2_pt->
nmaster();
2845 for (
unsigned mm = 0; mm < n_master2; mm++)
2847 if (is_node_hanging2)
2849 actual_shape_controlling_node_pt =
2855 unsigned q = local_shape_controlling_node_lookup
2856 [actual_shape_controlling_node_pt];
2859 for (
unsigned p = 0; p < 2; p++)
2861 double aux = d_U_dX(p, q, 0) *
2862 (psif[q_local] + r * dpsifdx(q_local, 0)) +
2863 d_U_dX(p, q, 1) * r * dpsifdx(q_local, 1);
2867 dresidual_dnodal_coordinates(local_eqn, p, q) +=
2868 aux * testp_ * J * w * hang_weight * hang_weight2;
A Class for the derivatives of shape functions The class design is essentially the same as Shape,...
double * value_pt(const unsigned &i) const
Return the pointer to the i-the stored value. Typically this is required when direct access to the st...
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
double nodal_value(const unsigned &n, const unsigned &i) const
Return the i-th value stored at local node n. Produces suitably interpolated values for hanging nodes...
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
int nodal_local_eqn(const unsigned &n, const unsigned &i) const
Return the local equation number corresponding to the i-th value at the n-th local node.
unsigned nnode() const
Return the number of nodes.
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
double nodal_position(const unsigned &n, const unsigned &i) const
Return the i-th coordinate at local node n. If the node is hanging, the appropriate interpolation is ...
double dnodal_position_dt(const unsigned &n, const unsigned &i) const
Return the i-th component of nodal velocity: dx/dt at local node n.
static double Default_fd_jacobian_step
Double used for the default finite difference step in elemental jacobian calculations.
unsigned ndof() const
Return the number of equations/dofs in the element.
virtual void get_source_fct_gradient(const double &time, const unsigned &ipt, const Vector< double > &x, Vector< double > &gradient)
Get gradient of source term at (Eulerian) position x. Computed via function pointer (if set) or by fi...
const double & re_invro() const
Global Reynolds number multiplied by inverse Rossby number.
virtual unsigned u_index_axi_nst(const unsigned &i) const
Return the index at which the i-th unknown velocity component is stored. The default value,...
virtual int p_local_eqn(const unsigned &n) const =0
Access function for the local equation number information for the pressure. p_local_eqn[n] = local eq...
const double & viscosity_ratio() const
Viscosity ratio for element: Element's viscosity relative to the viscosity used in the definition of ...
virtual void extrapolated_strain_rate(const Vector< double > &s, DenseMatrix< double > &strain_rate) const
Extrapolated strain-rate tensor: where (in that order) based on the previous time steps evaluated a...
virtual void pshape_axi_nst(const Vector< double > &s, Shape &psi) const =0
Compute the pressure shape functions at local coordinate s.
const double & re_st() const
Product of Reynolds and Strouhal number (=Womersley number)
static Vector< double > Gamma
Vector to decide whether the stress-divergence form is used or not.
virtual unsigned npres_axi_nst() const =0
Function to return number of pressure degrees of freedom.
const double & re_invfr() const
Global inverse Froude number.
bool Use_extrapolated_strainrate_to_compute_second_invariant
GeneralisedNewtonianConstitutiveEquation< 3 > * Constitutive_eqn_pt
Pointer to the generalised Newtonian constitutive equation.
const double & re() const
Reynolds number.
double du_dt_axi_nst(const unsigned &n, const unsigned &i) const
i-th component of du/dt at local node n. Uses suitably interpolated value for hanging nodes.
double get_source_fct(const double &time, const unsigned &ipt, const Vector< double > &x)
Calculate the source fct at given time and Eulerian position.
virtual void get_body_force_axi_nst(const double &time, const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &result)
Calculate the body force fct at a given time and Eulerian position.
virtual int p_nodal_index_axi_nst() const
Which nodal value represents the pressure?
virtual double p_axi_nst(const unsigned &n_p) const =0
Pressure at local pressure "node" n_p Uses suitably interpolated value for hanging nodes.
const double & density_ratio() const
Density ratio for element: Element's density relative to the viscosity used in the definition of the ...
virtual double dshape_and_dtest_eulerian_at_knot_axi_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const =0
Compute the shape functions and derivatives w.r.t. global coords at ipt-th integration point Return J...
const Vector< double > & g() const
Vector of gravitational components.
bool ALE_is_disabled
Boolean flag to indicate if ALE formulation is disabled when the time-derivatives are computed....
void strain_rate(const Vector< double > &s, DenseMatrix< double > &strain_rate) const
Strain-rate tensor: where (in that order)
virtual void get_body_force_gradient_axi_nst(const double &time, const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, DenseMatrix< double > &d_body_force_dx)
Get gradient of body force term at (Eulerian) position x. Computed via function pointer (if set) or b...
virtual double viscosity(const double &second_invariant_of_rate_of_strain_tensor)=0
Function implementing the constitutive model Input: second invariant of the rate of strain Output: th...
virtual double dviscosity_dinvariant(const double &second_invariant_of_rate_of_strain_tensor)=0
Function returning the derivative of the viscosity w.r.t. the second invariant of the rate of strain ...
Class that contains data for hanging nodes.
double const & master_weight(const unsigned &i) const
Return weight for dofs on i-th master node.
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
unsigned nmaster() const
Return the number of master nodes.
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
double & x(const unsigned &i)
Return the i-th nodal coordinate.
HangInfo *const & hanging_pt() const
Return pointer to hanging node data (this refers to the geometric hanging node status) (const version...
void perform_auxiliary_node_update_fct()
Execute auxiliary update function (if any) – this can be used to update any nodal values following th...
TimeStepper *& position_time_stepper_pt()
Return a pointer to the position timestepper.
bool has_auxiliary_node_update_fct_pt()
Boolean to indicate if node has a pointer to and auxiliary update function.
bool is_hanging() const
Test whether the node is geometrically hanging.
An OomphLibError object which should be thrown when an run-time error is encountered....
An OomphLibWarning object which should be created as a temporary object to issue a warning....
////////////////////////////////////////////////////////////////// //////////////////////////////////...
////////////////////////////////////////////////////////////////// //////////////////////////////////...
unsigned nshape_controlling_nodes()
Number of shape-controlling nodes = the number of non-hanging nodes plus the number of master nodes a...
std::map< Node *, unsigned > shape_controlling_node_lookup()
Return lookup scheme for unique number associated with any of the nodes that actively control the sha...
int local_hang_eqn(Node *const &node_pt, const unsigned &i)
Access function that returns the local equation number for the hanging node variables (values stored ...
void fill_in_generic_residual_contribution_axi_nst(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix, unsigned flag)
Add element's contribution to the elemental residual vector and/or Jacobian matrix and mass matrix fl...
virtual Node * pressure_node_pt(const unsigned &n_p)
Pointer to n_p-th pressure node (Default: NULL, indicating that pressure is not based on nodal interp...
virtual void get_dresidual_dnodal_coordinates(RankThreeTensor< double > &dresidual_dnodal_coordinates)
Compute derivatives of elemental residual vector with respect to nodal coordinates....
A Class for shape functions. In simple cases, the shape functions have only one index that can be tho...
virtual double weight(const unsigned &i, const unsigned &j) const
Access function for j-th weight for the i-th derivative.
Time *const & time_pt() const
Access function for the pointer to time (const version)
double & time()
Return the current value of the continuous time.
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
double second_invariant(const DenseMatrix< double > &tensor)
Compute second invariant of tensor.
//////////////////////////////////////////////////////////////////// ////////////////////////////////...