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 "Attributes.h" 11 : 12 : #include "TaggingInterface.h" 13 : #include "BoundaryRestrictable.h" 14 : #include "BlockRestrictable.h" 15 : #include "SetupInterface.h" 16 : #include "MooseVariableInterface.h" 17 : #include "MooseVariableFE.h" 18 : #include "ElementUserObject.h" 19 : #include "SideUserObject.h" 20 : #include "InternalSideUserObject.h" 21 : #include "InterfaceUserObject.h" 22 : #include "NodalUserObject.h" 23 : #include "GeneralUserObject.h" 24 : #include "ThreadedGeneralUserObject.h" 25 : #include "ShapeUserObject.h" 26 : #include "ShapeSideUserObject.h" 27 : #include "ShapeElementUserObject.h" 28 : #include "Reporter.h" 29 : #include "SystemBase.h" 30 : #include "DomainUserObject.h" 31 : #include "MortarUserObject.h" 32 : #include "FVInterpolationMethod.h" 33 : #include "ExecFlagRegistry.h" 34 : 35 : #include <algorithm> 36 : 37 : const ExecFlagType AttribExecOns::EXEC_ALL = registerExecFlag("ALL"); 38 : 39 : std::ostream & 40 0 : operator<<(std::ostream & os, Interfaces & iface) 41 : { 42 0 : os << "Interfaces("; 43 0 : if (static_cast<bool>(iface & Interfaces::UserObject)) 44 0 : os << "|UserObject"; 45 0 : if (static_cast<bool>(iface & Interfaces::ElementUserObject)) 46 0 : os << "|ElementUserObject"; 47 0 : if (static_cast<bool>(iface & Interfaces::SideUserObject)) 48 0 : os << "|SideUserObject"; 49 0 : if (static_cast<bool>(iface & Interfaces::InternalSideUserObject)) 50 0 : os << "|InternalSideUserObject"; 51 0 : if (static_cast<bool>(iface & Interfaces::NodalUserObject)) 52 0 : os << "|NodalUserObject"; 53 0 : if (static_cast<bool>(iface & Interfaces::GeneralUserObject)) 54 0 : os << "|GeneralUserObject"; 55 0 : if (static_cast<bool>(iface & Interfaces::ThreadedGeneralUserObject)) 56 0 : os << "|ThreadedGeneralUserObject"; 57 0 : if (static_cast<bool>(iface & Interfaces::ShapeElementUserObject)) 58 0 : os << "|ShapeElementUserObject"; 59 0 : if (static_cast<bool>(iface & Interfaces::ShapeSideUserObject)) 60 0 : os << "|ShapeSideUserObject"; 61 0 : if (static_cast<bool>(iface & Interfaces::Postprocessor)) 62 0 : os << "|Postprocessor"; 63 0 : if (static_cast<bool>(iface & Interfaces::VectorPostprocessor)) 64 0 : os << "|VectorPostprocessor"; 65 0 : if (static_cast<bool>(iface & Interfaces::InterfaceUserObject)) 66 0 : os << "|InterfaceUserObject"; 67 0 : if (static_cast<bool>(iface & Interfaces::Reporter)) 68 0 : os << "|Reporter"; 69 0 : if (static_cast<bool>(iface & Interfaces::DomainUserObject)) 70 0 : os << "|DomainUserObject"; 71 0 : if (static_cast<bool>(iface & Interfaces::MortarUserObject)) 72 0 : os << "|MortarUserObject"; 73 0 : if (static_cast<bool>(iface & Interfaces::FVInterpolationMethod)) 74 0 : os << "|FVInterpolationMethod"; 75 0 : os << ")"; 76 0 : return os; 77 : } 78 : 79 : bool 80 41291 : AttribTagBase::isMatch(const Attribute & other) const 81 : { 82 41291 : auto a = dynamic_cast<const AttribTagBase *>(&other); 83 41291 : if (!a) 84 0 : return false; 85 41291 : if (a->_vals.size() == 0) 86 0 : return true; // the condition is empty tags - which we take to mean any tag should match 87 : 88 : // return true if any single tag matches between the two attribute objects 89 42321 : for (auto val : _vals) 90 41267 : if (std::find(a->_vals.begin(), a->_vals.end(), val) != a->_vals.end()) 91 40237 : return true; 92 1054 : return false; 93 : } 94 : 95 : bool 96 7214266 : AttribTagBase::isEqual(const Attribute & other) const 97 : { 98 7214266 : auto a = dynamic_cast<const AttribTagBase *>(&other); 99 7214266 : if (!a || a->_vals.size() != _vals.size()) 100 0 : return false; 101 : 102 24289532 : for (size_t i = 0; i < a->_vals.size(); i++) 103 17075266 : if (a->_vals[i] != _vals[i]) 104 0 : return false; 105 7214266 : return true; 106 : } 107 : 108 : void 109 311914 : AttribMatrixTags::initFrom(const MooseObject * obj) 110 : { 111 311914 : _vals.clear(); 112 311914 : auto t = dynamic_cast<const TaggingInterface *>(obj); 113 311914 : if (t) 114 : { 115 458420 : for (auto & tag : t->getMatrixTags({})) 116 273813 : _vals.push_back(static_cast<int>(tag)); 117 : } 118 311914 : } 119 : 120 : void 121 311914 : AttribVectorTags::initFrom(const MooseObject * obj) 122 : { 123 311914 : _vals.clear(); 124 311914 : auto t = dynamic_cast<const TaggingInterface *>(obj); 125 311914 : if (t) 126 : { 127 372959 : for (auto & tag : t->getVectorTags({})) 128 188352 : _vals.push_back(static_cast<int>(tag)); 129 : } 130 311914 : } 131 : 132 : void 133 311914 : AttribExecOns::initFrom(const MooseObject * obj) 134 : { 135 311914 : _vals.clear(); 136 311914 : if (const auto sup = dynamic_cast<const SetupInterface *>(obj)) 137 : { 138 264280 : const auto & current_items = sup->getExecuteOnEnum(); 139 264280 : _vals.reserve(current_items.size()); 140 357892 : for (auto & on : current_items) 141 93612 : _vals.push_back(on); 142 : } 143 311914 : } 144 : 145 : bool 146 3151795 : AttribExecOns::isMatch(const Attribute & other) const 147 : { 148 3151795 : auto a = dynamic_cast<const AttribExecOns *>(&other); 149 3151795 : if (!a || a->_vals.empty()) 150 0 : return false; 151 3151795 : auto cond = a->_vals[0]; 152 3151795 : if (cond == EXEC_ALL) 153 1092 : return true; 154 : 155 5208528 : for (const auto val : _vals) 156 3741633 : if (val == EXEC_ALL || val == cond) 157 1683808 : return true; 158 1466895 : return false; 159 : } 160 : 161 : bool 162 32404406 : AttribExecOns::isEqual(const Attribute & other) const 163 : { 164 32404406 : auto a = dynamic_cast<const AttribExecOns *>(&other); 165 32404406 : if (!a || a->_vals.size() != _vals.size()) 166 0 : return false; 167 : 168 64808812 : for (size_t i = 0; i < a->_vals.size(); i++) 169 32404406 : if (a->_vals[i] != _vals[i]) 170 0 : return false; 171 32404406 : return true; 172 : } 173 : 174 : void 175 311914 : AttribSubdomains::initFrom(const MooseObject * obj) 176 : { 177 311914 : _vals.clear(); 178 311914 : auto blk = dynamic_cast<const BlockRestrictable *>(obj); 179 311914 : if (blk && blk->blockRestricted()) 180 : { 181 36675 : for (auto id : blk->blockIDs()) 182 20399 : _vals.push_back(id); 183 : } 184 : else 185 295638 : _vals.push_back(Moose::ANY_BLOCK_ID); 186 311914 : } 187 : 188 : bool 189 1030922 : AttribSubdomains::isMatch(const Attribute & other) const 190 : { 191 1030922 : auto a = dynamic_cast<const AttribSubdomains *>(&other); 192 1030922 : if (!a || a->_vals.size() < 1) 193 0 : return false; 194 : 195 1030922 : auto cond = a->_vals[0]; 196 1030922 : if (cond == Moose::ANY_BLOCK_ID) 197 0 : return true; 198 1030922 : else if (cond == Moose::INVALID_BLOCK_ID) 199 6578 : return false; 200 : 201 1170982 : for (auto id : _vals) 202 : { 203 1073366 : if (id == cond || id == Moose::ANY_BLOCK_ID) 204 926728 : return true; 205 : } 206 97616 : return false; 207 : } 208 : 209 : bool 210 5968557 : AttribSubdomains::isEqual(const Attribute & other) const 211 : { 212 5968557 : auto a = dynamic_cast<const AttribSubdomains *>(&other); 213 5968557 : if (!a || a->_vals.size() != _vals.size()) 214 0 : return false; 215 : 216 11937114 : for (size_t i = 0; i < a->_vals.size(); i++) 217 5968557 : if (a->_vals[i] != _vals[i]) 218 0 : return false; 219 5968557 : return true; 220 : } 221 : 222 : void 223 311914 : AttribBoundaries::initFrom(const MooseObject * obj) 224 : { 225 311914 : _vals.clear(); 226 311914 : auto bnd = dynamic_cast<const BoundaryRestrictable *>(obj); 227 311914 : if (bnd && bnd->boundaryRestricted()) 228 : { 229 210426 : for (auto & bound : bnd->boundaryIDs()) 230 118529 : _vals.push_back(bound); 231 : } 232 : else 233 220017 : _vals.push_back(Moose::ANY_BOUNDARY_ID); 234 311914 : } 235 : 236 : bool 237 716449 : AttribBoundaries::isMatch(const Attribute & other) const 238 : { 239 716449 : auto a = dynamic_cast<const AttribBoundaries *>(&other); 240 716449 : if (!a || a->_vals.size() < 1) 241 0 : return false; 242 : 243 : // return true if a single tag matches between the two attribute objects 244 984126 : for (auto val : _vals) 245 : { 246 798168 : if (!a->_must_be_restricted && (val == Moose::ANY_BOUNDARY_ID)) 247 530491 : return true; 248 353499 : if (std::find(a->_vals.begin(), a->_vals.end(), val) != a->_vals.end()) 249 80944 : return true; 250 272555 : else if (std::find(a->_vals.begin(), a->_vals.end(), Moose::ANY_BOUNDARY_ID) != a->_vals.end()) 251 4878 : return true; 252 : } 253 185958 : return false; 254 : } 255 : 256 : bool 257 10178890 : AttribBoundaries::isEqual(const Attribute & other) const 258 : { 259 10178890 : auto a = dynamic_cast<const AttribBoundaries *>(&other); 260 10178890 : if (!a || a->_vals.size() != _vals.size()) 261 0 : return false; 262 : 263 20357780 : for (size_t i = 0; i < a->_vals.size(); i++) 264 10178890 : if (a->_vals[i] != _vals[i]) 265 0 : return false; 266 10178890 : return true; 267 : } 268 : 269 : void 270 311914 : AttribThread::initFrom(const MooseObject * obj) 271 : { 272 623828 : _val = obj->getParam<THREAD_ID>("_tid"); 273 311914 : } 274 : bool 275 25195373 : AttribThread::isMatch(const Attribute & other) const 276 : { 277 25195373 : auto a = dynamic_cast<const AttribThread *>(&other); 278 25195373 : return a && (a->_val == _val); 279 : } 280 : bool 281 22026197 : AttribThread::isEqual(const Attribute & other) const 282 : { 283 22026197 : return isMatch(other); 284 : } 285 : 286 : void 287 311914 : AttribExecutionOrderGroup::initFrom(const MooseObject * obj) 288 : { 289 311914 : const auto * uo = dynamic_cast<const UserObjectBase *>(obj); 290 387598 : _val = uo ? uo->getParam<int>("execution_order_group") : 0; 291 311914 : } 292 : bool 293 10210883 : AttribExecutionOrderGroup::isMatch(const Attribute & other) const 294 : { 295 10210883 : auto a = dynamic_cast<const AttribExecutionOrderGroup *>(&other); 296 10210883 : return a && (a->_val == _val); 297 : } 298 : bool 299 8777657 : AttribExecutionOrderGroup::isEqual(const Attribute & other) const 300 : { 301 8777657 : return isMatch(other); 302 : } 303 : 304 : void 305 311914 : AttribSysNum::initFrom(const MooseObject * obj) 306 : { 307 623828 : auto * sys = obj->getParam<SystemBase *>("_sys"); 308 : 309 311914 : if (sys) 310 311485 : _val = sys->number(); 311 311914 : } 312 : 313 : bool 314 8879971 : AttribSysNum::isMatch(const Attribute & other) const 315 : { 316 8879971 : auto a = dynamic_cast<const AttribSysNum *>(&other); 317 8879971 : return a && (a->_val == _val); 318 : } 319 : 320 : bool 321 8156573 : AttribSysNum::isEqual(const Attribute & other) const 322 : { 323 8156573 : return isMatch(other); 324 : } 325 : 326 : void 327 311914 : AttribPreIC::initFrom(const MooseObject * /*obj*/) 328 : { 329 311914 : } 330 : bool 331 15361 : AttribPreIC::isMatch(const Attribute & other) const 332 : { 333 15361 : auto a = dynamic_cast<const AttribPreIC *>(&other); 334 15361 : return a && (a->_val == _val); 335 : } 336 : 337 : bool 338 61 : AttribPreIC::isEqual(const Attribute & other) const 339 : { 340 61 : return isMatch(other); 341 : } 342 : 343 : bool 344 179297 : AttribPreAux::isMatch(const Attribute & other) const 345 : { 346 179297 : const auto a = dynamic_cast<const AttribPreAux *>(&other); 347 : 348 179297 : bool is_match = false; 349 : 350 179297 : if (a && !_vals.empty() && !a->_vals.empty()) 351 : { 352 57422 : is_match = std::includes(_vals.begin(), _vals.end(), a->_vals.begin(), a->_vals.end()) || 353 3954 : std::includes(a->_vals.begin(), a->_vals.end(), _vals.begin(), _vals.end()); 354 : } 355 : 356 179297 : return is_match; 357 : } 358 : 359 : bool 360 9265077 : AttribPreAux::isEqual(const Attribute & other) const 361 : { 362 9265077 : const auto a = dynamic_cast<const AttribPreAux *>(&other); 363 9265077 : return a && a->_vals == _vals; 364 : } 365 : 366 : void 367 311914 : AttribPreAux::initFrom(const MooseObject * /*obj*/) 368 : { 369 311914 : } 370 : 371 : bool 372 1486637 : AttribPostAux::isMatch(const Attribute & other) const 373 : { 374 1486637 : const auto a = dynamic_cast<const AttribPostAux *>(&other); 375 : 376 1486637 : bool is_match = false; 377 : 378 1486637 : if (a && !_vals.empty() && !a->_vals.empty()) 379 : { 380 1493695 : is_match = std::includes(_vals.begin(), _vals.end(), a->_vals.begin(), a->_vals.end()) || 381 11912 : std::includes(a->_vals.begin(), a->_vals.end(), _vals.begin(), _vals.end()); 382 : } 383 : 384 1486637 : return is_match; 385 : } 386 : 387 : bool 388 17692029 : AttribPostAux::isEqual(const Attribute & other) const 389 : { 390 17692029 : const auto a = dynamic_cast<const AttribPostAux *>(&other); 391 17692029 : return a && a->_vals == _vals; 392 : } 393 : 394 : void 395 311914 : AttribPostAux::initFrom(const MooseObject * /*obj*/) 396 : { 397 311914 : } 398 : 399 : void 400 311914 : AttribName::initFrom(const MooseObject * obj) 401 : { 402 311914 : _val = obj->name(); 403 311914 : } 404 : bool 405 1498275 : AttribName::isMatch(const Attribute & other) const 406 : { 407 1498275 : auto a = dynamic_cast<const AttribName *>(&other); 408 1498275 : return a && (a->_val == _val); 409 : } 410 : 411 : bool 412 1265047 : AttribName::isEqual(const Attribute & other) const 413 : { 414 1265047 : return isMatch(other); 415 : } 416 : 417 : void 418 311914 : AttribSystem::initFrom(const MooseObject * obj) 419 : { 420 311914 : _val = obj->parameters().getSystemAttributeName(); 421 311914 : } 422 : 423 : bool 424 71996426 : AttribSystem::isMatch(const Attribute & other) const 425 : { 426 71996426 : auto a = dynamic_cast<const AttribSystem *>(&other); 427 71996426 : return a && (a->_val == _val); 428 : } 429 : 430 : bool 431 49701156 : AttribSystem::isEqual(const Attribute & other) const 432 : { 433 49701156 : return isMatch(other); 434 : } 435 : 436 : void 437 311914 : AttribKokkos::initFrom(const MooseObject * obj) 438 : { 439 : #ifdef MOOSE_KOKKOS_ENABLED 440 238306 : _val = obj->isKokkosObject(); 441 : #else 442 : static_cast<void>(obj); 443 73608 : _val = false; 444 : #endif 445 311914 : } 446 : 447 : bool 448 277211 : AttribKokkos::isMatch(const Attribute & other) const 449 : { 450 277211 : auto a = dynamic_cast<const AttribKokkos *>(&other); 451 277211 : return a && (a->_val == _val); 452 : } 453 : 454 : bool 455 256938 : AttribKokkos::isEqual(const Attribute & other) const 456 : { 457 256938 : return isMatch(other); 458 : } 459 : 460 : void 461 311914 : AttribResidualObject::initFrom(const MooseObject * obj) 462 : { 463 623828 : _val = obj->getParam<bool>("_residual_object"); 464 311914 : _initd = true; 465 311914 : } 466 : 467 : bool 468 0 : AttribResidualObject::isMatch(const Attribute & other) const 469 : { 470 0 : auto a = dynamic_cast<const AttribResidualObject *>(&other); 471 0 : return _initd && a && a->_initd && (a->_val == _val); 472 : } 473 : 474 : bool 475 0 : AttribResidualObject::isEqual(const Attribute & other) const 476 : { 477 0 : return isMatch(other); 478 : } 479 : 480 : void 481 311914 : AttribVar::initFrom(const MooseObject * obj) 482 : { 483 311914 : auto vi = dynamic_cast<const MooseVariableInterface<Real> *>(obj); 484 311914 : if (vi) 485 208344 : _val = static_cast<int>(vi->mooseVariableBase()->number()); 486 311914 : } 487 : bool 488 189469 : AttribVar::isMatch(const Attribute & other) const 489 : { 490 189469 : auto a = dynamic_cast<const AttribVar *>(&other); 491 189469 : return a && (_val != -1) && (a->_val == _val); 492 : } 493 : 494 : bool 495 128534 : AttribVar::isEqual(const Attribute & other) const 496 : { 497 128534 : return isMatch(other); 498 : } 499 : 500 : void 501 311914 : AttribInterfaces::initFrom(const MooseObject * obj) 502 : { 503 311914 : _val = 0; 504 : // clang-format off 505 311914 : _val |= (unsigned int)Interfaces::UserObject * (dynamic_cast<const UserObjectBase *>(obj) != nullptr); 506 311914 : _val |= (unsigned int)Interfaces::ElementUserObject * (dynamic_cast<const ElementUserObject *>(obj) != nullptr); 507 311914 : _val |= (unsigned int)Interfaces::SideUserObject * (dynamic_cast<const SideUserObject *>(obj) != nullptr); 508 311914 : _val |= (unsigned int)Interfaces::InternalSideUserObject * (dynamic_cast<const InternalSideUserObject *>(obj) != nullptr); 509 311914 : _val |= (unsigned int)Interfaces::InterfaceUserObject * (dynamic_cast<const InterfaceUserObject *>(obj) != nullptr); 510 311914 : _val |= (unsigned int)Interfaces::NodalUserObject * (dynamic_cast<const NodalUserObject *>(obj) != nullptr); 511 311914 : _val |= (unsigned int)Interfaces::GeneralUserObject * (dynamic_cast<const GeneralUserObject *>(obj) != nullptr); 512 311914 : _val |= (unsigned int)Interfaces::ThreadedGeneralUserObject * (dynamic_cast<const ThreadedGeneralUserObject *>(obj) != nullptr); 513 311914 : _val |= (unsigned int)Interfaces::ShapeElementUserObject * (dynamic_cast<const ShapeElementUserObject *>(obj) != nullptr); 514 311914 : _val |= (unsigned int)Interfaces::ShapeSideUserObject * (dynamic_cast<const ShapeSideUserObject *>(obj) != nullptr); 515 311914 : _val |= (unsigned int)Interfaces::Postprocessor * (dynamic_cast<const Postprocessor *>(obj) != nullptr); 516 311914 : _val |= (unsigned int)Interfaces::VectorPostprocessor * (dynamic_cast<const VectorPostprocessor *>(obj) != nullptr); 517 311914 : _val |= (unsigned int)Interfaces::BlockRestrictable * (dynamic_cast<const BlockRestrictable *>(obj) != nullptr); 518 311914 : _val |= (unsigned int)Interfaces::BoundaryRestrictable * (dynamic_cast<const BoundaryRestrictable *>(obj) != nullptr); 519 311914 : _val |= (unsigned int)Interfaces::Reporter * (dynamic_cast<const Reporter *>(obj) != nullptr); 520 311914 : _val |= (unsigned int)Interfaces::DomainUserObject * (dynamic_cast<const DomainUserObject *>(obj) != nullptr); 521 311914 : _val |= (unsigned int)Interfaces::MortarUserObject * (dynamic_cast<const MortarUserObject *>(obj) != nullptr); 522 311914 : _val |= (unsigned int)Interfaces::FVInterpolationMethod * (dynamic_cast<const FVInterpolationMethod *>(obj) != nullptr); 523 : // clang-format on 524 311914 : } 525 : 526 : bool 527 5315483 : AttribInterfaces::isMatch(const Attribute & other) const 528 : { 529 5315483 : auto a = dynamic_cast<const AttribInterfaces *>(&other); 530 5315483 : return a && (a->_val & _val); 531 : } 532 : 533 : bool 534 15050281 : AttribInterfaces::isEqual(const Attribute & other) const 535 : { 536 15050281 : auto a = dynamic_cast<const AttribInterfaces *>(&other); 537 15050281 : return a && (a->_val == _val); 538 : } 539 : 540 : void 541 311914 : AttribDisplaced::initFrom(const MooseObject * obj) 542 : { 543 569726 : _val = obj->parameters().have_parameter<bool>("use_displaced_mesh") && 544 827538 : obj->getParam<bool>("use_displaced_mesh"); 545 311914 : } 546 : 547 : bool 548 6988206 : AttribDisplaced::isMatch(const Attribute & other) const 549 : { 550 6988206 : auto a = dynamic_cast<const AttribDisplaced *>(&other); 551 6988206 : return a && (a->_val == _val); 552 : } 553 : 554 : bool 555 6947029 : AttribDisplaced::isEqual(const Attribute & other) const 556 : { 557 6947029 : return isMatch(other); 558 : }