UCFD_SPARSE  v1.0
Documentation
Loading...
Searching...
No Matches
lusgs.c
Go to the documentation of this file.
1
33#include "lusgs.h"
34#include "flux.h"
35
44void serial_pre_lusgs(int neles, int nface, double factor, \
45 double *fnorm_vol, double *dt, double *diag, double *fspr)
46{
47 int idx; // Element index
48 int jdx; // Face index
49 double lamf; // Spectral radius at each face
50
51 for (idx=0; idx<neles; idx++) {
52 // Diagonals of implicit operator
53 diag[idx] = 1.0/(dt[idx]*factor);
54
55 for (jdx=0; jdx<nface; jdx++) {
56 // Apply diffusive margin of wave speed at face
57 lamf = fspr[neles*jdx + idx]*1.01;
58
59 // Save spectral radius
60 fspr[neles*jdx + idx] = lamf;
61
62 // Add portion of lower and upper spectral radius
63 diag[idx] += 0.5*lamf*fnorm_vol[neles*jdx + idx];
64 }
65 }
66}
67
68
75void ns_serial_lower_sweep(int neles, int nfvars, int nface, int ndims, \
76 int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, \
77 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
78{
79 int _idx, idx, jdx, kdx, neib; // Index variables
80 double du[nfvars], dfj[nfvars], df[nfvars], nf[ndims]; // Temporal arrays
81 double u[nfvars], f[nfvars];
82
83 // Lower sweep via mapping
84 for (_idx=0; _idx<neles; _idx++) {
85 idx = mapping[_idx];
86
87 // Initialize `df` array
88 for (kdx=0; kdx<nfvars; kdx++) {
89 df[kdx] = 0.0;
90 }
91
92 // Set of faces surrounding a cell
93 for (jdx=0; jdx<nface; jdx++) {
94
95 // Get face normal vector
96 for (kdx=0; kdx<ndims; kdx++) {
97 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
98 }
99
100 // Neighbor element index meet at face
101 neib = nei_ele[neles*jdx + idx];
102
103 // Only for lower neighbor cell
104 if (unmapping[neib] < _idx) {
105
106 for (kdx=0; kdx<nfvars; kdx++) {
107 u[kdx] = uptsb[neles*kdx + neib];
108 du[kdx] = u[kdx] + dub[neles*kdx + neib];
109 }
110
111 ns_flux_container(nfvars, ndims, u, nf, f);
112 ns_flux_container(nfvars, ndims, du, nf, dfj);
113
114 for (kdx=0; kdx<nfvars; kdx++) {
115 dfj[kdx] -= f[kdx];
116 }
117
118 for (kdx=0; kdx<nfvars; kdx++) {
119 df[kdx] += (dfj[kdx] - fspr[neles*jdx + idx] \
120 * dub[neles*kdx + neib])*fnorm_vol[neles*jdx + idx];
121 }
122 }
123 }
124
125 // Update dub array
126 for (kdx=0; kdx<nfvars; kdx++)
127 dub[neles*kdx + idx] = (rhsb[neles*kdx + idx] - 0.5*df[kdx])/diag[idx];
128 }
129}
130
136void rans_serial_lower_sweep(int neles, int nvars, int nfvars, int nface, int ndims, \
137 int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, \
138 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
139{
140 int _idx, idx, jdx, kdx, neib;
141 int dnv = nvars - nfvars;
142 double du[nvars], dfj[dnv], df[dnv], nf[ndims];
143 double u[nvars], f[dnv];
144
145 // Lower sweep via mapping
146 for (_idx=0; _idx<neles; _idx++) {
147 idx = mapping[_idx];
148
149 // Initialize `df` array
150 for (kdx=0; kdx<dnv; kdx++) {
151 df[kdx] = 0.0;
152 }
153
154 // Set of faces surrounding a cell
155 for (jdx=0; jdx<nface; jdx++) {
156
157 // Get face normal vector
158 for (kdx=0; kdx<ndims; kdx++) {
159 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
160 }
161
162 // Neighbor element index meet at face
163 neib = nei_ele[neles*jdx + idx];
164
165 // Only for lower neighbor cell
166 if (unmapping[neib] < _idx) {
167
168 for (kdx=0; kdx<nvars; kdx++) {
169 u[kdx] = uptsb[neles*kdx + neib];
170 du[kdx] = u[kdx];
171 }
172
173 for (kdx=nfvars; kdx<nvars; kdx++) {
174 du[kdx] += dub[neles*kdx + neib];
175 }
176
177 rans_flux_container(nfvars, ndims, dnv, u, nf, f);
178 rans_flux_container(nfvars, ndims, dnv, du, nf, dfj);
179
180 for (kdx=0; kdx<dnv; kdx++) {
181 dfj[kdx] -= f[kdx];
182 }
183
184 for (kdx=0; kdx<dnv; kdx++) {
185 df[kdx] += (dfj[kdx] - fspr[neles*jdx + idx] \
186 * dub[neles*(kdx+nfvars) + neib]) * fnorm_vol[neles*jdx + idx];
187 }
188 }
189 }
190
191 // Update dub array
192 for (kdx=0; kdx<dnv; kdx++) {
193 dub[neles*(kdx+nfvars) + idx] = (rhsb[neles*(kdx+nfvars)+idx] - \
194 0.5*df[kdx])/(diag[idx]+dsrc[neles*(kdx+nfvars)+idx]);
195 }
196 }
197}
198
199
207void ns_serial_upper_sweep(int neles, int nfvars, int nface, int ndims, \
208 int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, \
209 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
210{
211 int _idx, idx, jdx, kdx, neib;
212 double du[nfvars], dfj[nfvars], df[nfvars], nf[ndims];
213 double u[nfvars], f[nfvars];
214
215 // Upper sweep via mapping
216 for (_idx=neles-1; _idx>-1; _idx--) {
217 idx = mapping[_idx];
218
219 // Initialize `df` array
220 for (kdx=0; kdx<nfvars; kdx++) {
221 df[kdx] = 0.0;
222 }
223
224 // Set of faces surrounding a cell
225 for (jdx=0; jdx<nface; jdx++) {
226
227 // Get face normal vector
228 for (kdx=0; kdx<ndims; kdx++) {
229 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
230 }
231
232 // Neighbor element index meet at face
233 neib = nei_ele[neles*jdx + idx];
234
235 // Only for upper neighbor cell
236 if (unmapping[neib] > _idx) {
237
238 for (kdx=0; kdx<nfvars; kdx++) {
239 u[kdx] = uptsb[neles*kdx + neib];
240 du[kdx] = u[kdx] + rhsb[neles*kdx + neib];
241 }
242
243 ns_flux_container(nfvars, ndims, u, nf, f);
244 ns_flux_container(nfvars, ndims, du, nf, dfj);
245
246 for (kdx=0; kdx<nfvars; kdx++) {
247 dfj[kdx] -= f[kdx];
248 }
249
250 for (kdx=0; kdx<nfvars; kdx++) {
251 df[kdx] += (dfj[kdx] - fspr[neles*jdx + idx] \
252 * rhsb[neles*kdx + neib])*fnorm_vol[neles*jdx + idx];
253 }
254 }
255 }
256
257 // Update rhsb array
258 for (kdx=0; kdx<nfvars; kdx++) {
259 rhsb[neles*kdx + idx] = dub[neles*kdx + idx] - 0.5*df[kdx]/diag[idx];
260 }
261 }
262}
263
264
271void rans_serial_upper_sweep(int neles, int nvars, int nfvars, int nface, int ndims, \
272 int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, \
273 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
274{
275 int _idx, idx, jdx, kdx, neib;
276 int dnv = nvars - nfvars;
277 double du[nvars], dfj[dnv], df[dnv], nf[ndims];
278 double u[nvars], f[dnv];
279
280 // Upper sweep via mapping
281 for (_idx=neles-1; _idx>-1; _idx--) {
282 idx = mapping[_idx];
283
284 // Initialize `df` array
285 for (kdx=0; kdx<dnv; kdx++) {
286 df[kdx] = 0.0;
287 }
288
289 // Set of faces surrounding a cell
290 for (jdx=0; jdx<nface; jdx++) {
291
292 // Get face normal vector
293 for (kdx=0; kdx<ndims; kdx++) {
294 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
295 }
296
297 // Neighbor element index meet at face
298 neib = nei_ele[neles*jdx + idx];
299
300 // Only for upper neighbor cell
301 if (unmapping[neib] > _idx) {
302
303 for (kdx=0; kdx<nvars; kdx++) {
304 u[kdx] = uptsb[neles*kdx + neib];
305 du[kdx] = u[kdx];
306 }
307
308 for (kdx=nfvars; kdx<nvars; kdx++) {
309 du[kdx] += rhsb[neles*kdx + neib];
310 }
311
312 rans_flux_container(nfvars, ndims, dnv, u, nf, f);
313 rans_flux_container(nfvars, ndims, dnv, du, nf, dfj);
314
315 for (kdx=0; kdx<dnv; kdx++) {
316 dfj[kdx] -= f[kdx];
317 }
318
319 for (kdx=0; kdx<dnv; kdx++) {
320 df[kdx] += (dfj[kdx] - fspr[neles*jdx+idx] \
321 * rhsb[neles*(kdx+nfvars)+neib])*fnorm_vol[neles*jdx+idx];
322 }
323 }
324 }
325
326 // Update rhsb array
327 for (kdx=0; kdx<dnv; kdx++) {
328 rhsb[neles*(kdx+nfvars)+idx] = dub[neles*(kdx+nfvars)+idx] - \
329 0.5*df[kdx]/(diag[idx] + dsrc[neles*(kdx+nfvars)+idx]);
330 }
331 }
332}
333
334
341void serial_update(int neles, int nvars, double *uptsb, double *rhsb)
342{
343 // Iterate for all cell
344 for (int idx=0; idx<neles; idx++) {
345 // Update conservative variables
346 for (int kdx=0; kdx<nvars; kdx++) {
347 // Indexing 2D array as 1D
348 uptsb[neles*kdx + idx] += rhsb[neles*kdx + idx];
349 }
350 }
351}
void ns_flux_container(int nfvars, int ndims, double *u, double *nf, double *f)
Computes flux for Navier-Stokes equations.
Definition: flux.c:37
void rans_flux_container(int nfvars, int ndims, int nturbvars, double *u, double *nf, double *f)
Computes flux for RANS equations.
Definition: flux.c:85
Header file for numerical flux funtions.
void ns_serial_upper_sweep(int neles, int nfvars, int nface, int ndims, int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
Upper sweep of LU-SGS method for Navier-Stokes equations.
Definition: lusgs.c:207
void rans_serial_upper_sweep(int neles, int nvars, int nfvars, int nface, int ndims, int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
Upper sweep of LU-SGS method for RANS equations.
Definition: lusgs.c:271
void rans_serial_lower_sweep(int neles, int nvars, int nfvars, int nface, int ndims, int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
Lower sweep of LU-SGS method for RANS equations.
Definition: lusgs.c:136
void ns_serial_lower_sweep(int neles, int nfvars, int nface, int ndims, int *nei_ele, int *mapping, int *unmapping, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
Lower sweep of LU-SGS method for Navier-Stokes equations.
Definition: lusgs.c:75
void serial_pre_lusgs(int neles, int nface, double factor, double *fnorm_vol, double *dt, double *diag, double *fspr)
Computes Diagonal matrix for LU-SGS method.
Definition: lusgs.c:44
void serial_update(int neles, int nvars, double *uptsb, double *rhsb)
Updates solution array.
Definition: lusgs.c:341
Header file for serial LU-SGS method.
#define ndims
Definition: mpi3d.c:32
#define nvars
Definition: mpi3d.c:31