51 unsigned n_node =
nnode();
57 Shape psi(n_node), test(n_node);
58 DShape dpsidx(n_node,2), dtestdx(n_node,2);
67 double peclet = this->
pe();
70 double peclet_st = this->
pe_st();
74 int local_eqn=0, local_unknown=0;
77 HangInfo *hang_info_pt=0, *hang_info2_pt=0;
83 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
102 double interpolated_u=0.0;
113 for(
unsigned l=0;l<n_node;l++)
116 double u_value = this->
nodal_value(l,u_nodal_index);
117 interpolated_u += u_value*psi(l);
120 for(
unsigned j=0;j<2;j++)
123 interpolated_dudx[j] += u_value*dpsidx(l,j);
128 if (!ALE_is_disabled_flag)
130 for(
unsigned l=0;l<n_node;l++)
133 for(
unsigned j=0;j<2;j++)
161 double r = interpolated_x[0];
167 for(
unsigned l=0;l<n_node;l++)
171 unsigned n_master=1;
double hang_weight=1.0;
179 n_master = hang_info_pt->
nmaster();
188 for(
unsigned m=0;m<n_master;m++)
213 residuals[local_eqn] -=
214 (peclet_st*dudt + source)*test(l)*r*W*hang_weight;
217 for(
unsigned k=0;k<2;k++)
220 double tmp = peclet*wind[k];
222 if(!ALE_is_disabled_flag)
223 {tmp -= peclet_st*mesh_velocity[k];}
224 tmp *= interpolated_dudx[k];
228 double tmp2 = - conserved_wind[k]*interpolated_u;
230 for(
unsigned j=0;j<2;j++)
232 tmp2 +=
D(k,j)*interpolated_dudx[j];
235 residuals[local_eqn] -= (tmp*test(l) + tmp2*dtestdx(l,k))*r*W*
244 unsigned n_master2=1;
double hang_weight2=1.0;
246 for(
unsigned l2=0;l2<n_node;l2++)
254 n_master2 = hang_info2_pt->
nmaster();
263 for(
unsigned m2=0;m2<n_master2;m2++)
274 hang_weight2 = hang_info2_pt->master_weight(m2);
286 if(local_unknown >= 0)
290 jacobian(local_eqn,local_unknown)
291 -= peclet_st*test(l)*psi(l2)*
293 *r*W*hang_weight*hang_weight2;
298 mass_matrix(local_eqn,local_unknown) +=
299 peclet_st*test(l)*psi(l2)*r*W*hang_weight*hang_weight2;
303 for(
unsigned k=0;k<2;k++)
306 double tmp = peclet*wind[k];
307 if(!ALE_is_disabled_flag)
308 {tmp -= peclet_st*mesh_velocity[k];}
311 double tmp2 = - conserved_wind[k]*psi(l2);
313 for(
unsigned j=0;j<2;j++)
315 tmp2 +=
D(k,j)*dpsidx(l2,j);
319 jacobian(local_eqn,local_unknown)
320 -= (tmp*test(l) + tmp2*dtestdx(l,k))*W*r*
321 hang_weight*hang_weight2;
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 ...
Refineable version of QGeneralisedAxisymAdvectionDiffusionElement. Inherit from the standard QGeneral...
bool ALE_is_disabled
Boolean flag to indicate if ALE formulation is disabled when time-derivatives are computed...
const double & pe() const
Peclet number.
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 ...
HangInfo *const & hanging_pt() const
Return pointer to hanging node data (this refers to the geometric hanging node status) (const version...
virtual void get_diff_cons_axisym_adv_diff(const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, DenseMatrix< double > &D) const
Get diffusivity tensor at (Eulerian) position x and/or local coordinate s. This function is virtual t...
double const & master_weight(const unsigned &i) const
Return weight for dofs on i-th master node.
unsigned nmaster() const
Return the number of master nodes.
bool is_hanging() const
Test whether the node is geometrically hanging.
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
virtual void get_wind_cons_axisym_adv_diff(const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &wind) const
Get wind at (Eulerian) position x and/or local coordinate s. This function is virtual to allow overlo...
virtual double dshape_and_dtest_eulerian_at_knot_cons_axisym_adv_diff(const unsigned &ipt, Shape &psi, DShape &dpsidx, Shape &test, DShape &dtestdx) const =0
Shape/test functions and derivs w.r.t. to global coords at integration point ipt; return Jacobian of ...
virtual void get_conserved_wind_cons_axisym_adv_diff(const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &wind) const
Get additional (conservative) wind at (Eulerian) position x and/or 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.
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
const double & pe_st() const
Peclet number multiplied by Strouhal number.
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
void fill_in_generic_residual_contribution_cons_axisym_adv_diff(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix, unsigned flag)
Add the element's contribution to the elemental residual vector and/or Jacobian matrix flag=1: comput...
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
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...
Class that contains data for hanging nodes.
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 du_dt_cons_axisym_adv_diff(const unsigned &n) const
du/dt at local node n.
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.
virtual unsigned u_index_cons_axisym_adv_diff() const
A class for all elements that solve the Advection Diffusion equations in conservative form using isop...
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.
virtual void get_source_cons_axisym_adv_diff(const unsigned &ipt, const Vector< double > &x, double &source) const
Get source term at (Eulerian) position x. This function is virtual to allow overloading in multi-phys...
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...