29 #ifndef OOMPH_HEAT_TRANSFER_AND_MELT_ELEMENTS_HEADER
30 #define OOMPH_HEAT_TRANSFER_AND_MELT_ELEMENTS_HEADER
34 #include <oomph-lib-config.h>
174 (*Flux_fct_pt)(time,
x,
n,u,
flux);
1518 template <
class ELEMENT>
1533 if(bulk_el_pt->
dim()==3)
1540 "This face element will not work correctly if nodes are hanging.\n";
1541 error_string+=
"Use the refineable version instead. ";
1575 "Bulk element must inherit from UnsteadyHeatEquations.";
1577 "Nodes are one dimensional, but cannot cast the bulk element to\n";
1578 error_string +=
"UnsteadyHeatEquations<1>\n.";
1580 "If you desire this functionality, you must implement it yourself\n";
1604 "Bulk element must inherit from UnsteadyHeatEquations.";
1606 "Nodes are two dimensional, but cannot cast the bulk element to\n";
1607 error_string +=
"UnsteadyHeatEquations<2>\n.";
1609 "If you desire this functionality, you must implement it yourself\n";
1632 "Bulk element must inherit from UnsteadyHeatEquations.";
1634 "Nodes are three dimensional, but cannot cast the bulk element to\n";
1635 error_string +=
"UnsteadyHeatEquations<3>\n.";
1637 "If you desire this functionality, you must implement it yourself\n";
1653 std::ostringstream error_stream;
1654 error_stream <<
"Dimension of node is " <<
Dim
1655 <<
". It should be 1,2, or 3!" << std::endl;
1674 const unsigned n_node =
nnode();
1683 for(
unsigned l=0;l<n_node;l++)
1687 u += u_value*psif[l];
1698 const unsigned &
i)
const
1731 void output(std::ostream &outfile,
const unsigned &n_plot)
1744 outfile <<
"ZONE\n";
1747 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
1750 for (
unsigned i=0;
i<n_dim-1;
i++)
1770 for(
unsigned i=0;
i<n_dim;
i++)
1772 outfile <<
x[
i] <<
" ";
1779 outfile <<
flux <<
" ";
1782 for(
unsigned i=0;
i<n_dim;
i++)
1784 outfile << unit_normal[
i] <<
" ";
1787 outfile << std::endl;
1796 void output(FILE* file_pt,
const unsigned &n_plot)
1809 unsigned n_node =
nnode();
1815 for(
unsigned i=0;
i<n_node;
i++) {
test[
i] = psi[
i];}
1836 template<
class ELEMENT>
1841 const unsigned n_node = nnode();
1844 double time=node_pt(0)->time_stepper_pt()->time_pt()->time();
1847 Shape psif(n_node), testf(n_node);
1850 const unsigned n_intpt = integral_pt()->nweight();
1859 const unsigned u_index_ust_heat = U_index_ust_heat;
1863 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
1867 for(
unsigned i=0;
i<(
Dim-1);
i++)
1869 s[
i] = integral_pt()->knot(ipt,
i);
1873 double w = integral_pt()->weight(ipt);
1877 double J = shape_and_test(
s,psif,testf);
1886 double interpolated_u=0.0;
1887 for(
unsigned i=0;
i<
Dim;
i++)
1889 interpolated_x[
i] = 0.0;
1897 this->outer_unit_normal(ipt,interpolated_n);
1900 for(
unsigned l=0;l<n_node;l++)
1902 double u_value = raw_nodal_value(l,u_index_ust_heat);
1903 interpolated_u += u_value*psif[l];
1906 for(
unsigned i=0;
i<
Dim;
i++)
1908 interpolated_x[
i] += nodal_position(l,
i)*psif[l];
1914 get_flux(ipt,time,interpolated_x,interpolated_n,interpolated_u,
flux);
1919 for(
unsigned l=0;l<n_node;l++)
1921 local_eqn = nodal_local_eqn(l,u_index_ust_heat);
1926 residuals[local_eqn] -=
flux*testf[l]*
W;
2243 template <
class ELEMENT>
2257 const unsigned &
id=0,
2258 const bool& called_from_refineable_constructor=
false) :
2265 if (!called_from_refineable_constructor)
2267 if(bulk_el_pt->
dim()==3)
2274 "This face element will not work correctly if nodes are hanging.\n";
2275 error_string+=
"Use the refineable version instead. ";
2295 unsigned n_nod=
nnode();
2309 "This element will almost certainly not work in non-2D problems, though it should be easy enough to upgrade... Volunteers?\n",
2353 unsigned n_node =
nnode();
2362 for (
unsigned j=0;
j<n_node;
j++)
2370 unsigned first_index=
2410 unsigned n_node=
nnode();
2411 for(
unsigned l=0;l<n_node;l++)
2422 unsigned first_index=
2426 nod_pt->
pin(first_index+1);
2435 unsigned n_node=
nnode();
2436 for(
unsigned l=0;l<n_node;l++)
2447 unsigned first_index=
2463 const unsigned &
i)
const
2480 const unsigned n_node =
nnode();
2489 for(
unsigned l=0;l<n_node;l++)
2499 unsigned first_index=
2522 outfile <<
"ZONE\n";
2525 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
2528 for (
unsigned i=0;
i<n_dim-1;
i++)
2544 double interpolated_m=0.0;
2555 for(
unsigned i=0;
i<n_dim;
i++)
2557 outfile <<
x[
i] <<
" ";
2564 outfile <<
flux <<
" ";
2567 outfile << interpolated_m <<
" ";
2570 outfile << lagrange_p <<
" ";
2573 for(
unsigned i=0;
i<n_dim;
i++)
2575 outfile << unit_normal[
i] <<
" ";
2577 outfile << std::endl;
2710 template<
class ELEMENT>
2718 double time=node_pt(0)->time_stepper_pt()->time_pt()->time();
2721 unsigned n_node = nnode();
2724 unsigned n_position_type = this->nnodal_position_type();
2727 unsigned n_dim = this->nodal_dimension();
2759 Shape psi(n_node,n_position_type);
2760 DShape dpsids(n_node,n_position_type,n_dim-1);
2763 unsigned n_intpt = integral_pt()->nweight();
2766 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
2769 double w = integral_pt()->weight(ipt);
2772 dshape_local_at_knot(ipt,psi,dpsids);
2781 double interpolated_lambda_p=0.0;
2787 double melt_rate=0.0;
2793 for(
unsigned l=0;l<n_node;l++)
2801 unsigned first_index=
2806 interpolated_lambda_p+=node_pt(l)->value(first_index)*psi[l];
2809 melt_rate+=node_pt(l)->value(first_index+1)*psi[l];
2812 u+=node_pt(l)->value(this->U_index_ust_heat)*psi[l];
2815 for(
unsigned k=0;
k<n_position_type;
k++)
2818 for(
unsigned i=0;
i<n_dim;
i++)
2821 interpolated_x[
i] +=
2822 nodal_position_gen(l,bulk_position_type(
k),
i)*psi(l,
k);
2824 interpolated_dxdt[
i] +=
2825 this->dnodal_position_gen_dt(l,bulk_position_type(
k),
i)*psi(l,
k);
2827 interpolated_xi[
i] +=
2828 this->lagrangian_position_gen(l,bulk_position_type(
k),
i)*psi(l,
k);
2831 for(
unsigned j=0;
j<n_dim-1;
j++)
2833 interpolated_A(
j,
i) +=
2834 nodal_position_gen(l,bulk_position_type(
k),
i)*dpsids(l,
k,
j);
2842 for(
unsigned i=0;
i<n_dim-1;
i++)
2844 for(
unsigned j=0;
j<n_dim-1;
j++)
2849 for(
unsigned k=0;
k<n_dim;
k++)
2851 A(
i,
j) += interpolated_A(
i,
k)*interpolated_A(
j,
k);
2860 outer_unit_normal(ipt,interpolated_normal);
2863 unsigned n_dim = this->nodal_dimension();
2865 for (
unsigned i=0;
i<n_dim-1;
i++)
2867 s[
i]=integral_pt()->knot(ipt,
i);
2892 this->
get_flux(ipt,time,interpolated_x,interpolated_normal,u,
flux);
2900 for (
unsigned i=0;
i<n_dim;
i++)
2902 traction[
i]=-interpolated_lambda_p*interpolated_normal[
i];
2907 double normal_veloc=0.0;
2908 for (
unsigned i=0;
i<n_dim;
i++)
2910 normal_veloc+=interpolated_dxdt[
i]*interpolated_normal[
i];
2922 Adet =
A(0,0)*
A(1,1) -
A(0,1)*
A(1,0);
2937 for(
unsigned l=0;l<n_node;l++)
2943 for(
unsigned k=0;
k<n_position_type;
k++)
2946 for(
unsigned i=0;
i<n_dim;
i++)
2948 local_eqn = this->position_local_eqn(l,bulk_position_type(
k),
i);
2952 residuals[local_eqn] -= traction[
i]*psi(l,
k)*
W;
2969 unsigned first_index=
2971 local_eqn=this->nodal_local_eqn(l,first_index);
2974 residuals[local_eqn]+=(normal_veloc+melt_rate)*psi[l]*
W;
2979 local_eqn = nodal_local_eqn(l,this->U_index_ust_heat);
2983 residuals[local_eqn] -= (
flux-melt_rate)*psi[l]*
W;
2994 for(
unsigned l=0;l<n_node;l++)
2997 Node* nod_pt = node_pt(l);
3005 unsigned first_index=
3009 local_eqn = nodal_local_eqn(l,first_index+1);
3014 double u=nod_pt->
value(this->U_index_ust_heat);
3015 double melt_rate=nod_pt->
value(first_index+1);
3018 if ((melt_temperature()-u)>melt_rate)
3020 residuals[local_eqn]+=melt_rate;
3024 residuals[local_eqn]+=(melt_temperature()-u);
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
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
float * p
Definition: Tutorial_Map_using.cpp:9
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
unsigned index_of_first_value_assigned_by_face_element(const unsigned &face_id=0) const
Definition: nodes.h:2061
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: 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 void output(std::ostream &outfile)
Definition: elements.h:3050
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 dim() const
Definition: elements.h:2611
unsigned nnode() const
Return the number of nodes.
Definition: elements.h:2210
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
Definition: elements.h:1963
unsigned nodal_dimension() const
Return the required Eulerian dimension of the nodes in this element.
Definition: elements.h:2484
double raw_nodal_value(const unsigned &n, const unsigned &i) const
Definition: elements.h:2576
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
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: refineable_elements.h:97
Definition: elements.h:4914
Definition: heat_transfer_and_melt_elements.h:2249
void interpolated_melt_rate(const Vector< double > &s, double &melt_flux)
Melt rate at local coordinate s.
Definition: heat_transfer_and_melt_elements.h:2474
double melt_temperature()
Melt temperature.
Definition: heat_transfer_and_melt_elements.h:2389
double * Melt_temperature_pt
Pointer to non-default melt temperature.
Definition: heat_transfer_and_melt_elements.h:2591
void set_lagrange_multiplier_pressure_to_zero()
Definition: heat_transfer_and_melt_elements.h:2433
void output_melt(std::ostream &outfile)
Definition: heat_transfer_and_melt_elements.h:2509
void fill_in_contribution_to_residuals_surface_melt(Vector< double > &residuals)
Helper function that actually calculates the residuals.
Definition: heat_transfer_and_melt_elements.h:2712
double get_interpolated_lagrange_p(const Vector< double > &s)
Definition: heat_transfer_and_melt_elements.h:2347
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: heat_transfer_and_melt_elements.h:2462
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Return the residuals.
Definition: heat_transfer_and_melt_elements.h:2382
void disable_melting()
Switch off melting by pinning melt-rate dofs.
Definition: heat_transfer_and_melt_elements.h:2408
double *& melt_temperature_pt()
Pointer to (non-default) melt temperature.
Definition: heat_transfer_and_melt_elements.h:2402
unsigned Melt_id
Id of additional unknowns (Lagrange multiplier ("pressure") and melt rate)
Definition: heat_transfer_and_melt_elements.h:2588
SurfaceMeltElement(FiniteElement *const &bulk_el_pt, const int &face_index, const unsigned &id=0, const bool &called_from_refineable_constructor=false)
Definition: heat_transfer_and_melt_elements.h:2255
Definition: heat_transfer_and_melt_elements.h:123
UnsteadyHeatPrescribedFluxFctPt & flux_fct_pt()
Access function for the prescribed-flux function pointer.
Definition: heat_transfer_and_melt_elements.h:147
UnsteadyHeatPrescribedFluxFctPt Flux_fct_pt
Function pointer to the (global) prescribed-flux function.
Definition: heat_transfer_and_melt_elements.h:185
void(* UnsteadyHeatPrescribedFluxFctPt)(const double &time, const Vector< double > &x, const Vector< double > &n, const double &u, double &flux)
Definition: heat_transfer_and_melt_elements.h:132
unsigned U_index_ust_heat
Index at which temperature is stored.
Definition: heat_transfer_and_melt_elements.h:179
TemplateFreeUnsteadyHeatBaseFaceElement()
Constructor.
Definition: heat_transfer_and_melt_elements.h:139
virtual void get_flux(const unsigned &ipt, const double &time, const Vector< double > &x, const Vector< double > &n, const double &u, double &flux)
Definition: heat_transfer_and_melt_elements.h:159
unsigned Dim
The spatial dimension of the problem.
Definition: heat_transfer_and_melt_elements.h:182
virtual ~TemplateFreeUnsteadyHeatBaseFaceElement()
Destrutor.
Definition: heat_transfer_and_melt_elements.h:144
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: heat_transfer_and_melt_elements.h:1522
void output(std::ostream &outfile, const unsigned &n_plot)
Definition: heat_transfer_and_melt_elements.h:1731
void fill_in_contribution_to_residuals(Vector< double > &residuals)
Compute the element residual vector.
Definition: heat_transfer_and_melt_elements.h:1703
double shape_and_test(const Vector< double > &s, Shape &psi, Shape &test) const
Definition: heat_transfer_and_melt_elements.h:1805
void output(std::ostream &outfile)
Output function.
Definition: heat_transfer_and_melt_elements.h:1722
virtual ~UnsteadyHeatBaseFaceElement()
Destructor.
Definition: heat_transfer_and_melt_elements.h:1666
double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: heat_transfer_and_melt_elements.h:1697
void output(FILE *file_pt)
C_style output function.
Definition: heat_transfer_and_melt_elements.h:1792
void interpolated_u(const Vector< double > &s, double &u)
Temperature at local coordinate s.
Definition: heat_transfer_and_melt_elements.h:1669
void fill_in_generic_residual_contribution_ust_heat_flux(Vector< double > &residuals)
Generic residuals function.
Definition: heat_transfer_and_melt_elements.h:1838
void output(FILE *file_pt, const unsigned &n_plot)
C-style output function.
Definition: heat_transfer_and_melt_elements.h:1796
UnsteadyHeatBaseFaceElement(FiniteElement *const &bulk_el_pt, const int &face_index)
Constructor.
Definition: heat_transfer_and_melt_elements.h:1526
Definition: unsteady_heat_elements.h:72
virtual unsigned u_index_ust_heat() const
Broken assignment operator.
Definition: unsteady_heat_elements.h:112
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
void flux(const double &time, const Vector< double > &x, double &flux)
Get flux applied along boundary x=0.
Definition: pretend_melt.cc:59
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
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2