Paralution.src 3.97 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
! **************************************************************************
!
!    PARALUTION   www.paralution.com
!
!    Copyright (C) 2015  PARALUTION Labs UG (haftungsbeschränkt) & Co. KG
!                        Am Hasensprung 6, 76571 Gaggenau
!                        Handelsregister: Amtsgericht Mannheim, HRA 706051
!                        Vertreten durch:
!                        PARALUTION Labs Verwaltungs UG (haftungsbeschränkt)
!                        Am Hasensprung 6, 76571 Gaggenau
!                        Handelsregister: Amtsgericht Mannheim, HRB 721277
!                        Geschäftsführer: Dimitar Lukarski, Nico Trost
!
!    This program is free software: you can redistribute it and/or modify
!    it under the terms of the GNU General Public License as published by
!    the Free Software Foundation, either version 3 of the License, or
!    (at your option) any later version.
!
!    This program is distributed in the hope that it will be useful,
!    but WITHOUT ANY WARRANTY; without even the implied warranty of
!    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
!    GNU General Public License for more details.
!
!    You should have received a copy of the GNU General Public License
!    along with this program.  If not, see <http://www.gnu.org/licenses/>.
!
! **************************************************************************

!
!
! PARALUTION version 1.1.0 
!
!
MODULE Paralution

  USE Types
  USE Lists

  IMPLICIT NONE

CONTAINS

!--------------------------------------------------------------------
!> Call paralution solver
!--------------------------------------------------------------------
  SUBROUTINE ParalutionSolve(A, x, b, Solver)
!------------------------------------------------------------------------------
      INTERFACE
        SUBROUTINE paralution_solve(n, m, nnz, row_off, cols, rval, rhs,      &
        &                           atol, div, maxiter, x)                    &
        &                           BIND(C,name='paralution_solve')

          USE, intrinsic :: ISO_C_BINDING

          integer(KIND=C_INT), value, intent(IN)  :: n, m, nnz, maxiter
          real(KIND=C_DOUBLE), value, intent(IN)  :: atol, div
          integer(C_INT),             intent(IN)  :: row_off(n+1), cols(nnz)
          real(C_DOUBLE),             intent(IN)  :: rval(nnz), rhs(n)
          real(C_DOUBLE)                          :: x(n)

        END SUBROUTINE paralution_solve
      END INTERFACE
!------------------------------------------------------------------------------
      TYPE(Solver_t) :: Solver
      TYPE (Matrix_t), POINTER :: A
      REAL(KIND=dp), DIMENSION(:) :: x, b
!------------------------------------------------------------------------------
      CHARACTER(LEN=MAX_NAME_LEN) :: Prec, IterativeMethod
      REAL(KIND=dp) :: TOL, DIV
      INTEGER :: n, nnz, ierr, Rounds
      LOGICAL :: Found
!------------------------------------------------------------------------------
! NOT SUPPORTED - THIS IS JUST A TESTING VERSION
!
!      IterativeMethod = ListGetString( Params,'Linear System Iterative Method' )
!      Prec = ListGetString(Params,'Linear System Preconditioning', Found )
!
      CALL Info("Paralution", "BiCGStab", Level=3)
!
      TOL = ListGetConstReal( Solver%Values, &
           'Linear System Convergence Tolerance', Found )
      IF ( .NOT. Found ) TOL = 1.0d-6
!
      DIV = ListGetCReal( Solver%Values, &
        'Linear System Divergence Tolerance', Found)
      IF ( .NOT. Found ) DIV = 1.0d+8
!
      Rounds = ListGetInteger( Solver%Values, &
           'Linear System Max Iterations', Found )
      IF ( .NOT. Found ) Rounds = 1000
!
      n = A%NumberOfRows
      nnz = A%Rows(n+1)-1
!
      call paralution_solve(n, n, nnz, A%Rows, A%Cols, A%Values, b, TOL, &
      &                     DIV, Rounds, x)
!
  END SUBROUTINE ParalutionSolve
!------------------------------------------------------------------------------
END MODULE Paralution
!------------------------------------------------------------------------------