easifemBase (or, Base) library is the low level component in easifem. It contains routines and derived types which are helpful for implementing numerical methods for solving differential equation.|
In Base library, we do not use object-oriented programming concepts and mainly use multiple dispatch approach. This approach improves the flexibility and speed of easifemBase. All user-defined datatypes are declared in the BaseType
module, and all methods are exposed through BaseMethods
modules. In the Base library string_class
is the only exception, wherein Object-oriented paradigm has been used. Currently, easifemBase has interface with BLAS95, Lapack95, Sparsekit, Metis, PlPlot, SuperLU, ARPACK, etc.
USE easifemBase
or
USE BaseType
USE BaseMethods
EASIFEM requires following software packages to be installed on the system.
Component | Version | Latest tested version | Comment |
---|---|---|---|
Gfortran | >=9.0 | 12.0 | GNU Fortran compiler |
GCC | >=9.0 | 12.0 | GNU-compiler collection |
OpenMP | >= 4.5 | Multithread shared memory parallelisation | |
Curl | >=7.87 | 7.87 | A command-line utility for transferring data from or to a remote server |
Git | >=2.34 | 2.34.1 | A version control system and command-line utility for downloading packages from GitHub |
Cmake | >=3.19 | 3.22.4 | Cross-platform family of tools designed to build, test and package software |
Ninja-build | >=1.10 | 1.11.0 | Build system |
Python3 | >=3.7 | 3.11.0 | Scripting language |
Pip | >=20 | 23.1.0 | Command line tool for downloading python packages |
LAPACK | >=3.11.0 | 3.11.0 | Linear algebra package |
OpenBlas | >= 0.3.20 | 0.3.30 | Optimize BLAS library |
HDF5 | >=1.10 | 1.10.7 | High-performance data software-library and file-format |
PlPlot | >=5.15.0 | 5.15.0 | Cross-platform, scientific graphics plotting library |
Boost | |||
Gnuplot | >=5.0 | 5.4 | Portable command-line driven graphing utility |
Doxygen | >=1.9.1 | 1.9.1 | documentation generation |
GTK-4 | n |
EASIFEM depends upon the following external packages (extpkgs) that are not shipped with the source-code.
extpkg | description | command |
---|---|---|
OpenBlas | Highly optimized BLAS | easifem install openblas |
SuperLU | Direct solution of large, sparse, nonsymmetric systems of linear equations | easifem install superlu |
LIS | Linear interative solver | easifem install lis |
METIS | Mesh partitioning library | easifem install metis |
SCOTCH | Mesh partitioning library | easifem install scotch |
ARPACK | Eigensolver for sparse matrices | easifem install arpack |
FFTW | Fast Fourier Transform | easifem install fftw |
GTK-Fortran | Fortran bindings for GTK-4 library | easifem install gtk-fortran |
LAPACK95 | Fortran 95 interface for Lapack library | easifem install lapack95 |
Sparsekit | Fortran library for sparse matrices | easifem install sparsekit |
Gmsh | Finite element mesh generator | easifem install gmsh |
You can use following instructions to install easifemBase depending upon your system.
The Base library consists two components:
- BaseType
BaseType.F90
, which contains the user-defined data-type. You can see the list of user-defined data type here - BaseMethods
BaseMethods.F90
, contains the modules (each module defines the routines for data-types defined inBaseType.F90
.) The list of modules defined in BaseMethods can be found here
The source directory is shown in figure given below. The source directory has two directories
- π
modules
- π
submodules
The modules
directory mainly contains header and interface of methods. The implementation is given in submodules directory.
:::info
Both BaseType.F90
and BaseMethods.F90
are included in modules
directory.
:::
Let us understand the structure of the Base library by an example of CSRSparsity_
data type.
- First, we define
CSRSparsity_
inBaseType.F90
as
TYPE :: CSRSparsity_
INTEGER(I4B) :: nnz = 0
INTEGER(I4B) :: ncol = 0
INTEGER(I4B) :: nrow = 0
LOGICAL(LGT) :: isSorted = .FALSE.
LOGICAL(LGT) :: isInitiated = .FALSE.
LOGICAL(LGT) :: isSparsityLock = .FALSE.
LOGICAL(LGT) :: isDiagStored = .FALSE.
INTEGER(I4B), ALLOCATABLE :: IA(:)
INTEGER(I4B), ALLOCATABLE :: JA(:)
INTEGER(I4B), ALLOCATABLE :: idiag(:)
TYPE(IntVector_), ALLOCATABLE :: row(:)
TYPE(DOF_) :: idof
!! DOF for row
TYPE(DOF_) :: jdof
!! DOF for columns
END TYPE CSRSparsity_
- Then we create a directory called
CSRSparsity
in bothmodules
andsubmodules
directory. - In
modules/CSRSparsity
we createCSRSparsity_Method.F90
file. - In
modules/CSRSparsity/CSRSparsity_Method.F90
we define a moduleCSRSparsity_Method
(same name as file). - In
CSRSparsity_Method
module, we only define interface of methods. In this way, this file can be considered as header file. See, the example given below: - In
submodules/CSRSparsity
, we create[email protected]
, which contains the contruction related routines. - Also, we create
[email protected]
, which include methods related to input and output.
MODULE CSRSparsity_Method
USE GlobalData
USE BaseType
IMPLICIT NONE
PRIVATE
INTERFACE Initiate
MODULE SUBROUTINE csr_initiate1(obj, ncol, nrow, idof, jdof)
TYPE(CSRSparsity_), INTENT(INOUT) :: obj
INTEGER(I4B), INTENT(IN) :: ncol, nrow
TYPE(DOF_), OPTIONAL, INTENT(IN) :: idof
!! DOF for row
TYPE(DOF_), OPTIONAL, INTENT(IN) :: jdof
!! DOF for column
END SUBROUTINE csr_initiate1
END INTERFACE Initiate
INTERFACE Display
MODULE SUBROUTINE csr_Display(obj, Msg, UnitNo)
TYPE(CSRSparsity_), INTENT(IN) :: obj
CHARACTER(*), INTENT(IN) :: Msg
INTEGER(I4B), OPTIONAL, INTENT(IN) :: UnitNo
END SUBROUTINE csr_Display
END INTERFACE Display
END MODULE CSRSparsity_Method
SUBMODULE(CSRSparsity_Method) ConstructorMethods
USE BaseMethod
IMPLICIT NONE
CONTAINS
MODULE PROCEDURE csr_initiate1
obj%nnz = 0
obj%ncol = ncol
obj%nrow = nrow
END PROCEDURE csr_initiate1
END SUBMODULE ConstructorMethods
SUBMODULE(CSRSparsity_Method) IOMethods
USE BaseMethod
IMPLICIT NONE
CONTAINS
MODULE PROCEDURE csr_Display
CALL Display(Msg, unitNo=unitNo)
CALL Display(obj%nnz, "# NNZ : ", unitNo=unitNo)
END PROCEDURE csr_Display
END SUBMODULE IOMethods
Coming soon.