200#ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
205 PerfLog perf_log (
"Biharmonic Residual and Jacobian",
false);
211 const DofMap & dof_map = get_dof_map();
221 std::unique_ptr<FEBase> fe (
FEBase::build(_biharmonic._dim, fe_type));
229 fe->attach_quadrature_rule (qrule.get());
235 const std::vector<Real> & JxW = fe->get_JxW();
238 const std::vector<std::vector<Real>> & phi = fe->get_phi();
241 const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
244 const std::vector<std::vector<RealTensor>> & d2phi = fe->get_d2phi();
248 std::vector<Real> Laplacian_phi_qp;
260 std::vector<dof_id_type> dof_indices;
268 for (
const auto & elem : _biharmonic._mesh.active_local_element_ptr_range())
276 const unsigned int n_dofs =
277 cast_int<unsigned int>(dof_indices.size());
293 Laplacian_phi_qp.resize(
n_dofs);
295 for (
unsigned int qp=0; qp<qrule->n_points(); qp++)
305 Laplacian_u_qp = 0.0,
306 Laplacian_u_old_qp = 0.0;
309 grad_u_qp(0.0, 0.0, 0.0),
310 grad_u_old_qp(0.0, 0.0, 0.0);
316 M_prime_old_qp = 0.0;
318 for (
unsigned int i=0; i<
n_dofs; i++)
320 Laplacian_phi_qp[i] = d2phi[i][qp](0, 0);
321 grad_u_qp(0) += u(dof_indices[i])*dphi[i][qp](0);
322 grad_u_old_qp(0) += u_old(dof_indices[i])*dphi[i][qp](0);
324 if (_biharmonic._dim > 1)
326 Laplacian_phi_qp[i] += d2phi[i][qp](1, 1);
327 grad_u_qp(1) += u(dof_indices[i])*dphi[i][qp](1);
328 grad_u_old_qp(1) += u_old(dof_indices[i])*dphi[i][qp](1);
330 if (_biharmonic._dim > 2)
332 Laplacian_phi_qp[i] += d2phi[i][qp](2, 2);
333 grad_u_qp(2) += u(dof_indices[i])*dphi[i][qp](2);
334 grad_u_old_qp(2) += u_old(dof_indices[i])*dphi[i][qp](2);
336 u_qp += phi[i][qp]*u(dof_indices[i]);
337 u_old_qp += phi[i][qp]*u_old(dof_indices[i]);
338 Laplacian_u_qp += Laplacian_phi_qp[i]*u(dof_indices[i]);
339 Laplacian_u_old_qp += Laplacian_phi_qp[i]*u_old(dof_indices[i]);
342 if (_biharmonic._degenerate)
344 M_qp = 1.0 - u_qp*u_qp;
345 M_old_qp = 1.0 - u_old_qp*u_old_qp;
346 M_prime_qp = -2.0*u_qp;
347 M_prime_old_qp = -2.0*u_old_qp;
351 for (
unsigned int i=0; i<
n_dofs; i++)
356 Number ri = 0.0, ri_old = 0.0;
357 ri -= Laplacian_phi_qp[i]*M_qp*_biharmonic._kappa*Laplacian_u_qp;
358 ri_old -= Laplacian_phi_qp[i]*M_old_qp*_biharmonic._kappa*Laplacian_u_old_qp;
360 if (_biharmonic._degenerate)
362 ri -= (dphi[i][qp]*grad_u_qp)*M_prime_qp*(_biharmonic._kappa*Laplacian_u_qp);
363 ri_old -= (dphi[i][qp]*grad_u_old_qp)*M_prime_old_qp*(_biharmonic._kappa*Laplacian_u_old_qp);
366 if (_biharmonic._cahn_hillard)
370 ri += Laplacian_phi_qp[i]*M_qp*_biharmonic._theta_c*(u_qp*u_qp - 1.0)*u_qp;
371 ri_old += Laplacian_phi_qp[i]*M_old_qp*_biharmonic._theta_c*(u_old_qp*u_old_qp - 1.0)*u_old_qp;
372 if (_biharmonic._degenerate)
374 ri += (dphi[i][qp]*grad_u_qp)*M_prime_qp*_biharmonic._theta_c*(u_qp*u_qp - 1.0)*u_qp;
375 ri_old += (dphi[i][qp]*grad_u_old_qp)*M_prime_old_qp*_biharmonic._theta_c*(u_old_qp*u_old_qp - 1.0)*u_old_qp;
381 ri -= Laplacian_phi_qp[i]*M_qp*_biharmonic._theta_c*u_qp;
382 ri_old -= Laplacian_phi_qp[i]*M_old_qp*_biharmonic._theta_c*u_old_qp;
383 if (_biharmonic._degenerate)
385 ri -= (dphi[i][qp]*grad_u_qp)*M_prime_qp*_biharmonic._theta_c*u_qp;
386 ri_old -= (dphi[i][qp]*grad_u_old_qp)*M_prime_old_qp*_biharmonic._theta_c*u_old_qp;
392 switch(_biharmonic._log_truncation)
403 Re(i) += JxW[qp]*((u_qp-u_old_qp)*phi[i][qp]-_biharmonic._dt*0.5*((2.0-_biharmonic._cnWeight)*ri + _biharmonic._cnWeight*ri_old));
409 Number M_prime_prime_qp = 0.0;
410 if (_biharmonic._degenerate) M_prime_prime_qp = -2.0;
411 for (
unsigned int j=0; j<
n_dofs; j++)
414 ri_j -= Laplacian_phi_qp[i]*M_qp*_biharmonic._kappa*Laplacian_phi_qp[j];
415 if (_biharmonic._degenerate)
418 Laplacian_phi_qp[i]*M_prime_qp*phi[j][qp]*_biharmonic._kappa*Laplacian_u_qp +
419 (dphi[i][qp]*dphi[j][qp])*M_prime_qp*(_biharmonic._kappa*Laplacian_u_qp) +
420 (dphi[i][qp]*grad_u_qp)*(M_prime_prime_qp*phi[j][qp])*(_biharmonic._kappa*Laplacian_u_qp) +
421 (dphi[i][qp]*grad_u_qp)*(M_prime_qp)*(_biharmonic._kappa*Laplacian_phi_qp[j]);
424 if (_biharmonic._cahn_hillard)
429 Laplacian_phi_qp[i]*M_prime_qp*phi[j][qp]*_biharmonic._theta_c*(u_qp*u_qp - 1.0)*u_qp +
430 Laplacian_phi_qp[i]*M_qp*_biharmonic._theta_c*(3.0*u_qp*u_qp - 1.0)*phi[j][qp] +
431 (dphi[i][qp]*dphi[j][qp])*M_prime_qp*_biharmonic._theta_c*(u_qp*u_qp - 1.0)*u_qp +
432 (dphi[i][qp]*grad_u_qp)*M_prime_prime_qp*_biharmonic._theta_c*(u_qp*u_qp - 1.0)*u_qp +
433 (dphi[i][qp]*grad_u_qp)*M_prime_qp*_biharmonic._theta_c*(3.0*u_qp*u_qp - 1.0)*phi[j][qp];
439 Laplacian_phi_qp[i]*M_prime_qp*phi[j][qp]*_biharmonic._theta_c*u_qp +
440 Laplacian_phi_qp[i]*M_qp*_biharmonic._theta_c*phi[j][qp] +
441 (dphi[i][qp]*dphi[j][qp])*M_prime_qp*_biharmonic._theta_c*u_qp +
442 (dphi[i][qp]*grad_u_qp)*M_prime_prime_qp*_biharmonic._theta_c*u_qp +
443 (dphi[i][qp]*grad_u_qp)*M_prime_qp*_biharmonic._theta_c*phi[j][qp];
448 switch(_biharmonic._log_truncation)
459 Je(i,j) += JxW[qp]*(phi[i][qp]*phi[j][qp] - 0.5*_biharmonic._dt*(2.0-_biharmonic._cnWeight)*ri_j);