From 55ac4bdb3bfa088cd8d3265be2be9aa5ee5882da Mon Sep 17 00:00:00 2001 From: Daniel Schwen Date: Mon, 20 Jan 2020 16:24:08 -0700 Subject: [PATCH] Initial conditions (#401) --- include/userobjects/FFTBufferBase.h | 3 ++ src/userobjects/FFTBufferBase.C | 58 ++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/include/userobjects/FFTBufferBase.h b/include/userobjects/FFTBufferBase.h index b328fe43..89a9e907 100644 --- a/include/userobjects/FFTBufferBase.h +++ b/include/userobjects/FFTBufferBase.h @@ -70,4 +70,7 @@ class FFTBufferBase : public GeneralUserObject /// stride in units of double size std::ptrdiff_t _stride; + + /// optional moose sister variabe (to obtain IC from) + MooseVariable * _moose_variable; }; diff --git a/src/userobjects/FFTBufferBase.C b/src/userobjects/FFTBufferBase.C index 44d77ce6..dbbc6cc2 100644 --- a/src/userobjects/FFTBufferBase.C +++ b/src/userobjects/FFTBufferBase.C @@ -5,6 +5,7 @@ /* Copyright 2017 Battelle Energy Alliance, LLC */ /* ALL RIGHTS RESERVED */ /**********************************************************************/ + #include "FFTBufferBase.h" #include "MooseTypes.h" #include "MyTRIMMesh.h" @@ -14,15 +15,6 @@ #include -// template <> -// InputParameters -// validParams() -// { -// InputParameters params = validParams(); -// params.addClassDescription(""); -// return params; -// } - template InputParameters FFTBufferBase::validParams() @@ -34,8 +26,13 @@ FFTBufferBase::validParams() "grid > 0", "Number of grid cells in each dimension to compute " "the FFT on (can be omitted when using MyTRIMMesh)"); - params.addParam( - "max_h_level", 0, "Further grid refinement to apply when using MyTRIMMesh with adaptivity"); + if (std::is_same::value) + params.addParam( + "moose_variable", "Optional AuxVariable to take the initial condition of the buffer from."); + + // make sure we run the object on initial to apply the initial conditions + params.set("execute_on") = EXEC_INITIAL; + return params; } @@ -45,8 +42,8 @@ FFTBufferBase::FFTBufferBase(const InputParameters & parameters) _mesh(_subproblem.mesh()), _dim(_mesh.dimension()), _cell_volume(1.0), - _buffer_size(1) - + _buffer_size(1), + _moose_variable(nullptr) { // make sure Real is double static_assert( @@ -56,6 +53,12 @@ FFTBufferBase::FFTBufferBase(const InputParameters & parameters) // FFT needs a regular grid of values to operate on if (isParamValid("grid")) { + // cannot specify a corresponding MOOSE Variable when running mesh-less + if (isParamValid("moose_variable")) + paramError("moose_variable", + "You cannot specify a corresponding MOOSE Variable when running mesh-less, i.e. " + "using the 'grid' parameter."); + // if valid use the user-supplied sampling grid _grid = getParam>("grid"); if (_grid.size() != _dim) @@ -72,10 +75,24 @@ FFTBufferBase::FFTBufferBase(const InputParameters & parameters) _grid.push_back(mytrim_mesh->getCellCountInDimension(i)); } - // refine grid by max_h_level powers of two - auto max_h_level = getParam("max_h_level"); - for (auto & count : _grid) - count = count << max_h_level; + // check optional coupled MOOSE variable (only for Real valued buffers) + if (std::is_same::value && isParamValid("moose_variable")) + { + auto name = getParam("moose_variable"); + if (!_subproblem.hasVariable(name)) + paramError("moose_variable", "Variable '", name, "' does not exist."); + + // get variable + _moose_variable = dynamic_cast(&_subproblem.getVariable( + 0, name, Moose::VarKindType::VAR_AUXILIARY, Moose::VarFieldType::VAR_FIELD_STANDARD)); + if (!_moose_variable) + paramError( + "moose_variable", "Variable '", name, "' is not a regular auxiliary field variable."); + if (_moose_variable->order() != 0) + paramError("moose_variable", "Variable '", name, "' needs to have CONSTANT order."); + if (_moose_variable->isNodal()) + paramError("moose_variable", "Variable '", name, "' must be elemental."); + } // get mesh extents and calculate space required and estimate spectrum bins for (unsigned int i = 0; i < _dim; ++i) @@ -98,6 +115,13 @@ FFTBufferBase::FFTBufferBase(const InputParameters & parameters) istride /= sizeof(Real); } +template <> +void +FFTBufferBase::initialize() +{ + mooseInfo("Real valued buffer"); +} + template <> Real * FFTBufferBase::start(std::size_t i)