Changeset 363
- Timestamp:
- 04/17/08 18:37:03 (7 months ago)
- Files:
-
- 1 modified
-
trunk/matml/src/ternary/freenergy.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/matml/src/ternary/freenergy.c
r360 r363 12 12 /*++++++++++++++++++++++++++++++++++++++ 13 13 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! 15 16 16 17 inline double _G It returns the free energy. 17 18 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. 21 30 22 31 double T Temperature. … … 28 37 29 38 static 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 { 37 42 /*+ This uses the Flory-Huggins free energy formula for a polymer solution, 38 43 which divides each species' entropy term by its molar volume and adds … … 49 54 +latex+\end{eqnarray} 50 55 +*/ 51 return G1 + (G2-G1)*C2 + (G3-G 2)*C352 + 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*C 2*C1 + eparams->Omega13*C3*C1+ eparams->Omega23*C2*C356 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 56 61 + eparams->Omega123*C1*C2*C3; 57 62 } … … 67 72 inline double _G2 It returns the free energy derivative. 68 73 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. 72 85 73 86 double T Temperature. … … 79 92 80 93 static 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; 84 109 } 85 110 … … 94 119 inline double _G3 It returns the free energy derivative. 95 120 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. 99 132 100 133 double T Temperature. … … 106 139 107 140 static 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; 111 149 } 112 150 … … 123 161 inline double _G22 It returns the free energy derivative. 124 162 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. 128 174 129 175 double T Temperature. … … 135 181 136 182 static 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; 140 190 } 141 191 … … 152 202 inline double _G33 It returns the free energy derivative. 153 203 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. 157 215 158 216 double T Temperature. … … 164 222 165 223 static 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; 169 231 } 170 232 … … 181 243 inline double _G23 It returns the free energy derivative. 182 244 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. 186 256 187 257 double T Temperature. … … 193 263 194 264 static 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); 198 272 } 199 273 … … 218 292 (double C2, double C3, double T, double P, energy_params *eparams) 219 293 { 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); 221 300 } 222 301 … … 244 323 { 245 324 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); 246 329 247 330 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 } 249 335 250 336 return 0; … … 274 360 { 275 361 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); 276 366 277 367 for (i=0; i<n; i++) 278 368 { 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); 285 376 } 286 377