unsteady_heat_flux_pseudo_melt_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 file for elements that are used to apply prescribed flux
27 // boundary conditions to the UnsteadyHeat equations, ensuring
28 // that boundary temperature never exceeds the melting temperature.
29 // The required flux (applied in addition to whatever is externally
30 // imposed) is just "sucked into nothing" here -- in the actual
31 // melt elements, this flux will be what drives the melt process.
32 #ifndef OOMPH_UNSTEADY_HEAT_FLUX_PSEUDO_MELT_ELEMENTS_HEADER
33 #define OOMPH_UNSTEADY_HEAT_FLUX_PSEUDO_MELT_ELEMENTS_HEADER
34 
35 // Config header generated by autoconfig
36 #ifdef HAVE_CONFIG_H
37  #include <oomph-lib-config.h>
38 #endif
39 
40 
41 //Standard libray headers
42 #include <cmath>
43 
44 // oomph-lib includes
45 #include "generic/Qelements.h"
46 
47 
48 namespace oomph
49 {
50 
51 //======================================================================
63 //======================================================================
64 template <class ELEMENT>
65 class UnsteadyHeatFluxPseudoMeltElement : public virtual FaceGeometry<ELEMENT>,
66 public virtual FaceElement
67 {
68 
69 public:
70 
74  (const double& time, const Vector<double>& x, double& flux);
75 
79  const int &face_index, const unsigned &id=0);
80 
84  {
85  BrokenCopy::broken_copy("UnsteadyHeatFluxPseudoMeltElement");
86  }
87 
90 
93  {
94  //Call the generic residuals function with flag set to 0
95  //using a dummy matrix argument
98  }
99 
105  double zeta_nodal(const unsigned &n, const unsigned &k,
106  const unsigned &i) const
107  {return FaceElement::zeta_nodal(n,k,i);}
108 
110  void output(std::ostream &outfile)
111  {
112  unsigned nplot=5;
113  output(outfile,nplot);
114  }
115 
117  void output(std::ostream &outfile, const unsigned &n_plot)
118  {
119  // Locally cache the index at which the variable is stored
120  const unsigned u_index_ust_heat = U_index_ust_heat;
121 
122  // Get continuous time from timestepper of first node
123  double time=node_pt(0)->time_stepper_pt()->time_pt()->time();
124 
125  //Find out how many nodes there are
126  const unsigned n_node = nnode();
127 
128  //Set up memory for the shape functions
129  Shape psi(n_node);
130 
131  // Local and global coordinates
132  Vector<double> s(Dim-1);
134 
135  // Tecplot header info
136  outfile << this->tecplot_zone_string(n_plot);
137 
138  // Loop over plot points
139  unsigned num_plot_points=this->nplot_points(n_plot);
140  for (unsigned iplot=0;iplot<num_plot_points;iplot++)
141  {
142  // Get local coordinates of plot point
143  this->get_s_plot(iplot,n_plot,s);
144 
145  // Outer unit normal
146  Vector<double> unit_normal(Dim);
147  outer_unit_normal(s,unit_normal);
148 
149  //Find the shape functions
150  shape(s,psi);
151 
152  // Melt flux
153  double melt_flux=0.0;
154 
155  // Temperature
156  double u=0.0;
157 
158  //Initialise to zero
159  for(unsigned i=0;i<Dim;i++)
160  {
161  interpolated_x[i] = 0.0;
162  }
163 
164  //Calculate stuff
165  for(unsigned l=0;l<n_node;l++)
166  {
167  // get the node pt
168  Node* nod_pt = node_pt(l);
169 
170  // Cast to a boundary node
171  BoundaryNodeBase *bnod_pt =
172  dynamic_cast<BoundaryNodeBase*>(nod_pt);
173 
174  // Get the index of the first nodal value associated with
175  // this FaceElement
176  unsigned first_index=
178 
179  // Melt rate
180  melt_flux+=nod_pt->value(first_index)*psi[l];
181 
182  // Temperature
183  u+=nod_pt->value(u_index_ust_heat)*psi[l];
184 
185  //Loop over directions
186  for(unsigned i=0;i<Dim;i++)
187  {
188  interpolated_x[i] += nodal_position(l,i)*psi[l];
189  }
190  }
191 
192  //Get the imposed flux
193  double flux;
195 
196  //Output the x,y,..
197  for(unsigned i=0;i<Dim;i++)
198  {
199  outfile << interpolated_x[i] << " ";
200  }
201 
202  // Output imposed flux and melt flux
203  outfile << flux << " ";
204  outfile << melt_flux << " ";
205 
206  // Output normal
207  for(unsigned i=0;i<Dim;i++)
208  {
209  outfile << unit_normal[i] << " ";
210  }
211  outfile << std::endl;
212  }
213  }
214 
217  void output(FILE* file_pt) {FaceGeometry<ELEMENT>::output(file_pt);}
218 
222  void output(FILE* file_pt, const unsigned &n_plot)
223  {FaceGeometry<ELEMENT>::output(file_pt,n_plot);}
224 
225 
226 
228  void plot_residual_landscape(std::ostream &landscape_outfile,
229  std::ostream &soln_outfile,
230  Problem* problem_pt,
231  const unsigned& j)
232  {
233  // Which node?
234  Node* nod_pt=this->node_pt(j);
235 
236  // Cast to a boundary node
237  BoundaryNodeBase *bnod_pt =
238  dynamic_cast<BoundaryNodeBase*>(nod_pt);
239 
240  // Get the index of the first nodal value associated with
241  // this FaceElement
242  unsigned first_index=
244 
245  // Backup values
246  double u_back=nod_pt->value(U_index_ust_heat);
247  double m_back=nod_pt->value(first_index);
248 
249  int global_eqn_u = nod_pt->eqn_number(U_index_ust_heat);
250  int global_eqn_m = nod_pt->eqn_number(first_index);
251 
252  if (global_eqn_u<0) abort();
253  if (global_eqn_m<0) abort();
254 
255  // Output actual solution
256  DoubleVector residuals;
257  problem_pt->get_residuals(residuals);
258  soln_outfile << u_back << " "
259  << m_back << " "
260  << residuals[global_eqn_u] << " "
261  << residuals[global_eqn_m]<< std::endl;
262 
263  // Range of plot values
264  double u_min=melt_temperature()-5.0;
265  double u_max=melt_temperature()+5.0;
266  double m_min=-5.0;
267  double m_max=5.0;
268 
269  unsigned nplot=100;
270  landscape_outfile << "ZONE I=" << nplot << ", J=" << nplot << std::endl;
271  for (unsigned i=0;i<nplot;i++)
272  {
273  double x0=u_min+(u_max-u_min)*double(i)/double(nplot-1);
274  for (unsigned j=0;j<nplot;j++)
275  {
276  double x1=m_min+(m_max-m_min)*double(j)/double(nplot-1);
277 
278  nod_pt->set_value(U_index_ust_heat,x0);
279  nod_pt->set_value(first_index,x1);
280 
281  problem_pt->get_residuals(residuals);
282  landscape_outfile << x0 << " "
283  << x1 << " "
284  << residuals[global_eqn_u] << " "
285  << residuals[global_eqn_m] << std::endl;
286  }
287  }
288 
289  // Reset values
290  nod_pt->set_value(U_index_ust_heat,u_back);
291  nod_pt->set_value(first_index,m_back);
292  }
293 
294 
297  {
298  if (Melt_temperature_pt==0)
299  {
300  return 0.0;
301  }
302  else
303  {
304  return *Melt_temperature_pt;
305  }
306  }
307 
310  {
311  return Melt_temperature_pt;
312  }
313 
314 
317  {
318  unsigned n_node=nnode();
319  for(unsigned l=0;l<n_node;l++)
320  {
321  // get the node pt
322  Node* nod_pt = node_pt(l);
323 
324  // Cast to a boundary node
325  BoundaryNodeBase *bnod_pt =
326  dynamic_cast<BoundaryNodeBase*>(nod_pt);
327 
328  // Get the index of the first nodal value associated with
329  // this FaceElement
330  unsigned first_index=
332 
333  // Pin
334  nod_pt->pin(first_index);
335  }
336  }
337 
338  protected:
339 
343  inline double shape_and_test(const Vector<double> &s, Shape &psi, Shape &test)
344  const
345  {
346  //Find number of nodes
347  unsigned n_node = nnode();
348 
349  //Get the shape functions
350  shape(s,psi);
351 
352  //Set the test functions to be the same as the shape functions
353  for(unsigned i=0;i<n_node;i++) {test[i] = psi[i];}
354 
355  //Return the value of the jacobian
356  return J_eulerian(s);
357  }
358 
361  void get_flux(const double& time, const Vector<double>& x, double& flux)
362  {
363  //If the function pointer is zero return zero
364  if(Flux_fct_pt == 0)
365  {
366  flux=0.0;
367  }
368  //Otherwise call the function
369  else
370  {
371  (*Flux_fct_pt)(time,x,flux);
372  }
373  }
374 
375 
376  private:
377 
378 
382  Vector<double> &residuals, DenseMatrix<double> &jacobian,
383  unsigned flag);
384 
387 
389  unsigned Dim;
390 
393 
395  unsigned Melt_id;
396 
399 
400 };
401 
405 
406 //===========================================================================
409 //===========================================================================
410 template<class ELEMENT>
413  const int &face_index, const unsigned &id) :
414  FaceGeometry<ELEMENT>(), FaceElement()
415 {
416  // Use default melt temperature
418 
419 #ifdef PARANOID
420  {
421  //Check that the element is not a refineable 3d element
422  ELEMENT* elem_pt = new ELEMENT;
423  //If it's three-d
424  if(elem_pt->dim()==3)
425  {
426  //Is it refineable
427  if(dynamic_cast<RefineableElement*>(elem_pt))
428  {
429  //Issue a warning
431  "This flux element will not work correctly if nodes are hanging\n",
432  "UnsteadyHeatFluxPseudoMeltElement::Constructor",
434  }
435  }
436  }
437 #endif
438 
439  // Let the bulk element build the FaceElement, i.e. setup the pointers
440  // to its nodes (by referring to the appropriate nodes in the bulk
441  // element), etc.
442  bulk_el_pt->build_face_element(face_index,this);
443 
444  // Melt flux stored at nodes
445  Vector<unsigned> n_additional_values(nnode(),1);
446 
447  // Now add storage and set the map containing
448  // the position of the first entry of this face element's
449  // additional values.
450  Melt_id=id;
451  add_additional_values(n_additional_values,Melt_id);
452 
453  // Initialise the prescribed-flux function pointer to zero
454  Flux_fct_pt = 0;
455 
456  // Extract the dimension of the problem from the dimension of
457  // the first node
458  Dim = this->node_pt(0)->ndim();
459 
460  //Set up U_index_ust_heat. Initialise to zero, which probably won't change
461  //in most cases, oh well, the price we pay for generality
462  U_index_ust_heat = 0;
463 
464  //Cast to the appropriate UnsteadyHeatEquation so that we can
465  //find the index at which the variable is stored
466  //We assume that the dimension of the full problem is the same
467  //as the dimension of the node, if this is not the case you will have
468  //to write custom elements, sorry
469  switch(Dim)
470  {
471  //One dimensional problem
472  case 1:
473  {
474  UnsteadyHeatEquations<1>* eqn_pt =
475  dynamic_cast<UnsteadyHeatEquations<1>*>(bulk_el_pt);
476  //If the cast has failed die
477  if(eqn_pt==0)
478  {
479  std::string error_string =
480  "Bulk element must inherit from UnsteadyHeatEquations.";
481  error_string +=
482  "Nodes are one dimensional, but cannot cast the bulk element to\n";
483  error_string += "UnsteadyHeatEquations<1>\n.";
484  error_string +=
485  "If you desire this functionality, you must implement it yourself\n";
486 
487  throw OomphLibError(error_string,
490  }
491  //Otherwise read out the value
492  else
493  {
494  //Read the index from the (cast) bulk element
496  }
497  }
498  break;
499 
500  //Two dimensional problem
501  case 2:
502  {
503  UnsteadyHeatEquations<2>* eqn_pt =
504  dynamic_cast<UnsteadyHeatEquations<2>*>(bulk_el_pt);
505  //If the cast has failed die
506  if(eqn_pt==0)
507  {
508  std::string error_string =
509  "Bulk element must inherit from UnsteadyHeatEquations.";
510  error_string +=
511  "Nodes are two dimensional, but cannot cast the bulk element to\n";
512  error_string += "UnsteadyHeatEquations<2>\n.";
513  error_string +=
514  "If you desire this functionality, you must implement it yourself\n";
515 
516  throw OomphLibError(error_string,
519  }
520  else
521  {
522  //Read the index from the (cast) bulk element.
524  }
525  }
526  break;
527 
528  //Three dimensional problem
529  case 3:
530  {
531  UnsteadyHeatEquations<3>* eqn_pt =
532  dynamic_cast<UnsteadyHeatEquations<3>*>(bulk_el_pt);
533  //If the cast has failed die
534  if(eqn_pt==0)
535  {
536  std::string error_string =
537  "Bulk element must inherit from UnsteadyHeatEquations.";
538  error_string +=
539  "Nodes are three dimensional, but cannot cast the bulk element to\n";
540  error_string += "UnsteadyHeatEquations<3>\n.";
541  error_string +=
542  "If you desire this functionality, you must implement it yourself\n";
543 
544  throw OomphLibError(error_string,
547 
548  }
549  else
550  {
551  //Read the index from the (cast) bulk element.
553  }
554  }
555  break;
556 
557  //Any other case is an error
558  default:
559  std::ostringstream error_stream;
560  error_stream << "Dimension of node is " << Dim
561  << ". It should be 1,2, or 3!" << std::endl;
562 
563  throw OomphLibError(error_stream.str(),
566  break;
567  }
568 
569 }
570 
571 
572 
573 //===========================================================================
575 //===========================================================================
576 template<class ELEMENT>
579  Vector<double> &residuals, DenseMatrix<double> &jacobian,
580  unsigned flag)
581 {
582 
583  // Code isn't quite complete yet...
584  if (flag==1)
585  {
586  throw OomphLibError("Jacobian not yet implemented.\n",
589  }
590 
591  //Find out how many nodes there are
592  const unsigned n_node = nnode();
593 
594  // Get continuous time from timestepper of first node
595  double time=node_pt(0)->time_stepper_pt()->time_pt()->time();
596 
597  //Set up memory for the shape and test functions
598  Shape psif(n_node), testf(n_node);
599 
600  //Set the value of n_intpt
601  const unsigned n_intpt = integral_pt()->nweight();
602 
603  //Set the Vector to hold local coordinates
604  Vector<double> s(Dim-1);
605 
606  //Integer to store the local equation and unknowns
607  int local_eqn=0;
608 
609  // Locally cache the index at which the variable is stored
610  const unsigned u_index_ust_heat = U_index_ust_heat;
611 
612  //Loop over the integration points
613  //--------------------------------
614  for(unsigned ipt=0;ipt<n_intpt;ipt++)
615  {
616 
617  //Assign values of s
618  for(unsigned i=0;i<(Dim-1);i++)
619  {
620  s[i] = integral_pt()->knot(ipt,i);
621  }
622 
623  //Get the integral weight
624  double w = integral_pt()->weight(ipt);
625 
626  //Find the shape and test functions and return the Jacobian
627  //of the mapping
628  double J = shape_and_test(s,psif,testf);
629 
630  //Premultiply the weights and the Jacobian
631  double W = w*J;
632 
633  //Need to find position to feed into flux function
634  Vector<double> interpolated_x(Dim);
635 
636  // Melt flux
637  double melt_flux=0.0;
638 
639  // Temperature
640  double u=0.0;
641 
642  //Initialise to zero
643  for(unsigned i=0;i<Dim;i++)
644  {
645  interpolated_x[i] = 0.0;
646  }
647 
648  //Calculate quantities
649  for(unsigned l=0;l<n_node;l++)
650  {
651  // get the node pt
652  Node* nod_pt = node_pt(l);
653 
654  // Cast to a boundary node
655  BoundaryNodeBase *bnod_pt =
656  dynamic_cast<BoundaryNodeBase*>(nod_pt);
657 
658  // Get the index of the first nodal value associated with
659  // this FaceElement
660  unsigned first_index=
662 
663  // Melt rate
664  melt_flux+=nod_pt->value(first_index)*psif[l];
665 
666  // Temperature
667  u+=nod_pt->value(u_index_ust_heat)*psif[l];
668 
669  //Loop over components
670  for(unsigned i=0;i<Dim;i++)
671  {
672  interpolated_x[i] += nodal_position(l,i)*psif[l];
673  }
674  }
675 
676  //Get the imposed flux
677  double flux=0.0;
678  get_flux(time,interpolated_x,flux);
679 
680  //Now add to the appropriate equations
681 
682  //Loop over the test functions
683  for(unsigned l=0;l<n_node;l++)
684  {
685  local_eqn = nodal_local_eqn(l,u_index_ust_heat);
686  /*IF it's not a boundary condition*/
687  if(local_eqn >= 0)
688  {
689  //Add the prescribed flux terms
690  residuals[local_eqn] -= (flux-melt_flux)*testf[l]*W;
691  }
692  }
693  }
694 
695  // Collocation for melt rate:
696  //---------------------------
697 
698  //Loop over the nodes
699  for(unsigned l=0;l<n_node;l++)
700  {
701  // get the node pt
702  Node* nod_pt = node_pt(l);
703 
704  // Cast to a boundary node
705  BoundaryNodeBase *bnod_pt =
706  dynamic_cast<BoundaryNodeBase*>(nod_pt);
707 
708  // Get the index of the first nodal value associated with
709  // this FaceElement
710  unsigned first_index=
712  local_eqn = nodal_local_eqn(l,first_index);
713 
714  /*IF it's not a boundary condition*/
715  if(local_eqn >= 0)
716  {
717  double u=nod_pt->value(u_index_ust_heat);
718  double melt_flux=nod_pt->value(first_index);
719 
720  // Piecewise linear variation
721  if ((melt_temperature()-u)>melt_flux)
722  {
723  residuals[local_eqn]+=melt_flux;
724  }
725  else
726  {
727  residuals[local_eqn]+=(melt_temperature()-u);
728  }
729  }
730  }
731 
732 }
733 }
734 
735 #endif
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: nodes.h:1996
unsigned index_of_first_value_assigned_by_face_element(const unsigned &face_id=0) const
Definition: nodes.h:2061
long & eqn_number(const unsigned &i)
Return the equation number of the i-th stored variable.
Definition: nodes.h:367
void pin(const unsigned &i)
Pin the i-th stored variable.
Definition: nodes.h:385
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
Definition: nodes.h:238
void set_value(const unsigned &i, const double &value_)
Definition: nodes.h:271
Definition: double_vector.h:58
Definition: elements.h:4338
int & face_index()
Definition: elements.h:4626
void outer_unit_normal(const Vector< double > &s, Vector< double > &unit_normal) const
Compute outer unit normal at the specified local coordinate.
Definition: elements.cc:6006
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: elements.h:4497
void add_additional_values(const Vector< unsigned > &nadditional_values, const unsigned &id)
Definition: elements.h:4428
double interpolated_x(const Vector< double > &s, const unsigned &i) const
Definition: elements.h:4528
double J_eulerian(const Vector< double > &s) const
Definition: elements.cc:5242
Definition: elements.h:4998
Definition: elements.h:1313
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
Definition: elements.h:2175
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Definition: elements.h:3161
virtual void build_face_element(const int &face_index, FaceElement *face_element_pt)
Definition: elements.cc:5132
virtual void shape(const Vector< double > &s, Shape &psi) const =0
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
virtual void get_s_plot(const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
Definition: elements.h:3148
virtual unsigned nplot_points(const unsigned &nplot) const
Definition: elements.h:3186
double nodal_position(const unsigned &n, const unsigned &i) const
Definition: elements.h:2317
static DenseMatrix< double > Dummy_matrix
Definition: elements.h:227
Definition: nodes.h:906
unsigned ndim() const
Return (Eulerian) spatial dimension of the node.
Definition: nodes.h:1054
double value(const unsigned &i) const
Definition: nodes.cc:2408
Definition: oomph_definitions.h:222
Definition: oomph_definitions.h:267
Definition: problem.h:151
virtual void get_residuals(DoubleVector &residuals)
Get the total residuals Vector for the problem.
Definition: problem.cc:3714
Definition: refineable_elements.h:97
Definition: shape.h:76
Time *const & time_pt() const
Access function for the pointer to time (const version)
Definition: timesteppers.h:572
double & time()
Return the current value of the continuous time.
Definition: timesteppers.h:123
Definition: unsteady_heat_elements.h:72
virtual unsigned u_index_ust_heat() const
Broken assignment operator.
Definition: unsteady_heat_elements.h:112
Definition: unsteady_heat_flux_pseudo_melt_elements.h:67
double shape_and_test(const Vector< double > &s, Shape &psi, Shape &test) const
Definition: unsteady_heat_flux_pseudo_melt_elements.h:343
unsigned Dim
The spatial dimension of the problem.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:389
void plot_residual_landscape(std::ostream &landscape_outfile, std::ostream &soln_outfile, Problem *problem_pt, const unsigned &j)
Plot landscape of residuals for j-th node.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:228
UnsteadyHeatFluxPseudoMeltElement(const UnsteadyHeatFluxPseudoMeltElement &dummy)
Broken copy constructor.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:82
double * Melt_temperature_pt
Pointer to non-default melt temperature.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:398
UnsteadyHeatPrescribedFluxFctPt Flux_fct_pt
Function pointer to the (global) prescribed-flux function.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:386
void get_flux(const double &time, const Vector< double > &x, double &flux)
Definition: unsteady_heat_flux_pseudo_melt_elements.h:361
double *& melt_temperature_pt()
Pointer to (non-default) melt temperature.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:309
void(* UnsteadyHeatPrescribedFluxFctPt)(const double &time, const Vector< double > &x, double &flux)
Definition: unsteady_heat_flux_pseudo_melt_elements.h:74
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: unsteady_heat_flux_pseudo_melt_elements.h:105
unsigned Melt_id
Id of first value assigned by this face element.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:395
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Compute the element residual vector.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:92
void output(FILE *file_pt, const unsigned &n_plot)
Definition: unsteady_heat_flux_pseudo_melt_elements.h:222
void output(FILE *file_pt)
Definition: unsteady_heat_flux_pseudo_melt_elements.h:217
double melt_temperature()
Melt temperature.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:296
unsigned U_index_ust_heat
The index at which the unknown is stored at the nodes.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:392
UnsteadyHeatPrescribedFluxFctPt & flux_fct_pt()
Access function for the prescribed-flux function pointer.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:89
void output(std::ostream &outfile)
Output function.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:110
void fill_in_generic_residual_contribution_ust_heat_flux(Vector< double > &residuals, DenseMatrix< double > &jacobian, unsigned flag)
Compute the element's residual vector and the Jacobian matrix.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:578
UnsteadyHeatFluxPseudoMeltElement(FiniteElement *const &bulk_el_pt, const int &face_index, const unsigned &id=0)
Definition: unsteady_heat_flux_pseudo_melt_elements.h:412
void disable_melting()
Switch off melting by pinning melting dofs.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:316
void output(std::ostream &outfile, const unsigned &n_plot)
Output function.
Definition: unsteady_heat_flux_pseudo_melt_elements.h:117
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
double melt_flux(const double &t)
Definition: stefan_boltzmann_melt.cc:643
static const unsigned Dim
Problem dimension.
Definition: two_d_tilted_square.cc:62
Vector< double > x1(const Vector< double > &coord)
Cartesian coordinates centered at the point (0.5,1)
Definition: poisson/poisson_with_singularity/two_d_poisson.cc:86
Vector< double > x0(2, 0.0)
void flux(const double &time, const Vector< double > &x, double &flux)
Get flux applied along boundary x=0.
Definition: pretend_melt.cc:59
void broken_copy(const std::string &class_name)
Issue error message and terminate execution.
Definition: oomph_utilities.cc:212
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
@ W
Definition: quadtree.h:63
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
void get_flux(const Vector< double > &s, Vector< double > &flux) const
Get flux: .
Definition: gen_axisym_advection_diffusion_elements.h:424
list x
Definition: plotDoE.py:28
Definition: indexed_view.cpp:20
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
void output(std::ostream &outfile, const unsigned &nplot)
Overload output function.
Definition: overloaded_element_body.h:490
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2