Exemple #1
0
void
PressureAction::act()
{
  const std::string kernel_name = "Pressure";

  std::vector<NonlinearVariableName> displacements;
  if (isParamValid("displacements"))
    displacements = getParam<std::vector<NonlinearVariableName>>("displacements");
  else
  {
    // Legacy parameter scheme for displacements
    if (!isParamValid("disp_x"))
      mooseError("Specify displacement variables using the `displacements` parameter.");
    displacements.push_back(getParam<NonlinearVariableName>("disp_x"));

    if (isParamValid("disp_y"))
    {
      displacements.push_back(getParam<NonlinearVariableName>("disp_y"));
      if (isParamValid("disp_z"))
        displacements.push_back(getParam<NonlinearVariableName>("disp_z"));
    }
  }

  // Create pressure BCs
  for (unsigned int i = 0; i < displacements.size(); ++i)
  {
    // Create unique kernel name for each of the components
    std::string unique_kernel_name = kernel_name + "_" + _name + "_" + Moose::stringify(i);

    InputParameters params = _factory.getValidParams(kernel_name);
    params.applyParameters(parameters());
    params.set<bool>("use_displaced_mesh") = true;
    params.set<unsigned int>("component") = i;
    params.set<NonlinearVariableName>("variable") = displacements[i];

    if (_has_save_in_vars[i])
      params.set<std::vector<AuxVariableName>>("save_in") = _save_in_vars[i];

    _problem->addBoundaryCondition(kernel_name, unique_kernel_name, params);
  }
}
void
PolycrystalKernelAction::act()
{
  for (unsigned int op = 0; op < _op_num; ++op)
  {
    //
    // Create variable names
    //

    std::string var_name = _var_name_base + Moose::stringify(op);
    std::vector<VariableName> v;
    v.resize(_op_num - 1);

    unsigned int ind = 0;
    for (unsigned int j = 0; j < _op_num; ++j)
      if (j != op)
        v[ind++] = _var_name_base + Moose::stringify(j);

    //
    // Set up ACGrGrPoly kernels
    //

    {
      InputParameters params = _factory.getValidParams("ACGrGrPoly");
      params.set<NonlinearVariableName>("variable") = var_name;
      params.set<std::vector<VariableName>>("v") = v;
      params.applyParameters(parameters());

      std::string kernel_name = "ACBulk_" + var_name;
      _problem->addKernel("ACGrGrPoly", kernel_name, params);
    }

    //
    // Set up ACInterface kernels
    //

    {
      InputParameters params = _factory.getValidParams("ACInterface");
      params.set<NonlinearVariableName>("variable") = var_name;
      params.applyParameters(parameters());

      std::string kernel_name = "ACInt_" + var_name;
      _problem->addKernel("ACInterface", kernel_name, params);
    }

    //
    // Set up TimeDerivative kernels
    //

    {
      InputParameters params = _factory.getValidParams("TimeDerivative");
      params.set<NonlinearVariableName>("variable") = var_name;
      params.set<bool>("implicit") = true;
      params.applyParameters(parameters());

      std::string kernel_name = "IE_" + var_name;
      _problem->addKernel("TimeDerivative", kernel_name, params);
    }

    //
    // Set up optional ACGBPoly bubble interaction kernels
    //

    if (isParamValid("c"))
    {
      InputParameters params = _factory.getValidParams("ACGBPoly");
      params.set<NonlinearVariableName>("variable") = var_name;
      params.set<std::vector<VariableName>>("c") = {getParam<VariableName>("c")};
      params.applyParameters(parameters());

      std::string kernel_name = "ACBubInteraction_" + var_name;
      _problem->addKernel("ACGBPoly", kernel_name, params);
    }
  }
}
Exemple #3
0
void
ConservedAction::act()
{
  //
  // Add variable(s)
  //
  if (_current_task == "add_variable")
  {
    // Create conserved variable _var_name
    _problem->addVariable(_var_name, _fe_type, _scaling);

    // Create chemical potential variable for split form
    switch (_solve_type)
    {
      case SolveType::DIRECT:
        break;
      case SolveType::REVERSE_SPLIT:
      case SolveType::FORWARD_SPLIT:
        _problem->addVariable(_chempot_name, _fe_type, _scaling);
    }
  }

  //
  // Add Kernels
  //
  else if (_current_task == "add_kernel")
  {
    switch (_solve_type)
    {
      case SolveType::DIRECT:
        // Add time derivative kernel
        {
          std::string kernel_type = "TimeDerivative";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _var_name;
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }

        // Add CahnHilliard kernel
        {
          std::string kernel_type = "CahnHilliard";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _var_name;
          params.set<MaterialPropertyName>("mob_name") = getParam<MaterialPropertyName>("mobility");
          params.set<MaterialPropertyName>("f_name") =
              getParam<MaterialPropertyName>("free_energy");
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }

        // Add ACInterface kernel
        {
          std::string kernel_type = "CHInterface";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _var_name;
          params.set<MaterialPropertyName>("mob_name") = getParam<MaterialPropertyName>("mobility");
          params.set<MaterialPropertyName>("kappa_name") = getParam<MaterialPropertyName>("kappa");
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }
        break;

      case SolveType::REVERSE_SPLIT:
        // Add time derivative kernel
        {
          std::string kernel_type = "CoupledTimeDerivative";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _chempot_name;
          params.set<std::vector<VariableName>>("v") = {_var_name};
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }

        // Add SplitCHWRes kernel
        {
          std::string kernel_type = "SplitCHWRes";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _chempot_name;
          params.set<MaterialPropertyName>("mob_name") = getParam<MaterialPropertyName>("mobility");
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }

        // Add SplitCHParsed kernel
        {
          std::string kernel_type = "SplitCHParsed";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _var_name;
          params.set<std::vector<VariableName>>("w") = {_chempot_name};
          params.set<MaterialPropertyName>("f_name") =
              getParam<MaterialPropertyName>("free_energy");
          params.set<MaterialPropertyName>("kappa_name") = getParam<MaterialPropertyName>("kappa");
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }
        break;

      case SolveType::FORWARD_SPLIT:
        // Add time derivative kernel
        {
          std::string kernel_type = "TimeDerivative";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _var_name;
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }

        // Add MatDiffusion kernel for c residual
        {
          std::string kernel_type = "MatDiffusion";

          std::string kernel_name = _var_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _var_name;
          params.set<std::vector<VariableName>>("conc") = {_chempot_name};
          params.set<MaterialPropertyName>("D_name") = getParam<MaterialPropertyName>("mobility");
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }
        // Add MatDiffusion kernel for chemical potential residual
        {
          std::string kernel_type = "MatDiffusion";

          std::string kernel_name = _chempot_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _chempot_name;
          params.set<std::vector<VariableName>>("conc") = {_var_name};
          params.set<MaterialPropertyName>("D_name") = getParam<MaterialPropertyName>("kappa");
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }

        // Add CoupledMaterialDerivative kernel
        {
          std::string kernel_type = "CoupledMaterialDerivative";

          std::string kernel_name = _chempot_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _chempot_name;
          params.set<std::vector<VariableName>>("v") = {_var_name};
          params.set<MaterialPropertyName>("f_name") =
              getParam<MaterialPropertyName>("free_energy");
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }

        // Add CoefReaction kernel
        {
          std::string kernel_type = "CoefReaction";

          std::string kernel_name = _chempot_name + "_" + kernel_type;
          InputParameters params = _factory.getValidParams(kernel_type);
          params.set<NonlinearVariableName>("variable") = _chempot_name;
          params.set<Real>("coefficient") = -1.0;
          params.applyParameters(parameters());

          _problem->addKernel(kernel_type, kernel_name, params);
        }
    }
  }
}
Exemple #4
0
void
ContactAction::act()
{
  if (!_problem->getDisplacedProblem())
    mooseError("Contact requires updated coordinates.  Use the 'displacements = ...' line in the "
               "Mesh block.");

  std::string action_name = MooseUtils::shortName(name());

  std::vector<NonlinearVariableName> displacements;
  if (isParamValid("displacements"))
    displacements = getParam<std::vector<NonlinearVariableName>>("displacements");
  else
  {
    // Legacy parameter scheme for displacements
    if (!isParamValid("disp_x"))
      mooseError("Specify displacement variables using the `displacements` parameter.");
    displacements.push_back(getParam<NonlinearVariableName>("disp_x"));

    if (isParamValid("disp_y"))
    {
      displacements.push_back(getParam<NonlinearVariableName>("disp_y"));
      if (isParamValid("disp_z"))
        displacements.push_back(getParam<NonlinearVariableName>("disp_z"));
    }

    mooseDeprecated("use the `displacements` parameter rather than the `disp_*` parameters (those "
                    "will go away with the deprecation of the Solid Mechanics module).");
  }

  // Determine number of dimensions
  const unsigned int ndisp = displacements.size();

  // convert vector of NonlinearVariableName to vector of VariableName
  std::vector<VariableName> coupled_displacements(ndisp);
  for (unsigned int i = 0; i < ndisp; ++i)
    coupled_displacements[i] = displacements[i];

  if (_current_task == "add_dirac_kernel")
  {
    // MechanicalContactConstraint has to be added after the init_problem task, so it cannot be
    // added for the add_constraint task.
    if (_system == "Constraint")
    {
      InputParameters params = _factory.getValidParams("MechanicalContactConstraint");
      params.applyParameters(parameters(), {"displacements", "formulation"});
      params.set<std::string>("formulation") = _formulation;
      params.set<std::vector<VariableName>>("nodal_area") = {"nodal_area_" + name()};
      params.set<std::vector<VariableName>>("displacements") = coupled_displacements;
      params.set<BoundaryName>("boundary") = _master;
      params.set<bool>("use_displaced_mesh") = true;

      for (unsigned int i = 0; i < ndisp; ++i)
      {
        std::string name = action_name + "_constraint_" + Moose::stringify(i);

        params.set<unsigned int>("component") = i;
        params.set<NonlinearVariableName>("variable") = displacements[i];
        params.set<std::vector<VariableName>>("master_variable") = {coupled_displacements[i]};
        _problem->addConstraint("MechanicalContactConstraint", name, params);
      }
    }

    if (_system == "DiracKernel")
    {
      {
        InputParameters params = _factory.getValidParams("ContactMaster");
        params.applyParameters(parameters(), {"displacements", "formulation"});
        params.set<std::string>("formulation") = _formulation;
        params.set<std::vector<VariableName>>("nodal_area") = {"nodal_area_" + name()};
        params.set<std::vector<VariableName>>("displacements") = coupled_displacements;
        params.set<BoundaryName>("boundary") = _master;
        params.set<bool>("use_displaced_mesh") = true;

        for (unsigned int i = 0; i < ndisp; ++i)
        {
          std::string name = action_name + "_master_" + Moose::stringify(i);
          params.set<unsigned int>("component") = i;
          params.set<NonlinearVariableName>("variable") = displacements[i];
          _problem->addDiracKernel("ContactMaster", name, params);
        }
      }

      {
        InputParameters params = _factory.getValidParams("SlaveConstraint");
        params.applyParameters(parameters(), {"displacements", "formulation"});
        params.set<std::string>("formulation") = _formulation;
        params.set<std::vector<VariableName>>("nodal_area") = {"nodal_area_" + name()};
        params.set<std::vector<VariableName>>("displacements") = coupled_displacements;
        params.set<BoundaryName>("boundary") = _slave;
        params.set<bool>("use_displaced_mesh") = true;

        for (unsigned int i = 0; i < ndisp; ++i)
        {
          std::string name = action_name + "_slave_" + Moose::stringify(i);
          params.set<unsigned int>("component") = i;
          params.set<NonlinearVariableName>("variable") = displacements[i];
          _problem->addDiracKernel("SlaveConstraint", name, params);
        }
      }
    }
  }
}