From fbc9ba73d6d7c2a394c72998be066d066a16b3eb Mon Sep 17 00:00:00 2001 From: Gavin Ridley Date: Mon, 28 Aug 2017 19:24:25 -0400 Subject: [PATCH 1/9] prec action now add postproc, bcs, transf for circulation --- src/actions/PrecursorAction.C | 86 ++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index d625cd6515..789cd923b1 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -48,15 +48,18 @@ validParams() "random initial conditions for the precursors."); params.addParam("prec_scale", "The amount by which the neutron fluxes are scaled."); params.addParam("transient", true, "Whether to run a transient simulation."); - params.addParam( + params.addParam( "init_from_file", false, "Whether to initialize the precursors from a file."); params.addParam("create_vars", true, "Whether this action should create the variables."); + params.addParam("loop_precs", false, "Whether precursors are circulated in salt loop."); params.addParam( "object_suffix", "", "An optional suffix string that can be helpful to avoid object name crashing."); params.addParam>("kernel_block", "Kernel bock can be different from block."); + params.addParam("multi_app", "Multiapp name for looping precursors."); + params.addParam("is_loopapp", "if circulating precursors, whether this is loop app"); return params; } @@ -65,8 +68,16 @@ PrecursorAction::PrecursorAction(const InputParameters & params) _num_precursor_groups(getParam("num_precursor_groups")), _var_name_base(getParam("var_name_base")), _num_groups(getParam("num_groups")), - _object_suffix(getParam("object_suffix")) + _object_suffix(getParam("object_suffix")), + _multi_app(getParam("multi_app")) { + if (getParam("loop_precs")) + { + if (!params.isParamSetByUser("inlet_boundaries")) + mooseError("Looping precursors requires specification of inlet_boundaries."); + if (!params.isParamValid("multi_app")) + mooseError("Looping precursors requires a multiapp that governs the loop."); + } } void @@ -207,6 +218,7 @@ PrecursorAction::act() if (_current_task == "add_bc") { + // OUTFLOW if (getParam("constant_velocity_values")) { InputParameters params = _factory.getValidParams("OutflowBC"); @@ -233,7 +245,38 @@ PrecursorAction::act() std::string kernel_name = "VelocityFunctionOutflowBC_" + var_name + "_" + _object_suffix; _problem->addBoundaryCondition("VelocityFunctionOutflowBC", kernel_name, params); } + // INFLOW + if (getParam("loop_precs")) + { + // this SHOULD work for both constant and nonconstant flows as long as + // nonconstant flows implemented in the Controls module by + // setting values called uu, vv, ww. + if (!getParam("constant_velocity_values")) + mooseError("Variable, looped precursor advection requires that variable" + "velocity has the values uu, vv, ww set through the controls" + "module, NOT simply specifying functions through the" + "precursors block."); + InputParameters params = _factory.getValidParams("PostprocessorInflowBC"); + params.set("variable") = var_name; + params.set>("boundary") = + getParam>("inlet_boundaries"); + params.set("uu") = getParam("u_def"); + params.set("vv") = getParam("v_def"); + params.set("ww") = getParam("w_def"); + params.set("postprocessor") = + "Inlet_SideAverageValue"+ + var_name + "_" + _object_suffix; + + // OK, Alex called it kernel_name despite it being a BC, + // and it doesn't matter, but let's follow suit. + std::string kernel_name = "PostprocessorInflowBC_" + var_name + + "_" + _object_suffix; + _problem->addBoundaryCondition("PostprocessorInflowBC", kernel_name, params); + } + + // fixed concentration input: no use at the moment so commented out // { + // // requires new BC: PostprocessorInflowBC // InputParameters params = _factory.getValidParams("InflowBC"); // params.set("variable") = var_name; // params.set >("boundary") = getParam @@ -269,5 +312,44 @@ PrecursorAction::act() _problem->addInitialCondition("RandomIC", ic_name, params); } } + + if (_current_task == "add_postprocessor" && getParam("loop_precs")) + { + // looping precursors requires connecting outlet of core problem + // to the inlet of the loop subproblem. In addition, the outlet of the + // loop must be connected to the core problem. + std::string postproc_name = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; + InputParameters params = _factory.getValidParams("SideAverageValue"); + params.set("variable") = var_name; + params.set>("boundary") = + getParam>("outlet_boundaries"); + + _problem->addPostprocessor("SideAverageValue", postproc_name, params); + + } + + if (_current_task == "add_transfer" && getParam("loop_precs") && + !getParam("is_loopapp")) + { + // from main app to loop app + { + std::string transfer_name = "toloop_Transfer_" + var_name + "_"+_object_suffix; + InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); + params.set("multi_app") = _multi_app; + params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; + params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; + params.set("direction") = "to_multiapp"; + } + + // from loop app to main app + { + std::string transfer_name = "fromloop_Transfer_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); + params.set("multi_app") = _multi_app; + params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; + params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; + params.set("direction") = "from_multiapp"; + } + } } } From 6169b542a0e7b59f0e1831af0d57db58e3f5abf6 Mon Sep 17 00:00:00 2001 From: Gavin Ridley Date: Tue, 29 Aug 2017 00:44:41 -0400 Subject: [PATCH 2/9] Attempting to set parameter variable with type (NonlinearVariableName) but the parameter already exists --- include/actions/PrecursorAction.h | 3 +++ problems/LOSCA/auto_diff_rho.i | 4 ++++ problems/LOSCA/sub.i | 5 +++++ src/actions/PrecursorAction.C | 2 +- src/base/MoltresApp.C | 2 ++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/actions/PrecursorAction.h b/include/actions/PrecursorAction.h index 86c24b861c..f4d6c4f4ea 100644 --- a/include/actions/PrecursorAction.h +++ b/include/actions/PrecursorAction.h @@ -35,6 +35,9 @@ class PrecursorAction : public AddVariableAction /// optional object name suffix std::string _object_suffix; + + /// name of multi app for precursor circulation + MultiAppName _multi_app; }; template <> diff --git a/problems/LOSCA/auto_diff_rho.i b/problems/LOSCA/auto_diff_rho.i index 47931bf98e..da82dd0258 100644 --- a/problems/LOSCA/auto_diff_rho.i +++ b/problems/LOSCA/auto_diff_rho.i @@ -51,6 +51,10 @@ diri_temp=922 nt_exp_form = false family = MONOMIAL order = CONSTANT + loop_precs = true + multi_app = loopApp + is_loopapp = false + inlet_boundaries = 'fuel_bottoms' [../] [] diff --git a/problems/LOSCA/sub.i b/problems/LOSCA/sub.i index ae68ceb13b..b89b3094e1 100644 --- a/problems/LOSCA/sub.i +++ b/problems/LOSCA/sub.i @@ -41,6 +41,11 @@ diri_temp=922 nt_exp_form = false family = MONOMIAL order = CONSTANT + loop_precs = true + multi_app = loopApp + is_loopapp = true + inlet_boundaries = left + [../] [] diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index 789cd923b1..8520b5c8b6 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -322,7 +322,7 @@ PrecursorAction::act() InputParameters params = _factory.getValidParams("SideAverageValue"); params.set("variable") = var_name; params.set>("boundary") = - getParam>("outlet_boundaries"); + getParam>("outlet_boundaries"); _problem->addPostprocessor("SideAverageValue", postproc_name, params); diff --git a/src/base/MoltresApp.C b/src/base/MoltresApp.C index 4159588e88..5577000b6b 100644 --- a/src/base/MoltresApp.C +++ b/src/base/MoltresApp.C @@ -185,10 +185,12 @@ MoltresApp::associateSyntax(Syntax & syntax, ActionFactory & action_factory) syntax.registerActionSyntax("NtAction", "Nt"); registerAction(PrecursorAction, "add_kernel"); + registerAction(PrecursorAction, "add_postprocessor"); registerAction(PrecursorAction, "add_bc"); registerAction(PrecursorAction, "add_variable"); registerAction(PrecursorAction, "add_ic"); registerAction(PrecursorAction, "add_dg_kernel"); + registerAction(PrecursorAction, "add_transfer"); registerAction(PrecursorAction, "check_copy_nodal_vars"); registerAction(PrecursorAction, "copy_nodal_vars"); registerAction(NtAction, "add_kernel"); From 854c1ca20f9346eda35de42d4c06c93a78025733 Mon Sep 17 00:00:00 2001 From: Gavin Ridley Date: Tue, 29 Aug 2017 00:48:36 -0400 Subject: [PATCH 3/9] removed inheriting _multi_app in PrecursorAction --- src/actions/PrecursorAction.C | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index 8520b5c8b6..8f2ac4f3b6 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -68,8 +68,7 @@ PrecursorAction::PrecursorAction(const InputParameters & params) _num_precursor_groups(getParam("num_precursor_groups")), _var_name_base(getParam("var_name_base")), _num_groups(getParam("num_groups")), - _object_suffix(getParam("object_suffix")), - _multi_app(getParam("multi_app")) + _object_suffix(getParam("object_suffix")) { if (getParam("loop_precs")) { @@ -320,7 +319,7 @@ PrecursorAction::act() // loop must be connected to the core problem. std::string postproc_name = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; InputParameters params = _factory.getValidParams("SideAverageValue"); - params.set("variable") = var_name; + params.set("variable") = var_name; params.set>("boundary") = getParam>("outlet_boundaries"); @@ -335,7 +334,7 @@ PrecursorAction::act() { std::string transfer_name = "toloop_Transfer_" + var_name + "_"+_object_suffix; InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); - params.set("multi_app") = _multi_app; + params.set("multi_app") = getParam("multi_app"); params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("direction") = "to_multiapp"; @@ -345,7 +344,7 @@ PrecursorAction::act() { std::string transfer_name = "fromloop_Transfer_" + var_name + "_" + _object_suffix; InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); - params.set("multi_app") = _multi_app; + params.set("multi_app") = getParam("multi_app"); params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("direction") = "from_multiapp"; From b2d0e25b965df38e287035ae68770c9fe2158929 Mon Sep 17 00:00:00 2001 From: Gavin Ridley Date: Wed, 30 Aug 2017 12:35:15 -0400 Subject: [PATCH 4/9] add task dependency to MoltresApp --- src/base/MoltresApp.C | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/base/MoltresApp.C b/src/base/MoltresApp.C index 5577000b6b..a122a28bde 100644 --- a/src/base/MoltresApp.C +++ b/src/base/MoltresApp.C @@ -193,6 +193,8 @@ MoltresApp::associateSyntax(Syntax & syntax, ActionFactory & action_factory) registerAction(PrecursorAction, "add_transfer"); registerAction(PrecursorAction, "check_copy_nodal_vars"); registerAction(PrecursorAction, "copy_nodal_vars"); + addTaskDependency("add_bc", "add_postprocessor"); + addTaskDependency("add_transfer", "add_postprocessor"); registerAction(NtAction, "add_kernel"); registerAction(NtAction, "add_bc"); registerAction(NtAction, "add_variable"); From 3df0910cf282e3c0c70c1eaa2eb48767d936f142 Mon Sep 17 00:00:00 2001 From: Gavin Ridley Date: Wed, 30 Aug 2017 15:48:03 -0400 Subject: [PATCH 5/9] circulating precursors now works --- include/actions/PrecursorAction.h | 3 --- problems/LOSCA/HXFailure/auto_diff_rho.i | 5 ++++ problems/LOSCA/HXFailure/sub.i | 4 +++ src/actions/PrecursorAction.C | 32 ++++++++++++++++++------ src/base/MoltresApp.C | 2 -- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/include/actions/PrecursorAction.h b/include/actions/PrecursorAction.h index f4d6c4f4ea..86c24b861c 100644 --- a/include/actions/PrecursorAction.h +++ b/include/actions/PrecursorAction.h @@ -35,9 +35,6 @@ class PrecursorAction : public AddVariableAction /// optional object name suffix std::string _object_suffix; - - /// name of multi app for precursor circulation - MultiAppName _multi_app; }; template <> diff --git a/problems/LOSCA/HXFailure/auto_diff_rho.i b/problems/LOSCA/HXFailure/auto_diff_rho.i index be6eee50bb..a99f9e2c2b 100644 --- a/problems/LOSCA/HXFailure/auto_diff_rho.i +++ b/problems/LOSCA/HXFailure/auto_diff_rho.i @@ -55,6 +55,11 @@ diri_temp=922 family = MONOMIAL order = CONSTANT init_from_file = true + loop_precs = true + multi_app = loopApp + is_loopapp = false + inlet_boundaries = 'fuel_bottoms' + [../] [] diff --git a/problems/LOSCA/HXFailure/sub.i b/problems/LOSCA/HXFailure/sub.i index 44a65e6829..b9ba5a203d 100644 --- a/problems/LOSCA/HXFailure/sub.i +++ b/problems/LOSCA/HXFailure/sub.i @@ -40,6 +40,10 @@ diri_temp=922 family = MONOMIAL order = CONSTANT init_from_file = true + loop_precs = true + multi_app = loopApp + is_loopapp = true + inlet_boundaries = left [../] [] diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index 8f2ac4f3b6..35abf0a10b 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -263,7 +263,7 @@ PrecursorAction::act() params.set("vv") = getParam("v_def"); params.set("ww") = getParam("w_def"); params.set("postprocessor") = - "Inlet_SideAverageValue"+ + "Inlet_SideAverageValue_"+ var_name + "_" + _object_suffix; // OK, Alex called it kernel_name despite it being a BC, @@ -317,13 +317,24 @@ PrecursorAction::act() // looping precursors requires connecting outlet of core problem // to the inlet of the loop subproblem. In addition, the outlet of the // loop must be connected to the core problem. - std::string postproc_name = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; - InputParameters params = _factory.getValidParams("SideAverageValue"); - params.set("variable") = var_name; - params.set>("boundary") = - getParam>("outlet_boundaries"); - - _problem->addPostprocessor("SideAverageValue", postproc_name, params); + { + std::string postproc_name = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; + InputParameters params = _factory.getValidParams("SideAverageValue"); + std::vector varvec(1); + varvec[0] = var_name; + params.set>("variable") = varvec; + params.set>("boundary") = + getParam>("outlet_boundaries"); + + _problem->addPostprocessor("SideAverageValue", postproc_name, params); + } + { + std::string postproc_name = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; + InputParameters params = _factory.getValidParams("Receiver"); + params.set("execute_on")= "timestep_begin"; + + _problem->addPostprocessor("Receiver", postproc_name, params); + } } @@ -338,6 +349,8 @@ PrecursorAction::act() params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("direction") = "to_multiapp"; + + _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); } // from loop app to main app @@ -348,6 +361,9 @@ PrecursorAction::act() params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; params.set("direction") = "from_multiapp"; + params.set("reduction_type") = "average"; + + _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); } } } diff --git a/src/base/MoltresApp.C b/src/base/MoltresApp.C index a122a28bde..5577000b6b 100644 --- a/src/base/MoltresApp.C +++ b/src/base/MoltresApp.C @@ -193,8 +193,6 @@ MoltresApp::associateSyntax(Syntax & syntax, ActionFactory & action_factory) registerAction(PrecursorAction, "add_transfer"); registerAction(PrecursorAction, "check_copy_nodal_vars"); registerAction(PrecursorAction, "copy_nodal_vars"); - addTaskDependency("add_bc", "add_postprocessor"); - addTaskDependency("add_transfer", "add_postprocessor"); registerAction(NtAction, "add_kernel"); registerAction(NtAction, "add_bc"); registerAction(NtAction, "add_variable"); From 0cb971e9d16398a42d861940feefe672a2a2a171 Mon Sep 17 00:00:00 2001 From: Gavin Ridley Date: Wed, 30 Aug 2017 16:32:25 -0400 Subject: [PATCH 6/9] PR comments considered --- problems/LOSCA/HXFailure/auto_diff_rho.i | 1 - src/actions/PrecursorAction.C | 17 +---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/problems/LOSCA/HXFailure/auto_diff_rho.i b/problems/LOSCA/HXFailure/auto_diff_rho.i index a99f9e2c2b..788a78aacd 100644 --- a/problems/LOSCA/HXFailure/auto_diff_rho.i +++ b/problems/LOSCA/HXFailure/auto_diff_rho.i @@ -59,7 +59,6 @@ diri_temp=922 multi_app = loopApp is_loopapp = false inlet_boundaries = 'fuel_bottoms' - [../] [] diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index 35abf0a10b..4d14cd1a58 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -247,7 +247,7 @@ PrecursorAction::act() // INFLOW if (getParam("loop_precs")) { - // this SHOULD work for both constant and nonconstant flows as long as + // this will work for both constant and nonconstant flows as long as // nonconstant flows implemented in the Controls module by // setting values called uu, vv, ww. if (!getParam("constant_velocity_values")) @@ -273,21 +273,6 @@ PrecursorAction::act() _problem->addBoundaryCondition("PostprocessorInflowBC", kernel_name, params); } - // fixed concentration input: no use at the moment so commented out - // { - // // requires new BC: PostprocessorInflowBC - // InputParameters params = _factory.getValidParams("InflowBC"); - // params.set("variable") = var_name; - // params.set >("boundary") = getParam - // >("inlet_boundaries"); - // RealVectorValue vel = {getParam("u_def"), getParam("v_def"), - // getParam("w_def")}; - // params.set("velocity") = vel; - // params.set("inlet_conc") = 1.; - - // std::string kernel_name = "InflowBC_" + var_name; - // _problem->addBoundaryCondition("InflowBC", kernel_name, params); - // } } // Set up ICs From 5497b6c77ce7109384a6b07af20f0093c9ce111f Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Tue, 5 Sep 2017 10:58:38 -0600 Subject: [PATCH 7/9] Change kernel_name to bc_name where appropriate and clang-format. --- src/actions/PrecursorAction.C | 148 +++++++++++++++++----------------- 1 file changed, 73 insertions(+), 75 deletions(-) diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index 4d14cd1a58..c829f71df6 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -48,7 +48,7 @@ validParams() "random initial conditions for the precursors."); params.addParam("prec_scale", "The amount by which the neutron fluxes are scaled."); params.addParam("transient", true, "Whether to run a transient simulation."); - params.addParam( + params.addParam( "init_from_file", false, "Whether to initialize the precursors from a file."); params.addParam("create_vars", true, "Whether this action should create the variables."); params.addParam("loop_precs", false, "Whether precursors are circulated in salt loop."); @@ -73,9 +73,9 @@ PrecursorAction::PrecursorAction(const InputParameters & params) if (getParam("loop_precs")) { if (!params.isParamSetByUser("inlet_boundaries")) - mooseError("Looping precursors requires specification of inlet_boundaries."); + mooseError("Looping precursors requires specification of inlet_boundaries."); if (!params.isParamValid("multi_app")) - mooseError("Looping precursors requires a multiapp that governs the loop."); + mooseError("Looping precursors requires a multiapp that governs the loop."); } } @@ -228,8 +228,8 @@ PrecursorAction::act() getParam("u_def"), getParam("v_def"), getParam("w_def")}; params.set("velocity") = vel; - std::string kernel_name = "OutflowBC_" + var_name + "_" + _object_suffix; - _problem->addBoundaryCondition("OutflowBC", kernel_name, params); + std::string bc_name = "OutflowBC_" + var_name + "_" + _object_suffix; + _problem->addBoundaryCondition("OutflowBC", bc_name, params); } else { @@ -241,38 +241,33 @@ PrecursorAction::act() params.set("vel_y_func") = getParam("v_func"); params.set("vel_z_func") = getParam("w_func"); - std::string kernel_name = "VelocityFunctionOutflowBC_" + var_name + "_" + _object_suffix; - _problem->addBoundaryCondition("VelocityFunctionOutflowBC", kernel_name, params); + std::string bc_name = "VelocityFunctionOutflowBC_" + var_name + "_" + _object_suffix; + _problem->addBoundaryCondition("VelocityFunctionOutflowBC", bc_name, params); } // INFLOW if (getParam("loop_precs")) { - // this will work for both constant and nonconstant flows as long as - // nonconstant flows implemented in the Controls module by - // setting values called uu, vv, ww. - if (!getParam("constant_velocity_values")) - mooseError("Variable, looped precursor advection requires that variable" - "velocity has the values uu, vv, ww set through the controls" - "module, NOT simply specifying functions through the" - "precursors block."); - InputParameters params = _factory.getValidParams("PostprocessorInflowBC"); - params.set("variable") = var_name; - params.set>("boundary") = - getParam>("inlet_boundaries"); - params.set("uu") = getParam("u_def"); - params.set("vv") = getParam("v_def"); - params.set("ww") = getParam("w_def"); - params.set("postprocessor") = - "Inlet_SideAverageValue_"+ - var_name + "_" + _object_suffix; + // this will work for both constant and nonconstant flows as long as + // nonconstant flows implemented in the Controls module by + // setting values called uu, vv, ww. + if (!getParam("constant_velocity_values")) + mooseError("Variable, looped precursor advection requires that variable" + "velocity has the values uu, vv, ww set through the controls" + "module, NOT simply specifying functions through the" + "precursors block."); + InputParameters params = _factory.getValidParams("PostprocessorInflowBC"); + params.set("variable") = var_name; + params.set>("boundary") = + getParam>("inlet_boundaries"); + params.set("uu") = getParam("u_def"); + params.set("vv") = getParam("v_def"); + params.set("ww") = getParam("w_def"); + params.set("postprocessor") = + "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; - // OK, Alex called it kernel_name despite it being a BC, - // and it doesn't matter, but let's follow suit. - std::string kernel_name = "PostprocessorInflowBC_" + var_name + - "_" + _object_suffix; - _problem->addBoundaryCondition("PostprocessorInflowBC", kernel_name, params); + std::string bc_name = "PostprocessorInflowBC_" + var_name + "_" + _object_suffix; + _problem->addBoundaryCondition("PostprocessorInflowBC", bc_name, params); } - } // Set up ICs @@ -299,57 +294,60 @@ PrecursorAction::act() if (_current_task == "add_postprocessor" && getParam("loop_precs")) { - // looping precursors requires connecting outlet of core problem - // to the inlet of the loop subproblem. In addition, the outlet of the - // loop must be connected to the core problem. - { - std::string postproc_name = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; - InputParameters params = _factory.getValidParams("SideAverageValue"); - std::vector varvec(1); - varvec[0] = var_name; - params.set>("variable") = varvec; - params.set>("boundary") = - getParam>("outlet_boundaries"); - - _problem->addPostprocessor("SideAverageValue", postproc_name, params); - } - { - std::string postproc_name = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; - InputParameters params = _factory.getValidParams("Receiver"); - params.set("execute_on")= "timestep_begin"; - - _problem->addPostprocessor("Receiver", postproc_name, params); - } - + // looping precursors requires connecting outlet of core problem + // to the inlet of the loop subproblem. In addition, the outlet of the + // loop must be connected to the core problem. + { + std::string postproc_name = "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("SideAverageValue"); + std::vector varvec(1); + varvec[0] = var_name; + params.set>("variable") = varvec; + params.set>("boundary") = + getParam>("outlet_boundaries"); + + _problem->addPostprocessor("SideAverageValue", postproc_name, params); + } + { + std::string postproc_name = "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("Receiver"); + params.set("execute_on") = "timestep_begin"; + + _problem->addPostprocessor("Receiver", postproc_name, params); + } } if (_current_task == "add_transfer" && getParam("loop_precs") && - !getParam("is_loopapp")) + !getParam("is_loopapp")) { - // from main app to loop app - { - std::string transfer_name = "toloop_Transfer_" + var_name + "_"+_object_suffix; - InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); - params.set("multi_app") = getParam("multi_app"); - params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; - params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; - params.set("direction") = "to_multiapp"; + // from main app to loop app + { + std::string transfer_name = "toloop_Transfer_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); + params.set("multi_app") = getParam("multi_app"); + params.set("from_postprocessor") = + "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("to_postprocessor") = + "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("direction") = "to_multiapp"; - _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); - } + _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); + } - // from loop app to main app - { - std::string transfer_name = "fromloop_Transfer_" + var_name + "_" + _object_suffix; - InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); - params.set("multi_app") = getParam("multi_app"); - params.set("from_postprocessor") = "Outlet_SideAverageValue_"+var_name+"_"+_object_suffix; - params.set("to_postprocessor") = "Inlet_SideAverageValue_"+var_name+"_"+_object_suffix; - params.set("direction") = "from_multiapp"; - params.set("reduction_type") = "average"; + // from loop app to main app + { + std::string transfer_name = "fromloop_Transfer_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); + params.set("multi_app") = getParam("multi_app"); + params.set("from_postprocessor") = + "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("to_postprocessor") = + "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("direction") = "from_multiapp"; + params.set("reduction_type") = "average"; - _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); - } + _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); + } } } } From 2f25b02d3a5235ee11452ee8635ce7213fdd0abf Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Tue, 5 Sep 2017 11:29:51 -0600 Subject: [PATCH 8/9] Split main act function into pieces. --- include/actions/PrecursorAction.h | 6 + src/actions/PrecursorAction.C | 476 +++++++++++++++--------------- 2 files changed, 252 insertions(+), 230 deletions(-) diff --git a/include/actions/PrecursorAction.h b/include/actions/PrecursorAction.h index 86c24b861c..05304aa8da 100644 --- a/include/actions/PrecursorAction.h +++ b/include/actions/PrecursorAction.h @@ -22,6 +22,12 @@ class PrecursorAction : public AddVariableAction PrecursorAction(const InputParameters & params); virtual void act(); + virtual void kernelAct(const unsigned & op, const std::string & var_name); + virtual void bcAct(const std::string & var_name); + virtual void dgKernelAct(const std::string & var_name); + virtual void icAct(const std::string & var_name); + virtual void postAct(const std::string & var_name); + virtual void transferAct(const std::string & var_name); protected: /// number of precursor groups diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index c829f71df6..ebc437c8ce 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -88,9 +88,7 @@ PrecursorAction::act() if (getParam("create_vars")) { - // // See whether we want to use an old solution - // if (getParam("init_from_file")) { if (_current_task == "check_copy_nodal_vars") @@ -103,251 +101,269 @@ PrecursorAction::act() } } - // // Create variable names - // - if (_current_task == "add_variable") addVariable(var_name); } + // kernels if (_current_task == "add_kernel") - { - // Set up PrecursorSource kernels - - { - InputParameters params = _factory.getValidParams("PrecursorSource"); - params.set("variable") = var_name; - params.set("num_groups") = _num_groups; - params.set("precursor_group_number") = op; - std::vector include = {"temperature", "group_fluxes"}; - params.applySpecificParameters(parameters(), include); - if (isParamValid("kernel_block")) - params.set>("block") = - getParam>("kernel_block"); - else if (isParamValid("block")) - params.set>("block") = - getParam>("block"); - params.set("use_exp_form") = getParam("nt_exp_form"); - - std::string kernel_name = "PrecursorSource_" + var_name + "_" + _object_suffix; - _problem->addKernel("PrecursorSource", kernel_name, params); - } - - // - // Set up PrecursorDecay kernels - // - - { - InputParameters params = _factory.getValidParams("PrecursorDecay"); - params.set("variable") = var_name; - params.set("precursor_group_number") = op; - std::vector include = {"temperature"}; - params.applySpecificParameters(parameters(), include); - if (isParamValid("kernel_block")) - params.set>("block") = - getParam>("kernel_block"); - else if (isParamValid("block")) - params.set>("block") = - getParam>("block"); - params.set("use_exp_form") = false; - - std::string kernel_name = "PrecursorDecay_" + var_name + "_" + _object_suffix; - _problem->addKernel("PrecursorDecay", kernel_name, params); - } - - // - // Set up TimeDerivative kernels - // - if (getParam("transient")) - { - InputParameters params = _factory.getValidParams("ScalarTransportTimeDerivative"); - params.set("variable") = var_name; - params.set("implicit") = true; - if (isParamValid("kernel_block")) - params.set>("block") = - getParam>("kernel_block"); - else if (isParamValid("block")) - params.set>("block") = - getParam>("block"); - params.set("use_exp_form") = false; - - std::string kernel_name = - "ScalarTransportTimeDerivative_" + var_name + "_" + _object_suffix; - _problem->addKernel("ScalarTransportTimeDerivative", kernel_name, params); - } - } + kernelAct(op, var_name); + // dg kernels if (_current_task == "add_dg_kernel") - { - if (getParam("constant_velocity_values")) - { - InputParameters params = _factory.getValidParams("DGConvection"); - params.set("variable") = var_name; - if (isParamValid("kernel_block")) - params.set>("block") = - getParam>("kernel_block"); - else if (isParamValid("block")) - params.set>("block") = - getParam>("block"); - RealVectorValue vel = { - getParam("u_def"), getParam("v_def"), getParam("w_def")}; - params.set("velocity") = vel; - - std::string kernel_name = "DGConvection_" + var_name + "_" + _object_suffix; - _problem->addDGKernel("DGConvection", kernel_name, params); - } - else - { - InputParameters params = _factory.getValidParams("DGFunctionConvection"); - params.set("variable") = var_name; - if (isParamValid("kernel_block")) - params.set>("block") = - getParam>("kernel_block"); - else if (isParamValid("block")) - params.set>("block") = - getParam>("block"); - params.set("vel_x_func") = getParam("u_func"); - params.set("vel_y_func") = getParam("v_func"); - params.set("vel_z_func") = getParam("w_func"); - std::string kernel_name = "DGFunctionConvection_" + var_name + "_" + _object_suffix; - _problem->addDGKernel("DGFunctionConvection", kernel_name, params); - } - } + dgKernelAct(var_name); + // bcs if (_current_task == "add_bc") - { - // OUTFLOW - if (getParam("constant_velocity_values")) - { - InputParameters params = _factory.getValidParams("OutflowBC"); - params.set("variable") = var_name; - params.set>("boundary") = - getParam>("outlet_boundaries"); - RealVectorValue vel = { - getParam("u_def"), getParam("v_def"), getParam("w_def")}; - params.set("velocity") = vel; - - std::string bc_name = "OutflowBC_" + var_name + "_" + _object_suffix; - _problem->addBoundaryCondition("OutflowBC", bc_name, params); - } - else - { - InputParameters params = _factory.getValidParams("VelocityFunctionOutflowBC"); - params.set("variable") = var_name; - params.set>("boundary") = - getParam>("outlet_boundaries"); - params.set("vel_x_func") = getParam("u_func"); - params.set("vel_y_func") = getParam("v_func"); - params.set("vel_z_func") = getParam("w_func"); - - std::string bc_name = "VelocityFunctionOutflowBC_" + var_name + "_" + _object_suffix; - _problem->addBoundaryCondition("VelocityFunctionOutflowBC", bc_name, params); - } - // INFLOW - if (getParam("loop_precs")) - { - // this will work for both constant and nonconstant flows as long as - // nonconstant flows implemented in the Controls module by - // setting values called uu, vv, ww. - if (!getParam("constant_velocity_values")) - mooseError("Variable, looped precursor advection requires that variable" - "velocity has the values uu, vv, ww set through the controls" - "module, NOT simply specifying functions through the" - "precursors block."); - InputParameters params = _factory.getValidParams("PostprocessorInflowBC"); - params.set("variable") = var_name; - params.set>("boundary") = - getParam>("inlet_boundaries"); - params.set("uu") = getParam("u_def"); - params.set("vv") = getParam("v_def"); - params.set("ww") = getParam("w_def"); - params.set("postprocessor") = - "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; - - std::string bc_name = "PostprocessorInflowBC_" + var_name + "_" + _object_suffix; - _problem->addBoundaryCondition("PostprocessorInflowBC", bc_name, params); - } - } - - // Set up ICs + bcAct(var_name); + // ics if (_current_task == "add_ic" && !getParam("init_from_file")) - { - if (getParam("jac_test")) - { - InputParameters params = _factory.getValidParams("RandomIC"); - params.set("variable") = var_name; - if (isParamValid("kernel_block")) - params.set>("block") = - getParam>("kernel_block"); - else if (isParamValid("block")) - params.set>("block") = - getParam>("block"); - params.set("min") = 0; - params.set("max") = 1; - - std::string ic_name = "RandomIC_" + var_name; - _problem->addInitialCondition("RandomIC", ic_name, params); - } - } + icAct(var_name); + // postprocessors if (_current_task == "add_postprocessor" && getParam("loop_precs")) - { - // looping precursors requires connecting outlet of core problem - // to the inlet of the loop subproblem. In addition, the outlet of the - // loop must be connected to the core problem. - { - std::string postproc_name = "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; - InputParameters params = _factory.getValidParams("SideAverageValue"); - std::vector varvec(1); - varvec[0] = var_name; - params.set>("variable") = varvec; - params.set>("boundary") = - getParam>("outlet_boundaries"); - - _problem->addPostprocessor("SideAverageValue", postproc_name, params); - } - { - std::string postproc_name = "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; - InputParameters params = _factory.getValidParams("Receiver"); - params.set("execute_on") = "timestep_begin"; - - _problem->addPostprocessor("Receiver", postproc_name, params); - } - } + postAct(var_name); + // transfers if (_current_task == "add_transfer" && getParam("loop_precs") && !getParam("is_loopapp")) - { - // from main app to loop app - { - std::string transfer_name = "toloop_Transfer_" + var_name + "_" + _object_suffix; - InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); - params.set("multi_app") = getParam("multi_app"); - params.set("from_postprocessor") = - "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; - params.set("to_postprocessor") = - "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; - params.set("direction") = "to_multiapp"; - - _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); - } + transferAct(var_name); + } +} - // from loop app to main app - { - std::string transfer_name = "fromloop_Transfer_" + var_name + "_" + _object_suffix; - InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); - params.set("multi_app") = getParam("multi_app"); - params.set("from_postprocessor") = - "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; - params.set("to_postprocessor") = - "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; - params.set("direction") = "from_multiapp"; - params.set("reduction_type") = "average"; - - _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); - } - } +void +PrecursorAction::kernelAct(const unsigned & op, const std::string & var_name) +{ + // Set up PrecursorSource kernels + { + InputParameters params = _factory.getValidParams("PrecursorSource"); + params.set("variable") = var_name; + params.set("num_groups") = _num_groups; + params.set("precursor_group_number") = op; + std::vector include = {"temperature", "group_fluxes"}; + params.applySpecificParameters(parameters(), include); + if (isParamValid("kernel_block")) + params.set>("block") = + getParam>("kernel_block"); + else if (isParamValid("block")) + params.set>("block") = + getParam>("block"); + params.set("use_exp_form") = getParam("nt_exp_form"); + + std::string kernel_name = "PrecursorSource_" + var_name + "_" + _object_suffix; + _problem->addKernel("PrecursorSource", kernel_name, params); + } + + // Set up PrecursorDecay kernels + { + InputParameters params = _factory.getValidParams("PrecursorDecay"); + params.set("variable") = var_name; + params.set("precursor_group_number") = op; + std::vector include = {"temperature"}; + params.applySpecificParameters(parameters(), include); + if (isParamValid("kernel_block")) + params.set>("block") = + getParam>("kernel_block"); + else if (isParamValid("block")) + params.set>("block") = + getParam>("block"); + params.set("use_exp_form") = false; + + std::string kernel_name = "PrecursorDecay_" + var_name + "_" + _object_suffix; + _problem->addKernel("PrecursorDecay", kernel_name, params); + } + + // Set up TimeDerivative kernels + if (getParam("transient")) + { + InputParameters params = _factory.getValidParams("ScalarTransportTimeDerivative"); + params.set("variable") = var_name; + params.set("implicit") = true; + if (isParamValid("kernel_block")) + params.set>("block") = + getParam>("kernel_block"); + else if (isParamValid("block")) + params.set>("block") = + getParam>("block"); + params.set("use_exp_form") = false; + + std::string kernel_name = "ScalarTransportTimeDerivative_" + var_name + "_" + _object_suffix; + _problem->addKernel("ScalarTransportTimeDerivative", kernel_name, params); + } +} + +void +PrecursorAction::dgKernelAct(const std::string & var_name) +{ + if (getParam("constant_velocity_values")) + { + InputParameters params = _factory.getValidParams("DGConvection"); + params.set("variable") = var_name; + if (isParamValid("kernel_block")) + params.set>("block") = + getParam>("kernel_block"); + else if (isParamValid("block")) + params.set>("block") = + getParam>("block"); + RealVectorValue vel = { + getParam("u_def"), getParam("v_def"), getParam("w_def")}; + params.set("velocity") = vel; + + std::string kernel_name = "DGConvection_" + var_name + "_" + _object_suffix; + _problem->addDGKernel("DGConvection", kernel_name, params); + } + else + { + InputParameters params = _factory.getValidParams("DGFunctionConvection"); + params.set("variable") = var_name; + if (isParamValid("kernel_block")) + params.set>("block") = + getParam>("kernel_block"); + else if (isParamValid("block")) + params.set>("block") = + getParam>("block"); + params.set("vel_x_func") = getParam("u_func"); + params.set("vel_y_func") = getParam("v_func"); + params.set("vel_z_func") = getParam("w_func"); + std::string kernel_name = "DGFunctionConvection_" + var_name + "_" + _object_suffix; + _problem->addDGKernel("DGFunctionConvection", kernel_name, params); + } +} + +void +PrecursorAction::bcAct(const std::string & var_name) +{ + // OUTFLOW + if (getParam("constant_velocity_values")) + { + InputParameters params = _factory.getValidParams("OutflowBC"); + params.set("variable") = var_name; + params.set>("boundary") = + getParam>("outlet_boundaries"); + RealVectorValue vel = { + getParam("u_def"), getParam("v_def"), getParam("w_def")}; + params.set("velocity") = vel; + + std::string bc_name = "OutflowBC_" + var_name + "_" + _object_suffix; + _problem->addBoundaryCondition("OutflowBC", bc_name, params); + } + else + { + InputParameters params = _factory.getValidParams("VelocityFunctionOutflowBC"); + params.set("variable") = var_name; + params.set>("boundary") = + getParam>("outlet_boundaries"); + params.set("vel_x_func") = getParam("u_func"); + params.set("vel_y_func") = getParam("v_func"); + params.set("vel_z_func") = getParam("w_func"); + + std::string bc_name = "VelocityFunctionOutflowBC_" + var_name + "_" + _object_suffix; + _problem->addBoundaryCondition("VelocityFunctionOutflowBC", bc_name, params); + } + // INFLOW + if (getParam("loop_precs")) + { + // this will work for both constant and nonconstant flows as long as + // nonconstant flows implemented in the Controls module by + // setting values called uu, vv, ww. + if (!getParam("constant_velocity_values")) + mooseError("Variable, looped precursor advection requires that variable" + "velocity has the values uu, vv, ww set through the controls" + "module, NOT simply specifying functions through the" + "precursors block."); + InputParameters params = _factory.getValidParams("PostprocessorInflowBC"); + params.set("variable") = var_name; + params.set>("boundary") = + getParam>("inlet_boundaries"); + params.set("uu") = getParam("u_def"); + params.set("vv") = getParam("v_def"); + params.set("ww") = getParam("w_def"); + params.set("postprocessor") = + "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; + + std::string bc_name = "PostprocessorInflowBC_" + var_name + "_" + _object_suffix; + _problem->addBoundaryCondition("PostprocessorInflowBC", bc_name, params); + } +} + +void +PrecursorAction::icAct(const std::string & var_name) +{ + if (getParam("jac_test")) + { + InputParameters params = _factory.getValidParams("RandomIC"); + params.set("variable") = var_name; + if (isParamValid("kernel_block")) + params.set>("block") = + getParam>("kernel_block"); + else if (isParamValid("block")) + params.set>("block") = + getParam>("block"); + params.set("min") = 0; + params.set("max") = 1; + + std::string ic_name = "RandomIC_" + var_name; + _problem->addInitialCondition("RandomIC", ic_name, params); + } +} + +void +PrecursorAction::postAct(const std::string & var_name) +{ + // looping precursors requires connecting outlet of core problem + // to the inlet of the loop subproblem. In addition, the outlet of the + // loop must be connected to the core problem. + { + std::string postproc_name = "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("SideAverageValue"); + std::vector varvec(1); + varvec[0] = var_name; + params.set>("variable") = varvec; + params.set>("boundary") = + getParam>("outlet_boundaries"); + + _problem->addPostprocessor("SideAverageValue", postproc_name, params); + } + { + std::string postproc_name = "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("Receiver"); + params.set("execute_on") = "timestep_begin"; + + _problem->addPostprocessor("Receiver", postproc_name, params); + } +} + +void +PrecursorAction::transferAct(const std::string & var_name) +{ + // from main app to loop app + { + std::string transfer_name = "toloop_Transfer_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); + params.set("multi_app") = getParam("multi_app"); + params.set("from_postprocessor") = + "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("to_postprocessor") = + "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("direction") = "to_multiapp"; + + _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); + } + + // from loop app to main app + { + std::string transfer_name = "fromloop_Transfer_" + var_name + "_" + _object_suffix; + InputParameters params = _factory.getValidParams("MultiAppPostprocessorTransfer"); + params.set("multi_app") = getParam("multi_app"); + params.set("from_postprocessor") = + "Outlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("to_postprocessor") = + "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; + params.set("direction") = "from_multiapp"; + params.set("reduction_type") = "average"; + + _problem->addTransfer("MultiAppPostprocessorTransfer", transfer_name, params); } } From 8c29473542b3f2c552cb9a09c7fcf891f2cc06bd Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Wed, 6 Sep 2017 09:31:28 -0600 Subject: [PATCH 9/9] Remove intlet and outlet averages from outputs. --- src/actions/PrecursorAction.C | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/actions/PrecursorAction.C b/src/actions/PrecursorAction.C index ebc437c8ce..0cc0e38c9e 100644 --- a/src/actions/PrecursorAction.C +++ b/src/actions/PrecursorAction.C @@ -323,6 +323,7 @@ PrecursorAction::postAct(const std::string & var_name) params.set>("variable") = varvec; params.set>("boundary") = getParam>("outlet_boundaries"); + params.set>("outputs") = {"none"}; _problem->addPostprocessor("SideAverageValue", postproc_name, params); } @@ -330,6 +331,7 @@ PrecursorAction::postAct(const std::string & var_name) std::string postproc_name = "Inlet_SideAverageValue_" + var_name + "_" + _object_suffix; InputParameters params = _factory.getValidParams("Receiver"); params.set("execute_on") = "timestep_begin"; + params.set>("outputs") = {"none"}; _problem->addPostprocessor("Receiver", postproc_name, params); }