# EASIFEM

Expandable And Scalable Infrastructure for Finite Element Methods, EASIFEM, is Modern Fortran framework for solving partial differential equations (PDEs) using finite element methods. EASIFEM "eases" the efforts to develop scientific programs in Fortran. It is meant for researchers, scientists, and engineers using Fortran to implement numerical methods for solving the initial-boundary-value problems (IBVPs). EASIFEM is equipped with both low- and high-level datatypes and classes for implementing finite element methods.

Following are some features which may interest you.

- Building, installing, updating, and linking EASIFEM is painless.
- EASIFEM provides much helpful functionality, such as Mesh-generation, Domain creation, a massive list of shape functions, 1D/2D/3D elements, 1D/2D/3D plotting, file input-output, constitutive material laws, linear solvers, sparse-matrices, full support for performing linear algebra analysis, Fast Fourier Transform, among many other features.
- One of the strengths of EASIFEM is its comprehensive documentation and command line interface.
- EASIFEM comes with snippets and automation scripts for vs-code and vim users.
- Expanding EASIFEM as per your requirement; you can link a new library with EASIFEM or link EASIFEM with your own software library.

Currently, EASIFEM focuses on finite element methods. Eventually, the library will have high-level objects for implementing multiscale finite element methods, stochastic finite element methods, uncertainty quantification, mesh-free methods, finite volume methods, material point methods, and particle methods (such as SPH and DEM).

## Structure of easifem

EASIFEM consists following three hierarchical components:

**Base**`libeasifemBase`

**Classes**`libeasifemClasses`

**Kernels**`libeasifemKernels`

## Base

`easifemBase`

(henceforth read as Base) contains a lot of valuable routines and derived types. In Base, 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.

Currently, easifemBase has interface with BLAS95, Lapack95, Sparsekit, Metis, PlPlot, SuperLU, ARPACK, etc.

## Classes

`easifemClasses`

(hereafter, read as the Classes) defines high-level derived types such as domain, mesh, fields, linear solvers, etc. Classes are primarily based on object-oriented programming. Most of the functionality of Classes comes from the Base. In other words, most of the computation is deployed to the Base library. This approach improves flexibility at the cost of reducing some speed.

Currently, easifemBase has interface with HDF5, Gmsh, PlPlot, GTK4, PETsc, Matplotlib, Python, Lua, etc. In the future, we will add interfaces to many other useful fortran and C libraries.

## Kernels

`easifemKernels`

(henceforth, read as Kernels) contains physics simulators. For example, we have:

- AbstractKernel
- Elasticity analysis of soils and solids
- Elastodynamics analysis of soils and solids
- Elasto-plastic analysis of soils and solids
- Large deformation with HyperElastic material behavior
- Heat conduction, convection, radiation in soils and solids
- Darcy-flow in fully saturated and variably saturated soils
- DarcyBrinkman flow in saturated soils
- Solver for convection-diffusion-reaction in single variable
- Stokes flow
- Incompressible and Isothermal Navier-Stokes Flow
- Space-Time Finite element methods

## Programing paradigm

EASIFEM manly follows two types of programming paradigm:

- Object-oriented-programming (OOP)
- Multi-dispatch programming.

## System requirements

Before installing the EASIFEM, please make sure your system is upto date and have requirements mentioned here.

## External packages

Before installing the EASIFEM, make sure to install the external packages on your system by following the details given here.