54 std::ostringstream error_stream;
89 psi_r[3]=x[0]*x[0]*x[0];
95 <<
"Recovery shape functions for recovery order " 100 OOMPH_CURRENT_FUNCTION,
101 OOMPH_EXCEPTION_LOCATION);
141 psi_r[6]=x[0]*x[0]*x[0];
142 psi_r[7]=x[0]*x[0]*x[1];
143 psi_r[8]=x[0]*x[1]*x[1];
144 psi_r[9]=x[1]*x[1]*x[1];
150 <<
"Recovery shape functions for recovery order " 155 OOMPH_CURRENT_FUNCTION,
156 OOMPH_EXCEPTION_LOCATION);
204 psi_r[10]=x[0]*x[0]*x[0];
205 psi_r[11]=x[0]*x[0]*x[1];
206 psi_r[12]=x[0]*x[0]*x[2];
207 psi_r[13]=x[1]*x[1]*x[1];
208 psi_r[14]=x[0]*x[1]*x[1];
209 psi_r[15]=x[2]*x[1]*x[1];
210 psi_r[16]=x[2]*x[2]*x[2];
211 psi_r[17]=x[2]*x[2]*x[0];
212 psi_r[18]=x[2]*x[2]*x[1];
213 psi_r[19]=x[0]*x[1]*x[2];
220 <<
"Recovery shape functions for recovery order " 225 OOMPH_CURRENT_FUNCTION,
226 OOMPH_EXCEPTION_LOCATION);
236 error_stream <<
"No recovery shape functions for dim " 239 OOMPH_CURRENT_FUNCTION,
240 OOMPH_EXCEPTION_LOCATION);
257 const bool &is_q_mesh)
259 std::ostringstream error_stream;
300 <<
"Recovery shape functions for recovery order " 305 OOMPH_CURRENT_FUNCTION,
306 OOMPH_EXCEPTION_LOCATION);
342 <<
"Recovery shape functions for recovery order " 347 OOMPH_CURRENT_FUNCTION,
348 OOMPH_EXCEPTION_LOCATION);
384 <<
"Recovery shape functions for recovery order " 389 OOMPH_CURRENT_FUNCTION,
390 OOMPH_EXCEPTION_LOCATION);
400 error_stream <<
"No recovery shape functions for dim " 403 OOMPH_CURRENT_FUNCTION,
404 OOMPH_EXCEPTION_LOCATION);
430 const unsigned n_compound_error = compound_error.size();
433 if(n_compound_error==0)
436 "No compound errors have been passed, so maximum cannot be found.",
437 OOMPH_CURRENT_FUNCTION,
438 OOMPH_EXCEPTION_LOCATION);
444 double max_error = compound_error[0];
447 for(
unsigned i=1;
i<n_compound_error;
i++)
449 if(compound_error[
i] > max_error) {max_error = compound_error[
i];}
503 std::map<Node*,Vector<ElementWithZ2ErrorEstimator*>*>
504 aux_adjacent_elements_pt;
508 unsigned ndisagree=0;
516 for (
unsigned e=0;
e<nelem;
e++)
527 unsigned nnod=el_pt->
nnode();
528 for (
unsigned n=0;n<nnod;n++)
533 if (aux_adjacent_elements_pt[nod_pt]==0)
536 aux_adjacent_elements_pt[nod_pt]=
new 541 (*aux_adjacent_elements_pt[nod_pt]).push_back(el_pt);
552 <<
"\n\n========================================================\n";
556 oomph_info <<
"have different preferences for the order of the recovery\n";
557 oomph_info <<
"shape functions. We are using: Recovery_order=" 560 <<
"========================================================\n\n";
566 for (
unsigned e=0;
e<nelem;
e++)
573 for (
unsigned n=0;n<n_node;n++)
578 if (adjacent_elements_pt[nod_pt]==0)
581 vertex_node_pt.push_back(nod_pt);
584 adjacent_elements_pt[nod_pt]=
new 588 unsigned nel=(*aux_adjacent_elements_pt[nod_pt]).size();
589 for (
unsigned e=0;
e<nel;
e++)
591 (*adjacent_elements_pt[nod_pt]).push_back(
592 (*aux_adjacent_elements_pt[nod_pt])[
e]);
600 typedef std::map<Node*,Vector<ElementWithZ2ErrorEstimator*>*>::iterator ITT;
601 for (ITT it=aux_adjacent_elements_pt.begin();
602 it!=aux_adjacent_elements_pt.end();it++)
620 const unsigned& num_recovery_terms,
621 const unsigned& num_flux_terms,
630 for (
unsigned irhs=0;irhs<num_flux_terms;irhs++)
632 rhs[irhs].resize(num_recovery_terms);
633 for (
unsigned j=0;j<num_recovery_terms;j++)
647 if(dynamic_cast<TElementBase*>(patch_el_pt[0])) {is_q_mesh=
false;}
652 unsigned nelem=patch_el_pt.size();
653 for (
unsigned e=0;
e<nelem;
e++)
665 unsigned Nintpt = integ_pt->
nweight();
667 for(
unsigned ipt=0;ipt<Nintpt;ipt++)
670 for(
unsigned i=0;
i<dim;
i++)
672 s[
i] = integ_pt->
knot(ipt,
i);
676 double w = integ_pt->
weight(ipt);
702 for (
unsigned i=0;
i<num_flux_terms;
i++)
705 for(
unsigned l=0;l<num_recovery_terms;l++)
707 rhs[
i][l] += fe_flux[
i]*psi_r[l]*
W;
713 for(
unsigned l=0;l<num_recovery_terms;l++)
716 for(
unsigned l2=0;l2<num_recovery_terms;l2++)
719 recovery_mat(l,l2)+=psi_r[l]*psi_r[l2]*
W;
735 for (
unsigned irhs=0;irhs<num_flux_terms;irhs++)
737 recovery_mat.
lubksub(rhs[irhs]);
742 recovered_flux_coefficient_pt =
746 for (
unsigned icoeff=0;icoeff<num_recovery_terms;icoeff++)
748 for (
unsigned irhs=0;irhs<num_flux_terms;irhs++)
750 (*recovered_flux_coefficient_pt)(icoeff,irhs)=rhs[irhs][icoeff];
765 unsigned num_recovery_terms;
768 if ((dim!=1)&&(dim!=2)&&(dim!=3))
771 "THIS HASN'T BEEN USED/VALIDATED YET -- CHECK NUMBER OF RECOVERY TERMS!\n";
772 error_message +=
"Then remove this break and continue\n";
775 OOMPH_CURRENT_FUNCTION,
776 OOMPH_EXCEPTION_LOCATION);
791 num_recovery_terms=2;
796 num_recovery_terms=3;
801 num_recovery_terms=4;
806 OOMPH_CURRENT_FUNCTION,
807 OOMPH_EXCEPTION_LOCATION);
820 num_recovery_terms=3;
825 num_recovery_terms=6;
830 num_recovery_terms=10;
835 OOMPH_CURRENT_FUNCTION,
836 OOMPH_EXCEPTION_LOCATION);
850 num_recovery_terms=4;
855 num_recovery_terms=10;
860 num_recovery_terms=20;
870 OOMPH_CURRENT_FUNCTION,
871 OOMPH_EXCEPTION_LOCATION);
880 std::ostringstream error_stream;
885 OOMPH_CURRENT_FUNCTION,
886 OOMPH_EXCEPTION_LOCATION);
889 return num_recovery_terms;
925 unsigned num_flux_terms_local=0;
926 unsigned dim_local=0;
927 unsigned recovery_order_local=0;
931 unsigned num_flux_terms=0;
949 "Element needs to inherit from ElementWithZ2ErrorEstimator!",
950 OOMPH_CURRENT_FUNCTION,
951 OOMPH_EXCEPTION_LOCATION);
959 dim_local=el_pt->
dim();
979 MPI_Allreduce(&num_flux_terms_local,&num_flux_terms,1,MPI_UNSIGNED,
980 MPI_MAX,comm_pt->mpi_comm());
981 MPI_Allreduce(&dim_local,&dim,1,MPI_INT,MPI_MAX,comm_pt->mpi_comm());
982 MPI_Allreduce(&recovery_order_local,&recovery_order,1,MPI_UNSIGNED,
983 MPI_MAX,comm_pt->mpi_comm());
987 num_flux_terms=num_flux_terms_local;
989 recovery_order=recovery_order_local;
998 #else // !OOMPH_HAS_MPI 1007 "Element needs to inherit from ElementWithZ2ErrorEstimator!",
1008 OOMPH_CURRENT_FUNCTION,
1009 OOMPH_EXCEPTION_LOCATION);
1034 std::map<Node*,Vector<ElementWithZ2ErrorEstimator*>*> adjacent_elements_pt;
1043 std::map<Node*,std::set<DenseMatrix<double>*> > flux_coeff_pt;
1049 typedef std::map<Node*,Vector<ElementWithZ2ErrorEstimator*>*>::iterator IT;
1056 std::map<ElementWithZ2ErrorEstimator*,int> elem_num;
1057 unsigned nelem=mesh_pt->
nelement();
1058 for (
unsigned e=0;
e<nelem;
e++)
1065 int n_patch=adjacent_elements_pt.size();
1072 #ifdef OOMPH_HAS_MPI 1079 range = n_patch/n_proc;
1081 itbegin = my_rank*range;
1082 itend = (my_rank+1)*range;
1085 if (my_rank==(n_proc-1))
1100 for (
int i=itbegin;
i<itend;
i++)
1103 Node* nod_pt=vertex_node_pt[
i];
1108 adjacent_elements_pt[nod_pt];
1112 unsigned nelem=(*el_vec_pt).size();
1118 for (
unsigned e=0;
e<nelem;
e++)
1120 elements_in_this_patch.push_back(elem_num[(*el_vec_pt)[
e]]);
1124 vector_of_elements_in_patch_to_send.push_back(elements_in_this_patch);
1133 dim,recovered_flux_coefficient_pt);
1137 vector_of_recovered_flux_coefficient_pt_to_send.
1138 push_back(recovered_flux_coefficient_pt);
1147 #ifdef OOMPH_HAS_MPI 1156 for (
int iproc=0;iproc<n_proc;iproc++)
1159 int n_patches=vector_of_recovered_flux_coefficient_pt_to_send.size();
1160 MPI_Bcast(&n_patches,1,MPI_INT,iproc,comm_pt->mpi_comm());
1163 for (
int ipatch=0;ipatch<n_patches;ipatch++)
1167 unsigned nelements=0;
1172 elements=vector_of_elements_in_patch_to_send[ipatch];
1173 nelements=elements.size();
1177 comm_pt->broadcast(iproc,elements);
1185 recovered_flux_coefficient_pt=
1186 vector_of_recovered_flux_coefficient_pt_to_send[ipatch];
1195 comm_pt->broadcast(iproc,mattosend);
1198 *recovered_flux_coefficient_pt=mattosend;
1201 vector_of_recovered_flux_coefficient_pt.
1202 push_back(recovered_flux_coefficient_pt);
1205 nelements=elements.size();
1207 for (
unsigned e=0;
e<nelements;
e++)
1215 unsigned num_nod=el_pt->
nnode();
1216 for (
unsigned n=0;n<num_nod;n++)
1223 flux_coeff_pt[nod_pt].
1224 insert(recovered_flux_coefficient_pt);
1236 #endif // end ifdef OOMPH_HAS_MPI for parallel job without mesh distribution 1241 int n_patches=vector_of_recovered_flux_coefficient_pt_to_send.size();
1244 for (
int ipatch=0;ipatch<n_patches;ipatch++)
1249 elements=vector_of_elements_in_patch_to_send[ipatch];
1250 nelements=elements.size();
1254 recovered_flux_coefficient_pt=
1255 vector_of_recovered_flux_coefficient_pt_to_send[ipatch];
1257 vector_of_recovered_flux_coefficient_pt.
1258 push_back(recovered_flux_coefficient_pt);
1260 for (
int e=0;
e<nelements;
e++)
1268 unsigned num_nod=el_pt->
nnode();
1269 for (
unsigned n=0;n<num_nod;n++)
1275 flux_coeff_pt[nod_pt].
1276 insert(recovered_flux_coefficient_pt);
1283 #ifdef OOMPH_HAS_MPI 1288 for (IT it=adjacent_elements_pt.begin();
1289 it!=adjacent_elements_pt.end();it++)
1293 adjacent_elements_pt.clear();
1304 unsigned n_node=mesh_pt->
nnode();
1305 for (
unsigned n=0;n<n_node;n++)
1310 unsigned npatches=flux_coeff_pt[nod_pt].size();
1314 (num_recovery_terms,num_flux_terms,0.0);
1317 typedef std::set<DenseMatrix<double>*>::iterator IT;
1318 for (IT it=flux_coeff_pt[nod_pt].begin();
1319 it!=flux_coeff_pt[nod_pt].end();it++)
1321 for (
unsigned i=0;
i<num_recovery_terms;
i++)
1323 for (
unsigned j=0;j<num_flux_terms;j++)
1327 averaged_flux_coeff(
i,j)+=(*(*it))(
i,j);
1339 for (
unsigned i=0;
i<dim;
i++)
1349 for (
unsigned i=0;
i<num_flux_terms;
i++)
1351 rec_flux_map(nod_pt,
i)=0.0;
1355 for (
unsigned i=0;
i<num_flux_terms;
i++)
1357 for (
unsigned icoeff=0;icoeff<num_recovery_terms;icoeff++)
1359 rec_flux_map(nod_pt,
i)+=
1360 averaged_flux_coeff(icoeff,
i)*psi_r[icoeff];
1363 rec_flux_map(nod_pt,
i)/=double(npatches);
1371 unsigned npatch=vector_of_recovered_flux_coefficient_pt.size();
1372 for (
unsigned p=0;p<npatch;p++)
1374 delete vector_of_recovered_flux_coefficient_pt[p];
1396 int n_compound_flux = 1;
1397 for (
unsigned e=0;
e<nelem;
e++)
1402 #ifdef OOMPH_HAS_MPI 1411 if (n_compound_flux_el > n_compound_flux)
1412 {n_compound_flux = n_compound_flux_el;}
1413 #ifdef OOMPH_HAS_MPI 1421 unsigned test_count=0;
1425 elemental_compound_flux_error(nelem,n_compound_flux,0.0);
1428 for (
unsigned e=0;
e<nelem;
e++)
1433 #ifdef OOMPH_HAS_MPI 1448 const unsigned n_intpt = integ_pt->
nweight();
1451 for(
unsigned ipt=0;ipt<n_intpt;ipt++)
1455 for(
unsigned i=0;
i<dim;
i++)
1457 s[
i] = integ_pt->
knot(ipt,
i);
1461 double w = integ_pt->
weight(ipt);
1476 unsigned n_node=el_pt->
nnode();
1482 el_pt->
shape(s,psi);
1488 for (
unsigned n=0;n<n_node;n++)
1493 for (
unsigned i=0;
i<num_flux_terms;
i++)
1495 rec_flux[
i]+=rec_flux_map(nod_pt,
i)*psi[n];
1509 for (
unsigned i=0;
i<num_flux_terms;
i++)
1511 sum[flux_index[
i]]+=(rec_flux[
i]-fe_flux[
i])*(rec_flux[
i]-fe_flux[
i]);
1512 sum2[flux_index[
i]]+=rec_flux[
i]*rec_flux[
i];
1515 for(
unsigned i=0;
i<n_compound_flux_el;
i++)
1520 flux_norm[
i]+=sum2[
i]*
W;
1529 for(
unsigned i=0;
i<n_compound_flux_el;
i++)
1530 {elemental_compound_flux_error(
e,
i) = sqrt(error[
i]);}
1532 #ifdef OOMPH_HAS_MPI 1545 #ifdef OOMPH_HAS_MPI 1553 for (
int iproc=0; iproc<n_proc; iproc++)
1561 int nelem_haloed=haloed_elem_pt.size();
1565 if (nelem_haloed!=0)
1569 int n_elem_error_haloed = nelem_haloed*n_compound_flux;
1574 for (
int e=0;
e<nelem_haloed;
e++)
1578 (haloed_elem_pt[
e])];
1580 for(
int i=0;
i<n_compound_flux;
i++)
1582 haloed_elem_error[count]=
1583 elemental_compound_flux_error(element_num,
i);
1588 MPI_Send(&haloed_elem_error[0],n_elem_error_haloed,MPI_DOUBLE,
1589 iproc,0,comm_pt->mpi_comm());
1594 for (
int send_rank=0; send_rank<n_proc; send_rank++)
1596 if (iproc!=send_rank)
1599 halo_element_pt(send_rank);
1601 int nelem_halo=halo_elem_pt.size();
1608 int n_elem_error_halo = nelem_halo*n_compound_flux;
1614 MPI_Recv(&halo_elem_error[0],n_elem_error_halo,
1615 MPI_DOUBLE,send_rank,0,
1616 comm_pt->mpi_comm(),&status);
1620 for (
int e=0;
e<nelem_halo;
e++)
1627 for(
int i=0;
i<n_compound_flux;
i++)
1629 elemental_compound_flux_error(element_num,
i) =
1630 halo_elem_error[count];
1659 for(
int i=0;
i<n_compound_flux;
i++)
1667 #ifdef OOMPH_HAS_MPI 1676 MPI_Allreduce(&flux_norm[0],&total_flux_norm[0],n_compound_flux,
1677 MPI_DOUBLE,MPI_SUM,comm_pt->mpi_comm());
1679 for(
int i=0;
i<n_compound_flux;
i++)
1681 flux_norm[
i]=sqrt(total_flux_norm[
i]);
1686 for(
int i=0;
i<n_compound_flux;
i++)
1688 flux_norm[
i]=sqrt(flux_norm[
i]);
1691 #else // serial problem, so flux_norm already global 1692 for(
int i=0;
i<n_compound_flux;
i++)
1694 flux_norm[
i]=sqrt(flux_norm[
i]);
1703 for (
unsigned e=0;
e<nelem;
e++)
1707 for(
int i=0;
i<n_compound_flux;
i++)
1709 if (flux_norm[
i]!=0.0)
1711 normalised_compound_flux_error[
i] =
1712 elemental_compound_flux_error(
e,
i) / flux_norm[
i];
1716 normalised_compound_flux_error[
i] =
1717 elemental_compound_flux_error(
e,
i);
1723 normalised_compound_flux_error);
1730 rec_flux_map,elemental_error,doc_info);
1740 const unsigned& num_flux_terms,
1746 #ifdef OOMPH_HAS_MPI 1759 std::ofstream some_file,feflux_file;
1760 std::ostringstream filename;
1762 <<
"_on_proc_" << comm_pt->my_rank() <<
".dat";
1763 some_file.open(filename.str().c_str());
1766 <<
"_on_proc_" << comm_pt->my_rank() <<
".dat";
1767 feflux_file.open(filename.str().c_str());
1774 unsigned dim=el_pt->
dim();
1781 for (
unsigned e=0;
e<nel;
e++)
1791 for (
unsigned iplot=0;iplot<num_plot_points;iplot++)
1801 unsigned n_node=el_pt->
nnode();
1807 el_pt->
shape(s,psi);
1813 for (
unsigned n=0;n<n_node;n++)
1819 for (
unsigned i=0;
i<num_flux_terms;
i++)
1821 rec_flux[
i]+=rec_flux_map(nod_pt,
i)*psi[n];
1829 for (
unsigned i=0;
i<dim;
i++)
1831 some_file << x[
i] <<
" ";
1833 for (
unsigned i=0;
i<num_flux_terms;
i++)
1835 some_file << rec_flux[
i] <<
" ";
1837 some_file << elemental_error[
e] <<
" " 1841 for (
unsigned i=0;
i<dim;
i++)
1843 feflux_file << x[
i] <<
" ";
1845 for (
unsigned i=0;
i<num_flux_terms;
i++)
1847 feflux_file << fe_flux[
i] <<
" ";
1849 feflux_file << elemental_error[
e] <<
" " 1863 feflux_file.close();
virtual std::string tecplot_zone_string(const unsigned &nplot) const
Return string for tecplot zone header (when plotting nplot points in each "coordinate direction") ...
Class of matrices containing doubles, and stored as a DenseMatrix<double>, but with solving functiona...
unsigned Recovery_order
Order of recovery polynomials.
virtual unsigned nrecovery_order()=0
Order of recovery shape functions.
Base class for finite elements that can compute the quantities that are required for the Z2 error est...
virtual unsigned nvertex_node() const =0
Number of vertex nodes in the element.
bool is_doc_enabled() const
Are we documenting?
virtual void get_s_plot(const unsigned &i, const unsigned &nplot, Vector< double > &s, const bool &shifted_to_interior=false) const
Get cector of local coordinates of plot point i (when plotting nplot points in each "coordinate direc...
void setup_patches(Mesh *&mesh_pt, std::map< Node *, Vector< ElementWithZ2ErrorEstimator *> *> &adjacent_elements_pt, Vector< Node *> &vertex_node_pt)
Setup patches: For each vertex node pointed to by nod_pt, adjacent_elements_pt[nod_pt] contains the p...
unsigned & recovery_order()
Access function for order of recovery polynomials.
virtual void get_Z2_flux(const Vector< double > &s, Vector< double > &flux)=0
Z2 'flux' terms for Z2 error estimation.
Information for documentation of results: Directory and file number to enable output in the form RESL...
std::string directory() const
Output directory.
virtual void lubksub(DoubleVector &rhs)
LU backsubstitution.
A general Finite Element class.
bool is_halo() const
Is this element a halo?
Nodes are derived from Data, but, in addition, have a definite (Eulerian) position in a space of a gi...
static OomphCommunicator * communicator_pt()
access to the global oomph-lib communicator
CombinedErrorEstimateFctPt Combined_error_fct_pt
Function pointer to combined error estimator function.
Vector< GeneralisedElement * > haloed_element_pt(const unsigned &p)
Return vector of haloed elements in this Mesh whose haloing counterpart is held on processor p...
void get_recovered_flux_in_patch(const Vector< ElementWithZ2ErrorEstimator *> &patch_el_pt, const unsigned &num_recovery_terms, const unsigned &num_flux_terms, const unsigned &dim, DenseMatrix< double > *&recovered_flux_coefficient_pt)
Given the vector of elements that make up a patch, the number of recovery and flux terms...
virtual double geometric_jacobian(const Vector< double > &x)
Return the geometric jacobian (should be overloaded in cylindrical and spherical geometries). Default value one is suitable for Cartesian coordinates.
static bool mpi_has_been_initialised()
return true if MPI has been initialised
virtual unsigned ncompound_fluxes()
A stuitable error estimator for a multi-physics elements may require one Z2 error estimate for each f...
virtual double weight(const unsigned &i) const =0
Return weight of i-th integration point.
virtual unsigned nplot_points(const unsigned &nplot) const
Return total number of plot points (when plotting nplot points in each "coordinate direction") ...
unsigned & number()
Number used (e.g.) for labeling output files.
Integral * integral_rec(const unsigned &dim, const bool &is_q_mesh)
Integation scheme associated with the recovery shape functions must be of sufficiently high order to ...
unsigned long nelement() const
Return number of elements in the mesh.
double get_combined_error_estimate(const Vector< double > &compound_error)
Return a combined error estimate from all compound errors.
double & x(const unsigned &i)
Return the i-th nodal coordinate.
virtual double interpolated_x(const Vector< double > &s, const unsigned &i) const
Return FE interpolated coordinate x[i] at local coordinate s.
GeneralisedElement *& element_pt(const unsigned long &e)
Return pointer to element e.
Integral *const & integral_pt() const
Return the pointer to the integration scheme (const version)
double Reference_flux_norm
Prescribed reference flux norm.
bool is_mesh_distributed() const
Boolean to indicate if Mesh has been distributed.
virtual double knot(const unsigned &i, const unsigned &j) const =0
Return local coordinate s[j] of i-th integration point.
virtual void write_tecplot_zone_footer(std::ostream &outfile, const unsigned &nplot) const
Add tecplot zone "footer" to output stream (when plotting nplot points in each "coordinate direction"...
Node *& node_pt(const unsigned &n)
Return a pointer to the local node n.
bool Recovery_order_from_first_element
void doc_flux(Mesh *mesh_pt, const unsigned &num_flux_terms, MapMatrixMixed< Node *, int, double > &rec_flux_map, const Vector< double > &elemental_error, DocInfo &doc_info)
Doc flux and recovered flux.
Node *& node_pt(const unsigned long &n)
Return pointer to global node n.
unsigned long nnode() const
Return number of nodes in the mesh.
virtual unsigned num_Z2_flux_terms()=0
Number of 'flux' terms for Z2 error estimation.
FiniteElement * finite_element_pt(const unsigned &e) const
Upcast (downcast?) to FiniteElement (needed to access FiniteElement member functions).
unsigned dim() const
Return the spatial dimension of the element, i.e. the number of local coordinates required to paramet...
virtual unsigned nweight() const =0
Return the number of integration points of the scheme.
std::string string(const unsigned &i)
Return the i-th string or "" if the relevant string hasn't been defined.
virtual void ludecompose()
LU decomposition using DenseLU (default linea solver)
void get_element_errors(Mesh *&mesh_pt, Vector< double > &elemental_error)
Compute the elemental error measures for a given mesh and store them in a vector. ...
virtual void get_Z2_compound_flux_indices(Vector< unsigned > &flux_index)
Return the compound flux index of each flux component The default (do nothing behaviour) will mean th...
virtual Node * vertex_node_pt(const unsigned &j) const =0
Pointer to the j-th vertex node in the element. Needed for efficient patch assmbly.
void shape_rec(const Vector< double > &x, const unsigned &dim, Vector< double > &psi_r)
Recovery shape functions as functions of the global, Eulerian coordinate x of dimension dim...
OomphCommunicator * communicator_pt() const
unsigned nrecovery_terms(const unsigned &dim)
Return number of coefficients for expansion of recovered fluxes for given spatial dimension of elemen...
unsigned nnode() const
Return the number of nodes.
virtual double J_eulerian(const Vector< double > &s) const
Return the Jacobian of mapping from local to global coordinates at local position s...
virtual void shape(const Vector< double > &s, Shape &psi) const =0
Calculate the geometric shape functions at local coordinate s. This function must be overloaded for e...
An oomph-lib wrapper to the MPI_Comm communicator object. Just contains an MPI_Comm object (which is ...