28 #ifndef OOMPH_CONTACT_ELEMENTS_HEADER
29 #define OOMPH_CONTACT_ELEMENTS_HEADER
33 #include <oomph-lib-config.h>
51 template <
unsigned DIM,
unsigned NPTS_1D>
83 double knot(
const unsigned &
i,
const unsigned &
j)
const
87 double range=0.25*
Range;
95 double range=0.5*
Range;
103 double range=0.25*
Range;
116 double range=0.25*
Range;
119 pow(0.5*range,
static_cast<int>(
DIM));
123 double range=0.5*
Range;
126 pow(0.5*range,
static_cast<int>(
DIM));
131 double range=0.25*
Range;
134 pow(0.5*range,
static_cast<int>(
DIM));
174 bool& intersection)
const = 0;
177 virtual void output(std::ostream &outfile,
const unsigned& nplot)
const =0;
184 "This is a broken virtual function. Please implement/overload. ",
209 "This is a broken virtual function. Please implement/overload. ",
260 unsigned n=r_c_pt->size();
262 for (
unsigned i=0;
i<
n;
i++)
275 bool& intersection)
const
280 l[0]=(*Centre_pt)[0]-
x[0];
281 l[1]=(*Centre_pt)[1]-
x[1];
284 double ll=
sqrt(l[0]*l[0]+l[1]*l[1]);
288 double project=
n[0]*l[0]+
n[1]*l[1];
289 double project_squared=project*project;
295 if (project_squared<b_squared)
298 intersection =
false;
303 double sqr=
sqrt(project_squared-b_squared);
304 d = -
std::min(project-sqr,project+sqr);
312 void output(std::ostream &outfile,
const unsigned& nplot)
const
314 for (
unsigned j=0;
j<nplot;
j++)
317 outfile << (*Centre_pt)[0]+
Radius*
cos(phi) <<
" "
349 for (
unsigned i=0;
i<
n;
i++)
427 namespace PolygonHelper
437 unsigned nvertex=polygon_vertex.size();
445 double d0=polygon_vertex[nvertex-1][0]-polygon_vertex[0][0];
446 double d1=polygon_vertex[nvertex-1][1]-polygon_vertex[0][1];
447 if (
sqrt(d0*d0+d1*d1)>0.0)
449 std::stringstream junk;
450 junk <<
"First and last point of polygon don't coincide!\n"
451 <<
"First point at: "
452 << polygon_vertex[0][0] <<
" "
453 << polygon_vertex[0][1] <<
"\n"
455 << polygon_vertex[nvertex-1][0] <<
" "
456 << polygon_vertex[nvertex-1][1] <<
"\n";
466 unsigned intersect_counter=0;
470 for (
unsigned i=1;
i<=nvertex;
i++)
484 (point[1]-
p1[1])*(p2[0]-
p1[0])/
486 if ( (
p1[0] == p2[0]) ||
487 (point[0] <= xintersect) )
499 if (intersect_counter%2==0)
545 unsigned n =
x.size();
555 (*Traction_fct_pt)(time,
x,
p);
670 template <
class ELEMENT>
683 const unsigned &
id=0,
684 const bool& called_from_refineable_constructor=
704 if (!called_from_refineable_constructor)
706 if(element_pt->
dim()==3)
716 "This face element will not work correctly if nodes are hanging.\nUse the refineable version instead. ",
733 unsigned n_nod=
nnode();
743 if (element_pt->
dim()!=2)
747 "This element will almost certainly not work in non-2D problems, though it should be easy enough to upgrade... Volunteers?\n",
762 "Piecwise Gauss used here isn't appropriate for non-3-node elements.\n",
782 double zeta_nodal(
const unsigned &
n,
const unsigned &
k,
const unsigned &
i)
const
849 unsigned n=eq_data.size();
853 for (
unsigned i=0;
i<
n;
i++)
855 if (eq_data[
i].first!=0)
857 bool is_duplicate=
false;
858 unsigned nnod=
nnode();
859 for (
unsigned j=0;
j<nnod;
j++)
869 if (eq_data[
i].first==
896 void output(FILE* file_pt,
const unsigned &n_plot)
907 void output(std::ostream &outfile,
const unsigned &n_plot)
986 unsigned n_node =
nnode();
995 for (
unsigned j=0;
j<n_node;
j++)
1003 unsigned first_index=
1024 bool& intersection)
const
1083 template <
class ELEMENT>
1094 const unsigned &
id=0,
1095 const bool& called_from_refineable_constructor=
1101 called_from_refineable_constructor)
1112 this->
output(outfile,n_plot);
1116 void output(std::ostream &outfile,
const unsigned &n_plot)
1132 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
1139 this->interpolated_xi(
s,xi);
1144 bool intersection =
false;
1148 for(
unsigned i=0;
i<n_dim;
i++)
1149 {outfile <<
x[
i] <<
" ";}
1152 outfile <<
std::max(d,-100.0) <<
" ";
1156 outfile <<
p <<
" ";
1160 outfile << -unit_normal[0]*
p <<
" ";
1161 outfile << -unit_normal[1]*
p <<
" ";
1165 if (!intersection) d_tmp=0.0;
1166 outfile << -d_tmp*unit_normal[0] <<
" ";
1167 outfile << -d_tmp*unit_normal[1] <<
" ";
1170 for(
unsigned i=0;
i<n_dim;
i++)
1171 {outfile << unit_normal[
i] <<
" ";}
1175 for(
unsigned i=0;
i<n_dim;
i++)
1176 {outfile <<
x[
i]-xi[
i] <<
" ";}
1178 outfile << std::endl;
1200 template<
class ELEMENT>
1206 unsigned n_dim = this->nodal_dimension();
1214 unsigned n_dof=this->ndof();
1219 unsigned n_node = this->nnode();
1222 unsigned n_position_type = this->nnodal_position_type();
1230 Shape psi(n_node,n_position_type);
1231 DShape dpsids(n_node,n_position_type,n_dim-1);
1234 Shape psi_p(n_node);
1238 Shape psi_i(n_node);
1247 unsigned n_intpt = this->integral_pt()->nweight();
1250 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
1253 double w = this->integral_pt()->weight(ipt);
1256 this->dshape_local_at_knot(ipt,psi,dpsids);
1259 for(
unsigned i=0;
i<n_dim-1;
i++)
1261 s[
i] = this->integral_pt()->knot(ipt,
i);
1263 this->shape_p(
s,psi_p);
1266 if(!(this->use_collocated_penetration_flag()
1267 && this->use_collocated_contact_pressure_flag()))
1269 this->shape_i(
s,psi_i);
1274 double interpolated_lambda_p=0.0;
1283 for(
unsigned l=0;l<n_node;l++)
1292 unsigned first_index=
1297 interpolated_lambda_p+=this->node_pt(l)->value(first_index)*psi_p[l];
1300 for(
unsigned k=0;
k<n_position_type;
k++)
1303 for(
unsigned i=0;
i<n_dim;
i++)
1306 interpolated_x[
i] +=
1307 this->nodal_position_gen(l,this->bulk_position_type(
k),
i)*psi(l,
k);
1310 for(
unsigned j=0;
j<n_dim-1;
j++)
1312 interpolated_A(
j,
i) +=
1313 this->nodal_position_gen(l,this->bulk_position_type(
k),
i)*dpsids(l,
k,
j);
1321 for(
unsigned i=0;
i<n_dim-1;
i++)
1323 for(
unsigned j=0;
j<n_dim-1;
j++)
1328 for(
unsigned k=0;
k<n_dim;
k++)
1330 A(
i,
j) += interpolated_A(
i,
k)*interpolated_A(
j,
k);
1337 this->outer_unit_normal(ipt,interpolated_normal);
1347 Adet =
A(0,0)*
A(1,1) -
A(0,1)*
A(1,0);
1351 "Wrong dimension in SurfaceContactElement",
1352 "SurfaceContactElement::fill_in_contribution_to_residuals()",
1363 for (
unsigned i=0;
i<n_dim;
i++)
1365 traction[
i]=-interpolated_lambda_p*interpolated_normal[
i];
1370 for(
unsigned i=0;
i<n_dim;
i++)
1372 contact_force[
i]+=traction[
i]*
W;
1378 for(
unsigned l=0;l<n_node;l++)
1381 for(
unsigned k=0;
k<n_position_type;
k++)
1384 for(
unsigned i=0;
i<n_dim;
i++)
1386 local_eqn = this->position_local_eqn(l,this->bulk_position_type(
k),
i);
1391 local_residuals[local_eqn] -= traction[
i]*psi(l,
k)*
W;
1399 if(!this->use_collocated_contact_pressure_flag())
1402 for(
unsigned l=0;l<n_node;l++)
1405 pressure_integral[l]+=interpolated_lambda_p*psi_i[l]*
W;
1409 if(!this->use_collocated_penetration_flag())
1413 bool intersection =
false;
1414 this->penetration(interpolated_x,interpolated_normal,d,intersection);
1422 for(
unsigned l=0;l<n_node;l++)
1425 penetration_integral[l]+=d*psi_i[l]*
W;
1441 for(
unsigned l=0;l<n_node;l++)
1444 Node* nod_pt = this->node_pt(l);
1452 unsigned first_index=
1456 local_eqn = this->nodal_local_eqn(l,first_index);
1462 double d=penetration_integral[l];
1463 double contact_pressure=pressure_integral[l];
1466 if(this->use_collocated_penetration_flag()
1467 || this->use_collocated_contact_pressure_flag())
1476 this->local_coordinate_of_node(l,
s);
1478 this->outer_unit_normal(
s,unit_normal);
1480 if(this->use_collocated_penetration_flag())
1483 bool intersection =
false;
1484 this->penetration(
x,unit_normal,d,intersection);
1493 if(this->use_collocated_contact_pressure_flag())
1495 contact_pressure=nod_pt->
value(first_index);
1503 if (this->Enable_stick)
1506 local_residuals[local_eqn]-=d;
1511 if (-d>contact_pressure)
1513 local_residuals[local_eqn]+=contact_pressure;
1517 local_residuals[local_eqn]-=d;
1526 unsigned n=this->Penetrator_eq_data_type.size();
1527 for (
unsigned i=0;
i<
n;
i++)
1529 if (this->Penetrator_eq_data_type[
i]>=0)
1531 switch(
unsigned(this->Penetrator_eq_data_type[
i]))
1536 int local_eqn=this->external_local_eqn(
1537 this->Penetrator_eq_data_data_index[
i],
1538 this->Penetrator_eq_data_index[
i]);
1541 local_residuals[local_eqn]+=contact_force[
i];
1550 int local_eqn=this->position_local_eqn(
1551 this->Penetrator_eq_data_data_index[
i],
k,
1552 this->Penetrator_eq_data_index[
i]);
1555 local_residuals[local_eqn]+=contact_force[
i];
1563 int local_eqn=this->nodal_local_eqn(
1564 this->Penetrator_eq_data_data_index[
i],
1565 this->Penetrator_eq_data_index[
i]);
1568 local_residuals[local_eqn]+=contact_force[
i];
1576 std::stringstream junk;
1577 junk <<
"Never get here: "
1578 <<
"unsigned(Penetrator_eq_data_type[i]) = "
1579 <<
unsigned(this->Penetrator_eq_data_type[
i]);
1590 for (
unsigned j=0;
j<n_dof;
j++)
1592 residuals[
j]+=local_residuals[
j];
1603 template<
class ELEMENT>
1608 unsigned n_node = this->nnode();
1611 unsigned n_position_type = this->nnodal_position_type();
1614 unsigned n_dim = this->nodal_dimension();
1617 for (
unsigned i=0;
i<n_dim;
i++)
1619 contact_force[
i]=0.0;
1625 Shape psi(n_node,n_position_type);
1626 DShape dpsids(n_node,n_position_type,n_dim-1);
1629 Shape psi_p(n_node);
1633 unsigned n_intpt = this->integral_pt()->nweight();
1636 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
1639 double w = this->integral_pt()->weight(ipt);
1642 this->dshape_local_at_knot(ipt,psi,dpsids);
1645 for(
unsigned i=0;
i<n_dim-1;
i++)
1647 s[
i] = this->integral_pt()->knot(ipt,
i);
1649 this->shape_p(
s,psi_p);
1653 double interpolated_lambda_p=0.0;
1662 for(
unsigned l=0;l<n_node;l++)
1670 unsigned first_index=
1675 interpolated_lambda_p+=this->node_pt(l)->value(first_index)*psi_p[l];
1678 for(
unsigned k=0;
k<n_position_type;
k++)
1681 for(
unsigned i=0;
i<n_dim;
i++)
1684 interpolated_x[
i] +=
1685 this->nodal_position_gen(l,this->bulk_position_type(
k),
i)*psi(l,
k);
1688 for(
unsigned j=0;
j<n_dim-1;
j++)
1690 interpolated_A(
j,
i) +=
1691 this->nodal_position_gen(l,this->bulk_position_type(
k),
i)*dpsids(l,
k,
j);
1699 for(
unsigned i=0;
i<n_dim-1;
i++)
1701 for(
unsigned j=0;
j<n_dim-1;
j++)
1706 for(
unsigned k=0;
k<n_dim;
k++)
1708 A(
i,
j) += interpolated_A(
i,
k)*interpolated_A(
j,
k);
1715 this->outer_unit_normal(ipt,interpolated_normal);
1725 Adet =
A(0,0)*
A(1,1) -
A(0,1)*
A(1,0);
1729 "Wrong dimension in SurfaceContactElement",
1730 "SurfaceContactElement::contact_force()",
1741 for (
unsigned i=0;
i<n_dim;
i++)
1743 traction[
i]=-interpolated_lambda_p*interpolated_normal[
i];
1747 for (
unsigned i=0;
i<n_dim;
i++)
1749 contact_force[
i]+=traction[
i]*
W;
1770 template <
class ELEMENT>
1781 const unsigned &
id=0,
1782 const bool& called_from_refineable_constructor=
1788 called_from_refineable_constructor)
1794 ELEMENT* cast_element_pt =
dynamic_cast<ELEMENT*
>(element_pt);
1796 for(
unsigned i=0;
i<n_dim;
i++)
1799 cast_element_pt->u_index_linear_elasticity(
i);
1815 this->
output(outfile,n_plot);
1819 void output(std::ostream &outfile,
const unsigned &n_plot)
1835 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
1848 for(
unsigned i=0;
i<n_dim;
i++)
1850 x_def[
i]=
x[
i]+disp[
i];
1855 bool intersection =
false;
1856 this->
penetration(x_def,unit_normal,d,intersection);
1859 for(
unsigned i=0;
i<n_dim;
i++)
1860 {outfile <<
x[
i] <<
" ";}
1863 outfile <<
std::max(d,-100.0) <<
" ";
1867 outfile <<
p <<
" ";
1871 outfile << -unit_normal[0]*
p <<
" ";
1872 outfile << -unit_normal[1]*
p <<
" ";
1876 if (!intersection) d_tmp=0.0;
1877 outfile << -d_tmp*unit_normal[0] <<
" ";
1878 outfile << -d_tmp*unit_normal[1] <<
" ";
1881 for(
unsigned i=0;
i<n_dim;
i++)
1882 {outfile << unit_normal[
i] <<
" ";}
1885 for(
unsigned i=0;
i<n_dim;
i++)
1887 outfile << disp[
i] <<
" ";
1891 for(
unsigned i=0;
i<n_dim;
i++)
1893 outfile << x_def[
i] <<
" ";
1895 outfile << std::endl;
1916 unsigned n_node = this->
nnode();
1925 for (
unsigned i=0;
i<n_dim;
i++)
1934 for(
unsigned l=0;l<n_node;l++)
1956 template<
class ELEMENT>
1962 unsigned n_dim = this->nodal_dimension();
1970 unsigned n_dof=this->ndof();
1975 unsigned n_node = this->nnode();
1982 DShape dpsids(n_node,n_dim-1);
1985 Shape psi_p(n_node);
1989 Shape psi_i(n_node);
2001 unsigned n_intpt = this->integral_pt()->nweight();
2004 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
2007 double w = this->integral_pt()->weight(ipt);
2010 this->dshape_local_at_knot(ipt,psi,dpsids);
2013 for(
unsigned i=0;
i<n_dim-1;
i++)
2015 s[
i] = this->integral_pt()->knot(ipt,
i);
2017 this->shape_p(
s,psi_p);
2020 if(!(this->use_collocated_penetration_flag()
2021 && this->use_collocated_contact_pressure_flag())){
2022 this->shape_i(
s,psi_i);
2026 double interpolated_lambda_p=0.0;
2038 for(
unsigned l=0;l<n_node;l++)
2046 unsigned first_index=
2051 interpolated_lambda_p+=this->node_pt(l)->value(first_index)*psi_p[l];
2054 for(
unsigned i=0;
i<n_dim;
i++)
2057 interpolated_x[
i]+=this->nodal_position(l,
i)*psi(l);
2060 unsigned u_nodal_index=this->U_index_linear_elasticity_traction[
i];
2061 disp[
i] += this->nodal_value(l,u_nodal_index)*psi(l);
2065 for(
unsigned j=0;
j<n_dim-1;
j++)
2067 interpolated_A(
j,
i)+=this->nodal_position(l,
i)*dpsids(l,
j);
2075 for(
unsigned i=0;
i<n_dim-1;
i++)
2077 for(
unsigned j=0;
j<n_dim-1;
j++)
2082 for(
unsigned k=0;
k<n_dim;
k++)
2084 A(
i,
j) += interpolated_A(
i,
k)*interpolated_A(
j,
k);
2091 this->outer_unit_normal(ipt,interpolated_normal);
2101 Adet =
A(0,0)*
A(1,1) -
A(0,1)*
A(1,0);
2105 "Wrong dimension in SurfaceContactElement",
2106 "LinearSurfaceContactElement::fill_in_contribution_to_residuals()",
2118 for (
unsigned i=0;
i<n_dim;
i++)
2120 traction[
i]=-interpolated_lambda_p*interpolated_normal[
i];
2121 x_def[
i]=interpolated_x[
i]+disp[
i];
2126 for(
unsigned i=0;
i<n_dim;
i++)
2128 contact_force[
i]+=traction[
i]*
W;
2137 this->traction_fct(interpolated_x,
p);
2140 for(
unsigned l=0;l<n_node;l++)
2143 for(
unsigned i=0;
i<n_dim;
i++)
2145 local_eqn = this->nodal_local_eqn(l,
i);
2151 local_residuals[local_eqn] -= (traction[
i]+
p[
i])*psi(l)*
W;
2158 if(!this->use_collocated_contact_pressure_flag())
2161 for(
unsigned l=0;l<n_node;l++)
2164 pressure_integral[l]+=interpolated_lambda_p*psi_i[l]*
W;
2168 if(!this->use_collocated_penetration_flag())
2172 bool intersection =
false;
2173 this->penetration(x_def,interpolated_normal,d,intersection);
2181 for(
unsigned l=0;l<n_node;l++)
2184 penetration_integral[l]+=d*psi_i[l]*
W;
2197 for(
unsigned l=0;l<n_node;l++)
2200 Node* nod_pt = this->node_pt(l);
2208 unsigned first_index=
2212 local_eqn = this->nodal_local_eqn(l,first_index);
2218 double d=penetration_integral[l];
2219 double contact_pressure=pressure_integral[l];
2222 if(this->use_collocated_penetration_flag()
2223 || this->use_collocated_contact_pressure_flag())
2232 this->local_coordinate_of_node(l,
s);
2234 this->outer_unit_normal(
s,unit_normal);
2238 this->interpolated_u_linear_elasticity(
s,disp);
2242 x_def[0]=
x[0]+disp[0];
2243 x_def[1]=
x[1]+disp[1];
2245 if(this->use_collocated_penetration_flag())
2248 bool intersection =
false;
2249 this->penetration(x_def,unit_normal,d,intersection);
2258 if(this->use_collocated_contact_pressure_flag())
2260 contact_pressure=nod_pt->
value(first_index);
2268 if (this->Enable_stick)
2271 local_residuals[local_eqn]-=d;
2276 if (-d>contact_pressure)
2278 local_residuals[local_eqn]+=contact_pressure;
2282 local_residuals[local_eqn]-=d;
2291 unsigned n=this->Penetrator_eq_data_type.size();
2292 for (
unsigned i=0;
i<
n;
i++)
2294 if (this->Penetrator_eq_data_type[
i]>=0)
2296 switch(
unsigned(this->Penetrator_eq_data_type[
i]))
2301 int local_eqn=this->external_local_eqn(
2302 this->Penetrator_eq_data_data_index[
i],
2303 this->Penetrator_eq_data_index[
i]);
2306 local_residuals[local_eqn]+=contact_force[
i];
2330 int local_eqn=this->nodal_local_eqn(
2331 this->Penetrator_eq_data_data_index[
i],
2332 this->Penetrator_eq_data_index[
i]);
2335 local_residuals[local_eqn]+=contact_force[
i];
2343 std::stringstream junk;
2344 junk <<
"Never get here: "
2345 <<
"unsigned(Penetrator_eq_data_type[i]) = "
2346 <<
unsigned(this->Penetrator_eq_data_type[
i]);
2357 for (
unsigned j=0;
j<n_dof;
j++)
2359 residuals[
j]+=local_residuals[
j];
2370 template<
class ELEMENT>
2376 unsigned n_node = this->nnode();
2379 unsigned n_dim = this->nodal_dimension();
2382 for (
unsigned i=0;
i<n_dim;
i++)
2384 contact_force[
i]=0.0;
2389 DShape dpsids(n_node,n_dim-1);
2392 Shape psi_p(n_node);
2396 unsigned n_intpt = this->integral_pt()->nweight();
2399 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
2402 double w = this->integral_pt()->weight(ipt);
2405 this->dshape_local_at_knot(ipt,psi,dpsids);
2408 for(
unsigned i=0;
i<n_dim-1;
i++)
2410 s[
i] = this->integral_pt()->knot(ipt,
i);
2412 this->shape_p(
s,psi_p);
2416 double interpolated_lambda_p=0.0;
2428 for(
unsigned l=0;l<n_node;l++)
2436 unsigned first_index=
2441 interpolated_lambda_p+=this->node_pt(l)->value(first_index)*psi_p[l];
2444 for(
unsigned i=0;
i<n_dim;
i++)
2447 interpolated_x[
i] += this->nodal_position(l,
i)*psi(l);
2450 unsigned u_nodal_index=this->U_index_linear_elasticity_traction[
i];
2451 disp[
i] += this->nodal_value(l,u_nodal_index)*psi(l);
2454 for(
unsigned j=0;
j<n_dim-1;
j++)
2456 interpolated_A(
j,
i) += this->nodal_position(l,
i)*dpsids(l,
j);
2464 for(
unsigned i=0;
i<n_dim-1;
i++)
2466 for(
unsigned j=0;
j<n_dim-1;
j++)
2471 for(
unsigned k=0;
k<n_dim;
k++)
2473 A(
i,
j) += interpolated_A(
i,
k)*interpolated_A(
j,
k);
2480 this->outer_unit_normal(ipt,interpolated_normal);
2490 Adet =
A(0,0)*
A(1,1) -
A(0,1)*
A(1,0);
2494 "Wrong dimension in SurfaceContactElement",
2495 "SurfaceContactElement::contact_force()",
2506 for (
unsigned i=0;
i<n_dim;
i++)
2508 traction[
i]=-interpolated_lambda_p*interpolated_normal[
i];
2512 for (
unsigned i=0;
i<n_dim;
i++)
2514 contact_force[
i]+=traction[
i]*
W;
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar atan2(const AnnoyingScalar &y, const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:139
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
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
Vector3f p1
Definition: MatrixBase_all.cpp:2
RowVector3d w
Definition: Matrix_resize_int.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
float BLASFUNC() smax(int *, float *, int *)
float BLASFUNC() smin(int *, float *, int *)
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
Penetrator – here implemented as a circle.
Definition: contact_elements.h:249
void output(std::ostream &outfile, const unsigned &nplot) const
Output coordinates of penetrator at nplot plot points.
Definition: contact_elements.h:312
virtual ~CircularPenetrator()
Destructor.
Definition: contact_elements.h:269
void surface_coordinate(const Vector< double > &x, Vector< double > &zeta) const
Definition: contact_elements.h:338
Vector< double > rigid_body_displacement() const
Get rigid body displacement of reference point in penetrator.
Definition: contact_elements.h:345
Vector< double > Orig_centre
Definition: contact_elements.h:374
double Radius
Radius of penetrator.
Definition: contact_elements.h:377
void position_from_zeta(const Vector< double > &zeta, Vector< double > &r) const
Get position to surface, r, in terms of surface coordinate zeta.
Definition: contact_elements.h:325
void set_original_centre(const Vector< double > &orig_centre)
Definition: contact_elements.h:359
void penetration(const Vector< double > &x, const Vector< double > &n, double &d, bool &intersection) const
Get penetration for given point x.
Definition: contact_elements.h:272
Vector< double > * Centre_pt
Definition: contact_elements.h:369
CircularPenetrator(Vector< double > *r_c_pt, const double &r)
Constructor: Pass pointer to centre and radius.
Definition: contact_elements.h:254
TimeStepper *& time_stepper_pt()
Return the pointer to the timestepper.
Definition: nodes.h:238
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
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
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
double nodal_value(const unsigned &n, const unsigned &i) const
Definition: elements.h:2593
virtual void output(std::ostream &outfile)
Definition: elements.h:3050
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 dim() const
Definition: elements.h:2611
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 double zeta_nodal(const unsigned &n, const unsigned &k, const unsigned &i) const
Definition: elements.h:2722
virtual unsigned nplot_points(const unsigned &nplot) const
Definition: elements.h:3186
unsigned nodal_dimension() const
Return the required Eulerian dimension of the nodes in this element.
Definition: elements.h:2484
virtual void write_tecplot_zone_footer(std::ostream &outfile, const unsigned &nplot) const
Definition: elements.h:3174
virtual void set_integration_scheme(Integral *const &integral_pt)
Set the spatial integration scheme.
Definition: elements.cc:3210
bool has_hanging_nodes() const
Definition: elements.h:2470
Definition: integral.h:145
unsigned add_external_data(Data *const &data_pt, const bool &fd=true)
Definition: elements.cc:307
Heated circular penetrator.
Definition: contact_elements.h:392
virtual ~HeatedCircularPenetrator()
Destructor.
Definition: contact_elements.h:401
double temperature(const Vector< double > &x) const
Definition: contact_elements.h:408
HeatedCircularPenetrator(Vector< double > *r_c_pt, const double &r)
Constructor: Pass pointer to centre and radius.
Definition: contact_elements.h:397
Base class for "heated" penetrator.
Definition: contact_elements.h:222
HeatedPenetrator()
Constructor.
Definition: contact_elements.h:227
virtual double temperature(const Vector< double > &x) const =0
virtual ~HeatedPenetrator()
Destructor.
Definition: contact_elements.h:230
double & x(const unsigned &i)
Return the i-th nodal coordinate.
Definition: nodes.h:1060
double value(const unsigned &i) const
Definition: nodes.cc:2408
Definition: oomph_definitions.h:222
Definition: contact_elements.h:153
virtual Vector< std::pair< Data *, unsigned > > equilibrium_data()
Definition: contact_elements.h:195
virtual void surface_coordinate(const Vector< double > &x, Vector< double > &zeta) const
Definition: contact_elements.h:205
virtual ~Penetrator()
Destructor.
Definition: contact_elements.h:161
virtual void output(std::ostream &outfile, const unsigned &nplot) const =0
Output coordinates of penetrator at nplot plot points.
virtual void penetration(const Vector< double > &x, const Vector< double > &n, double &d, bool &intersection) const =0
Penetrator()
Constructor.
Definition: contact_elements.h:158
virtual Vector< double > rigid_body_displacement() const
Definition: contact_elements.h:181
Definition: contact_elements.h:53
double knot(const unsigned &i, const unsigned &j) const
Return the rescaled knot values s[j] at integration point i.
Definition: contact_elements.h:83
double Range
Definition: contact_elements.h:57
PiecewiseGauss(const double &lower, const double &upper)
Definition: contact_elements.h:63
double Lower
Store for the lower and upper limits of integration and the range.
Definition: contact_elements.h:57
PiecewiseGauss(const PiecewiseGauss &dummy)
Broken copy constructor.
Definition: contact_elements.h:71
double Upper
Definition: contact_elements.h:57
double weight(const unsigned &i) const
Return the rescaled weight at integration point i.
Definition: contact_elements.h:112
virtual unsigned nweight() const
Return the number of integration points of the scheme.
Definition: contact_elements.h:77
Definition: refineable_elements.h:97
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
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
#define DIM
Definition: linearised_navier_stokes_elements.h:44
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp< Eigen::internal::scalar_zeta_op< typename DerivedX::Scalar >, const DerivedX, const DerivedQ > zeta(const Eigen::ArrayBase< DerivedX > &x, const Eigen::ArrayBase< DerivedQ > &q)
Definition: SpecialFunctionsArrayAPI.h:152
std::string lower(std::string s)
returns the input string after converting upper-case characters to lower case
Definition: StringHelpers.cc:11
void broken_copy(const std::string &class_name)
Issue error message and terminate execution.
Definition: oomph_utilities.cc:212
const double Pi
50 digits from maple
Definition: oomph_utilities.h:157
void shape(const double &s, double *Psi)
Definition: shape.h:564
bool point_is_in_polygon(const Vector< double > &point, const Vector< Vector< double > > &polygon_vertex)
Definition: contact_elements.h:432
@ W
Definition: quadtree.h:63
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
list x
Definition: plotDoE.py:28
t
Definition: plotPSD.py:36
#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