2

想象一下,您有一个程序 X,它需要用户输入以下内容:

fy = 355.   #Yield stress (MPa)
fu = 552.   #Tensile stress resistance (MPa), 460 MPa in engineering stress
E = 210.E3   #Young modulus (MPa)
F = -100.E3   #vertical force (N)
k2_2=70.82e6   #stiffness 2nd segment 2L, strong axis (N.mm/rad)
loos=0.0055   #looseness 2L (rad), strong axis
bmax=3.5e6   #maximum moment 2L, strong axis (N.mm)

然后用户还想添加一个最初未确定数量的变量,一个由 开始的组imp_local+str()和另一个由 开始的组imp_global+str()

要生成的变量数量取决于读取 txt 文件的结果。

用户知道程序无法处理这些生成的变量,但是查看程序创建的宏可能有机会引入它们。

程序生成的宏如下所示:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# import modules
from math import *
from openturns import *
from phiboot import *


# define the physical model
class TP1_Simply_supported_beam_class( OpenTURNSPythonFunction ):

    def __init__( self ):
        OpenTURNSPythonFunction.__init__( self, 9, 1)
        self.logUser = LogUser()
        self.callsNumber = 0
        self.pad = 21

    def padVar(self, var):
        if type(var) == str:
            return var.ljust(self.pad)
        else:
            return str('%+.11e' % var).ljust(self.pad)

    def setLogFile(self, filename):
        self.callsNumber = 0
        self.logUser.setFile(filename)

    def closeLogFile(self):
        self.logUser.closeFile()

    # define OpenTURNS function
    def TP1_Simply_supported_beam( self, fy, fu, E, F, k2_2, loos, bmax ):
        # log header
        if self.callsNumber == 0:
            self.logUser.level1( ''.join(map(self.padVar, ['N', 'fy', 'fu', 'E', 'F', 'k2_2', 'loos', 'bmax', 'g'])) + '\n' )

        # log input vars
        self.logUser.level1( str(self.callsNumber).ljust(self.pad) + ''.join(map(self.padVar, [fy, fu, E, F, k2_2, loos, bmax]))

生成变量组的代码是:

fileData = [] #array with the input file

inputFile = open("C:/Abaqus_JOBS/Job-M1-3_4.inp", "r") #CAE INPUT FILE
#fileData = variable with all the lines of the inp file
for line in inputFile:
    fileData.append([x.strip() for x in line.split(',')])

fgenerate1=0
nTop=[]
for row,data in enumerate(fileData):
    if data[0]=="*Nset" and data[1]=="nset=TOP":
        row_Top = row
    if len(data)==3 and data[0]=="*Nset" and data[1]=="nset=TOP" and data[2]=="generate":
        fgenerate1=1
if row_Top!=0:
    for data in fileData[row_Top+1:]: # skip first row elements
        try:
            int(data[0])
        except ValueError:
            break # found bottom_row, stop iterating
        if  fgenerate1==0:   
            nTop.append(data)
        else:
            iniN=data[0]
            finN=int(data[1])+1
            inc=data[2]
            for n in range(int(iniN), int(finN), int(inc)):
                data=n
                nTop.append([str(data)])        
loc=locals()
for k,val in enumerate(nTop) : loc["imp_local"+str(k)]
for k,val in enumerate(nTop) : loc["imp_global"+str(k)]

现在用户已经生成了imp_localimp_global变量,他想将它们添加到程序宏中的相应行中。他怎么能做到?

4

2 回答 2

2

如果我正确理解这种情况,您应该避免在全局命名空间中定义变量。用动态命名的变量“污染”全局命名空间永远不会有用,因为很难用直到运行时才知道名称的变量进行编程。

相反,将名称和值加载到新的 dict 中newvars。换句话说,“生成变量组的代码”最终应该定义

newvars = dict(
    fy = 355.,
    fu = 552.,
    E = 210.E3,
    F = -100.E3,
    k2_2=70.82e6,
    loos=0.0055,
    bmax=3.5e6,
    )

然后,您可以定义

def TP1_Simply_supported_beam(self, **kwargs):
    # log header
    if self.callsNumber == 0:
        self.logUser.level1(
            ''.join(map(self.padVar, ['N'] + kwargs.keys())) + '\n')

    # log input vars
    self.logUser.level1(
        str(self.callsNumber).ljust(self.pad) + ''.join(map(self.padVar, kwargs.values())

并像这样使用它:

obj = TP1_Simply_supported_beam_class()
obj.TP1_Simply_supported_beam(**newvars)
于 2013-05-03T19:13:47.627 回答
0

使用Yaml或 XML 而不是一些糟糕的文本文件作为输入。构建您的输入,最好编写一些经过验证的XSD 架构。然后使用 Yaml 在 Python 中构建您需要的任何内容。代码抽象并将数据/元数据移动到经过验证的参数文件中。几乎总是。

于 2013-05-03T19:18:20.413 回答