void DisplacedProblem::undisplaceMesh() { // If undisplaceMesh() is called during initial adaptivity, it is // not valid to call _mesh.getActiveSemiLocalNodeRange() since it is // not set up yet. So we are creating the Range by hand. // // We must undisplace *all* our nodes to the _ref_mesh // configuration, not just the local ones, since the partitioners // require this. We are using the GRAIN_SIZE=1 from MooseMesh.C, // not sure how this value was decided upon. // // (DRG: The grainsize parameter is ultimately passed to TBB to help // it choose how to split up the range. A grainsize of 1 says "split // it as much as you want". Years ago I experimentally found that it // didn't matter much and that using 1 was fine.) // // Note: we don't have to invalidate/update as much stuff as // DisplacedProblem::updateMesh() does, since this will be handled // by a later call to updateMesh(). NodeRange node_range(_mesh.getMesh().nodes_begin(), _mesh.getMesh().nodes_end(), /*grainsize=*/1); ResetDisplacedMeshThread rdmt(_mproblem, *this); // Undisplace the mesh using threads. Threads::parallel_reduce (node_range, rdmt); }
void deps_object::test<2>() { typedef LLDependencies<std::string, int> NameIndexDeps; NameIndexDeps nideps; const NameIndexDeps& const_nideps(nideps); nideps.add("def", 2, list_of("ghi")); nideps.add("ghi", 3); nideps.add("abc", 1, list_of("def")); NameIndexDeps::range range(nideps.get_range()); ensure_equals(range.begin()->first, "abc"); ensure_equals(range.begin()->second, 1); range.begin()->second = 0; range.begin()->second = 1; NameIndexDeps::const_range const_range(const_nideps.get_range()); NameIndexDeps::const_iterator const_iterator(const_range.begin()); ++const_iterator; ensure_equals(const_iterator->first, "def"); ensure_equals(const_iterator->second, 2); NameIndexDeps::node_range node_range(nideps.get_node_range()); ensure_equals(instance_from_range<std::vector<int> >(node_range), make< std::vector<int> >(list_of(1)(2)(3))); *node_range.begin() = 0; *node_range.begin() = 1; NameIndexDeps::const_node_range const_node_range(const_nideps.get_node_range()); ensure_equals(instance_from_range<std::vector<int> >(const_node_range), make< std::vector<int> >(list_of(1)(2)(3))); NameIndexDeps::const_key_range const_key_range(const_nideps.get_key_range()); ensure_equals(instance_from_range<StringList>(const_key_range), make<StringList>(list_of("abc")("def")("ghi"))); NameIndexDeps::sorted_range sorted(const_nideps.sort()); NameIndexDeps::sorted_iterator sortiter(sorted.begin()); ensure_equals(sortiter->first, "ghi"); ensure_equals(sortiter->second, 3); // test all iterator-flavored versions of get_after_range() StringList def(make<StringList>(list_of("def"))); ensure("empty abc before list", is_empty(nideps.get_before_range(nideps.get_range().begin()))); ensure_equals(instance_from_range<StringList>(nideps.get_after_range(nideps.get_range().begin())), def); ensure_equals(instance_from_range<StringList>(const_nideps.get_after_range(const_nideps.get_range().begin())), def); ensure_equals(instance_from_range<StringList>(nideps.get_after_range(nideps.get_node_range().begin())), def); ensure_equals(instance_from_range<StringList>(const_nideps.get_after_range(const_nideps.get_node_range().begin())), def); ensure_equals(instance_from_range<StringList>(nideps.get_after_range(nideps.get_key_range().begin())), def); // advance from "ghi" to "def", which must come after "ghi" ++sortiter; ensure_equals(instance_from_range<StringList>(const_nideps.get_after_range(sortiter)), make<StringList>(list_of("ghi"))); }
void ExecutionSystemHelper::addbNodeTree(ExecutionSystem &system, int nodes_start, bNodeTree *tree, bNodeInstanceKey parent_key) { vector<Node *>& nodes = system.getNodes(); vector<SocketConnection *>& links = system.getConnections(); const bNodeTree *basetree = system.getContext().getbNodeTree(); /* update viewers in the active edittree as well the base tree (for backdrop) */ bool is_active_group = ((parent_key.value == basetree->active_viewer_key.value) || (tree == basetree)); /* add all nodes of the tree to the node list */ bNode *node = (bNode *)tree->nodes.first; while (node != NULL) { Node *nnode = addNode(nodes, node, is_active_group, system.getContext().isFastCalculation()); if (nnode) { nnode->setbNodeTree(tree); nnode->setInstanceKey(BKE_node_instance_key(parent_key, tree, node)); } node = node->next; } NodeRange node_range(nodes.begin() + nodes_start, nodes.end()); /* add all nodelinks of the tree to the link list */ bNodeLink *nodelink = (bNodeLink *)tree->links.first; while (nodelink != NULL) { addNodeLink(node_range, links, nodelink); nodelink = nodelink->next; } /* Expand group nodes * Only go up to nodes_end, to avoid ungrouping nested node groups repeatedly. */ int nodes_end = nodes.size(); for (unsigned int i = nodes_start; i < nodes_end; ++i) { Node *execnode = nodes[i]; if (execnode->isGroupNode()) { GroupNode *groupNode = (GroupNode *)execnode; groupNode->ungroup(system); } } }
void DisplacedProblem::undisplaceMesh() { // If undisplaceMesh() is called during initial adaptivity, it is // not valid to call _mesh.getActiveSemiLocalNodeRange() since it is // not set up yet. So we are creating the Range by hand. // // We must undisplace *all* our nodes to the _ref_mesh // configuration, not just the local ones, since the partitioners // require this. We are using the GRAIN_SIZE=1 from MooseMesh.C, // not sure how this value was decided upon. // // Note: we don't have to invalidate/update as much stuff as // DisplacedProblem::updateMesh() does, since this will be handled // by a later call to updateMesh(). NodeRange node_range(_mesh.getMesh().nodes_begin(), _mesh.getMesh().nodes_end(), /*grainsize=*/1); // Undisplace the mesh using threads. Threads::parallel_for (node_range, UpdateDisplacedMeshThread(*this)); }