Following is my H_plus function:
float PhaseField::H_plus(Vector<double> solution_elastic
, const auto cell,const unsigned int q_point)
{
QGauss<2> quadrature_formula_damage(fe_damage.degree + 1);
FEValues<2> fe_values_damage(fe_damage,
quadrature_formula_damage,
update_gradients |
update_quadrature_points );
fe_values_damage.reinit(cell);
int node = 0;
/* Initialising all strains as zero */
float e_xx = 0.000;
float e_yy = 0.000;
float e_xy = 0.000;
/*calculating strains*/
for (const auto vertex : cell->vertex_indices())
{
int a = (cell->vertex_dof_index(vertex, 0));
e_xx = e_xx + solution_elastic[a*2]*fe_values_damage.shape_grad(node, q_point)[0];
e_yy = e_yy + solution_elastic[a*2+1]*fe_values_damage.shape_grad(node, q_point)[1];
e_xy = e_xy +0.5*(solution_elastic[a*2]*fe_values_damage.shape_grad(node, q_point)[1]
+solution_elastic[a*2+1]*fe_values_damage.shape_grad(node, q_point)[0]);
node = node +1;
}
const auto &x_q = fe_values_damage.quadrature_point(q_point);
float H_plus_val;
/*This is the actual quantity I want to evaluate for each quadrature point*/
H_plus_val = 0.5*lambda(x_q)*(pow((e_xx+e_yy),2))
+ mu(x_q)*((pow(e_xx,2))+2*(pow(e_xy,2)) + (pow(e_yy,2)));
return H_plus_val;
}
H_plus function is called in assemble_damage for each quadrature point
I am also attaching some lines of code from assemble_damage where H_plus is being called
for (const auto &cell : dof_handler_damage.active_cell_iterators())
{
fe_values_damage.reinit(cell);
cell_matrix_damage = 0;
cell_rhs_damage = 0;
float gc = 0.000027; //energy release rate
float l = 0.015;
float H;
for (const unsigned int q_index : fe_values_damage.quadrature_point_indices())
{ float H_call = H_plus(solution_elastic,cell,q_index);
if (H_call > H_vector[4*cell_number + q_index])
{
H = H_call;
}
else
{
H = H_vector[4*cell_number + q_index];
}
H_vector_new[4*cell_number + q_index] = H;
for (const unsigned int i : fe_values_damage.dof_indices())
{
for (const unsigned int j : fe_values_damage.dof_indices())
{
const auto &x_q = fe_values_damage.quadrature_point(q_index);
cell_matrix_damage(i, j) +=
// contribution to stiffness from -laplace u term
Conductivity_damage(x_q)*fe_values_damage.shape_grad(i, q_index) * // kappa*grad phi_i(x_q)
fe_values_damage.shape_grad(j, q_index) * // grad phi_j(x_q)
fe_values_damage.JxW(q_index) // dx
+
// Contribution to stiffness from u term
((1+(2*l*H)/gc)*(1/pow(l,2))*fe_values_damage.shape_value(i, q_index) * // phi_i(x_q)
fe_values_damage.shape_value(j, q_index) * // phi_j(x_q)
fe_values_damage.JxW(q_index)); // dx
}
cell_rhs_damage(i) += (fe_values_damage.shape_value(i, q_index) * // phi_i(x_q)
(2/(l*gc))* H*
fe_values_damage.JxW(q_index)); // dx
}
}
/*Adding the local k and local f to global k and global f*/
cell->get_dof_indices(local_dof_indices);
for (const unsigned int i : fe_values_damage.dof_indices())
{
for (const unsigned int j : fe_values_damage.dof_indices())
system_matrix_damage.add(local_dof_indices[i],
local_dof_indices[j],
cell_matrix_damage(i, j));
system_rhs_damage(local_dof_indices[i]) += cell_rhs_damage(i);
}
cell_number = cell_number + 1;
}
Thanks and regards
Wasim