Changeset 383

Show
Ignore:
Timestamp:
06/29/08 22:28:08 (5 months ago)
Author:
powell
Message:

This sort of works, but I suspect an error in the freenergy.c derivatives.

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

Legend:

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

    r381 r383  
    1414 
    1515 
     16static coordT *qpoints; /*+ Point coordinate storage for qhull +*/ 
     17 
     18 
    1619/*++++++++++++++++++++++++++++++++++++++ 
    1720  This initializes qhull and uses it to calculate the convex hull of a set of 
     
    3235{ 
    3336  int i, corner1, corner2, corner3; 
    34   coordT *qpoints; 
    3537 
    3638  if (dim != 3) 
     
    141143    } 
    142144 
    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.) 
    144147    { 
    145148      double dC2, dC3; 
    146149 
    147150      /*+ Calculate the energy derivatives +*/ 
    148       free_energies (&current, 1, T, P, eparams, -1, 1); 
     151      free_energies (&current, 1, T, P, eparams, 0, 1); 
    149152 
    150153      /*+ Subtract the facet slopes from the energy derivatives +*/ 
     
    161164      current.C3 += dC3; 
    162165      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); 
    165168    } 
    166169 
     
    178181  int hullRefine It returns zero or an error code. 
    179182 
    180   ternary_point *points Point information. 
     183  ternary_point **points Pointer to point list. 
    181184 
    182185  int numpoints Number of points of which to calculate the convex hull. 
     
    202205 
    203206int hullRefine 
    204 (ternary_point *points, int npoints, energy_params *eparams, int nparams, 
     207(ternary_point **points, int *numpoints, energy_params *eparams, int nparams, 
    205208 double T,double P, double newton_tolerance, double vertex_tolerance, 
    206209 int one_phase_refine) 
    207210{ 
    208211  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; 
    209217 
    210218  /*+ Steps in the algorithm: 
     
    239247              corners [3*j+2] = vertex->point[2]; 
    240248 
    241               eparam [j] = points[thepoint[j]].efunc; 
     249              eparam [j] = (*points)[thepoint[j]].efunc; 
    242250            } 
    243251          j++; 
     
    250258        { 
    251259          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, 
    256262                  corners[0], corners[1], corners[3], 
    257263                  corners[4], corners[6], corners[7]); 
     
    290296              if (one_phase_refine || eparam[0] != eparamc) 
    291297                { 
    292                   printf ("  Will refine %s-phase triangle\n", 
     298                  printf ("  Refining %s-phase triangle at centroid\n", 
    293299                          (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++; 
    295308                } 
    296309 
     
    328341                      corners[3*j] + corners[3*j+1] == 1.) 
    329342                    { 
    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]; 
    342355                    } 
    343                   else 
    344                     { 
     356                } 
     357 
     358              for (j=0; j<3; j++) 
     359                { 
    345360                  printf ("    Refining point at %g, %g function %d\n", 
    346361                          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], 
    348363                                T,P, 3,3, newton_tolerance); 
    349364                  printf ("    -> %g, %g\n", newcorners[3*j], 
     
    352367                  newcorners[3*j+2] = free_energy 
    353368                    (newcorners[3*j],newcorners[3*j+1], T,P, eparams+eparam[j]); 
    354                     } 
    355369                } 
    356370 
     
    364378 
    365379              // 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 
    374395              if ((newcorners[3]-newcorners[0])*(newcorners[3]-newcorners[0]) + 
    375396                  (newcorners[4]-newcorners[1])*(newcorners[4]-newcorners[1]) + 
    376397                  (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                } 
    381413 
    382414              if ((newcorners[6]-newcorners[0])*(newcorners[6]-newcorners[0]) + 
     
    387419                  (newcorners[7]-newcorners[4])*(newcorners[7]-newcorners[4]) + 
    388420                  (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                } 
    394436            } 
    395437        } 
     
    400442    +*/ 
    401443 
     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 
    402475  printf ("Done, returning\n"); 
    403  
    404   return 0; 
     476  free(newpoints); 
     477 
     478  return hullCalculate (3, *points, *numpoints); 
    405479} 
    406480 
  • trunk/matml/src/ternary/ternary.c

    r381 r383  
    2828int main (int argc, char *argv[]) 
    2929{ 
    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; 
    3131  char gv_version[100]; 
    3232  FILE *pfd = NULL; 
     
    4141  if (argc>1) 
    4242    sscanf (argv[1], "%d", &loop_max); 
     43  numpoints=(loop_max+1)*(loop_max+2); 
    4344 
    4445  /* 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)))) 
    4647    { 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)))) 
    4849    { printf ("Cannot allocate triangle vertex array\n"); exit (1); } 
    4950 
     
    5657  if (i=init_triangle_array (loop_max, points)) 
    5758    { 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)) 
    5960    { printf ("main: Error %d in init_triangle_array\n", i); exit (i); } 
    6061 
     
    6364    { printf ("main: Error %d in init_triangle_vertices\n", i); exit (i); } 
    6465  if (i=init_triangle_vertices (loop_max, verts + loop_max*loop_max*3, 
    65                                 (loop_max+1)*(loop_max+2)/2)) 
     66                                numpoints/2)) 
    6667    { printf ("main: Error %d in init_triangle_vertices\n", i); exit (i); } 
    6768 
    6869  /* 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)) 
    7071    { 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)) 
    7373    { printf ("main: Error %d in free_energies\n", i); exit (i); } 
    7474 
    7575  /* 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)) 
    7877    { printf ("main: Error %d in scale_triangle_array\n", i); exit (i); } 
    7978 
     
    8180  if (i=GeomviewDisplayTriangleCOFF 
    8281      (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)) 
    8483    { printf ("main: Error %d in Geomview Display\n", i); exit (i); } 
    8584 
    8685  /* Calculate and refine the lower convex hull */ 
    8786  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)) 
    8988    { 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, 
    9190                    1e-10, 1e-7, 0)) 
    9291    { printf ("main: error %d in hullRefine\n", i); exit (i); } 
     
    130129  printf ("Binodal region has %d facets\n", hullnumverts); 
    131130 
     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 
    132134  if (i=GeomviewDisplayTriangleCOFF 
    133135      (pfd, "Binodal and Tie Lines", "ech", "-face +edge", 
    134        (loop_max+1)*(loop_max+2), points, hullnumverts, hullverts)) 
     136       numpoints, points, hullnumverts, hullverts)) 
    135137    { printf ("main: Error %d in Geomview Display\n", i); exit (i); } 
    136138 
  • trunk/matml/src/ternary/ternary.h

    r381 r383  
    121121int hullCalculate (int dim, ternary_point *points, int numpoints); 
    122122int hullRefine 
    123 (ternary_point *points, int numpoints, energy_params *eparams, int nparams, 
     123(ternary_point **points, int *numpoints, energy_params *eparams, int nparams, 
    124124 double T,double P, double newton_tolerance, double vertex_tolerance, 
    125125 int one_phase_refine);