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 16049 : TransformGenerator::validParams() 20 : { 21 : MooseEnum transforms( 22 16049 : "TRANSLATE=1 TRANSLATE_CENTER_ORIGIN=2 TRANSLATE_MIN_ORIGIN=3 ROTATE=4 SCALE=5"); 23 : 24 16049 : InputParameters params = MeshGenerator::validParams(); 25 : 26 16049 : params.addRequiredParam<MeshGeneratorName>("input", "The mesh we want to modify"); 27 16049 : params.addClassDescription("Applies a linear transform to the entire mesh."); 28 16049 : 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 16049 : 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 32098 : return params; 41 16049 : } 42 : 43 870 : TransformGenerator::TransformGenerator(const InputParameters & parameters) 44 : : MeshGenerator(parameters), 45 870 : _input(getMesh("input")), 46 1740 : _transform(getParam<MooseEnum>("transform")) 47 : { 48 1720 : if ((_transform != "TRANSLATE_CENTER_ORIGIN" && _transform != "TRANSLATE_MIN_ORIGIN") && 49 1720 : !isParamValid("vector_value")) 50 0 : paramError("transform", 51 : "The parameter 'vector_value' must be supplied with 'transform' = ", 52 0 : _transform); 53 870 : } 54 : 55 : std::unique_ptr<MeshBase> 56 815 : TransformGenerator::generate() 57 : { 58 815 : std::unique_ptr<MeshBase> mesh = std::move(_input); 59 : 60 815 : RealVectorValue vector_value; 61 815 : if (_transform == 2 || _transform == 3) 62 : { 63 20 : const auto bbox = MeshTools::create_bounding_box(*mesh); 64 20 : if (_transform == 2) 65 10 : vector_value = -0.5 * (bbox.max() + bbox.min()); 66 : else 67 10 : vector_value = -bbox.min(); 68 : } 69 : else 70 795 : vector_value = getParam<RealVectorValue>("vector_value"); 71 : 72 815 : switch (_transform) 73 : { 74 467 : case 1: 75 : case 2: 76 : case 3: 77 467 : MeshTools::Modification::translate(*mesh, vector_value(0), vector_value(1), vector_value(2)); 78 467 : break; 79 338 : case 4: 80 338 : MeshTools::Modification::rotate(*mesh, vector_value(0), vector_value(1), vector_value(2)); 81 338 : break; 82 10 : case 5: 83 10 : MeshTools::Modification::scale(*mesh, vector_value(0), vector_value(1), vector_value(2)); 84 10 : break; 85 : } 86 : 87 815 : mesh->set_isnt_prepared(); 88 1630 : return dynamic_pointer_cast<MeshBase>(mesh); 89 815 : }