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