3D-ICE 3.0.0
layer.c
1/******************************************************************************
2 * This file is part of 3D-ICE, version 3.1.0 . *
3 * *
4 * 3D-ICE is free software: you can redistribute it and/or modify it under *
5 * the terms of the GNU General Public License as published by the Free *
6 * Software Foundation, either version 3 of the License, or any later *
7 * version. *
8 * *
9 * 3D-ICE is distributed in the hope that it will be useful, but WITHOUT *
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
12 * more details. *
13 * *
14 * You should have received a copy of the GNU General Public License along *
15 * with 3D-ICE. If not, see <http://www.gnu.org/licenses/>. *
16 * *
17 * Copyright (C) 2021 *
18 * Embedded Systems Laboratory - Ecole Polytechnique Federale de Lausanne *
19 * All Rights Reserved. *
20 * *
21 * Authors: Arvind Sridhar Alessandro Vincenzi *
22 * Giseong Bak Martino Ruggiero *
23 * Thomas Brunschwiler Eder Zulian *
24 * Federico Terraneo Darong Huang *
25 * Luis Costero Marina Zapater *
26 * David Atienza *
27 * *
28 * For any comment, suggestion or request about 3D-ICE, please register and *
29 * write to the mailing list (see http://listes.epfl.ch/doc.cgi?liste=3d-ice) *
30 * Any usage of 3D-ICE for research, commercial or other purposes must be *
31 * properly acknowledged in the resulting products or publications. *
32 * *
33 * EPFL-STI-IEL-ESL Mail : 3d-ice@listes.epfl.ch *
34 * Batiment ELG, ELG 130 (SUBSCRIPTION IS NECESSARY) *
35 * Station 11 *
36 * 1015 Lausanne, Switzerland Url : http://esl.epfl.ch/3d-ice *
37 ******************************************************************************/
38
39#include <stdlib.h> // For the memory functions malloc/free
40
41#include "layer.h"
42#include "layout_file_parser.h"
43
44/******************************************************************************/
45
46void layer_init (Layer_t *layer)
47{
48 string_init (&layer->Id) ;
49 string_init (&layer->LayoutFileName) ;
50
51 layer->Height = (CellDimension_t) 0.0 ;
52
53 material_init (&layer->Material) ;
54
55 material_element_list_init (&layer->MaterialLayout) ;
56 layer->Discr_X = (CellIndex_t) 0u ;
57 layer->Discr_Y = (CellIndex_t) 0u ;
58}
59
60/******************************************************************************/
61
62void layer_copy (Layer_t *dst, Layer_t *src)
63{
64 layer_destroy (dst) ;
65
66 string_copy (&dst->Id, &src->Id) ;
67 string_copy (&dst->LayoutFileName, &src->LayoutFileName) ;
68
69 dst->Height = src->Height ;
70
71 material_copy (&dst->Material, &src->Material) ;
72
73 material_element_list_copy (&dst->MaterialLayout, &src->MaterialLayout) ;
74 dst->Discr_X = src->Discr_X ;
75 dst->Discr_Y = src->Discr_Y ;
76}
77
78/******************************************************************************/
79
81{
82 string_destroy (&layer->Id) ;
84
85 material_destroy (&layer->Material) ;
86
87 material_element_list_destroy (&layer->MaterialLayout) ;
88
89 layer_init (layer) ;
90}
91
92/******************************************************************************/
93
95{
96 Layer_t *layer = (Layer_t *) malloc (sizeof(Layer_t));
97
98 if (layer != NULL)
99
100 layer_init (layer) ;
101
102 return layer ;
103}
104
105/******************************************************************************/
106
108{
109 if (layer == NULL)
110
111 return NULL ;
112
113 Layer_t *newl = layer_calloc ( ) ;
114
115 if (newl != NULL)
116
117 layer_copy (newl, layer) ;
118
119 return newl ;
120}
121
122/******************************************************************************/
123
124void layer_free (Layer_t *layer)
125{
126 if (layer == NULL)
127
128 return ;
129
130 layer_destroy (layer) ;
131
132 free (layer) ;
133}
134
135/******************************************************************************/
136
137bool layer_same_id (Layer_t *layer, Layer_t *other)
138{
139 return string_equal (&layer->Id, &other->Id) ;
140}
141
142/******************************************************************************/
143
144void layer_print (Layer_t *layer, FILE *stream, String_t prefix)
145{
146 fprintf (stream,
147 "%slayer %s :\n",
148 prefix, layer->Id) ;
149
150 fprintf (stream,
151 "%s height %.1f ;\n",
152 prefix, layer->Height) ;
153
154 fprintf (stream,
155 "%s material %s ;\n",
156 prefix, layer->Material.Id) ;
157
158 fprintf (stream,
159 "%s layout \"%s\" ;\n",
160 prefix, layer->LayoutFileName) ;
161}
162
163/******************************************************************************/
164
166(
167 Layer_t *layer,
168 Dimensions_t *dimensions,
169 MaterialList_t *materials,
170 String_t filename
171)
172{
173 Error_t result ;
174
175 result = parse_layout_file (filename, layer, materials, dimensions) ;
176
177 if (result == TDICE_FAILURE)
178
179 return TDICE_FAILURE ;
180
181 return TDICE_SUCCESS ;
182}
183
184/******************************************************************************/
185
187(
188 Layer_t *layer,
189 CellIndex_t row_index,
190 CellIndex_t column_index,
191 Dimensions_t *dimensions
192)
193{
194 Material_t *tmp = NULL ;
195
196 MaterialElementListNode_t *melementn ;
197
198 for (melementn = material_element_list_begin (&layer->MaterialLayout) ;
199 melementn != NULL ;
200 melementn = material_element_list_next (melementn))
201 {
202 MaterialElement_t *melement = material_element_list_data (melementn) ;
203
204 tmp = get_material_at_location (melement, row_index, column_index, dimensions) ;
205
206 if (tmp != NULL) return tmp->ThermalConductivity ;
207 }
208
209 return layer->Material.ThermalConductivity ;
210}
211
212/******************************************************************************/
213
215(
216 Layer_t *layer,
217 CellIndex_t row_index,
218 CellIndex_t column_index,
219 Dimensions_t *dimensions
220)
221{
222 Material_t *tmp = NULL ;
223
224 MaterialElementListNode_t *melementn ;
225
226 for (melementn = material_element_list_begin (&layer->MaterialLayout) ;
227 melementn != NULL ;
228 melementn = material_element_list_next (melementn))
229 {
230 MaterialElement_t *melement = material_element_list_data (melementn) ;
231
232 tmp = get_material_at_location (melement, row_index, column_index, dimensions) ;
233
234 if (tmp != NULL) return tmp->VolumetricHeatCapacity ;
235 }
236
237 return layer->Material.VolumetricHeatCapacity ;
238}
239
240/******************************************************************************/
void layer_destroy(Layer_t *layer)
Definition: layer.c:80
void layer_free(Layer_t *layer)
Definition: layer.c:124
Error_t fill_layout(Layer_t *layer, Dimensions_t *dimensions, MaterialList_t *materials, String_t filename)
Definition: layer.c:166
bool layer_same_id(Layer_t *layer, Layer_t *other)
Definition: layer.c:137
SolidTC_t get_thermal_conductivity(Layer_t *layer, CellIndex_t row_index, CellIndex_t column_index, Dimensions_t *dimensions)
Definition: layer.c:187
void layer_print(Layer_t *layer, FILE *stream, String_t prefix)
Definition: layer.c:144
Layer_t * layer_clone(Layer_t *layer)
Definition: layer.c:107
void layer_copy(Layer_t *dst, Layer_t *src)
Definition: layer.c:62
Layer_t * layer_calloc(void)
Definition: layer.c:94
SolidVHC_t get_volumetric_heat_capacity(Layer_t *layer, CellIndex_t row_index, CellIndex_t column_index, Dimensions_t *dimensions)
Definition: layer.c:215
void layer_init(Layer_t *layer)
Definition: layer.c:46
Error_t parse_layout_file(String_t filename, Layer_t *layer, MaterialList_t *materials, Dimensions_t *dimensions)
void material_copy(Material_t *dst, Material_t *src)
Definition: material.c:55
void material_destroy(Material_t *material)
Definition: material.c:67
void material_init(Material_t *material)
Definition: material.c:45
Material_t * get_material_at_location(MaterialElement_t *melement, CellIndex_t row_index, CellIndex_t column_index, Dimensions_t *dimensions)
char * String_t
Definition: string_t.h:55
void string_init(String_t *string)
Definition: string_t.c:46
bool string_equal(String_t *string, String_t *other)
Definition: string_t.c:71
void string_destroy(String_t *string)
Definition: string_t.c:78
void string_copy(String_t *dst, String_t *src)
Definition: string_t.c:53
Collections of all the structures that are needed for the thermal simulation.
Definition: dimensions.h:311
Structure used to store data about the layers that compose the 2D/3D stack.
Definition: layer.h:72
String_t Id
Definition: layer.h:83
CellIndex_t Discr_X
Definition: layer.h:95
MaterialElementList_t MaterialLayout
Definition: layer.h:91
CellIndex_t Discr_Y
Definition: layer.h:99
CellDimension_t Height
Definition: layer.h:75
String_t LayoutFileName
Definition: layer.h:87
Material_t Material
Definition: layer.h:79
Structure used to store data about the materials that compose the 2D/3D stack.
Definition: material.h:68
SolidVHC_t VolumetricHeatCapacity
Definition: material.h:80
SolidTC_t ThermalConductivity
Definition: material.h:87
String_t Id
Definition: material.h:73
Error_t
Definition: types.h:401
@ TDICE_SUCCESS
The function returns with success.
Definition: types.h:402
@ TDICE_FAILURE
The function retuerns with a generic error.
Definition: types.h:403
double SolidTC_t
Definition: types.h:107
double CellDimension_t
Definition: types.h:177
uint32_t CellIndex_t
Definition: types.h:213