Exemplo n.º 1
0
	Vectors::Vectors(Mesh * m, TagRealArray t, ElementType etype) : m(m), etype(etype)
	{
		double cmin[3] = { 1.0e20, 1.0e20, 1.0e20};
		double cmax[3] = {-1.0e20,-1.0e20,-1.0e20};
		for(int k = 0; k < m->NodeLastLocalID(); ++k) if( m->isValidNode(k) )
		{
			Node n = m->NodeByLocalID(k);
			for(int l = 0; l < 3; ++l)
			{
				if( cmin[l] > n->Coords()[l] ) cmin[l] = n->Coords()[l];
				if( cmax[l] < n->Coords()[l] ) cmax[l] = n->Coords()[l];
			}
		}
		double diag = 0;
		for(int l = 0; l < 3; ++l)
			diag += (cmax[l]-cmin[l])*(cmax[l]-cmin[l]);
		diag = sqrt(diag); //estimate mesh size
		max_length = 0;
		for(int k = 0; k < m->LastLocalID(etype); ++k) if( m->isValidElement(etype,k) )
		{
			Element e = m->ElementByLocalID(etype,k);
			if( e.HaveData(t) )
			{
				vec_t add;
				e->Centroid(add.cnt.data());
				add.eid = k;
				for(int l = 0; l < std::min(t[e].size(),3u); ++l)
					add.dir[l] = t[e][l];
				double l = add.dir.length();
				if( l > max_length ) max_length = l;
				add.dir /= l;
				add.length = l;
				vecs.push_back(add);
			}
		}
		scale = diag/100.0;
		std::cout << "scale: " << scale << std::endl;
	}