Mercurial > hg > octave-nkf
comparison liboctave/CSparse.cc @ 7482:29980c6b8604
don't check f77_exception_encountered
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 14 Feb 2008 21:57:50 -0500 |
parents | 402168152bb9 |
children | 8c32f95c2639 |
comparison
equal
deleted
inserted
replaced
7481:78f3811155f7 | 7482:29980c6b8604 |
---|---|
3747 Complex *result = retval.fortran_vec (); | 3747 Complex *result = retval.fortran_vec (); |
3748 | 3748 |
3749 F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, | 3749 F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, |
3750 b.rows(), err)); | 3750 b.rows(), err)); |
3751 | 3751 |
3752 if (f77_exception_encountered) | 3752 if (err != 0) |
3753 (*current_liboctave_error_handler) | |
3754 ("unrecoverable error in zptsv"); | |
3755 else if (err != 0) | |
3756 { | 3753 { |
3757 err = 0; | 3754 err = 0; |
3758 mattype.mark_as_unsymmetric (); | 3755 mattype.mark_as_unsymmetric (); |
3759 typ = MatrixType::Tridiagonal; | 3756 typ = MatrixType::Tridiagonal; |
3760 } | 3757 } |
3807 Complex *result = retval.fortran_vec (); | 3804 Complex *result = retval.fortran_vec (); |
3808 | 3805 |
3809 F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, | 3806 F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, |
3810 b.rows(), err)); | 3807 b.rows(), err)); |
3811 | 3808 |
3812 if (f77_exception_encountered) | 3809 if (err != 0) |
3813 (*current_liboctave_error_handler) | |
3814 ("unrecoverable error in zgtsv"); | |
3815 else if (err != 0) | |
3816 { | 3810 { |
3817 rcond = 0.; | 3811 rcond = 0.; |
3818 err = -2; | 3812 err = -2; |
3819 | 3813 |
3820 if (sing_handler) | 3814 if (sing_handler) |
3908 } | 3902 } |
3909 } | 3903 } |
3910 | 3904 |
3911 F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); | 3905 F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); |
3912 | 3906 |
3913 if (f77_exception_encountered) | 3907 if (err != 0) |
3914 (*current_liboctave_error_handler) | 3908 { |
3915 ("unrecoverable error in zgttrf"); | 3909 err = -2; |
3916 else | 3910 rcond = 0.0; |
3917 { | 3911 |
3918 if (err != 0) | 3912 if (sing_handler) |
3919 { | 3913 { |
3920 err = -2; | 3914 sing_handler (rcond); |
3921 rcond = 0.0; | 3915 mattype.mark_as_rectangular (); |
3922 | 3916 } |
3923 if (sing_handler) | 3917 else |
3924 { | 3918 (*current_liboctave_error_handler) |
3925 sing_handler (rcond); | 3919 ("matrix singular to machine precision"); |
3926 mattype.mark_as_rectangular (); | 3920 |
3927 } | 3921 } |
3928 else | 3922 else |
3929 (*current_liboctave_error_handler) | 3923 { |
3930 ("matrix singular to machine precision"); | 3924 char job = 'N'; |
3931 | 3925 volatile octave_idx_type x_nz = b.nnz (); |
3932 } | 3926 octave_idx_type b_nc = b.cols (); |
3933 else | 3927 retval = SparseComplexMatrix (nr, b_nc, x_nz); |
3934 { | 3928 retval.xcidx(0) = 0; |
3935 char job = 'N'; | 3929 volatile octave_idx_type ii = 0; |
3936 volatile octave_idx_type x_nz = b.nnz (); | 3930 rcond = 1.0; |
3937 octave_idx_type b_nc = b.cols (); | 3931 |
3938 retval = SparseComplexMatrix (nr, b_nc, x_nz); | 3932 OCTAVE_LOCAL_BUFFER (Complex, work, nr); |
3939 retval.xcidx(0) = 0; | 3933 |
3940 volatile octave_idx_type ii = 0; | 3934 for (volatile octave_idx_type j = 0; j < b_nc; j++) |
3941 rcond = 1.0; | 3935 { |
3942 | 3936 for (octave_idx_type i = 0; i < nr; i++) |
3943 OCTAVE_LOCAL_BUFFER (Complex, work, nr); | 3937 work[i] = 0.; |
3944 | 3938 for (octave_idx_type i = b.cidx(j); i < b.cidx(j+1); i++) |
3945 for (volatile octave_idx_type j = 0; j < b_nc; j++) | 3939 work[b.ridx(i)] = b.data(i); |
3946 { | 3940 |
3947 for (octave_idx_type i = 0; i < nr; i++) | 3941 F77_XFCN (zgttrs, ZGTTRS, |
3948 work[i] = 0.; | 3942 (F77_CONST_CHAR_ARG2 (&job, 1), |
3949 for (octave_idx_type i = b.cidx(j); i < b.cidx(j+1); i++) | 3943 nr, 1, DL, D, DU, DU2, pipvt, |
3950 work[b.ridx(i)] = b.data(i); | 3944 work, b.rows (), err |
3951 | 3945 F77_CHAR_ARG_LEN (1))); |
3952 F77_XFCN (zgttrs, ZGTTRS, | 3946 |
3953 (F77_CONST_CHAR_ARG2 (&job, 1), | 3947 // Count non-zeros in work vector and adjust |
3954 nr, 1, DL, D, DU, DU2, pipvt, | 3948 // space in retval if needed |
3955 work, b.rows (), err | 3949 octave_idx_type new_nnz = 0; |
3956 F77_CHAR_ARG_LEN (1))); | 3950 for (octave_idx_type i = 0; i < nr; i++) |
3957 | 3951 if (work[i] != 0.) |
3958 if (f77_exception_encountered) | 3952 new_nnz++; |
3959 { | 3953 |
3960 (*current_liboctave_error_handler) | 3954 if (ii + new_nnz > x_nz) |
3961 ("unrecoverable error in zgttrs"); | 3955 { |
3962 break; | 3956 // Resize the sparse matrix |
3963 } | 3957 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; |
3964 | 3958 retval.change_capacity (sz); |
3965 // Count non-zeros in work vector and adjust | 3959 x_nz = sz; |
3966 // space in retval if needed | 3960 } |
3967 octave_idx_type new_nnz = 0; | 3961 |
3968 for (octave_idx_type i = 0; i < nr; i++) | 3962 for (octave_idx_type i = 0; i < nr; i++) |
3969 if (work[i] != 0.) | 3963 if (work[i] != 0.) |
3970 new_nnz++; | 3964 { |
3971 | 3965 retval.xridx(ii) = i; |
3972 if (ii + new_nnz > x_nz) | 3966 retval.xdata(ii++) = work[i]; |
3973 { | 3967 } |
3974 // Resize the sparse matrix | 3968 retval.xcidx(j+1) = ii; |
3975 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | 3969 } |
3976 retval.change_capacity (sz); | 3970 |
3977 x_nz = sz; | 3971 retval.maybe_compress (); |
3978 } | |
3979 | |
3980 for (octave_idx_type i = 0; i < nr; i++) | |
3981 if (work[i] != 0.) | |
3982 { | |
3983 retval.xridx(ii) = i; | |
3984 retval.xdata(ii++) = work[i]; | |
3985 } | |
3986 retval.xcidx(j+1) = ii; | |
3987 } | |
3988 | |
3989 retval.maybe_compress (); | |
3990 } | |
3991 } | 3972 } |
3992 } | 3973 } |
3993 else if (typ != MatrixType::Tridiagonal_Hermitian) | 3974 else if (typ != MatrixType::Tridiagonal_Hermitian) |
3994 (*current_liboctave_error_handler) ("incorrect matrix type"); | 3975 (*current_liboctave_error_handler) ("incorrect matrix type"); |
3995 } | 3976 } |
4067 Complex *result = retval.fortran_vec (); | 4048 Complex *result = retval.fortran_vec (); |
4068 | 4049 |
4069 F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, | 4050 F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result, |
4070 b_nr, err)); | 4051 b_nr, err)); |
4071 | 4052 |
4072 if (f77_exception_encountered) | 4053 if (err != 0) |
4073 { | |
4074 (*current_liboctave_error_handler) | |
4075 ("unrecoverable error in zptsv"); | |
4076 err = -1; | |
4077 } | |
4078 else if (err != 0) | |
4079 { | 4054 { |
4080 err = 0; | 4055 err = 0; |
4081 mattype.mark_as_unsymmetric (); | 4056 mattype.mark_as_unsymmetric (); |
4082 typ = MatrixType::Tridiagonal; | 4057 typ = MatrixType::Tridiagonal; |
4083 } | 4058 } |
4131 Complex *result = retval.fortran_vec (); | 4106 Complex *result = retval.fortran_vec (); |
4132 | 4107 |
4133 F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, | 4108 F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result, |
4134 b_nr, err)); | 4109 b_nr, err)); |
4135 | 4110 |
4136 if (f77_exception_encountered) | 4111 if (err != 0) |
4137 { | |
4138 (*current_liboctave_error_handler) | |
4139 ("unrecoverable error in zgtsv"); | |
4140 err = -1; | |
4141 } | |
4142 else if (err != 0) | |
4143 { | 4112 { |
4144 rcond = 0.; | 4113 rcond = 0.; |
4145 err = -2; | 4114 err = -2; |
4146 | 4115 |
4147 if (sing_handler) | 4116 if (sing_handler) |
4233 } | 4202 } |
4234 } | 4203 } |
4235 | 4204 |
4236 F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); | 4205 F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err)); |
4237 | 4206 |
4238 if (f77_exception_encountered) | 4207 if (err != 0) |
4239 (*current_liboctave_error_handler) | 4208 { |
4240 ("unrecoverable error in zgttrf"); | 4209 rcond = 0.0; |
4241 else | 4210 err = -2; |
4242 { | 4211 |
4243 if (err != 0) | 4212 if (sing_handler) |
4244 { | 4213 { |
4245 rcond = 0.0; | 4214 sing_handler (rcond); |
4246 err = -2; | 4215 mattype.mark_as_rectangular (); |
4247 | 4216 } |
4248 if (sing_handler) | 4217 else |
4249 { | 4218 (*current_liboctave_error_handler) |
4250 sing_handler (rcond); | 4219 ("matrix singular to machine precision"); |
4251 mattype.mark_as_rectangular (); | 4220 } |
4252 } | 4221 else |
4253 else | 4222 { |
4254 (*current_liboctave_error_handler) | 4223 rcond = 1.; |
4255 ("matrix singular to machine precision"); | 4224 char job = 'N'; |
4256 } | 4225 octave_idx_type b_nr = b.rows (); |
4257 else | 4226 octave_idx_type b_nc = b.cols (); |
4258 { | 4227 OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); |
4259 rcond = 1.; | 4228 |
4260 char job = 'N'; | 4229 // Take a first guess that the number of non-zero terms |
4261 octave_idx_type b_nr = b.rows (); | 4230 // will be as many as in b |
4262 octave_idx_type b_nc = b.cols (); | 4231 volatile octave_idx_type x_nz = b.nnz (); |
4263 OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); | 4232 volatile octave_idx_type ii = 0; |
4264 | 4233 retval = SparseComplexMatrix (b_nr, b_nc, x_nz); |
4265 // Take a first guess that the number of non-zero terms | 4234 |
4266 // will be as many as in b | 4235 retval.xcidx(0) = 0; |
4267 volatile octave_idx_type x_nz = b.nnz (); | 4236 for (volatile octave_idx_type j = 0; j < b_nc; j++) |
4268 volatile octave_idx_type ii = 0; | 4237 { |
4269 retval = SparseComplexMatrix (b_nr, b_nc, x_nz); | 4238 |
4270 | 4239 for (octave_idx_type i = 0; i < b_nr; i++) |
4271 retval.xcidx(0) = 0; | 4240 Bx[i] = b (i,j); |
4272 for (volatile octave_idx_type j = 0; j < b_nc; j++) | 4241 |
4273 { | 4242 F77_XFCN (zgttrs, ZGTTRS, |
4274 | 4243 (F77_CONST_CHAR_ARG2 (&job, 1), |
4275 for (octave_idx_type i = 0; i < b_nr; i++) | 4244 nr, 1, DL, D, DU, DU2, pipvt, |
4276 Bx[i] = b (i,j); | 4245 Bx, b_nr, err |
4277 | 4246 F77_CHAR_ARG_LEN (1))); |
4278 F77_XFCN (zgttrs, ZGTTRS, | 4247 |
4279 (F77_CONST_CHAR_ARG2 (&job, 1), | 4248 if (err != 0) |
4280 nr, 1, DL, D, DU, DU2, pipvt, | 4249 { |
4281 Bx, b_nr, err | 4250 (*current_liboctave_error_handler) |
4282 F77_CHAR_ARG_LEN (1))); | 4251 ("SparseComplexMatrix::solve solve failed"); |
4283 | 4252 |
4284 if (f77_exception_encountered) | 4253 err = -1; |
4285 { | 4254 break; |
4286 (*current_liboctave_error_handler) | 4255 } |
4287 ("unrecoverable error in zgttrs"); | 4256 |
4288 break; | 4257 // Count non-zeros in work vector and adjust |
4289 } | 4258 // space in retval if needed |
4290 | 4259 octave_idx_type new_nnz = 0; |
4291 if (err != 0) | 4260 for (octave_idx_type i = 0; i < nr; i++) |
4292 { | 4261 if (Bx[i] != 0.) |
4293 (*current_liboctave_error_handler) | 4262 new_nnz++; |
4294 ("SparseComplexMatrix::solve solve failed"); | 4263 |
4295 | 4264 if (ii + new_nnz > x_nz) |
4296 err = -1; | 4265 { |
4297 break; | 4266 // Resize the sparse matrix |
4298 } | 4267 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; |
4299 | 4268 retval.change_capacity (sz); |
4300 // Count non-zeros in work vector and adjust | 4269 x_nz = sz; |
4301 // space in retval if needed | 4270 } |
4302 octave_idx_type new_nnz = 0; | 4271 |
4303 for (octave_idx_type i = 0; i < nr; i++) | 4272 for (octave_idx_type i = 0; i < nr; i++) |
4304 if (Bx[i] != 0.) | 4273 if (Bx[i] != 0.) |
4305 new_nnz++; | 4274 { |
4306 | 4275 retval.xridx(ii) = i; |
4307 if (ii + new_nnz > x_nz) | 4276 retval.xdata(ii++) = Bx[i]; |
4308 { | 4277 } |
4309 // Resize the sparse matrix | 4278 |
4310 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | 4279 retval.xcidx(j+1) = ii; |
4311 retval.change_capacity (sz); | 4280 } |
4312 x_nz = sz; | 4281 |
4313 } | 4282 retval.maybe_compress (); |
4314 | |
4315 for (octave_idx_type i = 0; i < nr; i++) | |
4316 if (Bx[i] != 0.) | |
4317 { | |
4318 retval.xridx(ii) = i; | |
4319 retval.xdata(ii++) = Bx[i]; | |
4320 } | |
4321 | |
4322 retval.xcidx(j+1) = ii; | |
4323 } | |
4324 | |
4325 retval.maybe_compress (); | |
4326 } | |
4327 } | 4283 } |
4328 } | 4284 } |
4329 else if (typ != MatrixType::Tridiagonal_Hermitian) | 4285 else if (typ != MatrixType::Tridiagonal_Hermitian) |
4330 (*current_liboctave_error_handler) ("incorrect matrix type"); | 4286 (*current_liboctave_error_handler) ("incorrect matrix type"); |
4331 } | 4287 } |
4388 char job = 'L'; | 4344 char job = 'L'; |
4389 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), | 4345 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), |
4390 nr, n_lower, tmp_data, ldm, err | 4346 nr, n_lower, tmp_data, ldm, err |
4391 F77_CHAR_ARG_LEN (1))); | 4347 F77_CHAR_ARG_LEN (1))); |
4392 | 4348 |
4393 if (f77_exception_encountered) | 4349 if (err != 0) |
4394 (*current_liboctave_error_handler) | 4350 { |
4395 ("unrecoverable error in zpbtrf"); | 4351 rcond = 0.0; |
4396 else | 4352 // Matrix is not positive definite!! Fall through to |
4397 { | 4353 // unsymmetric banded solver. |
4398 if (err != 0) | 4354 mattype.mark_as_unsymmetric (); |
4399 { | 4355 typ = MatrixType::Banded; |
4400 rcond = 0.0; | 4356 err = 0; |
4401 // Matrix is not positive definite!! Fall through to | 4357 } |
4402 // unsymmetric banded solver. | 4358 else |
4403 mattype.mark_as_unsymmetric (); | 4359 { |
4404 typ = MatrixType::Banded; | 4360 if (calc_cond) |
4405 err = 0; | 4361 { |
4406 } | 4362 Array<Complex> z (2 * nr); |
4407 else | 4363 Complex *pz = z.fortran_vec (); |
4408 { | 4364 Array<double> iz (nr); |
4409 if (calc_cond) | 4365 double *piz = iz.fortran_vec (); |
4410 { | 4366 |
4411 Array<Complex> z (2 * nr); | 4367 F77_XFCN (zpbcon, ZPBCON, |
4412 Complex *pz = z.fortran_vec (); | 4368 (F77_CONST_CHAR_ARG2 (&job, 1), |
4413 Array<double> iz (nr); | 4369 nr, n_lower, tmp_data, ldm, |
4414 double *piz = iz.fortran_vec (); | 4370 anorm, rcond, pz, piz, err |
4415 | 4371 F77_CHAR_ARG_LEN (1))); |
4416 F77_XFCN (zpbcon, ZPBCON, | 4372 |
4417 (F77_CONST_CHAR_ARG2 (&job, 1), | 4373 if (err != 0) |
4418 nr, n_lower, tmp_data, ldm, | 4374 err = -2; |
4419 anorm, rcond, pz, piz, err | 4375 |
4420 F77_CHAR_ARG_LEN (1))); | 4376 volatile double rcond_plus_one = rcond + 1.0; |
4421 | 4377 |
4422 if (f77_exception_encountered) | 4378 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
4423 (*current_liboctave_error_handler) | 4379 { |
4424 ("unrecoverable error in zpbcon"); | 4380 err = -2; |
4425 | 4381 |
4426 if (err != 0) | 4382 if (sing_handler) |
4427 err = -2; | 4383 { |
4428 | 4384 sing_handler (rcond); |
4429 volatile double rcond_plus_one = rcond + 1.0; | 4385 mattype.mark_as_rectangular (); |
4430 | 4386 } |
4431 if (rcond_plus_one == 1.0 || xisnan (rcond)) | 4387 else |
4432 { | |
4433 err = -2; | |
4434 | |
4435 if (sing_handler) | |
4436 { | |
4437 sing_handler (rcond); | |
4438 mattype.mark_as_rectangular (); | |
4439 } | |
4440 else | |
4441 (*current_liboctave_error_handler) | |
4442 ("matrix singular to machine precision, rcond = %g", | |
4443 rcond); | |
4444 } | |
4445 } | |
4446 else | |
4447 rcond = 1.0; | |
4448 | |
4449 if (err == 0) | |
4450 { | |
4451 retval = ComplexMatrix (b); | |
4452 Complex *result = retval.fortran_vec (); | |
4453 | |
4454 octave_idx_type b_nc = b.cols (); | |
4455 | |
4456 F77_XFCN (zpbtrs, ZPBTRS, | |
4457 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4458 nr, n_lower, b_nc, tmp_data, | |
4459 ldm, result, b.rows(), err | |
4460 F77_CHAR_ARG_LEN (1))); | |
4461 | |
4462 if (f77_exception_encountered) | |
4463 (*current_liboctave_error_handler) | 4388 (*current_liboctave_error_handler) |
4464 ("unrecoverable error in zpbtrs"); | 4389 ("matrix singular to machine precision, rcond = %g", |
4465 | 4390 rcond); |
4466 if (err != 0) | 4391 } |
4467 { | 4392 } |
4468 (*current_liboctave_error_handler) | 4393 else |
4469 ("SparseMatrix::solve solve failed"); | 4394 rcond = 1.0; |
4470 err = -1; | 4395 |
4471 } | 4396 if (err == 0) |
4397 { | |
4398 retval = ComplexMatrix (b); | |
4399 Complex *result = retval.fortran_vec (); | |
4400 | |
4401 octave_idx_type b_nc = b.cols (); | |
4402 | |
4403 F77_XFCN (zpbtrs, ZPBTRS, | |
4404 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4405 nr, n_lower, b_nc, tmp_data, | |
4406 ldm, result, b.rows(), err | |
4407 F77_CHAR_ARG_LEN (1))); | |
4408 | |
4409 if (err != 0) | |
4410 { | |
4411 (*current_liboctave_error_handler) | |
4412 ("SparseMatrix::solve solve failed"); | |
4413 err = -1; | |
4472 } | 4414 } |
4473 } | 4415 } |
4474 } | 4416 } |
4475 } | 4417 } |
4476 | 4418 |
4515 octave_idx_type *pipvt = ipvt.fortran_vec (); | 4457 octave_idx_type *pipvt = ipvt.fortran_vec (); |
4516 | 4458 |
4517 F77_XFCN (zgbtrf, ZGBTRF, (nr, nc, n_lower, n_upper, tmp_data, | 4459 F77_XFCN (zgbtrf, ZGBTRF, (nr, nc, n_lower, n_upper, tmp_data, |
4518 ldm, pipvt, err)); | 4460 ldm, pipvt, err)); |
4519 | 4461 |
4520 if (f77_exception_encountered) | 4462 // Throw-away extra info LAPACK gives so as to not |
4521 (*current_liboctave_error_handler) | 4463 // change output. |
4522 ("unrecoverable error in zgbtrf"); | 4464 if (err != 0) |
4523 else | 4465 { |
4524 { | 4466 rcond = 0.0; |
4525 // Throw-away extra info LAPACK gives so as to not | 4467 err = -2; |
4526 // change output. | 4468 |
4527 if (err != 0) | 4469 if (sing_handler) |
4528 { | 4470 { |
4529 rcond = 0.0; | 4471 sing_handler (rcond); |
4530 err = -2; | 4472 mattype.mark_as_rectangular (); |
4531 | 4473 } |
4532 if (sing_handler) | 4474 else |
4533 { | 4475 (*current_liboctave_error_handler) |
4534 sing_handler (rcond); | 4476 ("matrix singular to machine precision"); |
4535 mattype.mark_as_rectangular (); | 4477 } |
4536 } | 4478 else |
4537 else | 4479 { |
4538 (*current_liboctave_error_handler) | 4480 if (calc_cond) |
4539 ("matrix singular to machine precision"); | 4481 { |
4540 } | 4482 char job = '1'; |
4541 else | 4483 Array<Complex> z (2 * nr); |
4542 { | 4484 Complex *pz = z.fortran_vec (); |
4543 if (calc_cond) | 4485 Array<double> iz (nr); |
4544 { | 4486 double *piz = iz.fortran_vec (); |
4545 char job = '1'; | 4487 |
4546 Array<Complex> z (2 * nr); | 4488 F77_XFCN (zgbcon, ZGBCON, |
4547 Complex *pz = z.fortran_vec (); | 4489 (F77_CONST_CHAR_ARG2 (&job, 1), |
4548 Array<double> iz (nr); | 4490 nc, n_lower, n_upper, tmp_data, ldm, pipvt, |
4549 double *piz = iz.fortran_vec (); | 4491 anorm, rcond, pz, piz, err |
4550 | 4492 F77_CHAR_ARG_LEN (1))); |
4551 F77_XFCN (zgbcon, ZGBCON, | 4493 |
4552 (F77_CONST_CHAR_ARG2 (&job, 1), | 4494 if (err != 0) |
4553 nc, n_lower, n_upper, tmp_data, ldm, pipvt, | 4495 err = -2; |
4554 anorm, rcond, pz, piz, err | 4496 |
4555 F77_CHAR_ARG_LEN (1))); | 4497 volatile double rcond_plus_one = rcond + 1.0; |
4556 | 4498 |
4557 if (f77_exception_encountered) | 4499 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
4558 (*current_liboctave_error_handler) | 4500 { |
4559 ("unrecoverable error in zgbcon"); | 4501 err = -2; |
4560 | 4502 |
4561 if (err != 0) | 4503 if (sing_handler) |
4562 err = -2; | 4504 { |
4563 | 4505 sing_handler (rcond); |
4564 volatile double rcond_plus_one = rcond + 1.0; | 4506 mattype.mark_as_rectangular (); |
4565 | 4507 } |
4566 if (rcond_plus_one == 1.0 || xisnan (rcond)) | 4508 else |
4567 { | |
4568 err = -2; | |
4569 | |
4570 if (sing_handler) | |
4571 { | |
4572 sing_handler (rcond); | |
4573 mattype.mark_as_rectangular (); | |
4574 } | |
4575 else | |
4576 (*current_liboctave_error_handler) | |
4577 ("matrix singular to machine precision, rcond = %g", | |
4578 rcond); | |
4579 } | |
4580 } | |
4581 else | |
4582 rcond = 1.; | |
4583 | |
4584 if (err == 0) | |
4585 { | |
4586 retval = ComplexMatrix (b); | |
4587 Complex *result = retval.fortran_vec (); | |
4588 | |
4589 octave_idx_type b_nc = b.cols (); | |
4590 | |
4591 char job = 'N'; | |
4592 F77_XFCN (zgbtrs, ZGBTRS, | |
4593 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4594 nr, n_lower, n_upper, b_nc, tmp_data, | |
4595 ldm, pipvt, result, b.rows(), err | |
4596 F77_CHAR_ARG_LEN (1))); | |
4597 | |
4598 if (f77_exception_encountered) | |
4599 (*current_liboctave_error_handler) | 4509 (*current_liboctave_error_handler) |
4600 ("unrecoverable error in zgbtrs"); | 4510 ("matrix singular to machine precision, rcond = %g", |
4601 } | 4511 rcond); |
4512 } | |
4513 } | |
4514 else | |
4515 rcond = 1.; | |
4516 | |
4517 if (err == 0) | |
4518 { | |
4519 retval = ComplexMatrix (b); | |
4520 Complex *result = retval.fortran_vec (); | |
4521 | |
4522 octave_idx_type b_nc = b.cols (); | |
4523 | |
4524 char job = 'N'; | |
4525 F77_XFCN (zgbtrs, ZGBTRS, | |
4526 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4527 nr, n_lower, n_upper, b_nc, tmp_data, | |
4528 ldm, pipvt, result, b.rows(), err | |
4529 F77_CHAR_ARG_LEN (1))); | |
4602 } | 4530 } |
4603 } | 4531 } |
4604 } | 4532 } |
4605 else if (typ != MatrixType::Banded_Hermitian) | 4533 else if (typ != MatrixType::Banded_Hermitian) |
4606 (*current_liboctave_error_handler) ("incorrect matrix type"); | 4534 (*current_liboctave_error_handler) ("incorrect matrix type"); |
4665 char job = 'L'; | 4593 char job = 'L'; |
4666 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), | 4594 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), |
4667 nr, n_lower, tmp_data, ldm, err | 4595 nr, n_lower, tmp_data, ldm, err |
4668 F77_CHAR_ARG_LEN (1))); | 4596 F77_CHAR_ARG_LEN (1))); |
4669 | 4597 |
4670 if (f77_exception_encountered) | 4598 if (err != 0) |
4671 (*current_liboctave_error_handler) | 4599 { |
4672 ("unrecoverable error in zpbtrf"); | 4600 rcond = 0.0; |
4673 else | 4601 mattype.mark_as_unsymmetric (); |
4674 { | 4602 typ = MatrixType::Banded; |
4675 if (err != 0) | 4603 err = 0; |
4676 { | 4604 } |
4677 rcond = 0.0; | 4605 else |
4678 mattype.mark_as_unsymmetric (); | 4606 { |
4679 typ = MatrixType::Banded; | 4607 if (calc_cond) |
4680 err = 0; | 4608 { |
4681 } | 4609 Array<Complex> z (2 * nr); |
4682 else | 4610 Complex *pz = z.fortran_vec (); |
4683 { | 4611 Array<double> iz (nr); |
4684 if (calc_cond) | 4612 double *piz = iz.fortran_vec (); |
4685 { | 4613 |
4686 Array<Complex> z (2 * nr); | 4614 F77_XFCN (zpbcon, ZPBCON, |
4687 Complex *pz = z.fortran_vec (); | 4615 (F77_CONST_CHAR_ARG2 (&job, 1), |
4688 Array<double> iz (nr); | 4616 nr, n_lower, tmp_data, ldm, |
4689 double *piz = iz.fortran_vec (); | 4617 anorm, rcond, pz, piz, err |
4690 | 4618 F77_CHAR_ARG_LEN (1))); |
4691 F77_XFCN (zpbcon, ZPBCON, | 4619 |
4692 (F77_CONST_CHAR_ARG2 (&job, 1), | 4620 if (err != 0) |
4693 nr, n_lower, tmp_data, ldm, | 4621 err = -2; |
4694 anorm, rcond, pz, piz, err | 4622 |
4695 F77_CHAR_ARG_LEN (1))); | 4623 volatile double rcond_plus_one = rcond + 1.0; |
4696 | 4624 |
4697 if (f77_exception_encountered) | 4625 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
4698 (*current_liboctave_error_handler) | 4626 { |
4699 ("unrecoverable error in zpbcon"); | 4627 err = -2; |
4700 | 4628 |
4701 if (err != 0) | 4629 if (sing_handler) |
4702 err = -2; | 4630 { |
4703 | 4631 sing_handler (rcond); |
4704 volatile double rcond_plus_one = rcond + 1.0; | 4632 mattype.mark_as_rectangular (); |
4705 | 4633 } |
4706 if (rcond_plus_one == 1.0 || xisnan (rcond)) | 4634 else |
4707 { | 4635 (*current_liboctave_error_handler) |
4708 err = -2; | 4636 ("matrix singular to machine precision, rcond = %g", |
4709 | 4637 rcond); |
4710 if (sing_handler) | 4638 } |
4639 } | |
4640 else | |
4641 rcond = 1.0; | |
4642 | |
4643 if (err == 0) | |
4644 { | |
4645 octave_idx_type b_nr = b.rows (); | |
4646 octave_idx_type b_nc = b.cols (); | |
4647 OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); | |
4648 | |
4649 // Take a first guess that the number of non-zero terms | |
4650 // will be as many as in b | |
4651 volatile octave_idx_type x_nz = b.nnz (); | |
4652 volatile octave_idx_type ii = 0; | |
4653 retval = SparseComplexMatrix (b_nr, b_nc, x_nz); | |
4654 | |
4655 retval.xcidx(0) = 0; | |
4656 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
4657 { | |
4658 for (octave_idx_type i = 0; i < b_nr; i++) | |
4659 Bx[i] = b.elem (i, j); | |
4660 | |
4661 F77_XFCN (zpbtrs, ZPBTRS, | |
4662 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4663 nr, n_lower, 1, tmp_data, | |
4664 ldm, Bx, b_nr, err | |
4665 F77_CHAR_ARG_LEN (1))); | |
4666 | |
4667 if (err != 0) | |
4668 { | |
4669 (*current_liboctave_error_handler) | |
4670 ("SparseComplexMatrix::solve solve failed"); | |
4671 err = -1; | |
4672 break; | |
4673 } | |
4674 | |
4675 for (octave_idx_type i = 0; i < b_nr; i++) | |
4676 { | |
4677 Complex tmp = Bx[i]; | |
4678 if (tmp != 0.0) | |
4711 { | 4679 { |
4712 sing_handler (rcond); | 4680 if (ii == x_nz) |
4713 mattype.mark_as_rectangular (); | 4681 { |
4682 // Resize the sparse matrix | |
4683 octave_idx_type sz = x_nz * | |
4684 (b_nc - j) / b_nc; | |
4685 sz = (sz > 10 ? sz : 10) + x_nz; | |
4686 retval.change_capacity (sz); | |
4687 x_nz = sz; | |
4688 } | |
4689 retval.xdata(ii) = tmp; | |
4690 retval.xridx(ii++) = i; | |
4714 } | 4691 } |
4715 else | |
4716 (*current_liboctave_error_handler) | |
4717 ("matrix singular to machine precision, rcond = %g", | |
4718 rcond); | |
4719 } | |
4720 } | |
4721 else | |
4722 rcond = 1.0; | |
4723 | |
4724 if (err == 0) | |
4725 { | |
4726 octave_idx_type b_nr = b.rows (); | |
4727 octave_idx_type b_nc = b.cols (); | |
4728 OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); | |
4729 | |
4730 // Take a first guess that the number of non-zero terms | |
4731 // will be as many as in b | |
4732 volatile octave_idx_type x_nz = b.nnz (); | |
4733 volatile octave_idx_type ii = 0; | |
4734 retval = SparseComplexMatrix (b_nr, b_nc, x_nz); | |
4735 | |
4736 retval.xcidx(0) = 0; | |
4737 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
4738 { | |
4739 for (octave_idx_type i = 0; i < b_nr; i++) | |
4740 Bx[i] = b.elem (i, j); | |
4741 | |
4742 F77_XFCN (zpbtrs, ZPBTRS, | |
4743 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4744 nr, n_lower, 1, tmp_data, | |
4745 ldm, Bx, b_nr, err | |
4746 F77_CHAR_ARG_LEN (1))); | |
4747 | |
4748 if (f77_exception_encountered) | |
4749 { | |
4750 (*current_liboctave_error_handler) | |
4751 ("unrecoverable error in dpbtrs"); | |
4752 err = -1; | |
4753 break; | |
4754 } | |
4755 | |
4756 if (err != 0) | |
4757 { | |
4758 (*current_liboctave_error_handler) | |
4759 ("SparseComplexMatrix::solve solve failed"); | |
4760 err = -1; | |
4761 break; | |
4762 } | |
4763 | |
4764 for (octave_idx_type i = 0; i < b_nr; i++) | |
4765 { | |
4766 Complex tmp = Bx[i]; | |
4767 if (tmp != 0.0) | |
4768 { | |
4769 if (ii == x_nz) | |
4770 { | |
4771 // Resize the sparse matrix | |
4772 octave_idx_type sz = x_nz * | |
4773 (b_nc - j) / b_nc; | |
4774 sz = (sz > 10 ? sz : 10) + x_nz; | |
4775 retval.change_capacity (sz); | |
4776 x_nz = sz; | |
4777 } | |
4778 retval.xdata(ii) = tmp; | |
4779 retval.xridx(ii++) = i; | |
4780 } | |
4781 } | |
4782 retval.xcidx(j+1) = ii; | |
4783 } | 4692 } |
4784 | 4693 retval.xcidx(j+1) = ii; |
4785 retval.maybe_compress (); | 4694 } |
4786 } | 4695 |
4696 retval.maybe_compress (); | |
4787 } | 4697 } |
4788 } | 4698 } |
4789 } | 4699 } |
4790 | 4700 |
4791 if (typ == MatrixType::Banded) | 4701 if (typ == MatrixType::Banded) |
4829 octave_idx_type *pipvt = ipvt.fortran_vec (); | 4739 octave_idx_type *pipvt = ipvt.fortran_vec (); |
4830 | 4740 |
4831 F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, | 4741 F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, |
4832 ldm, pipvt, err)); | 4742 ldm, pipvt, err)); |
4833 | 4743 |
4834 if (f77_exception_encountered) | 4744 if (err != 0) |
4835 (*current_liboctave_error_handler) | 4745 { |
4836 ("unrecoverable error in zgbtrf"); | 4746 rcond = 0.0; |
4837 else | 4747 err = -2; |
4838 { | 4748 |
4839 if (err != 0) | 4749 if (sing_handler) |
4840 { | 4750 { |
4841 rcond = 0.0; | 4751 sing_handler (rcond); |
4842 err = -2; | 4752 mattype.mark_as_rectangular (); |
4843 | 4753 } |
4844 if (sing_handler) | 4754 else |
4845 { | 4755 (*current_liboctave_error_handler) |
4846 sing_handler (rcond); | 4756 ("matrix singular to machine precision"); |
4847 mattype.mark_as_rectangular (); | 4757 |
4848 } | 4758 } |
4849 else | 4759 else |
4850 (*current_liboctave_error_handler) | 4760 { |
4851 ("matrix singular to machine precision"); | 4761 if (calc_cond) |
4852 | 4762 { |
4853 } | 4763 char job = '1'; |
4854 else | 4764 Array<Complex> z (2 * nr); |
4855 { | 4765 Complex *pz = z.fortran_vec (); |
4856 if (calc_cond) | 4766 Array<double> iz (nr); |
4857 { | 4767 double *piz = iz.fortran_vec (); |
4858 char job = '1'; | 4768 |
4859 Array<Complex> z (2 * nr); | 4769 F77_XFCN (zgbcon, ZGBCON, |
4860 Complex *pz = z.fortran_vec (); | 4770 (F77_CONST_CHAR_ARG2 (&job, 1), |
4861 Array<double> iz (nr); | 4771 nc, n_lower, n_upper, tmp_data, ldm, pipvt, |
4862 double *piz = iz.fortran_vec (); | 4772 anorm, rcond, pz, piz, err |
4863 | 4773 F77_CHAR_ARG_LEN (1))); |
4864 F77_XFCN (zgbcon, ZGBCON, | 4774 |
4865 (F77_CONST_CHAR_ARG2 (&job, 1), | 4775 if (err != 0) |
4866 nc, n_lower, n_upper, tmp_data, ldm, pipvt, | 4776 err = -2; |
4867 anorm, rcond, pz, piz, err | 4777 |
4868 F77_CHAR_ARG_LEN (1))); | 4778 volatile double rcond_plus_one = rcond + 1.0; |
4869 | 4779 |
4870 if (f77_exception_encountered) | 4780 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
4871 (*current_liboctave_error_handler) | 4781 { |
4872 ("unrecoverable error in zgbcon"); | 4782 err = -2; |
4873 | 4783 |
4874 if (err != 0) | 4784 if (sing_handler) |
4875 err = -2; | |
4876 | |
4877 volatile double rcond_plus_one = rcond + 1.0; | |
4878 | |
4879 if (rcond_plus_one == 1.0 || xisnan (rcond)) | |
4880 { | |
4881 err = -2; | |
4882 | |
4883 if (sing_handler) | |
4884 { | |
4885 sing_handler (rcond); | |
4886 mattype.mark_as_rectangular (); | |
4887 } | |
4888 else | |
4889 (*current_liboctave_error_handler) | |
4890 ("matrix singular to machine precision, rcond = %g", | |
4891 rcond); | |
4892 } | |
4893 } | |
4894 else | |
4895 rcond = 1.; | |
4896 | |
4897 if (err == 0) | |
4898 { | |
4899 char job = 'N'; | |
4900 volatile octave_idx_type x_nz = b.nnz (); | |
4901 octave_idx_type b_nc = b.cols (); | |
4902 retval = SparseComplexMatrix (nr, b_nc, x_nz); | |
4903 retval.xcidx(0) = 0; | |
4904 volatile octave_idx_type ii = 0; | |
4905 | |
4906 OCTAVE_LOCAL_BUFFER (Complex, work, nr); | |
4907 | |
4908 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
4909 { | 4785 { |
4910 for (octave_idx_type i = 0; i < nr; i++) | 4786 sing_handler (rcond); |
4911 work[i] = 0.; | 4787 mattype.mark_as_rectangular (); |
4912 for (octave_idx_type i = b.cidx(j); | |
4913 i < b.cidx(j+1); i++) | |
4914 work[b.ridx(i)] = b.data(i); | |
4915 | |
4916 F77_XFCN (zgbtrs, ZGBTRS, | |
4917 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4918 nr, n_lower, n_upper, 1, tmp_data, | |
4919 ldm, pipvt, work, b.rows (), err | |
4920 F77_CHAR_ARG_LEN (1))); | |
4921 | |
4922 if (f77_exception_encountered) | |
4923 { | |
4924 (*current_liboctave_error_handler) | |
4925 ("unrecoverable error in zgbtrs"); | |
4926 break; | |
4927 } | |
4928 | |
4929 // Count non-zeros in work vector and adjust | |
4930 // space in retval if needed | |
4931 octave_idx_type new_nnz = 0; | |
4932 for (octave_idx_type i = 0; i < nr; i++) | |
4933 if (work[i] != 0.) | |
4934 new_nnz++; | |
4935 | |
4936 if (ii + new_nnz > x_nz) | |
4937 { | |
4938 // Resize the sparse matrix | |
4939 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | |
4940 retval.change_capacity (sz); | |
4941 x_nz = sz; | |
4942 } | |
4943 | |
4944 for (octave_idx_type i = 0; i < nr; i++) | |
4945 if (work[i] != 0.) | |
4946 { | |
4947 retval.xridx(ii) = i; | |
4948 retval.xdata(ii++) = work[i]; | |
4949 } | |
4950 retval.xcidx(j+1) = ii; | |
4951 } | 4788 } |
4952 | 4789 else |
4953 retval.maybe_compress (); | 4790 (*current_liboctave_error_handler) |
4954 } | 4791 ("matrix singular to machine precision, rcond = %g", |
4792 rcond); | |
4793 } | |
4794 } | |
4795 else | |
4796 rcond = 1.; | |
4797 | |
4798 if (err == 0) | |
4799 { | |
4800 char job = 'N'; | |
4801 volatile octave_idx_type x_nz = b.nnz (); | |
4802 octave_idx_type b_nc = b.cols (); | |
4803 retval = SparseComplexMatrix (nr, b_nc, x_nz); | |
4804 retval.xcidx(0) = 0; | |
4805 volatile octave_idx_type ii = 0; | |
4806 | |
4807 OCTAVE_LOCAL_BUFFER (Complex, work, nr); | |
4808 | |
4809 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
4810 { | |
4811 for (octave_idx_type i = 0; i < nr; i++) | |
4812 work[i] = 0.; | |
4813 for (octave_idx_type i = b.cidx(j); | |
4814 i < b.cidx(j+1); i++) | |
4815 work[b.ridx(i)] = b.data(i); | |
4816 | |
4817 F77_XFCN (zgbtrs, ZGBTRS, | |
4818 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4819 nr, n_lower, n_upper, 1, tmp_data, | |
4820 ldm, pipvt, work, b.rows (), err | |
4821 F77_CHAR_ARG_LEN (1))); | |
4822 | |
4823 // Count non-zeros in work vector and adjust | |
4824 // space in retval if needed | |
4825 octave_idx_type new_nnz = 0; | |
4826 for (octave_idx_type i = 0; i < nr; i++) | |
4827 if (work[i] != 0.) | |
4828 new_nnz++; | |
4829 | |
4830 if (ii + new_nnz > x_nz) | |
4831 { | |
4832 // Resize the sparse matrix | |
4833 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | |
4834 retval.change_capacity (sz); | |
4835 x_nz = sz; | |
4836 } | |
4837 | |
4838 for (octave_idx_type i = 0; i < nr; i++) | |
4839 if (work[i] != 0.) | |
4840 { | |
4841 retval.xridx(ii) = i; | |
4842 retval.xdata(ii++) = work[i]; | |
4843 } | |
4844 retval.xcidx(j+1) = ii; | |
4845 } | |
4846 | |
4847 retval.maybe_compress (); | |
4955 } | 4848 } |
4956 } | 4849 } |
4957 } | 4850 } |
4958 else if (typ != MatrixType::Banded_Hermitian) | 4851 else if (typ != MatrixType::Banded_Hermitian) |
4959 (*current_liboctave_error_handler) ("incorrect matrix type"); | 4852 (*current_liboctave_error_handler) ("incorrect matrix type"); |
5018 char job = 'L'; | 4911 char job = 'L'; |
5019 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), | 4912 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), |
5020 nr, n_lower, tmp_data, ldm, err | 4913 nr, n_lower, tmp_data, ldm, err |
5021 F77_CHAR_ARG_LEN (1))); | 4914 F77_CHAR_ARG_LEN (1))); |
5022 | 4915 |
5023 if (f77_exception_encountered) | 4916 if (err != 0) |
5024 (*current_liboctave_error_handler) | 4917 { |
5025 ("unrecoverable error in zpbtrf"); | 4918 // Matrix is not positive definite!! Fall through to |
5026 else | 4919 // unsymmetric banded solver. |
5027 { | 4920 rcond = 0.0; |
5028 if (err != 0) | 4921 mattype.mark_as_unsymmetric (); |
5029 { | 4922 typ = MatrixType::Banded; |
5030 // Matrix is not positive definite!! Fall through to | 4923 err = 0; |
5031 // unsymmetric banded solver. | 4924 } |
5032 rcond = 0.0; | 4925 else |
5033 mattype.mark_as_unsymmetric (); | 4926 { |
5034 typ = MatrixType::Banded; | 4927 if (calc_cond) |
5035 err = 0; | 4928 { |
5036 } | 4929 Array<Complex> z (2 * nr); |
5037 else | 4930 Complex *pz = z.fortran_vec (); |
5038 { | 4931 Array<double> iz (nr); |
5039 if (calc_cond) | 4932 double *piz = iz.fortran_vec (); |
5040 { | 4933 |
5041 Array<Complex> z (2 * nr); | 4934 F77_XFCN (zpbcon, ZPBCON, |
5042 Complex *pz = z.fortran_vec (); | 4935 (F77_CONST_CHAR_ARG2 (&job, 1), |
5043 Array<double> iz (nr); | 4936 nr, n_lower, tmp_data, ldm, |
5044 double *piz = iz.fortran_vec (); | 4937 anorm, rcond, pz, piz, err |
5045 | 4938 F77_CHAR_ARG_LEN (1))); |
5046 F77_XFCN (zpbcon, ZPBCON, | 4939 |
5047 (F77_CONST_CHAR_ARG2 (&job, 1), | 4940 if (err != 0) |
5048 nr, n_lower, tmp_data, ldm, | 4941 err = -2; |
5049 anorm, rcond, pz, piz, err | 4942 |
5050 F77_CHAR_ARG_LEN (1))); | 4943 volatile double rcond_plus_one = rcond + 1.0; |
5051 | 4944 |
5052 if (f77_exception_encountered) | 4945 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
5053 (*current_liboctave_error_handler) | 4946 { |
5054 ("unrecoverable error in zpbcon"); | 4947 err = -2; |
5055 | 4948 |
5056 if (err != 0) | 4949 if (sing_handler) |
5057 err = -2; | |
5058 | |
5059 volatile double rcond_plus_one = rcond + 1.0; | |
5060 | |
5061 if (rcond_plus_one == 1.0 || xisnan (rcond)) | |
5062 { | |
5063 err = -2; | |
5064 | |
5065 if (sing_handler) | |
5066 { | |
5067 sing_handler (rcond); | |
5068 mattype.mark_as_rectangular (); | |
5069 } | |
5070 else | |
5071 (*current_liboctave_error_handler) | |
5072 ("matrix singular to machine precision, rcond = %g", | |
5073 rcond); | |
5074 } | |
5075 } | |
5076 else | |
5077 rcond = 1.0; | |
5078 | |
5079 if (err == 0) | |
5080 { | |
5081 octave_idx_type b_nr = b.rows (); | |
5082 octave_idx_type b_nc = b.cols (); | |
5083 retval = ComplexMatrix (b); | |
5084 Complex *result = retval.fortran_vec (); | |
5085 | |
5086 F77_XFCN (zpbtrs, ZPBTRS, | |
5087 (F77_CONST_CHAR_ARG2 (&job, 1), | |
5088 nr, n_lower, b_nc, tmp_data, | |
5089 ldm, result, b_nr, err | |
5090 F77_CHAR_ARG_LEN (1))); | |
5091 | |
5092 if (f77_exception_encountered) | |
5093 { | 4950 { |
5094 (*current_liboctave_error_handler) | 4951 sing_handler (rcond); |
5095 ("unrecoverable error in zpbtrs"); | 4952 mattype.mark_as_rectangular (); |
5096 err = -1; | |
5097 } | 4953 } |
5098 | 4954 else |
5099 if (err != 0) | 4955 (*current_liboctave_error_handler) |
5100 { | 4956 ("matrix singular to machine precision, rcond = %g", |
5101 (*current_liboctave_error_handler) | 4957 rcond); |
5102 ("SparseComplexMatrix::solve solve failed"); | 4958 } |
5103 err = -1; | 4959 } |
5104 } | 4960 else |
4961 rcond = 1.0; | |
4962 | |
4963 if (err == 0) | |
4964 { | |
4965 octave_idx_type b_nr = b.rows (); | |
4966 octave_idx_type b_nc = b.cols (); | |
4967 retval = ComplexMatrix (b); | |
4968 Complex *result = retval.fortran_vec (); | |
4969 | |
4970 F77_XFCN (zpbtrs, ZPBTRS, | |
4971 (F77_CONST_CHAR_ARG2 (&job, 1), | |
4972 nr, n_lower, b_nc, tmp_data, | |
4973 ldm, result, b_nr, err | |
4974 F77_CHAR_ARG_LEN (1))); | |
4975 | |
4976 if (err != 0) | |
4977 { | |
4978 (*current_liboctave_error_handler) | |
4979 ("SparseComplexMatrix::solve solve failed"); | |
4980 err = -1; | |
5105 } | 4981 } |
5106 } | 4982 } |
5107 } | 4983 } |
5108 } | 4984 } |
5109 | 4985 |
5148 octave_idx_type *pipvt = ipvt.fortran_vec (); | 5024 octave_idx_type *pipvt = ipvt.fortran_vec (); |
5149 | 5025 |
5150 F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, | 5026 F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, |
5151 ldm, pipvt, err)); | 5027 ldm, pipvt, err)); |
5152 | 5028 |
5153 if (f77_exception_encountered) | 5029 if (err != 0) |
5154 (*current_liboctave_error_handler) | 5030 { |
5155 ("unrecoverable error in zgbtrf"); | 5031 err = -2; |
5156 else | 5032 rcond = 0.0; |
5157 { | 5033 |
5158 if (err != 0) | 5034 if (sing_handler) |
5159 { | 5035 { |
5160 err = -2; | 5036 sing_handler (rcond); |
5161 rcond = 0.0; | 5037 mattype.mark_as_rectangular (); |
5162 | 5038 } |
5163 if (sing_handler) | 5039 else |
5164 { | 5040 (*current_liboctave_error_handler) |
5165 sing_handler (rcond); | 5041 ("matrix singular to machine precision"); |
5166 mattype.mark_as_rectangular (); | 5042 } |
5167 } | 5043 else |
5168 else | 5044 { |
5169 (*current_liboctave_error_handler) | 5045 if (calc_cond) |
5170 ("matrix singular to machine precision"); | 5046 { |
5171 } | 5047 char job = '1'; |
5172 else | 5048 Array<Complex> z (2 * nr); |
5173 { | 5049 Complex *pz = z.fortran_vec (); |
5174 if (calc_cond) | 5050 Array<double> iz (nr); |
5175 { | 5051 double *piz = iz.fortran_vec (); |
5176 char job = '1'; | 5052 |
5177 Array<Complex> z (2 * nr); | 5053 F77_XFCN (zgbcon, ZGBCON, |
5178 Complex *pz = z.fortran_vec (); | 5054 (F77_CONST_CHAR_ARG2 (&job, 1), |
5179 Array<double> iz (nr); | 5055 nc, n_lower, n_upper, tmp_data, ldm, pipvt, |
5180 double *piz = iz.fortran_vec (); | 5056 anorm, rcond, pz, piz, err |
5181 | 5057 F77_CHAR_ARG_LEN (1))); |
5182 F77_XFCN (zgbcon, ZGBCON, | 5058 |
5183 (F77_CONST_CHAR_ARG2 (&job, 1), | 5059 if (err != 0) |
5184 nc, n_lower, n_upper, tmp_data, ldm, pipvt, | 5060 err = -2; |
5185 anorm, rcond, pz, piz, err | 5061 |
5186 F77_CHAR_ARG_LEN (1))); | 5062 volatile double rcond_plus_one = rcond + 1.0; |
5187 | 5063 |
5188 if (f77_exception_encountered) | 5064 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
5189 (*current_liboctave_error_handler) | 5065 { |
5190 ("unrecoverable error in zgbcon"); | 5066 err = -2; |
5191 | 5067 |
5192 if (err != 0) | 5068 if (sing_handler) |
5193 err = -2; | |
5194 | |
5195 volatile double rcond_plus_one = rcond + 1.0; | |
5196 | |
5197 if (rcond_plus_one == 1.0 || xisnan (rcond)) | |
5198 { | |
5199 err = -2; | |
5200 | |
5201 if (sing_handler) | |
5202 { | |
5203 sing_handler (rcond); | |
5204 mattype.mark_as_rectangular (); | |
5205 } | |
5206 else | |
5207 (*current_liboctave_error_handler) | |
5208 ("matrix singular to machine precision, rcond = %g", | |
5209 rcond); | |
5210 } | |
5211 } | |
5212 else | |
5213 rcond = 1.; | |
5214 | |
5215 if (err == 0) | |
5216 { | |
5217 char job = 'N'; | |
5218 octave_idx_type b_nc = b.cols (); | |
5219 retval = ComplexMatrix (b); | |
5220 Complex *result = retval.fortran_vec (); | |
5221 | |
5222 F77_XFCN (zgbtrs, ZGBTRS, | |
5223 (F77_CONST_CHAR_ARG2 (&job, 1), | |
5224 nr, n_lower, n_upper, b_nc, tmp_data, | |
5225 ldm, pipvt, result, b.rows (), err | |
5226 F77_CHAR_ARG_LEN (1))); | |
5227 | |
5228 if (f77_exception_encountered) | |
5229 { | 5069 { |
5230 (*current_liboctave_error_handler) | 5070 sing_handler (rcond); |
5231 ("unrecoverable error in dgbtrs"); | 5071 mattype.mark_as_rectangular (); |
5232 } | 5072 } |
5233 } | 5073 else |
5074 (*current_liboctave_error_handler) | |
5075 ("matrix singular to machine precision, rcond = %g", | |
5076 rcond); | |
5077 } | |
5078 } | |
5079 else | |
5080 rcond = 1.; | |
5081 | |
5082 if (err == 0) | |
5083 { | |
5084 char job = 'N'; | |
5085 octave_idx_type b_nc = b.cols (); | |
5086 retval = ComplexMatrix (b); | |
5087 Complex *result = retval.fortran_vec (); | |
5088 | |
5089 F77_XFCN (zgbtrs, ZGBTRS, | |
5090 (F77_CONST_CHAR_ARG2 (&job, 1), | |
5091 nr, n_lower, n_upper, b_nc, tmp_data, | |
5092 ldm, pipvt, result, b.rows (), err | |
5093 F77_CHAR_ARG_LEN (1))); | |
5234 } | 5094 } |
5235 } | 5095 } |
5236 } | 5096 } |
5237 else if (typ != MatrixType::Banded_Hermitian) | 5097 else if (typ != MatrixType::Banded_Hermitian) |
5238 (*current_liboctave_error_handler) ("incorrect matrix type"); | 5098 (*current_liboctave_error_handler) ("incorrect matrix type"); |
5297 char job = 'L'; | 5157 char job = 'L'; |
5298 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), | 5158 F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1), |
5299 nr, n_lower, tmp_data, ldm, err | 5159 nr, n_lower, tmp_data, ldm, err |
5300 F77_CHAR_ARG_LEN (1))); | 5160 F77_CHAR_ARG_LEN (1))); |
5301 | 5161 |
5302 if (f77_exception_encountered) | 5162 if (err != 0) |
5303 (*current_liboctave_error_handler) | 5163 { |
5304 ("unrecoverable error in zpbtrf"); | 5164 // Matrix is not positive definite!! Fall through to |
5305 else | 5165 // unsymmetric banded solver. |
5306 { | 5166 mattype.mark_as_unsymmetric (); |
5307 if (err != 0) | 5167 typ = MatrixType::Banded; |
5308 { | 5168 |
5309 // Matrix is not positive definite!! Fall through to | 5169 rcond = 0.0; |
5310 // unsymmetric banded solver. | 5170 err = 0; |
5311 mattype.mark_as_unsymmetric (); | 5171 } |
5312 typ = MatrixType::Banded; | 5172 else |
5313 | 5173 { |
5314 rcond = 0.0; | 5174 if (calc_cond) |
5315 err = 0; | 5175 { |
5316 } | 5176 Array<Complex> z (2 * nr); |
5317 else | 5177 Complex *pz = z.fortran_vec (); |
5318 { | 5178 Array<double> iz (nr); |
5319 if (calc_cond) | 5179 double *piz = iz.fortran_vec (); |
5320 { | 5180 |
5321 Array<Complex> z (2 * nr); | 5181 F77_XFCN (zpbcon, ZPBCON, |
5322 Complex *pz = z.fortran_vec (); | 5182 (F77_CONST_CHAR_ARG2 (&job, 1), |
5323 Array<double> iz (nr); | 5183 nr, n_lower, tmp_data, ldm, |
5324 double *piz = iz.fortran_vec (); | 5184 anorm, rcond, pz, piz, err |
5325 | 5185 F77_CHAR_ARG_LEN (1))); |
5326 F77_XFCN (zpbcon, ZPBCON, | 5186 |
5327 (F77_CONST_CHAR_ARG2 (&job, 1), | 5187 if (err != 0) |
5328 nr, n_lower, tmp_data, ldm, | 5188 err = -2; |
5329 anorm, rcond, pz, piz, err | 5189 |
5330 F77_CHAR_ARG_LEN (1))); | 5190 volatile double rcond_plus_one = rcond + 1.0; |
5331 | 5191 |
5332 if (f77_exception_encountered) | 5192 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
5333 (*current_liboctave_error_handler) | 5193 { |
5334 ("unrecoverable error in zpbcon"); | 5194 err = -2; |
5335 | 5195 |
5336 if (err != 0) | 5196 if (sing_handler) |
5337 err = -2; | |
5338 | |
5339 volatile double rcond_plus_one = rcond + 1.0; | |
5340 | |
5341 if (rcond_plus_one == 1.0 || xisnan (rcond)) | |
5342 { | |
5343 err = -2; | |
5344 | |
5345 if (sing_handler) | |
5346 { | |
5347 sing_handler (rcond); | |
5348 mattype.mark_as_rectangular (); | |
5349 } | |
5350 else | |
5351 (*current_liboctave_error_handler) | |
5352 ("matrix singular to machine precision, rcond = %g", | |
5353 rcond); | |
5354 } | |
5355 } | |
5356 else | |
5357 rcond = 1.0; | |
5358 | |
5359 if (err == 0) | |
5360 { | |
5361 octave_idx_type b_nr = b.rows (); | |
5362 octave_idx_type b_nc = b.cols (); | |
5363 OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); | |
5364 | |
5365 // Take a first guess that the number of non-zero terms | |
5366 // will be as many as in b | |
5367 volatile octave_idx_type x_nz = b.nnz (); | |
5368 volatile octave_idx_type ii = 0; | |
5369 retval = SparseComplexMatrix (b_nr, b_nc, x_nz); | |
5370 | |
5371 retval.xcidx(0) = 0; | |
5372 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
5373 { | 5197 { |
5374 | 5198 sing_handler (rcond); |
5375 for (octave_idx_type i = 0; i < b_nr; i++) | 5199 mattype.mark_as_rectangular (); |
5376 Bx[i] = b (i,j); | |
5377 | |
5378 F77_XFCN (zpbtrs, ZPBTRS, | |
5379 (F77_CONST_CHAR_ARG2 (&job, 1), | |
5380 nr, n_lower, 1, tmp_data, | |
5381 ldm, Bx, b_nr, err | |
5382 F77_CHAR_ARG_LEN (1))); | |
5383 | |
5384 if (f77_exception_encountered) | |
5385 { | |
5386 (*current_liboctave_error_handler) | |
5387 ("unrecoverable error in zpbtrs"); | |
5388 err = -1; | |
5389 break; | |
5390 } | |
5391 | |
5392 if (err != 0) | |
5393 { | |
5394 (*current_liboctave_error_handler) | |
5395 ("SparseMatrix::solve solve failed"); | |
5396 err = -1; | |
5397 break; | |
5398 } | |
5399 | |
5400 // Count non-zeros in work vector and adjust | |
5401 // space in retval if needed | |
5402 octave_idx_type new_nnz = 0; | |
5403 for (octave_idx_type i = 0; i < nr; i++) | |
5404 if (Bx[i] != 0.) | |
5405 new_nnz++; | |
5406 | |
5407 if (ii + new_nnz > x_nz) | |
5408 { | |
5409 // Resize the sparse matrix | |
5410 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | |
5411 retval.change_capacity (sz); | |
5412 x_nz = sz; | |
5413 } | |
5414 | |
5415 for (octave_idx_type i = 0; i < nr; i++) | |
5416 if (Bx[i] != 0.) | |
5417 { | |
5418 retval.xridx(ii) = i; | |
5419 retval.xdata(ii++) = Bx[i]; | |
5420 } | |
5421 | |
5422 retval.xcidx(j+1) = ii; | |
5423 } | 5200 } |
5424 | 5201 else |
5425 retval.maybe_compress (); | 5202 (*current_liboctave_error_handler) |
5426 } | 5203 ("matrix singular to machine precision, rcond = %g", |
5204 rcond); | |
5205 } | |
5206 } | |
5207 else | |
5208 rcond = 1.0; | |
5209 | |
5210 if (err == 0) | |
5211 { | |
5212 octave_idx_type b_nr = b.rows (); | |
5213 octave_idx_type b_nc = b.cols (); | |
5214 OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr); | |
5215 | |
5216 // Take a first guess that the number of non-zero terms | |
5217 // will be as many as in b | |
5218 volatile octave_idx_type x_nz = b.nnz (); | |
5219 volatile octave_idx_type ii = 0; | |
5220 retval = SparseComplexMatrix (b_nr, b_nc, x_nz); | |
5221 | |
5222 retval.xcidx(0) = 0; | |
5223 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
5224 { | |
5225 | |
5226 for (octave_idx_type i = 0; i < b_nr; i++) | |
5227 Bx[i] = b (i,j); | |
5228 | |
5229 F77_XFCN (zpbtrs, ZPBTRS, | |
5230 (F77_CONST_CHAR_ARG2 (&job, 1), | |
5231 nr, n_lower, 1, tmp_data, | |
5232 ldm, Bx, b_nr, err | |
5233 F77_CHAR_ARG_LEN (1))); | |
5234 | |
5235 if (err != 0) | |
5236 { | |
5237 (*current_liboctave_error_handler) | |
5238 ("SparseMatrix::solve solve failed"); | |
5239 err = -1; | |
5240 break; | |
5241 } | |
5242 | |
5243 // Count non-zeros in work vector and adjust | |
5244 // space in retval if needed | |
5245 octave_idx_type new_nnz = 0; | |
5246 for (octave_idx_type i = 0; i < nr; i++) | |
5247 if (Bx[i] != 0.) | |
5248 new_nnz++; | |
5249 | |
5250 if (ii + new_nnz > x_nz) | |
5251 { | |
5252 // Resize the sparse matrix | |
5253 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | |
5254 retval.change_capacity (sz); | |
5255 x_nz = sz; | |
5256 } | |
5257 | |
5258 for (octave_idx_type i = 0; i < nr; i++) | |
5259 if (Bx[i] != 0.) | |
5260 { | |
5261 retval.xridx(ii) = i; | |
5262 retval.xdata(ii++) = Bx[i]; | |
5263 } | |
5264 | |
5265 retval.xcidx(j+1) = ii; | |
5266 } | |
5267 | |
5268 retval.maybe_compress (); | |
5427 } | 5269 } |
5428 } | 5270 } |
5429 } | 5271 } |
5430 | 5272 |
5431 if (typ == MatrixType::Banded) | 5273 if (typ == MatrixType::Banded) |
5469 octave_idx_type *pipvt = ipvt.fortran_vec (); | 5311 octave_idx_type *pipvt = ipvt.fortran_vec (); |
5470 | 5312 |
5471 F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, | 5313 F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data, |
5472 ldm, pipvt, err)); | 5314 ldm, pipvt, err)); |
5473 | 5315 |
5474 if (f77_exception_encountered) | 5316 if (err != 0) |
5475 (*current_liboctave_error_handler) | 5317 { |
5476 ("unrecoverable error in xgbtrf"); | 5318 err = -2; |
5477 else | 5319 rcond = 0.0; |
5478 { | 5320 |
5479 if (err != 0) | 5321 if (sing_handler) |
5480 { | 5322 { |
5481 err = -2; | 5323 sing_handler (rcond); |
5482 rcond = 0.0; | 5324 mattype.mark_as_rectangular (); |
5483 | 5325 } |
5484 if (sing_handler) | 5326 else |
5485 { | 5327 (*current_liboctave_error_handler) |
5486 sing_handler (rcond); | 5328 ("matrix singular to machine precision"); |
5487 mattype.mark_as_rectangular (); | 5329 |
5488 } | 5330 } |
5489 else | 5331 else |
5490 (*current_liboctave_error_handler) | 5332 { |
5491 ("matrix singular to machine precision"); | 5333 if (calc_cond) |
5492 | 5334 { |
5493 } | 5335 char job = '1'; |
5494 else | 5336 Array<Complex> z (2 * nr); |
5495 { | 5337 Complex *pz = z.fortran_vec (); |
5496 if (calc_cond) | 5338 Array<double> iz (nr); |
5497 { | 5339 double *piz = iz.fortran_vec (); |
5498 char job = '1'; | 5340 |
5499 Array<Complex> z (2 * nr); | 5341 F77_XFCN (zgbcon, ZGBCON, |
5500 Complex *pz = z.fortran_vec (); | 5342 (F77_CONST_CHAR_ARG2 (&job, 1), |
5501 Array<double> iz (nr); | 5343 nc, n_lower, n_upper, tmp_data, ldm, pipvt, |
5502 double *piz = iz.fortran_vec (); | 5344 anorm, rcond, pz, piz, err |
5503 | 5345 F77_CHAR_ARG_LEN (1))); |
5504 F77_XFCN (zgbcon, ZGBCON, | 5346 |
5505 (F77_CONST_CHAR_ARG2 (&job, 1), | 5347 if (err != 0) |
5506 nc, n_lower, n_upper, tmp_data, ldm, pipvt, | 5348 err = -2; |
5507 anorm, rcond, pz, piz, err | 5349 |
5508 F77_CHAR_ARG_LEN (1))); | 5350 volatile double rcond_plus_one = rcond + 1.0; |
5509 | 5351 |
5510 if (f77_exception_encountered) | 5352 if (rcond_plus_one == 1.0 || xisnan (rcond)) |
5511 (*current_liboctave_error_handler) | 5353 { |
5512 ("unrecoverable error in zgbcon"); | 5354 err = -2; |
5513 | 5355 |
5514 if (err != 0) | 5356 if (sing_handler) |
5515 err = -2; | |
5516 | |
5517 volatile double rcond_plus_one = rcond + 1.0; | |
5518 | |
5519 if (rcond_plus_one == 1.0 || xisnan (rcond)) | |
5520 { | |
5521 err = -2; | |
5522 | |
5523 if (sing_handler) | |
5524 { | |
5525 sing_handler (rcond); | |
5526 mattype.mark_as_rectangular (); | |
5527 } | |
5528 else | |
5529 (*current_liboctave_error_handler) | |
5530 ("matrix singular to machine precision, rcond = %g", | |
5531 rcond); | |
5532 } | |
5533 } | |
5534 else | |
5535 rcond = 1.; | |
5536 | |
5537 if (err == 0) | |
5538 { | |
5539 char job = 'N'; | |
5540 volatile octave_idx_type x_nz = b.nnz (); | |
5541 octave_idx_type b_nc = b.cols (); | |
5542 retval = SparseComplexMatrix (nr, b_nc, x_nz); | |
5543 retval.xcidx(0) = 0; | |
5544 volatile octave_idx_type ii = 0; | |
5545 | |
5546 OCTAVE_LOCAL_BUFFER (Complex, Bx, nr); | |
5547 | |
5548 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
5549 { | 5357 { |
5550 for (octave_idx_type i = 0; i < nr; i++) | 5358 sing_handler (rcond); |
5551 Bx[i] = 0.; | 5359 mattype.mark_as_rectangular (); |
5552 | |
5553 for (octave_idx_type i = b.cidx(j); | |
5554 i < b.cidx(j+1); i++) | |
5555 Bx[b.ridx(i)] = b.data(i); | |
5556 | |
5557 F77_XFCN (zgbtrs, ZGBTRS, | |
5558 (F77_CONST_CHAR_ARG2 (&job, 1), | |
5559 nr, n_lower, n_upper, 1, tmp_data, | |
5560 ldm, pipvt, Bx, b.rows (), err | |
5561 F77_CHAR_ARG_LEN (1))); | |
5562 | |
5563 if (f77_exception_encountered) | |
5564 { | |
5565 (*current_liboctave_error_handler) | |
5566 ("unrecoverable error in dgbtrs"); | |
5567 break; | |
5568 } | |
5569 | |
5570 // Count non-zeros in work vector and adjust | |
5571 // space in retval if needed | |
5572 octave_idx_type new_nnz = 0; | |
5573 for (octave_idx_type i = 0; i < nr; i++) | |
5574 if (Bx[i] != 0.) | |
5575 new_nnz++; | |
5576 | |
5577 if (ii + new_nnz > x_nz) | |
5578 { | |
5579 // Resize the sparse matrix | |
5580 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | |
5581 retval.change_capacity (sz); | |
5582 x_nz = sz; | |
5583 } | |
5584 | |
5585 for (octave_idx_type i = 0; i < nr; i++) | |
5586 if (Bx[i] != 0.) | |
5587 { | |
5588 retval.xridx(ii) = i; | |
5589 retval.xdata(ii++) = Bx[i]; | |
5590 } | |
5591 retval.xcidx(j+1) = ii; | |
5592 } | 5360 } |
5593 | 5361 else |
5594 retval.maybe_compress (); | 5362 (*current_liboctave_error_handler) |
5595 } | 5363 ("matrix singular to machine precision, rcond = %g", |
5364 rcond); | |
5365 } | |
5366 } | |
5367 else | |
5368 rcond = 1.; | |
5369 | |
5370 if (err == 0) | |
5371 { | |
5372 char job = 'N'; | |
5373 volatile octave_idx_type x_nz = b.nnz (); | |
5374 octave_idx_type b_nc = b.cols (); | |
5375 retval = SparseComplexMatrix (nr, b_nc, x_nz); | |
5376 retval.xcidx(0) = 0; | |
5377 volatile octave_idx_type ii = 0; | |
5378 | |
5379 OCTAVE_LOCAL_BUFFER (Complex, Bx, nr); | |
5380 | |
5381 for (volatile octave_idx_type j = 0; j < b_nc; j++) | |
5382 { | |
5383 for (octave_idx_type i = 0; i < nr; i++) | |
5384 Bx[i] = 0.; | |
5385 | |
5386 for (octave_idx_type i = b.cidx(j); | |
5387 i < b.cidx(j+1); i++) | |
5388 Bx[b.ridx(i)] = b.data(i); | |
5389 | |
5390 F77_XFCN (zgbtrs, ZGBTRS, | |
5391 (F77_CONST_CHAR_ARG2 (&job, 1), | |
5392 nr, n_lower, n_upper, 1, tmp_data, | |
5393 ldm, pipvt, Bx, b.rows (), err | |
5394 F77_CHAR_ARG_LEN (1))); | |
5395 | |
5396 // Count non-zeros in work vector and adjust | |
5397 // space in retval if needed | |
5398 octave_idx_type new_nnz = 0; | |
5399 for (octave_idx_type i = 0; i < nr; i++) | |
5400 if (Bx[i] != 0.) | |
5401 new_nnz++; | |
5402 | |
5403 if (ii + new_nnz > x_nz) | |
5404 { | |
5405 // Resize the sparse matrix | |
5406 octave_idx_type sz = new_nnz * (b_nc - j) + x_nz; | |
5407 retval.change_capacity (sz); | |
5408 x_nz = sz; | |
5409 } | |
5410 | |
5411 for (octave_idx_type i = 0; i < nr; i++) | |
5412 if (Bx[i] != 0.) | |
5413 { | |
5414 retval.xridx(ii) = i; | |
5415 retval.xdata(ii++) = Bx[i]; | |
5416 } | |
5417 retval.xcidx(j+1) = ii; | |
5418 } | |
5419 | |
5420 retval.maybe_compress (); | |
5596 } | 5421 } |
5597 } | 5422 } |
5598 } | 5423 } |
5599 else if (typ != MatrixType::Banded_Hermitian) | 5424 else if (typ != MatrixType::Banded_Hermitian) |
5600 (*current_liboctave_error_handler) ("incorrect matrix type"); | 5425 (*current_liboctave_error_handler) ("incorrect matrix type"); |