diff --git a/include/userobjects/FFTBufferBase.h b/include/userobjects/FFTBufferBase.h new file mode 100644 index 00000000..69bca655 --- /dev/null +++ b/include/userobjects/FFTBufferBase.h @@ -0,0 +1,63 @@ +/**********************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */ +/* */ +/* Copyright 2017 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/**********************************************************************/ + +#pragma once + +#include "GeneralUserObject.h" + +template +class FFTBufferBase; + +/** + * + */ +template +class FFTBufferBase : public GeneralUserObject +{ +public: + FFTBufferBase(const InputParameters & parameters); + + virtual void initialize() {} + virtual void execute() {} + virtual void finalize() {} + + // transforms + virtual void forward() = 0; + virtual void backward() = 0; + + // data access + const T & operator[](std::size_t i) const { return _buffer[i]; } + T & operator[](std::size_t i) { return _buffer[i]; } + + // size buffer + void resize(); + void resize(std::size_t ni); + void resize(std::size_t ni, std::size_t nj); + void resize(std::size_t ni, std::size_t nj, std::size_t nk); + +protected: + /// get the addres of the first data element of the ith object in the bufefr + Real * start(std::size_t i); + + /// get the number of transforms required for type T + std::size_t howMany() const; + + std::size_t _dim; + + std::size_t _ni; + std::size_t _nj; + std::size_t _nk; + + std::vector _buffer; + + /// pointer to the start of the data + Real * _start; + + /// stride in units of double size + std::ptrdiff_t _stride; +}; diff --git a/src/userobjects/FFTBufferBase.C b/src/userobjects/FFTBufferBase.C new file mode 100644 index 00000000..6f7cbce8 --- /dev/null +++ b/src/userobjects/FFTBufferBase.C @@ -0,0 +1,152 @@ +/**********************************************************************/ +/* DO NOT MODIFY THIS HEADER */ +/* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */ +/* */ +/* Copyright 2017 Battelle Energy Alliance, LLC */ +/* ALL RIGHTS RESERVED */ +/**********************************************************************/ +#include "FFTBufferBase.h" +#include "MooseTypes.h" +#include "RankTwoTensor.h" +#include "RankThreeTensor.h" +#include "RankFourTensor.h" + +// template <> +// InputParameters +// validParams() +// { +// InputParameters params = validParams(); +// params.addClassDescription(""); +// return params; +// } + +template +FFTBufferBase::FFTBufferBase(const InputParameters & parameters) : GeneralUserObject(parameters) +{ +} + +template +void +FFTBufferBase::resize() +{ + if (sizeof(Real) != sizeof(double)) + mooseError("Invalid Real type size"); + _buffer.resize(_ni * _nj * _nk); + + // redo plan / pointers + auto istart = start(0); + std::ptrdiff_t istride = reinterpret_cast(start(1)) - reinterpret_cast(istart); + if (istride % sizeof(Real) != 0) + mooseError("Invalid data alignment"); + istride /= sizeof(Real); +} + +template +void +FFTBufferBase::resize(std::size_t ni) +{ + _ni = ni; + _nj = 1; + _nk = 1; + _dim = 1; + resize(); +} + +template +void +FFTBufferBase::resize(std::size_t ni, std::size_t nj) +{ + _ni = ni; + _nj = nj; + _nk = 1; + _dim = 2; + resize(); +} + +template +void +FFTBufferBase::resize(std::size_t ni, std::size_t nj, std::size_t nk) +{ + _ni = ni; + _nj = nj; + _nk = nk; + _dim = 3; + resize(); +} + +template <> +Real * +FFTBufferBase::start(std::size_t i) +{ + return &_buffer[i]; +} + +template <> +Real * +FFTBufferBase::start(std::size_t i) +{ + return &_buffer[i](0); +} + +template <> +Real * +FFTBufferBase::start(std::size_t i) +{ + return &_buffer[i](0, 0); +} + +template <> +Real * +FFTBufferBase::start(std::size_t i) +{ + return &_buffer[i](0, 0, 0); +} + +template <> +Real * +FFTBufferBase::start(std::size_t i) +{ + return &_buffer[i](0, 0, 0, 0); +} + +template <> +std::size_t +FFTBufferBase::howMany() const +{ + return 1; +} + +template <> +std::size_t +FFTBufferBase::howMany() const +{ + return LIBMESH_DIM; +} + +template <> +std::size_t +FFTBufferBase::howMany() const +{ + return LIBMESH_DIM * LIBMESH_DIM; +} + +template <> +std::size_t +FFTBufferBase::howMany() const +{ + return LIBMESH_DIM * LIBMESH_DIM * LIBMESH_DIM; +} + +template <> +std::size_t +FFTBufferBase::howMany() const +{ + return LIBMESH_DIM * LIBMESH_DIM * LIBMESH_DIM * LIBMESH_DIM; +} + +// explicit instantiation +template class FFTBufferBase; +template class FFTBufferBase; +template class FFTBufferBase; +template class FFTBufferBase; +template class FFTBufferBase;