UCFD_SPARSE  v1.0
Documentation
Loading...
Searching...
No Matches
coloredblusgs.c
Go to the documentation of this file.
1
26#include <stdio.h>
27#include <omp.h>
28#include "coloredblusgs.h"
29#include "flux.h"
30#include "inverse.h"
31
38void ns_parallel_pre_blusgs(int neles, int nfvars, int nface, double factor, \
39 double *fnorm_vol, double *dt, double *diag, double *fjmat)
40{
41 int idx, jdx, kdx, row, col; // Element index
42 int matsize = nfvars*nfvars;
43 double fv, dti;
44 double dmat[matsize]; // Diagonal matrix at each cell
45
46 #pragma omp parallel for private(jdx, kdx, row, col, fv, dmat, dti)
47 for (idx=0; idx<neles; idx++) {
48 // Initialize diagonal matrix
49 for (kdx=0; kdx<matsize; kdx++)
50 dmat[kdx] = 0.0;
51
52 // Computes diagonal matrix based on neighbor cells
53 for (jdx=0; jdx<nface; jdx++) {
54 fv = fnorm_vol[neles*jdx + idx];
55 for (row=0; row<nfvars; row++) {
56 for (col=0; col<nfvars; col++) {
57 dmat[nfvars*row+col] \
58 += fjmat[idx+neles*jdx+nface*neles*col+nfvars*nface*neles*row]*fv;
59 }
60 }
61 }
62
63 // Complete implicit operator
64 dti = 1.0/(dt[idx]*factor);
65 for (kdx=0; kdx<nfvars; kdx++) {
66 dmat[(nfvars+1)*kdx] += dti;
67 }
68
69 // LU decomposition for inverse process
70 ludcmp(nfvars, dmat);
71
72 // Allocate temporal matrix to diag array
73 for (row=0; row<nfvars; row++) {
74 for (col=0; col<nfvars; col++) {
75 diag[idx+neles*col+neles*nfvars*row] = dmat[nfvars*row+col];
76 }
77 }
78 }
79}
80
81
88void rans_parallel_pre_blusgs(int neles, int nvars, int nfvars, int nface, double factor, double betast, \
89 double *fnorm_vol, double *uptsb, double *dt, double *tdiag, double *tjmat, double *dsrc)
90{
91 int idx, jdx, kdx, row, col;
92 int ntvars = nvars - nfvars; // Constant
93 int matsize = ntvars*ntvars; // Constant
94 double tmat[matsize]; // Diagonal matrix at each cell
95 double uf[nvars], dsrcf[nvars];
96 double fv;
97 int err;
98
99 #pragma omp parallel for private(jdx, kdx, row, col, fv, err, \
100 tmat, uf, dsrcf)
101 for (idx=0; idx<neles; idx++) {
102 // Initialize diagonal matrix
103 for (kdx=0; kdx<matsize; kdx++)
104 tmat[kdx] = 0.0;
105
106 for (kdx=0; kdx<nvars; kdx++) {
107 uf[kdx] = uptsb[idx+neles*kdx];
108 dsrcf[kdx] = dsrc[idx+neles*kdx];
109 }
110
111 // Computes diagonal matrix based on neighbor cells
112 for (jdx=0; jdx<nface; jdx++) {
113 fv = fnorm_vol[neles*jdx + idx];
114 for (row=0; row<ntvars; row++) {
115 for (col=0; col<ntvars; col++) {
116 tmat[ntvars*row+col] \
117 += tjmat[idx+neles*jdx+nface*neles*col+ntvars*nface*neles*row]*fv;
118 }
119 }
120 }
121
122 // Computes Source term Jacobian
123 err = rans_source_jacobian(nvars, ntvars, betast, uf, tmat, dsrcf);
124 if (err == -1) {
125 printf("Warning:::Source term Jacobian of RANS equations does not match\n");
126 }
127
128 // Complete implicit operator
129 for (kdx=0; kdx<ntvars; kdx++) {
130 tmat[(ntvars+1)*kdx] += 1.0/(dt[idx]*factor);
131 }
132
133 // LU decomposition for inverse process
134 ludcmp(ntvars, tmat);
135
136 // Allocate temporal matrix to diag array
137 for (row=0; row<ntvars; row++) {
138 for (col=0; col<ntvars; col++) {
139 tdiag[idx+neles*col+neles*ntvars*row] = tmat[ntvars*row+col];
140 }
141 }
142 }
143}
144
145
155void ns_parallel_block_sweep(int n0, int ne, int neles, int nfvars, int nface, \
156 int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, \
157 double *rhsb, double *dub, double *diag, double *fjmat)
158{
159 int _idx, idx, jdx, kdx, neib, curr_level;
160 int row, col;
161 double val, fv;
162 double rhs[nfvars], dmat[nfvars*nfvars];
163
164 // Lower/Upper sweep via coloring
165 #pragma omp parallel for private(idx, jdx, kdx, neib, curr_level, row, col, \
166 rhs, dmat, val, fv)
167 for (_idx=n0; _idx<ne; _idx++) {
168 idx = icolor[_idx];
169 curr_level = lcolor[idx];
170
171 // Initialize
172 for (kdx=0; kdx<nfvars; kdx++) {
173 rhs[kdx] = rhsb[idx+kdx*neles];
174 }
175
176 for (row=0; row<nfvars; row++) {
177 for (col=0; col<nfvars; col++) {
178 dmat[col+nfvars*row] = diag[idx+neles*col+nfvars*neles*row];
179 }
180 }
181
182 for (jdx=0; jdx<nface; jdx++) {
183 neib = nei_ele[idx+neles*jdx];
184
185 if (lcolor[neib] != curr_level) {
186 fv = fnorm_vol[idx+neles*jdx];
187
188 for (row=0; row<nfvars; row++) {
189 val = 0.0;
190 for (col=0; col<nfvars; col++) {
191 val += fjmat[idx+neles*jdx+nface*neles*col+nfvars*nface*neles*row] \
192 * dub[neib+neles*col];
193 }
194 rhs[row] -= val*fv;
195 }
196 }
197 }
198
199 lusubst(nfvars, dmat, rhs);
200
201 for (kdx=0; kdx<nfvars; kdx++) {
202 dub[idx+neles*kdx] = rhs[kdx];
203 }
204 }
205}
206
207
216void rans_parallel_block_sweep(int n0, int ne, int neles, int nvars, int nfvars, int nface, \
217 int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, \
218 double *rhsb, double *dub, double *tdiag, double *tjmat)
219{
220 int _idx, idx, jdx, kdx, neib, curr_level;
221 int row, col;
222 int ntvars = nvars - nfvars;
223 double val, fv;
224 double rhs[ntvars], dmat[ntvars*ntvars];
225
226 // Lower/Upper sweep via coloring
227 #pragma omp parallel for private(idx, jdx, kdx, neib, curr_level, row, col, \
228 rhs, dmat, val, fv)
229 for (_idx=n0; _idx<ne; _idx++) {
230 idx = icolor[_idx];
231 curr_level = lcolor[idx];
232
233 //Initialize
234 for (kdx=0; kdx<ntvars; kdx++) {
235 rhs[kdx] = rhsb[idx+(kdx+nfvars)*neles];
236 }
237
238 for (row=0; row<ntvars; row++) {
239 for (col=0; col<ntvars; col++) {
240 dmat[col+ntvars*row] = tdiag[idx+neles*col+neles*ntvars*row];
241 }
242 }
243
244 for (jdx=0; jdx<nface; jdx++) {
245 neib = nei_ele[idx+neles*jdx];
246
247 if (lcolor[neib] != curr_level) {
248 fv = fnorm_vol[idx+neles*jdx];
249
250 for (row=0; row<ntvars; row++) {
251 val = 0.0;
252 for (col=0; col<ntvars; col++) {
253 val += tjmat[idx+neles*jdx+nface*neles*col+ntvars*nface*neles*row] \
254 * dub[neib+neles*(col+nfvars)];
255 }
256 rhs[row] -= val*fv;
257 }
258 }
259 }
260
261 // Compute inverse of diagonal matrix multiplication
262 lusubst(ntvars, dmat, rhs);
263
264 // Update dub array
265 for (kdx=0; kdx<ntvars; kdx++) {
266 dub[idx+neles*(kdx+nfvars)] = rhs[kdx];
267 }
268 }
269}
270
271
275void parallel_update(int neles, int nvars, double *uptsb, double *dub, double *subres)
276{
277 int idx, kdx;
278
279 #pragma omp parallel for private(kdx)
280 for (idx=0; idx<neles; idx++) {
281 for (kdx=0; kdx<nvars; kdx++) {
282 uptsb[idx+neles*kdx] += dub[idx+neles*kdx];
283
284 // Initialize dub array
285 dub[idx+neles*kdx] = 0.0;
286 }
287 // Initialize sub-residual array
288 subres[idx] = 0.0;
289 }
290}
291
292
void ns_parallel_pre_blusgs(int neles, int nfvars, int nface, double factor, double *fnorm_vol, double *dt, double *diag, double *fjmat)
Definition: coloredblusgs.c:38
void parallel_update(int neles, int nvars, double *uptsb, double *dub, double *subres)
void rans_parallel_pre_blusgs(int neles, int nvars, int nfvars, int nface, double factor, double betast, double *fnorm_vol, double *uptsb, double *dt, double *tdiag, double *tjmat, double *dsrc)
Definition: coloredblusgs.c:88
void ns_parallel_block_sweep(int n0, int ne, int neles, int nfvars, int nface, int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *rhsb, double *dub, double *diag, double *fjmat)
void rans_parallel_block_sweep(int n0, int ne, int neles, int nvars, int nfvars, int nface, int *nei_ele, int *icolor, int *lcolor, double *fnorm_vol, double *rhsb, double *dub, double *tdiag, double *tjmat)
int rans_source_jacobian(int nvars, int ntvars, double betast, double *uf, double *tmat, double *dsrc)
Computes source term Jacobian matrix for RANS equations.
Definition: flux.c:101
Header file for numerical flux funtions.
void lusubst(int n, double *LU, double *b)
Forward/Backward Substitution function.
Definition: inverse.c:73
void ludcmp(int n, double *A)
LU Decomposition function.
Definition: inverse.c:34
Header file for LU Decomposition/Substitution.
#define nvars
Definition: mpi3d.c:31