Changeset 415 for trunk/matml/src

Show
Ignore:
Timestamp:
02/22/2009 11:02:56 AM (3 years ago)
Author:
powell
Message:

New facet_type enum and function for better calculation of facet type.

Location:
trunk/matml/src/ternary
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/matml/src/ternary/qhull.c

    r413 r415  
    7676 
    7777  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 
     94static 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; 
    78143} 
    79144 
     
    214279{ 
    215280  facetT *facet; 
     281  facet_type type; 
    216282  ternary_point *newpoints; 
    217283  int newpointsize=100, numnewpoints=0, i; 
     
    262328        { 
    263329          int eparamc=0; 
     330          facet_type facetype; 
    264331 
    265332#ifdef DEBUG 
     
    277344            +latex+\item 
    278345            +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. 
    282348            +html+ </li> 
    283349            +*/ 
     
    285351          centroid[1] = (corners[1] + corners[4] + corners[7]) / 3.; 
    286352          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 && 
    302357              eparam[0] == eparam[1] && eparam[1] == eparam[2]) 
    303358            { 
    304               if (one_phase_refine || eparam[0] != eparamc) 
     359              if (one_phase_refine) 
    305360                { 
    306361#ifdef DEBUG 
     
    522577  int hullReturnFacets It returns zero or an error code. 
    523578 
     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 
    524587  int *numfacets Pointer to an integer which will contain the number of facets 
    525588  in the convex hull on return. 
     
    528591  return.  This is changed by realloc() each time the function is called, so it 
    529592  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. 
    530597  ++++++++++++++++++++++++++++++++++++++*/ 
    531598 
    532 int hullReturnFacets (int *numfacets, int **facetverts) 
     599int hullReturnFacets 
     600(energy_params *eparams, int nparams, double T,double P, 
     601 int *numfacets, int **facetverts, facet_type **facettypes) 
    533602{ 
    534603  int i=0; 
     
    544613#endif 
    545614  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"); 
    547616      return -1; } 
    548617#ifdef DEBUG 
    549618  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); 
    550626#endif 
    551627 
     
    553629    { 
    554630      int j=0; 
    555       coordT corners [6], projarea; 
     631      coordT corners [9], projarea; 
    556632      vertexT *vertex, **vertexp; 
    557633 
     
    567643            { 
    568644              (*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]; 
    571648#ifdef DEBUG 
    572649              printf ("  vertex %d, coords %g %g %g\n", thepoint, 
     
    585662        +*/ 
    586663      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]); 
    589666#ifdef DEBUG 
    590667      printf ("  xyarea %g\n", projarea); 
     
    595672        (*numfacets)--; 
    596673      else 
    597         i++; 
     674        { 
     675          (*facettypes) [i] = facettype (corners, eparams, nparams, T, P); 
     676          printf ("  Type %d\n", (*facettypes) [i]); 
     677          i++; 
     678        } 
    598679    } 
    599680 
  • trunk/matml/src/ternary/ternary.h

    r413 r415  
    9797 
    9898typedef enum { 
     99  STANDARD=0, 
     100  WITH_DERIVATIVES=1, 
     101  NO_INFINITY=2, 
     102  WITH_DERIVATIVES_NO_INFINITY=3 
     103} free_energy_flags; 
     104 
     105typedef enum { 
    99106  ONE_PHASE_EDGE=0, /*+ One phase's boundary edges +*/ 
    100107  TIE_SIMPLICES,    /*+ Tie lines (ternary) or other simplices between two 
     
    103110} phase_boundary_flags; 
    104111 
    105 typedef enum { 
    106   STANDARD=0, 
    107   WITH_DERIVATIVES=1, 
    108   NO_INFINITY=2, 
    109   WITH_DERIVATIVES_NO_INFINITY=3 
    110 } free_energy_flags; 
    111  
    112112typedef struct { 
    113113  int compos;   /*+ Number of components of the space (ternary binary etc.) +*/ 
    114114  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 +*/ 
    116116  int n_edges;  /*+ Number of edges comprising this boundary +*/ 
    117117  int *phases;  /*+ Phases involved (energy_params indices) starting with the 
     
    125125#define TERNARY_INFINITY HUGE_VALF 
    126126#define TERNARY_NEGATIVE_INFINITY (-HUGE_VALF) 
     127 
     128typedef enum { 
     129  ONE_PHASE=0, 
     130  CRITICAL_POINT, 
     131  TWO_PHASE, 
     132  THREE_PHASE 
     133} facet_type; 
    127134 
    128135/* From freenergy.c */ 
     
    152159 double T,double P, double newton_tolerance, double vertex_tolerance, 
    153160 int one_phase_refine); 
    154 int hullReturnFacets (int *facets, int **verts); 
     161int hullReturnFacets 
     162(energy_params *eparams, int nparams, double T,double P, 
     163 int *numfacets, int **facetverts, facet_type **facettypes); 
    155164char *hullQHullVersion (); 
    156165