J'ai réalisé un programme d'analyse de conduction thermique non stationnaire bidimensionnel avec Python. L'élément est un élément isoparamétrique avec 4 nœuds et 4 points d'intégration de Gauss, qui est le même que dans l'analyse de flux de perméation.
Ici, la formule des éléments finis des éléments suivants est utilisée.
Compte tenu de l'analyse de conduction thermique du béton, la caractéristique d'élévation de température d'isolation thermique du béton peut être incluse.
Ici, $ T_k $ est le montant final de l'augmentation de la température et $ \ alpha $ est le paramètre indiquant le taux de génération de chaleur.
En utilisant l'équation ci-dessus, la valeur calorifique $ Q $ et la valeur calorifique $ \ dot {Q} $ peuvent être exprimées comme suit.
L'équation de différence Crank-Nicolson est utilisée comme méthode de dispersion temporelle pour résoudre des équations d'éléments finis non stationnaires. En fait, la formule de différence est utilisée, et la température du nœud à $ t + \ Delta t $ est séquentiellement obtenue en utilisant le vecteur connu au temps $ t $. Les symboles sont en majuscules pour indiquer le vecteur de matrice pour toute la plage d'analyse.
Étant donné que les propriétés matérielles des éléments sont définies de manière à ne pas changer avec le temps, dans le calcul du pas de temps, la matrice inverse n'est obtenue qu'une seule fois avec `` numpy.linalg.inv (A) '', et celle-ci est stockée et chacune est stockée. L'historique de température de l'heure est calculé.
Pour savoir s'il peut être utilisé, cela prend environ 38 secondes avec 400 éléments, 441 degrés de liberté et 1000 pas de temps de calcul. L'évaluation dépend du goût individuel, mais dans mon cas, ce n'est pas un moment que je ne peux pas attendre. D'ailleurs, dans Fortran, le calcul du même modèle est terminé en 1,6 seconde.
J'ai fait un programme de dessin en même temps que le programme FEM. Le langage est Python, mais le graphique de l'historique des températures est dessiné avec matplotlib, et la carte de distribution de température en trois dimensions est dessinée avec GMT (Generic Mapping Tools). Le graphique 3D de matplotlib n'est pas très cool.
Des exemples de programmes et de données d'entrée sont affichés avec des liens vers ceux collés dans Gist.
a_py.txt
python3 py_fem_heat.py inp_div20_model.txt inp_div20_thist.txt out_div20.txt
Script pour créer un graphique d'historique de température par Python et une carte de distribution de température 3D par GMT
a_fig.txt
python3 py_heat_2D.py out_11_div20_10.txt
python3 py_heat_3D.py out_11_div20_10.txt
bash _a_gmt_3D.txt
mogrify -trim -density 300 -bordercolor 'transparent' -border 10x10 -format png *.eps
rm *.eps
Un script qui crée une image png avec des marges supprimées (ajustées) par ImageMagick après avoir créé un pdf avec TeX
a_tex.txt
platex tex_fig.tex
dvipdfmx -p a3 tex_fig.dvi
convert -trim -density 400 tex_fig.pdf -bordercolor 'transparent' -border 20x20 -quality 100 tex_fig.png
tex_fig.tex
Document TeX pour organiser 8 images png côte à côte sur du papier A3
tex_fig.tex
\documentclass[english]{jsarticle}
\usepackage[a3paper,top=25mm,bottom=25mm,left=25mm,right=25mm]{geometry}
\usepackage[dvipdfmx]{graphicx}
\pagestyle{empty}
\begin{document}
\begin{center}
\begin{tabular}{cc}
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_0.png}\end{minipage}&
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_1.png}\end{minipage}\\
& \\
& \\
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_2.png}\end{minipage}&
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_3.png}\end{minipage}\\
& \\
& \\
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_4.png}\end{minipage}&
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_5.png}\end{minipage}\\
& \\
& \\
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_6.png}\end{minipage}&
\begin{minipage}{12.0cm}\vspace{0.2zh}\includegraphics[width=12.0cm,bb={0 0 1900 1122}]{_fig_gmt_xyz_7.png}\end{minipage}\\
\end{tabular}
\end{center}
\end{document}
Deux fichiers sont utilisés comme données d'entrée.
Le premier concerne les données de modèle. Entrez le nombre de nœuds, les quantités de base telles que le nombre d'éléments, les propriétés du matériau, la relation élément-nœud, les coordonnées des nœuds, les conditions aux limites, etc.
L'autre est un fichier de données d'historique temporel de la température externe de la limite de désignation de température / limite de transfert de chaleur. Étant donné que la quantité d'informations est importante, j'ai essayé de les saisir séparément des données du modèle.
npoin nele nsec kot koc delta # Basic values for analysis
Ak Ac Arho Tk Al # Material properties
....(1 to nsec).... #
node-1 node-2 node-3 node-4 isec # Element connectivity, Material set number
....(1 to nele).... # (counterclockwise order of node numbers)
x y T0 # Coordinates of node, initial temperature of node
....(1 to npoin).... # (x: right-direction, y: upward direction)
nokt # Node number of temperature given boundary
....(1 to kot).... # (Omit data input if kot=0)
nekc_0 nekc_1 alphac # Element number, node number defined side, heat transfer rate
....(1 to koc).... # (Omit data input if koc=0)
n1out # Number of nodes for output of temperature time history
n1node_1 ....(1 line input).... # Node number for above
n2out # frequency of output of temperatures of all nodes
n2step_1 ....(1 line input).... # Time step number for above
# (Omit data input if ntout=0)
npoin, nele, nsec td> | Nombre de nœuds, nombre d'éléments, nombre de propriétés du matériau td> tr> |
kot, koc td> | Nombre de nœuds limites spécifiés par la température, nombre de côtés d'élément limite de transfert thermique td> tr> |
delta td> | Intervalle de temps de calcul td> tr> |
Ak, Ac, Arho td> | Conductivité thermique, chaleur spécifique, densité td> tr> |
Tk, Al td> | Température de montée adiabatique maximale, paramètres de taux de génération de chaleur td> tr> |
x, y, T0 td> | Coordonnée noeud x, coordonnée noeud y, température initiale du noeud td> tr> |
nokt td> | Numéro de nœud de limite de spécification de température td> tr> |
nekc_0, nekc_1, alphac td> | Numéro d'élément avec limite de transfert de chaleur, numéro de nœud côté élément de limite de transfert de chaleur, taux de transfert de chaleur de la limite de transfert de chaleur td> tr> |
n1out td> | Nombre de nœuds à afficher tout l'historique de temps td> tr> |
n1node td> | Numéro de nœud pour afficher tout l'historique de temps td> tr> |
n2out td> | Temps de sortie de toutes les températures de nœud Nombre d'étapes td> tr> |
n2step td> | Temps de sortie de toutes les températures de noeud Numéro d'étape td> tr> |
À la limite du transfert de chaleur, vous devez spécifier les côtés de l'élément. Par conséquent, spécifiez le numéro d'élément qui a le bord de la limite du transfert de chaleur et le numéro de nœud qui spécifie le bord. Dans FEM, le numéro de nœud qui spécifie l'élément est entré dans le sens inverse des aiguilles d'une montre, vous pouvez donc identifier le côté en entrant le premier numéro de nœud qui constitue le côté.
1 TE[1] ... TE[kot] TC[1] ... TC[koc] # data of 1st time step
2 TE[1] ... TE[kot] TC[1] ... TC[koc] # data of 2nd time step
3 TE[1] ... TE[kot] TC[1] ... TC[koc] #
....(repeating until end time)..... # data is read step by step
itime TE[1] ... TE[kot] TC[1] ... TC[koc] #
npoin nele nsec kot koc delta niii n1out n2out
25 16 1 0 16 1.0000000e+00 101 5 0
sec Ak Ac Arho Tk Al
1 2.5000000e+00 2.8000000e-01 2.3500000e+03 4.0000000e+01 2.0000000e-01
node x y tempe0 Tfix
1 -5.0000000e-01 -5.0000000e-01 2.0000000e+01 0
2 -5.0000000e-01 -2.5000000e-01 2.0000000e+01 0
3 -5.0000000e-01 0.0000000e+00 2.0000000e+01 0
..... (omit) .....
0
23 5.0000000e-01 0.0000000e+00 2.0000000e+01 0
24 5.0000000e-01 2.5000000e-01 2.0000000e+01 0
25 5.0000000e-01 5.0000000e-01 2.0000000e+01 0
nek0 nek1 alphac
1 1 1.0000000e+01
5 6 1.0000000e+01
9 11 1.0000000e+01
13 16 1.0000000e+01
13 21 1.0000000e+01
14 22 1.0000000e+01
15 23 1.0000000e+01
16 24 1.0000000e+01
16 25 1.0000000e+01
12 20 1.0000000e+01
8 15 1.0000000e+01
4 10 1.0000000e+01
4 5 1.0000000e+01
3 4 1.0000000e+01
2 3 1.0000000e+01
1 2 1.0000000e+01
elem i j k l sec
1 1 6 7 2 1
2 2 7 8 3 1
3 3 8 9 4 1
4 4 9 10 5 1
5 6 11 12 7 1
6 7 12 13 8 1
7 8 13 14 9 1
8 9 14 15 10 1
9 11 16 17 12 1
10 12 17 18 13 1
11 13 18 19 14 1
12 14 19 20 15 1
13 16 21 22 17 1
14 17 22 23 18 1
15 18 23 24 19 1
16 19 24 25 20 1
iii ttime Node_11 Node_12 Node_13 Node_14 Node_15
0 0.0000000e+00 2.0000000e+01 2.0000000e+01 2.0000000e+01 2.0000000e+01 2.0000000e+01
1 1.0000000e+00 2.5712484e+01 2.7416428e+01 2.7023876e+01 2.7416428e+01 2.5712484e+01
2 2.0000000e+00 2.8833670e+01 3.3625990e+01 3.2820487e+01 3.3625990e+01 2.8833670e+01
..... (omit) .....
98 9.8000000e+01 1.1182079e+01 1.2141098e+01 1.2494074e+01 1.2141098e+01 1.1182079e+01
99 9.9000000e+01 1.1140143e+01 1.2065139e+01 1.2405593e+01 1.2065139e+01 1.1140143e+01
100 1.0000000e+02 1.1099694e+01 1.1991874e+01 1.2320250e+01 1.1991874e+01 1.1099694e+01
n=25 time=0.147 sec
niii td> | Nombre d'étapes de calcul (y compris la température initiale) td> tr> |
Tfix td> | Indique si la température du nœud est spécifiée ou non (0: aucune température spécifiée, 1: température spécifiée) td> tr> |
iii, ttime, Node_x td> | Numéro de nœud pour afficher le pas de temps, l'heure, l'historique de la température Après cela, l'historique de la température à chaque fois est sorti td > tr> |
L'unité de temps est l'heure.
c'est tout
Recommended Posts