void FiniteStrainPlasticBase::checkDerivatives() { _console << "\n ++++++++++++++ \nChecking the derivatives\n"; outputAndCheckDebugParameters(); _console << "dyieldFunction_dstress. Relative L2 norms.\n"; std::vector<RankTwoTensor> df_dstress; std::vector<RankTwoTensor> fddf_dstress; dyieldFunction_dstress(_fspb_debug_stress, _fspb_debug_intnl, df_dstress); fddyieldFunction_dstress(_fspb_debug_stress, _fspb_debug_intnl, fddf_dstress); for (unsigned alpha = 0 ; alpha < numberOfYieldFunctions() ; ++alpha) { _console << "alpha = " << alpha << " Relative L2norm = " << 2*(df_dstress[alpha] - fddf_dstress[alpha]).L2norm()/(df_dstress[alpha] + fddf_dstress[alpha]).L2norm() << "\n"; _console << "Coded:\n"; df_dstress[alpha].print(); _console << "Finite difference:\n"; fddf_dstress[alpha].print(); } _console << "dflowPotential_dstress. Relative L2 norms.\n"; std::vector<RankFourTensor> dr_dstress; std::vector<RankFourTensor> fddr_dstress; dflowPotential_dstress(_fspb_debug_stress, _fspb_debug_intnl, dr_dstress); fddflowPotential_dstress(_fspb_debug_stress, _fspb_debug_intnl, fddr_dstress); for (unsigned alpha = 0 ; alpha < numberOfYieldFunctions() ; ++alpha) { _console << "alpha = " << alpha << " Relative L2norm = " << 2*(dr_dstress[alpha] - fddr_dstress[alpha]).L2norm()/(dr_dstress[alpha] + fddr_dstress[alpha]).L2norm() << "\n"; _console << "Coded:\n"; dr_dstress[alpha].print(); _console << "Finite difference:\n"; fddr_dstress[alpha].print(); } _console << "dflowPotential_dintnl. Relative L2 norms.\n"; std::vector<std::vector<RankTwoTensor> > dr_dintnl; std::vector<std::vector<RankTwoTensor> > fddr_dintnl; dflowPotential_dintnl(_fspb_debug_stress, _fspb_debug_intnl, dr_dintnl); fddflowPotential_dintnl(_fspb_debug_stress, _fspb_debug_intnl, fddr_dintnl); for (unsigned alpha = 0 ; alpha < numberOfYieldFunctions() ; ++alpha) { for (unsigned a = 0 ; a < numberOfInternalParameters() ; ++a) { _console << "alpha = " << alpha << " a = " << a << " Relative L2norm = " << 2*(dr_dintnl[alpha][a] - fddr_dintnl[alpha][a]).L2norm()/(dr_dintnl[alpha][a] + fddr_dintnl[alpha][a]).L2norm() << "\n"; _console << "Coded:\n"; dr_dintnl[alpha][a].print(); _console << "Finite difference:\n"; fddr_dintnl[alpha][a].print(); } } }
void MultiPlasticityDebugger::checkDerivatives() { Moose::err << "\n\n++++++++++++++++++++++++\nChecking the derivatives\n++++++++++++++++++++++++\n"; outputAndCheckDebugParameters(); std::vector<bool> act; act.assign(_num_surfaces, true); Moose::err << "\ndyieldFunction_dstress. Relative L2 norms.\n"; std::vector<RankTwoTensor> df_dstress; std::vector<RankTwoTensor> fddf_dstress; dyieldFunction_dstress(_fspb_debug_stress, _fspb_debug_intnl, act, df_dstress); fddyieldFunction_dstress(_fspb_debug_stress, _fspb_debug_intnl, fddf_dstress); for (unsigned surface = 0; surface < _num_surfaces; ++surface) { Moose::err << "surface = " << surface << " Relative L2norm = " << 2 * (df_dstress[surface] - fddf_dstress[surface]).L2norm() / (df_dstress[surface] + fddf_dstress[surface]).L2norm() << "\n"; Moose::err << "Coded:\n"; df_dstress[surface].print(); Moose::err << "Finite difference:\n"; fddf_dstress[surface].print(); } Moose::err << "\ndyieldFunction_dintnl.\n"; std::vector<Real> df_dintnl; dyieldFunction_dintnl(_fspb_debug_stress, _fspb_debug_intnl, act, df_dintnl); Moose::err << "Coded:\n"; for (unsigned surface = 0; surface < _num_surfaces; ++surface) Moose::err << df_dintnl[surface] << " "; Moose::err << "\n"; std::vector<Real> fddf_dintnl; fddyieldFunction_dintnl(_fspb_debug_stress, _fspb_debug_intnl, fddf_dintnl); Moose::err << "Finite difference:\n"; for (unsigned surface = 0; surface < _num_surfaces; ++surface) Moose::err << fddf_dintnl[surface] << " "; Moose::err << "\n"; Moose::err << "\ndflowPotential_dstress. Relative L2 norms.\n"; std::vector<RankFourTensor> dr_dstress; std::vector<RankFourTensor> fddr_dstress; dflowPotential_dstress(_fspb_debug_stress, _fspb_debug_intnl, act, dr_dstress); fddflowPotential_dstress(_fspb_debug_stress, _fspb_debug_intnl, fddr_dstress); for (unsigned surface = 0; surface < _num_surfaces; ++surface) { Moose::err << "surface = " << surface << " Relative L2norm = " << 2 * (dr_dstress[surface] - fddr_dstress[surface]).L2norm() / (dr_dstress[surface] + fddr_dstress[surface]).L2norm() << "\n"; Moose::err << "Coded:\n"; dr_dstress[surface].print(); Moose::err << "Finite difference:\n"; fddr_dstress[surface].print(); } Moose::err << "\ndflowPotential_dintnl. Relative L2 norms.\n"; std::vector<RankTwoTensor> dr_dintnl; std::vector<RankTwoTensor> fddr_dintnl; dflowPotential_dintnl(_fspb_debug_stress, _fspb_debug_intnl, act, dr_dintnl); fddflowPotential_dintnl(_fspb_debug_stress, _fspb_debug_intnl, fddr_dintnl); for (unsigned surface = 0; surface < _num_surfaces; ++surface) { Moose::err << "surface = " << surface << " Relative L2norm = " << 2 * (dr_dintnl[surface] - fddr_dintnl[surface]).L2norm() / (dr_dintnl[surface] + fddr_dintnl[surface]).L2norm() << "\n"; Moose::err << "Coded:\n"; dr_dintnl[surface].print(); Moose::err << "Finite difference:\n"; fddr_dintnl[surface].print(); } }