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; }