// tomb-HH.fe // Evolver datafile for simple tombstone, with solder. // Modified from tomb-FF.fe. Solder is partially wetting // bottom and sides of chip and the pad. Solder is partially // enclosed by faces, excepting the pad interface and chip interface. // Changes from tomb-FF.fe: // Modifications for using optimizing parameters: // Chip display is converted to 3-parameter boundary so // changing tilt moves chip nicely. // Tilt parameter is re-scaled to give gradient comparable to // surface energy gradient, i.e. so tilt evolves with reasonable speed. // Solder chip added as body, so gravity can act on it. evolver_version "2.11" // Need version to support the features used. // VARIABLES DEFINED, cgs units. // Physical dimensions of the chip parameter TLength = .0075 // length of tombstone, in x direction parameter TWidth = .005 // width of tombstone, in y direction parameter THeight = .002 // height of tombstone, in z direction parameter TDepth = .002 // wetting depth on tombstone, in x direction // Physical dimensions and location of the pad on the substrate parameter PW_x = .0025 // x-width of pad parameter PW_y = .009 // y-width of pad parameter PD = TLength-PW_x // separation edge to edge of pads parameter PC = ((PD+PW_x)/2) //pad center // Note: These pad parameters are used only for the initial position of the // pad in this file. Changing them at runtime will not affect the pad. // They are implemented as parameters rather than #define's so their values // will be available to the user at runtime. // Location of the chip, coordinates of center of front bottom edge. // Starts with front edge above the center of the pad. parameter x0 = PC // x-coord. parameter y0 = 0 // y-coord. parameter z0 = .001 // z-coord. parameter tilt = 0 scale = 1e8 // tilt about front edge, degrees // Useful quantities dependent on tilt #define st sin(tilt*pi/180) #define ct cos(tilt*pi/180) // Coordinates relative to the chip #define CHIPX (ct*(x-x0) - st*(z-z0)) #define CHIPY (y - y0) #define CHIPZ (st*(x-x0) + ct*(z-z0)) // Partial derivatives with respect to global coordinates. Not a complete // set, but all we need for this datafile. #define dCHIPXdx ct #define dCHIPXdz (-st) #define dCHIPZdx st #define dCHIPZdz ct // Physical properties of the solder parameter TENS = 460 // surface tension of PB-Sn, dynes/cm parameter SG = 8 // specific gravity of Pb-Sn solder parameter CHIPSG = 2 // specific gravity of the chip gravity_constant 980 // gravity is 980 cm/s^2 scale_limit 1/TENS // limit on scale factor // Contact angles, measured inside solder. Not using all of these yet. // Note that changing these parameters does not change the contact energy // until you explicitly change the facet surface tensions. See the // command "update" below. parameter A_x_plus = 30 // wetting angle on x+ face of tombstone, degrees parameter A_y_plus = 30 // wetting angle on y+ face of tombstone parameter A_y_minus = 30 // wetting angle on y- face of tombstone parameter A_z_minus = 30 // wetting angle on z- face of tombstone parameter A_z_plus = 30 // wetting angle on z+ face of tombstone parameter A_pad = 30 // wetting angle on pad, degrees #define T_x_plus (-TENS*(cos(A_x_plus*pi/180))) #define T_y_plus (-TENS*(cos(A_y_plus*pi/180))) #define T_y_minus (-TENS*(cos(A_y_minus*pi/180))) #define T_z_plus (-TENS*(cos(A_z_plus*pi/180))) #define T_z_minus (-TENS*(cos(A_z_minus*pi/180))) #define T_pad (-TENS*(cos ( A_pad* pi/180 ) ) ) // Constraints for solder contact with tombstone. The edge integrands // are those in tomb-EE.fe, but modified to take tilt into account. constraint 1 // y+ face of tombstone formula: CHIPY = TWidth/2 energy: e1: T_y_plus*CHIPX*dCHIPZdx e2: 0 e3: T_y_minus*CHIPX*dCHIPZdz constraint 2 // x+ face of tombstone formula: CHIPX = 0 energy: e1: 0 e2: T_x_plus*CHIPZ + G*SG*(z^2+z*z0+z0^2)/6*(x-x0) e3: 0 content: c1: 0 c2: -(z+z0)*(x-x0)/2 c3: 0 constraint 3 // y- face of the tombstone formula: CHIPY = -TWidth/2 energy: e1: -T_y_plus*CHIPX*dCHIPZdx e2: 0 e3: -T_y_plus*CHIPX*dCHIPZdz constraint 4 // z- face of the tombstone formula: CHIPZ = 0 energy: e1: 0 e2: T_z_minus*CHIPX + G*SG*(z^2+z*z0+z0^2)/6*(x-x0) e3: 0 content: c1: 0 c2: -(z+z0)*(x-x0)/2 c3: 0 constraint 5 // z+ face of the tombstone formula: CHIPZ = THeight constraint 6 // wetting depth formula: CHIPX = -TDepth // pad constraint, to keep bottom of solder on pad constraint 9 //pad constraint formula: z = 0 energy: e1: 0 e2: T_pad * x e3: 0 // One-sided constraints for solder on chip. Note that below these // are placed only on the vertices and edges likely to need them. If // the surface moves unexpectedly, it may be necessary to place these // constraints on more elements (which of course slows things down.) constraint 11 nonpositive // to keep solder within pos y bound formula: CHIPY - TWidth/2 constraint 12 nonpositive //keep solder within pos x bound formula: CHIPX constraint 13 nonnegative //keep solder within neg y bound formula: CHIPY + TWidth/2 constraint 14 nonnegative //keep solder above bottom edge formula: CHIPZ constraint 15 nonpositive //keep solder below top edge formula: CHIPZ - THeight constraint 16 nonnegative// wetting depth formula: CHIPX + TDepth // One-sided constraints for solder on pad. Note that below these // are placed only on the vertices and edges likely to need them. If // the surface moves unexpectedly, it may be necessary to place these // constraints on more elements (which of course slows things down.) constraint 20 nonnegative //one-sided x-constraint on pad formula: x-PD/2 constraint 21 nonpositive //one-sided x-constraint on pad formula: x-(PD/2+PW_x) constraint 22 nonpositive //one-sided y-constraint on pad formula: y-PW_y/2 constraint 23 nonnegative //one-sided y-constraint on pad formula: y+PW_y/2 // Three-parameter "boundary" for chip display, so chip // moves smoothly when tilt is changed. // p1 is chip x, p2 is chip y, p3 is chip z. boundary 1 parameters 3 x: x0 + ct*p1 + st*p3 y: y0 + p2 z: z0 - st*p1 + ct*p3 interp_bdry_param // mode of refining on boundary // end display constraints /****************************************************************************/ /* INITIAL SHAPE SPECIFICATION */ // Note the numbering of elements is not continuous. To keep the same // elements after loading, start Evolver with the -i option. vertices /* given as coordinates */ // solder blob 1 PD/2 -PW_y/2 0 constraints 9 20 23 2 PD/2+PW_x -PW_y/2 0 constraints 9 21 23 3 PD/2+PW_x PW_y/2 0 constraints 9 21 22 4 PD/2 PW_y/2 0 constraints 9 20 22 5 x0-TDepth/2 -TWidth/2 z0 constraints 4 16 3 // note exact constraints, 6 x0 -TWidth/2 z0 constraints 4 2 3 // changed from tomb-c.fe 7 x0 TWidth/2 z0 constraints 4 2 1 8 x0-TDepth/2 TWidth/2 z0 constraints 4 16 1 9 x0 -TWidth/2 z0+THeight/3 constraints 14 15 2 3 // new vertices 10 x0 TWidth/2 z0+THeight/3 constraints 14 15 2 1 // tombstone 15 -TLength -TWidth/2 0 fixed boundary 1 16 -TLength TWidth/2 0 fixed boundary 1 17 -TLength -TWidth/2 THeight fixed boundary 1 18 -TLength TWidth/2 THeight fixed boundary 1 19 0 -TWidth/2 THeight fixed boundary 1 20 0 TWidth/2 THeight fixed boundary 1 21 0 -TWidth/2 0 fixed boundary 1 22 0 TWidth/2 0 fixed boundary 1 23 -TDepth -TWidth/2 0 fixed boundary 1 24 -TDepth TWidth/2 0 fixed boundary 1 25 -TDepth -TWidth/2 THeight fixed boundary 1 26 -TDepth TWidth/2 THeight fixed boundary 1 // pad 33 PD/2 PW_y/2 0 fixed 34 PD/2+PW_x PW_y/2 0 fixed 35 PD/2+PW_x -PW_y/2 0 fixed 36 PD/2 -PW_y/2 0 fixed edges // solder blob 1 1 2 constraint 9 23 2 2 3 constraint 9 21 3 3 4 constraint 9 22 4 4 1 constraint 9 20 5 1 5 6 2 9 7 3 10 8 4 8 12 8 5 constraints 4 11 13 16 13 5 9 constraints 14 15 16 3 15 9 10 constraints 11 13 14 15 2 17 10 8 constraints 14 15 16 1 // Defining outline of tombstone. 30 22 20 fixed no_refine boundary 1 31 22 24 fixed no_refine boundary 1 32 21 23 fixed no_refine boundary 1 33 19 20 fixed no_refine boundary 1 34 20 26 fixed no_refine boundary 1 35 21 22 fixed no_refine boundary 1 36 19 25 fixed no_refine boundary 1 37 16 15 fixed no_refine boundary 1 38 23 24 fixed no_refine boundary 1 39 21 19 fixed no_refine boundary 1 40 25 26 fixed no_refine boundary 1 41 23 25 fixed no_refine boundary 1 42 24 26 fixed no_refine boundary 1 43 15 23 fixed no_refine boundary 1 44 16 24 fixed no_refine boundary 1 45 18 26 fixed no_refine boundary 1 46 17 25 fixed no_refine boundary 1 47 15 17 fixed no_refine boundary 1 48 16 18 fixed no_refine boundary 1 49 17 18 fixed no_refine boundary 1 // pad 50 33 34 fixed no_refine 51 34 35 fixed no_refine 52 35 36 fixed no_refine 53 36 33 fixed no_refine faces /* given by oriented edge loops */ // solder blob 1 1 6 -13 -5 tension TENS 2 2 7 -15 -6 tension TENS 3 3 8 -17 -7 tension TENS 4 4 5 -12 -8 tension TENS // deleted contact facets here // tombstone 15 35 30 -33 -39 fixed no_refine color red boundary 1 tension 0 16 33 34 -40 -36 fixed no_refine color red boundary 1 tension 0 17 39 36 -41 -32 fixed no_refine color red boundary 1 tension 0 18 31 42 -34 -30 fixed no_refine color red boundary 1 tension 0 19 32 38 -31 -35 fixed no_refine color red boundary 1 tension 0 20 40 -45 -49 46 fixed no_refine color lightred boundary 1 tension 0 21 41 -46 -47 43 fixed no_refine color lightred boundary 1 tension 0 22 -37 44 -38 -43 fixed no_refine color lightred boundary 1 tension 0 23 48 45 -42 -44 fixed no_refine color lightred boundary 1 tension 0 24 49 -48 37 47 fixed no_refine color lightred boundary 1 tension 0 // pad 30 50 51 52 53 tension 0 fixed color green no_refine bodies /* Solder and chip */ 1 1 2 3 4 volume 2e-8 density SG 2 15 16 17 18 19 20 21 22 23 24 density CHIPSG /* End of initial shape specification */ read // Commands to be executed after loading datafile. // Set volume tolerance, since volume is 2e-8 and // default of 1e-4 is way too big. target_tolerance := 1e-13 // 1e-14 seems a bit too small in practice. hessian_normal // so hessian behaves hessian_slant_cutoff := 0.2 // new internal variable added in ver. 2.11 // to improve hessian_normal behavior // for vertices hitting two constraints. // Value .2 works to give convergence in volume, // while .1 doesn't quite. // Typical evolution from datafile configuration. // See gogogo below for a better evolution. gogo := { refine edge where length > .0048 and not no_refine; r; g 10; u; u; // double u keeps bilateral symmetry refine edge where on_constraint 20 or on_constraint 21 or on_constraint 22 or on_constraint 23; V; u; V; g 10; r; g 10; u; V; u; V; g 10; // no hessian here; works badly with one-sided constraints. } // Commands to change chip position smoothly. read "change_hairy.cmd" // Commands to calculate forces, using the change commands. read "force.cmd" // Commands to calculate torque, using the change commands. read "torque.cmd" // Command to update all surface tensions according to current contact angles. update := { set facet tension -TENS*cos(A_y_plus*pi/180) where on_constraint 1; set facet tension -TENS*cos(A_x_plus*pi/180) where on_constraint 2; set facet tension -TENS*cos(A_y_minus*pi/180) where on_constraint 3; set facet tension -TENS*cos(A_z_minus*pi/180) where on_constraint 4; } // Execute at initial loading to set tensions according to initial angles. update // New, improved evolution. Evolves more early for less trouble later. // Tested for tilt = 30. gogogo := { refine edge where length > .0048 and not no_refine; g 10; r; u; g 10; u; refine edge where on_constraint 9; u; V; u; V; g 10; conj_grad on; g 5; w 1e-8; r; g 5; w 1e-8; return; w 1e-8; g 8; w 1e-8; conj_grad off; g 5; t 7e-5; g 5; } gofarup := { gogogo; g 20; r; g 40; t 4e-5; g 20; conj_grad on; g 30; t 4e-5; w 2e-9; V; V; g 20; r; g 20; t 2e-5; g 5; t 2e-5; g 10; } // Move to 30 degree tilt new_tilt := 30; change_tilt // This moves chip down to pad; meant for tilted chip, not horizontal. gofar := { new_z0 := 0; change_z0; gogo; U; u; V; g 20; r; u; V; g 20; r; u; V; g 20; }