LOCAL TRI *find_inner_seed_tri( C_CURVE *cc, SURFACE *surf, TRI **tris, int nt) { C_BOND *cb; TRI *t,*nbt; int i,j,k,ii; POINT *p; for (cb = cc->first; cb != NULL; cb = cb->next) { for (k = 0; k < 2; ++k) { t = cb->s[k].t; if (t->surf != surf) continue; 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,nt,(POINTER*)tris)) continue; for (j = 0; j < 3; ++j) { if (is_side_bdry(nbt,j)) continue; if (Tri_on_side(nbt,j) != t) continue; p = Point_of_tri(nbt)[(j+2)%3]; if (point_inside_c_curve(p,cc)) { return nbt; } } } } } return NULL; } /* end find_inner_seed_tri */
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 tri_side_consistent( TRI *tri, TRI_NEIGHBOR *neighbor, int side, INTERFACE *intfc) { TRI *side_tri; POINT *ps = Point_of_tri(tri)[side]; POINT *pe = Point_of_tri(tri)[Next_m3(side)]; bool status = YES; int i, bd; bd = Boundary_tri(tri); if (bd < 0 || bd > 7) { (void) printf("WARNING in tri_side_consistent(), " "Boundary_tri(tri) = %d is bad\n", bd); print_tri(tri,intfc); status = NO; } if (neighbor == NULL) { if (!allow_null_sides) { (void) printf("WARNING in tri_side_consistent(), " "neighbor is null\n"); print_tri(tri,intfc); status = NO; } } else if (is_side_bdry(tri,side)) { BOND *b; BOND_TRI *bt = neighbor->btri; BOND_TRI **btris; ORIENTATION orient; bool btri_is_in_list; int num_tri_in_btri; if (bt == NULL) { (void) printf("WARNING in tri_side_consistent(), " "NULL BOND_TRI on tri side %d\n",side); print_tri(tri,intfc); status = NO; } else if ((b = bt->bond) == NULL) { (void) printf("WARNING in tri_side_consistent(), " "NULL bond on BOND_TRI on side %d\n",side); print_tri(tri,intfc); status = NO; } else { btri_is_in_list = NO; for (num_tri_in_btri = 0, btris = Btris(b); btris && *btris; ++btris) { if ((*btris)->tri == tri) { ++num_tri_in_btri; if (bt == *btris) btri_is_in_list = YES; } } if (num_tri_in_btri == 0) { (void) printf("WARNING in tri_side_consistent(), " "Tri is not on bond btris list,\n"); (void) printf("ps(%llu) - (%g, %g, %g), ", point_number(ps), Coords(ps)[0],Coords(ps)[1],Coords(ps)[2]); (void) printf("\tpe(%llu) - (%g, %g, %g)\n", point_number(pe), Coords(pe)[0],Coords(pe)[1],Coords(pe)[2]); (void) printf("tri - \n"); print_tri(tri,intfc); (void) printf("bond - \n"); print_bond(b); status = NO; } else if (num_tri_in_btri != 1) { (void) printf("WARNING in tri_side_consistent(), Tri is " "in bond btris list more than once,\n"); (void) printf("ps(%llu) - (%g, %g, %g), ", point_number(ps), Coords(ps)[0],Coords(ps)[1],Coords(ps)[2]); (void) printf("\tpe(%llu) - (%g, %g, %g)\n", point_number(pe), Coords(pe)[0],Coords(pe)[1],Coords(pe)[2]); (void) printf("tri - \n"); print_tri(tri,intfc); (void) printf("bond - \n"); print_bond(b); status = NO; } if (!btri_is_in_list) { (void) printf("WARNING in tri_side_consistent(), Bond tri " "is not in bond btris list,\n"); (void) printf("ps(%llu) - (%g, %g, %g), ", point_number(ps), Coords(ps)[0],Coords(ps)[1],Coords(ps)[2]); (void) printf("\tpe(%llu) - (%g, %g, %g)\n", point_number(pe), Coords(pe)[0],Coords(pe)[1],Coords(pe)[2]); (void) printf("tri - \n"); print_tri(tri,intfc); (void) printf("bond - \n"); print_bond(b); status = NO; } orient = orientation_of_bond_at_tri(b,tri); if (orient == ORIENTATION_NOT_SET) { (void) printf("WARNING in tri_side_consistent(), " "Tri side points not on bond,\n"); (void) printf("ps(%llu) - (%g, %g, %g), ", point_number(ps), Coords(ps)[0],Coords(ps)[1],Coords(ps)[2]); (void) printf("\tpe(%llu) - (%g, %g, %g)\n", point_number(pe), Coords(pe)[0],Coords(pe)[1],Coords(pe)[2]); (void) printf("tri - \n"); print_tri(tri,intfc); (void) printf("bond - \n"); print_bond(b); status = NO; } if (orient != bt->orient) { (void) printf("WARNING in tri_side_consistent(), " "inconsistent bond tri orientation,\n"); (void) printf("ps(%llu) - (%g, %g, %g), ", point_number(ps), Coords(ps)[0],Coords(ps)[1],Coords(ps)[2]); (void) printf("\tpe(%llu) - (%g, %g, %g)\n", point_number(pe), Coords(pe)[0],Coords(pe)[1],Coords(pe)[2]); (void) printf("tri - \n"); print_tri(tri,intfc); (void) printf("bond - \n"); print_bond(b); status = NO; } } } else { if ((side_tri = neighbor->tri) == NULL) { if (!allow_null_sides) { status = NO; (void) printf("WARNING in tri_side_consistent(), " "neighbor->tri == NULL\n"); (void) printf("tri - \n"); print_tri(tri,intfc); } } else { for (i = 0; i < 3; ++i) { if (Tri_on_side(side_tri,i) == tri) { POINT *p0, *p1; p0 = Point_of_tri(side_tri)[i]; p1 = Point_of_tri(side_tri)[Next_m3(i)]; if (p0 != pe || p1 != ps) { (void) printf("WARNING in tri_side_consistent(), " "Points on side %d do not match,\n",i); (void) printf("ps(%llu) - (%g, %g, %g), ", point_number(ps), Coords(ps)[0], Coords(ps)[1], Coords(ps)[2]); (void) printf("\tpe(%llu) - (%g, %g, %g)\n", point_number(pe), Coords(pe)[0], Coords(pe)[1], Coords(pe)[2]); (void) printf("p1(%llu) - (%g, %g, %g), ", point_number(p1), Coords(p1)[0], Coords(p1)[1], Coords(p1)[2]); (void) printf("\tp0(%llu) - (%g, %g, %g)\n", point_number(p0), Coords(p0)[0], Coords(p0)[1], Coords(p0)[2]); (void) printf("tri - "); print_tri(tri,intfc); (void) printf("side_tri - "); print_tri(side_tri,intfc); status = NO; } break; } } if (i == 3) { (void) printf("WARNING in tri_side_consistent(), " "No side matches tri\n"); (void) printf("ps(%llu): (%g, %g, %g), " "\tpe(%llu): (%g, %g, %g)\n", point_number(ps), Coords(ps)[0],Coords(ps)[1],Coords(ps)[2], point_number(pe), Coords(pe)[0],Coords(pe)[1],Coords(pe)[2]); (void) printf("tri - \n"); print_tri(tri,intfc); (void) printf("side_tri - \n"); print_tri(side_tri,intfc); status = NO; } } } return status; } /*end tri_side_consistent*/