Source code for OpenPisco.ExternalTools.Aster.AsterThermalWriter
# -*- coding: utf-8 -*-
#
# This file is subject to the terms and conditions defined in
# file 'LICENSE', which is part of this source code package.
#
"""AsterThermalWriter
This is the dedicated writer file for the thermal analysis. We refer to the documentation of AsterCommonWriter for a more general perspective.
"""
from typing import TextIO,Iterable,Dict,Tuple
[docs]def WriteModelisation(writeFile:TextIO,dimensionality:int):
"""Write the modelisation in file
Example:
import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter
writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param")
WriteModelisation(writeFile,dimensionality=3)
AsterCommonWriter.CloseAsterParamFile(writeFile)
Parameters
----------
writeFile : TextIO
currently opened parameter file
dimensionality : int
problem dimensionality, correspond to dimension of the mesh (either 2 or 3)
"""
asterModelisationKeyword={2:'PLAN',3:'3D'}[dimensionality]
writeFile.write("modelisation = {'MODELISATION':('"+asterModelisationKeyword+"', ),'PHENOMENE':'THERMIQUE','TOUT':'OUI'}\n")
[docs]def WriteConvectionParametersInput(writeFile:TextIO,convection:Iterable[Tuple[str,Dict]]):
"""Write convection parameter in file
Heat transfer coefficient ("h") and external temperature ("temp_ext") are mandatory for each zone.
Example:
import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter
writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param")
convection= [['X0',{"h":50.0,"temp_ext":500.0}]]
WriteConvectionParametersInput(writeFile,convection)
AsterCommonWriter.CloseAsterParamFile(writeFile)
Parameters
----------
writeFile : TextIO
currently opened parameter file
convection : Iterable[Tuple[str,Dict]]
convection description on suitable boundary tags. On each tag, the external temperature ("temp_ext") and the convection coefficient ("h") should be provided
"""
writeFile.write("convection = {'ECHANGE' : [\n")
for tagname,params in convection:
try:
writeFile.write(" _F(COEF_H="+str(params["h"])+", TEMP_EXT="+str(params["temp_ext"])+", GROUP_MA=('"+str(tagname)+"', )),\n")
except KeyError as e:
raise Exception("Both the external temperature and the convection coefficient should be provided at boundary "+tagname) from e
writeFile.write("],\n")
writeFile.write("}\n")
[docs]def WriteSourceParametersInput(writeFile:TextIO,source:Iterable[Tuple[str,Dict]]):
"""Write source parameters input in file
Source term value ("source") is mandatory for each zone.
Example:
import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter
writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param")
source = [['AllZones',{"source":1.0}]]
WriteSourceParametersInput(writeFile,source)
AsterCommonWriter.CloseAsterParamFile(writeFile)
Parameters
----------
writeFile : TextIO
currently opened parameter file
source : Iterable[Tuple[str,Dict]]
source description on suitable boundary tags
"""
writeFile.write("source = {'SOURCE' : [\n")
for tagname,params in source:
try:
if tagname=='AllZones':
writeFile.write(" _F(SOUR="+str(params["source"])+", TOUT=\'OUI\')")
else:
writeFile.write(" _F(SOUR="+str(params["source"])+", GROUP_MA=('"+str(tagname)+"', )),\n")
except KeyError as e:
raise Exception("Source term is mandatory for source term for boundary "+tagname) from e
writeFile.write("],\n")
writeFile.write("}\n")
[docs]def WriteThermalDirichletParametersInput(writeFile:TextIO,dirichlet:Iterable[Tuple[str,Dict]]):
"""Write thermal dirichlet parameters input in file
Prescribed emperature ("temperature") is mandatory.
Example:
import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter
writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param")
prescribed_temperature={"temperature":50.0}
dirichlet = [['X0',prescribed_temperature]]
WriteThermalDirichletParametersInput(writeFile,dirichlet)
AsterCommonWriter.CloseAsterParamFile(writeFile)
Parameters
----------
writeFile : TextIO
currently opened parameter file
dirichlet : Iterable[Tuple[str,Dict]]
dirichlet boundary condition description on suitable boundary tags
Raises
------
Exception
if "temperature" is missing in the description
"""
writeFile.write("ther_impo = {'THER_IMPO' : [\n")
for tagname,params in dirichlet:
try:
writeFile.write(" _F(TEMP="+str(params["temperature"])+", GROUP_MA=('"+str(tagname)+"', )),\n")
except KeyError as e:
raise Exception("Temperature value is mandatory for Dirichlet condition for boundary "+tagname) from e
writeFile.write("],\n")
writeFile.write("}\n")
[docs]def WriteTimeParametersInput(writeFile:TextIO,timeParameters:Dict):
"""Write time parameters input in file
Start time ("start"), end time ("end"), number of time steps ("nsteps") and initial temperature ("starttemperature") are mandatory.
Example:
import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter
writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param")
timeParameters={"start":0.0,"end":7200.0,"nsteps":10,"starttemperature":20.0}
WriteTimeParametersInput(writeFile,timeParameters)
AsterCommonWriter.CloseAsterParamFile(writeFile)
Parameters
----------
writeFile : TextIO
currently opened parameter file
timeParameters : Dict
time parameters, should contains following keys: "start","end","nsteps","starttemperature"
"""
errorMessage = "At least one parameter needed needed amongst start,end,nsteps,starttemperature for the temporal discretization is missing"
assert {"start","end","nsteps","starttemperature"} <= timeParameters.keys(), errorMessage
writeFile.write("t_start ="+str(timeParameters["start"])+"\n")
writeFile.write("t_end ="+str(timeParameters["end"])+"\n")
writeFile.write("n_steps ="+str(timeParameters["nsteps"])+"\n")
writeFile.write("temp_0 ="+str(timeParameters["starttemperature"])+"\n")
[docs]def WriteTimeParametersInputForEigenValue(writeFile:TextIO,timeParameters:Dict):
"""Write time parameters input for eigenvalue computation in file
Start time ("start"), end time ("end") and initial temperature ("starttemperature") are mandatory.
Example:
import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter
writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param")
timeParameters={"start":0.0,"end":7200.0,"starttemperature":20.0}
WriteTimeParametersInputForEigenValue(writeFile,timeParameters)
AsterCommonWriter.CloseAsterParamFile(writeFile)
Parameters
----------
writeFile : TextIO
currently opened parameter file
timeParameters : Dict
time parameters
"""
errorMessage = "At least one parameter needed needed amongst start,end,nsteps,starttemperature for the temporal discretization is missing"
assert {"start","end","starttemperature"} <= timeParameters.keys(), errorMessage
writeFile.write("t_start ="+str(timeParameters["start"])+"\n")
writeFile.write("t_end ="+str(timeParameters["end"])+"\n")
writeFile.write("temp_0 ="+str(timeParameters["starttemperature"])+"\n")
[docs]def WriteMaterialParametersInput(writeFile:TextIO,materials:Dict):
"""Write material parameters input in file
Thermal conductivity ("lambda"), density ("rho") and thermal capacity ("cp") are mandatory for each material.
Example:
import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter
writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param")
material= [['AllZones',{"lambda":50.0,"rho":7850.0,"cp":1046.0}]]
WriteMaterialParametersInput(writeFile,material)
AsterCommonWriter.CloseAsterParamFile(writeFile)
Parameters
----------
writeFile : TextIO
currently opened parameter file
materials : Dict
materials description (element tag followed by parameters value for each material)
"""
affeMater=[]
for numMater,(tagname,material) in enumerate(materials):
writeFile.write('lambda_'+str(numMater)+'='+str(material["lambda"])+'\n')
rho_cp = material["rho"]*material["cp"]
writeFile.write('rho_cp_'+str(numMater)+'='+str(rho_cp)+'\n')
value={}
value["LAMBDA"]="lambda_"+str(numMater)
value["RHO_CP"]="rho_cp_"+str(numMater)
writeFile.write('mater_'+str(numMater)+' = DEFI_MATERIAU(THER=_F('+','.join([ key+"="+value[key] for key in value.keys()])+'))\n')
if tagname=='AllZones':
affeMater.append("_F(MATER=("+'mater_'+str(numMater)+", ),TOUT=\'OUI\')")
else:
affeMater.append("_F(MATER=("+'mater_'+str(numMater)+", ),GROUP_MA=(\""+str(tagname)+"\",))")
writeFile.write('materials = {\'AFFE\' :'+str(affeMater).replace("\'_","_").replace(")\'",")").replace("\"_","_").replace(")\"",")").replace("\"\'","\"")+',}\n')