1 #include <../../nrnconf.h> 58 if (lb < 0 || ub < 0 ||
n <= 0)
97 int new_lb,new_ub,new_n;
99 int lb,ub,
i,
j,l,shift,umin;
102 if (new_lb < 0 || new_ub < 0 || new_n <= 0)
105 return bd_get(new_lb,new_ub,new_n);
106 if (
A->lb+
A->ub+1 >
A->mat->m )
109 if (
A->lb == new_lb &&
A->ub == new_ub &&
A->mat->n == new_n )
115 umin =
min(ub,new_ub);
119 for ( i = 0; i < lb; i++ )
120 for ( j =
A->mat->n - lb + i; j < A->mat->n; j++ )
122 for ( i = lb+1,l=1; l <= umin; i++,l++ )
123 for ( j = 0; j < l; j++ )
126 new_lb =
A->lb =
min(new_lb,new_n-1);
127 new_ub =
A->ub =
min(new_ub,new_n-1);
128 A->mat =
m_resize(
A->mat,new_lb+new_ub+1,new_n);
137 for (i=lb+umin, l=i+shift; i >= 0; i--,l--)
139 for (l=shift-1; l >= 0; l--)
142 else if (new_lb < lb) {
145 for (i=shift, l=0; i <= lb+umin; i++,l++)
147 for (i=lb+umin+1; i <= new_lb+new_ub; i++)
164 if (
A ==
B)
return B;
169 else if (
B->lb !=
A->lb ||
B->ub !=
A->ub ||
B->mat->n != n )
172 if (
A->mat ==
B->mat)
return B;
176 for ( i=0, j=n-lb; i <= lb; i++, j++ )
179 for ( i=lb+1, j=1; i <= lb+ub; i++, j++ )
209 for (j=0; j <
n; j++)
210 for (i=
min(n1,j+lb),l=lb+j-i; i >=
max(0,j-ub); i--,l++)
211 A->
me[i][j] = bmat[l][j];
228 if (ub < 0 || lb < 0)
239 for (j=0; j <= n1; j++)
240 for (i=
min(n1,j+lb),l=lb+j-i; i >=
max(0,j-ub); i--,l++)
241 bmat[l][j] = A->
me[i][j];
256 int i,
j, jj, l,
k, lb, ub, lub,
n, n1;
258 Real **in_v, **out_v;
269 in_situ = ( in == out );
283 out_v = out->mat->me;
284 for (i=0, l=lub, k=lb-i; i <= lub; i++,l--,k--) {
287 MEM_COPY(&(in_v[i][sh_in]),&(out_v[l][sh_out]),
288 (n-sh_in-sh_out)*
sizeof(
Real));
299 for (i=0, l=lub, k=lb-i; i < lb; i++,l--,k--) {
300 for (j=n1-k, jj=n1; j >= 0; j--,jj--) {
302 in_v[l][jj] = in_v[
i][
j];
310 for (i=0, l=lub; i < (lub+1)/2; i++,l--) {
312 for (j=l-lb, jj=0, p=
max(-lbi,0), pp =
max(l-ub,0); j <= n1;
314 in_v[l][pp] = in_v[
i][
p];
315 in_v[
i][jj] = in_v[l][
j];
317 for ( ; p <= n1-
max(lbi,0); p++,pp++)
318 in_v[l][pp] = in_v[i][p];
323 for (j=
max(i-lb,0), jj=0; jj <= n1-ub+
i; j++,jj++)
324 in_v[i][jj] = in_v[i][j];
330 for (i=0, l=lub; i < (lub+1)/2; i++,l--) {
332 for (j=n1-
max(lb-l,0), jj=n1-
max(-ubi,0), p=n1-lb+
i, pp=n1;
333 p >= 0; j--, jj--, pp--, p--) {
334 in_v[
i][jj] = in_v[l][
j];
335 in_v[l][pp] = in_v[
i][
p];
337 for ( ; jj >=
max(ubi,0); j--, jj--)
338 in_v[i][jj] = in_v[l][j];
343 for (j=n1-lb+i, jj=n1-
max(ub-i,0); j >= 0; j--, jj--)
344 in_v[i][jj] = in_v[i][j];
370 int i,
j,
k, l,
n, n1, lb, ub, lub, k_end, k_lub;
385 if ( pivot->
size != n )
390 for ( i=0; i <
n; i++ )
401 for ( k=0; k < n1; k++ )
403 k_end =
max(0,lb+k-n1);
404 k_lub =
min(k+lub,n1);
410 for ( i=lb; i >= k_end; i-- ) {
411 temp =
fabs(bA_v[i][k]);
413 { max1 = temp; i_max =
i; }
426 for ( i=lb, j=k; j <= k_lub; i++,j++ )
429 bA_v[
i][
j] = bA_v[i-shift][
j];
430 bA_v[i-shift][
j] = temp;
435 for ( i=lb-1; i >= k_end; i-- ) {
436 temp = bA_v[
i][
k] /= bA_v[lb][
k];
438 for ( j=k+1,l=i+1; j <= k_lub; l++,j++ )
439 bA_v[l][j] -= temp*bA_v[l+shift][j];
454 int i,
j,l,
n,n1,pi,lb,ub,jmin, maxj;
460 if ( bA->mat->n != b->
dim || bA->mat->n != pivot->
size)
477 for (j=0; j <
n; j++) {
480 maxj =
max(0,j+lb-n1);
481 for (i=jmin,l=lb-1; l >= maxj; i++,l--) {
482 if ( (pi = pivot->
pe[i]) < jmin)
483 pi = pivot->
pe[
i] = pivot->
pe[pi];
484 x->
ve[pi] -= bA_v[l][
j]*
c;
490 x->
ve[n1] /= bA_v[lb][n1];
491 for (i=n-2; i >= 0; i--) {
493 for (j=
min(n1,i+ub), l=lb+j-i; j >
i; j--,l--)
494 c -= bA_v[l][j]*x->
ve[j];
495 x->
ve[i] = c/bA_v[lb][i];
510 int i,
j,
k,
n,n1,lb,ki,jk,ji,lbkm,lbkp;
517 if (A->lb == 0)
return A;
524 for (k=0; k <
n; k++) {
530 for (j=
max(0,-lbkm), jk=lbkm+j; j <
k; j++, jk++) {
532 c -= Av[lb][
j]*cc*cc;
540 for (i=
min(n1,lbkp), ki=lbkp-i; i >
k; i--,ki++) {
542 for (j=
max(0,i-lb), ji=lb+j-i, jk=lbkm+j; j <
k;
544 c -= Av[lb][j]*Av[ji][j]*Av[jk][j];
545 Av[ki][
k] = c/Av[lb][
k];
558 int i,
j,l,
n,n1,lb,ilb;
564 if ( A->mat->
n != b->
dim )
576 for (i=1; i <
n; i++) {
579 for (j=
max(0,ilb), l=j-ilb; j <
i; j++,l++)
580 c -= Av[l][j]*x->
ve[j];
585 for (i=0; i <
n; i++)
589 for (i=n-2; i >= 0; i--) {
592 for (j=
min(n1,ilb), l=ilb-j; j >
i; j--,l++)
593 c -= Av[l][i]*x->
ve[j];
618 int start_idx, end_idx;
626 if (x->
dim != A->mat->
n)
628 if (!out || out->
dim != A->mat->
n)
639 end_idx = m + n-1 - ub;
640 for (i=0; i<
n; i++, start_idx--, end_idx--) {
641 j =
max(0, start_idx);
642 k =
max(0, -start_idx);
643 j_end =
min(m, end_idx);
646 for (; j < j_end; j++, k++)
647 sum += A_me[j][k] * *x_ve++;
VEC * bd_mv_mlt(BAND *A, VEC *x, VEC *out)
double max(double a, double b)
PERM * px_inv(PERM *px, PERM *out)
BAND * bdLUfactor(BAND *bA, PERM *pivot)
static Object ** v_resize(void *v)
BAND * mat2band(MAT *A, int lb, int ub, BAND *bA)
static philox4x32_key_t k
VEC * bdLDLsolve(BAND *A, VEC *b, VEC *x)
BAND * bd_get(int lb, int ub, int n)
BAND * bd_resize(BAND *A, int new_lb, int new_ub, int new_n)
VEC * px_vec(PERM *, VEC *, VEC *)
PERM * px_transp(PERM *px, u_int i, u_int j)
VEC * bdLUsolve(BAND *bA, PERM *pivot, VEC *b, VEC *x)
int const size_t const size_t n
#define mem_bytes(type, old_size, new_size)
BAND * bdLDLfactor(BAND *A)
void __zero__(Real *dp, int len)
MAT * band2mat(BAND *bA, MAT *A)
static Object ** m_resize(void *v)
static Object ** m_zero(void *v)
#define error(err_num, fn_name)
#define mem_numvar(type, num)
BAND * bd_transp(BAND *in, BAND *out)
BAND * bd_copy(BAND *A, BAND *B)