UCFD_SPARSE  v1.0
Documentation
Loading...
Searching...
No Matches
coloredlusgs.c
Go to the documentation of this file.
1
35#include <omp.h>
36#include "coloredlusgs.h"
37#include "flux.h"
38
47void parallel_pre_lusgs(int neles, int nface, double factor, \
48 double *fnorm_vol, double *dt, double *diag, double *fspr)
49{
50 int idx; // Element index
51 int jdx; // Face index
52 double lamf; // Spectral radius at each face
53
54 // SMP applied
55 #pragma omp parallel for private(jdx, lamf)
56 for (idx=0; idx<neles; idx++) {
57 // Diagonals of implicit operator
58 diag[idx] = 1.0/(dt[idx]*factor);
59
60 for (jdx=0; jdx<nface; jdx++) {
61 // Diffusive margin of wave speed of face
62 lamf = fspr[neles*jdx + idx]*1.01;
63
64 // Save spectral radius
65 fspr[neles*jdx + idx] = lamf;
66
67 // Add portion of lower and upper spectral radius
68 diag[idx] += 0.5*lamf*fnorm_vol[neles*jdx + idx];
69 }
70 }
71}
72
73
82void ns_parallel_lower_sweep(int n0, int ne, int neles, int nfvars, int nface, int ndims, \
83 int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, \
84 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
85{
86 int _idx, idx, jdx, kdx, neib, curr_level;
87 double du[nfvars], dfj[nfvars], df[nfvars], nf[ndims];
88 double u[nfvars], f[nfvars];
89
90 // Lower sweep via coloring
91 #pragma omp parallel for private(idx, jdx, kdx, neib, curr_level, \
92 du, dfj, df, nf, u, f)
93 for (_idx=n0; _idx<ne; _idx++) {
94 idx = icolor[_idx];
95 curr_level = lcolor[idx];
96
97 // Initialize `df` array
98 for (kdx=0; kdx<nfvars; kdx++) {
99 df[kdx] = 0.0;
100 }
101
102 // Set of faces surrounding a cell
103 for (jdx=0; jdx<nface; jdx++) {
104
105 // Get face normal vector
106 for (kdx=0; kdx<ndims; kdx++) {
107 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
108 }
109
110 // Neighbor element index meet at face
111 neib = nei_ele[neles*jdx + idx];
112
113 // Only for lower level cell
114 if (lcolor[neib] < curr_level) {
115
116 for (kdx=0; kdx<nfvars; kdx++) {
117 u[kdx] = uptsb[neles*kdx + neib];
118 du[kdx] = u[kdx] + dub[neles*kdx + neib];
119 }
120
121 ns_flux_container(nfvars, ndims, u, nf, f);
122 ns_flux_container(nfvars, ndims, du, nf, dfj);
123
124 for (kdx=0; kdx<nfvars; kdx++) {
125 dfj[kdx] -= f[kdx];
126 }
127
128 for (kdx=0; kdx<nfvars; kdx++) {
129 df[kdx] += (dfj[kdx] - fspr[neles*jdx + idx] \
130 * dub[neles*kdx + neib])*fnorm_vol[neles*jdx + idx];
131 }
132 }
133 }
134
135 // Update dub array
136 for (kdx=0; kdx<nfvars; kdx++)
137 dub[neles*kdx + idx] = (rhsb[neles*kdx + idx] - 0.5*df[kdx])/diag[idx];
138 }
139}
140
146void rans_parallel_lower_sweep(int n0, int ne, int neles, int nvars, int nfvars, int nface, int ndims, \
147 int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, \
148 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
149{
150 int _idx, idx, jdx, kdx, neib, curr_level;
151 int dnv = nvars - nfvars;
152 double du[nvars], dfj[dnv], df[dnv], nf[ndims];
153 double u[nvars], f[dnv];
154
155 #pragma omp parallel for private(idx, jdx, kdx, neib, curr_level, \
156 du, dfj, df, nf, u, f)
157 // Lower sweep via coloring
158 for (_idx=n0; _idx<ne; _idx++) {
159 idx = icolor[_idx];
160 curr_level = lcolor[idx];
161
162 // Initialize `df` array
163 for (kdx=0; kdx<dnv; kdx++) {
164 df[kdx] = 0.0;
165 }
166
167 // Set of faces surrounding a cell
168 for (jdx=0; jdx<nface; jdx++) {
169
170 // Get face normal vector
171 for (kdx=0; kdx<ndims; kdx++) {
172 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
173 }
174
175 // Neighbor element index meet at face
176 neib = nei_ele[neles*jdx + idx];
177
178 // Only for lower level cell
179 if (lcolor[neib] < curr_level) {
180
181 for (kdx=0; kdx<nvars; kdx++) {
182 u[kdx] = uptsb[neles*kdx + neib];
183 du[kdx] = u[kdx];
184 }
185
186 for (kdx=nfvars; kdx<nvars; kdx++) {
187 du[kdx] += dub[neles*kdx + neib];
188 }
189
190 rans_flux_container(nfvars, ndims, dnv, u, nf, f);
191 rans_flux_container(nfvars, ndims, dnv, du, nf, dfj);
192
193 for (kdx=0; kdx<dnv; kdx++) {
194 dfj[kdx] -= f[kdx];
195 }
196
197 for (kdx=0; kdx<dnv; kdx++) {
198 df[kdx] += (dfj[kdx] - fspr[neles*jdx + idx] \
199 * dub[neles*(kdx+nfvars) + neib]) * fnorm_vol[neles*jdx + idx];
200 }
201 }
202 }
203
204 // Update dub array
205 for (kdx=0; kdx<dnv; kdx++) {
206 dub[neles*(kdx+nfvars) + idx] = (rhsb[neles*(kdx+nfvars)+idx] - \
207 0.5*df[kdx])/(diag[idx]+dsrc[neles*(kdx+nfvars)+idx]);
208 }
209 }
210}
211
212
220void ns_parallel_upper_sweep(int n0, int ne, int neles, int nfvars, int nface, int ndims, \
221 int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, \
222 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
223{
224 int _idx, idx, jdx, kdx, neib, curr_level;
225 double du[nfvars], dfj[nfvars], df[nfvars], nf[ndims];
226 double u[nfvars], f[nfvars];
227
228 // Upper sweep via coloring
229 #pragma omp parallel for private(idx, jdx, kdx, neib, curr_level, \
230 du, dfj, df, nf, u, f)
231 for (_idx=n0; _idx<ne; _idx++) {
232 idx = icolor[_idx];
233 curr_level = lcolor[idx];
234
235 // Initialize `df` array
236 for (kdx=0; kdx<nfvars; kdx++) {
237 df[kdx] = 0.0;
238 }
239
240 // Set of faces surrounding a cell
241 for (jdx=0; jdx<nface; jdx++) {
242
243 // Get face normal vector
244 for (kdx=0; kdx<ndims; kdx++) {
245 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
246 }
247
248 // Neighbor element index meet at face
249 neib = nei_ele[neles*jdx + idx];
250
251 // Only for upper level cell
252 if (lcolor[neib] > curr_level) {
253
254 for (kdx=0; kdx<nfvars; kdx++) {
255 u[kdx] = uptsb[neles*kdx + neib];
256 du[kdx] = u[kdx] + rhsb[neles*kdx + neib];
257 }
258
259 ns_flux_container(nfvars, ndims, u, nf, f);
260 ns_flux_container(nfvars, ndims, du, nf, dfj);
261
262 for (kdx=0; kdx<nfvars; kdx++) {
263 dfj[kdx] -= f[kdx];
264 }
265
266 for (kdx=0; kdx<nfvars; kdx++) {
267 df[kdx] += (dfj[kdx] - fspr[neles*jdx + idx] \
268 * rhsb[neles*kdx + neib])*fnorm_vol[neles*jdx + idx];
269 }
270 }
271 }
272
273 // Update rhsb array
274 for (kdx=0; kdx<nfvars; kdx++) {
275 rhsb[neles*kdx + idx] = dub[neles*kdx + idx] - 0.5*df[kdx]/diag[idx];
276 }
277 }
278}
279
280
287void rans_parallel_upper_sweep(int n0, int ne, int neles, int nvars, int nfvars, int nface, int ndims, \
288 int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, \
289 double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
290{
291 int _idx, idx, jdx, kdx, neib, curr_level;
292 int dnv = nvars - nfvars;
293 double du[nvars], dfj[dnv], df[dnv], nf[ndims];
294 double u[nvars], f[dnv];
295
296 #pragma omp parallel for private(idx, jdx, kdx, neib, curr_level, \
297 du, dfj, df, nf, u, f)
298 // Upper sweep via coloring
299 for (_idx=n0; _idx<ne; _idx++) {
300 idx = icolor[_idx];
301 curr_level = lcolor[idx];
302
303 // Initialize `df` array
304 for (kdx=0; kdx<dnv; kdx++) {
305 df[kdx] = 0.0;
306 }
307
308 // Set of faces surrounding a cell
309 for (jdx=0; jdx<nface; jdx++) {
310
311 // Get face normal vector
312 for (kdx=0; kdx<ndims; kdx++) {
313 nf[kdx] = vec_fnorm[ndims*neles*jdx + neles*kdx + idx];
314 }
315
316 // Neighbor element index meet at face
317 neib = nei_ele[neles*jdx + idx];
318
319 // Only for upper level cell
320 if (lcolor[neib] > curr_level) {
321
322 for (kdx=0; kdx<nvars; kdx++) {
323 u[kdx] = uptsb[neles*kdx + neib];
324 du[kdx] = u[kdx];
325 }
326
327 for (kdx=nfvars; kdx<nvars; kdx++) {
328 du[kdx] += rhsb[neles*kdx + neib];
329 }
330
331 rans_flux_container(nfvars, ndims, dnv, u, nf, f);
332 rans_flux_container(nfvars, ndims, dnv, du, nf, dfj);
333
334 for (kdx=0; kdx<dnv; kdx++) {
335 dfj[kdx] -= f[kdx];
336 }
337
338 for (kdx=0; kdx<dnv; kdx++) {
339 df[kdx] += (dfj[kdx] - fspr[neles*jdx+idx] \
340 * rhsb[neles*(kdx+nfvars)+neib])*fnorm_vol[neles*jdx+idx];
341 }
342 }
343 }
344
345 // Update rhsb array
346 for (kdx=0; kdx<dnv; kdx++) {
347 rhsb[neles*(kdx+nfvars)+idx] = dub[neles*(kdx+nfvars)+idx] - \
348 0.5*df[kdx]/(diag[idx] + dsrc[neles*(kdx+nfvars)+idx]);
349 }
350 }
351}
352
353
360void parallel_update(int neles, int nvars, double *uptsb, double *rhsb)
361{
362 int idx, kdx;
364 #pragma omp parallel for private(kdx)
365 // Iterate for all cell
366 for (idx=0; idx<neles; idx++) {
367 // Update conservative variables
368 for (kdx=0; kdx<nvars; kdx++) {
369 // Indexing 2D array as 1D
370 uptsb[neles*kdx + idx] += rhsb[neles*kdx + idx];
371 }
372 }
373}
void parallel_pre_lusgs(int neles, int nface, double factor, double *fnorm_vol, double *dt, double *diag, double *fspr)
Computes Diagonal matrix for Colored LU-SGS method.
Definition: coloredlusgs.c:47
void parallel_update(int neles, int nvars, double *uptsb, double *rhsb)
Updates solution array.
Definition: coloredlusgs.c:360
void rans_parallel_upper_sweep(int n0, int ne, int neles, int nvars, int nfvars, int nface, int ndims, int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
Upper sweep of Colored LU-SGS method for RANS equations.
Definition: coloredlusgs.c:287
void ns_parallel_upper_sweep(int n0, int ne, int neles, int nfvars, int nface, int ndims, int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
Upper sweep of Colored LU-SGS method for Navier-Stokes equations.
Definition: coloredlusgs.c:220
void ns_parallel_lower_sweep(int n0, int ne, int neles, int nfvars, int nface, int ndims, int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr)
Lower sweep of Colored LU-SGS method for Navier-Stokes equations.
Definition: coloredlusgs.c:82
void rans_parallel_lower_sweep(int n0, int ne, int neles, int nvars, int nfvars, int nface, int ndims, int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *vec_fnorm, double *uptsb, double *rhsb, double *dub, double *diag, double *fspr, double *dsrc)
Lower sweep of Colored LU-SGS method for RANS equations.
Definition: coloredlusgs.c:146
Header file for Colored LU-SGS method.
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.
#define ndims
Definition: mpi3d.c:32
#define nvars
Definition: mpi3d.c:31