HyPar  1.0
Finite-Difference Hyperbolic-Parabolic PDE Solver on Cartesian Grids
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Cleanup.c File Reference

Clean up and free memory after simulation is complete. More...

Go to the source code of this file.

Functions

int Cleanup (void *s, int nsims)
 

Detailed Description

Clean up and free memory after simulation is complete.

Author
Debojyoti Ghosh

Definition in file Cleanup.c.

Function Documentation

int Cleanup ( void *  s,
int  nsims 
)

Cleans up and frees the memory after the completion of the simulation.

Parameters
sArray of simulation objects of type SimulationObject
nsimsnumber of simulation objects

Definition at line 39 of file Cleanup.c.

42 {
44  int ns;
46 
47  if (nsims == 0) return 0;
48 
49  if (!sim[0].mpi.rank) {
50  printf("Deallocating arrays.\n");
51  }
52 
53  for (ns = 0; ns < nsims; ns++) {
54 
55  if (sim[ns].is_barebones == 1) {
56  fprintf(stderr, "Error in Cleanup(): object is barebones type.\n");
57  return 1;
58  }
59 
60  HyPar* solver = &(sim[ns].solver);
61  MPIVariables* mpi = &(sim[ns].mpi);
62  DomainBoundary* boundary = (DomainBoundary*) solver->boundary;
63  int i;
64 
65  /* Clean up boundary zones */
66  for (i = 0; i < solver->nBoundaryZones; i++) {
67 #if defined(HAVE_CUDA)
68  BCCleanup(&boundary[i], solver->use_gpu);
69 #else
70  BCCleanup(&boundary[i], 0);
71 #endif
72  }
73  free(solver->boundary);
74 
75  /* Clean up immersed boundaries */
76  if (solver->flag_ib) {
77  IERR IBCleanup(solver->ib);
78  free(solver->ib);
79  }
80 
81  /* Clean up any allocations in physical model */
82  if (!strcmp(solver->model,_LINEAR_ADVECTION_DIFFUSION_REACTION_)) {
83  IERR LinearADRCleanup(solver->physics); CHECKERR(ierr);
84  } else if (!strcmp(solver->model,_FP_DOUBLE_WELL_)) {
85  IERR FPDoubleWellCleanup(solver->physics); CHECKERR(ierr);
86  } else if (!strcmp(solver->model,_FP_POWER_SYSTEM_)) {
87  IERR FPPowerSystemCleanup(solver->physics); CHECKERR(ierr);
88  } else if (!strcmp(solver->model,_FP_POWER_SYSTEM_1BUS_)) {
90  } else if (!strcmp(solver->model,_FP_POWER_SYSTEM_3BUS_)) {
92  } else if (!strcmp(solver->model,_EULER_1D_)) {
93  IERR Euler1DCleanup(solver->physics); CHECKERR(ierr);
94  } else if (!strcmp(solver->model,_EULER_2D_)) {
95  IERR Euler2DCleanup(solver->physics); CHECKERR(ierr);
96  } else if (!strcmp(solver->model,_NAVIER_STOKES_2D_)) {
98  } else if (!strcmp(solver->model,_NAVIER_STOKES_3D_)) {
100 #if defined(HAVE_CUDA)
101  if (solver->use_gpu) {
103  }
104 #endif
105  } else if (!strcmp(solver->model,_NUMA2D_)) {
106  IERR Numa2DCleanup(solver->physics); CHECKERR(ierr);
107  } else if (!strcmp(solver->model,_NUMA3D_)) {
108  IERR Numa3DCleanup(solver->physics); CHECKERR(ierr);
109  } else if (!strcmp(solver->model,_SHALLOW_WATER_1D_)) {
110  IERR ShallowWater1DCleanup(solver->physics); CHECKERR(ierr);
111  } else if (!strcmp(solver->model,_SHALLOW_WATER_2D_)) {
112  IERR ShallowWater2DCleanup(solver->physics); CHECKERR(ierr);
113  } else if (!strcmp(solver->model,_VLASOV_)) {
114  IERR VlasovCleanup(solver->physics); CHECKERR(ierr);
115  }
116  free(solver->physics);
117 
118  /* Clean up any allocations from time-integration */
119 #ifdef with_petsc
120  if (!solver->use_petscTS) {
121  if (!strcmp(solver->time_scheme,_RK_)) {
122  IERR TimeExplicitRKCleanup(solver->msti); CHECKERR(ierr);
123  free(solver->msti);
124  } else if (!strcmp(solver->time_scheme,_GLM_GEE_)) {
125  IERR TimeGLMGEECleanup(solver->msti); CHECKERR(ierr);
126  free(solver->msti);
127  }
128  }
129 #else
130  if (!strcmp(solver->time_scheme,_RK_)) {
131  IERR TimeExplicitRKCleanup(solver->msti); CHECKERR(ierr);
132  free(solver->msti);
133  } else if (!strcmp(solver->time_scheme,_GLM_GEE_)) {
134  IERR TimeGLMGEECleanup(solver->msti); CHECKERR(ierr);
135  free(solver->msti);
136  }
137 #endif
138 
139  /* Clean up any spatial reconstruction related allocations */
140  if ( (!strcmp(solver->spatial_scheme_hyp,_FIFTH_ORDER_WENO_ ))
141  || (!strcmp(solver->spatial_scheme_hyp,_FIFTH_ORDER_CRWENO_))
142  || (!strcmp(solver->spatial_scheme_hyp,_FIFTH_ORDER_HCWENO_)) ) {
143 #if defined(HAVE_CUDA)
144  IERR WENOCleanup(solver->interp, solver->use_gpu); CHECKERR(ierr);
145 #else
146  IERR WENOCleanup(solver->interp, 0); CHECKERR(ierr);
147 #endif
148  }
149  if (solver->interp) free(solver->interp);
150  if ( (!strcmp(solver->spatial_scheme_hyp,_FIFTH_ORDER_COMPACT_UPWIND_ ))
151  || (!strcmp(solver->spatial_scheme_hyp,_FIFTH_ORDER_CRWENO_ ))
152  || (!strcmp(solver->spatial_scheme_hyp,_FIFTH_ORDER_HCWENO_ )) ) {
153  IERR CompactSchemeCleanup(solver->compact); CHECKERR(ierr);
154  }
155  if (solver->compact) free(solver->compact);
156  if (solver->lusolver) free(solver->lusolver);
157 
158  /* Free the communicators created */
159  IERR MPIFreeCommunicators(solver->ndims,mpi); CHECKERR(ierr);
160 
161  /* These variables are allocated in Initialize.c */
162  free(solver->dim_global);
163  free(solver->dim_global_ex);
164  free(solver->dim_local);
165  free(solver->index);
166  free(solver->u);
167 #ifdef with_petsc
168  if (solver->u0) free(solver->u0);
169  if (solver->uref) free(solver->uref);
170  if (solver->rhsref) free(solver->rhsref);
171  if (solver->rhs) free(solver->rhs);
172 #endif
173 #ifdef with_librom
174  free(solver->u_rom_predicted);
175 #endif
176  free(solver->iblank);
177  free(solver->x);
178  free(solver->dxinv);
179  free(solver->isPeriodic);
180  free(mpi->iproc);
181  free(mpi->ip);
182  free(mpi->is);
183  free(mpi->ie);
184  free(mpi->bcperiodic);
185  free(mpi->sendbuf);
186  free(mpi->recvbuf);
187  free(solver->VolumeIntegral);
188  free(solver->VolumeIntegralInitial);
189  free(solver->TotalBoundaryIntegral);
190  free(solver->ConservationError);
191  free(solver->stride_with_ghosts);
192  free(solver->stride_without_ghosts);
193 
194 #if defined(HAVE_CUDA)
195  if (solver->use_gpu) {
196  gpuFree(solver->hyp);
197  gpuFree(solver->par);
198  gpuFree(solver->source);
199  gpuFree(solver->uC);
200  gpuFree(solver->fluxC);
201  gpuFree(solver->Deriv1);
202  gpuFree(solver->Deriv2);
203  gpuFree(solver->fluxI);
204  gpuFree(solver->uL);
205  gpuFree(solver->uR);
206  gpuFree(solver->fL);
207  gpuFree(solver->fR);
208  gpuFree(solver->StageBoundaryBuffer);
210  gpuFree(solver->StepBoundaryIntegral);
211 
212  gpuFree(solver->gpu_dim_local);
213  gpuFree(solver->gpu_iblank);
214  gpuFree(solver->gpu_x);
215  gpuFree(solver->gpu_dxinv);
216  gpuFree(solver->gpu_u);
217  } else {
218 #endif
219  free(solver->hyp);
220  free(solver->par);
221  free(solver->source);
222  free(solver->uC);
223  free(solver->fluxC);
224  free(solver->Deriv1);
225  free(solver->Deriv2);
226  free(solver->fluxI);
227  free(solver->uL);
228  free(solver->uR);
229  free(solver->fL);
230  free(solver->fR);
231  free(solver->StageBoundaryIntegral);
232  free(solver->StepBoundaryIntegral);
233 #if defined(HAVE_CUDA)
234  }
235 #endif
236 
237  if (solver->filename_index) free(solver->filename_index);
238 
239  }
240 
241  return(0);
242 }
char spatial_scheme_hyp[_MAX_STRING_SIZE_]
Definition: hypar.h:84
int NavierStokes3DCleanup(void *)
void * interp
Definition: hypar.h:362
double * hyp
Definition: hypar.h:119
double * uR
Definition: hypar.h:139
int * stride_without_ghosts
Definition: hypar.h:416
int * dim_global
Definition: hypar.h:33
double * iblank
Definition: hypar.h:436
double * uL
Definition: hypar.h:139
#define _EULER_1D_
Definition: euler1d.h:50
int FPDoubleWellCleanup(void *)
double * u
Definition: hypar.h:116
void * ib
Definition: hypar.h:443
double * StageBoundaryBuffer
Definition: hypar.h:462
int LinearADRCleanup(void *)
double * Deriv1
Definition: hypar.h:151
#define _FIFTH_ORDER_COMPACT_UPWIND_
Definition: interpolation.h:24
double * sendbuf
int * dim_global_ex
Definition: hypar.h:75
int FPPowerSystem1BusCleanup(void *)
double * fL
Definition: hypar.h:139
void * physics
Definition: hypar.h:266
double * Deriv2
Definition: hypar.h:151
char model[_MAX_STRING_SIZE_]
Definition: hypar.h:263
#define _LINEAR_ADVECTION_DIFFUSION_REACTION_
Definition: linearadr.h:21
int flag_ib
Definition: hypar.h:441
int * dim_local
Definition: hypar.h:37
int Euler2DCleanup(void *)
Definition: Euler2DCleanup.c:4
double * u0
Definition: hypar.h:396
int WENOCleanup(void *, int)
Definition: WENOCleanup.c:17
double * gpu_dxinv
Definition: hypar.h:458
double * recvbuf
#define _FIFTH_ORDER_HCWENO_
Definition: interpolation.h:30
double * gpu_iblank
Definition: hypar.h:456
int VlasovCleanup(void *)
Definition: VlasovCleanup.c:10
#define _FP_POWER_SYSTEM_1BUS_
#define _GLM_GEE_
#define _NAVIER_STOKES_3D_
char * filename_index
Definition: hypar.h:197
#define _EULER_2D_
Definition: euler2d.h:25
double * StepBoundaryIntegral
Definition: hypar.h:384
int Euler1DCleanup(void *)
int BCCleanup(void *, int)
Definition: BCCleanup.c:12
double * par
Definition: hypar.h:122
#define _FP_POWER_SYSTEM_3BUS_
#define _FIFTH_ORDER_WENO_
Definition: interpolation.h:26
double * gpu_u
Definition: hypar.h:459
double * fluxI
Definition: hypar.h:136
void * boundary
Definition: hypar.h:159
#define _RK_
int * isPeriodic
Definition: hypar.h:162
int * gpu_dim_local
Definition: hypar.h:455
Structure containing the variables and function pointers defining a boundary.
char time_scheme[_MAX_STRING_SIZE_]
Definition: hypar.h:78
double * TotalBoundaryIntegral
Definition: hypar.h:386
double * source
Definition: hypar.h:125
void gpuFree(void *)
double * gpu_x
Definition: hypar.h:457
void * compact
Definition: hypar.h:364
#define _NUMA2D_
Definition: numa2d.h:21
double * rhsref
Definition: hypar.h:398
double * VolumeIntegral
Definition: hypar.h:378
#define _FP_DOUBLE_WELL_
Definition: fpdoublewell.h:18
double * uC
Definition: hypar.h:131
int ShallowWater2DCleanup(void *)
int * stride_with_ghosts
Definition: hypar.h:414
double * uref
Definition: hypar.h:397
int nBoundaryZones
Definition: hypar.h:157
int gpuNavierStokes3DCleanup(void *)
double * fluxC
Definition: hypar.h:128
#define _FP_POWER_SYSTEM_
Definition: fppowersystem.h:44
int use_petscTS
Definition: hypar.h:395
#define _VLASOV_
Definition: vlasov.h:37
#define CHECKERR(ierr)
Definition: basic.h:18
int Numa2DCleanup(void *)
Definition: Numa2DCleanup.c:5
int IBCleanup(void *)
Definition: IBCleanup.c:11
int MPIFreeCommunicators(int, void *)
int CompactSchemeCleanup(void *)
double * StageBoundaryIntegral
Definition: hypar.h:382
int use_gpu
Definition: hypar.h:449
int TimeExplicitRKCleanup(void *)
int Numa3DCleanup(void *)
Definition: Numa3DCleanup.c:5
int TimeGLMGEECleanup(void *)
double * dxinv
Definition: hypar.h:110
void * msti
Definition: hypar.h:366
#define _SHALLOW_WATER_2D_
double * VolumeIntegralInitial
Definition: hypar.h:380
Structure defining a simulation.
int ndims
Definition: hypar.h:26
int * index
Definition: hypar.h:102
double * u_rom_predicted
Definition: hypar.h:403
double * ConservationError
Definition: hypar.h:374
#define _NUMA3D_
Definition: numa3d.h:26
#define IERR
Definition: basic.h:16
#define _FIFTH_ORDER_CRWENO_
Definition: interpolation.h:28
int ShallowWater1DCleanup(void *)
int NavierStokes2DCleanup(void *)
Structure of MPI-related variables.
double * x
Definition: hypar.h:107
Structure containing all solver-specific variables and functions.
Definition: hypar.h:23
void * lusolver
Definition: hypar.h:368
#define _NAVIER_STOKES_2D_
double * fR
Definition: hypar.h:139
#define _DECLARE_IERR_
Definition: basic.h:17
int FPPowerSystem3BusCleanup(void *)
int FPPowerSystemCleanup(void *)
double * rhs
Definition: hypar.h:399
#define _SHALLOW_WATER_1D_