From: Michael P. <pov...@in...> - 2007-03-27 15:08:40
|
if I want to refine, than I can put REFINE flag, of course. The thing is that I usually don't want to refine anything, but I have to remove some elements from the simulation. I understand that I "abuse" libmesh features, but I didn't find a better solution. Michael. John Peterson wrote: > What about setting the REFINE flag for elements which you'd like > to refine, and then calling the mesh refinement function? As Roy > pointed out, INACTIVE has a special meaning for the library... > > Your patch seems OK to me, but I wonder if it should really be > > assert (this->has_children()); > > to enforce the idea that "inactive" elements have children. > Your code would fail this assert of course, but would it work > if you set the REFINE flag instead? > > -John > > > Michael Povolotskyi writes: > > Dear developers, > > I'm currently working on a problem, where I have to solve two different > > problems on different regions of the same mesh. > > In order to do so, I programmed a code in which I make elements to be > > active or not, depending on which region they belong to. > > I set a flag INACTIVE or DO_NOTHING to the elements and call the > > refinement function. > > > > > > Then I found a problem. As far as I can see, the element activity status > > is introduced in order to control the refinement only. > > So, it is assumed that if an element is not active, it must have children. > > Due to this, the function > > void Elem::active_family_tree_by_neighbor (std::vector<const Elem*>& > > family, > > const Elem* neighbor, > > const bool reset) const > > > > crashed. > > So, I modified it a bit by adding an if(this->has_children()) statement: > > > > void Elem::active_family_tree_by_neighbor (std::vector<const Elem*>& > > family, > > const Elem* neighbor, > > const bool reset) const > > { > > // Clear the vector if the flag reset tells us to. > > if (reset) > > family.clear(); > > > > // This only makes sense if we're already a neighbor > > assert (this->is_neighbor(neighbor)); > > > > // Add an active element to the family tree. > > if (this->active()) > > family.push_back(this); > > > > // Or recurse into an ancestor element's children. > > // Do not clear the vector any more. > > else > > { > > if (this->has_children()) //added by me > > for (unsigned int c=0; c<this->n_children(); c++) > > if (this->child(c)->is_neighbor(neighbor)) > > this->child(c)->active_family_tree_by_neighbor (family, > > neighbor, false); > > } > > } > > > > Now it works. > > What do you think about it? May I go this way? > > Thank you, > > Michael. > > -- ------------------------------------------------------------ Michael Povolotskyi, Ph.D. University of Rome "Tor Vergata" Department of Electronic Engineering Viale Politecnico, 1 - 00133 Rome - Italy Phone + 39 06 72597781 Fax + 39 06 2020519 http://www.optolab.uniroma2.it/pages/moshe/moshe.html ------------------------------------------------------------- |