b_convection_sphere/multi_domain_axisym_boussinesq_elements.h
Go to the documentation of this file.
1 //LIC// ====================================================================
2 //LIC// This file forms part of oomph-lib, the object-oriented,
3 //LIC// multi-physics finite-element library, available
4 //LIC// at http://www.oomph-lib.org.
5 //LIC//
6 //LIC// Copyright (C) 2006-2022 Matthias Heil and Andrew Hazel
7 //LIC//
8 //LIC// This library is free software; you can redistribute it and/or
9 //LIC// modify it under the terms of the GNU Lesser General Public
10 //LIC// License as published by the Free Software Foundation; either
11 //LIC// version 2.1 of the License, or (at your option) any later version.
12 //LIC//
13 //LIC// This library is distributed in the hope that it will be useful,
14 //LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15 //LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 //LIC// Lesser General Public License for more details.
17 //LIC//
18 //LIC// You should have received a copy of the GNU Lesser General Public
19 //LIC// License along with this library; if not, write to the Free Software
20 //LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 //LIC// 02110-1301 USA.
22 //LIC//
23 //LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24 //LIC//
25 //LIC//====================================================================
26 //Header for a multi-physics elements that couple the Navier--Stokes
27 //and advection diffusion elements via a multi domain approach,
28 //giving Boussinesq convection
29 
30 //Oomph-lib headers, we require the generic, advection-diffusion
31 //and navier-stokes elements.
32 #include "generic.h"
34 #include "axisym_navier_stokes.h"
35 
36 // Use the oomph and std namespaces
37 using namespace oomph;
38 using namespace std;
39 
40 
44 
45 
46 //======================nst_bous_class=================================
51 //=====================================================================
54  public virtual ElementWithExternalElement
55 {
56 
57 public:
58 
65  {
67 
68  //There is one interaction: The effect of the advection-diffusion
69  //element onto the buoyancy term
70  this->set_ninteraction(1);
71  }
72 
74  const double &ra() const {return *Ra_pt;}
75 
77  double* &ra_pt() {return Ra_pt;}
78 
84  {
86 
87  //Cast the pointer to the father element to the specific
88  //element type
90  cast_father_element_pt
92  this->father_element_pt());
93 
94  //Set the pointer to the Rayleigh number to be the same as that in
95  //the father
96  this->Ra_pt = cast_father_element_pt->ra_pt();
97 
98  // Retain ignorance about external geometric data...
99  if (!cast_father_element_pt->external_geometric_data_is_included())
100  {
101  this->ignore_external_geometric_data();
102  }
103 
104  }
105 
110  void get_body_force_axi_nst(const double& time, const unsigned& ipt,
111  const Vector<double> &s, const Vector<double> &x,
113  {
114 
115  // Set interaction index -- there's only one interaction...
116  const unsigned interaction=0;
117 
118  // Get a pointer to the external element that computes the
119  // the temperature -- we know it's an advection diffusion element.
120  const AxisymAdvectionDiffusionEquations* adv_diff_el_pt=
121  dynamic_cast<AxisymAdvectionDiffusionEquations*>(
122  external_element_pt(interaction,ipt));
123 
124  // Get the temperature interpolated from the external element
125  const double interpolated_t =adv_diff_el_pt->
126  interpolated_u_axi_adv_diff(external_element_local_coord(interaction,ipt));
127 
128  // Get vector that indicates the direction of gravity from
129  // the Navier-Stokes equations
131 
132  // Set the temperature-dependent body force:
133  for (unsigned i=0;i<3;i++)
134  {
135  body_force[i] = -gravity[i]*interpolated_t*ra();
136  }
137 
138  } // end overloaded body force
139 
140 
143  DenseMatrix<double> &jacobian)
144  {
145 
146  //Get the analytical contribution from the basic Navier-Stokes element
148  fill_in_contribution_to_jacobian(residuals,jacobian);
149 
150 #ifdef USE_FD_FOR_DERIVATIVES_WRT_EXTERNAL_DATA
151 
152  //Get the off-diagonal terms by finite differencing
153  this->fill_in_jacobian_from_external_interaction_by_fd(residuals,jacobian);
154 
155 #else
156 
157  //Get the off-diagonal terms analytically
158  this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
159 
160 #endif
161 
162  }
163 
164 
165 
169  Vector<double> &residuals, DenseMatrix<double> &jacobian,
170  DenseMatrix<double> &mass_matrix)
171  {
172  //Call the standard (Broken) function
173  //which will prevent these elements from being used
174  //in eigenproblems until replaced.
176  residuals,jacobian,mass_matrix);
177  }
178 
179 
183  const unsigned& ipt,
184  DenseMatrix<double> &result, Vector<unsigned> &global_eqn_number);
185 
186 
190  DenseMatrix<double> &jacobian)
191  {
192  //Local storage for the index in the nodes at which the
193  //Navier-Stokes velocities are stored (we know that this should be 0,1,2)
194  unsigned u_nodal_axi_nst[3];
195  for(unsigned i=0;i<3;i++)
196  {u_nodal_axi_nst[i] = this->u_index_axi_nst(i);}
197 
198  //Find out how many nodes there are
199  const unsigned n_node = this->nnode();
200 
201  //Set up memory for the shape and test functions and their derivatives
202  Shape psif(n_node), testf(n_node);
203  DShape dpsifdx(n_node,2), dtestfdx(n_node,2);
204 
205  //Number of integration points
206  const unsigned n_intpt = this->integral_pt()->nweight();
207 
208  //Integers to store the local equations and unknowns
209  int local_eqn=0, local_unknown=0;
210 
211  // Local storage for pointers to hang_info objects
212  HangInfo *hang_info_pt=0;
213 
214  //Loop over the integration points
215  for(unsigned ipt=0;ipt<n_intpt;ipt++)
216  {
217  //Get the integral weight
218  double w = this->integral_pt()->weight(ipt);
219 
220  //Call the derivatives of the shape and test functions
221  double J =
222  this->dshape_and_dtest_eulerian_at_knot_axi_nst(ipt,psif,dpsifdx,
223  testf,dtestfdx);
224 
225  //Premultiply the weights and the Jacobian
226  double W = w*J;
227 
228  //Get the radius
229  double r=0.0;
230  for(unsigned l=0;l<n_node;l++)
231  {
232  r += this->nodal_position(l,0)*psif(l);
233  }
234 
235  //Assemble the jacobian terms
236 
237  //Get the derivatives of the body force wrt the unknowns
238  //of the external element
239  DenseMatrix<double> dbody_dexternal_element_data;
240 
241  //Vector of global equation number corresponding to the external
242  //element's data
243  Vector<unsigned> global_eqn_number_of_external_element_data;
244 
245  //Get the appropriate derivatives
246  this->get_dbody_force_axi_nst_dexternal_element_data(
247  ipt,dbody_dexternal_element_data,
248  global_eqn_number_of_external_element_data);
249 
250  //Find out how many external data there are
251  const unsigned n_external_element_data =
252  global_eqn_number_of_external_element_data.size();
253 
254  //Loop over the test functions
255  for(unsigned l=0;l<n_node;l++)
256  {
257  //Assemble the contributions of the temperature to
258  //the Navier--Stokes equations (which arise through the buoyancy
259  //body-force term)
260  unsigned n_master = 1;
261  double hang_weight = 1.0;
262 
263  //Local bool (is the node hanging)
264  bool is_node_hanging = this->node_pt(l)->is_hanging();
265 
266  //If the node is hanging, get the number of master nodes
267  if(is_node_hanging)
268  {
269  hang_info_pt = this->node_pt(l)->hanging_pt();
270  n_master = hang_info_pt->nmaster();
271  }
272  //Otherwise there is just one master node, the node itself
273  else
274  {
275  n_master = 1;
276  }
277 
278  //Loop over the master nodes
279  for(unsigned m=0;m<n_master;m++)
280  {
281  //If the node is hanging get weight from master node
282  if(is_node_hanging)
283  {
284  //Get the hang weight from the master node
285  hang_weight = hang_info_pt->master_weight(m);
286  }
287  else
288  {
289  // Node contributes with full weight
290  hang_weight = 1.0;
291  }
292 
293 
294  //Loop over the velocity components in the Navier--Stokes equtions
295  for(unsigned i=0;i<3;i++)
296  {
297  //Get the equation number
298  if(is_node_hanging)
299  {
300  //Get the equation number from the master node
301  local_eqn = this->local_hang_eqn(hang_info_pt->master_node_pt(m),
302  u_nodal_axi_nst[i]);
303  }
304  else
305  {
306  // Local equation number
307  local_eqn = this->nodal_local_eqn(l,u_nodal_axi_nst[i]);
308  }
309 
310  if(local_eqn >= 0)
311  {
312  //Loop over the external data
313  for(unsigned l2=0;l2<n_external_element_data;l2++)
314  {
315  //Find the local equation number corresponding to the global
316  //unknown
317  local_unknown =
318  this->local_eqn_number(
319  global_eqn_number_of_external_element_data[l2]);
320  if(local_unknown >= 0)
321  {
322  //Add contribution to jacobian matrix
323  jacobian(local_eqn,local_unknown)
324  +=
325  dbody_dexternal_element_data(i,l2)*testf(l)*hang_weight*r*W;
326  }
327  }
328  }
329  }
330  }
331  }
332  }
333  }
334 
335 
336 private:
337 
339  double* Ra_pt;
340 
342  static double Default_Physical_Constant_Value;
343 
344 
345 };
346 
347 
348 
349 
353 
354 
355 
356 //======================ad_bous_class==================================
360 //=====================================================================
363  public virtual ElementWithExternalElement
364 {
365 
366 public:
367 
371  {
372  //There is one interaction
373  this->set_ninteraction(1);
374  }
375 
376 
377 
378  //-----------------------------------------------------------
379  // Note: we're overloading the output functions because the
380  // ===== underlying advection diffusion elements output the
381  // wind which is only available at the integration points
382  // and even then only if the multi domain interaction
383  // has been set up.
384  //-----------------------------------------------------------
385 
388  // Start of output function
389  void output(ostream &outfile, const unsigned &nplot)
390  {
391  //vector of local coordinates
392  Vector<double> s(2);
393 
394  // Tecplot header info
395  outfile << this->tecplot_zone_string(nplot);
396 
397  // Loop over plot points
398  unsigned num_plot_points=this->nplot_points(nplot);
399  for (unsigned iplot=0;iplot<num_plot_points;iplot++)
400  {
401  // Get local coordinates of plot point
402  this->get_s_plot(iplot,nplot,s);
403 
404  // Output the position of the plot point
405  for(unsigned i=0;i<2;i++)
406  {outfile << this->interpolated_x(s,i) << " ";}
407 
408  // Output the temperature (the advected variable) at the plot point
409  outfile << this->interpolated_u_axi_adv_diff(s) << std::endl;
410  }
411  outfile << std::endl;
412 
413  // Write tecplot footer (e.g. FE connectivity lists)
414  this->write_tecplot_zone_footer(outfile,nplot);
415 
416  } //End of output function
417 
418 
420  void output(ostream &outfile) {FiniteElement::output(outfile);}
421 
423  void output(FILE* file_pt)
424  {FiniteElement::output(file_pt);}
425 
427  void output(FILE* file_pt, const unsigned &n_plot)
428  {FiniteElement::output(file_pt,n_plot);}
429 
430 
435  void get_wind_axi_adv_diff(const unsigned& ipt, const Vector<double> &s,
436  const Vector<double>& x,
437  Vector<double>& wind) const
438  {
439  // There is only one interaction
440  unsigned interaction=0;
441 
442  // Dynamic cast "external" element to Navier Stokes element
444  dynamic_cast<AxisymmetricNavierStokesEquations*>
445  (external_element_pt(interaction,ipt));
446 
447  //Wind is given by the velocity in the Navier Stokes element
448  nst_el_pt->interpolated_u_axi_nst
449  (external_element_local_coord(interaction,ipt),wind);
450 
451  } //end of get_wind_adv_diff
452 
453 
456  DenseMatrix<double> &jacobian)
457  {
458  //Get the contribution from the basic Navier--Stokes element
460  fill_in_contribution_to_jacobian(residuals,jacobian);
461 
462 #ifdef USE_FD_FOR_DERIVATIVES_WRT_EXTERNAL_DATA
463 
464  //Get the off-diagonal terms by finite differencing
465  this->fill_in_jacobian_from_external_interaction_by_fd(residuals,jacobian);
466 
467 #else
468 
469  //Get the off-diagonal terms analytically
470  this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
471 
472 #endif
473 
474  }
475 
476 
482  Vector<std::set<FiniteElement*> > const &external_elements_pt,
483  std::set<std::pair<Data*,unsigned> > &paired_interaction_data);
484 
488  Vector<double> &residuals, DenseMatrix<double> &jacobian,
489  DenseMatrix<double> &mass_matrix)
490  {
491  //Call the standard (Broken) function
492  //which will prevent these elements from being used
493  //in eigenproblems until replaced.
495  residuals,jacobian,mass_matrix);
496  }
497 
498 
502  const unsigned& ipt, const unsigned &i,
503  Vector<double> &result, Vector<unsigned> &global_eqn_number)
504  {
505  // The interaction index is 0 in this case
506  unsigned interaction=0;
507 
508  // Dynamic cast "other" element to correct type
511  (external_element_pt(interaction,ipt));
512 
513  // Get the external element's derivatives of the velocity with respect
514  // to the data. The wind is just the Navier--Stokes velocity, so this
515  // is all that's required
516  source_el_pt->dinterpolated_u_axi_nst_ddata(
517  external_element_local_coord(interaction,ipt),i,result,
518  global_eqn_number);
519  }
520 
521 
525  DenseMatrix<double> &jacobian)
526  {
527  //Local storage for the index in the nodes at which the temperature
528  //is stored
529  const unsigned u_nodal_axi_adv_diff = this->u_index_axi_adv_diff();
530 
531  //Find out how many nodes there are
532  const unsigned n_node = this->nnode();
533 
534  //Set up memory for the shape and test functions and their derivatives
535  Shape psi(n_node), test(n_node);
536  DShape dpsidx(n_node,2), dtestdx(n_node,2);
537 
538  //Number of integration points
539  const unsigned n_intpt = this->integral_pt()->nweight();
540 
541  //Integers to store the local equations and unknowns
542  int local_eqn=0, local_unknown=0;
543 
544  // Local storage for pointers to hang_info objects
545  HangInfo *hang_info_pt=0;
546 
547  //Get the peclet number
548  const double peclet = this->pe();
549 
550  //Loop over the integration points
551  for(unsigned ipt=0;ipt<n_intpt;ipt++)
552  {
553  //Get the integral weight
554  double w = this->integral_pt()->weight(ipt);
555 
556  //Call the derivatives of the shape and test functions
557  double J =
558  this->dshape_and_dtest_eulerian_at_knot_axi_adv_diff(ipt,psi,dpsidx,
559  test,dtestdx);
560 
561  //Premultiply the weights and the Jacobian
562  double W = w*J;
563 
564  //Calculate local values of the derivatives of the solution
565  Vector<double> interpolated_dudx(2,0.0);
566  //Calculate the radius
567  double r = 0.0;
568  // Loop over nodes
569  for(unsigned l=0;l<n_node;l++)
570  {
571  //Position
572  r += this->nodal_position(l,0)*psi(l);
573  // Loop over directions
574  for(unsigned j=0;j<2;j++)
575  {
576  interpolated_dudx[j] +=
577  this->nodal_value(l,u_nodal_axi_adv_diff)*dpsidx(l,j);
578  }
579  }
580 
581  //Get the derivatives of the wind wrt the unknowns
582  //of the external element
583  Vector<double> dwind_dexternal_element_data;
584  //Vector of global equation number corresponding to the external
585  //element's data
586  Vector<unsigned> global_eqn_number_of_external_element_data;
587 
588  //Loop over the wind directions
589  for(unsigned i2=0;i2<2;i2++)
590  {
591  //Get the appropriate derivatives
592  this->get_dwind_axi_adv_diff_dexternal_element_data(
593  ipt,i2,dwind_dexternal_element_data,
594  global_eqn_number_of_external_element_data);
595 
596 
597  //Find out how many external data there are
598  const unsigned n_external_element_data =
599  global_eqn_number_of_external_element_data.size();
600 
601  //Loop over the test functions
602  for(unsigned l=0;l<n_node;l++)
603  {
604  //Assemble the contributions of the velocities to
605  //the advection-diffusion equations
606  unsigned n_master = 1;
607  double hang_weight = 1.0;
608 
609  //Local bool (is the node hanging)
610  bool is_node_hanging = this->node_pt(l)->is_hanging();
611 
612  //If the node is hanging, get the number of master nodes
613  if(is_node_hanging)
614  {
615  hang_info_pt = this->node_pt(l)->hanging_pt();
616  n_master = hang_info_pt->nmaster();
617  }
618  //Otherwise there is just one master node, the node itself
619  else
620  {
621  n_master = 1;
622  }
623 
624  //Loop over the master nodes
625  for(unsigned m=0;m<n_master;m++)
626  {
627  //If the node is hanging get weight from master node
628  if(is_node_hanging)
629  {
630  //Get the hang weight from the master node
631  hang_weight = hang_info_pt->master_weight(m);
632  }
633  else
634  {
635  // Node contributes with full weight
636  hang_weight = 1.0;
637  }
638 
639  //Get the equation number
640  if(is_node_hanging)
641  {
642  //Get the equation number from the master node
643  local_eqn = this->local_hang_eqn(hang_info_pt->master_node_pt(m),
644  u_nodal_axi_adv_diff);
645  }
646  else
647  {
648  // Local equation number
649  local_eqn = this->nodal_local_eqn(l,u_nodal_axi_adv_diff);
650  }
651 
652  if(local_eqn >= 0)
653  {
654  //Loop over the external data
655  for(unsigned l2=0;l2<n_external_element_data;l2++)
656  {
657  //Find the local equation number corresponding to the global
658  //unknown
659  local_unknown =
660  this->local_eqn_number(
661  global_eqn_number_of_external_element_data[l2]);
662  if(local_unknown >= 0)
663  {
664  //Add contribution to jacobian matrix
665  jacobian(local_eqn,local_unknown)
666  -= peclet*dwind_dexternal_element_data[l2]*
667  interpolated_dudx[i2]*test(l)*hang_weight*r*W;
668  }
669  }
670  }
671  }
672  }
673  }
674  }
675  }
676 
677 };
678 
679 
680 
684 
685 
686 //================optimised_identification_of_field_data==================
691 //=======================================================================
694  Vector<std::set<FiniteElement*> > const &external_elements_pt,
695  std::set<std::pair<Data*,unsigned> > &paired_interaction_data)
696 {
697  //There's only one interaction
698  const unsigned interaction = 0;
699 
700  // Loop over each Navier Stokes element in the set of external elements that
701  // affect the current element
702  for(std::set<FiniteElement*>::iterator it=
703  external_elements_pt[interaction].begin();
704  it != external_elements_pt[interaction].end(); it++)
705  {
706 
707  //Cast the external element to a fluid element
708  AxisymmetricNavierStokesEquations* external_fluid_el_pt =
709  dynamic_cast<AxisymmetricNavierStokesEquations*>(*it);
710 
711  // Loop over the nodes
712  unsigned nnod=external_fluid_el_pt->nnode();
713  for (unsigned j=0;j<nnod;j++)
714  {
715  // Pointer to node (in its incarnation as Data)
716  Data* veloc_data_pt=external_fluid_el_pt->node_pt(j);
717 
718  // Get all velocity dofs
719  for (unsigned i=0;i<3;i++)
720  {
721  // Which value corresponds to the i-th velocity?
722  unsigned val=external_fluid_el_pt->u_index_axi_nst(i);
723 
724  // Turn pointer to Data and index of value into pair
725  // and add to the set
726  paired_interaction_data.insert(std::make_pair(veloc_data_pt,val));
727  }
728  }
729  }
730 } // done
731 
732 
736 
737 
738 //==========start_of_get_dbody_force=========== ===========================
741 //=========================================================================
744  const unsigned &ipt,
745  DenseMatrix<double> &result,
746  Vector<unsigned> &global_eqn_number)
747 {
748  // The interaction index is 0 in this case
749  unsigned interaction=0;
750 
751  // Dynamic cast "other" element to correct type
754  (external_element_pt(interaction,ipt));
755 
756  // Get vector that indicates the direction of gravity from
757  // the Navier-Stokes equations
759 
760  // Get the external element's derivatives
761  Vector<double> du_adv_diff_ddata;
763  external_element_local_coord(interaction,ipt),du_adv_diff_ddata,
764  global_eqn_number);
765 
766  //Find the number of external data
767  unsigned n_external_element_data = du_adv_diff_ddata.size();
768  //Set the size of the matrix to be returned
769  result.resize(3,n_external_element_data);
770 
771  // Temperature-dependent body force:
772  for (unsigned i=0;i<3;i++)
773  {
774  //Loop over the external data
775  for(unsigned n=0;n<n_external_element_data;n++)
776  {
777  result(i,n) = -gravity[i]*du_adv_diff_ddata[n]*ra();
778  }
779  }
780 
781 } // end_of_get_dbody_force
782 
783 
784 
788 
789 
790 
791 
792 //=========================================================================
794 //=========================================================================
797 
801 
802 
803 
804 
805 //======================class definitions==============================
809 //=====================================================================
812  public virtual ElementWithExternalElement
813 {
814 
815 private:
816 
818  double* Ra_pt;
819 
821  static double Default_Physical_Constant_Value;
822 
823 public:
824 
831  {
833 
834  //There is only one interaction
835  this->set_ninteraction(1);
836  }
837 
839  const double &ra() const {return *Ra_pt;}
840 
842  double* &ra_pt() {return Ra_pt;}
843 
846  void get_body_force_axi_nst(const double& time, const unsigned& ipt,
847  const Vector<double> &s, const Vector<double> &x,
848  Vector<double> &result);
849 
853  const unsigned& ipt,
854  DenseMatrix<double> &result, Vector<unsigned> &global_eqn_number);
855 
856 
860  DenseMatrix<double> &jacobian)
861  {
862 #ifdef USE_FD_JACOBIAN
863 
864  // This function computes the Jacobian by finite-differencing
866  fill_in_contribution_to_jacobian(residuals,jacobian);
867 
868 #else
869 
870  //Get the contribution from the basic Navier--Stokes element
872  fill_in_contribution_to_jacobian(residuals,jacobian);
873 
874  //Get the off-diagonal terms analytically
875  this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
876 
877 #endif
878  }
879 
883  Vector<double> &residuals, DenseMatrix<double> &jacobian,
884  DenseMatrix<double> &mass_matrix)
885  {
886  //Call the standard (Broken) function
887  //which will prevent these elements from being used
888  //in eigenproblems until replaced.
890  residuals,jacobian,mass_matrix);
891  }
892 
896  DenseMatrix<double> &jacobian)
897  {
898  //Local storage for the index in the nodes at which the
899  //Navier-Stokes velocities are stored (we know that this should be 0,1,2)
900  unsigned u_nodal_axi_nst[3];
901  for(unsigned i=0;i<3;i++)
902  {u_nodal_axi_nst[i] = this->u_index_axi_nst(i);}
903 
904  //Find out how many nodes there are
905  const unsigned n_node = this->nnode();
906 
907  //Set up memory for the shape and test functions and their derivatives
908  Shape psif(n_node), testf(n_node);
909  DShape dpsifdx(n_node,2), dtestfdx(n_node,2);
910 
911  //Number of integration points
912  const unsigned n_intpt = this->integral_pt()->nweight();
913 
914  //Integers to store the local equations and unknowns
915  int local_eqn=0, local_unknown=0;
916 
917  //Loop over the integration points
918  for(unsigned ipt=0;ipt<n_intpt;ipt++)
919  {
920  //Get the integral weight
921  double w = this->integral_pt()->weight(ipt);
922 
923  //Call the derivatives of the shape and test functions
924  double J =
925  this->dshape_and_dtest_eulerian_at_knot_axi_nst(ipt,psif,dpsifdx,
926  testf,dtestfdx);
927 
928  //Premultiply the weights and the Jacobian
929  double W = w*J;
930 
931  //Calculate the radius
932  double r = 0.0;
933  for(unsigned l=0;l<n_node;l++)
934  {
935  r += this->raw_nodal_position(l,0)*psif(l);
936  }
937 
938  //Assemble the jacobian terms
939 
940  //Get the derivatives of the body force wrt the unknowns
941  //of the external element
942  DenseMatrix<double> dbody_dexternal_element_data;
943 
944  //Vector of global equation number corresponding to the external
945  //element's data
946  Vector<unsigned> global_eqn_number_of_external_element_data;
947 
948  //Get the appropriate derivatives
949  this->get_dbody_force_axi_nst_dexternal_element_data(
950  ipt,dbody_dexternal_element_data,
951  global_eqn_number_of_external_element_data);
952 
953  //Find out how many external data there are
954  const unsigned n_external_element_data =
955  global_eqn_number_of_external_element_data.size();
956 
957  //Loop over the test functions
958  for(unsigned l=0;l<n_node;l++)
959  {
960  //Assemble the contributions of the temperature to
961  //the Navier--Stokes equations (which arise through the buoyancy
962  //body-force term)
963 
964  //Loop over the velocity components in the Navier--Stokes equtions
965  for(unsigned i=0;i<3;i++)
966  {
967  //If it's not a boundary condition
968  local_eqn = this->nodal_local_eqn(l,u_nodal_axi_nst[i]);
969  if(local_eqn >= 0)
970  {
971  //Loop over the external data
972  for(unsigned l2=0;l2<n_external_element_data;l2++)
973  {
974  //Find the local equation number corresponding to the global
975  //unknown
976  local_unknown =
977  this->local_eqn_number(
978  global_eqn_number_of_external_element_data[l2]);
979  if(local_unknown >= 0)
980  {
981  //Add contribution to jacobian matrix
982  jacobian(local_eqn,local_unknown)
983  += dbody_dexternal_element_data(i,l2)*testf(l)*r*W;
984  }
985  }
986  }
987  }
988  }
989  }
990  }
991 
992 };
993 
994 //======================class definitions==============================
998 //=====================================================================
1000  public virtual QAxisymAdvectionDiffusionElement<3>,
1001  public virtual ElementWithExternalElement
1002 {
1003 
1004 public:
1005 
1010  {
1011  //There is only one interaction
1012  this->set_ninteraction(1);
1013  }
1014 
1019  void get_wind_axi_adv_diff(const unsigned& ipt, const Vector<double> &s,
1020  const Vector<double>& x,
1021  Vector<double>& wind) const;
1022 
1023 
1024  //-----------------------------------------------------------
1025  // Note: we're overloading the output functions because the
1026  // ===== underlying advection diffusion elements output the
1027  // wind which is only available at the integration points
1028  // and even then only if the multi domain interaction
1029  // has been set up.
1030  //-----------------------------------------------------------
1031 
1034  // Start of output function
1035  void output(ostream &outfile, const unsigned &nplot)
1036  {
1037  //vector of local coordinates
1038  Vector<double> s(2);
1039 
1040  // Tecplot header info
1041  outfile << this->tecplot_zone_string(nplot);
1042 
1043  // Loop over plot points
1044  unsigned num_plot_points=this->nplot_points(nplot);
1045  for (unsigned iplot=0;iplot<num_plot_points;iplot++)
1046  {
1047  // Get local coordinates of plot point
1048  this->get_s_plot(iplot,nplot,s);
1049 
1050  // Output the position of the plot point
1051  for(unsigned i=0;i<2;i++)
1052  {outfile << this->interpolated_x(s,i) << " ";}
1053 
1054  // Output the temperature (the advected variable) at the plot point
1055  outfile << this->interpolated_u_axi_adv_diff(s) << std::endl;
1056  }
1057  outfile << std::endl;
1058 
1059  // Write tecplot footer (e.g. FE connectivity lists)
1060  this->write_tecplot_zone_footer(outfile,nplot);
1061 
1062  } //End of output function
1063 
1064 
1066  void output(ostream &outfile) {FiniteElement::output(outfile);}
1067 
1069  void output(FILE* file_pt)
1070  {FiniteElement::output(file_pt);}
1071 
1073  void output(FILE* file_pt, const unsigned &n_plot)
1074  {FiniteElement::output(file_pt,n_plot);}
1075 
1076 
1077 
1081  const unsigned& ipt, const unsigned &i,
1082  Vector<double> &result, Vector<unsigned> &global_eqn_number);
1083 
1084 
1088  DenseMatrix<double> &jacobian)
1089  {
1090 #ifdef USE_FD_JACOBIAN
1091 
1092  // This function computes the Jacobian by finite-differencing
1094  fill_in_contribution_to_jacobian(residuals,jacobian);
1095 
1096 #else
1097 
1098  //Get the contribution from the basic advection-diffusion element
1100  fill_in_contribution_to_jacobian(residuals,jacobian);
1101  //Get the off-diagonal terms analytically
1102  this->fill_in_off_diagonal_block_analytic(residuals,jacobian);
1103 
1104 #endif
1105  }
1106 
1110  Vector<double> &residuals, DenseMatrix<double> &jacobian,
1111  DenseMatrix<double> &mass_matrix)
1112  {
1113  //Call the standard (Broken) function
1114  //which will prevent these elements from being used
1115  //in eigenproblems until replaced.
1117  residuals,jacobian,mass_matrix);
1118  }
1119 
1120 
1124  DenseMatrix<double> &jacobian)
1125  {
1126  //Local storage for the index at which the temperature is stored
1127  const unsigned u_nodal_axi_adv_diff = this->u_index_axi_adv_diff();
1128 
1129  //Find out how many nodes there are
1130  const unsigned n_node = this->nnode();
1131 
1132  //Set up memory for the shape and test functions and their derivatives
1133  Shape psi(n_node), test(n_node);
1134  DShape dpsidx(n_node,2), dtestdx(n_node,2);
1135 
1136  //Number of integration points
1137  const unsigned n_intpt = this->integral_pt()->nweight();
1138 
1139  //Integers to store the local equations and unknowns
1140  int local_eqn=0, local_unknown=0;
1141 
1142  //Get the peclet number
1143  const double peclet = this->pe();
1144 
1145  //Loop over the integration points
1146  for(unsigned ipt=0;ipt<n_intpt;ipt++)
1147  {
1148  //Get the integral weight
1149  double w = this->integral_pt()->weight(ipt);
1150 
1151  //Call the derivatives of the shape and test functions
1152  double J =
1153  this->dshape_and_dtest_eulerian_at_knot_axi_adv_diff(ipt,psi,dpsidx,
1154  test,dtestdx);
1155 
1156  //Premultiply the weights and the Jacobian
1157  double W = w*J;
1158 
1159  //Calculate local values of the derivatives of the solution
1160  Vector<double> interpolated_dudx(2,0.0);
1161  //Calculate radius
1162  double r = 0.0;
1163  // Loop over nodes
1164  for(unsigned l=0;l<n_node;l++)
1165  {
1166  r += this->raw_nodal_position(l,0)*psi(l);
1167  // Loop over directions
1168  for(unsigned j=0;j<2;j++)
1169  {
1170  interpolated_dudx[j] +=
1171  this->raw_nodal_value(l,u_nodal_axi_adv_diff)*dpsidx(l,j);
1172  }
1173  }
1174 
1175  //Get the derivatives of the wind wrt the unknowns
1176  //of the external element
1177  Vector<double> dwind_dexternal_element_data;
1178 
1179  //Vector of global equation number corresponding to the external
1180  //element's data
1181  Vector<unsigned> global_eqn_number_of_external_element_data;
1182 
1183 
1184  //Loop over the wind directions
1185  for(unsigned i2=0;i2<2;i2++)
1186  {
1187  //Get the appropriate derivatives
1188  this->get_dwind_axi_adv_diff_dexternal_element_data(
1189  ipt,i2,dwind_dexternal_element_data,
1190  global_eqn_number_of_external_element_data);
1191 
1192  //Find out how many external data there are
1193  const unsigned n_external_element_data =
1194  global_eqn_number_of_external_element_data.size();
1195 
1196  //Loop over the test functions
1197  for(unsigned l=0;l<n_node;l++)
1198  {
1199  //Assemble the contributions of the velocities
1200  //the Advection-Diffusion equations
1201 
1202  //If it's not a boundary condition
1203  local_eqn = this->nodal_local_eqn(l,u_nodal_axi_adv_diff);
1204  if(local_eqn >= 0)
1205  {
1206  //Loop over the external data
1207  for(unsigned l2=0;l2<n_external_element_data;l2++)
1208  {
1209  //Find the local equation number corresponding to the global
1210  //unknown
1211  local_unknown =
1212  this->local_eqn_number(
1213  global_eqn_number_of_external_element_data[l2]);
1214  if(local_unknown >= 0)
1215  {
1216  //Add contribution to jacobian matrix
1217  jacobian(local_eqn,local_unknown)
1218  -= peclet*dwind_dexternal_element_data[l2]*
1219  interpolated_dudx[i2]*test(l)*r*W;
1220  }
1221  }
1222  }
1223  }
1224  }
1225  }
1226  }
1227 
1228 };
1229 
1230 //============================================================
1233 //========================================================
1235 get_body_force_axi_nst(const double& time,
1236  const unsigned& ipt,
1237  const Vector<double> &s,
1238  const Vector<double> &x,
1239  Vector<double> &result)
1240 {
1241  // The interaction index is 0 in this case
1242  unsigned interaction=0;
1243 
1244 // Get the temperature interpolated from the external element
1245  const double interpolated_t =
1246  dynamic_cast<AxisymAdvectionDiffusionEquations*>(
1247  external_element_pt(interaction,ipt))->
1248  interpolated_u_axi_adv_diff(external_element_local_coord(interaction,ipt));
1249 
1250  // Get vector that indicates the direction of gravity from
1251  // the Navier-Stokes equations
1253 
1254  // Temperature-dependent body force:
1255  for (unsigned i=0;i<3;i++)
1256  {
1257  result[i] = -gravity[i]*interpolated_t*ra();
1258  }
1259 }
1260 
1261 
1262 //=========================================================================
1265 //=========================================================================
1268  const unsigned &ipt,
1269  DenseMatrix<double> &result,
1270  Vector<unsigned> &global_eqn_number)
1271 {
1272  // The interaction index is 0 in this case
1273  unsigned interaction=0;
1274 
1275  // Dynamic cast "other" element to correct type
1278  (external_element_pt(interaction,ipt));
1279 
1280  // Get vector that indicates the direction of gravity from
1281  // the Navier-Stokes equations
1283 
1284  // Get the external element's derivatives
1285  Vector<double> du_axi_adv_diff_ddata;
1286  source_el_pt->dinterpolated_u_axi_adv_diff_ddata(
1287  external_element_local_coord(interaction,ipt),du_axi_adv_diff_ddata,
1288  global_eqn_number);
1289 
1290  //Find the number of external data
1291  unsigned n_external_element_data = du_axi_adv_diff_ddata.size();
1292  //Set the size of the matrix to be returned
1293  result.resize(3,n_external_element_data);
1294 
1295  // Temperature-dependent body force:
1296  for (unsigned i=0;i<3;i++)
1297  {
1298  //Loop over the external data
1299  for(unsigned n=0;n<n_external_element_data;n++)
1300  {
1301  result(i,n) = -gravity[i]*du_axi_adv_diff_ddata[n]*ra();
1302  }
1303  }
1304 }
1305 
1306 
1307 //==========================================================================
1312 //==========================================================================
1314 (const unsigned& ipt,const Vector<double> &s,const Vector<double>& x,
1315  Vector<double>& wind) const
1316 {
1317  // The interaction index is 0 in this case
1318  unsigned interaction=0;
1319 
1320  // Dynamic cast "other" element to correct type
1323  (external_element_pt(interaction,ipt));
1324 
1325  //The wind function is simply the velocity at the points of the "other" el
1326  source_el_pt->interpolated_u_axi_nst
1327  (external_element_local_coord(interaction,ipt),wind);
1328 }
1329 
1330 //=========================================================================
1333 //=========================================================================
1336  const unsigned &i,
1337  Vector<double> &result,
1338  Vector<unsigned> &global_eqn_number)
1339 {
1340  // The interaction index is 0 in this case
1341  unsigned interaction=0;
1342 
1343  // Dynamic cast "other" element to correct type
1346  (external_element_pt(interaction,ipt));
1347 
1348  // Get the external element's derivatives of the velocity with respect
1349  // to the data. The wind is just the Navier--Stokes velocity, so this
1350  // is all that's required
1351  source_el_pt->dinterpolated_u_axi_nst_ddata(
1352  external_element_local_coord(interaction,ipt),i,result,
1353  global_eqn_number);
1354 }
1355 
1356 
1357 
1358 //=========================================================================
1360 //=========================================================================
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
JacobiRotation< float > J
Definition: Jacobi_makeJacobi.cpp:3
RowVector3d w
Definition: Matrix_resize_int.cpp:3
Definition: axisym_heat_sphere/multi_domain_axisym_boussinesq_elements.h:1002
void output(FILE *file_pt)
C-style output function: Broken default.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1069
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1123
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1109
void output(ostream &outfile)
Overload the standard output function with the broken default.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1066
QAxisymAdvectionDiffusionElementWithExternalElement()
Constructor: call the underlying constructors.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1007
void get_dwind_axi_adv_diff_dexternal_element_data(const unsigned &ipt, const unsigned &i, Vector< double > &result, Vector< unsigned > &global_eqn_number)
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1087
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function: Broken default.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1073
void get_wind_axi_adv_diff(const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &wind) const
void output(ostream &outfile, const unsigned &nplot)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:1035
Definition: axisym_heat_sphere/multi_domain_axisym_boussinesq_elements.h:813
QAxisymCrouzeixRaviartElementWithExternalElement()
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:828
void get_dbody_force_axi_nst_dexternal_element_data(const unsigned &ipt, DenseMatrix< double > &result, Vector< unsigned > &global_eqn_number)
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:895
static double Default_Physical_Constant_Value
The static default value of the Rayleigh number.
Definition: axisym_heat_sphere/multi_domain_axisym_boussinesq_elements.h:821
double *& ra_pt()
Access function for the pointer to the Rayleigh number.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:842
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:882
void get_body_force_axi_nst(const double &time, const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &result)
const double & ra() const
Access function for the Rayleigh number (const version)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:839
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:859
Definition: axisym_heat_sphere/multi_domain_axisym_boussinesq_elements.h:364
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function: Broken default.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:427
void output(ostream &outfile, const unsigned &nplot)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:389
void get_wind_axi_adv_diff(const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &wind) const
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:435
void output(FILE *file_pt)
C-style output function: Broken default.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:423
void output(ostream &outfile)
Overload the standard output function with the broken default.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:420
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:487
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residual vector and the Jacobian matrix.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:455
RefineableQAxisymAdvectionDiffusionBoussinesqElement()
Constructor: call the underlying constructors.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:369
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)
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:524
void get_dwind_axi_adv_diff_dexternal_element_data(const unsigned &ipt, const unsigned &i, Vector< double > &result, Vector< unsigned > &global_eqn_number)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:501
Definition: axisym_heat_sphere/multi_domain_axisym_boussinesq_elements.h:55
RefineableQAxisymCrouzeixRaviartBoussinesqElement()
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:62
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Compute the element's residual vector and the Jacobian matrix.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:142
const double & ra() const
Access function for the Rayleigh number (const version)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:74
void further_build()
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:83
double *& ra_pt()
Access function for the pointer to the Rayleigh number.
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:77
static double Default_Physical_Constant_Value
The static default value of the Rayleigh number.
Definition: axisym_heat_sphere/multi_domain_axisym_boussinesq_elements.h:342
void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:168
void fill_in_off_diagonal_block_analytic(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:189
void get_body_force_axi_nst(const double &time, const unsigned &ipt, const Vector< double > &s, const Vector< double > &x, Vector< double > &body_force)
Definition: b_convection_sphere/multi_domain_axisym_boussinesq_elements.h:110
void get_dbody_force_axi_nst_dexternal_element_data(const unsigned &ipt, DenseMatrix< double > &result, Vector< unsigned > &global_eqn_number)
Definition: axisym_advection_diffusion_elements.h:54
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: axisym_advection_diffusion_elements.h:427
virtual void dinterpolated_u_axi_adv_diff_ddata(const Vector< double > &s, Vector< double > &du_ddata, Vector< unsigned > &global_eqn_number)
Definition: axisym_advection_diffusion_elements.h:469
Definition: axisym_navier_stokes_elements.h:115
const Vector< double > & g() const
Vector of gravitational components.
Definition: axisym_navier_stokes_elements.h:446
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: axisym_navier_stokes_elements.h:793
void interpolated_u_axi_nst(const Vector< double > &s, Vector< double > &veloc) const
Compute vector of FE interpolated velocity u at local coordinate s.
Definition: axisym_navier_stokes_elements.h:865
virtual void dinterpolated_u_axi_nst_ddata(const Vector< double > &s, const unsigned &i, Vector< double > &du_ddata, Vector< unsigned > &global_eqn_number)
Definition: axisym_navier_stokes_elements.h:948
virtual unsigned u_index_axi_nst(const unsigned &i) const
Definition: axisym_navier_stokes_elements.h:506
Definition: axisym_navier_stokes_elements.h:1234
Definition: shape.h:278
Definition: nodes.h:86
void resize(const unsigned long &n)
Definition: matrices.h:498
Definition: element_with_external_element.h:56
bool external_geometric_data_is_included() const
Definition: element_with_external_element.h:301
void fill_in_contribution_to_jacobian(Vector< double > &residuals, DenseMatrix< double > &jacobian)
Definition: element_with_external_element.h:427
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
virtual void output(std::ostream &outfile)
Definition: elements.h:3050
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
virtual void fill_in_contribution_to_jacobian_and_mass_matrix(Vector< double > &residuals, DenseMatrix< double > &jacobian, DenseMatrix< double > &mass_matrix)
Definition: elements.cc:1322
Definition: nodes.h:742
double const & master_weight(const unsigned &i) const
Return weight for dofs on i-th master node.
Definition: nodes.h:808
Node *const & master_node_pt(const unsigned &i) const
Return a pointer to the i-th master node.
Definition: nodes.h:791
unsigned nmaster() const
Return the number of master nodes.
Definition: nodes.h:785
Definition: axisym_advection_diffusion_elements.h:598
void dinterpolated_u_axi_nst_ddata(const Vector< double > &s, const unsigned &i, Vector< double > &du_ddata, Vector< unsigned > &global_eqn_number)
Definition: refineable_axisym_navier_stokes_elements.h:175
Definition: refineable_axisym_navier_stokes_elements.h:765
void further_build()
Definition: refineable_axisym_navier_stokes_elements.h:984
Definition: refineable_axisym_advection_diffusion_elements.h:365
Definition: shape.h:76
RealScalar s
Definition: level1_cplx_impl.h:130
int * m
Definition: level2_cplx_impl.h:294
squared absolute sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2 sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square nearest sa Eigen::floor DOXCOMMA Eigen::ceil DOXCOMMA ArrayBase::round nearest integer not less than the given sa Eigen::floor DOXCOMMA ArrayBase::ceil not a number test
Definition: GlobalFunctions.h:109
void body_force(const double &time, const Vector< double > &x, Vector< double > &result)
Definition: axisym_linear_elasticity/cylinder/cylinder.cc:96
void gravity(const double &t, const Vector< double > &xi, Vector< double > &b)
Definition: ConstraintElementsUnitTest.cpp:20
r
Definition: UniformPSDSelfTest.py:20
val
Definition: calibrate.py:119
Definition: MortaringCantileverCompareToNonMortaring.cpp:176
double Default_Physical_Constant_Value
Default value for physical constants.
Definition: multi_domain_boussinesq_elements.h:48
@ W
Definition: quadtree.h:63
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
const double & pe() const
Peclet number.
Definition: gen_axisym_advection_diffusion_elements.h:284
list x
Definition: plotDoE.py:28
Definition: indexed_view.cpp:20
void set(Container &c, Position position, const Value &value)
Definition: stdlist_overload.cpp:36
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2