EXPORT void check_double_cone_point( INTERFACE *intfc) { SURFACE **s; TRI *tri,*ptris[30],**tris; int i,j,num_ptris,num_tris; POINT *p; HYPER_SURF *hs; HYPER_SURF_ELEMENT *hse; bool ptri_in_tri_list; (void) printf("Start checking double cone point\n"); next_point(intfc,NULL,NULL,NULL); while (next_point(intfc,&p,&hse,&hs)) { num_ptris = 0; num_tris = set_tri_list_around_point(p,Tri_of_hse(hse), &tris,intfc); for (s = intfc->surfaces; s && *s; ++s) { for (tri = first_tri(*s); !at_end_of_tri_list(tri,*s); tri = tri->next) { if (Point_of_tri(tri)[0] == p || Point_of_tri(tri)[1] == p || Point_of_tri(tri)[2] == p) ptris[num_ptris++] = tri; } } for (i = 0; i < num_ptris; ++i) { ptri_in_tri_list = NO; tri = ptris[i]; for (j = 0; j < num_tris; ++j) { if (tri == tris[j]) { ptri_in_tri_list = YES; break; } } if (!ptri_in_tri_list) { (void) printf("double cone point found:\n"); (void) printf("double cone point p(%d) = %f %f %f\n",p, Coords(p)[0],Coords(p)[1],Coords(p)[2]); } } } (void) printf("End checking double cone point\n"); } /* end check_double_cone_point */
LOCAL void set_tr_tf_pf_list( Front *front, C_CURVE *cc, TRI ***tr_list, int *num_trs, TRI ***tf_list, int *num_tfs, POINT ***pf_list, int *num_pfs) { int i,j,k,num_cbs,num_tf,num_tr,nt; C_BOND *cb,**cbs; SURFACE *sr,*sf; /* rigid and fabric surfaces */ TRI **tr,**tf; /* rigid and fabric tri lists */ POINT *p,**pf; /* fabric point lists */ int npf,ntr,ntf; int max_npf,max_ntr,max_ntf; COMPONENT comp,ext_comp,int_comp; /* ext_comp is the component exterior to comp domain */ /* int_comp is the component interior to comp domain */ SIDE status; TRI *t,*nbt,*tr_on,**ptris; double nearest_pt[MAXD],nor[MAXD]; int id; char dirname[100]; POINTER_Q *seed_queue,*pq; set_pointer_queue_opts(PQ_BLOCK_SIZE,200,PQ_ALLOC_TYPE,"vmalloc", PQ_ALLOC_SIZE_FOR_POINTERS,sizeof(TRI*),0); /* resetting */ num_cbs = 0; sr = sf = NULL; tr = tf = NULL; pf = NULL; npf = ntf = ntr = 0; max_npf = max_ntf = max_ntr = 0; for (cb = cc->first; cb != NULL; cb = cb->next) num_cbs++; for (i = 0; i < 2; ++i) { if (wave_type(cc->s[i]) == NEUMANN_BOUNDARY || wave_type(cc->s[i]) == MOVABLE_BODY_BOUNDARY) sr = cc->s[i]; if (wave_type(cc->s[i]) == ELASTIC_BOUNDARY) sf = cc->s[i]; } ext_comp = exterior_component(front->interf); int_comp = (positive_component(sr) == ext_comp) ? negative_component(sr) : positive_component(sr); /* Tri lists of collision rings */ for (i = 0, cb = cc->first; cb != NULL; i++, cb = cb->next) { for (k = 0; k < 2; ++k) { t = cb->s[k].t; if (t->surf == sr) check_add_tri(&tr,t,&ntr,&max_ntr); if (t->surf == sf) check_add_tri(&tf,t,&ntf,&max_ntf); } } /* Find seed tri inside the rigid surface ring */ t = find_inner_seed_tri(cc,sr,tr,ntr); if (debugging("collision")) { int ns = (t == NULL) ? 0 : 1; sprintf(dirname,"cross-tris/rigid-seed-%d",front->step); gview_plot_crossing_tris(dirname,tr,ntr,&t,ns); } /* Fill tr list with tris inside the ring */ if (t != NULL) { seed_queue = add_to_pointer_queue(NULL,NULL); seed_queue->pointer = (POINTER)t; check_add_tri(&tr,t,&ntr,&max_ntr); while (seed_queue) { pq = head_of_pointer_queue(seed_queue); t = (TRI*)(pq->pointer); for (i = 0; i < 3; ++i) { if (is_side_bdry(t,i)) continue; nbt = Tri_on_side(t,i); if (pointer_in_list((POINTER)nbt,ntr,(POINTER*)tr)) continue; seed_queue = add_to_pointer_queue(NULL,seed_queue); seed_queue->pointer = (POINTER)nbt; check_add_tri(&tr,nbt,&ntr,&max_ntr); } seed_queue = delete_from_pointer_queue(pq); } } /* Find seed tri inside the fabric surface ring */ t = find_inner_seed_tri(cc,sf,tf,ntf); if (debugging("collision")) { int ns = (t == NULL) ? 0 : 1; sprintf(dirname,"cross-tris/fabric-seed-%d",front->step); gview_plot_crossing_tris(dirname,tf,ntf,&t,ns); } /* Fill tf list with tris inside the ring */ if (t != NULL) { seed_queue = add_to_pointer_queue(NULL,NULL); seed_queue->pointer = (POINTER)t; check_add_tri(&tf,t,&ntf,&max_ntf); while (seed_queue) { pq = head_of_pointer_queue(seed_queue); t = (TRI*)(pq->pointer); for (i = 0; i < 3; ++i) { if (is_side_bdry(t,i)) continue; nbt = Tri_on_side(t,i); if (pointer_in_list((POINTER)nbt,ntf,(POINTER*)tf)) continue; seed_queue = add_to_pointer_queue(NULL,seed_queue); seed_queue->pointer = (POINTER)nbt; check_add_tri(&tf,nbt,&ntf,&max_ntf); } seed_queue = delete_from_pointer_queue(pq); } } if (debugging("collision")) { sprintf(dirname,"cross-tris/convex-%d",front->step); gview_plot_crossing_tris(dirname,tr,ntr,tf,ntf); } for (i = 0; i < ntf; ++i) { for (j = 0; j < 3; ++j) { p = Point_of_tri(tf[i])[j]; if (pointer_in_list((POINTER)p,npf,(POINTER*)pf)) continue; comp = component_wrt_tri_cluster(Coords(p),sr,tr,ntr); if (comp == ext_comp) { check_add_pt(&pf,p,&npf,&max_npf); nt = set_tri_list_around_point(p,tf[i],&ptris, front->interf); for (k = 0; k < nt; ++k) check_add_tri(&tf,ptris[k],&ntf,&max_ntf); } status = nearest_point_to_tri_cluster(Coords(p),int_comp, sr,tr,ntr,&tr_on,&id,nearest_pt,nor); add_neighbors_of_landing_tri(&tr,&ntr,sr,&max_ntr,tr_on); } } if (debugging("collision")) { (void) printf("ntr = %d ntf = %d npf = %d\n",ntr,ntf,npf); } *tr_list = tr; *num_trs = ntr; *tf_list = tf; *num_tfs = ntf; *pf_list = pf; *num_pfs = npf; } /* end set_tr_tf_pf_list */
LOCAL bool check_curve3d( CURVE *c, INTERFACE *intfc) { BOND *b; BOND_TRI **bts, **bts0; NODE *ns, *ne; SURFACE *s, **ss; TRI *tri, **tris; bool status = YES; char warn[1024]; int nsides, nbts, i; int ntris; (void) sprintf(warn,"WARNING in check_curve3d(), curve %llu inconsistent ", curve_number(c)); if (c->interface != intfc) { (void) printf("%s c->interface (%llu) != intfc (%llu)\n", warn,interface_number(c->interface), interface_number(intfc)); status = NO; } ns = c->start; if (!pointer_is_in_array(c,ns->out_curves)) { (void) printf("%s curve in not in start node (%llu) " "out_curves\n",warn,node_number(ns)); status = NO; } ne = c->end; if (!pointer_is_in_array(c,ne->in_curves)) { (void) printf("%s curve in not in end node (%llu) " "in_curves\n",warn,node_number(ne)); status = NO; } if (ns->posn != c->first->start) { (void) printf("%s ns->posn != c->first->start\n" "c->first->start = %llu, " "ns = %llu, ns->posn = %llu\n", warn,point_number(c->first->start), node_number(ns),point_number(ns->posn)); status = NO; } if (ne->posn != c->last->end) { (void) printf("%s ne->posn != c->last->end\n" "c->last->end = %llu, " "ne = %llu, ne->posn = %llu\n", warn,point_number(c->last->end), node_number(ne),point_number(ne->posn)); print_general_vector("c->last->end", Coords(c->last->end), 3, "\n"); print_general_vector("ne->posn", Coords(ne->posn), 3, "\n"); print_curve(c); status = NO; } if (!Boundary_point(ns->posn)) { (void) printf("%s ns->posn (ns = %llu, ns->posn = %llu) is not a " "boundary point\n", warn,node_number(ns),point_number(ns->posn)); status = NO; } if (!Boundary_point(ne->posn)) { (void) printf("%s ne->posn (ne = %llu, ne->posn = %llu) is not a " "boundary point\n", warn,node_number(ne),point_number(ne->posn)); status = NO; } if (!Boundary_point(c->first->start)) { (void) printf("%s c->first->start = %llu is not a " "boundary point\n", warn,point_number(c->first->start)); status = NO; } if (!Boundary_point(c->last->end)) { (void) printf("%s c->last->end = %llu is not a " "boundary point\n", warn,point_number(c->last->end)); status = NO; } for (ss = c->pos_surfaces; ss && *ss; ++ss) { if (!pointer_is_in_array(c,(*ss)->pos_curves)) { (void) printf("%s curve in not s->pos_curves " " s = %llu but s is in c->neg_surfaces\n", warn,surface_number(*ss)); status = NO; } } for (ss = c->neg_surfaces; ss && *ss; ++ss) { if (!pointer_is_in_array(c,(*ss)->neg_curves)) { (void) printf("%s curve in not s->neg_curves " " s = %llu but s is in c->neg_surfaces\n", warn,surface_number(*ss)); status = NO; } } b = c->first; bts0 = Btris(b); for (nbts = 0, bts = Btris(b); bts && *bts; ++nbts, ++bts); if (nbts == 0) { if (c->pos_surfaces || c->neg_surfaces) { (void) printf("%s curve has no bond tris but is " "connected to some surface\n",warn); status = NO; } } if (c->first->prev != NULL) { (void) printf("%s c->first->prev != NULL\n",warn); print_bond(c->first); print_bond(c->first->prev); status = NO; } if (c->last->next != NULL) { (void) printf("%s c->last->next != NULL\n",warn); print_bond(c->last); print_bond(c->last->next); status = NO; } for (b = c->first; b != NULL; b = b->next) { if (b->next && b->next->start != b->end) { (void) printf("%s bond pair (%llu -> %llu) point pointers " "inconsistent\n", warn,bond_number(b,intfc), bond_number(b->next,intfc)); print_bond(b); print_bond(b->next); status = NO; } if (!Boundary_point(b->start)) { (void) printf("%s b->start = %llu is not a " "boundary point\n", warn,point_number(b->start)); print_bond(b); status = NO; } if (!Boundary_point(b->end)) { (void) printf("%s b->end = %llu is not a " "boundary point\n", warn,point_number(b->end)); print_bond(b); status = NO; } for (i = 0, bts = Btris(b); bts && *bts; ++i, ++bts) { if ((i < nbts) && !(((*bts)->surface == bts0[i]->surface) && ((*bts)->orient == bts0[i]->orient))) { (void) printf("%s inconsistent surface numbers on " "bond tri\n",warn); (void) printf("surface = %llu surface[%d] = %llu\n", surface_number((*bts)->surface),i, surface_number(bts0[i]->surface)); (void) printf("orient = %s orient[%d] = %s\n", orientation_name((*bts)->orient),i, orientation_name(bts0[i]->orient)); print_bond(b); status = NO; } } if (i != nbts) { (void) printf("%s inconsistent %d != %d number of bond tris " "on bond\n",warn,i,nbts); print_bond(b); status = NO; } for (bts = Btris(b); bts && *bts; ++bts) { if ((*bts)->curve != c) { (void) printf("%s bond tri curve field (%llu) != c\n", warn,curve_number((*bts)->curve)); print_bond(b); status = NO; } if ((*bts)->bond != b) { (void) printf("%s bond tri bond field (%llu) != b (%llu)\n", warn,bond_number((*bts)->bond,intfc), bond_number(b,intfc)); print_bond(b); status = NO; } tri = (*bts)->tri; s = Surface_of_tri(tri); if ((*bts)->surface != s) { (void) printf("%s bond tri surface field (%llu)" "!= Surface_of_tri(tri) (%llu)\n", warn,surface_number((*bts)->surface), surface_number(s)); print_bond(b); status = NO; } for (nsides = 0, i = 0; i < 3; ++i) { if (is_side_bdry(tri,i) && (b==Bond_on_side(tri,i))) ++nsides; } if (nsides == 0) { (void) printf("%s bond not found on tri side\n",warn); print_bond(b); print_tri(tri,intfc); status = NO; } else if (nsides > 1) { (void) printf("%s bond found on multiple tri sides\n",warn); print_bond(b); print_tri(tri,intfc); status = NO; } else { if (orientation_of_bond_at_tri(b,tri) != (*bts)->orient) { (void) printf("%s inconsistent orientation at " "bond tri\n",warn); print_tri(tri,intfc); print_bond(b); status = NO; } switch ((*bts)->orient) { case POSITIVE_ORIENTATION: if (!pointer_is_in_array(c,s->pos_curves)) { (void) printf("%s curve in not s->pos_curves " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } if (!pointer_is_in_array(s,c->pos_surfaces)) { (void) printf("%s surface in not c->pos_surfaces " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } break; case NEGATIVE_ORIENTATION: if (!pointer_is_in_array(c,s->neg_curves)) { (void) printf("%s curve in not s->neg_curves " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } if (!pointer_is_in_array(s,c->neg_surfaces)) { (void) printf("%s surface in not c->neg_surfaces " " s = %llu\n", warn,surface_number(s)); print_bond(b); print_tri(tri,intfc); status = NO; } break; case ORIENTATION_NOT_SET: (void) printf("%s inconsistent point and tri " "points\n",warn); print_bond(b); print_tri(tri,intfc); status = NO; break; } } if (b->prev) { TRI *t0, *t1; ntris = set_tri_list_around_point(b->start,tri,&tris,intfc); t0 = tris[0]; t1 = tris[ntris-1]; if (!(((side_of_tri_with_bond(b,t0) < 3) && (side_of_tri_with_bond(b->prev,t1) < 3)) || ((side_of_tri_with_bond(b,t1) < 3) && (side_of_tri_with_bond(b->prev,t0) < 3))) ) { (void) printf("%s, corrupt tri list at b->start\n", warn); (void) printf("Bond b\n"); print_bond(b); (void) printf("Bond b->prev\n"); print_bond(b->prev); print_tri(tri,intfc); (void) printf("number of tris at point = %d\n",ntris); for (i = 0; i < ntris; ++i) { (void) printf("tris[%d] - ",i); print_tri(tris[i],intfc); } status = NO; } } } } return status; } /*end check_curve3d*/
LOCAL bool i_consistent_interface3d( INTERFACE *intfc) { HYPER_SURF_ELEMENT *hse; HYPER_SURF *hs; CURVE **c; NODE **n; POINT *p; SURFACE **ss, *s; TRI *tri; bool status = YES; const char *warn = "WARNING in i_consistent_interface(), "; /* Check Nodes */ for (n = intfc->nodes; n && *n; ++n) { if ((*n)->interface != intfc) { (void) printf("%s n = %llu n->interface (%llu) != intfc (%llu)\n", warn,node_number(*n), interface_number((*n)->interface), interface_number(intfc)); status = NO; } for (c = (*n)->in_curves; c && *c; ++c) { if ((*c)->end != *n) { (void) printf("%s inconsistent node (%llu) " "curve (%llu) pair, " "curve->end != n\n", warn,node_number(*n),curve_number(*c)); status = NO; } } for (c = (*n)->out_curves; c && *c; ++c) { if ((*c)->start != *n) { (void) printf("%s inconsistent node (%llu) " "curve (%llu) pair, " "curve->start != n\n", warn,node_number(*n),curve_number(*c)); status = NO; } } } /* Check Curves */ for (c = intfc->curves; c && *c; c++) { if (!check_curve3d(*c,intfc)) { (void) printf("%s inconsistency in curve (%llu) found\n", warn,curve_number(*c)); status = NO; } } for (ss = intfc->surfaces; ss && *ss; ++ss) { if (!check_consistency_of_tris_on_surface(*ss)) { (void) printf("%s inconsistency in surface (%llu) found\n", warn,surface_number(*ss)); status = NO; } } (void) next_point(intfc,NULL,NULL,NULL); while (next_point(intfc,&p,&hse,&hs)) { BOND *b = NULL, *bb; BOND_TRI **bts; CURVE **c; TRI **tris; int i, ntris; int v, pside, nside; tri = Tri_of_hse(hse); s = Surface_of_hs(hs); if ((v = Vertex_of_point(tri,p)) == ERROR) { (void) printf("%s point not on tri, s = %llu\n", warn,surface_number(s)); (void) printf("p(%llu) - (%g, %g, %g), ", point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); status = NO; } if (!Boundary_point(p)) { ntris = set_tri_list_around_point(p,tri,&tris,intfc); if ((tri != tris[0]) || (tri != Prev_tri_at_vertex(tris[ntris-1],p))) { bool consistent_tri_list = NO; if (allow_null_sides) { if ((Next_tri_at_vertex(tris[0],p) == NULL) && (Prev_tri_at_vertex(tris[ntris-1],p) == NULL)) consistent_tri_list = YES; } if (!consistent_tri_list) { (void) printf("\n%s Corrupt tri list s (%llu) " "p(%llu) - (%g, %g, %g)\n", warn,surface_number(s), point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); (void) printf("%d tris about point\n",ntris); for (i = 0; i < ntris; ++i) { (void) printf("tris[%d] - ",i); print_tri(tris[i],hs->interface); } (void) printf("End printout of " "Corrupt tri list s (%llu) " "p(%llu) - (%g, %g, %g)\n\n", surface_number(s),point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); status = NO; } } continue; } nside = v; pside = Prev_m3(v); if (is_side_bdry(tri,nside)) b = Bond_on_side(tri,nside); else if (is_side_bdry(tri,pside)) b = Bond_on_side(tri,pside); else //#bjet2 { ntris = set_tri_list_around_point(p,tri,&tris,intfc); v = Vertex_of_point(tris[0],p); nside = v; pside = Prev_m3(v); if (is_side_bdry(tris[0],nside)) b = Bond_on_side(tris[0],nside); else if (is_side_bdry(tris[0],pside)) b = Bond_on_side(tris[0],pside); else { int i; (void) printf("%s Boundary_point has no adjacent " "tri with a bond\n",warn); (void) printf("p(%llu) - (%g, %g, %g), ", point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); for (i = 0; i < ntris; ++i) { (void) printf("tris[%d] - ",i); print_tri(tris[i],hs->interface); } status = NO; } tri = tris[0]; } for (bts = Btris(b); bts && *bts; ++bts) if ((*bts)->tri == tri) break; if ((bts == NULL) || (*bts == NULL)) { (void) printf("%s bond tri for tri not found\n",warn); (void) printf("p(%llu) - (%g, %g, %g), ",point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); print_bond(b); status = NO; } else { if ((*bts)->bond != b) { (void) printf("%s (*bts)->bond != b\n",warn); (void) printf("p(%llu) - (%g, %g, %g), ",point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); print_bond(b); status = NO; } if ((*bts)->surface != s) { (void) printf("%s inconsistent surfaces at bond tri\n", warn); (void) printf("p(%llu) - (%g, %g, %g), ",point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); print_bond(b); status = NO; } if (orientation_of_bond_at_tri(b,tri) != (*bts)->orient) { (void) printf("%s inconsistent orientation at bond tri\n", warn); (void) printf("p(%llu) - (%g, %g, %g), ",point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); print_bond(b); status = NO; } switch ((*bts)->orient) { case POSITIVE_ORIENTATION: for (c = s->pos_curves; c && *c; c++) if ((*c) == (*bts)->curve) break; break; case NEGATIVE_ORIENTATION: for (c = s->neg_curves; c && *c; c++) if ((*c) == (*bts)->curve) break; break; case ORIENTATION_NOT_SET: c = NULL; (void) printf("%s undetermined orientation at " "bond on tri\n",warn); (void) printf("p(%llu) - (%g, %g, %g), ",point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); print_bond(b); status = NO; break; } if ((c == NULL) || (*c == NULL)) { (void) printf("%s curve with bond on tri not found\n",warn); (void) printf("p(%llu) - (%g, %g, %g), ",point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); print_bond(b); status = NO; } else { for (bb = (*c)->first; bb != NULL; bb = bb->next) if (bb == b) break; if (bb == NULL) { (void) printf("%s bond not on curve\n",warn); (void) printf("p(%llu) - (%g, %g, %g), ",point_number(p), Coords(p)[0],Coords(p)[1],Coords(p)[2]); print_tri(tri,hs->interface); print_bond(b); print_curve(*c); status = NO; } } } } if (status == NO) { (void) printf("WARNING in i_consistent_interface(), " "Inconsistent interface found\n"); print_interface(intfc); } allow_null_sides = NO; return status; } /*end i_consistent_interface*/