Changeset 415 for trunk/matml/src
- Timestamp:
- 02/22/2009 11:02:56 AM (3 years ago)
- Location:
- trunk/matml/src/ternary
- Files:
-
- 2 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/matml/src/ternary/qhull.c
r413 r415 76 76 77 77 return 0; 78 } 79 80 81 /*++++++++++++++++++++++++++++++++++++++ 82 This determines the facet type from the minimum energy at the midpoint of 83 each edge. 84 85 facet_type facettype It returns the facet type. 86 87 coordT *corners Coordinates C2, C3, G of the three facet corners. 88 89 energy_params *eparams Collection of energy parameter structures. 90 91 int nparams Number of energy parameter structures in eparams. 92 ++++++++++++++++++++++++++++++++++++++*/ 93 94 static facet_type facettype (coordT *corners, energy_params *eparams, 95 int nparams, double T, double P) 96 { 97 int i, cparam, ret=0; 98 double edgenergy, edgecenter[3]; 99 100 edgecenter[0] = (corners[0] + corners[3]) / 2.; 101 edgecenter[1] = (corners[1] + corners[4]) / 2.; 102 edgecenter[2] = (corners[2] + corners[5]) / 2.; 103 edgenergy = free_energy (edgecenter[0],edgecenter[1], T,P, eparams); 104 cparam=0; 105 for (i=1; i<nparams; i++) 106 if (edgenergy > free_energy (edgecenter[0],edgecenter[1], T,P, eparams+i)) 107 { 108 edgenergy = free_energy (edgecenter[0],edgecenter[1], T,P, eparams+i); 109 cparam = i; 110 } 111 if (edgenergy > edgecenter[2]) 112 ret++; 113 114 edgecenter[0] = (corners[0] + corners[6]) / 2.; 115 edgecenter[1] = (corners[1] + corners[7]) / 2.; 116 edgecenter[2] = (corners[2] + corners[8]) / 2.; 117 edgenergy = free_energy (edgecenter[0],edgecenter[1], T,P, eparams); 118 cparam=0; 119 for (i=1; i<nparams; i++) 120 if (edgenergy > free_energy (edgecenter[0],edgecenter[1], T,P, eparams+i)) 121 { 122 edgenergy = free_energy (edgecenter[0],edgecenter[1], T,P, eparams+i); 123 cparam = i; 124 } 125 if (edgenergy > edgecenter[2]) 126 ret++; 127 128 edgecenter[0] = (corners[3] + corners[6]) / 2.; 129 edgecenter[1] = (corners[4] + corners[7]) / 2.; 130 edgecenter[2] = (corners[5] + corners[8]) / 2.; 131 edgenergy = free_energy (edgecenter[0],edgecenter[1], T,P, eparams); 132 cparam=0; 133 for (i=1; i<nparams; i++) 134 if (edgenergy > free_energy (edgecenter[0],edgecenter[1], T,P, eparams+i)) 135 { 136 edgenergy = free_energy (edgecenter[0],edgecenter[1], T,P, eparams+i); 137 cparam = i; 138 } 139 if (edgenergy > edgecenter[2]) 140 ret++; 141 142 return (facet_type) ret; 78 143 } 79 144 … … 214 279 { 215 280 facetT *facet; 281 facet_type type; 216 282 ternary_point *newpoints; 217 283 int newpointsize=100, numnewpoints=0, i; … … 262 328 { 263 329 int eparamc=0; 330 facet_type facetype; 264 331 265 332 #ifdef DEBUG … … 277 344 +latex+\item 278 345 +html+ <li> 279 If the lowest free energy function at the centroid has lower energy 280 than the average energy of the vertices, and the three vertices are 281 on the same free energy curve, add it as a new vertex. 346 If this is a one-phase facet, optionally add the centroid as a new 347 vertex. 282 348 +html+ </li> 283 349 +*/ … … 285 351 centroid[1] = (corners[1] + corners[4] + corners[7]) / 3.; 286 352 centroid[2] = (corners[2] + corners[5] + corners[8]) / 3.; 287 288 Gcenter = free_energy (centroid[0], centroid[1], T, P, eparams); 289 for (j=1; j<nparams; j++) 290 if (Gcenter > free_energy (centroid[0],centroid[1], T,P, eparams+j)) 291 { 292 Gcenter = free_energy (centroid[0],centroid[1], T,P, eparams+j); 293 eparamc = j; 294 } 295 296 #ifdef DEBUG 297 printf (" Centroid %g, free energy %g (func %d)\n", 298 centroid[2], Gcenter, eparamc); 299 #endif 300 301 if (Gcenter < centroid[2] && 353 354 facetype = facettype (corners, eparams, nparams, T, P); 355 356 if (facetype == ONE_PHASE && 302 357 eparam[0] == eparam[1] && eparam[1] == eparam[2]) 303 358 { 304 if (one_phase_refine || eparam[0] != eparamc)359 if (one_phase_refine) 305 360 { 306 361 #ifdef DEBUG … … 522 577 int hullReturnFacets It returns zero or an error code. 523 578 579 energy_params *eparams Collection of energy parameter structures. 580 581 int nparams Number of energy parameter structures in eparams. 582 583 double T Temperature. 584 585 double P Pressure. 586 524 587 int *numfacets Pointer to an integer which will contain the number of facets 525 588 in the convex hull on return. … … 528 591 return. This is changed by realloc() each time the function is called, so it 529 592 should be NULL or a valid array. 593 594 facet_type **facettypes Pointer which contains the array of facet types on 595 return. This is changed by realloc() each time the function is called, so it 596 should be NULL or a valid array. 530 597 ++++++++++++++++++++++++++++++++++++++*/ 531 598 532 int hullReturnFacets (int *numfacets, int **facetverts) 599 int hullReturnFacets 600 (energy_params *eparams, int nparams, double T,double P, 601 int *numfacets, int **facetverts, facet_type **facettypes) 533 602 { 534 603 int i=0; … … 544 613 #endif 545 614 if (!(*facetverts = realloc (*facetverts, *numfacets * 3 * sizeof (int)))) 546 { printf (" qhullCalcHull: could not reallocate memory for vertices\n");615 { printf ("hullReturnFacets: could not reallocate memory for vertices\n"); 547 616 return -1; } 548 617 #ifdef DEBUG 549 618 printf (" post-realloc 0x%lx\n", *facetverts); 619 printf ("facettypes: pre-realloc 0x%lx, ", *facettypes); 620 #endif 621 if (!(*facettypes = realloc (*facettypes, *numfacets * sizeof (facet_type)))) 622 { printf ("hullReturnFacets: could not reallocate memory for facet types\n"); 623 return -1; } 624 #ifdef DEBUG 625 printf (" post-realloc 0x%lx\n", *facettypes); 550 626 #endif 551 627 … … 553 629 { 554 630 int j=0; 555 coordT corners [ 6], projarea;631 coordT corners [9], projarea; 556 632 vertexT *vertex, **vertexp; 557 633 … … 567 643 { 568 644 (*facetverts) [3*i+j] = thepoint; 569 corners [2*j] = vertex->point[0]; 570 corners [2*j+1] = vertex->point[1]; 645 corners [3*j] = vertex->point[0]; 646 corners [3*j+1] = vertex->point[1]; 647 corners [3*j+2] = vertex->point[2]; 571 648 #ifdef DEBUG 572 649 printf (" vertex %d, coords %g %g %g\n", thepoint, … … 585 662 +*/ 586 663 projarea = 587 (corners[ 2]-corners[0]) * (corners[5]-corners[1]) -588 (corners[ 4]-corners[0]) * (corners[3]-corners[1]);664 (corners[3]-corners[0]) * (corners[7]-corners[1]) - 665 (corners[6]-corners[0]) * (corners[4]-corners[1]); 589 666 #ifdef DEBUG 590 667 printf (" xyarea %g\n", projarea); … … 595 672 (*numfacets)--; 596 673 else 597 i++; 674 { 675 (*facettypes) [i] = facettype (corners, eparams, nparams, T, P); 676 printf (" Type %d\n", (*facettypes) [i]); 677 i++; 678 } 598 679 } 599 680 -
trunk/matml/src/ternary/ternary.h
r413 r415 97 97 98 98 typedef enum { 99 STANDARD=0, 100 WITH_DERIVATIVES=1, 101 NO_INFINITY=2, 102 WITH_DERIVATIVES_NO_INFINITY=3 103 } free_energy_flags; 104 105 typedef enum { 99 106 ONE_PHASE_EDGE=0, /*+ One phase's boundary edges +*/ 100 107 TIE_SIMPLICES, /*+ Tie lines (ternary) or other simplices between two … … 103 110 } phase_boundary_flags; 104 111 105 typedef enum {106 STANDARD=0,107 WITH_DERIVATIVES=1,108 NO_INFINITY=2,109 WITH_DERIVATIVES_NO_INFINITY=3110 } free_energy_flags;111 112 112 typedef struct { 113 113 int compos; /*+ Number of components of the space (ternary binary etc.) +*/ 114 114 int *edges; /*+ Edges with indices of ternary_points comprising a phase 115 boundary; each edge has n_phases points +*/115 boundary; each edge has compos points +*/ 116 116 int n_edges; /*+ Number of edges comprising this boundary +*/ 117 117 int *phases; /*+ Phases involved (energy_params indices) starting with the … … 125 125 #define TERNARY_INFINITY HUGE_VALF 126 126 #define TERNARY_NEGATIVE_INFINITY (-HUGE_VALF) 127 128 typedef enum { 129 ONE_PHASE=0, 130 CRITICAL_POINT, 131 TWO_PHASE, 132 THREE_PHASE 133 } facet_type; 127 134 128 135 /* From freenergy.c */ … … 152 159 double T,double P, double newton_tolerance, double vertex_tolerance, 153 160 int one_phase_refine); 154 int hullReturnFacets (int *facets, int **verts); 161 int hullReturnFacets 162 (energy_params *eparams, int nparams, double T,double P, 163 int *numfacets, int **facetverts, facet_type **facettypes); 155 164 char *hullQHullVersion (); 156 165