Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
uvahotspot
GitHub Repository: uvahotspot/HotSpot
Path: blob/master/materials.c
612 views
1
#include <stdio.h>
2
#include <string.h>
3
#include <stdlib.h>
4
#include "materials.h"
5
#include "util.h"
6
7
#define MATERIAL_NAME 0
8
#define MATERIAL_TYPE 1
9
#define MATERIAL_THERMAL_CONDUCTIVITY 2
10
#define MATERIAL_VOLUMETRIC_HEAT_CAPACITY 3
11
#define MATERIAL_DYNAMIC_VISCOSITY 4
12
13
void default_materials(materials_list_t *materials_list) {
14
materials_list->size = 0;
15
}
16
17
void materials_add_from_file(materials_list_t *materials_list, char *materials_filename) {
18
FILE *fp = fopen(materials_filename, "r");
19
20
if(!fp) {
21
char err_message[STR_SIZE];
22
sprintf(err_message, "Unable to open file %s\n", materials_filename);
23
fatal(err_message);
24
}
25
char line[LINE_SIZE], current_type[LINE_SIZE], sval[STR_SIZE];
26
int field = MATERIAL_NAME, number_materials = 0;
27
double dval;
28
29
// first pass: count number of entries
30
while(!feof(fp)) {
31
fgets(line, LINE_SIZE, fp);
32
if(feof(fp))
33
break;
34
35
// skip comments and empty lines
36
char *ptr = strtok(line, " \r\t\n");
37
if (!ptr || ptr[0] == '#')
38
continue;
39
40
switch(field) {
41
case MATERIAL_NAME:
42
field = MATERIAL_TYPE;
43
break;
44
case MATERIAL_TYPE:
45
field = MATERIAL_THERMAL_CONDUCTIVITY;
46
if(sscanf(ptr, "%s", current_type) != 1)
47
fatal("invalid material type: must be solid or fluid\n");
48
break;
49
case MATERIAL_THERMAL_CONDUCTIVITY:
50
field = MATERIAL_VOLUMETRIC_HEAT_CAPACITY;
51
break;
52
case MATERIAL_VOLUMETRIC_HEAT_CAPACITY:
53
if(!strncmp(current_type, "solid", STR_SIZE)) {
54
number_materials++;
55
field = MATERIAL_NAME;
56
}
57
else if(!strncmp(current_type, "fluid", STR_SIZE)) {
58
field = MATERIAL_DYNAMIC_VISCOSITY;
59
}
60
else {
61
fatal("invalid material type: must be solid or fluid\n");
62
}
63
break;
64
case MATERIAL_DYNAMIC_VISCOSITY:
65
number_materials++;
66
field = MATERIAL_NAME;
67
break;
68
default:
69
fatal("ill-formed materials file\n");
70
}
71
}
72
73
materials_list->size = number_materials;
74
materials_list->names = calloc(number_materials, sizeof(char *));
75
materials_list->material_properties = calloc(number_materials, sizeof(material_t));
76
fseek(fp, 0, SEEK_SET);
77
78
// second pass: fill in material properties
79
field = MATERIAL_NAME;
80
int i = 0;
81
while(!feof(fp)) {
82
fgets(line, LINE_SIZE, fp);
83
if(feof(fp))
84
break;
85
86
// skip comments and empty lines
87
char *ptr = strtok(line, " \r\t\n");
88
if (!ptr || ptr[0] == '#')
89
continue;
90
91
switch(field) {
92
case MATERIAL_NAME:
93
if(sscanf(ptr, "%s", sval) != 1)
94
fatal("invalid material name\n");
95
materials_list->names[i] = calloc(1, STR_SIZE);
96
strncpy(materials_list->names[i], sval, STR_SIZE);
97
field = MATERIAL_TYPE;
98
break;
99
case MATERIAL_TYPE:
100
if(sscanf(ptr, "%s", current_type) != 1)
101
fatal("invalid material type: must be solid or fluid\n");
102
if(!strncmp(current_type, "solid", STR_SIZE))
103
materials_list->material_properties[i].material_type = SOLID_MATERIAL;
104
else if(!strncmp(current_type, "fluid", STR_SIZE))
105
materials_list->material_properties[i].material_type = FLUID_MATERIAL;
106
else
107
fatal("invalid material type: must be solid or fluid\n");
108
field = MATERIAL_THERMAL_CONDUCTIVITY;
109
break;
110
case MATERIAL_THERMAL_CONDUCTIVITY:
111
if(sscanf(ptr, "%lf", &dval) != 1)
112
fatal("invalid material thermal conductivity\n");
113
if(dval < 0)
114
fatal("thermal conductivities must be nonnegative\n");
115
materials_list->material_properties[i].thermal_conductivity = dval;
116
field = MATERIAL_VOLUMETRIC_HEAT_CAPACITY;
117
break;
118
case MATERIAL_VOLUMETRIC_HEAT_CAPACITY:
119
if(sscanf(ptr, "%lf", &dval) != 1)
120
fatal("invalid material volumetric heat capacity\n");
121
if(dval < 0)
122
fatal("volumetric heat capacities must be nonnegative\n");
123
materials_list->material_properties[i].volumetric_heat_capacity = dval;
124
if(!strncmp(current_type, "solid", STR_SIZE)) {
125
materials_list->material_properties[i].dynamic_viscosity = 0.0;
126
i++;
127
field = MATERIAL_NAME;
128
}
129
else if(!strncmp(current_type, "fluid", STR_SIZE)) {
130
field = MATERIAL_DYNAMIC_VISCOSITY;
131
}
132
else {
133
fatal("invalid material type: must be solid or fluid\n");
134
}
135
break;
136
case MATERIAL_DYNAMIC_VISCOSITY:
137
if(sscanf(ptr, "%lf", &dval) != 1)
138
fatal("invalid material dynamic viscosity\n");
139
if(dval < 0)
140
fatal("dynamic viscosities must be nonnegative\n");
141
materials_list->material_properties[i].dynamic_viscosity = dval;
142
i++;
143
field = MATERIAL_NAME;
144
break;
145
default:
146
fatal("ill-formed materials file\n");
147
}
148
}
149
fclose(fp);
150
}
151
152
void free_materials(materials_list_t *materials_list) {
153
int i;
154
for(i = 0; i < materials_list->size; i++) {
155
free(materials_list->names[i]);
156
}
157
158
free(materials_list->names);
159
free(materials_list->material_properties);
160
}
161
162
material_t get_material_properties(materials_list_t *materials_list, char *name) {
163
int i;
164
for(i = 0; i < materials_list->size; i++) {
165
if(!strncmp(materials_list->names[i], name, STR_SIZE)) {
166
return materials_list->material_properties[i];
167
}
168
}
169
170
char err_message[STR_SIZE];
171
strncpy(err_message, "Unable to find material properties for ", STR_SIZE);
172
strncat(err_message, name, STR_SIZE - strlen(err_message));
173
strncat(err_message, "\n", STR_SIZE - strlen(err_message));
174
fatal(err_message);
175
}
176
177
double get_material_thermal_conductivity(materials_list_t *materials_list, char *name) {
178
int i;
179
for(i = 0; i < materials_list->size; i++) {
180
if(!strncmp(materials_list->names[i], name, STR_SIZE)) {
181
return materials_list->material_properties[i].thermal_conductivity;
182
}
183
}
184
return -1;
185
}
186
187
double get_material_volumetric_heat_capacity(materials_list_t *materials_list, char *name) {
188
int i;
189
for(i = 0; i < materials_list->size; i++) {
190
if(!strncmp(materials_list->names[i], name, STR_SIZE)) {
191
return materials_list->material_properties[i].volumetric_heat_capacity;
192
}
193
}
194
return -1;
195
}
196
197
double get_material_dynamic_viscosity(materials_list_t *materials_list, char *name) {
198
int i;
199
for(i = 0; i < materials_list->size; i++) {
200
if(!strncmp(materials_list->names[i], name, STR_SIZE)) {
201
return materials_list->material_properties[i].dynamic_viscosity;
202
}
203
}
204
return -1;
205
}
206
207