void AdaptivityAction::act() { NonlinearSystemBase & system = _problem->getNonlinearSystemBase(); Adaptivity & adapt = _problem->adaptivity(); // we don't need to run mesh modifiers *again* after they ran already during the mesh // splitting process. Adaptivity::init must be called for any adaptivity to work, however, so we // can't just skip it for the useSplit case. if (_app.isUseSplit()) adapt.init(0, 0); else adapt.init(getParam<unsigned int>("steps"), getParam<unsigned int>("initial_adaptivity")); adapt.setErrorEstimator(getParam<MooseEnum>("error_estimator")); adapt.setParam("cycles_per_step", getParam<unsigned int>("cycles_per_step")); adapt.setParam("refine fraction", getParam<Real>("refine_fraction")); adapt.setParam("coarsen fraction", getParam<Real>("coarsen_fraction")); adapt.setParam("max h-level", getParam<unsigned int>("max_h_level")); adapt.setParam("recompute_markers_during_cycles", getParam<bool>("recompute_markers_during_cycles")); adapt.setPrintMeshChanged(getParam<bool>("print_changed_info")); const std::vector<std::string> & weight_names = getParam<std::vector<std::string>>("weight_names"); const std::vector<Real> & weight_values = getParam<std::vector<Real>>("weight_values"); int num_weight_names = weight_names.size(); int num_weight_values = weight_values.size(); if (num_weight_names) { if (num_weight_names != num_weight_values) mooseError("Number of weight_names must be equal to number of weight_values in " "Execution/Adaptivity"); // If weights have been specified then set the default weight to zero std::vector<Real> weights(system.nVariables(), 0); for (int i = 0; i < num_weight_names; i++) { std::string name = weight_names[i]; double value = weight_values[i]; weights[system.getVariable(0, name).number()] = value; } std::vector<FEMNormType> norms(system.nVariables(), H1_SEMINORM); SystemNorm sys_norm(norms, weights); adapt.setErrorNorm(sys_norm); } adapt.setTimeActive(getParam<Real>("start_time"), getParam<Real>("stop_time")); adapt.setInterval(getParam<unsigned int>("interval")); }
void AdaptivityAction::act() { NonlinearSystem & system = _problem->getNonlinearSystem(); Adaptivity & adapt = _problem->adaptivity(); adapt.init(getParam<unsigned int>("steps"), getParam<unsigned int>("initial_adaptivity")); adapt.setErrorEstimator(getParam<MooseEnum>("error_estimator")); adapt.setParam("cycles_per_step", getParam<unsigned int>("cycles_per_step")); adapt.setParam("refine fraction", getParam<Real>("refine_fraction")); adapt.setParam("coarsen fraction", getParam<Real>("coarsen_fraction")); adapt.setParam("max h-level", getParam<unsigned int>("max_h_level")); adapt.setPrintMeshChanged(getParam<bool>("print_changed_info")); const std::vector<std::string> & weight_names = getParam<std::vector<std::string> >("weight_names"); const std::vector<Real> & weight_values = getParam<std::vector<Real> >("weight_values"); int num_weight_names = weight_names.size(); int num_weight_values = weight_values.size(); if (num_weight_names) { if (num_weight_names != num_weight_values) mooseError("Number of weight_names must be equal to number of weight_values in Execution/Adaptivity"); // If weights have been specified then set the default weight to zero std::vector<Real> weights(system.nVariables(),0); for(int i=0;i<num_weight_names;i++) { std::string name = weight_names[i]; double value = weight_values[i]; weights[system.getVariable(0, name).number()] = value; } std::vector<FEMNormType> norms(system.nVariables(), H1_SEMINORM); SystemNorm sys_norm(norms, weights); adapt.setErrorNorm(sys_norm); } adapt.setTimeActive(getParam<Real>("start_time"), getParam<Real>("stop_time")); }