MOOSE中实现LineValueSampler向PostProcessor传值及阈值筛选
MOOSE中基于LineValueSampler的PostProcessor实现修正方案
需求说明
我希望在MOOSE中基于LineValueSampler(VectorPostProcessor)构建一个PostProcessor分析功能:
- LineValueSampler每次迭代输出包含
[variable][id][x][y][z]的.csv文件 - 将该输出传递给PostProcessor,最终生成单个.csv文件
- 在PostProcessor中提取特定
variable值,与阈值比较,当满足|变量值-阈值| < 容差时保存该值
初始代码
neckvalue.h
#ifndef NECKVALUE_H #define NECKVALUE_H #include "GeneralPostprocessor.h" class neckvalue : public GeneralPostprocessor { public: neckvalue(const InputParameters & parameters); static InputParameters validParams(); Real calculateValue(); protected: std::vector<Real> _c_var; const Real _threshold; const Real _tolerance; }; #endif
neckvalue.cpp
#include "neckvalue.h" registerMooseObject("ParrotApp", neckvalue); InputParameters neckvalue::validParams() { InputParameters params = GeneralPostprocessor::validParams(); params.addRequiredParam<Real>("threshold", "Seconda variabile"); params.addRequiredParam<Real>("tolerance", "Terza variabile"); return params; } neckvalue::neckvalue( const InputParameters ¶meters) : GeneralPostprocessor(parameters), _threshold(getParam<Real>("threshold")), _tolerance(getParam<Real>("tolerance")), _c_var(getParam<Real>("c_var")) {} Real neckvalue::calculateValue() { Real value = 0.0; const VectorPostprocessorValue &values = (getVectorPostprocessorValue("NeckLineValueSampler","value")); std::vector<double> c_var = values; for (unsigned int i = 0; i < 100; i++) { if (std::abs(_c_var[i] - _threshold) < _tolerance) { value = c_var[i]; } } return value; }
问题分析与修正方案
存在的问题
- 未声明VectorPostprocessor依赖:未在参数中指定要读取的LineValueSampler实例,直接硬编码名称会导致灵活性缺失,且MOOSE无法处理依赖关系。
- 成员变量类型不匹配:
_c_var是std::vector<Real>类型,但构造函数中尝试用getParam<Real>赋值,类型完全不匹配,会编译报错。 - 硬编码循环次数:循环固定100次,若LineValueSampler的采样点数不足或超过,会导致越界或遗漏数据。
- 命名与注释不规范:类名不符合MOOSE驼峰式命名规范,参数注释使用非中文,可读性差。
修正后的代码
NeckValue.h(修正类名)
#ifndef NECKVALUE_H #define NECKVALUE_H #include "GeneralPostprocessor.h" class NeckValue : public GeneralPostprocessor { public: static InputParameters validParams(); NeckValue(const InputParameters & parameters); Real calculateValue() override; protected: // 存储从LineValueSampler获取的变量值 const VectorPostprocessorValue & _sampled_values; const Real _threshold; const Real _tolerance; }; #endif
NeckValue.cpp
#include "NeckValue.h" #include "libmesh/utility.h" registerMooseObject("ParrotApp", NeckValue); InputParameters NeckValue::validParams() { InputParameters params = GeneralPostprocessor::validParams(); // 添加需要依赖的LineValueSampler名称参数 params.addRequiredParam<VectorPostprocessorName>("line_sampler", "要读取的LineValueSampler实例名称"); params.addRequiredParam<Real>("threshold", "比较用的阈值"); params.addRequiredParam<Real>("tolerance", "容差值"); return params; } NeckValue::NeckValue(const InputParameters & parameters) : GeneralPostprocessor(parameters), // 获取LineValueSampler输出的"value"列数据 _sampled_values(getVectorPostprocessorValue("line_sampler", "value")), _threshold(getParam<Real>("threshold")), _tolerance(getParam<Real>("tolerance")) {} Real NeckValue::calculateValue() { Real result = 0.0; // 遍历所有采样值,找到符合条件的第一个值(或最后一个,根据需求调整) for (Real val : _sampled_values) { if (Utility::absolute_value(val - _threshold) < _tolerance) { result = val; // 若只需要第一个符合条件的值,可在此处break // break; } } return result; }
使用说明
在MOOSE输入文件中配置该PostProcessor时,需指定关联的LineValueSampler实例:
[Postprocessors] [neck_value] type = NeckValue line_sampler = NeckLineValueSampler # 对应你的LineValueSampler名称 threshold = 0.5 tolerance = 0.01 [] [] # 配合Outputs块输出单个CSV文件 [Outputs] csv = true execute_on = TIMESTEP_END []
内容的提问来源于stack exchange,提问作者DvTf
相关产品推荐
相关产品推荐

