1 |
|
2 |
#include <stdio.h> |
3 |
#include <stdlib.h> |
4 |
#include <string.h> |
5 |
#include <assert.h> |
6 |
#include <math.h> |
7 |
|
8 |
#define BUF 1024 |
9 |
|
10 |
#define MAXC 10 |
11 |
|
12 |
#define PATH "incomp_liq_data/LiBr.dat" |
13 |
|
14 |
#define ABORT \ |
15 |
printf("\nExiting Program!\n"); \ |
16 |
exit(0); |
17 |
|
18 |
// json parser |
19 |
#define READ(Q) \ |
20 |
pos = ftell(in); \ |
21 |
while(!strstr(word,"},")) { \ |
22 |
fgets(word,BUF,in); \ |
23 |
if(strstr(word,"\"type\": \"notdefined\"")) { \ |
24 |
test_liq->Q.type = (char*)malloc(sizeof("notdefined")); \ |
25 |
strcpy(test_liq->Q.type,"notdefined"); \ |
26 |
} \ |
27 |
else if(strstr(word,"\"type\": \"polynomial\"")) { \ |
28 |
test_liq->Q.type = (char*)malloc(sizeof("polynomial")); \ |
29 |
strcpy(test_liq->Q.type,"polynomial"); \ |
30 |
} \ |
31 |
else if(strstr(word,"\"type\": \"exppolynomial\"")) { \ |
32 |
test_liq->Q.type = (char*)malloc(sizeof("exppolynomial")); \ |
33 |
strcpy(test_liq->Q.type,"exppolynomial"); \ |
34 |
} \ |
35 |
else if(strstr(word,"\"type\": \"exponential\"")) { \ |
36 |
test_liq->Q.type = (char*)malloc(sizeof("exponential")); \ |
37 |
strcpy(test_liq->Q.type,"exponential"); \ |
38 |
} \ |
39 |
} \ |
40 |
if(strcmp(test_liq->Q.type,"notdefined")) { \ |
41 |
fseek(in,pos,SEEK_SET); \ |
42 |
fgets(word,BUF,in); \ |
43 |
double coefs[MAXC][MAXC]; \ |
44 |
int numc_row = 0, numc_col = 0; \ |
45 |
while(!strstr(word,"},")) { \ |
46 |
if((strstr(word,"e+")||strstr(word,"e-"))&&!strstr(word,"NRMS")) { \ |
47 |
coefs[numc_row][numc_col] = to_number(word); \ |
48 |
numc_col++; \ |
49 |
assert(numc_col<MAXC); \ |
50 |
} \ |
51 |
else if(strstr(word,"],")) { \ |
52 |
numc_row++; \ |
53 |
test_liq->Q.numc_c = numc_col; \ |
54 |
numc_col = 0; \ |
55 |
assert(numc_row<MAXC); \ |
56 |
} \ |
57 |
fgets(word,BUF,in); \ |
58 |
} \ |
59 |
test_liq->Q.numc_r = numc_row; \ |
60 |
test_liq->Q.coeff = (double**)malloc(test_liq->Q.numc_r*sizeof(double*)); \ |
61 |
int i,j; \ |
62 |
for(i=0;i<test_liq->Q.numc_r;i++) \ |
63 |
test_liq->Q.coeff[i] = (double*)malloc(test_liq->Q.numc_c*sizeof(double)); \ |
64 |
for(i=0;i<test_liq->Q.numc_r;i++) \ |
65 |
for(j=0;j<test_liq->Q.numc_c;j++) \ |
66 |
test_liq->Q.coeff[i][j] = coefs[i][j]; \ |
67 |
} |
68 |
|
69 |
typedef struct { |
70 |
|
71 |
char* type; |
72 |
double** coeff; |
73 |
int numc_r, numc_c; // number of rows and columns in coefficient matrix respectively |
74 |
|
75 |
} coefficients; |
76 |
|
77 |
typedef struct { |
78 |
|
79 |
coefficients T_freeze, conductivity, density, specific_heat, viscosity, saturation_pressure; |
80 |
char* x_id; |
81 |
char* description; |
82 |
double T_base, T_max, T_min, T_minPsat, x_base, x_max, x_min; |
83 |
|
84 |
} fprops; |
85 |
|
86 |
double extracted_number(char w[BUF]) { |
87 |
|
88 |
char *token; |
89 |
|
90 |
/* get the first token */ |
91 |
token = strtok(w, " ,"); |
92 |
|
93 |
/* get the second token which is the number*/ |
94 |
token = strtok(NULL, " ,"); |
95 |
|
96 |
return (atof(token)); |
97 |
|
98 |
} |
99 |
|
100 |
double to_number(char w[BUF]) { |
101 |
|
102 |
char *token; |
103 |
|
104 |
/* get the first token */ |
105 |
token = strtok(w, " ,"); |
106 |
|
107 |
return (atof(token)); |
108 |
|
109 |
} |
110 |
|
111 |
// evaluation function for polynamial type coefficients |
112 |
double eval_poly(coefficients c, double T, double x) { |
113 |
|
114 |
double res = 0.0; |
115 |
int i,j; |
116 |
|
117 |
for(i=0;i<c.numc_r;i++) |
118 |
for(j=0;j<c.numc_c;j++) |
119 |
res += pow(x,j)*c.coeff[i][j]*pow(T,i); |
120 |
|
121 |
return res; |
122 |
|
123 |
} |
124 |
|
125 |
// evaluation function for exponential-polynomial type coefficients |
126 |
double eval_exppoly(coefficients c, double T, double x) { |
127 |
|
128 |
return exp(eval_poly(c,T,x)); |
129 |
|
130 |
} |
131 |
|
132 |
// evaluation function for exponential type coefficients |
133 |
double eval_expo(coefficients c, double T, double x) { |
134 |
|
135 |
return exp(c.coeff[0][0]/(T+c.coeff[0][1])-c.coeff[0][2]); |
136 |
|
137 |
} |
138 |
|
139 |
// generalized property evaluation functions: macro definition |
140 |
#define PROP_EVAL(Q) \ |
141 |
double eval_ ## Q (fprops *fluid, double T, double x) { \ |
142 |
assert(T>0&&T>=fluid->T_min&&T<=fluid->T_max); \ |
143 |
assert(x>=fluid->x_min&&x<=fluid->x_max); \ |
144 |
if(!strcmp(fluid->Q.type,"polynomial")) return eval_poly(fluid->Q,T-fluid->T_base,x-fluid->x_base); \ |
145 |
else if(!strcmp(fluid->Q.type,"exppolynomial")) return eval_exppoly(fluid->Q,T-fluid->T_base,x-fluid->x_base); \ |
146 |
else if(!strcmp(fluid->Q.type,"exponential")) return eval_expo(fluid->Q,T,x); \ |
147 |
else { \ |
148 |
printf("\nType not defined.\n"); \ |
149 |
ABORT \ |
150 |
} \ |
151 |
} |
152 |
|
153 |
// declaration and definition of property evaluation functions for conductivity, density, specific-heat and viscosity |
154 |
PROP_EVAL(conductivity) |
155 |
PROP_EVAL(density) |
156 |
PROP_EVAL(specific_heat) |
157 |
PROP_EVAL(viscosity) |
158 |
PROP_EVAL(saturation_pressure) |
159 |
|
160 |
int main() { |
161 |
|
162 |
// parsing from input (json format) and loading data to new fluid data structures |
163 |
FILE* in; |
164 |
|
165 |
fprops* test_liq; |
166 |
test_liq = (fprops*)malloc(sizeof(fprops)); |
167 |
|
168 |
long int pos; |
169 |
|
170 |
if(!(in = fopen(PATH,"r"))) { |
171 |
|
172 |
printf("\nInput file cannot be located.\n"); |
173 |
ABORT |
174 |
|
175 |
} |
176 |
|
177 |
char word[BUF]; |
178 |
|
179 |
while(!feof(in)) { |
180 |
|
181 |
fgets(word,BUF,in); |
182 |
|
183 |
if(strstr(word,"\"T_freeze\"")) { READ(T_freeze); } // not required for incompressible EOS; implemented to check input coefficients of "type": "notdefined" |
184 |
else if(strstr(word,"\"Tbase\"")) test_liq->T_base = extracted_number(word); |
185 |
else if(strstr(word,"\"Tmax\"")) test_liq->T_max = extracted_number(word); |
186 |
else if(strstr(word,"\"Tmin\"")) test_liq->T_min = extracted_number(word); |
187 |
else if(strstr(word,"\"TminPsat\"")) test_liq->T_minPsat = extracted_number(word); |
188 |
else if(strstr(word,"\"conductivity\"")) { READ(conductivity); } |
189 |
else if(strstr(word,"\"density\"")) { READ(density); } |
190 |
else if(strstr(word,"\"specific_heat\"")) { READ(specific_heat); } |
191 |
else if(strstr(word,"\"viscosity\"")) { READ(viscosity); } |
192 |
else if(strstr(word,"\"saturation_pressure\"")) { READ(saturation_pressure); } |
193 |
else if(strstr(word,"\"xbase\"")) test_liq->x_base = extracted_number(word); |
194 |
else if(strstr(word,"\"xmax\"")) test_liq->x_max = extracted_number(word); |
195 |
else if(strstr(word,"\"xmin\"")) test_liq->x_min = extracted_number(word); |
196 |
else if(strstr(word,"\"xid\": \"pure\"")) { |
197 |
test_liq->x_id = (char*)malloc(sizeof("pure")); |
198 |
strcpy(test_liq->x_id,"pure"); |
199 |
} |
200 |
|
201 |
} |
202 |
|
203 |
fclose(in); |
204 |
|
205 |
// test |
206 |
double T = test_liq->T_min; |
207 |
|
208 |
FILE *out; |
209 |
out = fopen("test_res.dat","w"); |
210 |
|
211 |
fprintf(out,"VARIABLES = \"Temperature [C]\", \"Conductivity [W/m/K]\", \"Density [kg/m<sup>3</sup>]\", \"Heat Capacity [J/Kg/K]\", \"Viscosity [Pa s]\", \"Saturation Pressure [Pa]\"\n"); |
212 |
do { |
213 |
|
214 |
fprintf(out,"%e\t%e\t%e\t%e\t%e\t%e\n",T-273.0,eval_conductivity(test_liq, T, 0.39),eval_density(test_liq, T, 0.39),eval_specific_heat(test_liq, T, 0.39),eval_viscosity(test_liq, T, 0.39),eval_saturation_pressure(test_liq, T, 0.39)); |
215 |
T+=1; |
216 |
|
217 |
} while(T<=test_liq->T_max); |
218 |
|
219 |
fclose(out); |
220 |
|
221 |
return 0; |
222 |
|
223 |
} |