34 #ifndef OOMPH_MULTI_DOMAIN_BOUSSINESQ_ELEMENTS_HEADER 35 #define OOMPH_MULTI_DOMAIN_BOUSSINESQ_ELEMENTS_HEADER 40 #include "advection_diffusion.h" 41 #include "navier_stokes.h" 51 namespace MultiDomainBoussinesqHelper
69 template<
class NST_ELEMENT,
class AD_ELEMENT>
86 this->set_ninteraction(1);
90 const double &
ra()
const {
return *Ra_pt;}
93 double* &
ra_pt() {
return Ra_pt;}
101 NST_ELEMENT::further_build();
106 cast_father_element_pt
108 <NST_ELEMENT,AD_ELEMENT
>*>(
109 this->father_element_pt());
113 this->Ra_pt = cast_father_element_pt->
ra_pt();
118 this->ignore_external_geometric_data();
132 const unsigned interaction=0;
136 const AD_ELEMENT* adv_diff_el_pt=
137 dynamic_cast<AD_ELEMENT*
>(
138 external_element_pt(interaction,ipt));
141 const double interpolated_t =adv_diff_el_pt->
142 interpolated_u_adv_diff(external_element_local_coord(interaction,ipt));
149 const unsigned n_dim=this->dim();
150 for (
unsigned i=0;
i<n_dim;
i++)
152 body_force[
i] = -gravity[
i]*interpolated_t*ra();
166 #ifdef USE_FD_FOR_DERIVATIVES_WRT_EXTERNAL_DATA_IN_MULTI_DOMAIN_BOUSSINESQ 169 this->fill_in_jacobian_from_external_interaction_by_fd(residuals,jacobian);
174 this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
192 residuals,jacobian,mass_matrix);
198 void get_dbody_force_nst_dexternal_element_data(
211 const unsigned n_dim=this->dim();
212 unsigned u_nodal_nst[n_dim];
213 for(
unsigned i=0;
i<n_dim;
i++)
214 {u_nodal_nst[
i] = this->u_index_nst(
i);}
217 const unsigned n_node = this->nnode();
220 Shape psif(n_node), testf(n_node);
221 DShape dpsifdx(n_node,n_dim), dtestfdx(n_node,n_dim);
224 const unsigned n_intpt = this->integral_pt()->nweight();
227 int local_eqn=0, local_unknown=0;
233 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
236 double w = this->integral_pt()->weight(ipt);
240 this->dshape_and_dtest_eulerian_at_knot_nst(ipt,psif,dpsifdx,
257 this->get_dbody_force_nst_dexternal_element_data(
258 ipt,dbody_dexternal_element_data,
259 global_eqn_number_of_external_element_data);
262 const unsigned n_external_element_data =
263 global_eqn_number_of_external_element_data.size();
266 for(
unsigned l=0;l<n_node;l++)
271 unsigned n_master = 1;
272 double hang_weight = 1.0;
275 bool is_node_hanging = this->node_pt(l)->is_hanging();
280 hang_info_pt = this->node_pt(l)->hanging_pt();
281 n_master = hang_info_pt->
nmaster();
290 for(
unsigned m=0;m<n_master;m++)
306 for(
unsigned i=0;
i<n_dim;
i++)
318 local_eqn = this->nodal_local_eqn(l,u_nodal_nst[
i]);
324 for(
unsigned l2=0;l2<n_external_element_data;l2++)
329 this->local_eqn_number(
330 global_eqn_number_of_external_element_data[l2]);
331 if(local_unknown >= 0)
334 jacobian(local_eqn,local_unknown)
335 += dbody_dexternal_element_data(
i,l2)*testf(l)*hang_weight*
W;
347 unsigned> >& dof_lookup_list)
const 350 NST_ELEMENT::get_dof_numbers_for_unknowns(dof_lookup_list);
356 return NST_ELEMENT::ndof_types();
380 template<
class AD_ELEMENT,
class NST_ELEMENT>
392 this->set_ninteraction(1);
407 void output(std::ostream &outfile,
const unsigned &nplot)
410 unsigned n_dim=this->dim();
414 outfile << this->tecplot_zone_string(nplot);
417 unsigned num_plot_points=this->nplot_points(nplot);
418 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
421 this->get_s_plot(iplot,nplot,s);
424 for(
unsigned i=0;
i<n_dim;
i++)
425 {outfile << this->interpolated_x(s,
i) <<
" ";}
428 outfile << AD_ELEMENT::interpolated_u_adv_diff(s) << std::endl;
430 outfile << std::endl;
433 this->write_tecplot_zone_footer(outfile,nplot);
446 void output(FILE* file_pt,
const unsigned &n_plot)
458 unsigned interaction=0;
461 NST_ELEMENT* nst_el_pt=
dynamic_cast<NST_ELEMENT*
> 462 (external_element_pt(interaction,ipt));
465 nst_el_pt->interpolated_u_nst
466 (external_element_local_coord(interaction,ipt),wind);
478 #ifdef USE_FD_FOR_DERIVATIVES_WRT_EXTERNAL_DATA_IN_MULTI_DOMAIN_BOUSSINESQ 481 this->fill_in_jacobian_from_external_interaction_by_fd(residuals,jacobian);
486 this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
497 void identify_all_field_data_for_external_interaction(
498 Vector<std::set<FiniteElement*> >
const &external_elements_pt,
499 std::set<std::pair<Data*,unsigned> > &paired_interaction_data);
511 residuals,jacobian,mass_matrix);
518 const unsigned& ipt,
const unsigned &
i,
522 unsigned interaction=0;
525 NST_ELEMENT* source_el_pt=
dynamic_cast<NST_ELEMENT*
> 526 (external_element_pt(interaction,ipt));
531 source_el_pt->dinterpolated_u_nst_ddata(
532 external_element_local_coord(interaction,ipt),i,result,
544 const unsigned u_nodal_adv_diff = this->u_index_adv_diff();
547 const unsigned n_node = this->nnode();
550 const unsigned n_dim=this->dim();
553 Shape psi(n_node), test(n_node);
554 DShape dpsidx(n_node,n_dim), dtestdx(n_node,n_dim);
557 const unsigned n_intpt = this->integral_pt()->nweight();
560 int local_eqn=0, local_unknown=0;
566 const double peclet = this->
pe();
569 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
572 double w = this->integral_pt()->weight(ipt);
576 this->dshape_and_dtest_eulerian_at_knot_adv_diff(ipt,psi,dpsidx,
585 for(
unsigned l=0;l<n_node;l++)
588 for(
unsigned j=0;j<n_dim;j++)
590 interpolated_dudx[j] +=
591 this->nodal_value(l,u_nodal_adv_diff)*dpsidx(l,j);
604 for(
unsigned i2=0;i2<n_dim;i2++)
607 this->get_dwind_adv_diff_dexternal_element_data(
608 ipt,i2,dwind_dexternal_element_data,
609 global_eqn_number_of_external_element_data);
613 const unsigned n_external_element_data =
614 global_eqn_number_of_external_element_data.size();
617 for(
unsigned l=0;l<n_node;l++)
621 unsigned n_master = 1;
622 double hang_weight = 1.0;
625 bool is_node_hanging = this->node_pt(l)->is_hanging();
630 hang_info_pt = this->node_pt(l)->hanging_pt();
631 n_master = hang_info_pt->
nmaster();
640 for(
unsigned m=0;m<n_master;m++)
664 local_eqn = this->nodal_local_eqn(l,u_nodal_adv_diff);
670 for(
unsigned l2=0;l2<n_external_element_data;l2++)
675 this->local_eqn_number(
676 global_eqn_number_of_external_element_data[l2]);
677 if(local_unknown >= 0)
680 jacobian(local_eqn,local_unknown)
681 -= peclet*dwind_dexternal_element_data[l2]*
682 interpolated_dudx[i2]*test(l)*hang_weight*
W;
694 unsigned> >& dof_lookup_list)
const 697 unsigned n_node = this->nnode();
700 std::pair<unsigned,unsigned> dof_lookup;
703 for (
unsigned n = 0; n < n_node; n++)
706 unsigned nv = this->node_pt(n)->nvalue();
709 for (
unsigned v = 0; v < nv; v++)
712 int local_eqn_number = this->nodal_local_eqn(n, v);
717 if (local_eqn_number >= 0)
721 dof_lookup.first = this->eqn_number(local_eqn_number);
724 dof_lookup.second = 0;
727 dof_lookup_list.push_front(dof_lookup);
755 template<
class AD_ELEMENT,
class NST_ELEMENT>
758 Vector<std::set<FiniteElement*> >
const &external_elements_pt,
759 std::set<std::pair<Data*,unsigned> > &paired_interaction_data)
762 const unsigned interaction = 0;
766 for(std::set<FiniteElement*>::iterator it=
767 external_elements_pt[interaction].begin();
768 it != external_elements_pt[interaction].end(); it++)
772 NST_ELEMENT* external_fluid_el_pt =
773 dynamic_cast<NST_ELEMENT*
>(*it);
776 unsigned nnod=external_fluid_el_pt->nnode();
777 for (
unsigned j=0;j<nnod;j++)
780 Data* veloc_data_pt=external_fluid_el_pt->node_pt(j);
783 const unsigned n_dim=this->dim();
784 for (
unsigned i=0;
i<n_dim;
i++)
787 unsigned val=external_fluid_el_pt->u_index_nst(
i);
791 paired_interaction_data.insert(std::make_pair(veloc_data_pt,val));
808 template<
class NST_ELEMENT,
class AD_ELEMENT>
828 this->set_ninteraction(1);
832 const double &
ra()
const {
return *Ra_pt;}
839 void get_body_force_nst(
const double& time,
const unsigned& ipt,
845 void get_dbody_force_nst_dexternal_element_data(
855 #ifdef USE_FD_JACOBIAN_NST_IN_MULTI_DOMAIN_BOUSSINESQ 867 this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
882 residuals,jacobian,mass_matrix);
892 const unsigned n_dim=this->dim();
894 for(
unsigned i=0;
i<n_dim;
i++)
895 {u_nodal_nst[
i] = this->u_index_nst(
i);}
898 const unsigned n_node = this->nnode();
901 Shape psif(n_node), testf(n_node);
902 DShape dpsifdx(n_node,n_dim), dtestfdx(n_node,n_dim);
905 const unsigned n_intpt = this->integral_pt()->nweight();
908 int local_eqn=0, local_unknown=0;
911 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
914 double w = this->integral_pt()->weight(ipt);
918 this->dshape_and_dtest_eulerian_at_knot_nst(ipt,psif,dpsifdx,
935 this->get_dbody_force_nst_dexternal_element_data(
936 ipt,dbody_dexternal_element_data,
937 global_eqn_number_of_external_element_data);
940 const unsigned n_external_element_data =
941 global_eqn_number_of_external_element_data.size();
944 for(
unsigned l=0;l<n_node;l++)
951 for(
unsigned i=0;
i<n_dim;
i++)
954 local_eqn = this->nodal_local_eqn(l,u_nodal_nst[
i]);
958 for(
unsigned l2=0;l2<n_external_element_data;l2++)
963 this->local_eqn_number(
964 global_eqn_number_of_external_element_data[l2]);
965 if(local_unknown >= 0)
968 jacobian(local_eqn,local_unknown)
969 += dbody_dexternal_element_data(i,l2)*testf(l)*
W;
985 template<
class NST_ELEMENT,
class AD_ELEMENT>
994 unsigned interaction=0;
997 const double interpolated_t =
998 dynamic_cast<AD_ELEMENT*
>(
999 external_element_pt(interaction,ipt))->
1000 interpolated_u_adv_diff(external_element_local_coord(interaction,ipt));
1007 const unsigned n_dim=this->dim();
1008 for (
unsigned i=0;
i<n_dim;
i++)
1010 result[
i] = -gravity[
i]*interpolated_t*ra();
1016 template<
class NST_ELEMENT,
class AD_ELEMENT>
1029 template<
class NST_ELEMENT,
class AD_ELEMENT>
1032 public virtual FaceGeometry<FaceGeometry<NST_ELEMENT> >
1053 template<
class AD_ELEMENT,
class NST_ELEMENT>
1065 this->set_ninteraction(1);
1087 void output(std::ostream &outfile,
const unsigned &nplot)
1090 const unsigned n_dim=this->dim();
1096 outfile << this->tecplot_zone_string(nplot);
1099 unsigned num_plot_points=this->nplot_points(nplot);
1100 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
1103 this->get_s_plot(iplot,nplot,s);
1106 for(
unsigned i=0;
i<n_dim;
i++)
1107 {outfile << this->interpolated_x(s,
i) <<
" ";}
1110 outfile << AD_ELEMENT::interpolated_u_adv_diff(s) << std::endl;
1112 outfile << std::endl;
1115 this->write_tecplot_zone_footer(outfile,nplot);
1128 void output(FILE* file_pt,
const unsigned &n_plot)
1135 void get_dwind_adv_diff_dexternal_element_data(
1136 const unsigned& ipt,
const unsigned &
i,
1145 #ifdef USE_FD_JACOBIAN_IN_MULTI_DOMAIN_BOUSSINESQ 1157 this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
1172 residuals,jacobian,mass_matrix);
1182 const unsigned u_nodal_adv_diff = this->u_index_adv_diff();
1185 const unsigned n_node = this->nnode();
1188 const unsigned n_dim=this->dim();
1191 Shape psi(n_node), test(n_node);
1192 DShape dpsidx(n_node,n_dim), dtestdx(n_node,n_dim);
1195 const unsigned n_intpt = this->integral_pt()->nweight();
1198 int local_eqn=0, local_unknown=0;
1201 const double peclet = this->
pe();
1204 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
1207 double w = this->integral_pt()->weight(ipt);
1211 this->dshape_and_dtest_eulerian_at_knot_adv_diff(ipt,psi,dpsidx,
1220 for(
unsigned l=0;l<n_node;l++)
1223 for(
unsigned j=0;j<n_dim;j++)
1225 interpolated_dudx[j] +=
1226 this->raw_nodal_value(l,u_nodal_adv_diff)*dpsidx(l,j);
1240 for(
unsigned i2=0;i2<n_dim;i2++)
1243 this->get_dwind_adv_diff_dexternal_element_data(
1244 ipt,i2,dwind_dexternal_element_data,
1245 global_eqn_number_of_external_element_data);
1248 const unsigned n_external_element_data =
1249 global_eqn_number_of_external_element_data.size();
1252 for(
unsigned l=0;l<n_node;l++)
1258 local_eqn = this->nodal_local_eqn(l,u_nodal_adv_diff);
1262 for(
unsigned l2=0;l2<n_external_element_data;l2++)
1267 this->local_eqn_number(
1268 global_eqn_number_of_external_element_data[l2]);
1269 if(local_unknown >= 0)
1272 jacobian(local_eqn,local_unknown)
1273 -= peclet*dwind_dexternal_element_data[l2]*
1274 interpolated_dudx[i2]*test(l)*
W;
1293 template<
class AD_ELEMENT,
class NST_ELEMENT>
1300 unsigned interaction=0;
1303 NST_ELEMENT* source_el_pt=
1304 dynamic_cast<NST_ELEMENT*
>(external_element_pt(interaction,ipt));
1307 source_el_pt->interpolated_u_nst
1308 (external_element_local_coord(interaction,ipt),wind);
1315 template<
class AD_ELEMENT,
class NST_ELEMENT>
1323 unsigned interaction=0;
1326 NST_ELEMENT* source_el_pt=
1327 dynamic_cast<NST_ELEMENT*
>(external_element_pt(interaction,ipt));
1332 source_el_pt->dinterpolated_u_nst_ddata(
1333 external_element_local_coord(interaction,ipt),i,result,
1345 template<
class NST_ELEMENT,
class AD_ELEMENT>
1356 unsigned interaction=0;
1362 AD_ELEMENT* source_el_pt=
1363 dynamic_cast<AD_ELEMENT*
>(external_element_pt(interaction,ipt));
1365 if (source_el_pt==0)
1368 "External element could not be cast to AD_ELEMENT\n",
1369 OOMPH_CURRENT_FUNCTION,
1370 OOMPH_EXCEPTION_LOCATION);
1375 source_el_pt->dinterpolated_u_adv_diff_ddata(
1376 external_element_local_coord(interaction,ipt),du_adv_diff_ddata,
1380 unsigned n_external_element_data = du_adv_diff_ddata.size();
1383 const unsigned n_dim=this->dim();
1384 result.
resize(n_dim,n_external_element_data);
1387 for (
unsigned i=0;
i<n_dim;
i++)
1390 for(
unsigned n=0;n<n_external_element_data;n++)
1392 result(
i,n) = -gravity[
i]*du_adv_diff_ddata[n]*ra();
1402 template<
class NST_ELEMENT,
class AD_ELEMENT>
1413 unsigned interaction=0;
1419 AD_ELEMENT* source_el_pt=
1420 dynamic_cast<AD_ELEMENT*
>(external_element_pt(interaction,ipt));
1422 if (source_el_pt==0)
1425 "External element could not be cast to AD_ELEMENT\n",
1426 OOMPH_CURRENT_FUNCTION,
1427 OOMPH_EXCEPTION_LOCATION);
1432 source_el_pt->dinterpolated_u_adv_diff_ddata(
1433 external_element_local_coord(interaction,ipt),du_adv_diff_ddata,
1437 unsigned n_external_element_data = du_adv_diff_ddata.size();
1440 const unsigned n_dim=this->dim();
1441 result.
resize(n_dim,n_external_element_data);
1444 for (
unsigned i=0;
i<n_dim;
i++)
1447 for(
unsigned n=0;n<n_external_element_data;n++)
1449 result(
i,n) = -gravity[
i]*du_adv_diff_ddata[n]*ra();
void get_wind_adv_diff(const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &wind) const
Overload the wind function in the advection-diffusion equations. This provides the coupling from the ...
void output(std::ostream &outfile, const unsigned &nplot)
Output function: Output x, y, theta at Nplot^DIM plot points.
double * Ra_pt
Pointer to a private data member, the Rayleigh number.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residual vector and the Jacobian matrix. Jacobian is computed by finite-differe...
void get_dwind_adv_diff_dexternal_element_data(const unsigned &ipt, const unsigned &i, Vector< double > &result, Vector< unsigned > &global_eqn_number)
Fill in the derivatives of the wind with respect to the external unknowns.
const double & pe() const
Peclet number.
void get_dwind_adv_diff_dexternal_element_data(const unsigned &ipt, const unsigned &i, Vector< double > &result, Vector< unsigned > &global_eqn_number)
Fill in the derivatives of the wind with respect to the external unknowns.
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Add the element's contribution to its residuals vector, jacobian matrix and mass matrix.
virtual void output(std::ostream &outfile)
Output the element data — typically the values at the nodes in a format suitable for post-processing...
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
void get_dbody_force_nst_dexternal_element_data(const unsigned &ipt, DenseMatrix< double > &result, Vector< unsigned > &global_eqn_number)
Fill in the derivatives of the body force with respect to the external unknowns.
RefineableNavierStokesBoussinesqElement()
Constructor: call the underlying constructors and initialise the pointer to the Rayleigh number to po...
const double & ra() const
Access function for the Rayleigh number (const version)
FaceGeometry()
Constructor calls the constructor of the NST_ELEMENT (Only the Intel compiler seems to need this!) ...
void output(FILE *file_pt)
C-style output function: Broken default.
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned > > &dof_lookup_list) const
Classify dofs for use in block preconditioner.
RefineableAdvectionDiffusionBoussinesqElement()
Constructor: call the underlying constructors.
double const & master_weight(const unsigned &i) const
Return weight for dofs on i-th master node.
double * Ra_pt
Pointer to a private data member, the Rayleigh number.
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Add the element's contribution to its residuals vector, jacobian matrix and mass matrix.
unsigned nmaster() const
Return the number of master nodes.
void output(std::ostream &outfile)
Overload the standard output function with the broken default.
FaceGeometry()
Constructor calls the constructor of the NST_ELEMENT (Only the Intel compiler seems to need this!) ...
const double & ra() const
Access function for the Rayleigh number (const version)
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function: Broken default.
void get_dbody_force_nst_dexternal_element_data(const unsigned &ipt, DenseMatrix< double > &result, Vector< unsigned > &global_eqn_number)
Fill in the derivatives of the body force with respect to the external unknowns.
unsigned ndof_types() const
Specify number of dof types for use in block preconditioner.
void get_dof_numbers_for_unknowns(std::list< std::pair< unsigned long, unsigned > > &dof_lookup_list) const
Classify dof numbers as in underlying element.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Add the element's contribution to its residual vector and the element Jacobian matrix (wrapper) ...
double *& ra_pt()
Access function for the pointer to the Rayleigh number.
void further_build()
Call the underlying single-physics element's further_build() functions and make sure that the pointer...
NavierStokesBoussinesqElement()
Constructor: call the underlying constructors and initialise the pointer to the Rayleigh number to po...
A class that represents a collection of data; each Data object may contain many different individual ...
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
AdvectionDiffusionBoussinesqElement()
Constructor: call the underlying constructors.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
double Default_Physical_Constant_Value
Default value for physical constants.
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the contribution of the external degrees of freedom (velocities) on the advection-diffusion e...
Class that contains data for hanging nodes.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residual vector and the Jacobian matrix.
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residual vector and the Jacobian matrix.
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the contribution of the external degrees of freedom (temperatures) on the Navier-Stokes equat...
void output(FILE *file_pt)
C-style output function: Broken default.
void get_wind_adv_diff(const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &wind) const
Overload the wind function in the advection-diffusion equations. This provides the coupling from the ...
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Add the element's contribution to its residuals vector, jacobian matrix and mass matrix.
void get_body_force_nst(const double &time, const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &body_force)
Overload get_body_force_nst() to return the temperature-dependent buoyancy force, using the temperatu...
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residual vector and the Jacobian matrix. Jacobian is computed by finite-differe...
virtual void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Add the elemental contribution to the jacobian matrix, mass matrix and the residuals vector...
double *& ra_pt()
Access function for the pointer to the Rayleigh number.
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the contribution of the external degrees of freedom (velocities) on the AdvectionDiffusion eq...
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the contribution of the external degrees of freedom (temperatures) on the Navier-Stokes equat...
bool external_geometric_data_is_included() const
Is the external geometric data taken into account when forming the Jacobian?
void identify_all_field_data_for_external_interaction(Vector< std::set< FiniteElement *> > const &external_elements_pt, std::set< std::pair< Data *, unsigned > > &paired_interaction_data)
Overload the function that must return all field data involved in the interaction with the external (...
void get_body_force_nst(const double &time, const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &result)
Overload get_body_force_nst to get the temperature "body force" from the "source" AdvectionDiffusion ...
void output(std::ostream &outfile)
Overload the standard output function with the broken default.
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function: Broken default.
void output(std::ostream &outfile, const unsigned &nplot)
Output function: Output x, y, theta at Nplot^DIM plot points.
unsigned ndof_types() const
Get number of dof types from underlying element.
void resize(const unsigned long &n)