44 const std::vector<unsigned int>* anIndex,
45 const std::vector<double>* aVector) {
47 for (
unsigned int i = 0; i < anIndex->size(); ++i) {
48 int iIndex = (*anIndex)[i] - 1;
49 for (
unsigned int j = 0; j <= i; ++j) {
50 int jIndex = (*anIndex)[j] - 1;
51 if (iIndex < nBorder) {
52 theBorder(iIndex, jIndex) += (*aVector)[i] * aWeight
54 }
else if (jIndex < nBorder) {
55 theMixed(jIndex, iIndex - nBorder) += (*aVector)[i] * aWeight
58 unsigned int nBand = iIndex - jIndex;
59 theBand(nBand, jIndex - nBorder) += (*aVector)[i] * aWeight
73 const std::vector<unsigned int> anIndex)
const {
75 TMatrixDSym aMatrix(anIndex.size());
77 for (
unsigned int i = 0; i < anIndex.size(); ++i) {
78 int iIndex = anIndex[i] - 1;
79 for (
unsigned int j = 0; j <= i; ++j) {
80 int jIndex = anIndex[j] - 1;
81 if (iIndex < nBorder) {
82 aMatrix(i, j) =
theBorder(iIndex, jIndex);
83 }
else if (jIndex < nBorder) {
84 aMatrix(i, j) = -
theMixed(jIndex, iIndex - nBorder);
86 unsigned int nBand = iIndex - jIndex;
87 aMatrix(i, j) =
theBand(nBand, jIndex - nBorder);
89 aMatrix(j, i) = aMatrix(i, j);
138 const VVector borderSolution = inverseBorder * auxVec;
142 aSolution.
putVec(borderSolution);
156 std::cout <<
"Border part " << std::endl;
158 std::cout <<
"Mixed part " << std::endl;
160 std::cout <<
"Band part " << std::endl;
179 for (
int i = 0; i < nCol; ++i) {
180 auxVec(i) =
theBand(0, i) * 16.0;
182 for (
int i = 0; i < nCol; ++i) {
192 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
194 for (
int k = 0; k < std::min(nRow, nCol - i) - j; ++k) {
213 VVector aSolution(aRightHandSide);
214 for (
int i = 0; i < nCol; ++i)
216 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
217 aSolution(j + i) -=
theBand(j, i) * aSolution(i);
220 for (
int i = nCol - 1; i >= 0; i--)
222 double rxw =
theBand(0, i) * aSolution(i);
223 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
224 rxw -=
theBand(j, i) * aSolution(j + i);
242 VMatrix aSolution(aRightHandSide);
243 for (
unsigned int iBorder = 0; iBorder <
numBorder; iBorder++) {
244 for (
int i = 0; i < nCol; ++i)
246 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
247 aSolution(iBorder, j + i) -=
theBand(j, i)
248 * aSolution(iBorder, i);
251 for (
int i = nCol - 1; i >= 0; i--)
253 double rxw =
theBand(0, i) * aSolution(iBorder, i);
254 for (
int j = 1; j < std::min(nRow, nCol - i); ++j) {
255 rxw -=
theBand(j, i) * aSolution(iBorder, j + i);
257 aSolution(iBorder, i) = rxw;
271 VMatrix inverseBand(nRow, nCol);
273 for (
int i = nCol - 1; i >= 0; i--) {
275 for (
int j = i; j >= std::max(0, i - nRow + 1); j--) {
276 for (
int k = j + 1; k < std::min(nCol, j + nRow); ++k) {
277 rxw -= inverseBand(abs(i - k), std::min(i, k))
280 inverseBand(i - j, j) = rxw;
297 VMatrix aBand((nBand + 1), nCol);
298 for (
int i = 0; i < nCol; ++i) {
299 for (
int j = std::max(0, i - nBand); j <= i; ++j) {
301 for (
int l = 0; l < nBorder; ++l) {
302 sum += anArray(i, l) * aSymArray(l, l) * anArray(j, l);
303 for (
int k = 0; k < l; ++k) {
304 sum += anArray(i, l) * aSymArray(l, k) * anArray(j, k)
305 + anArray(i, k) * aSymArray(l, k) * anArray(j, l);
308 aBand(i - j, j) = sum;