46 int LinearisedAxisymmetricNavierStokesEquations::
47 Pressure_not_stored_at_node = -100;
50 double LinearisedAxisymmetricNavierStokesEquations::
51 Default_Physical_Constant_Value = 0.0;
54 int LinearisedAxisymmetricNavierStokesEquations::
55 Default_Azimuthal_Mode_Number_Value = 0;
58 double LinearisedAxisymmetricNavierStokesEquations::
59 Default_Physical_Ratio_Value = 1.0;
70 std::ostream &outfile,
const unsigned &nplot,
const unsigned &
t)
73 const unsigned n_node =
nnode();
91 for(
unsigned iplot=0;iplot<n_plot_points;iplot++)
100 for(
unsigned i=0;
i<2;
i++)
103 interpolated_x[
i]=0.0;
106 for(
unsigned l=0;l<n_node;l++)
113 for(
unsigned i=0;
i<6;
i++)
119 interpolated_u[
i]=0.0;
122 for(
unsigned l=0;l<n_node;l++)
124 interpolated_u[
i] +=
nodal_value(t,l,u_nodal_index)*psi[l];
129 for(
unsigned i=0;
i<2;
i++) { outfile << interpolated_x[
i] <<
" "; }
132 for(
unsigned i=0;
i<6;
i++) { outfile << interpolated_u[
i] <<
" "; }
134 outfile << std::endl;
151 std::ostream &outfile,
const unsigned &nplot)
163 for(
unsigned iplot=0;iplot<n_plot_points;iplot++)
172 for(
unsigned i=0;
i<6;
i++)
178 for(
unsigned i=0;
i<2;
i++)
183 outfile << std::endl;
185 outfile << std::endl;
201 FILE* file_pt,
const unsigned &nplot)
213 for(
unsigned iplot=0;iplot<n_plot_points;iplot++)
222 for(
unsigned i=0;
i<6;
i++)
228 for(
unsigned i=0;
i<2;
i++)
233 fprintf(file_pt,
"\n");
236 fprintf(file_pt,
"\n");
256 if ((strainrate.
ncol()!=3)||(strainrate.
nrow()!=3))
258 std::ostringstream error_message;
259 error_message <<
"The strain rate has incorrect dimensions " 260 << strainrate.
ncol() <<
" x " 261 << strainrate.
nrow() <<
" Not 3" << std::endl;
265 "LinearisedAxisymmetricNavierStokeEquations::strain_rate()",
266 OOMPH_EXCEPTION_LOCATION);
271 const unsigned n_node =
nnode();
281 double interpolated_r = 0.0;
284 double UC = 0.0, US = 0.0;
285 double dUCdr = 0.0, dUSdr = 0.0;
286 double dUCdz = 0.0, dUSdz = 0.0;
287 double WC = 0.0, WS = 0.0;
288 double dWCdr = 0.0, dWSdr = 0.0;
289 double dWCdz = 0.0, dWSdz = 0.0;
290 double VC = 0.0, VS = 0.0;
291 double dVCdr = 0.0, dVSdr = 0.0;
292 double dVCdz = 0.0, dVSdz = 0.0;
295 unsigned u_nodal_index[6];
296 for(
unsigned i=0;
i<6;++
i)
303 for(
unsigned l=0;l<n_node;l++)
314 dUCdr +=
nodal_value(l,u_nodal_index[0])*dpsidx(l,0);
315 dUSdr +=
nodal_value(l,u_nodal_index[1])*dpsidx(l,0);
316 dWCdr +=
nodal_value(l,u_nodal_index[2])*dpsidx(l,0);
317 dWSdr +=
nodal_value(l,u_nodal_index[3])*dpsidx(l,0);
318 dVCdr +=
nodal_value(l,u_nodal_index[4])*dpsidx(l,0);
319 dVSdr +=
nodal_value(l,u_nodal_index[5])*dpsidx(l,0);
321 dUCdz +=
nodal_value(l,u_nodal_index[0])*dpsidx(l,1);
322 dUSdz +=
nodal_value(l,u_nodal_index[1])*dpsidx(l,1);
323 dWCdz +=
nodal_value(l,u_nodal_index[2])*dpsidx(l,1);
324 dWSdz +=
nodal_value(l,u_nodal_index[3])*dpsidx(l,1);
325 dVCdz +=
nodal_value(l,u_nodal_index[4])*dpsidx(l,1);
326 dVSdz +=
nodal_value(l,u_nodal_index[5])*dpsidx(l,1);
336 const double cosktheta = 1.0/sqrt(2);
337 const double sinktheta = cosktheta;
341 const double ur = UC*cosktheta + US*sinktheta;
342 const double utheta = VC*cosktheta + VS*sinktheta;
344 const double durdr = dUCdr*cosktheta + dUSdr*sinktheta;
345 const double durdz = dUCdz*cosktheta + dUSdz*sinktheta;
346 const double durdtheta = k*US*cosktheta - k*UC*sinktheta;
348 const double duzdr = dWCdr*cosktheta + dWSdr*sinktheta;
349 const double duzdz = dWCdz*cosktheta + dWSdz*sinktheta;
350 const double duzdtheta = k*WS*cosktheta - k*WC*sinktheta;
352 const double duthetadr = dVCdr*cosktheta + dVSdr*sinktheta;
353 const double duthetadz = dVCdz*cosktheta + dVSdz*sinktheta;
354 const double duthetadtheta = k*VS*cosktheta - k*VC*sinktheta;
358 strainrate(0,0)=durdr;
359 strainrate(0,1)=0.5*(durdz+duzdr);
360 strainrate(1,0)=strainrate(0,1);
361 strainrate(0,2)=0.5*duthetadr;
362 strainrate(2,0)=strainrate(0,2);
363 strainrate(1,1)=duzdz;
364 strainrate(1,2)=0.5*duthetadz;
365 strainrate(2,1)=strainrate(1,2);
370 if (std::abs(interpolated_r)>1.0
e-16)
372 double inverse_radius=1.0/interpolated_r;
373 strainrate(0,2)=0.5*(duthetadr + inverse_radius*(durdtheta - utheta));
374 strainrate(2,0)=strainrate(0,2);
375 strainrate(2,2)=inverse_radius*(ur + duthetadtheta);
376 strainrate(1,2)=0.5*(duthetadz + inverse_radius*duzdtheta);
377 strainrate(2,1)=strainrate(1,2);
399 const unsigned n_node =
nnode();
406 unsigned u_nodal_index[6];
407 for(
unsigned i=0;
i<6;++
i)
414 Shape psif(n_node), testf(n_node);
415 DShape dpsifdx(n_node,2), dtestfdx(n_node,2);
418 Shape psip(n_pres), testp(n_pres);
434 int local_eqn = 0, local_unknown = 0;
437 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
456 const double W = w*J;
480 for(
unsigned l=0;l<n_pres;l++)
483 const double psip_ = psip(l);
486 for(
unsigned i=0;
i<2;
i++)
492 interpolated_p[
i] += p_value*psip_;
500 for(
unsigned l=0;l<n_node;l++)
503 const double psif_ = psif(l);
506 for(
unsigned i=0;
i<2;
i++)
512 for(
unsigned i=0;
i<6;
i++)
518 interpolated_u[
i] += u_value*psif_;
524 for(
unsigned j=0;j<2;j++)
526 interpolated_dudx(i,j) += u_value*dpsifdx(l,j);
535 for(
unsigned l=0;l<n_node;l++)
538 for(
unsigned i=0;
i<2;
i++)
567 const double interpolated_ur = base_flow_u[0];
568 const double interpolated_uz = base_flow_u[1];
569 const double interpolated_utheta = base_flow_u[2];
570 const double interpolated_durdr = base_flow_dudx(0,0);
571 const double interpolated_durdz = base_flow_dudx(0,1);
572 const double interpolated_duzdr = base_flow_dudx(1,0);
573 const double interpolated_duzdz = base_flow_dudx(1,1);
574 const double interpolated_duthetadr = base_flow_dudx(2,0);
575 const double interpolated_duthetadz = base_flow_dudx(2,1);
578 const double r = interpolated_x[0];
581 const double interpolated_UC = interpolated_u[0];
582 const double interpolated_US = interpolated_u[1];
583 const double interpolated_WC = interpolated_u[2];
584 const double interpolated_WS = interpolated_u[3];
585 const double interpolated_VC = interpolated_u[4];
586 const double interpolated_VS = interpolated_u[5];
587 const double interpolated_PC = interpolated_p[0];
588 const double interpolated_PS = interpolated_p[1];
591 const double interpolated_dUCdr = interpolated_dudx(0,0);
592 const double interpolated_dUCdz = interpolated_dudx(0,1);
593 const double interpolated_dUSdr = interpolated_dudx(1,0);
594 const double interpolated_dUSdz = interpolated_dudx(1,1);
595 const double interpolated_dWCdr = interpolated_dudx(2,0);
596 const double interpolated_dWCdz = interpolated_dudx(2,1);
597 const double interpolated_dWSdr = interpolated_dudx(3,0);
598 const double interpolated_dWSdz = interpolated_dudx(3,1);
599 const double interpolated_dVCdr = interpolated_dudx(4,0);
600 const double interpolated_dVCdz = interpolated_dudx(4,1);
601 const double interpolated_dVSdr = interpolated_dudx(5,0);
602 const double interpolated_dVSdz = interpolated_dudx(5,1);
609 for(
unsigned l=0;l<n_node;l++)
612 const double testf_ = testf(l);
613 const double dtestfdr = dtestfdx(l,0);
614 const double dtestfdz = dtestfdx(l,1);
627 residuals[local_eqn] += interpolated_PC*(testf_ + r*dtestfdr)*W;
630 residuals[local_eqn] -= visc_ratio*
631 r*(1.0+
Gamma[0])*interpolated_dUCdr*dtestfdr*W;
633 residuals[local_eqn] -= visc_ratio*r*
634 (interpolated_dUCdz +
Gamma[0]*interpolated_dWCdr)*
637 residuals[local_eqn] += visc_ratio*(
638 (k*
Gamma[0]*interpolated_dVSdr)
639 - (k*(2.0+
Gamma[0])*interpolated_VS/r)
640 - ((1.0+
Gamma[0]+(k*k))*interpolated_UC/r))*testf_*W;
643 residuals[local_eqn] -= scaled_re_st*r*dudt[0]*testf_*
W;
646 residuals[local_eqn] -=
647 scaled_re*(r*interpolated_ur*interpolated_dUCdr
648 + r*interpolated_durdr*interpolated_UC
649 + k*interpolated_utheta*interpolated_US
650 - 2*interpolated_utheta*interpolated_VC
651 + r*interpolated_uz*interpolated_dUCdz
652 + r*interpolated_durdz*interpolated_WC)*testf_*W;
657 for(
unsigned j=0;j<2;j++)
659 residuals[local_eqn] +=
660 scaled_re_st*r*mesh_velocity[j]
661 *interpolated_dudx(0,j)*testf_*
W;
671 for(
unsigned l2=0;l2<n_node;l2++)
674 const double psif_ = psif[l2];
675 const double dpsifdr = dpsifdx(l2,0);
676 const double dpsifdz = dpsifdx(l2,1);
680 if(local_unknown >= 0)
685 mass_matrix(local_eqn,local_unknown) +=
686 scaled_re_st*r*psif_*testf_*
W;
692 jacobian(local_eqn,local_unknown)
693 -= visc_ratio*r*(1.0+
Gamma[0])*dpsifdr*dtestfdr*W;
695 jacobian(local_eqn,local_unknown)
696 -= visc_ratio*r*dpsifdz*dtestfdz*
W;
698 jacobian(local_eqn,local_unknown)
699 -= visc_ratio*(1.0+
Gamma[0]+(k*k))*psif_*testf_*W/r;
702 jacobian(local_eqn,local_unknown) -=
707 jacobian(local_eqn,local_unknown) -=
708 scaled_re*r*(psif_*interpolated_durdr
709 + interpolated_ur*dpsifdr
710 + interpolated_uz*dpsifdz)*testf_*W;
715 for(
unsigned j=0;j<2;j++)
717 jacobian(local_eqn,local_unknown) +=
718 scaled_re_st*r*mesh_velocity[j]
719 *dpsifdx(l2,j)*testf_*
W;
726 if(local_unknown >= 0)
729 jacobian(local_eqn,local_unknown) -=
730 scaled_re*k*interpolated_utheta*psif_*testf_*
W;
735 if(local_unknown >= 0)
738 jacobian(local_eqn,local_unknown) -=
739 visc_ratio*
Gamma[0]*r*dpsifdr*dtestfdz*
W;
742 jacobian(local_eqn,local_unknown) -=
743 scaled_re*r*interpolated_durdz*psif_*testf_*
W;
751 if(local_unknown >= 0)
754 jacobian(local_eqn,local_unknown) +=
755 scaled_re*2*interpolated_utheta*psif_*testf_*
W;
760 if(local_unknown >= 0)
763 jacobian(local_eqn,local_unknown) += visc_ratio*(
764 (
Gamma[0]*k*dpsifdr) - (k*(2.0+
Gamma[0])*psif_/r))*testf_*
W;
770 for(
unsigned l2=0;l2<n_pres;l2++)
774 if(local_unknown >= 0)
776 jacobian(local_eqn,local_unknown) +=
777 psip[l2]*(testf_ + r*dtestfdr)*W;
798 residuals[local_eqn] += interpolated_PS*(testf_ + r*dtestfdr)*W;
801 residuals[local_eqn] -= visc_ratio*
802 r*(1.0+
Gamma[0])*interpolated_dUSdr*dtestfdr*W;
804 residuals[local_eqn] -= visc_ratio*r*
805 (interpolated_dUSdz +
Gamma[0]*interpolated_dWSdr)*
808 residuals[local_eqn] -= visc_ratio*(
809 (k*
Gamma[0]*interpolated_dVCdr)
810 - (k*(2.0+
Gamma[0])*interpolated_VC/r)
811 + ((1.0+
Gamma[0]+(k*k))*interpolated_US/r))*testf_*W;
814 residuals[local_eqn] -= scaled_re_st*r*dudt[1]*testf_*
W;
817 residuals[local_eqn] -=
818 scaled_re*(r*interpolated_ur*interpolated_dUSdr
819 + r*interpolated_durdr*interpolated_US
820 - k*interpolated_utheta*interpolated_UC
821 - 2*interpolated_utheta*interpolated_VS
822 + r*interpolated_uz*interpolated_dUSdz
823 + r*interpolated_durdz*interpolated_WS)*testf_*W;
828 for(
unsigned j=0;j<2;j++)
830 residuals[local_eqn] +=
831 scaled_re_st*r*mesh_velocity[j]
832 *interpolated_dudx(1,j)*testf_*
W;
842 for(
unsigned l2=0;l2<n_node;l2++)
845 const double psif_ = psif[l2];
846 const double dpsifdr = dpsifdx(l2,0);
847 const double dpsifdz = dpsifdx(l2,1);
851 if(local_unknown >= 0)
854 jacobian(local_eqn,local_unknown) +=
855 scaled_re*k*interpolated_utheta*psif_*testf_*
W;
860 if(local_unknown >= 0)
865 mass_matrix(local_eqn,local_unknown) +=
866 scaled_re_st*r*psif_*testf_*
W;
872 jacobian(local_eqn,local_unknown)
873 -= visc_ratio*r*(1.0+
Gamma[0])*dpsifdr*dtestfdr*W;
875 jacobian(local_eqn,local_unknown)
876 -= visc_ratio*r*dpsifdz*dtestfdz*
W;
878 jacobian(local_eqn,local_unknown)
879 -= visc_ratio*(1.0+
Gamma[0]+(k*k))*psif_*testf_*W/r;
882 jacobian(local_eqn,local_unknown)
887 jacobian(local_eqn,local_unknown) -=
888 scaled_re*r*(psif_*interpolated_durdr
889 + interpolated_ur*dpsifdr
890 + interpolated_uz*dpsifdz)*testf_*W;
895 for(
unsigned j=0;j<2;j++)
897 jacobian(local_eqn,local_unknown) +=
898 scaled_re_st*r*mesh_velocity[j]
899 *dpsifdx(l2,j)*testf_*
W;
909 if(local_unknown >= 0)
912 jacobian(local_eqn,local_unknown) -=
913 visc_ratio*
Gamma[0]*r*dpsifdr*dtestfdz*
W;
916 jacobian(local_eqn,local_unknown) -=
917 scaled_re*r*interpolated_durdz*psif_*testf_*
W;
922 if(local_unknown >= 0)
925 jacobian(local_eqn,local_unknown) -= visc_ratio*(
927 - (k*(2.0+
Gamma[0])*psif_/r))*testf_*
W;
932 if(local_unknown >= 0)
935 jacobian(local_eqn,local_unknown) +=
936 scaled_re*2*interpolated_utheta*psif_*testf_*
W;
942 for(
unsigned l2=0;l2<n_pres;l2++)
948 if(local_unknown >= 0)
950 jacobian(local_eqn,local_unknown)
951 += psip[l2]*(testf_ + r*dtestfdr)*W;
969 residuals[local_eqn] += r*interpolated_PC*dtestfdz*
W;
972 residuals[local_eqn] -= visc_ratio*r*
973 (interpolated_dWCdr +
Gamma[1]*interpolated_dUCdz)
976 residuals[local_eqn] -= visc_ratio*r*
977 (1.0 +
Gamma[1])*interpolated_dWCdz*dtestfdz*W;
979 residuals[local_eqn] += visc_ratio*k*
980 (
Gamma[1]*interpolated_dVSdz - k*interpolated_WC/r)*testf_*W;
983 residuals[local_eqn] -= scaled_re_st*r*dudt[2]*testf_*
W;
986 residuals[local_eqn] -=
987 scaled_re*(r*interpolated_ur*interpolated_dWCdr
988 + r*interpolated_duzdr*interpolated_UC
989 + k*interpolated_utheta*interpolated_WS
990 + r*interpolated_uz*interpolated_dWCdz
991 + r*interpolated_duzdz*interpolated_WC)*testf_*W;
996 for(
unsigned j=0;j<2;j++)
998 residuals[local_eqn] +=
999 scaled_re_st*r*mesh_velocity[j]
1000 *interpolated_dudx(2,j)*testf_*
W;
1010 for(
unsigned l2=0;l2<n_node;l2++)
1013 const double psif_ = psif[l2];
1014 const double dpsifdr = dpsifdx(l2,0);
1015 const double dpsifdz = dpsifdx(l2,1);
1019 if(local_unknown >= 0)
1022 jacobian(local_eqn,local_unknown) -=
1023 visc_ratio*r*
Gamma[1]*dpsifdz*dtestfdr*
W;
1026 jacobian(local_eqn,local_unknown) -=
1027 scaled_re*r*psif_*interpolated_duzdr*testf_*
W;
1035 if(local_unknown >= 0)
1040 mass_matrix(local_eqn,local_unknown) +=
1041 scaled_re_st*r*psif_*testf_*
W;
1047 jacobian(local_eqn,local_unknown) -=
1048 visc_ratio*r*dpsifdr*dtestfdr*
W;
1050 jacobian(local_eqn,local_unknown) -=
1051 visc_ratio*r*(1.0+
Gamma[1])*dpsifdz*dtestfdz*W;
1053 jacobian(local_eqn,local_unknown) -=
1054 visc_ratio*k*k*psif_*testf_*W/r;
1057 jacobian(local_eqn,local_unknown) -=
1062 jacobian(local_eqn,local_unknown) -=
1063 scaled_re*r*(interpolated_ur*dpsifdr
1064 + psif_*interpolated_duzdz
1065 + interpolated_uz*dpsifdz)*testf_*W;
1071 for(
unsigned j=0;j<2;j++)
1073 jacobian(local_eqn,local_unknown) +=
1074 scaled_re_st*r*mesh_velocity[j]
1075 *dpsifdx(l2,j)*testf_*
W;
1082 if(local_unknown >= 0)
1085 jacobian(local_eqn,local_unknown) -=
1086 scaled_re*k*interpolated_utheta*psif_*testf_*
W;
1094 if(local_unknown >= 0)
1097 jacobian(local_eqn,local_unknown) +=
1098 visc_ratio*
Gamma[1]*k*dpsifdz*testf_*
W;
1104 for(
unsigned l2=0;l2<n_pres;l2++)
1108 if(local_unknown >= 0)
1110 jacobian(local_eqn,local_unknown) +=
1111 r*psip[l2]*dtestfdz*
W;
1132 residuals[local_eqn] += r*interpolated_PS*dtestfdz*
W;
1135 residuals[local_eqn] -= visc_ratio*r*
1136 (interpolated_dWSdr +
Gamma[1]*interpolated_dUSdz)
1139 residuals[local_eqn] -= visc_ratio*r*
1140 (1.0+
Gamma[1])*interpolated_dWSdz*dtestfdz*W;
1142 residuals[local_eqn] -= visc_ratio*k*
1143 (
Gamma[1]*interpolated_dVCdz + k*interpolated_WS/r)*testf_*W;
1146 residuals[local_eqn] -= scaled_re_st*r*dudt[3]*testf_*
W;
1149 residuals[local_eqn] -=
1150 scaled_re*(r*interpolated_ur*interpolated_dWSdr
1151 + r*interpolated_duzdr*interpolated_US
1152 - k*interpolated_utheta*interpolated_WC
1153 + r*interpolated_uz*interpolated_dWSdz
1154 + r*interpolated_duzdz*interpolated_WS)*testf_*W;
1159 for(
unsigned j=0;j<2;j++)
1161 residuals[local_eqn] +=
1162 scaled_re_st*r*mesh_velocity[j]
1163 *interpolated_dudx(3,j)*testf_*
W;
1173 for(
unsigned l2=0;l2<n_node;l2++)
1176 const double psif_ = psif[l2];
1177 const double dpsifdr = dpsifdx(l2,0);
1178 const double dpsifdz = dpsifdx(l2,1);
1185 if(local_unknown >= 0)
1188 jacobian(local_eqn,local_unknown) -=
1189 visc_ratio*r*
Gamma[1]*dpsifdz*dtestfdr*
W;
1192 jacobian(local_eqn,local_unknown) -=
1193 scaled_re*r*psif_*interpolated_duzdr*testf_*
W;
1198 if(local_unknown >= 0)
1201 jacobian(local_eqn,local_unknown) +=
1202 scaled_re*k*interpolated_utheta*psif_*testf_*
W;
1207 if(local_unknown >= 0)
1212 mass_matrix(local_eqn,local_unknown) +=
1213 scaled_re_st*r*psif_*testf_*
W;
1219 jacobian(local_eqn,local_unknown) -=
1220 visc_ratio*r*dpsifdr*dtestfdr*
W;
1222 jacobian(local_eqn,local_unknown) -=
1223 visc_ratio*r*(1.0+
Gamma[1])*dpsifdz*dtestfdz*W;
1225 jacobian(local_eqn,local_unknown) -=
1226 visc_ratio*k*k*psif_*testf_*W/r;
1229 jacobian(local_eqn,local_unknown) -=
1234 jacobian(local_eqn,local_unknown) -=
1235 scaled_re*r*(interpolated_ur*dpsifdr
1236 + psif_*interpolated_duzdz
1237 + interpolated_uz*dpsifdz)*testf_*W;
1243 for(
unsigned j=0;j<2;j++)
1245 jacobian(local_eqn,local_unknown) +=
1246 scaled_re_st*r*mesh_velocity[j]
1247 *dpsifdx(l2,j)*testf_*
W;
1254 if(local_unknown >= 0)
1257 jacobian(local_eqn,local_unknown) -=
1258 visc_ratio*
Gamma[1]*k*dpsifdz*testf_*
W;
1268 for(
unsigned l2=0;l2<n_pres;l2++)
1274 if(local_unknown >= 0)
1276 jacobian(local_eqn,local_unknown) +=
1277 r*psip[l2]*dtestfdz*
W;
1295 residuals[local_eqn] -= k*interpolated_PS*testf_*
W;
1298 residuals[local_eqn] += visc_ratio*
1299 (-r*interpolated_dVCdr
1300 - k*
Gamma[0]*interpolated_US
1301 +
Gamma[0]*interpolated_VC)*dtestfdr*W;
1303 residuals[local_eqn] -= visc_ratio*
1304 (k*
Gamma[0]*interpolated_WS + r*interpolated_dVCdz)*dtestfdz*W;
1306 residuals[local_eqn] += visc_ratio*
1307 (
Gamma[0]*interpolated_dVCdr
1308 + k*(2.0+
Gamma[0])*interpolated_US/r
1309 - (1.0+(k*k)+(k*k*
Gamma[0]))*interpolated_VC/r)*testf_*W;
1312 residuals[local_eqn] -= scaled_re_st*r*dudt[4]*testf_*
W;
1315 residuals[local_eqn] -=
1316 scaled_re*(r*interpolated_ur*interpolated_dVCdr
1317 + r*interpolated_duthetadr*interpolated_UC
1318 + k*interpolated_utheta*interpolated_VS
1319 + interpolated_utheta*interpolated_UC
1320 + interpolated_ur*interpolated_VC
1321 + r*interpolated_uz*interpolated_dVCdz
1322 + r*interpolated_duthetadz*interpolated_WC)*testf_*W;
1327 for(
unsigned j=0;j<2;j++)
1329 residuals[local_eqn] +=
1330 scaled_re_st*r*mesh_velocity[j]
1331 *interpolated_dudx(4,j)*testf_*
W;
1341 for(
unsigned l2=0;l2<n_node;l2++)
1344 const double psif_ = psif[l2];
1345 const double dpsifdr = dpsifdx(l2,0);
1346 const double dpsifdz = dpsifdx(l2,1);
1350 if(local_unknown >= 0)
1353 jacobian(local_eqn,local_unknown) -=
1354 scaled_re*(r*interpolated_duthetadr
1355 + interpolated_utheta)*psif_*testf_*W;
1360 if(local_unknown >= 0)
1363 jacobian(local_eqn,local_unknown) += visc_ratio*k*psif_*(
1364 ((2.0+
Gamma[0])*testf_/r) - (
Gamma[0]*dtestfdr))*
W;
1369 if(local_unknown >= 0)
1372 jacobian(local_eqn,local_unknown) -=
1373 scaled_re*r*psif_*interpolated_duthetadz*testf_*
W;
1378 if(local_unknown >= 0)
1381 jacobian(local_eqn,local_unknown) -=
1382 visc_ratio*k*
Gamma[0]*psif_*dtestfdz*
W;
1387 if(local_unknown >= 0)
1392 mass_matrix(local_eqn,local_unknown) +=
1393 scaled_re_st*r*psif_*testf_*
W;
1399 jacobian(local_eqn,local_unknown) +=
1400 visc_ratio*(
Gamma[0]*psif_ - r*dpsifdr)*dtestfdr*W;
1402 jacobian(local_eqn,local_unknown) -=
1403 visc_ratio*r*dpsifdz*dtestfdz*
W;
1405 jacobian(local_eqn,local_unknown) +=
1406 visc_ratio*(
Gamma[0]*dpsifdr
1407 - (1.0+(k*k)+(k*k*
Gamma[0]))*psif_/r)*testf_*
W;
1410 jacobian(local_eqn,local_unknown) -=
1415 jacobian(local_eqn,local_unknown) -=
1416 scaled_re*(r*interpolated_ur*dpsifdr
1417 + interpolated_ur*psif_
1418 + r*interpolated_uz*dpsifdz)*testf_*W;
1423 for(
unsigned j=0;j<2;j++)
1425 jacobian(local_eqn,local_unknown) +=
1426 scaled_re_st*r*mesh_velocity[j]
1427 *dpsifdx(l2,j)*testf_*
W;
1434 if(local_unknown >= 0)
1437 jacobian(local_eqn,local_unknown) -=
1438 scaled_re*k*interpolated_utheta*psif_*testf_*
W;
1444 for(
unsigned l2=0;l2<n_pres;l2++)
1450 if(local_unknown >= 0)
1452 jacobian(local_eqn,local_unknown) -=
1453 k*psip[l2]*testf_*
W;
1471 residuals[local_eqn] += k*interpolated_PC*testf_*
W;
1474 residuals[local_eqn] += visc_ratio*
1475 (-r*interpolated_dVSdr
1476 + k*
Gamma[0]*interpolated_UC
1477 +
Gamma[0]*interpolated_VS)*dtestfdr*W;
1479 residuals[local_eqn] += visc_ratio*
1480 (k*
Gamma[0]*interpolated_WC - r*interpolated_dVSdz)*dtestfdz*W;
1482 residuals[local_eqn] += visc_ratio*
1483 (
Gamma[0]*interpolated_dVSdr
1484 - k*(2.0+
Gamma[0])*interpolated_UC/r
1485 - (1.0+(k*k)+(k*k*
Gamma[0]))*interpolated_VS/r)*testf_*W;
1488 residuals[local_eqn] -= scaled_re_st*r*dudt[5]*testf_*
W;
1491 residuals[local_eqn] -=
1492 scaled_re*(r*interpolated_ur*interpolated_dVSdr
1493 + r*interpolated_duthetadr*interpolated_US
1494 - k*interpolated_utheta*interpolated_VC
1495 + interpolated_utheta*interpolated_US
1496 + interpolated_ur*interpolated_VS
1497 + r*interpolated_uz*interpolated_dVSdz
1498 + r*interpolated_duthetadz*interpolated_WS)*testf_*W;
1503 for(
unsigned j=0;j<2;j++)
1505 residuals[local_eqn] +=
1506 scaled_re_st*r*mesh_velocity[j]
1507 *interpolated_dudx(5,j)*testf_*
W;
1517 for(
unsigned l2=0;l2<n_node;l2++)
1520 const double psif_ = psif[l2];
1521 const double dpsifdr = dpsifdx(l2,0);
1522 const double dpsifdz = dpsifdx(l2,1);
1526 if(local_unknown >= 0)
1529 jacobian(local_eqn,local_unknown) += visc_ratio*k*psif_*(
1530 (
Gamma[0]*dtestfdr) - ((2.0+
Gamma[0])*testf_/r))*
W;
1535 if(local_unknown >= 0)
1538 jacobian(local_eqn,local_unknown) -=
1539 scaled_re*(r*interpolated_duthetadr
1540 + interpolated_utheta)*psif_*testf_*W;
1545 if(local_unknown >= 0)
1548 jacobian(local_eqn,local_unknown) +=
1549 visc_ratio*k*
Gamma[0]*psif_*dtestfdz*
W;
1554 if(local_unknown >= 0)
1557 jacobian(local_eqn,local_unknown) -=
1558 scaled_re*r*psif_*interpolated_duthetadz*testf_*
W;
1563 if(local_unknown >= 0)
1566 jacobian(local_eqn,local_unknown) +=
1567 scaled_re*k*interpolated_utheta*psif_*testf_*
W;
1572 if(local_unknown >= 0)
1577 mass_matrix(local_eqn,local_unknown) +=
1578 scaled_re_st*r*psif_*testf_*
W;
1584 jacobian(local_eqn,local_unknown) +=
1585 visc_ratio*(
Gamma[0]*psif_ - r*dpsifdr)*dtestfdr*W;
1587 jacobian(local_eqn,local_unknown) -=
1588 visc_ratio*r*dpsifdz*dtestfdz*
W;
1590 jacobian(local_eqn,local_unknown) +=
1591 visc_ratio*(
Gamma[0]*dpsifdr
1592 - (1.0+(k*k)+(k*k*
Gamma[0]))*psif_/r)*testf_*
W;
1595 jacobian(local_eqn,local_unknown) -=
1600 jacobian(local_eqn,local_unknown) -=
1601 scaled_re*(r*interpolated_ur*dpsifdr
1602 + interpolated_ur*psif_
1603 + r*interpolated_uz*dpsifdz)*testf_*W;
1608 for(
unsigned j=0;j<2;j++)
1610 jacobian(local_eqn,local_unknown) +=
1611 scaled_re_st*r*mesh_velocity[j]
1612 *dpsifdx(l2,j)*testf_*
W;
1620 for(
unsigned l2=0;l2<n_pres;l2++)
1624 if(local_unknown >= 0)
1626 jacobian(local_eqn,local_unknown) +=
1627 k*psip[l2]*testf_*
W;
1645 for(
unsigned l=0;l<n_pres;l++)
1648 const double testp_ = testp[l];
1661 residuals[local_eqn] +=
1662 (interpolated_UC + r*interpolated_dUCdr
1663 + k*interpolated_VS + r*interpolated_dWCdz)*testp_*W;
1671 for(
unsigned l2=0;l2<n_node;l2++)
1674 const double psif_ = psif[l2];
1675 const double dpsifdr = dpsifdx(l2,0);
1676 const double dpsifdz = dpsifdx(l2,1);
1680 if(local_unknown >= 0)
1682 jacobian(local_eqn,local_unknown) +=
1683 (psif_ + r*dpsifdr)*testp_*W;
1691 if(local_unknown >= 0)
1693 jacobian(local_eqn,local_unknown) +=
1705 if(local_unknown >= 0)
1707 jacobian(local_eqn,local_unknown) +=
1730 residuals[local_eqn] +=
1731 (interpolated_US + r*interpolated_dUSdr
1732 - k*interpolated_VC + r*interpolated_dWSdz)*testp_*W;
1740 for(
unsigned l2=0;l2<n_node;l2++)
1743 const double psif_ = psif[l2];
1744 const double dpsifdr = dpsifdx(l2,0);
1745 const double dpsifdz = dpsifdx(l2,1);
1752 if(local_unknown >= 0)
1754 jacobian(local_eqn,local_unknown) +=
1755 (psif_ + r*dpsifdr)*testp_*W;
1763 if(local_unknown >= 0)
1765 jacobian(local_eqn,local_unknown) +=
1771 if(local_unknown >= 0)
1773 jacobian(local_eqn,local_unknown) -=
1809 const unsigned LinearisedAxisymmetricQCrouzeixRaviartElement::
1810 Initial_Nvalue[9]={6,6,6,6,6,6,6,6,6};
1834 const unsigned LinearisedAxisymmetricQTaylorHoodElement::
1835 Initial_Nvalue[9]={8,6,8,6,6,6,8,6,8};
1842 const unsigned LinearisedAxisymmetricQTaylorHoodElement::
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Return string for tecplot zone header (when plotting nplot points in each "coordinate direction") ...
double raw_nodal_value(const unsigned &n, const unsigned &i) const
Return the i-th value stored at local node n but do NOT take hanging nodes into account.
unsigned long nrow() const
Return the number of rows of the matrix.
unsigned long ncol() const
Return the number of columns of the matrix.
virtual void fill_in_generic_residual_contribution_linearised_axi_nst(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix, unsigned flag)
Compute the residuals for the Navier-Stokes equations; flag=1(or 0): do (or don't) compute the Jacobi...
virtual void get_s_plot(const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
Get cector of local coordinates of plot point i (when plotting nplot points in each "coordinate direc...
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 ...
virtual unsigned required_nvalue(const unsigned &n) const
Return number of values (pinned or dofs) required at local node n.
double & time()
Return current value of continous time.
virtual double dshape_and_dtest_eulerian_at_knot_linearised_axi_nst(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const =0
Compute the shape functions and their derivatives w.r.t. global coordinates at the ipt-th integration...
void strain_rate(const Vector< double > &s, DenseMatrix< double > &strain_rate) const
Strain-rate tensor: where (in that order)
virtual double p_linearised_axi_nst(const unsigned &n_p, const unsigned &i) const =0
Return the i-th pressure value at local pressure "node" n_p. Uses suitably interpolated value for han...
double interpolated_p_linearised_axi_nst(const Vector< double > &s, const unsigned &i) const
Return the i-th component of the FE interpolated pressure p[i] at local coordinate s...
virtual void get_base_flow_dudx(const double &time, const unsigned &ipt, const Vector< double > &x, DenseMatrix< double > &result) const
Calculate the derivatives of the velocity components of the base flow solution w.r.t. global coordinates (r and z) at a given time and Eulerian position.
const double & density_ratio() const
Density ratio for element: element's density relative to the viscosity used in the definition of the ...
void output_veloc(std::ostream &outfile, const unsigned &nplot, const unsigned &t)
Output function: r, z, U^C, U^S, V^C, V^S, W^C, W^S, in tecplot format. nplot points in each coordina...
virtual int p_local_eqn(const unsigned &n, const unsigned &i)=0
Access function for the local equation number information for the i-th component of the pressure...
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
virtual unsigned nplot_points(const unsigned &nplot) const
Return total number of plot points (when plotting nplot points in each "coordinate direction") ...
virtual void pshape_linearised_axi_nst(const Vector< double > &s, Shape &psi) const =0
Compute the pressure shape functions at local coordinate s.
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
static Vector< double > Gamma
Vector to decide whether the stress-divergence form is used or not.
double dshape_eulerian(const Vector< double > &s, Shape &psi, DShape &dpsidx) const
Compute the geometric shape functions and also first derivatives w.r.t. global coordinates at local c...
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual void write_tecplot_zone_footer(std::ostream &outfile, const unsigned &nplot) const
Add tecplot zone "footer" to output stream (when plotting nplot points in each "coordinate direction"...
double du_dt_linearised_axi_nst(const unsigned &n, const unsigned &i) const
Return the i-th component of du/dt at local node n. Uses suitably interpolated value for hanging node...
bool ALE_is_disabled
Boolean flag to indicate if ALE formulation is disabled when the time-derivatives are computed...
double interpolated_u_linearised_axi_nst(const Vector< double > &s, const unsigned &i) const
Return the i-th component of the FE interpolated velocity u[i] at local coordinate s...
virtual void get_base_flow_u(const double &time, const unsigned &ipt, const Vector< double > &x, Vector< double > &result) const
Calculate the velocity components of the base flow solution at a given time and Eulerian position...
virtual unsigned npres_linearised_axi_nst() const =0
Return the number of pressure degrees of freedom associated with a single pressure component in the e...
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...
const int & azimuthal_mode_number() const
Azimuthal mode number k in e^ik(theta) decomposition.
virtual unsigned u_index_linearised_axi_nst(const unsigned &i) const
Return the index at which the i-th unknown velocity component is stored. The default value...
double raw_nodal_position(const unsigned &n, const unsigned &i) const
Return the i-th coordinate at local node n. Do not use the hanging node representation. NOTE: Moved to cc file because of a possible compiler bug in gcc (yes, really!). The move to the cc file avoids inlining which appears to cause problems (only) when compiled with gcc and -O3; offensive "illegal read" is in optimised-out section of code and data that is allegedly illegal is readily readable (by other means) just before this function is called so I can't really see how we could possibly be responsible for this...
void output(std::ostream &outfile)
Output function: r, z, U^C, U^S, V^C, V^S, W^C, W^S, P^C, P^S in tecplot format. Default number of pl...
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
double raw_dnodal_position_dt(const unsigned &n, const unsigned &i) const
Return the i-th component of nodal velocity: dx/dt at local node n. Do not use the hanging node repre...
const double & viscosity_ratio() const
Viscosity ratio for element: element's viscosity relative to the viscosity used in the definition of ...
const double & re() const
Reynolds number.
unsigned nnode() const
Return the number of nodes.
virtual double weight(const unsigned &i, const unsigned &j) const
Access function for j-th weight for the i-th derivative.
const double & re_st() const
Product of Reynolds and Strouhal number (=Womersley number)
virtual void shape(const Vector< double > &s, Shape &psi) const =0
Calculate the geometric shape functions at local coordinate s. This function must be overloaded for e...
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...