在Fortran

时间:2015-09-14 20:57:46

标签: fortran system-calls abaqus

我在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()功能有关吗?
  • 这可能是与Abaqus有关的错误,而不是与Fortran有关吗?
  • 有没有其他方法可以用来调用我的Abaqus计算,而不是call system

1 个答案:

答案 0 :(得分:0)

只是尝试一下,这个结构看起来非常正确

strJOB = "micro_" // trim(strNOEL) //"_"// trim(strNPT) // "_" // trim(striCalcs)

然而,我可以通过一次内部写作来更清晰地思考:

write(strJOB,'("micro_",i0,"_",i0,"_",i0)')NOEL,NPT,iCalcs

请注意i0很好地处理空白,strJOB在两种情况下都填空为256个字符。