Line data Source code
1 : /**********************************************************************/ 2 : /* DO NOT MODIFY THIS HEADER */ 3 : /* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */ 4 : /* */ 5 : /* Copyright 2017 Battelle Energy Alliance, LLC */ 6 : /* ALL RIGHTS RESERVED */ 7 : /**********************************************************************/ 8 : 9 : #include "FFTBufferAux.h" 10 : #include "FFTBufferBase.h" 11 : 12 : registerMooseObject("MagpieApp", FFTBufferAux); 13 : 14 : InputParameters 15 96 : FFTBufferAux::validParams() 16 : { 17 96 : InputParameters params = AuxKernel::validParams(); 18 96 : params.addClassDescription("Fetch values from an FFT buffer."); 19 192 : params.addRequiredParam<UserObjectName>("fft_buffer", "Real valued FFT buffer object"); 20 192 : params.addParam<std::vector<unsigned int>>( 21 96 : "component", std::vector<unsigned int>(), "Component to access for higher order types"); 22 96 : return params; 23 0 : } 24 : 25 48 : FFTBufferAux::FFTBufferAux(const InputParameters & parameters) 26 : : AuxKernel(parameters), 27 48 : _buffer(getUserObject<UserObject>("fft_buffer")), 28 144 : _component(getParam<std::vector<unsigned int>>("component")) 29 : { 30 : // cast into all possible buffer options 31 48 : _real_buffer = dynamic_cast<const FFTBufferBase<Real> *>(&_buffer); 32 48 : _realvectorvalue_buffer = dynamic_cast<const FFTBufferBase<RealVectorValue> *>(&_buffer); 33 48 : _ranktwotensor_buffer = dynamic_cast<const FFTBufferBase<RankTwoTensor> *>(&_buffer); 34 48 : _rankthreetensor_buffer = dynamic_cast<const FFTBufferBase<RankThreeTensor> *>(&_buffer); 35 48 : _rankfourtensor_buffer = dynamic_cast<const FFTBufferBase<RankFourTensor> *>(&_buffer); 36 : 37 : // one of those should not result in a nullptr 38 48 : if (_real_buffer) 39 : { 40 21 : if (_component.size() != 0) 41 0 : paramError("component", "Do not specify a comonent for Real type FFT buffers."); 42 : } 43 27 : else if (_realvectorvalue_buffer) 44 : { 45 18 : if (_component.size() != 1) 46 0 : paramError("component", 47 : "Specify one index value to access a RealVectorValue type FFT buffer component."); 48 : } 49 9 : else if (_ranktwotensor_buffer) 50 : { 51 6 : if (_component.size() != 2) 52 0 : paramError("component", 53 : "Specify two index values to access a RankTwoTensor type FFT buffer component."); 54 : } 55 3 : else if (_rankthreetensor_buffer) 56 : { 57 0 : if (_component.size() != 3) 58 0 : paramError( 59 : "component", 60 : "Specify three index values to access a RankThreeTensor type FFT buffer component."); 61 : } 62 3 : else if (_rankfourtensor_buffer) 63 : { 64 3 : if (_component.size() != 4) 65 0 : paramError("component", 66 : "Specify four index values to access a RankFourTensor type FFT buffer component."); 67 : } 68 : else 69 0 : paramError("fft_buffer", "Unsupported buffer type"); 70 48 : } 71 : 72 : Real 73 3267120 : FFTBufferAux::computeValue() 74 : { 75 3267120 : if (_real_buffer) 76 1317648 : return (*_real_buffer)(_current_elem->vertex_average()); 77 1949472 : if (_realvectorvalue_buffer) 78 180000 : return (*_realvectorvalue_buffer)(_current_elem->vertex_average())(_component[0]); 79 1769472 : if (_ranktwotensor_buffer) 80 1179648 : return (*_ranktwotensor_buffer)(_current_elem->vertex_average())(_component[0], _component[1]); 81 589824 : if (_rankthreetensor_buffer) 82 0 : return (*_rankthreetensor_buffer)( 83 0 : _current_elem->vertex_average())(_component[0], _component[1], _component[2]); 84 589824 : if (_rankfourtensor_buffer) 85 589824 : return (*_rankfourtensor_buffer)(_current_elem->vertex_average())(_component[0], 86 : _component[1], 87 : _component[2], 88 589824 : _component[3]); 89 : else 90 0 : paramError("fft_buffer", "Unsupported buffer type"); 91 : }