我在Abaqus中使用Fortran用户子程序(UMAT)。我用它在我的主要计算中运行其他Abaqus子计算。
子计算名称是变量,所以我用这种方式定义它们:
character (len=256) :: strJOB,strOLDJOB
character (len=256) :: strGoToWorkPath,strCommand,strCmdLine
character (len=256) :: temp, strNOEL, strNPT, striCalcs, striCalcsPrev
write(temp, '(i6)') NOEL
read(temp, *) strNOEL
temp = ''
write(temp, '(i6)') NPT
read(temp, *) strNPT
temp = ''
write(temp, '(i6)') iCalcs
read(temp, *) striCalcs
temp = ''
write(temp, '(i6)') (iCalcs-1)
read(temp, *) striCalcsPrev
temp = ''
strJOB = "micro_" // trim(strNOEL) //"_"// trim(strNPT) // "_" // trim(striCalcs)
strOLDJOB = "micro_" // trim(strNOEL) //"_"// trim(strNPT) //"_"// trim(striCalcsPrev)
strGoToWorkPath = "cd C:\AbaqusCalc"
strCommand = "abaqus interactive job=" // trim(strJOB) // " oldjob=" // trim(strOLDJOB)
strCmdLine = trim(strGoToWorkPath) // ' && ' // trim(strCommand)
然后我只使用call system(trim(strCmdLine))
来运行我的子计算。
令我生气的是,这适用于一些子计算(有时只有1,有时100,它有点随机),但后来我得到了一些这样的错误:
Abaqus错误:无法找到以下文件:micro_1_1_1#.odb
其中#总是一个“奇怪的”字符(你可以在这里看到一个例子https://www.dropbox.com/s/82b7u7enlxpc62e/1.jpg?dl=0)。我可以通过参数“oldjob = micro_1_1_1”确认(通过调试或在文件上写入字符变量strCmdLine),如下所示:
cd C:\ AbaqusCalc&& abaqus交互式工作= micro_1_1_2 oldjob = micro_1_1_1
在某些情况下,Abaqus可以找到并处理oldjob(文件micro_1_1_1.odb),但在另一些情况下,他只是在文件名末尾和“.odb”扩展名之间添加了这个奇怪的字符。
我的问题是:
call system()
功能有关吗?call system
?答案 0 :(得分:0)
只是尝试一下,这个结构看起来非常正确
strJOB = "micro_" // trim(strNOEL) //"_"// trim(strNPT) // "_" // trim(striCalcs)
然而,我可以通过一次内部写作来更清晰地思考:
write(strJOB,'("micro_",i0,"_",i0,"_",i0)')NOEL,NPT,iCalcs
请注意i0
很好地处理空白,strJOB
在两种情况下都填空为256个字符。