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 "VariableWarehouse.h" 11 : #include "MooseVariableFE.h" 12 : #include "MooseVariableFV.h" 13 : #include "MooseLinearVariableFV.h" 14 : #include "MooseVariableScalar.h" 15 : #include "MooseTypes.h" 16 : 17 142454 : VariableWarehouse::VariableWarehouse() {} 18 : 19 : void 20 188753 : VariableWarehouse::add(const std::string & var_name, std::shared_ptr<MooseVariableBase> var) 21 : { 22 188753 : _names.push_back(var_name); 23 188753 : auto * raw_var = var.get(); 24 188753 : _all_objects[var->number()] = var; 25 188753 : _var_name[var_name] = raw_var; 26 : 27 188753 : if (auto * tmp_var = dynamic_cast<MooseVariableFieldBase *>(raw_var)) 28 : { 29 185231 : _vars.push_back(tmp_var); 30 185231 : if (auto * tmp_var = dynamic_cast<MooseVariable *>(raw_var)) 31 : { 32 172692 : _regular_vars_by_number[tmp_var->number()] = tmp_var; 33 172692 : _regular_vars_by_name[var_name] = tmp_var; 34 : } 35 12539 : else if (auto * tmp_var = dynamic_cast<MooseVariableFVReal *>(raw_var)) 36 : { 37 6716 : _fv_vars_by_number[tmp_var->number()] = tmp_var; 38 6716 : _fv_vars_by_name[var_name] = tmp_var; 39 : } 40 5823 : else if (auto * tmp_var = dynamic_cast<MooseLinearVariableFVReal *>(raw_var)) 41 : { 42 1522 : _linear_fv_vars_by_number[tmp_var->number()] = tmp_var; 43 1522 : _linear_fv_vars_by_name[var_name] = tmp_var; 44 : } 45 4301 : else if (auto * tmp_var = dynamic_cast<VectorMooseVariable *>(raw_var)) 46 : { 47 1679 : _vector_vars_by_number[tmp_var->number()] = tmp_var; 48 1679 : _vector_vars_by_name[var_name] = tmp_var; 49 : } 50 2622 : else if (auto * tmp_var = dynamic_cast<ArrayMooseVariable *>(raw_var)) 51 : { 52 2622 : _array_vars_by_number[tmp_var->number()] = tmp_var; 53 2622 : _array_vars_by_name[var_name] = tmp_var; 54 : } 55 : else 56 0 : mooseError("Unknown variable class passed into VariableWarehouse. Attempt to hack us?"); 57 : } 58 3522 : else if (auto * tmp_var = dynamic_cast<MooseVariableScalar *>(raw_var)) 59 3522 : _scalar_vars.push_back(tmp_var); 60 : else 61 0 : mooseError("Unknown variable class passed into VariableWarehouse. Attempt to hack us?"); 62 188753 : } 63 : 64 : void 65 112823 : VariableWarehouse::addBoundaryVar(BoundaryID bnd, const MooseVariableFEBase * var) 66 : { 67 112823 : _boundary_vars[bnd].insert(var); 68 112823 : } 69 : 70 : void 71 82769 : VariableWarehouse::addBoundaryVar(const std::set<BoundaryID> & boundary_ids, 72 : const MooseVariableFEBase * var) 73 : { 74 189902 : for (const auto & bid : boundary_ids) 75 107133 : addBoundaryVar(bid, var); 76 82769 : } 77 : 78 : void 79 82765 : VariableWarehouse::addBoundaryVars( 80 : const std::set<BoundaryID> & boundary_ids, 81 : const std::unordered_map<std::string, std::vector<MooseVariableFEBase *>> & vars) 82 : { 83 189890 : for (const auto & bid : boundary_ids) 84 111723 : for (const auto & it : vars) 85 10288 : for (const auto & var : it.second) 86 5690 : addBoundaryVar(bid, var); 87 82765 : } 88 : 89 : MooseVariableBase * 90 5035883 : VariableWarehouse::getVariable(const std::string & var_name) const 91 : { 92 5035883 : auto it = _var_name.find(var_name); 93 5035883 : if (it != _var_name.end()) 94 5035875 : return it->second; 95 : else 96 8 : return nullptr; 97 : } 98 : 99 : MooseVariableBase * 100 207669 : VariableWarehouse::getVariable(unsigned int var_number) const 101 : { 102 207669 : auto it = _all_objects.find(var_number); 103 207669 : if (it != _all_objects.end()) 104 207669 : return it->second.get(); 105 : else 106 0 : return nullptr; 107 : } 108 : 109 : const std::vector<VariableName> & 110 7251008 : VariableWarehouse::names() const 111 : { 112 7251008 : return _names; 113 : } 114 : 115 : const std::vector<MooseVariableFEBase *> & 116 2154873958 : VariableWarehouse::fieldVariables() const 117 : { 118 2154873958 : return _vars; 119 : } 120 : 121 : const std::vector<MooseVariableScalar *> & 122 167082120 : VariableWarehouse::scalars() const 123 : { 124 167082120 : return _scalar_vars; 125 : } 126 : 127 : const std::set<const MooseVariableFEBase *> & 128 0 : VariableWarehouse::boundaryVars(BoundaryID bnd) const 129 : { 130 0 : return _boundary_vars.find(bnd)->second; 131 : } 132 : 133 : namespace 134 : { 135 : template <typename T, typename Map, typename Key> 136 : MooseVariableFE<T> * 137 3531936 : getFieldVariableHelper(const Map & map, const Key & key, const std::string & container_name) 138 : { 139 : // TODO: the requested variable might be an FV variable - how to we 140 : // reconcile this since this function returns an FE (not Field) pointer? 141 : // crap tons of objects depend on this. 142 : 143 3531936 : auto it = map.find(key); 144 3531936 : if (it == map.end()) 145 0 : mooseError("Key '", key, "' not found in VariableWarehouse container '", container_name, "'"); 146 : 147 3531936 : return it->second; 148 : } 149 : } 150 : 151 : template <typename T> 152 : MooseVariableFE<T> * 153 57283 : VariableWarehouse::getFieldVariable(const std::string & var_name) 154 : { 155 57283 : return getFieldVariableHelper<T>(_regular_vars_by_name, var_name, "_regular_vars_by_name"); 156 : } 157 : 158 : template <typename T> 159 : MooseVariableFE<T> * 160 0 : VariableWarehouse::getFieldVariable(unsigned int var_number) 161 : { 162 0 : return getFieldVariableHelper<T>(_regular_vars_by_number, var_number, "_regular_vars_by_number"); 163 : } 164 : 165 : template <> 166 : VectorMooseVariable * 167 1407 : VariableWarehouse::getFieldVariable<RealVectorValue>(const std::string & var_name) 168 : { 169 2814 : return getFieldVariableHelper<RealVectorValue>( 170 2814 : _vector_vars_by_name, var_name, "_vector_vars_by_name"); 171 : } 172 : 173 : template <> 174 : VectorMooseVariable * 175 2180020 : VariableWarehouse::getFieldVariable<RealVectorValue>(unsigned int var_number) 176 : { 177 4360040 : return getFieldVariableHelper<RealVectorValue>( 178 4360040 : _vector_vars_by_number, var_number, "_vector_vars_by_number"); 179 : } 180 : 181 : template <> 182 : ArrayMooseVariable * 183 1879 : VariableWarehouse::getFieldVariable<RealEigenVector>(const std::string & var_name) 184 : { 185 3758 : return getFieldVariableHelper<RealEigenVector>( 186 3758 : _array_vars_by_name, var_name, "_array_vars_by_name"); 187 : } 188 : 189 : template <> 190 : ArrayMooseVariable * 191 1291347 : VariableWarehouse::getFieldVariable<RealEigenVector>(unsigned int var_number) 192 : { 193 2582694 : return getFieldVariableHelper<RealEigenVector>( 194 2582694 : _array_vars_by_number, var_number, "_array_vars_by_number"); 195 : } 196 : 197 : template MooseVariableFE<Real> * 198 : VariableWarehouse::getFieldVariable<Real>(const std::string & var_name); 199 : template MooseVariableFE<Real> * VariableWarehouse::getFieldVariable<Real>(unsigned int var_number); 200 : 201 : template <typename T> 202 : MooseVariableField<T> * 203 108291 : VariableWarehouse::getActualFieldVariable(const std::string & var_name) 204 : { 205 108291 : auto it = _regular_vars_by_name.find(var_name); 206 108291 : if (it != _regular_vars_by_name.end()) 207 103119 : return it->second; 208 5172 : auto it_fv = _fv_vars_by_name.find(var_name); 209 5172 : if (it_fv != _fv_vars_by_name.end()) 210 3643 : return it_fv->second; 211 1529 : return _linear_fv_vars_by_name.at(var_name); 212 : } 213 : 214 : template <typename T> 215 : MooseVariableField<T> * 216 143477848 : VariableWarehouse::getActualFieldVariable(unsigned int var_number) 217 : { 218 143477848 : auto it = _regular_vars_by_number.find(var_number); 219 143477848 : if (it != _regular_vars_by_number.end()) 220 143425872 : return it->second; 221 51976 : auto it_fv = _fv_vars_by_number.find(var_number); 222 51976 : if (it_fv != _fv_vars_by_number.end()) 223 51976 : return it_fv->second; 224 0 : return _linear_fv_vars_by_number.at(var_number); 225 : } 226 : 227 : template <> 228 : MooseVariableField<RealVectorValue> * 229 887 : VariableWarehouse::getActualFieldVariable<RealVectorValue>(const std::string & var_name) 230 : { 231 : // TODO: when necessary, add the if check to see if we have an FV vector var 232 : // before just returning nothing as found in FE vars list. 233 887 : return getFieldVariable<RealVectorValue>(var_name); 234 : } 235 : 236 : template <> 237 : MooseVariableField<RealVectorValue> * 238 2180020 : VariableWarehouse::getActualFieldVariable<RealVectorValue>(unsigned int var_number) 239 : { 240 : // TODO: when necessary, add the if check to see if we have an FV vector var 241 : // before just returning nothing as found in FE vars list. 242 2180020 : return getFieldVariable<RealVectorValue>(var_number); 243 : } 244 : 245 : template <> 246 : MooseVariableField<RealEigenVector> * 247 1477 : VariableWarehouse::getActualFieldVariable<RealEigenVector>(const std::string & var_name) 248 : { 249 1477 : return getFieldVariable<RealEigenVector>(var_name); 250 : } 251 : 252 : template <> 253 : MooseVariableField<RealEigenVector> * 254 1291347 : VariableWarehouse::getActualFieldVariable<RealEigenVector>(unsigned int var_number) 255 : { 256 1291347 : return getFieldVariable<RealEigenVector>(var_number); 257 : } 258 : 259 : void 260 135534 : VariableWarehouse::initialSetup() 261 : { 262 317659 : for (auto & pair : _all_objects) 263 182125 : pair.second->initialSetup(); 264 135534 : } 265 : 266 : void 267 693160 : VariableWarehouse::timestepSetup() 268 : { 269 1960058 : for (auto & pair : _all_objects) 270 1266898 : pair.second->timestepSetup(); 271 693160 : } 272 : 273 : void 274 4478058 : VariableWarehouse::customSetup(const ExecFlagType & exec_type) 275 : { 276 11360126 : for (auto & pair : _all_objects) 277 6882068 : pair.second->customSetup(exec_type); 278 4478058 : } 279 : 280 : void 281 6895253 : VariableWarehouse::subdomainSetup() 282 : { 283 15119632 : for (auto & pair : _all_objects) 284 8224379 : pair.second->subdomainSetup(); 285 6895253 : } 286 : 287 : void 288 1203774 : VariableWarehouse::jacobianSetup() 289 : { 290 2602577 : for (auto & pair : _all_objects) 291 1398803 : pair.second->jacobianSetup(); 292 1203774 : } 293 : 294 : void 295 7552522 : VariableWarehouse::residualSetup() 296 : { 297 15786281 : for (auto & pair : _all_objects) 298 8233759 : pair.second->residualSetup(); 299 7552522 : } 300 : 301 : void 302 835826 : VariableWarehouse::clearAllDofIndices() 303 : { 304 2182410 : for (auto * var : _vars) 305 1346584 : var->clearAllDofIndices(); 306 835826 : } 307 : 308 : void 309 14962702 : VariableWarehouse::setActiveVariableCoupleableVectorTags(const std::set<TagID> & vtags) 310 : { 311 34506896 : for (auto * var : _vars) 312 19544194 : var->setActiveTags(vtags); 313 14962702 : } 314 : 315 : void 316 112062 : VariableWarehouse::setActiveScalarVariableCoupleableVectorTags(const std::set<TagID> & vtags) 317 : { 318 235068 : for (auto * var : _scalar_vars) 319 123006 : var->setActiveTags(vtags); 320 112062 : } 321 : 322 : template MooseVariableField<Real> * 323 : VariableWarehouse::getActualFieldVariable<Real>(const std::string & var_name); 324 : template MooseVariableField<Real> * 325 : VariableWarehouse::getActualFieldVariable<Real>(unsigned int var_number);