Changeset 363

Show
Ignore:
Timestamp:
04/17/08 18:37:03 (7 months ago)
Author:
powell
Message:

Implementations (untested) of the free energy derivatives.

Files:
1 modified

Legend:

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

    r360 r363  
    1212/*++++++++++++++++++++++++++++++++++++++ 
    1313  This local function calculates the free energy as a function of composition, 
    14   temperature, pressure, and the specified parameters. 
     14  temperature, pressure, and the specified parameters.  Note: if you change 
     15  this function, be sure you update all of the derivative functions as well! 
    1516 
    1617  inline double _G It returns the free energy. 
    1718 
    18   double C2 Concentration of species 2. 
    19  
    20   double C3 Concentration of species 3. 
     19  double C1 Concentration of species 1. 
     20 
     21  double C2 Concentration of species 2. 
     22 
     23  double C3 Concentration of species 3. 
     24 
     25  double G1 Free energy of pure species 1. 
     26 
     27  double G2 Free energy of pure species 2. 
     28 
     29  double G3 Free energy of pure species 3. 
    2130 
    2231  double T Temperature. 
     
    2837 
    2938static inline double _G 
    30 (double C2, double C3, double T, double P, energy_params *eparams) 
    31 { 
    32   double C1 = (1.-C2-C3 < 0.) ? 0. : 1.-C2-C3, 
    33     G1 = eparams->G1_T0 + eparams->G1_C*(T-eparams->T0), 
    34     G2 = eparams->G2_T0 + eparams->G2_C*(T-eparams->T0), 
    35     G3 = eparams->G3_T0 + eparams->G3_C*(T-eparams->T0); 
    36  
     39(double C1, double C2, double C3, double G1, double G2, double G3, 
     40 double T, double P, energy_params *eparams) 
     41{ 
    3742  /*+ This uses the Flory-Huggins free energy formula for a polymer solution, 
    3843    which divides each species' entropy term by its molar volume and adds 
     
    4954    +latex+\end{eqnarray} 
    5055    +*/ 
    51   return G1 + (G2-G1)*C2 + (G3-G2)*C3 
    52     + eparams->R*T*(((C1<=0.)?0.:C1/eparams->M1*log(C1)) 
    53                     + ((C2<=0.)?0.:C2/eparams->M2*log(C2)) 
    54                     + ((C3<=0.)?0.:C3/eparams->M3*log(C3))) 
    55     + eparams->Omega12*C2*C1 + eparams->Omega13*C3*C1 + eparams->Omega23*C2*C3 
     56  return G1 + (G2-G1)*C2 + (G3-G1)*C3 
     57    + eparams->R*T*(((C1<=0.) ? 0. : C1/eparams->M1*log(C1)) 
     58                    + ((C2<=0.) ? 0. : C2/eparams->M2*log(C2)) 
     59                    + ((C3<=0.) ? 0. : C3/eparams->M3*log(C3))) 
     60    + eparams->Omega12*C1*C2 + eparams->Omega13*C1*C3 + eparams->Omega23*C2*C3 
    5661    + eparams->Omega123*C1*C2*C3; 
    5762} 
     
    6772  inline double _G2 It returns the free energy derivative. 
    6873 
    69   double C2 Concentration of species 2. 
    70  
    71   double C3 Concentration of species 3. 
     74  double C1 Concentration of species 1. 
     75 
     76  double C2 Concentration of species 2. 
     77 
     78  double C3 Concentration of species 3. 
     79 
     80  double G1 Free energy of pure species 1. 
     81 
     82  double G2 Free energy of pure species 2. 
     83 
     84  double G3 Free energy of pure species 3. 
    7285 
    7386  double T Temperature. 
     
    7992 
    8093static inline double _G2 
    81 (double C2, double C3, double T, double P, energy_params *eparams) 
    82 { 
    83   return 0.; 
     94(double C1, double C2, double C3, double G1, double G2, double G3, 
     95 double T, double P, energy_params *eparams) 
     96{ 
     97  /*+ 
     98    +latex+The derivative of the free energy in equation \ref{eq:flory-huggins} 
     99    +latex+with respect to $C_2$ is: 
     100    +latex+\begin{equation} 
     101    +latex+  \label{eq:flory-huggins-C2} 
     102    +latex+\end{equation} 
     103    +*/ 
     104  return G2-G1 
     105    + eparams->R*T*(((C2+C3>=1) ? INFINITY : (-log(C1)-1)/eparams->M1) 
     106                    + ((C2<=0.) ?-INFINITY : (log(C2)+1)/eparams->M2)) 
     107    + eparams->Omega12*(C1-C2) - eparams->Omega13*C3 + eparams->Omega23*C3 
     108    + eparams->Omega123*(C1-C2)*C3; 
    84109} 
    85110 
     
    94119  inline double _G3 It returns the free energy derivative. 
    95120 
    96   double C2 Concentration of species 2. 
    97  
    98   double C3 Concentration of species 3. 
     121  double C1 Concentration of species 1. 
     122 
     123  double C2 Concentration of species 2. 
     124 
     125  double C3 Concentration of species 3. 
     126 
     127  double G1 Free energy of pure species 1. 
     128 
     129  double G2 Free energy of pure species 2. 
     130 
     131  double G3 Free energy of pure species 3. 
    99132 
    100133  double T Temperature. 
     
    106139 
    107140static inline double _G3 
    108 (double C2, double C3, double T, double P, energy_params *eparams) 
    109 { 
    110   return 0.; 
     141(double C1, double C2, double C3, double G1, double G2, double G3, 
     142 double T, double P, energy_params *eparams) 
     143{ 
     144  return G3-G1 
     145    + eparams->R*T*(((C2+C3>=1) ? INFINITY : (-log(C1)-1)/eparams->M1) 
     146                    + ((C3<=0.) ?-INFINITY : (log(C3+1)/eparams->M3))) 
     147    - eparams->Omega12*C2 + eparams->Omega13*(C1-C3) + eparams->Omega23*C2 
     148    + eparams->Omega123*(C1-C3)*C2; 
    111149} 
    112150 
     
    123161  inline double _G22 It returns the free energy derivative. 
    124162 
    125   double C2 Concentration of species 2. 
    126  
    127   double C3 Concentration of species 3. 
     163  double C1 Concentration of species 1. 
     164 
     165  double C2 Concentration of species 2. 
     166 
     167  double C3 Concentration of species 3. 
     168 
     169  double G1 Free energy of pure species 1. 
     170 
     171  double G2 Free energy of pure species 2. 
     172 
     173  double G3 Free energy of pure species 3. 
    128174 
    129175  double T Temperature. 
     
    135181 
    136182static inline double _G22 
    137 (double C2, double C3, double T, double P, energy_params *eparams) 
    138 { 
    139   return 0.; 
     183(double C1, double C2, double C3, double G1, double G2, double G3, 
     184 double T, double P, energy_params *eparams) 
     185{ 
     186  return 
     187    eparams->R*T*(((C2+C3>=1) ? INFINITY : 1./C1/eparams->M1) 
     188                  + ((C2<=0.) ? INFINITY : 1./C2/eparams->M2)) 
     189    - eparams->Omega12*2 - eparams->Omega123*2*C3; 
    140190} 
    141191 
     
    152202  inline double _G33 It returns the free energy derivative. 
    153203 
    154   double C2 Concentration of species 2. 
    155  
    156   double C3 Concentration of species 3. 
     204  double C1 Concentration of species 1. 
     205 
     206  double C2 Concentration of species 2. 
     207 
     208  double C3 Concentration of species 3. 
     209 
     210  double G1 Free energy of pure species 1. 
     211 
     212  double G2 Free energy of pure species 2. 
     213 
     214  double G3 Free energy of pure species 3. 
    157215 
    158216  double T Temperature. 
     
    164222 
    165223static inline double _G33 
    166 (double C2, double C3, double T, double P, energy_params *eparams) 
    167 { 
    168   return 0.; 
     224(double C1, double C2, double C3, double G1, double G2, double G3, 
     225 double T, double P, energy_params *eparams) 
     226{ 
     227  return 
     228    eparams->R*T*(((C2+C3>=1) ? INFINITY : 1./C1/eparams->M1) 
     229                  + ((C3<=0.) ? INFINITY : 1./C3/eparams->M3)) 
     230    - eparams->Omega13*2 - eparams->Omega123*2*C2; 
    169231} 
    170232 
     
    181243  inline double _G23 It returns the free energy derivative. 
    182244 
    183   double C2 Concentration of species 2. 
    184  
    185   double C3 Concentration of species 3. 
     245  double C1 Concentration of species 1. 
     246 
     247  double C2 Concentration of species 2. 
     248 
     249  double C3 Concentration of species 3. 
     250 
     251  double G1 Free energy of pure species 1. 
     252 
     253  double G2 Free energy of pure species 2. 
     254 
     255  double G3 Free energy of pure species 3. 
    186256 
    187257  double T Temperature. 
     
    193263 
    194264static inline double _G23 
    195 (double C2, double C3, double T, double P, energy_params *eparams) 
    196 { 
    197   return 0.; 
     265(double C1, double C2, double C3, double G1, double G2, double G3, 
     266 double T, double P, energy_params *eparams) 
     267{ 
     268  return 
     269    eparams->R*T*((C2+C3>=1) ? INFINITY : 1./C1/eparams->M1) 
     270    - eparams->Omega12 - eparams->Omega13 + eparams->Omega23 
     271    + eparams->Omega123*(2*C1-1); 
    198272} 
    199273 
     
    218292(double C2, double C3, double T, double P, energy_params *eparams) 
    219293{ 
    220   return _G (C2, C3, T, P, eparams); 
     294  double C1 = (1-C2-C3 < 0.) ? 0. : 1-C2-C3, 
     295    G1 = eparams->G1_T0 + eparams->G1_C*(T-eparams->T0), 
     296    G2 = eparams->G2_T0 + eparams->G2_C*(T-eparams->T0), 
     297    G3 = eparams->G3_T0 + eparams->G3_C*(T-eparams->T0); 
     298 
     299  return _G (C1,C2,C3, G1,G2,G3, T, P, eparams); 
    221300} 
    222301 
     
    244323{ 
    245324  int i; 
     325  double C1, 
     326    G1 = eparams->G1_T0 + eparams->G1_C*(T-eparams->T0), 
     327    G2 = eparams->G2_T0 + eparams->G2_C*(T-eparams->T0), 
     328    G3 = eparams->G3_T0 + eparams->G3_C*(T-eparams->T0); 
    246329 
    247330  for (i=0; i<n; i++) 
    248     points[i].G = _G (points[i].C2, points[i].C3, T, P, eparams); 
     331    { 
     332      C1 = 1.-points[i].C2-points[i].C3; 
     333      points[i].G = _G (C1,points[i].C2,points[i].C3, G1,G2,G3, T, P, eparams); 
     334    } 
    249335 
    250336  return 0; 
     
    274360{ 
    275361  int i; 
     362  double C1, 
     363    G1 = eparams->G1_T0 + eparams->G1_C*(T-eparams->T0), 
     364    G2 = eparams->G2_T0 + eparams->G2_C*(T-eparams->T0), 
     365    G3 = eparams->G3_T0 + eparams->G3_C*(T-eparams->T0); 
    276366 
    277367  for (i=0; i<n; i++) 
    278368    { 
    279       points[i].G   = _G   (points[i].C2, points[i].C3, T, P, eparams); 
    280       points[i].G2  = _G2  (points[i].C2, points[i].C3, T, P, eparams); 
    281       points[i].G3  = _G3  (points[i].C2, points[i].C3, T, P, eparams); 
    282       points[i].G22 = _G22 (points[i].C2, points[i].C3, T, P, eparams); 
    283       points[i].G33 = _G33 (points[i].C2, points[i].C3, T, P, eparams); 
    284       points[i].G23 = _G23 (points[i].C2, points[i].C3, T, P, eparams); 
     369      C1 = 1.-points[i].C2-points[i].C3; 
     370      points[i].G  =_G  (C1,points[i].C2,points[i].C3, G1,G2,G3, T,P, eparams); 
     371      points[i].G2 =_G2 (C1,points[i].C2,points[i].C3, G1,G2,G3, T,P, eparams); 
     372      points[i].G3 =_G3 (C1,points[i].C2,points[i].C3, G1,G2,G3, T,P, eparams); 
     373      points[i].G22=_G22(C1,points[i].C2,points[i].C3, G1,G2,G3, T,P, eparams); 
     374      points[i].G33=_G33(C1,points[i].C2,points[i].C3, G1,G2,G3, T,P, eparams); 
     375      points[i].G23=_G23(C1,points[i].C2,points[i].C3, G1,G2,G3, T,P, eparams); 
    285376    } 
    286377