当前位置: 首页>>代码示例>>C++>>正文


C++ DiffContext::get_elem_jacobian方法代码示例

本文整理汇总了C++中DiffContext::get_elem_jacobian方法的典型用法代码示例。如果您正苦于以下问题:C++ DiffContext::get_elem_jacobian方法的具体用法?C++ DiffContext::get_elem_jacobian怎么用?C++ DiffContext::get_elem_jacobian使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在DiffContext的用法示例。


在下文中一共展示了DiffContext::get_elem_jacobian方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: _general_residual

bool EulerSolver::_general_residual (bool request_jacobian,
                                     DiffContext &context,
                                     ResFuncType mass,
                                     ResFuncType time_deriv,
                                     ResFuncType constraint,
                                     ReinitFuncType reinit_func)
{
  unsigned int n_dofs = context.get_elem_solution().size();

  // We might need to save the old jacobian in case one of our physics
  // terms later is unable to update it analytically.
  DenseMatrix<Number> old_elem_jacobian(n_dofs, n_dofs);
  if (request_jacobian)
    old_elem_jacobian.swap(context.get_elem_jacobian());

  // Local nonlinear solution at old timestep
  DenseVector<Number> old_elem_solution(n_dofs);
  for (unsigned int i=0; i != n_dofs; ++i)
    old_elem_solution(i) =
      old_nonlinear_solution(context.get_dof_indices()[i]);

  // Local time derivative of solution
  context.get_elem_solution_rate() = context.get_elem_solution();
  context.get_elem_solution_rate() -= old_elem_solution;
  context.elem_solution_rate_derivative = 1 / _system.deltat;
  context.get_elem_solution_rate() *=
    context.elem_solution_rate_derivative;

  // Local nonlinear solution at time t_theta
  DenseVector<Number> theta_solution(context.get_elem_solution());
  theta_solution *= theta;
  theta_solution.add(1. - theta, old_elem_solution);

  context.elem_solution_derivative = theta;
  context.fixed_solution_derivative = theta;

  // If a fixed solution is requested, we'll use theta_solution
  if (_system.use_fixed_solution)
    context.get_elem_fixed_solution() = theta_solution;

  // Move theta_->elem_, elem_->theta_
  context.get_elem_solution().swap(theta_solution);

  // Move the mesh into place first if necessary
  (context.*reinit_func)(theta);

  // Get the time derivative at t_theta
  bool jacobian_computed =
    (_system.*time_deriv)(request_jacobian, context);

  jacobian_computed = (_system.*mass)(jacobian_computed, context) &&
    jacobian_computed;

  // Restore the elem position if necessary
  (context.*reinit_func)(1);

  // Move elem_->elem_, theta_->theta_
  context.get_elem_solution().swap(theta_solution);
  context.elem_solution_derivative = 1;

  // Add the constraint term
  jacobian_computed = (_system.*constraint)(jacobian_computed, context) &&
    jacobian_computed;

  // Add back (or restore) the old jacobian
  if (request_jacobian)
    {
      if (jacobian_computed)
        context.get_elem_jacobian() += old_elem_jacobian;
      else
        context.get_elem_jacobian().swap(old_elem_jacobian);
    }

  return jacobian_computed;
}
开发者ID:ArtisticCoding,项目名称:libmesh,代码行数:75,代码来源:euler_solver.C

示例2: side_residual

bool EulerSolver::side_residual (bool request_jacobian,
                                 DiffContext &context)
{
    unsigned int n_dofs = context.get_elem_solution().size();

    // Local nonlinear solution at old timestep
    DenseVector<Number> old_elem_solution(n_dofs);
    for (unsigned int i=0; i != n_dofs; ++i)
        old_elem_solution(i) =
            old_nonlinear_solution(context.get_dof_indices()[i]);

    // Local nonlinear solution at time t_theta
    DenseVector<Number> theta_solution(context.get_elem_solution());
    theta_solution *= theta;
    theta_solution.add(1. - theta, old_elem_solution);

    // Technically the elem_solution_derivative is either theta
    // or 1.0 in this implementation, but we scale the former part
    // ourselves
    context.elem_solution_derivative = 1.0;

// Technically the fixed_solution_derivative is always theta,
// but we're scaling a whole jacobian by theta after these first
// evaluations
    context.fixed_solution_derivative = 1.0;

    // If a fixed solution is requested, we'll use theta_solution
    if (_system.use_fixed_solution)
        context.get_elem_fixed_solution() = theta_solution;

    // Move theta_->elem_, elem_->theta_
    context.get_elem_solution().swap(theta_solution);

    // Move the mesh into place first if necessary
    context.elem_side_reinit(theta);

    // We're going to compute just the change in elem_residual
    // (and possibly elem_jacobian), then add back the old values
    DenseVector<Number> old_elem_residual(context.get_elem_residual());
    DenseMatrix<Number> old_elem_jacobian;
    if (request_jacobian)
    {
        old_elem_jacobian = context.get_elem_jacobian();
        context.get_elem_jacobian().zero();
    }
    context.get_elem_residual().zero();

    // Get the time derivative at t_theta
    bool jacobian_computed =
        _system.side_time_derivative(request_jacobian, context);

    // Scale the time-dependent residual and jacobian correctly
    context.get_elem_residual() *= _system.deltat;
    if (jacobian_computed)
        context.get_elem_jacobian() *= (theta * _system.deltat);

    // The fixed_solution_derivative is always theta,
    // and now we're done scaling jacobians
    context.fixed_solution_derivative = theta;

    // We evaluate side_mass_residual with the change in solution
    // to get the mass matrix, reusing old_elem_solution to hold that
    // delta_solution.  We're solving dt*F(u) - du = 0, so our
    // delta_solution is old_solution - new_solution.
    // We're still keeping elem_solution in theta_solution for now
    old_elem_solution -= theta_solution;

    // Move old_->elem_, theta_->old_
    context.get_elem_solution().swap(old_elem_solution);

    // We do a trick here to avoid using a non-1
    // elem_solution_derivative:
    context.get_elem_jacobian() *= -1.0;
    jacobian_computed = _system.side_mass_residual(jacobian_computed, context) &&
                        jacobian_computed;
    context.get_elem_jacobian() *= -1.0;

    // Move elem_->elem_, old_->theta_
    context.get_elem_solution().swap(theta_solution);

    // Restore the elem position if necessary
    context.elem_side_reinit(1.);

    // Add the constraint term
    jacobian_computed = _system.side_constraint(jacobian_computed, context) &&
                        jacobian_computed;

    // Add back the old residual and jacobian
    context.get_elem_residual() += old_elem_residual;
    if (request_jacobian)
    {
        if (jacobian_computed)
            context.get_elem_jacobian() += old_elem_jacobian;
        else
            context.get_elem_jacobian().swap(old_elem_jacobian);
    }

    return jacobian_computed;
}
开发者ID:ZJLi2013,项目名称:libmesh,代码行数:99,代码来源:euler_solver.C

