1 #include <../../nrnconf.h>
58 if (lb < 0 || ub < 0 ||
n <= 0)
68 lb =
A->lb =
min(
n-1,lb);
69 ub =
A->ub =
min(
n-1,ub);
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++)
211 A->me[
i][
j] = bmat[l][
j];
228 if (ub < 0 || lb < 0)
239 for (
j=0;
j <= n1;
j++)
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-- ) {
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++)
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++;
BAND * bd_resize(BAND *A, int new_lb, int new_ub, int new_n)
VEC * bdLUsolve(BAND *bA, PERM *pivot, VEC *b, VEC *x)
VEC * bd_mv_mlt(BAND *A, VEC *x, VEC *out)
BAND * mat2band(MAT *A, int lb, int ub, BAND *bA)
BAND * bd_transp(BAND *in, BAND *out)
VEC * bdLDLsolve(BAND *A, VEC *b, VEC *x)
MAT * band2mat(BAND *bA, MAT *A)
BAND * bd_get(int lb, int ub, int n)
BAND * bdLDLfactor(BAND *A)
BAND * bdLUfactor(BAND *bA, PERM *pivot)
BAND * bd_copy(BAND *A, BAND *B)
#define error(err_num, fn_name)
static Object ** v_resize(void *v)
void __zero__(Real *dp, int len)
static Object ** m_zero(void *v)
static Object ** m_resize(void *v)
PERM * px_transp(PERM *px, u_int i, u_int j)
VEC * px_vec(PERM *, VEC *, VEC *)
PERM * px_inv(PERM *px, PERM *out)
#define mem_numvar(type, num)
#define mem_bytes(type, old_size, new_size)
int const size_t const size_t n
static philox4x32_key_t k