From 12c7208444415f1a0a7f5d0f5767522821349027 Mon Sep 17 00:00:00 2001 From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be> Date: Tue, 8 Nov 2005 15:35:58 +0000 Subject: [PATCH] *** empty log message *** --- Common/AdaptiveViews.cpp | 104 ++++++++++++++++++++++++++++++++++++++- Common/AdaptiveViews.h | 36 ++++++++++++++ 2 files changed, 138 insertions(+), 2 deletions(-) diff --git a/Common/AdaptiveViews.cpp b/Common/AdaptiveViews.cpp index 910fb8b0aa..fd2743c33d 100644 --- a/Common/AdaptiveViews.cpp +++ b/Common/AdaptiveViews.cpp @@ -33,11 +33,13 @@ void computeShapeFunctions ( Double_Matrix *coeffs, Double_Matrix *eexps , double u, double v, double w,double *sf); std::set<adapt_point> adapt_point::all_points; +std::list<adapt_edge*> adapt_edge::all_elems; std::list<adapt_triangle*> adapt_triangle::all_elems; std::list<adapt_tet*> adapt_tet::all_elems; std::list<adapt_quad*> adapt_quad::all_elems; std::list<adapt_hex*> adapt_hex::all_elems; #define MAX_NB_NOD 8 +int adapt_edge::nbNod = 2; int adapt_triangle::nbNod = 3; int adapt_tet::nbNod = 4; int adapt_quad::nbNod = 4; @@ -60,6 +62,16 @@ adapt_point * adapt_point::New ( double x, double y, double z, Double_Matrix *co return (adapt_point*) & (*it); } +void adapt_edge::Create (int maxlevel, Double_Matrix *coeffs, Double_Matrix *eexps) +{ + int level = 0; + cleanElement<adapt_edge> (); + adapt_point *p1 = adapt_point::New ( -1,0,0, coeffs, eexps); + adapt_point *p2 = adapt_point::New ( 1,0,0, coeffs, eexps); + adapt_edge *t = new adapt_edge(p1,p2); + Recur_Create (t, maxlevel,level,coeffs,eexps) ; +} + void adapt_triangle::Create (int maxlevel, Double_Matrix *coeffs, Double_Matrix *eexps) { @@ -112,6 +124,28 @@ void adapt_hex::Create (int maxlevel, Double_Matrix *coeffs, Double_Matrix *eexp Recur_Create (h, maxlevel,level,coeffs,eexps) ; } + +void adapt_edge::Recur_Create (adapt_edge *e, int maxlevel, int level , Double_Matrix *coeffs, Double_Matrix *eexps) +{ + all_elems.push_back(e); + if (level++ >= maxlevel) + return; + + /* + p1 p12 p2 + */ + + adapt_point *p1 = e->p[0]; + adapt_point *p2 = e->p[1]; + adapt_point *p12 = adapt_point::New ( (p1->x+p2->x)*0.5,(p1->y+p2->y)*0.5, (p1->z+p2->z)*0.5, coeffs, eexps); + adapt_edge *e1 = new adapt_edge (p1,p12); + Recur_Create (e1, maxlevel,level,coeffs,eexps); + adapt_edge *e2 = new adapt_edge (p12,p2); + Recur_Create (e2, maxlevel,level,coeffs,eexps); + e->e[0]=e1;e->e[1]=e2; +} + + void adapt_triangle::Recur_Create (adapt_triangle *t, int maxlevel, int level , Double_Matrix *coeffs, Double_Matrix *eexps) { all_elems.push_back(t); @@ -289,6 +323,11 @@ void adapt_hex::Recur_Create (adapt_hex *h, int maxlevel, int level , Double_Mat h->e[4]=h5;h->e[5]=h6;h->e[6]=h7;h->e[7]=h8; } +void adapt_edge::Error ( double AVG , double tol ) +{ + adapt_edge *e = *all_elems.begin(); + Recur_Error (e,AVG,tol); +} void adapt_triangle::Error ( double AVG , double tol ) { @@ -313,6 +352,53 @@ void adapt_hex::Error ( double AVG , double tol ) Recur_Error (h,AVG,tol); } +void adapt_edge::Recur_Error ( adapt_edge *e, double AVG, double tol ) +{ + if(!e->e[0])e->visible = true; + else + { + double vr; + if (!e->e[0]->e[0]) + { + double v1 = e->e[0]->V(); + double v2 = e->e[1]->V(); + vr = (v1 + v2 )/2.; + double v = e->V(); + if ( fabs(v - vr) > AVG * tol ) + //if ( fabs(v - vr) > ((fabs(v) + fabs(vr) + AVG * tol) * tol ) ) + { + e->visible = false; + Recur_Error (e->e[0],AVG,tol); + Recur_Error (e->e[1],AVG,tol); + } + else + e->visible = true; + } + else + { + double v11 = e->e[0]->e[0]->V(); + double v12 = e->e[0]->e[1]->V(); + + double v21 = e->e[1]->e[0]->V(); + double v22 = e->e[1]->e[1]->V(); + + double vr1 = (v11 + v12 )/2.; + double vr2 = (v21 + v22 )/2.; + vr = (vr1+vr2)/2.; + if ( fabs(e->e[0]->V() - vr1) > AVG * tol || + fabs(e->e[1]->V() - vr2) > AVG * tol || + fabs(e->V() - vr) > AVG * tol ) + { + e->visible = false; + Recur_Error (e->e[0],AVG,tol); + Recur_Error (e->e[1],AVG,tol); + } + else + e->visible = true; + } + } +} + void adapt_triangle::Recur_Error ( adapt_triangle *t, double AVG, double tol ) { if(!t->e[0])t->visible = true; @@ -699,7 +785,13 @@ void Adaptive_Post_View:: setAdaptiveResolutionLevel (Post_View * view , int lev int nbelm = _STposX->size1(); int TYP = 0; - + if (view->NbSL) + { + TYP = 5; + List_Delete(view->SL); + view->NbSL = 0; + view->SL =List_Create ( nbelm * 8, nbelm , sizeof(double)); + } if (view->NbST) { TYP = 1; @@ -736,6 +828,7 @@ void Adaptive_Post_View:: setAdaptiveResolutionLevel (Post_View * view , int lev while (1) { + if (TYP == 5)setAdaptiveResolutionLevel_TEMPL <adapt_edge> ( view,level_act,level, plug,&(view->SL),&(view->NbSL),done) ; if (TYP == 1)setAdaptiveResolutionLevel_TEMPL <adapt_triangle> ( view,level_act,level, plug,&(view->ST),&(view->NbST),done) ; if (TYP == 2)setAdaptiveResolutionLevel_TEMPL <adapt_quad> ( view,level_act,level, plug,&(view->SQ),&(view->NbSQ),done) ; if (TYP == 4)setAdaptiveResolutionLevel_TEMPL <adapt_hex> ( view,level_act,level, plug,&(view->SH),&(view->NbSH),done) ; @@ -829,7 +922,13 @@ void Adaptive_Post_View:: initWithLowResolution (Post_View *view) List_T *myList; int nbelm; int nbnod; - if (view->NbST) + if (view->NbSL) + { + myList = view->SL; + nbelm = view->NbSL; + nbnod = 2; + } + else if (view->NbST) { myList = view->ST; nbelm = view->NbST; @@ -930,6 +1029,7 @@ Adaptive_Post_View::~Adaptive_Post_View() delete _STval; if(_Interpolate)delete _Interpolate; if(_Geometry)delete _Geometry; + cleanElement<adapt_edge>(); cleanElement<adapt_triangle> (); cleanElement<adapt_tet> (); cleanElement<adapt_hex> (); diff --git a/Common/AdaptiveViews.h b/Common/AdaptiveViews.h index 23953719b3..de6f8bbcaf 100644 --- a/Common/AdaptiveViews.h +++ b/Common/AdaptiveViews.h @@ -57,6 +57,42 @@ public : static std::set<adapt_point> all_points; }; +class adapt_edge +{ +public: + adapt_edge (adapt_point *p1,adapt_point *p2) + : visible(false) + { + p[0]=p1; + p[1]=p2; + e[0]=e[1]=0; + } + inline double V () const + { + return (p[0]->val + p[1]->val)/2.; + } + inline static void GSF (const double u, const double v, double w, double sf[]) + { + sf[0] = (1-u)/2.; + sf[1] = (1+u)/2.; + } + void print () + { + printf ("p1 %g %g p2 %g %g \n",p[0]->x,p[0]->y,p[1]->x,p[1]->y); + } + static void Create (int maxlevel, Double_Matrix *coeffs, Double_Matrix *eexps) ; + static void Recur_Create (adapt_edge *e, int maxlevel, int level , Double_Matrix *coeffs, Double_Matrix *eexps); + static void Error ( double AVG , double tol ); + static void Recur_Error ( adapt_edge *e, double AVG, double tol ); + bool visible; + adapt_point *p[2]; + adapt_edge *e[2]; + static std::list<adapt_edge*> all_elems; + static int nbNod; +}; + + + class adapt_triangle { public: -- GitLab