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