Commit c64a05f8a6b6da9ac2fb4f115f7ea401387f12c3
1 parent
2b83390c62
Exists in
master
and in
3 other branches
Sparse Determinant : use of mantisse + exponent
git-svn-id: https://lxsd.femto-st.fr/svn/fvn@65 b657c933-2333-4658-acf2-d3c7c2708721
Showing 5 changed files with 28 additions and 43 deletions Side-by-side Diff
fvn_sparse/fvn_sparse.f90
| ... | ... | @@ -41,7 +41,7 @@ |
| 41 | 41 | complex(kind=dp_kind),dimension(n),intent(in) :: B |
| 42 | 42 | complex(kind=dp_kind),dimension(n),intent(out) :: x |
| 43 | 43 | integer(kind=dp_kind), intent(out) :: status |
| 44 | -complex(kind=dp_kind), optional, intent(out) :: det | |
| 44 | +real(kind=dp_kind), dimension(3), optional, intent(out) :: det | |
| 45 | 45 | |
| 46 | 46 | integer(kind=dp_kind),dimension(:),allocatable :: wTi,wTj |
| 47 | 47 | real(kind=dp_kind),dimension(:),allocatable :: Tx,Tz |
| ... | ... | @@ -52,7 +52,6 @@ |
| 52 | 52 | real(kind=dp_kind),dimension(90) :: info |
| 53 | 53 | real(kind=dp_kind),dimension(20) :: control |
| 54 | 54 | integer(kind=dp_kind) :: sys |
| 55 | -real(kind=dp_kind) :: Mx,Mz,Ex | |
| 56 | 55 | |
| 57 | 56 | |
| 58 | 57 | status=0 |
| ... | ... | @@ -99,8 +98,7 @@ |
| 99 | 98 | |
| 100 | 99 | ! if parameter det is present, the determinant of the matrix is calculated |
| 101 | 100 | if (present(det) ) then |
| 102 | - call umfpack_zl_get_determinant(Mx,Mz,Ex,numeric,info,status) | |
| 103 | - det=cmplx(Mx,Mz,kind=dp_kind)*10**Ex | |
| 101 | + call umfpack_zl_get_determinant(det(1),det(2),det(3),numeric,info,status) | |
| 104 | 102 | ! info(1) should be zero |
| 105 | 103 | if (info(1) /= 0) then |
| 106 | 104 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
| ... | ... | @@ -148,7 +146,7 @@ |
| 148 | 146 | complex(kind=dp_kind),dimension(n),intent(in) :: B |
| 149 | 147 | complex(kind=dp_kind),dimension(n),intent(out) :: x |
| 150 | 148 | integer(kind=sp_kind), intent(out) :: status |
| 151 | -complex(kind=dp_kind), optional, intent(out) :: det | |
| 149 | +real(kind=dp_kind), dimension(3), optional, intent(out) :: det | |
| 152 | 150 | |
| 153 | 151 | integer(kind=sp_kind),dimension(:),allocatable :: wTi,wTj |
| 154 | 152 | real(kind=dp_kind),dimension(:),allocatable :: Tx,Tz |
| ... | ... | @@ -163,7 +161,6 @@ |
| 163 | 161 | real(kind=dp_kind),dimension(90) :: info |
| 164 | 162 | real(kind=dp_kind),dimension(20) :: control |
| 165 | 163 | integer(kind=sp_kind) :: sys |
| 166 | -real(kind=dp_kind) :: Mx,Mz,Ex | |
| 167 | 164 | |
| 168 | 165 | status=0 |
| 169 | 166 | ! we use a working copy of Ti and Tj to perform 1-based to 0-based translation |
| ... | ... | @@ -208,8 +205,7 @@ |
| 208 | 205 | |
| 209 | 206 | ! if parameter det is present, the determinant of the matrix is calculated |
| 210 | 207 | if (present(det) ) then |
| 211 | - call umfpack_zi_get_determinant(Mx,Mz,Ex,numeric,info,status) | |
| 212 | - det=cmplx(Mx,Mz,kind=dp_kind)*10**Ex | |
| 208 | + call umfpack_zi_get_determinant(det(1),det(2),det(3),numeric,info,status) | |
| 213 | 209 | ! info(1) should be zero |
| 214 | 210 | if (info(1) /= 0) then |
| 215 | 211 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
| ... | ... | @@ -258,7 +254,7 @@ |
| 258 | 254 | real(kind=dp_kind),dimension(n),intent(in) :: B |
| 259 | 255 | real(kind=dp_kind),dimension(n),intent(out) :: x |
| 260 | 256 | integer(kind=dp_kind), intent(out) :: status |
| 261 | -real(kind=dp_kind), optional, intent(out) :: det | |
| 257 | +real(kind=dp_kind), dimension(2), optional, intent(out) :: det | |
| 262 | 258 | |
| 263 | 259 | integer(kind=dp_kind),dimension(:),allocatable :: wTi,wTj |
| 264 | 260 | real(kind=dp_kind),dimension(:),allocatable :: A |
| ... | ... | @@ -268,7 +264,6 @@ |
| 268 | 264 | real(kind=dp_kind),dimension(90) :: info |
| 269 | 265 | real(kind=dp_kind),dimension(20) :: control |
| 270 | 266 | integer(kind=dp_kind) :: sys |
| 271 | -real(kind=dp_kind) :: Mx,Ex | |
| 272 | 267 | |
| 273 | 268 | status=0 |
| 274 | 269 | ! we use a working copy of Ti and Tj to perform 1-based to 0-based translation |
| ... | ... | @@ -309,8 +304,7 @@ |
| 309 | 304 | |
| 310 | 305 | ! if parameter det is present, the determinant of the matrix is calculated |
| 311 | 306 | if (present(det) ) then |
| 312 | - call umfpack_dl_get_determinant(Mx,Ex,numeric,info,status) | |
| 313 | - det=Mx*10**Ex | |
| 307 | + call umfpack_dl_get_determinant(det(1),det(2),numeric,info,status) | |
| 314 | 308 | ! info(1) should be zero |
| 315 | 309 | if (info(1) /= 0) then |
| 316 | 310 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
| ... | ... | @@ -350,7 +344,7 @@ |
| 350 | 344 | real(kind=dp_kind),dimension(n),intent(in) :: B |
| 351 | 345 | real(kind=dp_kind),dimension(n),intent(out) :: x |
| 352 | 346 | integer(kind=sp_kind), intent(out) :: status |
| 353 | -real(kind=dp_kind), optional, intent(out) :: det | |
| 347 | +real(kind=dp_kind), dimension(2), optional, intent(out) :: det | |
| 354 | 348 | |
| 355 | 349 | integer(kind=sp_kind),dimension(:),allocatable :: wTi,wTj |
| 356 | 350 | real(kind=dp_kind),dimension(:),allocatable :: A |
| ... | ... | @@ -363,7 +357,6 @@ |
| 363 | 357 | real(kind=dp_kind),dimension(90) :: info |
| 364 | 358 | real(kind=dp_kind),dimension(20) :: control |
| 365 | 359 | integer(kind=sp_kind) :: sys |
| 366 | -real(kind=dp_kind) :: Mx,Ex | |
| 367 | 360 | |
| 368 | 361 | status=0 |
| 369 | 362 | ! we use a working copy of Ti and Tj to perform 1-based to 0-based translation |
| ... | ... | @@ -404,8 +397,7 @@ |
| 404 | 397 | |
| 405 | 398 | ! if parameter det is present, the determinant of the matrix is calculated |
| 406 | 399 | if (present(det) ) then |
| 407 | - call umfpack_di_get_determinant(Mx,Ex,numeric,info,status) | |
| 408 | - det=Mx*10**Ex | |
| 400 | + call umfpack_di_get_determinant(det(1),det(2),numeric,info,status) | |
| 409 | 401 | ! info(1) should be zero |
| 410 | 402 | if (info(1) /= 0) then |
| 411 | 403 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
| ... | ... | @@ -441,7 +433,7 @@ |
| 441 | 433 | integer(kind=dp_kind), intent(in) :: n,nz |
| 442 | 434 | complex(kind=dp_kind),dimension(nz),intent(in) :: T |
| 443 | 435 | integer(kind=dp_kind),dimension(nz),intent(in) :: Ti,Tj |
| 444 | -complex(kind=dp_kind),intent(out) :: det | |
| 436 | +real(kind=dp_kind), dimension(3), intent(out) :: det | |
| 445 | 437 | integer(kind=dp_kind), intent(out) :: status |
| 446 | 438 | |
| 447 | 439 | integer(kind=dp_kind),dimension(:),allocatable :: wTi,wTj |
| 448 | 440 | |
| ... | ... | @@ -496,13 +488,12 @@ |
| 496 | 488 | ! free the C symbolic pointer |
| 497 | 489 | call umfpack_zl_free_symbolic (symbolic) |
| 498 | 490 | |
| 499 | -call umfpack_zl_get_determinant(Mx,Mz,Ex,numeric,info,status) | |
| 491 | +call umfpack_zl_get_determinant(det(1),det(2),det(3),numeric,info,status) | |
| 500 | 492 | ! info(1) should be zero |
| 501 | 493 | if (info(1) /= 0) then |
| 502 | 494 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
| 503 | 495 | status=info(1) |
| 504 | 496 | endif |
| 505 | -det=cmplx(Mx,Mz,kind=dp_kind)*10**Ex | |
| 506 | 497 | |
| 507 | 498 | ! free the C numeric pointer |
| 508 | 499 | call umfpack_zl_free_numeric (numeric) |
| ... | ... | @@ -519,7 +510,7 @@ |
| 519 | 510 | complex(kind=dp_kind),dimension(nz),intent(in) :: T |
| 520 | 511 | integer(kind=sp_kind),dimension(nz),intent(in) :: Ti,Tj |
| 521 | 512 | integer(kind=sp_kind), intent(out) :: status |
| 522 | -complex(kind=dp_kind), intent(out) :: det | |
| 513 | +real(kind=dp_kind), dimension(3), intent(out) :: det | |
| 523 | 514 | |
| 524 | 515 | integer(kind=sp_kind),dimension(:),allocatable :: wTi,wTj |
| 525 | 516 | real(kind=dp_kind),dimension(:),allocatable :: Tx,Tz |
| ... | ... | @@ -532,7 +523,6 @@ |
| 532 | 523 | ! An other possibility : integer(kind=sp_kind),dimension(2) :: symbolic,numeric |
| 533 | 524 | real(kind=dp_kind),dimension(90) :: info |
| 534 | 525 | real(kind=dp_kind),dimension(20) :: control |
| 535 | -real(kind=dp_kind) :: Mx,Mz,Ex | |
| 536 | 526 | |
| 537 | 527 | status=0 |
| 538 | 528 | ! we use a working copy of Ti and Tj to perform 1-based to 0-based translation |
| 539 | 529 | |
| ... | ... | @@ -575,13 +565,12 @@ |
| 575 | 565 | ! free the C symbolic pointer |
| 576 | 566 | call umfpack_zi_free_symbolic (symbolic) |
| 577 | 567 | |
| 578 | -call umfpack_zi_get_determinant(Mx,Mz,Ex,numeric,info,status) | |
| 568 | +call umfpack_zi_get_determinant(det(1),det(2),det(3),numeric,info,status) | |
| 579 | 569 | ! info(1) should be zero |
| 580 | 570 | if (info(1) /= 0) then |
| 581 | 571 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
| 582 | 572 | status=info(1) |
| 583 | 573 | endif |
| 584 | -det=cmplx(Mx,Mz,kind=dp_kind)*10**Ex | |
| 585 | 574 | |
| 586 | 575 | ! free the C numeric pointer |
| 587 | 576 | call umfpack_zi_free_numeric (numeric) |
| ... | ... | @@ -597,7 +586,7 @@ |
| 597 | 586 | real(kind=dp_kind),dimension(nz),intent(in) :: T |
| 598 | 587 | integer(kind=dp_kind),dimension(nz),intent(in) :: Ti,Tj |
| 599 | 588 | integer(kind=dp_kind), intent(out) :: status |
| 600 | -real(kind=dp_kind), intent(out) :: det | |
| 589 | +real(kind=dp_kind), dimension(2), intent(out) :: det | |
| 601 | 590 | |
| 602 | 591 | integer(kind=dp_kind),dimension(:),allocatable :: wTi,wTj |
| 603 | 592 | real(kind=dp_kind),dimension(:),allocatable :: A |
| ... | ... | @@ -606,7 +595,6 @@ |
| 606 | 595 | integer(kind=dp_kind) :: symbolic,numeric |
| 607 | 596 | real(kind=dp_kind),dimension(90) :: info |
| 608 | 597 | real(kind=dp_kind),dimension(20) :: control |
| 609 | -real(kind=dp_kind) :: Mx,Ex | |
| 610 | 598 | |
| 611 | 599 | status=0 |
| 612 | 600 | ! we use a working copy of Ti and Tj to perform 1-based to 0-based translation |
| 613 | 601 | |
| ... | ... | @@ -645,13 +633,12 @@ |
| 645 | 633 | ! free the C symbolic pointer |
| 646 | 634 | call umfpack_dl_free_symbolic (symbolic) |
| 647 | 635 | |
| 648 | -call umfpack_dl_get_determinant(Mx,Ex,numeric,info,status) | |
| 636 | +call umfpack_dl_get_determinant(det(1),det(2),numeric,info,status) | |
| 649 | 637 | ! info(1) should be zero |
| 650 | 638 | if (info(1) /= 0) then |
| 651 | 639 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
| 652 | 640 | status=info(1) |
| 653 | 641 | endif |
| 654 | -det=Mx*10**Ex | |
| 655 | 642 | |
| 656 | 643 | ! free the C numeric pointer |
| 657 | 644 | call umfpack_dl_free_numeric (numeric) |
| ... | ... | @@ -667,7 +654,7 @@ |
| 667 | 654 | real(kind=dp_kind),dimension(nz),intent(in) :: T |
| 668 | 655 | integer(kind=sp_kind),dimension(nz),intent(in) :: Ti,Tj |
| 669 | 656 | integer(kind=sp_kind), intent(out) :: status |
| 670 | -real(kind=dp_kind), intent(out) :: det | |
| 657 | +real(kind=dp_kind), dimension(2), intent(out) :: det | |
| 671 | 658 | |
| 672 | 659 | integer(kind=sp_kind),dimension(:),allocatable :: wTi,wTj |
| 673 | 660 | real(kind=dp_kind),dimension(:),allocatable :: A |
| ... | ... | @@ -680,7 +667,6 @@ |
| 680 | 667 | real(kind=dp_kind),dimension(90) :: info |
| 681 | 668 | real(kind=dp_kind),dimension(20) :: control |
| 682 | 669 | integer(kind=sp_kind) :: sys |
| 683 | -real(kind=dp_kind) :: Mx,Ex | |
| 684 | 670 | |
| 685 | 671 | |
| 686 | 672 | status=0 |
| ... | ... | @@ -721,8 +707,7 @@ |
| 721 | 707 | ! free the C symbolic pointer |
| 722 | 708 | call umfpack_di_free_symbolic (symbolic) |
| 723 | 709 | |
| 724 | -call umfpack_di_get_determinant(Mx,Ex,numeric,info,status) | |
| 725 | -det=Mx*10**Ex | |
| 710 | +call umfpack_di_get_determinant(det(1),det(2),numeric,info,status) | |
| 726 | 711 | ! info(1) should be zero |
| 727 | 712 | if (info(1) /= 0) then |
| 728 | 713 | write(*,*) "Problem during sparse determinant, returned code : ",info(1) |
fvn_test/test_sparse_di.f90
| ... | ... | @@ -9,7 +9,7 @@ |
| 9 | 9 | integer(kind=sp_kind),dimension(nz) :: Ti,Tj |
| 10 | 10 | real(kind=dp_kind),dimension(n) :: B,x |
| 11 | 11 | integer(kind=sp_kind) :: status,i |
| 12 | -real(kind=dp_kind) :: det | |
| 12 | +real(kind=dp_kind),dimension(2) :: det | |
| 13 | 13 | ! Description of the matrix in triplet form |
| 14 | 14 | A = (/ 2.,3.,3.,-1.,4.,4.,-3.,1.,2.,2.,6.,1. /) |
| 15 | 15 | B = (/ 8., 45., -3., 3., 19./) |
| 16 | 16 | |
| ... | ... | @@ -35,13 +35,13 @@ |
| 35 | 35 | ! either generic one fvn_sparse_det |
| 36 | 36 | call fvn_di_sparse_det(n,nz,A,Ti,Tj,det,status) |
| 37 | 37 | write(*,*) |
| 38 | -write(*,*) "Sparse Det = ",det | |
| 38 | +write(*,*) "Sparse Det = ",det(1)*10**det(2) | |
| 39 | 39 | ! can use either specific interface fvn_di_sparse_solve |
| 40 | 40 | ! either generic one fvn_sparse_solve |
| 41 | 41 | ! parameter det is optional |
| 42 | 42 | call fvn_di_sparse_solve(n,nz,A,Ti,Tj,B,x,status,det) |
| 43 | 43 | write(*,*) |
| 44 | -write(*,*) "Sparse Det as solve option = ",det | |
| 44 | +write(*,*) "Sparse Det as solve option = ",det(1)*10**det(2) | |
| 45 | 45 | write(*,*) |
| 46 | 46 | write(*,'("Solution :",5f8.4)') x |
| 47 | 47 | write(*,*) |
fvn_test/test_sparse_dl.f90
| ... | ... | @@ -9,7 +9,7 @@ |
| 9 | 9 | integer(kind=dp_kind),dimension(nz) :: Ti,Tj |
| 10 | 10 | real(kind=dp_kind),dimension(n) :: B,x |
| 11 | 11 | integer(kind=dp_kind) :: status,i |
| 12 | -real(kind=dp_kind) :: det | |
| 12 | +real(kind=dp_kind),dimension(2) :: det | |
| 13 | 13 | ! Description of the matrix in triplet form |
| 14 | 14 | A = (/ 2.,3.,3.,-1.,4.,4.,-3.,1.,2.,2.,6.,1. /) |
| 15 | 15 | B = (/ 8., 45., -3., 3., 19./) |
| 16 | 16 | |
| ... | ... | @@ -35,13 +35,13 @@ |
| 35 | 35 | ! either generic one fvn_sparse_det |
| 36 | 36 | call fvn_dl_sparse_det(n,nz,A,Ti,Tj,det,status) |
| 37 | 37 | write(*,*) |
| 38 | -write(*,*) "Sparse Det = ",det | |
| 38 | +write(*,*) "Sparse Det = ",det(1)*10**det(2) | |
| 39 | 39 | ! can use either specific interface fvn_dl_sparse_solve |
| 40 | 40 | ! either generic one fvn_sparse_solve |
| 41 | 41 | ! parameter det is optional |
| 42 | 42 | call fvn_dl_sparse_solve(n,nz,A,Ti,Tj,B,x,status,det) |
| 43 | 43 | write(*,*) |
| 44 | -write(*,*) "Sparse Det as solve option = ",det | |
| 44 | +write(*,*) "Sparse Det as solve option = ",det(1)*10**det(2) | |
| 45 | 45 | write(*,*) |
| 46 | 46 | write(*,'("Solution :",5f8.4)') x |
| 47 | 47 | write(*,*) |
fvn_test/test_sparse_zi.f90
| ... | ... | @@ -8,7 +8,7 @@ |
| 8 | 8 | integer(kind=sp_kind),dimension(nz) :: Ti,Tj |
| 9 | 9 | complex(kind=dp_kind),dimension(n) :: B,x |
| 10 | 10 | integer(kind=sp_kind) :: status,i |
| 11 | -complex(kind=dp_kind) :: det | |
| 11 | +real(kind=dp_kind),dimension(3) :: det | |
| 12 | 12 | character(len=80) :: fmcmplx |
| 13 | 13 | |
| 14 | 14 | fmcmplx='(5("(",f8.5,",",f8.5,") "))' |
| 15 | 15 | |
| ... | ... | @@ -39,13 +39,13 @@ |
| 39 | 39 | ! either generic one fvn_sparse_det |
| 40 | 40 | call fvn_zi_sparse_det(n,nz,A,Ti,Tj,det,status) |
| 41 | 41 | write(*,*) |
| 42 | -write(*,*) "Sparse Det = ",det | |
| 42 | +write(*,*) "Sparse Det = ",cmplx(det(1),det(2),kind=dp_kind)*10**det(3) | |
| 43 | 43 | ! can use either specific interface fvn_zi_sparse_solve |
| 44 | 44 | ! either generic one fvn_sparse_solve |
| 45 | 45 | ! parameter det is optional |
| 46 | 46 | call fvn_zi_sparse_solve(n,nz,A,Ti,Tj,B,x,status,det) |
| 47 | 47 | write(*,*) |
| 48 | -write(*,*) "Sparse Det as solve option= ",det | |
| 48 | +write(*,*) "Sparse Det as solve option= ",cmplx(det(1),det(2),kind=dp_kind)*10**det(3) | |
| 49 | 49 | write(*,*) |
| 50 | 50 | write(*,*) "Solution :" |
| 51 | 51 | write(*,fmcmplx) x |
fvn_test/test_sparse_zl.f90
| ... | ... | @@ -9,7 +9,7 @@ |
| 9 | 9 | integer(kind=dp_kind),dimension(nz) :: Ti,Tj |
| 10 | 10 | complex(kind=dp_kind),dimension(n) :: B,x |
| 11 | 11 | integer(kind=dp_kind) :: status,i |
| 12 | -complex(kind=dp_kind) :: det | |
| 12 | +real(kind=dp_kind),dimension(3) :: det | |
| 13 | 13 | character(len=80) :: fmcmplx |
| 14 | 14 | |
| 15 | 15 | fmcmplx='(5("(",f8.5,",",f8.5,") "))' |
| 16 | 16 | |
| ... | ... | @@ -39,13 +39,13 @@ |
| 39 | 39 | ! either generic one fvn_sparse_det |
| 40 | 40 | call fvn_zl_sparse_det(n,nz,A,Ti,Tj,det,status) |
| 41 | 41 | write(*,*) |
| 42 | -write(*,*) "Sparse Det = ",det | |
| 42 | +write(*,*) "Sparse Det = ",cmplx(det(1),det(2),kind=dp_kind)*10**det(3) | |
| 43 | 43 | ! can use either specific interface fvn_zl_sparse_solve |
| 44 | 44 | ! either generic one fvn_sparse_solve |
| 45 | 45 | ! parameter det is optional |
| 46 | 46 | call fvn_zl_sparse_solve(n,nz,A,Ti,Tj,B,x,status,det) |
| 47 | 47 | write(*,*) |
| 48 | -write(*,*) "Sparse Det as solve option= ",det | |
| 48 | +write(*,*) "Sparse Det as solve option= ",cmplx(det(1),det(2),kind=dp_kind)*10**det(3) | |
| 49 | 49 | write(*,*) |
| 50 | 50 | write(*,*) "Solution :" |
| 51 | 51 | write(*,fmcmplx) x |