You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 &parameters)
    : 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:45:08