void temperature_boundary_conditions(struct All_variables *E) { int node; /* bottom */ if(E->mesh.bottbc == 3){ /* variable bottom temperature condition */ /* to left of domain */ horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval, TBZ, 1, E->mesh.levmax,0,E->control.TBCbotval_side_xapply,0,E->mesh.layer[2]); horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval, FBZ, 0, E->mesh.levmax,0,E->control.TBCbotval_side_xapply,0,E->mesh.layer[2]); /* to right of domain, override node at boundary */ horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval_side, TBZ, 1, E->mesh.levmax,E->control.TBCbotval_side_xapply,E->mesh.layer[1],0,E->mesh.layer[2]); horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval_side, FBZ, 0, E->mesh.levmax,E->control.TBCbotval_side_xapply,E->mesh.layer[1],0,E->mesh.layer[2]); }else if((E->mesh.bottbc == 1)||(E->mesh.bottbc == 2)){ /* regular temp boundary condition and ggrd temp override */ horizontal_bc(E, E->TB, 1, 3, E->control.TBCbotval, TBZ, 1, E->mesh.levmax); horizontal_bc(E, E->TB, 1, 3, E->control.TBCbotval, FBZ, 0, E->mesh.levmax); }else if(E->mesh.bottbc == 0){ /* const flux */ horizontal_bc(E, E->TB, 1, 3, E->control.TBCbotval, TBZ, 0, E->mesh.levmax); horizontal_bc(E, E->TB, 1, 3, E->control.TBCbotval, FBZ, 1, E->mesh.levmax); }else if(E->mesh.bottbc == -1){ /* const flux and fixed T*/ /* flux on left */ horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval, TBZ, 0, E->mesh.levmax,0,E->control.TBCbotval_side_xapply,0,E->mesh.layer[2]); horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval, FBZ, 1, E->mesh.levmax,0,E->control.TBCbotval_side_xapply,0,E->mesh.layer[2]); /* temp on right */ horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval_side, TBZ, 1, E->mesh.levmax,E->control.TBCbotval_side_xapply,E->mesh.layer[1],0,E->mesh.layer[2]); horizontal_bc_range(E, E->TB, 1, 3, E->control.TBCbotval_side, FBZ, 0, E->mesh.levmax,E->control.TBCbotval_side_xapply,E->mesh.layer[1],0,E->mesh.layer[2]); } /* top */ if(E->mesh.toptbc >= 1) /* temp */ { horizontal_bc(E, E->TB, E->mesh.noz, 3, E->control.TBCtopval, TBZ, 1, E->mesh.levmax); horizontal_bc(E, E->TB, E->mesh.noz, 3, E->control.TBCtopval, FBZ, 0, E->mesh.levmax); } else if(E->mesh.toptbc == 0) /* flux */ { horizontal_bc(E, E->TB, E->mesh.noz, 3, E->control.TBCtopval, TBZ, 0, E->mesh.levmax); horizontal_bc(E, E->TB, E->mesh.noz, 3, E->control.TBCtopval, FBZ, 1, E->mesh.levmax); } if(E->mesh.periodic_x || E->mesh.periodic_y){ temperature_apply_periodic_bcs(E); }else{ temperature_refl_vert_bc(E); /* default */ } temperatures_conform_bcs(E); if(E->control.verbose) { for(node = 1; node <= E->lmesh.nno; node++) fprintf(E->fp, "TB== %d %g %g %g\n", node, E->TB[1][node], E->TB[2][node], E->TB[3][node]); for(node = 1; node <= E->lmesh.nno; node++) fprintf(E->fp, "TB== %d %u %u %u\n", node, E->node[node] & TBX, E->node[node] & TBY, E->node[node] & TBZ); } return; }
void temperature_boundary_conditions( struct All_variables *E ) { void temperatures_conform_bcs(); void temperature_apply_periodic_bcs(); void arbitrary_bc_rectangle(); void arbitrary_bc_rectangle_file(); void arbitrary_bc_circle_file(); void arbitrary_bc_harmonic_file(); void arbitrary_bc_polynomial_file(); void field_arbitrary_rectangle_file(); void field_arbitrary_circle_file(); void field_arbitrary_harmonic_file(); int i,lv; struct RectBc RECT; /* Default: Isothermal top (toptbcval) and bottom (bottbcval), reflecting sidewalls. */ RECT.numb=2; /* X-normal */ RECT.norm[0]=RECT.norm[1]='X'; RECT.bb1[0]=RECT.bb1[1]= -1.0e32; RECT.bb2[0]=RECT.bb2[1]= 1.0e32; RECT.aa1[0]=RECT.aa1[1]= -1.0e32; RECT.aa2[0]=RECT.aa2[1]= 1.0e32; RECT.intercept[0]=E->mesh.layer0[1]; RECT.mag[0]=0.0; RECT.intercept[1]=E->mesh.layer1[1]; RECT.mag[1]=0.0; arbitrary_bc_rectangle(E,&RECT,E->Tb,E->NODE,FBX, TBD | FBZ | FBY, 0); /* Sides */ if(3==E->mesh.nsd) { RECT.numb=2; /* Y-normal */ RECT.norm[0]=RECT.norm[1]='Y'; RECT.bb1[0]=RECT.bb1[1]= -1.0e32; RECT.bb2[0]=RECT.bb2[1]= 1.0e32; RECT.aa1[0]=RECT.aa1[1]= -1.0e32; RECT.aa2[0]=RECT.aa2[1]= 1.0e32; RECT.intercept[0]=E->mesh.layer0[3]; RECT.mag[0]=0.0; RECT.intercept[1]=E->mesh.layer1[3]; RECT.mag[1]=0.0; arbitrary_bc_rectangle(E,&RECT,E->Tb,E->NODE,FBY, TBD | FBX | FBZ, 0); /* Sides */ } RECT.numb=2; /* Z-normal */ RECT.norm[0]=RECT.norm[1]='Z'; RECT.aa1[0]=RECT.aa1[1]= -1.0e32; RECT.aa2[0]=RECT.aa2[1]= 1.0e32; RECT.bb1[0]=RECT.bb1[1]= -1.0e32; RECT.bb2[0]=RECT.bb2[1]= 1.0e32; RECT.intercept[0]=E->mesh.layer0[2]; RECT.mag[0]=E->control.TBCtopval; RECT.intercept[1]=E->mesh.layer1[2]; RECT.mag[1]=E->control.TBCbotval; arbitrary_bc_rectangle(E,&RECT,E->Tb,E->NODE,TBD,FBZ | FBX | FBY, 0); /* Now read in from any file which is found (top level). */ read_bc_from_file(E,E->TB,E->node,"Temperature","Temp",TBD,FBZ | FBX | FBY); read_bc_from_file(E,E->TB,E->node,"Heat_flux_z","Hflz",FBZ,TBD | FBX | FBY); for(lv=E->mesh.levmax; lv>E->mesh.levmin; lv--) { inject_node_values(E,lv,E->Tb[lv],E->Tb[lv-1]); inject_node_int_values(E,lv,E->NODE[lv],E->NODE[lv-1]); } /* Read in arbitrary structures from parameter files */ arbitrary_bc_rectangle_file(E,&(E->temperature.Trectbcs),"Heat_flux_z",E->Tb,E->NODE,FBZ,TBD,0); arbitrary_bc_circle_file(E,&(E->temperature.Tcircbcs),"Heat_flux_z",E->Tb,E->NODE,FBZ,TBD); arbitrary_bc_harmonic_file(E,&(E->temperature.Tharmbcs),"Heat_flux_z",E->Tb,E->NODE,FBZ,TBD); arbitrary_bc_polynomial_file(E,&(E->temperature.Tpolybcs),"Heat_flux_z",E->Tb,E->NODE,FBZ,TBD); field_arbitrary_rectangle_file(E,1,&(E->temperature.Trects),"Temp_fixed",E->TB,E->node,TBD,FBZ|FBX|FBY,E->mesh.levmax); field_arbitrary_circle_file(E,1,&(E->temperature.Tcircs),"Temp_fixed",E->TB,E->node,TBD,FBZ|FBX|FBY,E->mesh.levmax); field_arbitrary_harmonic_file(E,1,&(E->temperature.Tharms),"Temp_fixed",E->TB,E->node,TBD,FBZ|FBX|FBY,E->mesh.levmax); for(lv=E->mesh.levmin; lv<E->mesh.levmax; lv++) { field_arbitrary_rectangle(E,&(E->temperature.Trects),E->Tb[lv],E->NODE[lv],TBD,FBZ|FBX|FBY,lv); field_arbitrary_circle(E,&(E->temperature.Tcircs),E->Tb[lv],E->NODE[lv],TBD,FBZ|FBX|FBY,lv); field_arbitrary_harmonic(E,&(E->temperature.Tharms),E->Tb[lv],E->NODE[lv],TBD,FBZ|FBX|FBY,lv); } arbitrary_bc_rectangle_file(E,&(E->temperature.Trectbcs),"Temp",E->Tb,E->NODE,TBD,FBZ|FBX|FBY,0); arbitrary_bc_circle_file(E,&(E->temperature.Tcircbcs),"Temp",E->Tb,E->NODE,TBD,FBZ|FBX|FBY); arbitrary_bc_harmonic_file(E,&(E->temperature.Tharmbcs),"Temp",E->Tb,E->NODE,TBD,FBZ|FBX|FBY); arbitrary_bc_polynomial_file(E,&(E->temperature.Tpolybcs),"Temp",E->Tb,E->NODE,TBD,FBZ|FBX|FBY); if(E->mesh.periodic_x || E->mesh.periodic_y) temperature_apply_periodic_bcs(E); field_arbitrary_rectangle_file(E,1,&(E->temperature.Tintz_off),"Tintz_off",(standard_precision *)NULL,E->node,0,INTZ,E->mesh.levmax); field_arbitrary_rectangle_file(E,1,&(E->temperature.Tintz_on) ,"Tintz_on" ,(standard_precision *)NULL,E->node,INTZ,0,E->mesh.levmax); for(lv=E->mesh.levmin; lv<E->mesh.levmax; lv++) { field_arbitrary_rectangle(E,&(E->temperature.Tintz_off),(standard_precision *)NULL,E->NODE[lv],0,INTZ,lv); field_arbitrary_rectangle(E,&(E->temperature.Tintz_on) ,(standard_precision *)NULL,E->NODE[lv],INTZ,0,lv); } temperatures_conform_bcs(E,E->T); return; }