Changeset 383
- Timestamp:
- 06/29/08 22:28:08 (3 months ago)
- Files:
-
- trunk/matml/src/ternary/qhull.c (modified) (14 diffs)
- trunk/matml/src/ternary/ternary.c (modified) (6 diffs)
- trunk/matml/src/ternary/ternary.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/matml/src/ternary/qhull.c
r381 r383 14 14 15 15 16 static coordT *qpoints; /*+ Point coordinate storage for qhull +*/ 17 18 16 19 /*++++++++++++++++++++++++++++++++++++++ 17 20 This initializes qhull and uses it to calculate the convex hull of a set of … … 32 35 { 33 36 int i, corner1, corner2, corner3; 34 coordT *qpoints;35 37 36 38 if (dim != 3) … … 141 143 } 142 144 143 while (distance >= newton_tolerance * newton_tolerance) 145 while (distance >= newton_tolerance * newton_tolerance && 146 current.C2>=0. && current.C3>=0. && current.C2+current.C3<=1.) 144 147 { 145 148 double dC2, dC3; 146 149 147 150 /*+ Calculate the energy derivatives +*/ 148 free_energies (¤t, 1, T, P, eparams, -1, 1);151 free_energies (¤t, 1, T, P, eparams, 0, 1); 149 152 150 153 /*+ Subtract the facet slopes from the energy derivatives +*/ … … 161 164 current.C3 += dC3; 162 165 distance = dC2*dC2 + dC3*dC3; 163 printf (" Added %g,%g (dist %g) to go to %g,%g\n", dC2,dC3,164 sqrt(distance), current.C2,current.C3);166 //printf (" Added %g,%g (dist %g) to go to %g,%g\n", dC2,dC3, 167 // sqrt(distance), current.C2,current.C3); 165 168 } 166 169 … … 178 181 int hullRefine It returns zero or an error code. 179 182 180 ternary_point * points Point information.183 ternary_point **points Pointer to point list. 181 184 182 185 int numpoints Number of points of which to calculate the convex hull. … … 202 205 203 206 int hullRefine 204 (ternary_point * points, int npoints, energy_params *eparams, int nparams,207 (ternary_point **points, int *numpoints, energy_params *eparams, int nparams, 205 208 double T,double P, double newton_tolerance, double vertex_tolerance, 206 209 int one_phase_refine) 207 210 { 208 211 facetT *facet; 212 ternary_point *newpoints; 213 int newpointsize=100, numnewpoints=0, i; 214 215 if (!(newpoints = malloc (100*sizeof(ternary_point)))) 216 return 1; 209 217 210 218 /*+ Steps in the algorithm: … … 239 247 corners [3*j+2] = vertex->point[2]; 240 248 241 eparam [j] = points[thepoint[j]].efunc;249 eparam [j] = (*points)[thepoint[j]].efunc; 242 250 } 243 251 j++; … … 250 258 { 251 259 int eparamc=0; 252 realT bestdist; 253 boolT isoutside; 254 255 printf ("Triangle: %g,%g %g,%g %g,%g\n", 260 261 printf ("Facet 0x%lx: %g,%g %g,%g %g,%g\n", facet, 256 262 corners[0], corners[1], corners[3], 257 263 corners[4], corners[6], corners[7]); … … 290 296 if (one_phase_refine || eparam[0] != eparamc) 291 297 { 292 printf (" Will refine %s-phase triangle\n",298 printf (" Refining %s-phase triangle at centroid\n", 293 299 (eparam[0]==eparamc) ? "one" : "multi"); 294 // Change that when we add this as a new vertex 300 if (numnewpoints >= newpointsize) 301 newpoints = realloc 302 (newpoints, (newpointsize+=100)*sizeof(ternary_point)); 303 newpoints [numnewpoints].C2 = centroid[0]; 304 newpoints [numnewpoints].C3 = centroid[1]; 305 newpoints [numnewpoints].G = Gcenter; 306 newpoints [numnewpoints].efunc = eparamc; 307 numnewpoints++; 295 308 } 296 309 … … 328 341 corners[3*j] + corners[3*j+1] == 1.) 329 342 { 330 newcorners[3*j] = centroid[0];331 //0.9999999998 * corners[3*j] +332 //0.0000000001 * corners[3*((j+1)%3)] +333 //0.0000000001 * corners[3*((j+2)%3)];334 newcorners[3*j+1] = centroid[1];335 //0.9999999998 * corners[3*j+1] +336 //0.0000000001 * corners[3*((j+1)%3)+1] +337 //0.0000000001 * corners[3*((j+2)%3)+1];338 newcorners[3*j+2] = centroid[2];339 //0.9999999998 * corners[3*j+2] +340 //0.0000000001 * corners[3*((j+1)%3)+2] +341 //0.0000000001 * corners[3*((j+2)%3)+2];343 newcorners[3*j] = 344 0.9999999998 * corners[3*j] + 345 0.0000000001 * corners[3*((j+1)%3)] + 346 0.0000000001 * corners[3*((j+2)%3)]; 347 newcorners[3*j+1] = 348 0.9999999998 * corners[3*j+1] + 349 0.0000000001 * corners[3*((j+1)%3)+1] + 350 0.0000000001 * corners[3*((j+2)%3)+1]; 351 newcorners[3*j+2] = 352 0.9999999998 * corners[3*j+2] + 353 0.0000000001 * corners[3*((j+1)%3)+2] + 354 0.0000000001 * corners[3*((j+2)%3)+2]; 342 355 } 343 else 344 { 356 } 357 358 for (j=0; j<3; j++) 359 { 345 360 printf (" Refining point at %g, %g function %d\n", 346 361 newcorners[3*j], newcorners[3*j+1], eparam[j]); 347 NewtonRefine (newcorners+ 2*j, corners, eparams+eparam[j],362 NewtonRefine (newcorners+3*j, corners, eparams+eparam[j], 348 363 T,P, 3,3, newton_tolerance); 349 364 printf (" -> %g, %g\n", newcorners[3*j], … … 352 367 newcorners[3*j+2] = free_energy 353 368 (newcorners[3*j],newcorners[3*j+1], T,P, eparams+eparam[j]); 354 }355 369 } 356 370 … … 364 378 365 379 // Don't add the point, reallocate the points array instead! 366 printf (" Adding new point %g,%g,%g; result %d\n", 367 newcorners[0], newcorners[1], newcorners[2], 368 qh_addpoint ((pointT *) newcorners, 369 qh_findbestfacet ((pointT *)newcorners, 370 True, &bestdist, &isoutside), 371 True)); 372 373 /* 380 if (newcorners[0]>=0. && newcorners[1]>=0. && 381 newcorners[0]+newcorners[1]<=1.) 382 { 383 printf (" Adding new point %g,%g,%g\n", 384 newcorners[0], newcorners[1], newcorners[2]); 385 if (numnewpoints >= newpointsize) 386 newpoints = realloc 387 (newpoints, (newpointsize+=100)*sizeof(ternary_point)); 388 newpoints [numnewpoints].C2 = newcorners[0]; 389 newpoints [numnewpoints].C3 = newcorners[1]; 390 newpoints [numnewpoints].G = newcorners[2]; 391 newpoints [numnewpoints].efunc = eparam[0]; 392 numnewpoints++; 393 } 394 374 395 if ((newcorners[3]-newcorners[0])*(newcorners[3]-newcorners[0]) + 375 396 (newcorners[4]-newcorners[1])*(newcorners[4]-newcorners[1]) + 376 397 (newcorners[5]-newcorners[2])*(newcorners[5]-newcorners[2]) > 377 vertex_tolerance * vertex_tolerance) 378 printf (" Adding new point %g,%g,%g; result %d\n", 379 newcorners[3], newcorners[4], newcorners[5], 380 qh_addpoint ((pointT *) newcorners+3, facet, True)); 398 vertex_tolerance * vertex_tolerance && 399 newcorners[3]>=0. && newcorners[4]>=0. && 400 newcorners[3]+newcorners[4]<=1.) 401 { 402 printf (" Adding new point %g,%g,%g\n", 403 newcorners[3], newcorners[4], newcorners[5]); 404 if (numnewpoints >= newpointsize) 405 newpoints = realloc 406 (newpoints, (newpointsize+=100)*sizeof(ternary_point)); 407 newpoints [numnewpoints].C2 = newcorners[3]; 408 newpoints [numnewpoints].C3 = newcorners[4]; 409 newpoints [numnewpoints].G = newcorners[5]; 410 newpoints [numnewpoints].efunc = eparam[1]; 411 numnewpoints++; 412 } 381 413 382 414 if ((newcorners[6]-newcorners[0])*(newcorners[6]-newcorners[0]) + … … 387 419 (newcorners[7]-newcorners[4])*(newcorners[7]-newcorners[4]) + 388 420 (newcorners[8]-newcorners[5])*(newcorners[8]-newcorners[5]) > 389 vertex_tolerance * vertex_tolerance) 390 printf (" Adding new point %g,%g,%g; result %d\n", 391 newcorners[6], newcorners[7], newcorners[8], 392 qh_addpoint ((pointT *) newcorners+6, facet, True)); 393 */ 421 vertex_tolerance * vertex_tolerance && 422 newcorners[6]>=0. && newcorners[7]>=0. && 423 newcorners[6]+newcorners[7]<=1.) 424 { 425 printf (" Adding new point %g,%g,%g\n", 426 newcorners[6], newcorners[7], newcorners[8]); 427 if (numnewpoints >= newpointsize) 428 newpoints = realloc 429 (newpoints, (newpointsize+=100)*sizeof(ternary_point)); 430 newpoints [numnewpoints].C2 = newcorners[6]; 431 newpoints [numnewpoints].C3 = newcorners[7]; 432 newpoints [numnewpoints].G = newcorners[8]; 433 newpoints [numnewpoints].efunc = eparam[1]; 434 numnewpoints++; 435 } 394 436 } 395 437 } … … 400 442 +*/ 401 443 444 if (!(*points = realloc 445 (*points, (*numpoints + numnewpoints) * sizeof (ternary_point)))) 446 return 1; 447 448 printf ("Adding %d new points to hull\n", numnewpoints); 449 for (i=0; i<numnewpoints; i++) 450 { 451 pointT newcorners[3] = 452 { newpoints[i].C2, newpoints[i].C3, newpoints[i].G }; 453 realT bestdist; 454 boolT isoutside; 455 facetT *facet; 456 457 (*points) [(*numpoints)+i] = newpoints [i]; 458 // In case I try to implement this using qh_addpoint someday... 459 /*printf (" Finding best facet for coords %g, %g, %g\n", 460 (*points) [(*numpoints)+i].C2,(*points) [(*numpoints)+i].C3, 461 (*points) [(*numpoints)+i].G); 462 facet = qh_findbestfacet (newcorners, True, &bestdist, &isoutside); 463 printf (" Adding to %d facet 0x%lx: %g, %g, %g\n", isoutside, facet, newcorners[0], newcorners[1], 464 newcorners[2]); 465 if (isoutside) 466 printf (" Result: %d\n", qh_addpoint (newcorners, facet, True)); 467 else 468 (*numpoints)--;*/ 469 } 470 *numpoints += numnewpoints; 471 472 qh_freeqhull (True); 473 free (qpoints); 474 402 475 printf ("Done, returning\n"); 403 404 return 0; 476 free(newpoints); 477 478 return hullCalculate (3, *points, *numpoints); 405 479 } 406 480 trunk/matml/src/ternary/ternary.c
r381 r383 28 28 int main (int argc, char *argv[]) 29 29 { 30 int i, j, index, loop_max=50, *verts, hullnumverts,*hullverts=NULL;30 int i,j, index, loop_max=50, numpoints, *verts, hullnumverts,*hullverts=NULL; 31 31 char gv_version[100]; 32 32 FILE *pfd = NULL; … … 41 41 if (argc>1) 42 42 sscanf (argv[1], "%d", &loop_max); 43 numpoints=(loop_max+1)*(loop_max+2); 43 44 44 45 /* Allocate array pairs for ternary points and triangle vertices */ 45 if (!(points = calloc ((loop_max+1)*(loop_max+2),sizeof (ternary_point))))46 if (!(points = malloc (numpoints * sizeof (ternary_point)))) 46 47 { printf ("Cannot allocate point coordinate array\n"); exit (1); } 47 if (!(verts = calloc (loop_max*loop_max * 6,sizeof (int))))48 if (!(verts = malloc (loop_max*loop_max * 6 * sizeof (int)))) 48 49 { printf ("Cannot allocate triangle vertex array\n"); exit (1); } 49 50 … … 56 57 if (i=init_triangle_array (loop_max, points)) 57 58 { printf ("main: Error %d in init_triangle_array\n", i); exit (i); } 58 if (i=init_triangle_array (loop_max, points+ (loop_max+1)*(loop_max+2)/2))59 if (i=init_triangle_array (loop_max, points+numpoints/2)) 59 60 { printf ("main: Error %d in init_triangle_array\n", i); exit (i); } 60 61 … … 63 64 { printf ("main: Error %d in init_triangle_vertices\n", i); exit (i); } 64 65 if (i=init_triangle_vertices (loop_max, verts + loop_max*loop_max*3, 65 (loop_max+1)*(loop_max+2)/2))66 numpoints/2)) 66 67 { printf ("main: Error %d in init_triangle_vertices\n", i); exit (i); } 67 68 68 69 /* Calculate free energies */ 69 if (i=free_energies (points, (loop_max+1)*(loop_max+2)/2, T,P, allparams,0,0))70 if (i=free_energies (points, numpoints/2, T,P, allparams,0,0)) 70 71 { printf ("main: Error %d in free_energies\n", i); exit (i); } 71 if (i=free_energies (points+(loop_max+1)*(loop_max+2)/2, 72 (loop_max+1)*(loop_max+2)/2, T,P, allparams,1,0)) 72 if (i=free_energies (points+numpoints/2, numpoints/2, T,P, allparams,1,0)) 73 73 { printf ("main: Error %d in free_energies\n", i); exit (i); } 74 74 75 75 /* Scale all free energy values */ 76 if (i=scale_energy_array ((loop_max+1)*(loop_max+2), points, 77 0., -.2, 1., .9, NULL, NULL)) 76 if (i=scale_energy_array (numpoints, points, 0., -.2, 1., .9, NULL, NULL)) 78 77 { printf ("main: Error %d in scale_triangle_array\n", i); exit (i); } 79 78 … … 81 80 if (i=GeomviewDisplayTriangleCOFF 82 81 (pfd, "Ternary Free Energy", "tfe", "shading smooth", 83 (loop_max+1)*(loop_max+2), points, loop_max*loop_max*2, verts))82 numpoints, points, loop_max*loop_max*2, verts)) 84 83 { printf ("main: Error %d in Geomview Display\n", i); exit (i); } 85 84 86 85 /* Calculate and refine the lower convex hull */ 87 86 printf ("qhull version: %s\n", hullQHullVersion()); 88 if (i=hullCalculate (3, points, (loop_max+1)*(loop_max+2)))87 if (i=hullCalculate (3, points, numpoints)) 89 88 { printf ("main: Error %d in hullCalculate\n", i); exit (i); } 90 if (i=hullRefine ( points, (loop_max+1)*(loop_max+2), allparams, 2, T, P,89 if (i=hullRefine (&points, &numpoints, allparams, 2, T, P, 91 90 1e-10, 1e-7, 0)) 92 91 { printf ("main: error %d in hullRefine\n", i); exit (i); } … … 130 129 printf ("Binodal region has %d facets\n", hullnumverts); 131 130 131 if (i=scale_energy_array (numpoints, points, 0., -.2, 1., .9, NULL, NULL)) 132 { printf ("main: Error %d in scale_triangle_array\n", i); exit (i); } 133 132 134 if (i=GeomviewDisplayTriangleCOFF 133 135 (pfd, "Binodal and Tie Lines", "ech", "-face +edge", 134 (loop_max+1)*(loop_max+2), points, hullnumverts, hullverts))136 numpoints, points, hullnumverts, hullverts)) 135 137 { printf ("main: Error %d in Geomview Display\n", i); exit (i); } 136 138 trunk/matml/src/ternary/ternary.h
r381 r383 121 121 int hullCalculate (int dim, ternary_point *points, int numpoints); 122 122 int hullRefine 123 (ternary_point * points, intnumpoints, energy_params *eparams, int nparams,123 (ternary_point **points, int *numpoints, energy_params *eparams, int nparams, 124 124 double T,double P, double newton_tolerance, double vertex_tolerance, 125 125 int one_phase_refine);