Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A linear algebra library that provides a user-friendly interface to several BLAS and LAPACK routines.

License

NotificationsYou must be signed in to change notification settings

jchristopherson/linalg

Repository files navigation

A linear algebra library that provides a user-friendly interface to several BLAS and LAPACK routines. The examples below provide an illustration of just how simple it is to perform a few common linear algebra operations. There is also an optional C API that is available as part of this library.

Status

Build StatusActions Status

Documentation

The documentation can be foundhere.

Building LINALG

CMakeThis library can be built using CMake. For instructions seeRunning CMake.

FPM can also be used to build this library using the provided fpm.toml.

fpm build

The LINALG library can be used within your FPM project by adding the following to your fpm.toml file.

[dependencies]linalg = {git ="https://github.com/jchristopherson/linalg" }

Standard Solution Example

This example solves a normally defined system of 3 equations of 3 unknowns.

program example    use iso_fortran_env    use linalgimplicit none    ! Local Variablesreal(dp):: a(3,3), b(3)integer(i32):: i, pvt(3)    ! Build the3-by-3 matrix A.    !     |123 |    ! A= |456 |    !     |780 |    a=reshape( &        [1.0d0,4.0d0,7.0d0,2.0d0,5.0d0,8.0d0,3.0d0,6.0d0,0.0d0], &        [3,3])    ! Build the right-hand-side vector B.    !     |-1 |    ! b= |-2 |    !     |-3 |    b= [-1.0d0,-2.0d0,-3.0d0]    ! The solution is:    !     |1/3 |    ! x= |-2/3 |    !     |0  |    ! Compute the LU factorizationcall lu_factor(a, pvt)    ! Compute the solution.  The results overwrite b.call solve_lu(a, pvt, b)    ! Display the results.print'(A)',"LU Solution: X ="print'(F8.4)', (b(i), i=1,size(b))end program

The above program produces the following output.

LU Solution: X =  0.3333 -0.6667  0.0000

Overdetermined System Example

This example solves an overdetermined system of 3 equations of 2 uknowns.

program example    use iso_fortran_env    use linalgimplicit none    ! Local Variablesreal(dp):: a(3,2), b(3)integer(i32):: i    ! Build the3-by-2 matrix A    !     |21 |    ! A= |-31 |    !     |-11 |    a=reshape([2.0d0,-3.0d0,-1.0d0,1.0d0,1.0d0,1.0d0], [3,2])    ! Build the right-hand-side vector B.    !     |-1 |    ! b= |-2 |    !     |1 |    b= [-1.0d0,-2.0d0,1.0d0]    ! The solution is:    ! x= [0.13158,-0.57895]**T    ! Compute the solution via a least-squares approach.  The results overwrite    ! the first2 elementsin b.call solve_least_squares(a, b)    ! Display the resultsprint'(A)',"Least Squares Solution: X ="print'(F9.5)', (b(i), i=1,size(a,2))end program

The above program produces the following output.

Least Squares Solution: X =  0.13158 -0.57895

Eigen Analysis Example

This example computes the eigenvalues and eigenvectors of a mechanical system consisting of several masses connected by springs.

