172 const vec &dc,
const vec &nc,
173 sp_mat &Al, sp_mat &Ar, sp_mat &Ab, sp_mat &At) {
174 Al.set_size(0, 0); Ar.set_size(0, 0);
175 Ab.set_size(0, 0); At.set_size(0, 0);
177 Real qrl = boundaryNorm(dc, nc, 0, 1);
178 Real qbt = boundaryNorm(dc, nc, 2, 3);
182 addScalarBClhs(k, m, dx, {dc(0), dc(1)}, {nc(0), nc(1)}, Al0, Ar0);
184 sp_mat In = (qbt == 0) ? buildIdentity(n)
185 : buildIdentity(n+2,
true);
192 addScalarBClhs(k, n, dy, {dc(2), dc(3)}, {nc(2), nc(3)}, Ab0, At0);
194 sp_mat Im = (qrl == 0) ? buildIdentity(m)
195 : buildIdentity(m+2);
202 const vec &dc,
const vec &nc,
203 sp_mat &Al, sp_mat &Ar, sp_mat &Ab,
204 sp_mat &At, sp_mat &Af, sp_mat &Ak) {
205 Al.set_size(0,0); Ar.set_size(0,0);
206 Ab.set_size(0,0); At.set_size(0,0);
207 Af.set_size(0,0); Ak.set_size(0,0);
209 Real qrl = boundaryNorm(dc, nc, 0, 1);
210 Real qbt = boundaryNorm(dc, nc, 2, 3);
211 Real qfk = boundaryNorm(dc, nc, 4, 5);
213 auto makeId = [](u32 sz,
Real q,
bool excludeCorners) -> sp_mat {
214 return (q == 0) ? buildIdentity(sz)
215 : buildIdentity(sz + 2, excludeCorners);
220 addScalarBClhs(k, m, dx, {dc(0), dc(1)}, {nc(0), nc(1)}, Al0, Ar0);
222 sp_mat In = makeId(n, qbt,
true);
223 sp_mat Io = makeId(o, qfk,
true);
224 Al = kron(kron(Io, In), Al0);
225 Ar = kron(kron(Io, In), Ar0);
230 addScalarBClhs(k, n, dy, {dc(2), dc(3)}, {nc(2), nc(3)}, Ab0, At0);
232 sp_mat Im = makeId(m, qrl,
false);
233 sp_mat Io = makeId(o, qfk,
true);
234 Ab = kron(kron(Io, Ab0), Im);
235 At = kron(kron(Io, At0), Im);
240 addScalarBClhs(k, o, dz, {dc(4), dc(5)}, {nc(4), nc(5)}, Af0, Ak0);
242 sp_mat Im = makeId(m, qrl,
false);
243 sp_mat In = makeId(n, qbt,
false);
244 Af = kron(kron(Af0, In), Im);
245 Ak = kron(kron(Ak0, In), Im);
309 assert(bc.
dc.n_elem == 4 &&
"dc must be a 4x1 vector");
310 assert(bc.
nc.n_elem == 4 &&
"nc must be a 4x1 vector");
311 assert(bc.
v.size() == 4 &&
"v must have 4 vectors");
312 assert(A.n_rows == A.n_cols &&
"A must be square");
313 assert(A.n_cols == b.n_elem &&
"b size must equal A columns");
315 sp_mat Al, Ar, Ab, At;
316 addScalarBClhs(k, m, dx, n, dy, bc.
dc, bc.
nc, Al, Ar, Ab, At);
320 BCPairLhs pairs[] = {
321 {boundaryNorm(bc.
dc, bc.
nc, 0, 1), Al, Ar, rl, rr},
322 {boundaryNorm(bc.
dc, bc.
nc, 2, 3), Ab, At, rb, rt},
324 for (
auto &p : pairs) applyBCPair(A, b, p);
331 assert(bc.
dc.n_elem == 6 &&
"dc must be a 6x1 vector");
332 assert(bc.
nc.n_elem == 6 &&
"nc must be a 6x1 vector");
333 assert(bc.
v.size() == 6 &&
"v must have 6 vectors");
334 assert(A.n_rows == A.n_cols &&
"A must be square");
335 assert(A.n_cols == b.n_elem &&
"b size must equal A columns");
337 sp_mat Al, Ar, Ab, At, Af, Ak;
339 Al, Ar, Ab, At, Af, Ak);
341 uvec rl, rr, rb, rt, rf, rk;
343 BCPairLhs pairs[] = {
344 {boundaryNorm(bc.
dc, bc.
nc, 0, 1), Al, Ar, rl, rr},
345 {boundaryNorm(bc.
dc, bc.
nc, 2, 3), Ab, At, rb, rt},
346 {boundaryNorm(bc.
dc, bc.
nc, 4, 5), Af, Ak, rf, rk},
348 for (
auto &p : pairs) applyBCPair(A, b, p);