示例3:

bool Euler2Solver::_general_residual (bool request_jacobian,
                                      DiffContext &context,
                                      ResFuncType mass,
                                      ResFuncType time_deriv,
                                      ResFuncType constraint,
                                      ReinitFuncType reinit_func)
{
  unsigned int n_dofs = context.get_elem_solution().size();

  // Local nonlinear solution at old timestep
  DenseVector<Number> old_elem_solution(n_dofs);
  for (unsigned int i=0; i != n_dofs; ++i)
    old_elem_solution(i) =
      old_nonlinear_solution(context.get_dof_indices()[i]);

  // Local time derivative of solution
  context.get_elem_solution_rate() = context.get_elem_solution();
  context.get_elem_solution_rate() -= old_elem_solution;
  context.elem_solution_rate_derivative = 1 / _system.deltat;
  context.get_elem_solution_rate() *=
    context.elem_solution_rate_derivative;

  // Our first evaluations are at the final elem_solution
  context.elem_solution_derivative = 1.0;

  // If a fixed solution is requested, we'll use the elem_solution
  // at the new timestep
  // FIXME - should this be the theta solution instead?
  if (_system.use_fixed_solution)
    context.get_elem_fixed_solution() = context.get_elem_solution();

  context.fixed_solution_derivative = 1.0;

  // We need to save the old jacobian and old residual since we'll be
  // multiplying some of the new contributions by theta or 1-theta
  DenseMatrix<Number> old_elem_jacobian(n_dofs, n_dofs);
  DenseVector<Number> old_elem_residual(n_dofs);
  old_elem_residual.swap(context.get_elem_residual());
  if (request_jacobian)
    old_elem_jacobian.swap(context.get_elem_jacobian());

  // Local time derivative of solution
  context.get_elem_solution_rate() = context.get_elem_solution();
  context.get_elem_solution_rate() -= old_elem_solution;
  context.elem_solution_rate_derivative = 1 / _system.deltat;
  context.get_elem_solution_rate() *=
    context.elem_solution_rate_derivative;

  // First, evaluate time derivative at the new timestep.
  // The element should already be in the proper place
  // even for a moving mesh problem.
  bool jacobian_computed =
    (_system.*time_deriv)(request_jacobian, context);

  // Next, evaluate the mass residual at the new timestep

  jacobian_computed = (_system.*mass)(jacobian_computed, context) &&
    jacobian_computed;

  // Add the constraint term
  jacobian_computed = (_system.*constraint)(jacobian_computed, context) &&
    jacobian_computed;

  // The new solution's contribution is scaled by theta
  context.get_elem_residual() *= theta;
  context.get_elem_jacobian() *= theta;

  // Save the new solution's term
  DenseMatrix<Number> elem_jacobian_newterm(n_dofs, n_dofs);
  DenseVector<Number> elem_residual_newterm(n_dofs);
  elem_residual_newterm.swap(context.get_elem_residual());
  if (request_jacobian)
    elem_jacobian_newterm.swap(context.get_elem_jacobian());

  // Add the time-dependent term for the old solution

  // Make sure elem_solution is set up for elem_reinit to use
  // Move elem_->old_, old_->elem_
  context.get_elem_solution().swap(old_elem_solution);
  context.elem_solution_derivative = 0.0;

  // Move the mesh into place first if necessary
  (context.*reinit_func)(0.);

  jacobian_computed =
    (_system.*time_deriv)(jacobian_computed, context) &&
    jacobian_computed;

  // Add the mass residual term for the old solution

  // Evaluating the mass residual at both old and new timesteps will be
  // redundant in most problems but may be necessary for time accuracy
  // or stability in moving mesh problems or problems with user-overridden
  // mass_residual functions

  jacobian_computed =
    (_system.*mass)(jacobian_computed, context) &&
    jacobian_computed;

  // The old solution's contribution is scaled by (1-theta)
//.........这里部分代码省略.........
开发者ID:smharper,项目名称:libmesh,代码行数:101,代码来源:euler2_solver.C


注:本文中的DiffContext::get_elem_jacobian方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。