! This is an example illustrating the use of the eigenvalue and eigenvector! routinesto solve a free vibration problem of3 masses connected by springs.!!     k1           k2           k3           k4! |-\/\/\-| m1 |-\/\/\-| m2 |-\/\/\-| m3 |-\/\/\-|!! As illustrated above, the system consists of3 masses connected by springs.! Spring k1 and spring k4 connect the end massesto ground.  The equations of! motion for this system are as follows.!! | m100 | |x1"|   | k1+k2  -k2      0  | |x1|   |0|! | 0   m2  0 | |x2"|+ |-k2  k2+k3-k3 | |x2|= |0|! |00   m3| |x3"|   |   0    -k3    k3+k4| |x3|   |0|!! Notice: x1"= the second time derivative of x1.program example    use iso_fortran_env    use linalgimplicit none    ! Define the model parametersreal(dp),parameter:: pi=3.14159265359d0real(dp),parameter:: m1=0.5d0real(dp),parameter:: m2=2.5d0real(dp),parameter:: m3=0.75d0real(dp),parameter:: k1=5.0d6real(dp),parameter:: k2=10.0d6real(dp),parameter:: k3=10.0d6real(dp),parameter:: k4=5.0d6    ! Local Variablesinteger(i32):: i, jreal(dp):: m(3,3), k(3,3), natFreq(3)complex(dp):: vals(3), modeShapes(3,3)    ! Define the mass matrix    m=reshape([m1,0.0d0,0.0d0,0.0d0, m2,0.0d0,0.0d0,0.0d0, m3], [3,3])    ! Define the stiffness matrix    k=reshape([k1+ k2,-k2,0.0d0,-k2, k2+ k3,-k3,0.0d0,-k3, k3+ k4], &        [3,3])    ! Compute the eigenvalues and eigenvectors.call eigen(k, m, vals, vecs= modeShapes)    ! Sort the eigenvalues and eigenvectorscall sort(vals, modeShapes)    ! Compute the natural frequency values, andreturn them with units of Hz.      ! Notice, all eigenvalues and eigenvectors arereal for this example.    natFreq=sqrt(real(vals))/ (2.0d0* pi)    ! Display the natural frequency and mode shape values.print'(A)',"Modal Information:"do i=1,size(natFreq)print'(AI0AF8.4A)',"Mode", i,": (", natFreq(i)," Hz)"print'(F10.3)', (real(modeShapes(j,i)), j=1,size(natFreq))end doend program

The above program produces the following output.

Modal Information:Mode 1: (232.9225 Hz)    -0.718    -1.000    -0.747Mode 2: (749.6189 Hz)    -0.419    -0.164     1.000Mode 3: (923.5669 Hz)     1.000    -0.184     0.179

Sparse Matrix Example

The following example solves a sparse system of equations using a direct solver. The solution is compared to the solution of the same system of equations but in dense format for comparison.

program example    use iso_fortran_env    use linalgimplicit none    ! Local Variablesinteger(int32):: ipiv(4)real(real64):: dense(4,4), b(4), x(4), bc(4)    type(csr_matrix):: sparse    ! Build the matrices as dense matrices    dense=reshape([ &5.0d0,0.0d0,0.0d0,0.0d0, &0.0d0,8.0d0,0.0d0,6.0d0, &0.0d0,0.0d0,3.0d0,0.0d0, &0.0d0,0.0d0,0.0d0,5.0d0], [4,4])    b= [2.0d0,-1.5d0,8.0d0,1.0d0]    ! Convertto sparse (CSRformat)    ! Note, theassignmentoperator is overloadedto allow conversion.    sparse= dense    ! Compute the solutionto the sparse equationscall sparse_direct_solve(sparse, b, x)  ! Results storedin x    !Print the solutionprint"(A)","Sparse Solution:"print*, x    ! Perform a sanity check on the solution    ! Note, matmul is overloadedto allow multiplication with sparse matrices    bc=matmul(sparse, x)print"(A)","Computed RHS:"print*, bcprint"(A)","Original RHS:"print*, b    ! For comparison, solve the dense system via LU decompositioncall lu_factor(dense, ipiv)call solve_lu(dense, ipiv, b)   ! Results storedin bprint"(A)","Dense Solution:"print*, bend program

The above program produces the following output.

Sparse Solution:  0.40000000000000002      -0.18750000000000000        2.6666666666666665       0.42500000000000004     Computed RHS:   2.0000000000000000       -1.5000000000000000        8.0000000000000000        1.0000000000000000Original RHS:   2.0000000000000000       -1.5000000000000000        8.0000000000000000        1.0000000000000000Dense Solution:  0.40000000000000002      -0.18750000000000000        2.6666666666666665       0.42499999999999999

External Libraries

Here is a list of external code libraries utilized by this library.

The dependencies do not necessarily have to be installed to be used. The build will initially look for installed items, but if not found, will then download and build the latest version as part of the build process.


[8]ページ先頭

©2009-2025 Movatter.jp