LOCAL void EnforceFlowSpecifedStates1d( Front *fr) { INTERFACE *intfc; HYPER_SURF *hs; POINT **p; Locstate sl, sr; if ((fr==NULL) || (Fsr_list(fr)==NULL) || (fr->rect_grid->dim!=1)) return; intfc = fr->interf; for (p = intfc->points; p && *p; ++p) { hs = Hyper_surf(*p); if (BothSidesActive(hs,fr) == NO) { slsr(*p,NULL,Hyper_surf(*p),&sl,&sr); (void) RegionIsFlowSpecified(sl,NULL,Coords(*p), negative_component(hs),NO_COMP,fr); (void) RegionIsFlowSpecified(sr,NULL,Coords(*p), positive_component(hs),NO_COMP,fr); } } } /*end EnforceFlowSpecifedStates1d*/
LOCAL void EnforceFlowSpecifedStates2d( Front *fr) { INTERFACE *intfc; CURVE **c; POINT *p; HYPER_SURF *hs; BOND *b; Locstate sl, sr; if ((fr==NULL) || (Fsr_list(fr)==NULL) || (fr->rect_grid->dim!=2)) return; intfc = fr->interf; for (c = intfc->curves; c && *c; ++c) { hs = Hyper_surf(*c); if (is_subdomain_boundary(hs) || is_passive_boundary(hs)) continue; if (BothSidesActive(hs,fr) == NO) { b = (*c)->first; p = b->start; slsr(p,Hyper_surf_element(b),hs,&sl,&sr); (void) RegionIsFlowSpecified(sl,NULL,Coords(p), negative_component(hs),NO_COMP,fr); (void) RegionIsFlowSpecified(sr,NULL,Coords(p), positive_component(hs),NO_COMP,fr); for (; b != NULL; b = b->next) { p = b->end; slsr(p,Hyper_surf_element(b),hs,&sl,&sr); (void) RegionIsFlowSpecified(sl,NULL,Coords(p), negative_component(hs),NO_COMP,fr); (void) RegionIsFlowSpecified(sr,NULL,Coords(p), positive_component(hs),NO_COMP,fr); } } } } /*end EnforceFlowSpecifedStates2d*/
LOCAL void change_states_param( Front *front, Wave *wave, int comp, Gas_param *new_param) { HYPER_SURF *hs; HYPER_SURF_ELEMENT *hse; POINT *pt; SURFACE **s; Locstate stl, str, ref_st; int i, d, gridmax, vgmax[MAXD], tmp, ic[MAXD]; FD_DATA *fd_data; INTERFACE *intfc = front->interf; int dim = intfc->dim; printf("#change dirichlet boundary condition params.\n"); for(s=intfc->surfaces; s && *s; s++) { hs = Hyper_surf(*s); if(wave_type(hs) != DIRICHLET_BOUNDARY) continue; if(boundary_state_data(hs) == NULL) continue; fd_data = (FD_DATA *)boundary_state_data(hs); ref_st = fd_data->state; if(gas_params_for_comp(comp, intfc) != Params(ref_st)) continue; printf("change param for FD_DATA.\n"); verbose_print_state("bf ref", ref_st); change_param(ref_st, comp, new_param); verbose_print_state("af ref", ref_st); } printf("#change intfc params.\n"); next_point(intfc, NULL,NULL,NULL); while (next_point(intfc,&pt,&hse,&hs)) { slsr(pt,hse,hs,&stl,&str); change_param(str,positive_component(hs),new_param); change_param(stl,negative_component(hs),new_param); if(the_point(pt)) { printf("%d %d\n", negative_component(hs), positive_component(hs)); verbose_print_state("stl", stl); verbose_print_state("str", str); } } //check_print_intfc("After change intfc params", "ch_param", 'g', // intfc, 1, -1, NO); printf("#change interior params.\n"); gridmax = 1; for (d = 0; d < dim; d++) { vgmax[d] = wave->rect_grid->gmax[d] + wave->rect_grid->lbuf[d] + wave->rect_grid->ubuf[d]; gridmax *= vgmax[d]; } for (i = 0; i < gridmax; i++) { tmp = i; for (d = 0; d < dim; d++) { ic[d] = tmp % vgmax[d] - wave->rect_grid->lbuf[d]; tmp /= vgmax[d]; } change_param(Rect_state(ic,wave), Rect_comp(ic,wave), new_param); } }
EXPORT void f_curve_propagate2d( Front *fr, POINTER wave, CURVE *oldc, CURVE *newc, double dt) { BOND *oldb = oldc->first; BOND *newb = newc->first; double V[MAXD]; int dim = fr->interf->dim; double L[MAXD],U[MAXD]; /* propagation boundary */ debug_print("f_curve_propagate","Entered f_curve_propagate2d\n"); if ((fr->_point_propagate == NULL) || (oldc == NULL) || (newc == NULL) || (correspond_curve(oldc) != newc) || (correspond_curve(newc) != oldc)) return; set_propagation_bounds(fr,L,U); while (oldb) { if ((oldb != oldc->last) && (!n_pt_propagated(newb->end))) { n_pt_propagated(newb->end) = YES; if (out_of_bound(oldb->end,L,U,dim) && wave_type(oldc) != MOVABLE_BODY_BOUNDARY && wave_type(oldc) != ICE_PARTICLE_BOUNDARY) { Locstate newsl,newsr; Locstate oldsl,oldsr; slsr(newb->end,Hyper_surf_element(newb),Hyper_surf(newc), &newsl,&newsr); slsr(oldb->end,Hyper_surf_element(oldb),Hyper_surf(oldc), &oldsl,&oldsr); ft_assign(newsl,oldsl,fr->sizest); ft_assign(newsr,oldsr,fr->sizest); continue; } point_propagate(fr,wave,oldb->end,newb->end,oldb->next, oldc,dt,V); } if (fr->bond_propagate != NULL) (*fr->bond_propagate)(fr,wave,oldb,newb,oldc,dt); else set_bond_length(newb,dim); /* Update new bond length */ if (oldb == oldc->last) break; oldb = oldb->next; newb = newb->next; } if (wave_type(oldc) == MOVABLE_BODY_BOUNDARY || wave_type(oldc) == ICE_PARTICLE_BOUNDARY) { /* Propagate center of mass */ /* int i,dim; dim = fr->rect_grid->dim; for (i = 0; i < dim; ++i) { center_of_mass_velo(newc)[i] = center_of_mass_velo(oldc)[i]; center_of_mass(newc)[i] = center_of_mass(oldc)[i] + dt*center_of_mass_velo(oldc)[i]; } angular_velo(newc) = angular_velo(oldc); spherical_radius(newc) = spherical_radius(oldc);*/ } debug_print("f_curve_propagate","Leaving f_curve_propagate2d\n"); } /*end f_curve_propagate2d*/
LOCAL void add_intfc_blk_pcs3d( int num_tris, TRI **tris, SURFACE **surfs, BLK_EL0 *blk_el0, P_LINK *hash_table, int h_size) { POINT_COMP_ST *pcs = blk_el0_pcs_els(blk_el0); TRI *t, *tri; SURFACE *s; BOND *b; BOND_TRI **btris; POINT *p; int i,j,k, npcs; TG_PT *tp; Locstate sl,sr; /* reset points in block tris */ for (i = 0; i < num_tris; ++i) { t = tris[i]; for (k = 0; k < 3; ++k) sorted(Point_of_tri(t)[k]) = NO; } //see count_num_pcs3d for alloc //#bjet2 add points in the boundary of the surfaces for (i = 0; i < num_tris; ++i) { t = tris[i]; for (k = 0; k < 3; ++k) { if(!is_side_bdry(t, k)) continue; b = Bond_on_side(t, k); for(j = 0; j < 2; j++) { p = Point_of_tri(t)[(k+j)%3]; //two points on side k if(sorted(p)) continue; sorted(p) = YES; tp = (TG_PT*)find_from_hash_table((POINTER)p, hash_table, h_size); for(btris = Btris(b); btris && *btris; btris++) { tri = (*btris)->tri; s = (*btris)->surface; slsr(p,Hyper_surf_element(tri),Hyper_surf(s),&sl,&sr); npcs = num_pcs_els_in_blk(blk_el0); pcs[npcs].p = tp; pcs[npcs].comp[0] = negative_component(s); pcs[npcs].comp[1] = positive_component(s); pcs[npcs].s[0] = sl; pcs[npcs].s[1] = sr; ++num_pcs_els_in_blk(blk_el0); if(debugging("pcs_cell")) { printf("npcsc %d comp %d %d\n", npcs, pcs[npcs].comp[0], pcs[npcs].comp[1]); print_general_vector("p ", Coords(tp), 3, "\n"); } } //for btris } // for j, two points for a side } // for k, sides for t } // add points in the interior of the surface for (i = 0; i < num_tris; ++i) { t = tris[i]; s = surfs[i]; for (k = 0; k < 3; ++k) { p = Point_of_tri(t)[k]; if (sorted(p) == YES) continue; sorted(p) = YES; tp = (TG_PT*)find_from_hash_table((POINTER)p,hash_table, h_size); slsr(p,Hyper_surf_element(t),Hyper_surf(s),&sl,&sr); npcs = num_pcs_els_in_blk(blk_el0); pcs[npcs].p = tp; pcs[npcs].comp[0] = negative_component(s); pcs[npcs].comp[1] = positive_component(s); pcs[npcs].s[0] = sl; pcs[npcs].s[1] = sr; ++num_pcs_els_in_blk(blk_el0); if(debugging("pcs_cell")) { printf("npcs %d comp %d %d\n", npcs, pcs[npcs].comp[0], pcs[npcs].comp[1]); print_general_vector("p ", Coords(tp), 3, "\n"); } } } } /* end add_intfc_blk_pcs3d */
LOCAL void add_intfc_blk_pcs2d( int num_bonds, BOND **bond, CURVE **curve, BLK_EL0 *blk_el0, P_LINK *hash_table, int h_size) { BOND *b; CURVE *c; POINT *p; int i; TG_PT *tp; POINT_COMP_ST *pcs = blk_el0_pcs_els(blk_el0); Locstate sl,sr; /* reset points in block bonds */ for (i = 0; i < num_bonds; ++i) { b = bond[i]; sorted(b->start) = NO; sorted(b->end) = NO; } /* add interface points inside cell */ for (i = 0; i < num_bonds; ++i) { b = bond[i]; c = curve[i]; p = b->start; if (sorted(p) == NO) { sorted(p) = YES; tp = (TG_PT*)find_from_hash_table((POINTER)p,hash_table, h_size); slsr(p,Hyper_surf_element(b),Hyper_surf(c),&sl,&sr); pcs[num_pcs_els_in_blk(blk_el0)].p = tp; pcs[num_pcs_els_in_blk(blk_el0)].comp[0] = negative_component(c); pcs[num_pcs_els_in_blk(blk_el0)].comp[1] = positive_component(c); pcs[num_pcs_els_in_blk(blk_el0)].s[0] = sl; pcs[num_pcs_els_in_blk(blk_el0)].s[1] = sr; ++num_pcs_els_in_blk(blk_el0); } p = b->end; if (sorted(p)==NO) { sorted(p) = YES; tp = (TG_PT*)find_from_hash_table((POINTER)p,hash_table, h_size); slsr(p,Hyper_surf_element(b),Hyper_surf(c),&sl,&sr); pcs[num_pcs_els_in_blk(blk_el0)].p = tp; pcs[num_pcs_els_in_blk(blk_el0)].comp[0] = negative_component(c); pcs[num_pcs_els_in_blk(blk_el0)].comp[1] = positive_component(c); pcs[num_pcs_els_in_blk(blk_el0)].s[0] = sl; pcs[num_pcs_els_in_blk(blk_el0)].s[1] = sr; ++num_pcs_els_in_blk(blk_el0); } } if (debugging("add_intfc_blk_pcs2d")) { int i; (void) printf("\nblk_el0 %llu\n", ptr2ull(blk_el0)); (void) printf("\t num_pcs_els_in_blk = %d\n", num_pcs_els_in_blk(blk_el0)); for (i=0; i< num_pcs_els_in_blk(blk_el0);++i) { (void) printf("%d: (%g,%g),", i, Coords(pcs[i].p)[0],Coords(pcs[i].p)[1]); (void) printf("comp = (%d,%d)\n", pcs[i].comp[0],pcs[i].comp[1]); } } } /* end add_intfc_blk_pcs2d */