# 3pc-lambend

`3pc-lambend` is a Python library for analysis of shear deformable anisotropic laminates under transverse loading. It provides a `Lambend` class to calculate displacements, strains, forces, and moments based on specified load cases and boundary conditions.

## Installation

Use the package manager [pip](https://pip.pypa.io/en/stable/) to install `3pc-lambend`. Since the package and its dependencies are available on PyPI, you can install them directly:

```bash
pip install 3pc-lambend
```

## API Reference

### `Lambend` Class

The primary component of this package is the `Lambend` class, which takes a panel and a load case to compute detailed bending metrics.

```python
from lambend.lambend import Lambend
```

#### Required Parameters

When initializing `Lambend`, the following parameters are required:

*   **`panel`** *(Panel)*: An instance of the `Panel` class (from `3pc-panel`) containing the laminate definition and geometry.
*   **`loads`** *(Loads)*: An instance of the `Loads` class (from `3pc-loads`) containing the load case and environmental conditions.
*   **`number_of_terms`** *(int)*: Number of terms used in the analysis.
*   **`number_of_points_x`** *(int)*: Number of points in the x-direction for grid evaluation.
*   **`number_of_points_y`** *(int)*: Number of points in the y-direction for grid evaluation.

#### Calculated Properties

The class automatically calculates the following properties lazily:

*   **`NT`, `NC`**: Thermal and hygral in-plane loads on the laminate.
*   **`u`, `v`, `w`**: Unknown coefficients for displacements $u_{mn}, v_{mn}, w_{mn}$.
*   **`phix`, `phiy`**: Unknown coefficients for rotations $\phi_{x_{mn}}, \phi_{y_{mn}}$.
*   **`loc`**: A list of locations $(x, y)$ where properties are computed.
*   **`uloc`, `vloc`, `wloc`**: Displacements computed at each location.
*   **`phixloc`, `phiyloc`**: Rotations computed at each location.
*   **`ex0Bloc`, `ey0Bloc`, `gxy0Bloc`**: Mid-plane strains due to bending computed at each location.
*   **`kx0Bloc`, `ky0Bloc`, `kxy0Bloc`**: Mid-plane curvatures due to bending computed at each location.
*   **`gxz0Bloc`, `gyz0Bloc`**: Transverse shear strains due to bending computed at each location.
*   **`NMBloc`**: In-plane forces and moments $(N_{xx}, N_{yy}, N_{xy}, M_{xx}, M_{yy}, M_{xy})$ due to bending computed at each location.
*   **`QBloc`**: Transverse shear forces $(Q_{yz}, Q_{xz})$ due to bending computed at each location.

### Methods

#### `Lambend.fromDict(**kwargs)`

Initializes a `Lambend` instance using a dictionary of keyword arguments.

---

## Usage Examples

### Basic Initialization

Below is an example of performing a bending analysis on a panel under a specific load case.

```python
from panel.panel import Panel
from loads.loads import Loads
from lambend.lambend import Lambend

# Assuming pnl (Panel) and ld (Loads) are already defined
lb = Lambend(panel=pnl, loads=ld, number_of_terms=5, number_of_points_x=10, number_of_points_y=10)

# Access calculated displacement at first location
print("w location:", lb.loc[0])
print("w displacement:", lb.wloc[0])
```

## Commands

The package provides a command-line interface entry point. After installing, you can run the application using:

```bash
lambend input.cfg
```

*(This entry point is defined in `lambend.__main__:main`)*

### Options

*   **`config`** *(positional)*: Specify the configuration file (`.cfg`) to run the analysis.
*   **`-h, --help`**: Show the help message and exit.
*   **`-v, --version`**: Show the version number.
*   **`-s, --sample`**: Copy example files (materials, plies, laminates, etc.) to the current directory.

### Configuration File (`input.cfg`)

The `lambend` command requires a configuration file (typically named `input.cfg` or `lambend.cfg`). Below is an example:

```ini
[files]
materials = materials.json
plies = plies.json
laminates = laminates.json
panels = panels.json
loads = loads.json
output = output.txt

[analysis]
number_of_terms = 5
number_of_points_x = 10
number_of_points_y = 10
output_K = true
output_P = true
```

#### `[files]` Section

This section defines the paths to the required input JSON files and the desired output file:

*   **`materials`**: Path to the materials JSON file. Follows the format expected by [`3pc-material`](https://pypi.org/project/3pc-material/).
*   **`plies`**: Path to the plies JSON file. Follows the format expected by [`3pc-plies`](https://pypi.org/project/3pc-plies/).
*   **`laminates`**: Path to the laminates JSON file. Follows the format expected by [`3pc-laminate`](https://pypi.org/project/3pc-laminate/).
*   **`panels`**: Path to the panels JSON file. Follows the format expected by [`3pc-panel`](https://pypi.org/project/3pc-panel/).
*   **`loads`**: Path to the loads JSON file. Follows the format expected by [`3pc-loads`](https://pypi.org/project/3pc-loads/).
*   **`output`**: Path to the text file where the analysis results will be written.

#### `[analysis]` Section

This section specifies the analysis settings:

*   **`number_of_terms`**: The number of terms used in the series expansion for the analysis.
*   **`number_of_points_x`**: The number of points evaluated in the x-direction.
*   **`number_of_points_y`**: The number of points evaluated in the y-direction.
*   **`output_K`**: Boolean indicating whether to output the stiffness matrix.
*   **`output_P`**: Boolean indicating whether to output the load vector.

## Citation

If you use this library in your research or work, please cite it as follows:

**APA Format:**
> Rastogi, N., & Seresta, O. (2026). *3pc-lambend: Python library for analysis of shear deformable anisotropic laminates under transverse loading*. PyPI. https://pypi.org/project/3pc-lambend/

**BibTeX:**
```bibtex
@software{3pc_lambend,
  author = {Rastogi, Naveen and Seresta, Omprakash},
  title = {3pc-lambend: Python library for analysis of shear deformable anisotropic laminates under transverse loading},
  year = {2026},
  url = {https://pypi.org/project/3pc-lambend/}
}
```
