105 "GlobalLinSysStaticCond: Not setup for dirForcing");
107 bool atLastLevel = pLocToGloMap->AtLastLevel();
108 int scLevel = pLocToGloMap->GetStaticCondLevel();
110 int nGlobDofs = pLocToGloMap->GetNumGlobalCoeffs();
111 int nLocBndDofs = pLocToGloMap->GetNumLocalBndCoeffs();
112 int nGlobBndDofs = pLocToGloMap->GetNumGlobalBndCoeffs();
113 int nDirBndDofs = pLocToGloMap->GetNumGlobalDirBndCoeffs();
114 int nIntDofs = nGlobDofs - nGlobBndDofs;
116 if ((nGlobDofs - nDirBndDofs) == 0)
126 unused =
m_wsp + 1 * nLocBndDofs;
127 F_bnd1 =
m_wsp + 2 * nLocBndDofs;
128 V_bnd =
m_wsp + 3 * nLocBndDofs;
129 F_int =
m_wsp + 4 * nLocBndDofs;
131 pLocToGloMap->LocalToLocalBnd(pLocOutput, V_bnd);
142 if (nGlobBndDofs - nDirBndDofs)
144 pLocToGloMap->LocalToLocalBnd(pLocInput, F_bnd);
157 F_Bnd = BinvD * F_Int;
159 Vmath::Vsub(nLocBndDofs, F_bnd, 1, F_bnd1, 1, F_bnd, 1);
172 F_Bnd = SchurCompl * V_Bnd;
174 Vmath::Vsub(nLocBndDofs, F_bnd, 1, F_bnd1, 1, F_bnd, 1);
183 Vmath::Vadd(nLocBndDofs, V_bnd, 1, F_bnd1, 1, V_bnd, 1);
194 pLocToGloMap->GetNextLevelLocalToGlobalMap();
198 nextLevLocToGloMap->PatchAssemble(F_bnd, F_bnd);
199 nextLevLocToGloMap->PatchLocalToGlobal(V_bnd, V_bnd);
204 nextLevLocToGloMap->PatchGlobalToLocal(V_bnd, V_bnd);
221 F_Int = F_Int - C * V_Bnd;
326 pLocToGloMap->GetNumLocalBndCoeffsPerPatch();
328 pLocToGloMap->GetNumLocalIntCoeffsPerPatch();
346 int nPatches = pLocToGloMap->GetNumPatches();
352 for (i = 0; i < nPatches; i++)
354 nEntriesA += nBndDofsPerPatch[i] * nBndDofsPerPatch[i];
355 nEntriesB += nBndDofsPerPatch[i] * nIntDofsPerPatch[i];
356 nEntriesC += nIntDofsPerPatch[i] * nBndDofsPerPatch[i];
357 nEntriesD += nIntDofsPerPatch[i] * nIntDofsPerPatch[i];
392 for (i = 0; i < nPatches; i++)
395 tmparray = storageA + cntA;
397 nBndDofsPerPatch[i], nBndDofsPerPatch[i], tmparray, wType);
399 tmparray = storageB + cntB;
401 nBndDofsPerPatch[i], nIntDofsPerPatch[i], tmparray, wType);
403 tmparray = storageC + cntC;
405 nIntDofsPerPatch[i], nBndDofsPerPatch[i], tmparray, wType);
407 tmparray = storageD + cntD;
409 nIntDofsPerPatch[i], nIntDofsPerPatch[i], tmparray, wType,
412 cntA += nBndDofsPerPatch[i] * nBndDofsPerPatch[i];
413 cntB += nBndDofsPerPatch[i] * nIntDofsPerPatch[i];
414 cntC += nIntDofsPerPatch[i] * nBndDofsPerPatch[i];
415 cntD += nIntDofsPerPatch[i] * nIntDofsPerPatch[i];
422 int schurComplSubMatnRows;
427 for (n = cnt = 0; n < SchurCompl->GetNumberOfBlockRows(); ++n)
429 schurComplSubMat = SchurCompl->GetBlock(n, n);
430 schurComplSubMatnRows = schurComplSubMat->GetRows();
433 pLocToGloMap->GetPatchMapFromPrevLevel()->GetPatchId() + cnt;
434 dofId = pLocToGloMap->GetPatchMapFromPrevLevel()->GetDofId() + cnt;
436 pLocToGloMap->GetPatchMapFromPrevLevel()->IsBndDof() + cnt;
437 sign = pLocToGloMap->GetPatchMapFromPrevLevel()->GetSign() + cnt;
440 for (i = 0; i < schurComplSubMatnRows; ++i)
442 int pId = patchId[i];
444 substructuredMat[0][pId]->GetPtr();
446 substructuredMat[1][patchId[i]]->GetPtr();
448 substructuredMat[2][patchId[i]]->GetPtr();
450 int subMat0rows = substructuredMat[0][pId]->GetRows();
451 int subMat1rows = substructuredMat[1][pId]->GetRows();
452 int subMat2rows = substructuredMat[2][pId]->GetRows();
456 for (j = 0; j < schurComplSubMatnRows; ++j)
459 "These values should be equal");
463 subMat0[dofId[i] + dofId[j] * subMat0rows] +=
464 sign[i] *
sign[j] * (*schurComplSubMat)(i, j);
468 subMat1[dofId[i] + dofId[j] * subMat1rows] +=
469 sign[i] *
sign[j] * (*schurComplSubMat)(i, j);
475 for (j = 0; j < schurComplSubMatnRows; ++j)
478 "These values should be equal");
482 subMat2[dofId[i] + dofId[j] * subMat2rows] +=
483 sign[i] *
sign[j] * (*schurComplSubMat)(i, j);
489 if (dofId[i] <= dofId[j])
491 (*subMat3)(dofId[i], dofId[j]) +=
493 (*schurComplSubMat)(i, j);
498 (*subMat3)(dofId[i], dofId[j]) +=
500 (*schurComplSubMat)(i, j);
506 cnt += schurComplSubMatnRows;
511 for (i = 0; i < nPatches; i++)
513 if (nIntDofsPerPatch[i])
516 substructuredMat[0][i]->GetPtr();
518 substructuredMat[1][i]->GetPtr();
520 substructuredMat[2][i]->GetPtr();
521 int subMat0rows = substructuredMat[0][i]->GetRows();
522 int subMat1rows = substructuredMat[1][i]->GetRows();
523 int subMat2rows = substructuredMat[2][i]->GetRows();
524 int subMat2cols = substructuredMat[2][i]->GetColumns();
527 substructuredMat[3][i]->Invert();
529 (*substructuredMat[1][i]) =
530 (*substructuredMat[1][i]) * (*substructuredMat[3][i]);
535 if (subMat1rows && subMat2cols)
537 Blas::Dgemm(
'N',
'N', subMat1rows, subMat2cols, subMat2rows,
538 -1.0, &subMat1[0], subMat1rows, &subMat2[0],
539 subMat2rows, 1.0, &subMat0[0], subMat0rows);
548 pLocToGloMap->GetNumLocalBndCoeffsPerPatch();
550 pLocToGloMap->GetNumLocalIntCoeffsPerPatch();
554 nbdry_size, nbdry_size, blkmatStorage);
556 nbdry_size, nint_size, blkmatStorage);
558 nint_size, nbdry_size, blkmatStorage);
560 nint_size, nint_size, blkmatStorage);
563 for (i = 0; i < nPatches; i++)
565 for (j = 0; j < 4; j++)
568 1.0, substructuredMat[j][i]);
569 blkMatrices[j]->SetBlock(i, i, tmpscalmat);
582 blkMatrices[2], blkMatrices[3], pLocToGloMap);
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...