Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 3 : //* 4 : //* All rights reserved, see COPYRIGHT for full restrictions 5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT 6 : //* 7 : //* Licensed under LGPL 2.1, please see LICENSE for details 8 : //* https://www.gnu.org/licenses/lgpl-2.1.html 9 : 10 : #include "TransformGenerator.h" 11 : #include "libmesh/mesh_modification.h" 12 : #include "CastUniquePointer.h" 13 : 14 : #include "libmesh/mesh_tools.h" 15 : 16 : registerMooseObject("MooseApp", TransformGenerator); 17 : 18 : InputParameters 19 16171 : TransformGenerator::validParams() 20 : { 21 : MooseEnum transforms( 22 16171 : "TRANSLATE=1 TRANSLATE_CENTER_ORIGIN=2 TRANSLATE_MIN_ORIGIN=3 ROTATE=4 SCALE=5"); 23 : 24 16171 : InputParameters params = MeshGenerator::validParams(); 25 : 26 16171 : params.addRequiredParam<MeshGeneratorName>("input", "The mesh we want to modify"); 27 16171 : params.addClassDescription("Applies a linear transform to the entire mesh."); 28 16171 : params.addRequiredParam<MooseEnum>( 29 : "transform", 30 : transforms, 31 : "The type of transformation to perform (TRANSLATE, TRANSLATE_CENTER_ORIGIN, " 32 : "TRANSLATE_MIN_ORIGIN, ROTATE, SCALE)"); 33 16171 : params.addParam<RealVectorValue>( 34 : "vector_value", 35 : "The value to use for the transformation. When using TRANSLATE or SCALE, the " 36 : "xyz coordinates are applied in each direction respectively. When using " 37 : "ROTATE, the values are interpreted as the Euler angles phi, theta and psi " 38 : "given in degrees."); 39 : 40 32342 : return params; 41 16171 : } 42 : 43 930 : TransformGenerator::TransformGenerator(const InputParameters & parameters) 44 : : MeshGenerator(parameters), 45 930 : _input(getMesh("input")), 46 1860 : _transform(getParam<MooseEnum>("transform")) 47 : { 48 1838 : if ((_transform != "TRANSLATE_CENTER_ORIGIN" && _transform != "TRANSLATE_MIN_ORIGIN") && 49 1838 : !isParamValid("vector_value")) 50 0 : paramError("transform", 51 : "The parameter 'vector_value' must be supplied with 'transform' = ", 52 0 : _transform); 53 930 : } 54 : 55 : std::unique_ptr<MeshBase> 56 874 : TransformGenerator::generate() 57 : { 58 874 : std::unique_ptr<MeshBase> mesh = std::move(_input); 59 : 60 874 : RealVectorValue vector_value; 61 874 : if (_transform == 2 || _transform == 3) 62 : { 63 22 : const auto bbox = MeshTools::create_bounding_box(*mesh); 64 22 : if (_transform == 2) 65 11 : vector_value = -0.5 * (bbox.max() + bbox.min()); 66 : else 67 11 : vector_value = -bbox.min(); 68 : } 69 : else 70 852 : vector_value = getParam<RealVectorValue>("vector_value"); 71 : 72 874 : switch (_transform) 73 : { 74 495 : case 1: 75 : case 2: 76 : case 3: 77 495 : MeshTools::Modification::translate(*mesh, vector_value(0), vector_value(1), vector_value(2)); 78 495 : break; 79 368 : case 4: 80 368 : MeshTools::Modification::rotate(*mesh, vector_value(0), vector_value(1), vector_value(2)); 81 368 : break; 82 11 : case 5: 83 11 : MeshTools::Modification::scale(*mesh, vector_value(0), vector_value(1), vector_value(2)); 84 11 : break; 85 : } 86 : 87 874 : mesh->set_isnt_prepared(); 88 1748 : return dynamic_pointer_cast<MeshBase>(mesh); 89 874 : }