Source code for OpenPisco.ExternalTools.Aster.AsterHarmonicWriter

# -*- coding: utf-8 -*-
#
# This file is subject to the terms and conditions defined in
# file 'LICENSE', which is part of this source code package.
#

"""AsterHarmonicWriter

This is the dedicated writer file for the harmonic analysis. We refer to the documentation of AsterCommonWriter for a more general perspective.
"""
from typing import TextIO,Dict,Iterable,Tuple

import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter 

[docs]def WriteMaterialParametersInput(writeFile:TextIO,materials:Iterable[Tuple[str,Dict]]): """Write material parameters input for harmonic analysis in file. Young modulus ("young"), poisson ratio ("poisson") and density ("density") are mandatory for each material. Damping coefficients ("amor_alpha" and "amor_beta") are optional and are equal to 0 by default. Example: import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param") material1={"young":210000.0,"poisson":0.3,"density":7.85e-09,"amor_alpha":1.0,"amor_beta":0.0} materials = [['AllZones',material1],] WriteMaterialParametersInput(writeFile,materials) AsterCommonWriter.CloseAsterParamFile(writeFile) Parameters ---------- writeFile : TextIO currently opened parameter file materials : Iterable[Iterable[str,Dict]] materials description (element tag followed by parameters value for each material) """ affeMater=[] infoMater={} for numMater,(tagname,material) in enumerate(materials): infoMater['mater_'+str(numMater)]=[] AsterCommonWriter.WriteVariable(writeFile,variableName='young_modulus_'+str(numMater),variableValue=material["young"]) AsterCommonWriter.WriteVariable(writeFile,variableName='poisson_number_'+str(numMater),variableValue=material["poisson"]) AsterCommonWriter.WriteVariable(writeFile,variableName='density_'+str(numMater),variableValue=material["density"]) amorAlpha = material["amor_alpha"] if "amor_alpha" in material.keys() else 0 AsterCommonWriter.WriteVariable(writeFile,variableName='amor_alpha_'+str(numMater),variableValue=amorAlpha) amorBeta = material["amor_beta"] if "amor_beta" in material.keys() else 0 AsterCommonWriter.WriteVariable(writeFile,variableName='amor_beta_'+str(numMater),variableValue=amorBeta) value={} value["E"]="young_modulus_"+str(numMater) value["NU"]="poisson_number_"+str(numMater) value["RHO"]="density_"+str(numMater) value["AMOR_ALPHA"]="amor_alpha_"+str(numMater) value["AMOR_BETA"]="amor_beta_"+str(numMater) infoMater['mater_'+str(numMater)].append(value) writeFile.write('mater_'+str(numMater)+' = DEFI_MATERIAU(ELAS=_F('+','.join([ key+"="+value[key] for key in value.keys()])+'))\n') if tagname=='AllZones': affeMater.append("_F(MATER=("+'mater_'+str(numMater)+", ),TOUT=\'OUI\')") infoMater['mater_'+str(numMater)].append("TOUT") else: affeMater.append("_F(MATER=("+'mater_'+str(numMater)+", ),GROUP_MA=(\""+str(tagname)+"\",))") infoMater['mater_'+str(numMater)].append(tagname) writeFile.write('materials = {\'AFFE\' :'+str(affeMater).replace("\'_","_").replace(")\'",")").replace("\"_","_").replace(")\"",")").replace("\"\'","\"")+',}\n') writeFile.write('info_mater={') for material in infoMater.keys(): writeFile.write(material.replace("\'","")+":[{"+','.join("\""+param+"\""+":"+str(infoMater[material][0][param]) for param in infoMater[material][0].keys())+'},') writeFile.write("\""+str(infoMater[material][1]+"\"")+'],\n') writeFile.write('}\n')
[docs]def WriteModalBasisAnalysisParametersInput(writeFile:TextIO,harmonicParams:Dict): """Write modal basis analysis parameters input for harmonic analysis in file. Minimum excitation frequency ("freqExcitMin"), Maximum excitation frequency ("freqExcitMax") and frequency discretization step ("freqExcitStep") are mandatory. Parameters ---------- writeFile : TextIO currently opened parameter file harmonicParams : Dict harmonic parameters, various additional options related to the modal basis are described below with examples/explanations Examples: For building a modal basis with the first NMAX_FREQ frequencies analysisParams={"freqExcitMin":515.0,"freqExcitMax":525.0,"freqExcitStep":10,"Numbermaxfreq":10} For building a modal basis where the modes frequency are searched between modalBasisFreqMin and modalBasisFreqMax analysisParams={"freqExcitMin":515.0,"freqExcitMax":525.0,"freqExcitStep":10,"modalBasisFreqMin":0,"modalBasisFreqMax":2.1e5} For building a modal basis based on the excitation frequency, meaning that the modes frequency are searched between 0 and autoModalBasisRangeFactor*modalBasisFreqMax analysisParams={"freqExcitMin":515.0,"freqExcitMax":525.0,"freqExcitStep":10,"autoModalBasisRangeFactor":2} For building a modal basis with all modes analysisParams={"freqExcitMin":515.0,"freqExcitMax":525.0,"freqExcitStep":10,"AllFreq":None} import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param") WriteModalBasisAnalysisParametersInput(writeFile,harmonicParams) AsterCommonWriter.CloseAsterParamFile(writeFile) Raises ------ Exception If none of the options for the modal basis are fulfilled """ minExcFreq,maxExcFreq=harmonicParams['freqExcitMin'],harmonicParams['freqExcitMax'] #Write Excitation frenquencies range assert minExcFreq<=maxExcFreq,"freqExcitMax should be greater than freqExcitMin" writeFile.write("exc_interval = {'DEBUT' : "+str(minExcFreq)+", ") writeFile.write("'INTERVALLE':[_F(JUSQU_A="+str(maxExcFreq)+", ") writeFile.write("PAS="+str(harmonicParams['freqExcitStep'])+")]}\n") #Write modal basis built instruction if "Numbermaxfreq" in harmonicParams.keys(): writeFile.write("ModalBasis = {'NMAX_FREQ' : "+str(harmonicParams['Numbermaxfreq'])+"}\n") elif all(parameter in harmonicParams.keys() for parameter in ["modalBasisFreqMin","modalBasisFreqMax"]): minModFreq,maxModFreq=harmonicParams['modalBasisFreqMin'],harmonicParams['modalBasisFreqMax'] assert minModFreq<=maxModFreq,"modalBasisFreqMax should be greater than modalBasisFreqMin" writeFile.write("ModalBasis = {'FREQ' : "+str((minModFreq,maxModFreq))+"}\n") elif "autoModalBasisRangeFactor" in harmonicParams.keys(): minModFreq,maxModFreq=0.0,harmonicParams['autoModalBasisRangeFactor']*harmonicParams['freqExcitMax'] writeFile.write("ModalBasis = {'FREQ' : "+str((minModFreq,maxModFreq))+"}\n") elif "AllFreq" in harmonicParams.keys(): writeFile.write("ModalBasis = {'ALLFREQ' : 'TOUT'}\n") else: raise Exception("No other feature available for now.")
[docs]def WritePhysicalBasisAnalysisParametersInput(writeFile:TextIO,harmonicParams:Dict): """Write physical basis analysis parameters input in file Minimum excitation frequency ("freqExcitMin"), Maximum excitation frequency ("freqExcitMax") and frequency discretization step ("freqExcitStep") are mandatory. Parameters ---------- writeFile : TextIO currently opened parameter file harmonicParams : Dict harmonic parameters Example: import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param") analysisParams={"freqExcitMin":515.0,"freqExcitMax":525.0,"freqExcitStep":10} WritePhysicalBasisAnalysisParametersInput(writeFile,harmonicParams) AsterCommonWriter.CloseAsterParamFile(writeFile) """ minExcFreq,maxExcFreq=harmonicParams['freqExcitMin'],harmonicParams['freqExcitMax'] #Write Excitation frenquencies range assert minExcFreq<=maxExcFreq,"freqExcitMax should be greater than freqExcitMin" writeFile.write("exc_interval = {'DEBUT' : "+str(minExcFreq)+", ") writeFile.write("'INTERVALLE':[_F(JUSQU_A="+str(maxExcFreq)+", ") writeFile.write("PAS="+str(harmonicParams['freqExcitStep'])+")]}\n")
[docs]def WritePressureParametersInput(writeFile:TextIO,neumann:Dict,problems:Iterable): """Write pressure value in file Example: import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param") neumann = {"idx1": [['ETag1',{"type":"uniform","val":1e+04}]]} WritePressureParametersInput(writeFile,neumann=neumann,problems=["idx1"]) AsterCommonWriter.CloseAsterParamFile(writeFile) Parameters ---------- writeFile : TextIO currently opened parameter file neumann : Dict pressure description problems : Iterable loading cases """ writeFile.write("pressures = {\n") for problemId in problems: if problemId in neumann.keys(): for idl,_ in enumerate(neumann[problemId]): boundary=neumann[problemId][idl][0] pressureParams=neumann[problemId][idl][1] writeFile.write("'"+str(boundary)+"':{") for presParamsKeys,presParamsVal in pressureParams.items(): keyInStr="'"+str(presParamsKeys)+"'" if isinstance(presParamsVal, str): valInStr="'"+str(presParamsVal)+"'" else: valInStr=str(presParamsVal) writeFile.write(keyInStr+":"+valInStr+",\n") writeFile.write('},\n') writeFile.write("}\n")
[docs]def WriteHarmonicDisplacementParametersInput(writeFile:TextIO,harmonicDisp:Iterable[Tuple[str,Dict]],group:str="OnNodes"): """Write harmonic displacement parameters input Example: import OpenPisco.ExternalTools.Aster.AsterCommonWriter as AsterCommonWriter writeFile = AsterCommonWriter.OpenAsterParamFile("myFile.param") harmonicDisp = [['X0',[0,0,0]]] WriteHarmonicDisplacementParametersInput(writeFile,harmonicDisp,group) AsterCommonWriter.CloseAsterParamFile(writeFile) Parameters ---------- writeFile : TextIO currently opened parameter file harmonicDisp : Iterable[Iterable[str,Dict]] harmonic displacement description (element/nodal tag followed by parameters value for each tag) group : str type of group to apply boundary condition on, either "OnNodes" (default) or "OnElements" Raises ------ Exception Group considered does not exist, only "OnElements" and "OnNodes" allowed """ writeFile.write("harmonicDisp = {'DDL_IMPO' : [\n") for harmonicDispId in harmonicDisp: diristr="" if harmonicDispId[1][0] is not None: diristr+="DX="+str(harmonicDispId[1][0])+"," if harmonicDispId[1][1] is not None: diristr+="DY="+str(harmonicDispId[1][1])+"," if harmonicDispId[1][2] is not None: diristr+="DZ="+str(harmonicDispId[1][2])+"," if group=="OnElements": writeFile.write(" _F("+diristr+" GROUP_MA=('"+str(harmonicDispId[0])+"', )),") elif group=="OnNodes": writeFile.write(" _F("+diristr+" GROUP_NO=('"+str(harmonicDispId[0])+"', )),") else: raise Exception("This type of group "+group+" does not exist (TODO: check if GROUP_NO really required here)") writeFile.write("],\n") writeFile.write("}\n")