1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <errno.h>
9 #include "hecmw_dist_free.h"
10 #include "hecmw_dist_alloc.h"
11 #include "hecmw_util.h"
12 #include "hecmw_struct.h"
13 
free_section(struct hecmwST_section * section)14 static void free_section(struct hecmwST_section *section) {
15   if (section == NULL) return;
16   HECMW_free(section->sect_type);
17   HECMW_free(section->sect_opt);
18   HECMW_free(section->sect_mat_ID_index);
19   HECMW_free(section->sect_mat_ID_item);
20   HECMW_free(section->sect_I_index);
21   HECMW_free(section->sect_I_item);
22   HECMW_free(section->sect_R_index);
23   HECMW_free(section->sect_R_item);
24 }
25 
free_material(struct hecmwST_material * material)26 static void free_material(struct hecmwST_material *material) {
27   int i;
28 
29   if (material == NULL) return;
30   for (i = 0; i < material->n_mat; i++) {
31     HECMW_free(material->mat_name[i]);
32   }
33   HECMW_free(material->mat_name);
34   HECMW_free(material->mat_item_index);
35   HECMW_free(material->mat_subitem_index);
36   HECMW_free(material->mat_table_index);
37   HECMW_free(material->mat_val);
38   HECMW_free(material->mat_temp);
39 }
40 
free_mpc(struct hecmwST_mpc * mpc)41 static void free_mpc(struct hecmwST_mpc *mpc) {
42   if (mpc == NULL) return;
43   HECMW_free(mpc->mpc_index);
44   HECMW_free(mpc->mpc_item);
45   HECMW_free(mpc->mpc_dof);
46   HECMW_free(mpc->mpc_val);
47   HECMW_free(mpc->mpc_const);
48 }
49 
free_amplitude(struct hecmwST_amplitude * amp)50 static void free_amplitude(struct hecmwST_amplitude *amp) {
51   int i;
52 
53   if (amp == NULL) return;
54 
55   for (i = 0; i < amp->n_amp; i++) {
56     HECMW_free(amp->amp_name[i]);
57   }
58   HECMW_free(amp->amp_name);
59   HECMW_free(amp->amp_type_definition);
60   HECMW_free(amp->amp_type_time);
61   HECMW_free(amp->amp_type_value);
62   HECMW_free(amp->amp_index);
63   HECMW_free(amp->amp_val);
64   HECMW_free(amp->amp_table);
65 }
66 
free_ngrp(struct hecmwST_node_grp * grp)67 static void free_ngrp(struct hecmwST_node_grp *grp) {
68   int i;
69 
70   if (grp == NULL) return;
71 
72   for (i = 0; i < grp->n_grp; i++) {
73     HECMW_free(grp->grp_name[i]);
74   }
75   HECMW_free(grp->grp_name);
76   HECMW_free(grp->grp_index);
77   HECMW_free(grp->grp_item);
78   HECMW_free(grp->bc_grp_ID);
79   HECMW_free(grp->bc_grp_type);
80   HECMW_free(grp->bc_grp_index);
81   HECMW_free(grp->bc_grp_dof);
82   HECMW_free(grp->bc_grp_val);
83 }
84 
free_egrp(struct hecmwST_elem_grp * grp)85 static void free_egrp(struct hecmwST_elem_grp *grp) {
86   int i;
87 
88   if (grp == NULL) return;
89 
90   for (i = 0; i < grp->n_grp; i++) {
91     HECMW_free(grp->grp_name[i]);
92   }
93   HECMW_free(grp->grp_name);
94   HECMW_free(grp->grp_index);
95   HECMW_free(grp->grp_item);
96   HECMW_free(grp->bc_grp_ID);
97   HECMW_free(grp->bc_grp_type);
98   HECMW_free(grp->bc_grp_index);
99   HECMW_free(grp->bc_grp_val);
100 }
101 
free_sgrp(struct hecmwST_surf_grp * grp)102 static void free_sgrp(struct hecmwST_surf_grp *grp) {
103   int i;
104 
105   if (grp == NULL) return;
106 
107   for (i = 0; i < grp->n_grp; i++) {
108     HECMW_free(grp->grp_name[i]);
109   }
110   HECMW_free(grp->grp_name);
111   HECMW_free(grp->grp_index);
112   HECMW_free(grp->grp_item);
113   HECMW_free(grp->bc_grp_ID);
114   HECMW_free(grp->bc_grp_type);
115   HECMW_free(grp->bc_grp_index);
116   HECMW_free(grp->bc_grp_val);
117 }
118 
free_contact_pair(struct hecmwST_contact_pair * cpair)119 static void free_contact_pair(struct hecmwST_contact_pair *cpair) {
120   int i;
121 
122   if (cpair == NULL) return;
123 
124   for (i = 0; i < cpair->n_pair; i++) {
125     HECMW_free(cpair->name[i]);
126   }
127 
128   HECMW_free(cpair->type);
129   HECMW_free(cpair->name);
130   HECMW_free(cpair->slave_grp_id);
131   HECMW_free(cpair->slave_orisgrp_id);
132   HECMW_free(cpair->master_grp_id);
133 }
134 
free_refine_origin(struct hecmwST_refine_origin * reforg)135 static void free_refine_origin(struct hecmwST_refine_origin *reforg) {
136   int i;
137 
138   if (reforg == NULL) return;
139 
140   HECMW_free(reforg->index);
141   HECMW_free(reforg->item_index);
142   HECMW_free(reforg->item_item);
143 }
144 
HECMW_dist_clean(struct hecmwST_local_mesh * mesh)145 void HECMW_dist_clean(struct hecmwST_local_mesh *mesh) {
146   int i;
147 
148   if (mesh == NULL) return;
149 
150   for (i = 0; i < mesh->hecmw_n_file; i++) {
151     HECMW_free(mesh->files[i]);
152   }
153   HECMW_free(mesh->files);
154 
155   HECMW_free(mesh->node_internal_list);
156   HECMW_free(mesh->node_ID);
157   HECMW_free(mesh->global_node_ID);
158   HECMW_free(mesh->node);
159   HECMW_free(mesh->node_dof_index);
160   HECMW_free(mesh->node_dof_item);
161   HECMW_free(mesh->node_val_index);
162   HECMW_free(mesh->node_val_item);
163   HECMW_free(mesh->node_init_val_index);
164   HECMW_free(mesh->node_init_val_item);
165 
166   HECMW_free(mesh->elem_internal_list);
167   HECMW_free(mesh->elem_ID);
168   HECMW_free(mesh->global_elem_ID);
169   HECMW_free(mesh->elem_type);
170   HECMW_free(mesh->elem_type_index);
171   HECMW_free(mesh->elem_type_item);
172   HECMW_free(mesh->elem_node_index);
173   HECMW_free(mesh->elem_node_item);
174   HECMW_free(mesh->section_ID);
175   HECMW_free(mesh->elem_mat_ID_index);
176   HECMW_free(mesh->elem_mat_ID_item);
177   HECMW_free(mesh->elem_mat_int_index);
178   HECMW_free(mesh->elem_mat_int_val);
179   HECMW_free(mesh->elem_val_index);
180   HECMW_free(mesh->elem_val_item);
181 
182   HECMW_free(mesh->neighbor_pe);
183   HECMW_free(mesh->import_index);
184   HECMW_free(mesh->import_item);
185   HECMW_free(mesh->export_index);
186   HECMW_free(mesh->export_item);
187   HECMW_free(mesh->shared_index);
188   HECMW_free(mesh->shared_item);
189 
190   HECMW_free(mesh->when_i_was_refined_node);
191   HECMW_free(mesh->when_i_was_refined_elem);
192   HECMW_free(mesh->adapt_parent_type);
193   HECMW_free(mesh->adapt_type);
194   HECMW_free(mesh->adapt_level);
195   HECMW_free(mesh->adapt_parent);
196   HECMW_free(mesh->adapt_children_index);
197   HECMW_free(mesh->adapt_children_item);
198 
199   HECMW_free(mesh->node_old2new);
200   HECMW_free(mesh->node_new2old);
201   HECMW_free(mesh->elem_old2new);
202   HECMW_free(mesh->elem_new2old);
203   HECMW_free(mesh->n_node_refine_hist);
204 
205   free_section(mesh->section);
206   free_material(mesh->material);
207   free_mpc(mesh->mpc);
208   free_amplitude(mesh->amp);
209   free_ngrp(mesh->node_group);
210   free_egrp(mesh->elem_group);
211   free_sgrp(mesh->surf_group);
212   free_contact_pair(mesh->contact_pair);
213   free_refine_origin(mesh->refine_origin);
214 
215   HECMW_dist_init(mesh);
216 }
217 
HECMW_dist_free(struct hecmwST_local_mesh * mesh)218 void HECMW_dist_free(struct hecmwST_local_mesh *mesh) {
219   if (mesh == NULL) return;
220 
221   HECMW_dist_clean(mesh);
222 
223   HECMW_free(mesh->section);
224   HECMW_free(mesh->material);
225   HECMW_free(mesh->mpc);
226   HECMW_free(mesh->amp);
227   HECMW_free(mesh->node_group);
228   HECMW_free(mesh->elem_group);
229   HECMW_free(mesh->surf_group);
230   HECMW_free(mesh->contact_pair);
231   HECMW_free(mesh->refine_origin);
232 
233   HECMW_free(mesh);
234 }
235