Analyse du solveur EF MITC4 + tetra 3D¶
Objectif¶
Le projet fournit maintenant un socle de solveur elements finis lineaire statique utilisable en ligne de commande et comme librairie Python.
La base actuelle couvre:
- coques MITC4 via l'implementation existante et verifiee;
- solides 3D TET4 et TET10 avec elasticite lineaire isotrope;
- validation obligatoire du modele et du maillage avant resolution;
- analyse statique lineaire avec choix de methode lineaire;
- analyse modale TET4 avec masse coherente;
- analyse modale TET4 et TET10;
- analyse dynamique transitoire lineaire TET4/TET10 avec schema de Newmark; historique temporel, energies, chargement tabule et export CSV dedie;
- reponse harmonique frequentielle lineaire TET4/TET10 avec amplitudes, phases et export CSV dedie;
- contraintes/deformations TET4/TET10 avec von Mises, invariants et valeurs principales en post-traitement;
- resultantes MITC4 au centre: membrane, flexion et cisaillement transverse;
- contraintes locales MITC4 estimees aux faces superieure et inferieure;
- analyse statique non-lineaire TET4/TET10 en petits deplacements avec Newton et loi elastique non-lineaire cubique;
- loi elastoplastique Von Mises 3D simple avec retour radial et etat interne chemin-dependant stocke par point d'integration;
- audit boite blanche des matrices, vecteurs, ddl, connectivites et conditions aux limites;
- audit local par element: geometrie, materiau, ddl globaux, matrice locale, rang estime et valeurs propres extremes des matrices symetriques;
- audit de post-traitement par element: ddl globaux, deplacement de calcul local, deformations, contraintes, von Mises ou resultantes MITC4;
- estimation spectrale et conditionnement des petites matrices globales et matrices reduites;
- audit d'equilibre statique: residu libre, reactions, travail externe et energie interne secante;
- controles automatiques audites avec verdicts
PASS,WARNING,FAIL; - historique de convergence
solver.residual_historypour les solveurs lineaires; - entree JSON et sortie JSON documentees dans
docs/schema_json.md; - validation stricte du schema JSON avant construction du modele;
- guide court de creation de cas dans
docs/creer_cas.md; - configuration
ruffet commandes de controle dansdocs/controle_qualite.md; - exports CSV et VTU pour les resultats statiques, avec grandeurs solides principales, points d'integration, resultats nodaux et invariants quand disponibles;
- rapport JSON detaille de
check-mesh, avec composantes connectees, noeuds isoles, qualite elementaire, estimation de rang mecanique et contraintes par composante; - seuils qualite maillage centralises et documentes dans
docs/qualite_maillage.md; - conventions de post-traitement documentees dans
docs/conventions_resultats.md; - exemples JSON officiels verifies via API et CLI;
- snapshots JSON/CSV de non-regression sur les exemples officiels;
- verification automatique de la limite de 700 lignes par fichier Python;
- packaging
pyproject.tomlavec installation editable, dependance devruffet scriptqf-solver; - options CLI
--versionpour le solveur general et le lanceur MITC4; - API publique stable dans
solveur.api.
La continuation arc-length est disponible pour les chargements proportionnels sur les modeles TET4 non-lineaires actuellement supportes.
TET10 est implemente pour les analyses statiques lineaires, modales, dynamiques transitoires et non-lineaires en petits deplacements.
Architecture¶
Le nouveau paquet solveur/ est organise par responsabilite:
solveur/
api/ API publique load/check/solve/save
cli/ commandes terminal sans logique metier
core/ modele, ddl, assemblage, solveur, resultats
elements/ elements shell et solid separes
io/ lecture/ecriture JSON
materials/ materiaux coque et solide
mesh/ validation et qualite de maillage
post/ contraintes, deformations, audits et resultats derives
verification/ points d'entree de verification
examples/ modeles JSON officiels testes
Le paquet historique mitc4/ reste conserve pour ne pas casser les
verifications mecaniques deja validees.
Interfaces¶
CLI:
qf-solver check-mesh --input model.json --json-report mesh_report.json
qf-solver inspect --input model.json --markdown audit.md
qf-solver solve --input model.json --output results.json --audit-md audit_resolution.md --csv-dir csv_results --vtu result.vtu --audit-gate fail
qf-solver methods
qf-solver --version
python .\qf_solver.py check-mesh --input model.json --json-report mesh_report.json
python .\qf_solver.py inspect --input model.json --output audit.json
python .\qf_solver.py inspect --input model.json --markdown audit.md
python .\qf_solver.py inspect --input model.json --audit-gate warning
python .\qf_solver.py inspect --input model.json --output audit_values.json --detail values
python .\qf_solver.py solve --input model.json --output results.json
python .\qf_solver.py solve --input model.json --output results.json --audit-md audit_resolution.md
python .\qf_solver.py solve --input model.json --output results.json --csv-dir csv_results --vtu result.vtu
python .\qf_solver.py solve --input model.json --output results.json --audit-gate fail
python .\qf_solver.py solve --input model.json --output results.json --method cg
python .\qf_solver.py methods
python .\qf_solver.py --version
python .\qf_solver.py verify --quick
API Python:
from qf_solver import load_model, check_mesh, inspect_model, solve_model, save_result, save_audit_markdown, save_result_csv, save_result_vtu, list_methods
model = load_model("model.json")
report = check_mesh(model)
audit = inspect_model(model)
detailed_audit = inspect_model(model, detail="values")
save_audit_markdown(audit, "audit_inspection.md")
result = solve_model(model)
save_result(result, "results.json")
save_audit_markdown(result, "audit_resolution.md")
save_result_csv(result, "csv_results", model)
save_result_vtu(result, model, "result.vtu")
print(list_methods())
Analyses et methodes¶
Les methodes sont choisies dans le JSON via analysis ou surchargees depuis
la CLI avec --method.
Analyses disponibles:
linear_static: statique lineaire assemblee sous formeK u = f.modal: probleme generaliseK phi = lambda M phi, actuellement pour TET4/TET10.nonlinear_static: resolution incrementale avec force interne, tangente et convergence sur le residu, actuellement pour TET4/TET10.
Methodes lineaires:
direct/spsolve: resolution sparse directe de type LU.cg/conjugate_gradient: gradient conjugue pour systemes symetriques definis positifs.gmres: methode de Krylov pour systemes generaux.bicgstab: methode de Krylov pour systemes non symetriques.minres: methode Krylov pour systemes symetriques indefinis.
Parametre optionnel:
preconditioner: "jacobi"pour les methodes iteratives supportees.preconditioner: "ilu"pour factorisation LU incomplete sparse.
Methodes modales:
eigh: resolution dense robuste pour petits modeles et verification.eigsh/lanczos: extraction sparse des premiers modes.
Methodes dynamiques:
newmark: integration implicite Newmark en dynamique lineaire;newmark_average_acceleration: alias explicite du schema moyen inconditionnellement stable pour les cas lineaires usuels.
Methodes non-lineaires:
newton_raphson: tangente reassemblee a chaque iteration;modified_newton: tangente figee pendant un pas de charge;newton_line_search: Newton-Raphson avec recherche lineaire par backtracking sur la norme du residu;arc_length: continuation arc-length avec inconnues couplees deplacement/facteur de charge.
Le non-lineaire accepte aussi un controle de pas de charge adaptatif:
adaptive_load_steps: true;initial_load_increment,min_load_increment,max_load_increment;cutback_factoretgrowth_factor;- seuils
grow_below_iterationsetshrink_above_iterations.
Parametres arc-length disponibles:
target_load_factor;arc_length_radius;arc_length_load_scale;max_arc_steps;min_arc_length_radius.
Ces noms sont exposes par:
python .\qf_solver.py methods
Format JSON v1¶
Le schema complet d'entree/sortie est maintenu dans docs/schema_json.md.
L'exemple minimal ci-dessous reste volontairement court.
Le lecteur JSON refuse les champs structurants invalides avant la construction du modele: racine non objet, champs requis manquants, connectivites de mauvaise taille, indices hors bornes, materiaux inconnus, valeurs non numeriques, analyses/methodes incompatibles et ddl inconnus.
{
"analysis": {"type": "linear_static", "method": "direct"},
"nodes": [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
"elements": [
{"type": "TET4", "nodes": [0, 1, 2, 3], "material": "steel"}
],
"materials": {
"steel": {"type": "isotropic_3d", "E": 210000000000.0, "nu": 0.3, "density": 7800.0}
},
"fixed_dofs": [
{"node": 0, "dofs": ["UX", "UY", "UZ"]},
{"node": 2, "dofs": ["UX", "UY", "UZ"]},
{"node": 3, "dofs": ["UX", "UY", "UZ"]}
],
"loads": [
{"node": 1, "dof": "UX", "value": 1000.0}
]
}
Exemple lineaire iteratif preconditionne:
{
"analysis": {
"type": "linear_static",
"method": "bicgstab",
"preconditioner": "ilu",
"rtol": 1.0e-10
},
"nodes": [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
"elements": [
{"type": "TET4", "nodes": [0, 1, 2, 3], "material": "steel"}
],
"materials": {
"steel": {"type": "isotropic_3d", "E": 210000000000.0, "nu": 0.3}
},
"fixed_dofs": [
{"node": 0, "dofs": ["UX", "UY", "UZ"]},
{"node": 2, "dofs": ["UX", "UY", "UZ"]},
{"node": 3, "dofs": ["UX", "UY", "UZ"]}
],
"loads": [
{"node": 1, "dof": "UX", "value": 1000.0}
]
}
Exemple modal:
{
"analysis": {"type": "modal", "method": "eigh", "modes": 3},
"nodes": [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
"elements": [
{"type": "TET4", "nodes": [0, 1, 2, 3], "material": "steel"}
],
"materials": {
"steel": {"type": "isotropic_3d", "E": 210000000000.0, "nu": 0.3, "density": 7800.0}
},
"fixed_dofs": [
{"node": 0, "dofs": ["UX", "UY", "UZ"]},
{"node": 2, "dofs": ["UX", "UY", "UZ"]},
{"node": 3, "dofs": ["UX", "UY", "UZ"]}
]
}
Exemple TET10 lineaire:
{
"analysis": "linear_static",
"nodes": [
[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1],
[0.5, 0, 0], [0.5, 0.5, 0], [0, 0.5, 0],
[0, 0, 0.5], [0.5, 0, 0.5], [0, 0.5, 0.5]
],
"elements": [
{"type": "TET10", "nodes": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "material": "steel"}
],
"materials": {
"steel": {"type": "isotropic_3d", "E": 210000000000.0, "nu": 0.3, "density": 7800.0}
},
"fixed_dofs": [
{"node": 0, "dofs": ["UX", "UY", "UZ"]},
{"node": 2, "dofs": ["UX", "UY", "UZ"]},
{"node": 3, "dofs": ["UX", "UY", "UZ"]},
{"node": 6, "dofs": ["UX", "UY", "UZ"]},
{"node": 7, "dofs": ["UX", "UY", "UZ"]},
{"node": 9, "dofs": ["UX", "UY", "UZ"]}
],
"loads": [
{"node": 1, "dof": "UX", "value": 1000.0}
]
}
Exemple non-lineaire TET4:
{
"analysis": {
"type": "nonlinear_static",
"method": "newton_raphson",
"load_steps": 5,
"max_iterations": 50,
"tolerance": 1.0e-9,
"adaptive_load_steps": true,
"initial_load_increment": 1.0,
"min_load_increment": 0.05,
"cutback_factor": 0.5,
"growth_factor": 1.5
},
"nodes": [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
"elements": [
{"type": "TET4", "nodes": [0, 1, 2, 3], "material": "rubber"}
],
"materials": {
"rubber": {
"type": "nonlinear_isotropic_3d",
"E": 1000.0,
"nu": 0.25,
"hardening": 1000000.0
}
},
"fixed_dofs": [
{"node": 0, "dofs": ["UX", "UY", "UZ"]},
{"node": 2, "dofs": ["UX", "UY", "UZ"]},
{"node": 3, "dofs": ["UX", "UY", "UZ"]}
],
"loads": [
{"node": 1, "dof": "UX", "value": 10.0}
]
}
Exemple continuation arc-length:
{
"analysis": {
"type": "nonlinear_static",
"method": "arc_length",
"load_steps": 5,
"max_arc_steps": 12,
"max_iterations": 50,
"tolerance": 1.0e-9,
"target_load_factor": 1.0
},
"nodes": [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
"elements": [
{"type": "TET4", "nodes": [0, 1, 2, 3], "material": "rubber"}
],
"materials": {
"rubber": {
"type": "nonlinear_isotropic_3d",
"E": 1000.0,
"nu": 0.25,
"hardening": 1000000.0
}
},
"fixed_dofs": [
{"node": 0, "dofs": ["UX", "UY", "UZ"]},
{"node": 2, "dofs": ["UX", "UY", "UZ"]},
{"node": 3, "dofs": ["UX", "UY", "UZ"]}
],
"loads": [
{"node": 1, "dof": "UX", "value": 10.0}
]
}
Verification maillage¶
La validation controle:
- presence des noeuds et elements;
- coordonnees finies;
- absence de noeuds dupliques exacts;
- connectivites completes;
- indices de noeuds valides;
- absence de noeuds repetes dans un element;
- existence et compatibilite des materiaux;
- compatibilite des ddl de charges et blocages;
- geometrie MITC4 via jacobien positif;
- geometrie TET4 via volume signe positif;
- qualite TET4/TET10: longueurs d'aretes, aspect ratio, volume relatif et skew;
- qualite MITC4: ratio d'aretes, planarity et angles internes.
- estimation de rang mecanique sur petits modeles pour signaler des modes rigides probables.
- densite positive obligatoire en analyse modale et dynamique TET4/TET10.
- non-lineaire statique actuellement disponible pour TET4/TET10.
- composantes connectees du maillage;
- noeuds isoles non references par les elements;
- contraintes et charges par composante pour signaler les risques de modes rigides.
Le rapport retourne PASS, WARNING ou FAIL. La CLI peut ecrire un rapport
JSON detaille avec check-mesh --json-report mesh_report.json.
Audit boite blanche¶
Le solveur ecrit une section audit dans les sorties de resolution et fournit
la commande:
python .\qf_solver.py inspect --input model.json --output audit.json
python .\qf_solver.py inspect --input model.json --markdown audit.md
Cette trace documente:
- numerotation globale des ddl;
- ddl fixes et libres;
mesh_details: composantes connectees, noeuds isoles, types d'elements, qualite elementaire, rang mecanique estime, ddl fixes et charges par composante;- types d'elements et materiaux references;
- connectivites elementaires et indices de ddl globaux;
- vecteurs assembles, dont le chargement;
- matrices globales et reduites avec
shape,nnz, densite, norme et erreur relative de symetrie, plus conditionnement estime et positivite quand l'estimation spectrale est disponible; - audits locaux par element dans
element_audits, avec qualite geometrique, donnees materiau, matrices locales, rang estime et valeurs propres extremes; - bilan
equilibriumapres resolution statique: convention de signe, facteur de charge, norme du residu libre, reactions, travail externe et energie; - controles
checks: validation maillage, ddl fixes/libres, symetrie des matrices, conditionnement des matrices reduites, geometrie elementaire, residu libre et identite energetique lineaire; - historique de convergence des solveurs lineaires dans
solver.residual_historyet sectionSolveur numeriquedes rapports Markdown de resolution; - export Markdown lisible via
save_audit_markdownou--audit-md; - gate CLI via
--audit-gate failou--audit-gate warning; - mode detaille
detail="values"/--detail valuesavec valeurs de matrices locales et trace d'assemblage elementaire vers les indices globaux; - statut du rapport maillage.
Post-traitement contraintes¶
Le champ element_results de la sortie JSON contient:
- pour
TET4: deformations 3D, contraintes 3D, contraintes principales, deformations principales, pression hydrostatique, deviateur, point d'integration centroidal, resultats nodaux moyennes et von Mises; - pour
TET10: deformations et contraintes 3D au centre, avec les memes invariants solides, quatre points d'integration de Hammer et resultats nodaux moyennes; - pour
MITC4: resultantes locales au centre de l'element:membrane_strain,curvature,shear_strain,membrane_force,bending_moment,shear_force,shell_faces,integration_points,nodal_results, et lelocal_frame.
Regles de code¶
- architecture orientee classes;
- fichiers source principaux inferieurs a 700 lignes;
- une responsabilite principale par classe;
- pas de logique metier dans la CLI;
- pas de parsing JSON dans les elements;
- pas de calcul EF dans les modules I/O;
- exceptions explicites avec messages utiles;
- tests ajoutes pour les nouveaux modules;
- MITC4 conserve dans son paquet valide.
Tests¶
Les tests sont organises en:
tests/unit/pour materiaux, TET4, validation, JSON, assemblage;tests/integration/pour API, CLI, modal, coques et exports;tests/verification/pour les verifications mecaniques rapides.
Commandes recommandees:
python -m pytest
python .\mitc4_solver.py verify --quick
python .\qf_solver.py verify --quick
Etat verifie:
- le nombre de tests collectes et le statut de campagne sont recalcules par
python .\scripts\build_docs.py --profile engineeringpuis publies dans le tableau de bord local; aucun compteur n'est maintenu manuellement ici; python .\qf_solver.py methods: liste les methodes lineaires, modales, dynamiques et non-lineaires ciblees.
Prochaines etapes robustesse¶
- Generaliser arc-length aux cas multi-parametres et grands deplacements.
- Ajouter grands deplacements pour TET4/TET10.
- Ajouter contraintes nodales extrapolees ou moyennees.
- Ajouter resultats par point d'integration.
- Ajouter preconditionneurs avances: incomplete Cholesky, AMG.