// preserve orientation of the most anisotropic metric in 2D!!! SMetric3 intersection_conserve_mostaniso_2d (const SMetric3 &m1, const SMetric3 &m2) { fullMatrix<double> V1(3,3); fullVector<double> S1(3); m1.eig(V1,S1,false); double ratio1 = anisoRatio2D(V1(0,0),V1(1,0),V1(2,0), V1(0,1),V1(1,1),V1(2,1), V1(0,2),V1(1,2),V1(2,2), S1(0),S1(1),S1(2)); fullMatrix<double> V2(3,3); fullVector<double> S2(3); m2.eig(V2,S2,false); double ratio2 = anisoRatio2D(V2(0,0),V2(1,0),V2(2,0), V2(0,1),V2(1,1),V2(2,1), V2(0,2),V2(1,2),V2(2,2), S2(0),S2(1),S2(2)); if (ratio1 < ratio2) return intersection_conserveM1(m1, m2); else return intersection_conserveM1(m2, m1); }
// preserve orientation of the most anisotropic metric !!! SMetric3 intersection_conserve_mostaniso (const SMetric3 &m1, const SMetric3 &m2) { fullMatrix<double> V1(3,3); fullVector<double> S1(3); m1.eig(V1,S1,true); double ratio1 = fabs(S1(0)/S1(2)); // Minimum ratio because we take sorted eigenvalues fullMatrix<double> V2(3,3); fullVector<double> S2(3); m2.eig(V2,S2,true); double ratio2 = fabs(S2(0)/S2(2)); // Minimum ratio because we take sorted eigenvalues if (ratio1 < ratio2) return intersection_conserveM1(m1, m2); else return intersection_conserveM1(m2, m1); }
static SMetric3 metric_based_on_surface_curvature(const GEdge *ge, double u, bool iso_surf) { const GEdgeCompound* ptrCompoundEdge = dynamic_cast<const GEdgeCompound*>(ge); if (ptrCompoundEdge){ double cmax, cmin; SVector3 dirMax,dirMin; cmax = ptrCompoundEdge->curvatures(u,&dirMax, &dirMin, &cmax,&cmin); if (cmin == 0)cmin =1.e-12; if (cmax == 0)cmax =1.e-12; double lambda2 = ((2 * M_PI) /( fabs(cmax) * CTX::instance()->mesh.minCircPoints ) ); double lambda1 = ((2 * M_PI) /( fabs(cmin) * CTX::instance()->mesh.minCircPoints ) ); SVector3 Z = crossprod(dirMax,dirMin); lambda1 = std::max(lambda1, CTX::instance()->mesh.lcMin); lambda2 = std::max(lambda2, CTX::instance()->mesh.lcMin); lambda1 = std::min(lambda1, CTX::instance()->mesh.lcMax); lambda2 = std::min(lambda2, CTX::instance()->mesh.lcMax); SMetric3 curvMetric (1. / (lambda1 * lambda1), 1. / (lambda2 * lambda2), 1.e-12, dirMin, dirMax, Z); return curvMetric; } else{ SMetric3 mesh_size(1.e-12); std::list<GFace *> faces = ge->faces(); std::list<GFace *>::iterator it = faces.begin(); // we choose the metric eigenvectors to be the ones // related to the edge ... SMetric3 curvMetric = max_edge_curvature_metric(ge, u); while(it != faces.end()){ if (((*it)->geomType() != GEntity::CompoundSurface) && ((*it)->geomType() != GEntity::DiscreteSurface)){ SPoint2 par = ge->reparamOnFace((*it), u, 1); SMetric3 m = metric_based_on_surface_curvature (*it, par.x(), par.y(), iso_surf); curvMetric = intersection_conserveM1(curvMetric,m); } ++it; } return curvMetric; } }
static double F_Lc_aniso(GEdge *ge, double t) { #if defined(HAVE_ANN) FieldManager *fields = ge->model()->getFields(); BoundaryLayerField *blf = 0; Field *bl_field = fields->get(fields->getBoundaryLayerField()); blf = dynamic_cast<BoundaryLayerField*> (bl_field); #else bool blf = false; #endif GPoint p = ge->point(t); SMetric3 lc_here; Range<double> bounds = ge->parBounds(0); double t_begin = bounds.low(); double t_end = bounds.high(); if(t == t_begin) lc_here = BGM_MeshMetric(ge->getBeginVertex(), t, 0, p.x(), p.y(), p.z()); else if(t == t_end) lc_here = BGM_MeshMetric(ge->getEndVertex(), t, 0, p.x(), p.y(), p.z()); else lc_here = BGM_MeshMetric(ge, t, 0, p.x(), p.y(), p.z()); #if defined(HAVE_ANN) if (blf && !blf->isEdgeBL(ge->tag())){ SMetric3 lc_bgm; blf->computeFor1dMesh ( p.x(), p.y(), p.z() , lc_bgm ); lc_here = intersection_conserveM1 (lc_here, lc_bgm ); } #endif SVector3 der = ge->firstDer(t); double lSquared = dot(der, lc_here, der); return sqrt(lSquared); }