PVSim — Semiconductor Physics Analysis and Research Code
v1.0 · MIT · Python 3.10+ · Sesame (NIST)
Simulateur TCAD 1D/2D drift-diffusion pour cellules solaires, avec optimisation bayésienne automatique et assistant LLM. Fonctionne 100 % localement — aucune clé API requise en configuration minimale.
Installation
Via pip
pip install pvsim-pv
# Stack complète pour la recherche (recommandé)
pip install "pvsim-pv[tcad,botorch]"
pip install git+https://github.com/usnistgov/sesame.git
Note Sesame : le solveur TCAD NIST n'est pas publié sur PyPI. L'installation via git est requise séparément.
Extras disponibles :
| Extra | Contenu |
|---|---|
tcad |
Numba (JIT pour Sesame) |
botorch |
PyTorch CPU + BoTorch (optimisation GP avancée) |
workers |
Celery + Redis (simulations asynchrones distribuées) |
llm-local |
Ollama (assistant LLM local, 0 clé API) |
llm-cloud |
Anthropic / OpenAI / Mistral / Gemini |
materials |
mp-api + pymatgen (Materials Project en ligne) |
all |
Tout ce qui précède |
Commandes disponibles après installation :
pvsim-web # Serveur web Flask → http://localhost:5000
pvsim-tui # CLI interactif (TUI Rich)
pvsim run config.json # Simulation batch depuis un fichier JSON
# 🔑 Gestion des clés API et de la configuration
pvsim-config # Assistant interactif pour générer le fichier .env
pvsim-config --set MP_API_KEY=votre_cle # Configurer rapidement Materials Project
pvsim-config --set OPENAI_API_KEY=xxx # Configurer l'assistant LLM
Via Docker
Avec Docker Compose (Recommandé pour le développement)
git clone https://github.com/Quantum-ARISE-Acad/PVSim.git
cd PVSim
pvsim-config --env # Génère un fichier .env propre
# Éditer .env — définir SESAME_WEB_SECRET
docker compose up
# → http://localhost:5000
La stack Docker Compose inclut : serveur web Flask, 2 workers Celery, Redis, scheduler Beat, et Flower (monitoring). Le solveur Sesame et toutes les dépendances scientifiques sont pré-installés dans l'image.
# Modes alternatifs
docker compose run --rm cli # CLI interactif
docker compose run --rm ai pvsim run cfg.json # Batch
docker compose --profile llm up # + Ollama LLM local
docker compose up --scale worker=4 # Scaler les workers
Avec l'image Docker Hub (Production)
Si vous ne voulez pas cloner le dépôt, vous pouvez utiliser l'image pré-construite publiée sur Docker Hub (via le pipeline automatisé) :
# Télécharger la dernière image publiée
docker pull <DOCKERHUB_USERNAME>/pvsim:latest
# Lancer le serveur web
docker run -p 5000:5000 -e SESAME_WEB_SECRET=votre_secret <DOCKERHUB_USERNAME>/pvsim:latest
Depuis les sources
git clone https://github.com/Quantum-ARISE-Acad/PVSim.git
cd PVSim
python -m venv .venv && source .venv/bin/activate
pip install git+https://github.com/usnistgov/sesame.git
pip install -r requirements.txt
cp .env.example .env
pvsim-web # ou : pvsim run configs/silicon_homo.json
🔬 Ce que PVSim fait
PVSim est un solveur drift-diffusion 1D et 2D aux différences finies, conçu pour être aussi accessible qu'une application web tout en restant suffisamment robuste pour la publication scientifique.
Comportement par défaut : PVSim reproduit exactement les résultats de base de SCAPS-1D par défaut. Les modèles avancés (mobilité Masetti, rétrécissement de bande, recombinaisons Auger et radiatives) sont strictement optionnels et peuvent être activés sélectivement via la configuration de la simulation.
PVSim constitue un pipeline complet : config JSON → solveur Sesame → métriques IV → optimisation bayésienne → rapport PDF.
- Résout le système couplé Poisson et continuité (drift-diffusion) en régime stationnaire via le solveur Sesame (NIST).
- Extrait les métriques photovoltaïques standardisées (Voc, Jsc, FF, PCE).
- Calcule les indicateurs macroscopiques (résistances série et shunt, courants de saturation) via les modèles équivalents à 1 ou 2 diodes.
- Valide automatiquement les sorties de simulation (conservation de la charge, continuité du courant) pour éviter la publication d'artefacts numériques non physiques.
- L'optimiseur Bayésien (Optuna / BoTorch) explore automatiquement l'espace des paramètres physiques pour maximiser l'efficacité.
Types de simulation (27 routés)
| Catégorie | Types |
|---|---|
| Jonctions simples | homojunction, homojunction_2d, heterojunction, heterojunction_2d, graded_heterojunction |
| Multicouches | multi_layer (jusqu'à 7 couches) |
| Multi-jonctions | tandem, triple_junction |
| Défauts | with_defects, continuous_defects, grain_boundaries, grain_boundary_2d |
| Études paramétriques | parametric_sweep, optimize_thickness, temperature_study, variable_illumination, spectrum_study |
| Couplages avancés | electro_thermal_study, degradation_study, transient_photovoltage |
| Caractérisations | quantum_efficiency, spectral_response, capacitance_voltage, luminescence, ebic_simulation, contact_study, equivalent_circuit |
Matériaux intégrés
15 matériaux avec paramètres validés (Nc, Nv, μ, τ, Cn/p Auger, B_rad, χ, Eg) :
| Matériau | Eg (eV) | Type de gap | Référence |
|---|---|---|---|
| Si | 1.1247 | Indirect | Richter 2012, Klaassen 1992 |
| Ge | 0.664 | Indirect | NREL |
| GaAs | 1.424 | Direct | NREL |
| GaP | 2.272 | Indirect | NREL |
| InP | 1.344 | Direct | NREL |
| CdTe | 1.50 | Direct | NREL |
| CdS | 2.42 | Direct | NREL |
| CIGS | 1.30 | Direct | Ramanathan 2003 |
| CZTS | 1.50 | Direct | Kauk-Kuusik 2017 |
| MAPbI3 | 1.58 | Direct | Richter 2016 |
| CsPbI3 | 1.73 | Direct | Katan 2019 |
| FAPbI3 | 1.48 | Direct | Littérature |
| GaInP | 1.87 | Direct | Vurgaftman 2001 |
| AlGaAs | 1.80 | Direct | Vurgaftman 2001 |
| GaN | 3.43 | Direct | Monemar 1974 |
Extension en ligne via Materials Project (clé MATERIALS_PROJECT_API_KEY) et OPTIMADE.
Format de configuration JSON
{
"simulation_name": "si_homo_baseline",
"simulation_type": "homojunction",
"materials": { "active": "Si" },
"geometry": {
"thickness_n": 5e-5,
"thickness_p": 2e-4,
"nx": 100
},
"doping": {
"n_region": 1e17,
"p_region": 1e15
},
"voltages": { "start": 0.0, "stop": 0.7, "points": 50 },
"illumination": {
"enabled": true,
"photon_flux": 2.5e17,
"absorption_coefficient": 1e4
}
}
39+ configurations d'exemple dans configs/. La notation pointée "doping.n_region" est utilisée par l'optimiseur pour mapper les paramètres sur la config.
Optimisation bayésienne
# Via l'API REST
curl -X POST http://localhost:5000/api/optimize/create \
-H "Content-Type: application/json" \
-d '{
"name": "opt_si",
"sim_type": "homojunction",
"engine": "optuna", "sampler": "tpe",
"n_trials": 200,
"objectives": ["efficiency"],
"param_ranges": [
{"name": "doping.n_region", "type": "log_float", "low": 1e15, "high": 1e18},
{"name": "geometry.thickness_p", "type": "log_float", "low": 5e-5, "high": 2e-3}
]
}'
Moteurs : Optuna TPE (défaut), Optuna GP, BoTorch qLogEI, CMA-ES, Random.
Post-optimisation : surrogate ML (Random Forest / GBM / GP), analyse de sensibilité Sobol (SALib), prédiction inverse (~1 ms vs ~5 s pour Sesame).
API REST — routes principales
POST /api/simulate → Lancer une simulation
GET /api/results/<id> → Résultats JSON
GET /api/simulation/<id>/progress-stream → SSE temps réel
POST /api/optimize/create → Job d'optimisation
POST /api/optimize/<id>/run
GET /api/optimize/<id>/results
POST /api/optimize/<id>/sensitivity → Analyse Sobol
POST /api/optimize/<id>/predict → Prédiction surrogate
GET /api/health → État des services
GET /api/docs/ → Swagger interactif
Architecture
PVSim/
├── router.py SesameRouter — dispatch vers 27 modules (~115 kB)
├── main.py CLI batch (entrée fichier JSON)
├── simulations/ ~55 modules (physique, matériaux, validation)
├── optimization/ Optuna + BoTorch + SALib + Surrogate
├── web/ Flask + SQLite + ReportLab
├── cli/ 11 commandes batch
├── cli_interactif/ TUI Rich (17 écrans)
├── pvsim_agent/ Agent LLM multi-provider
├── workers/ Celery distribué
└── configs/ 39+ configurations JSON d'exemple
Variables d'environnement clés
SESAME_WEB_SECRET=<clé-32-hex> # Obligatoire en production
PVSim_WEB_PORT=5000
PVSim_DB_PATH=/app/data/pvsim.db
REDIS_URL=redis://redis:6379/0
PVSim_LLM_PROVIDER=ollama # ollama | anthropic | openai | mistral | gemini
PVSim_LLM_MODEL=llama3.2
MATERIALS_PROJECT_API_KEY= # Optionnel
Voir .env.example pour la liste complète.
Tests
python -m pytest tests/ -v
python -m pytest tests/ -v -m unit # Sans Sesame
pvsim run configs/silicon_homo.json --verbose
204+ tests. Marqueurs : unit, integration, slow, benchmark.
Citer
@software{PVSim2026,
title = {PVSim — Semiconductor Physics Analysis and Research Code},
version = {2.1.0},
year = {2026},
url = {https://github.com/Quantum-ARISE-Acad/PVSim},
license = {MIT}
}
Citer également : Sesame (NIST) — https://pages.nist.gov/sesame/
Liens : Documentation · Guide développeur · Déploiement · Changelog · Manuel utilisateur
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pvsim_pv-1.0.5.tar.gz.
File metadata
- Download URL: pvsim_pv-1.0.5.tar.gz
- Upload date:
- Size: 684.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13e5005c355351e54a9ec3f1b453c62d2bfa3ac92bf5663cc3e565cc61b03707
|
|
| MD5 |
97f09620b4a67414e972e83a9024ff9d
|
|
| BLAKE2b-256 |
3d2b90976d0f7b3e075a95e9d12ca8ad806ca41590295c7ec929d25f7735b2c9
|
File details
Details for the file pvsim_pv-1.0.5-py3-none-any.whl.
File metadata
- Download URL: pvsim_pv-1.0.5-py3-none-any.whl
- Upload date:
- Size: 741.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f1fe003b1f5252c318362839545b02f2901767c838b70167c95dff331c9d32f
|
|
| MD5 |
40553c76a48d553b475326c772d5f0d0
|
|
| BLAKE2b-256 |
1179b97e777a3af3a20017ba9b5c775e9df7c3ffaf97a62274fc9d3fe516e1ca
|