47 const std::vector<unsigned int>* anIndex,
48 const std::vector<double>* aVector) {
50 for (
unsigned int i = 0; i < anIndex->size(); ++i) {
51 int iIndex = (*anIndex)[i] - 1;
52 for (
unsigned int j = 0; j <= i; ++j) {
53 int jIndex = (*anIndex)[j] - 1;
54 if (iIndex < nBorder) {
55 theBorder(iIndex, jIndex) += (*aVector)[i] * aWeight
57 }
else if (jIndex < nBorder) {
58 theMixed(jIndex, iIndex - nBorder) += (*aVector)[i] * aWeight
61 unsigned int nBand = iIndex - jIndex;
62 theBand(nBand, jIndex - nBorder) += (*aVector)[i] * aWeight
76 const std::vector<unsigned int> anIndex)
const {
78 TMatrixDSym aMatrix(anIndex.size());
80 for (
unsigned int i = 0; i < anIndex.size(); ++i) {
81 int iIndex = anIndex[i] - 1;
82 for (
unsigned int j = 0; j <= i; ++j) {
83 int jIndex = anIndex[j] - 1;
84 if (iIndex < nBorder) {
85 aMatrix(i, j) =
theBorder(iIndex, jIndex);
86 }
else if (jIndex < nBorder) {
87 aMatrix(i, j) = -
theMixed(jIndex, iIndex - nBorder);
89 unsigned int nBand = iIndex - jIndex;
90 aMatrix(i, j) =
theBand(nBand, jIndex - nBorder);
92 aMatrix(j, i) = aMatrix(i, j);
141 const VVector borderSolution = inverseBorder * auxVec;
145 aSolution.
putVec(borderSolution);
159 std::cout <<
"Border part " << std::endl;
161 std::cout <<
"Mixed part " << std::endl;
163 std::cout <<
"Band part " << std::endl;
182 for (
int i = 0; i < nCol; ++i) {
183 auxVec(i) =
theBand(0, i) * 16.0;
185 for (
int i = 0; i < nCol; ++i) {
195 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
197 for (
int k = 0; k < std::min(nRow, nCol - i) - j; ++k) {
216 VVector aSolution(aRightHandSide);
217 for (
int i = 0; i < nCol; ++i)
219 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
220 aSolution(j + i) -=
theBand(j, i) * aSolution(i);
223 for (
int i = nCol - 1; i >= 0; i--)
225 double rxw =
theBand(0, i) * aSolution(i);
226 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
227 rxw -=
theBand(j, i) * aSolution(j + i);
245 VMatrix aSolution(aRightHandSide);
246 for (
unsigned int iBorder = 0; iBorder <
numBorder; iBorder++) {
247 for (
int i = 0; i < nCol; ++i)
249 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
250 aSolution(iBorder, j + i) -=
theBand(j, i)
251 * aSolution(iBorder, i);
254 for (
int i = nCol - 1; i >= 0; i--)
256 double rxw =
theBand(0, i) * aSolution(iBorder, i);
257 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
258 rxw -=
theBand(j, i) * aSolution(iBorder, j + i);
260 aSolution(iBorder, i) = rxw;
274 VMatrix inverseBand(nRow, nCol);
276 for (
int i = nCol - 1; i >= 0; i--) {
278 for (
int j = i; j >= std::max(0, i - nRow + 1); j--) {
279 for (
int k = j + 1; k < std::min(nCol, j + nRow); ++k) {
280 rxw -= inverseBand(abs(i - k), std::min(i, k))
283 inverseBand(i - j, j) = rxw;
300 VMatrix aBand((nBand + 1), nCol);
301 for (
int i = 0; i < nCol; ++i) {
302 for (
int j = std::max(0, i - nBand); j <= i; ++j) {
304 for (
int l = 0; l < nBorder; ++l) {
305 sum += anArray(i, l) * aSymArray(l, l) * anArray(j, l);
306 for (
int k = 0; k < l; ++k) {
307 sum += anArray(i, l) * aSymArray(l, k) * anArray(j, k)
308 + anArray(i, k) * aSymArray(l, k) * anArray(j, l);
311 aBand(i - j, j) = sum;