0

我在 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)。我可以确认(通过调试或在文件上写入字符变量 strCmdLine)我正在使用参数“oldjob=micro_1_1_1”正确执行,如下所示:

cd C:\AbaqusCalc && abaqus 交互式作业=micro_1_1_2 oldjob=micro_1_1_1

在某些情况下,Abaqus 可以找到并处理旧作业(文件 micro_1_1_1.odb),但在另一些情况下,他只是在文件名末尾和“.odb”扩展名之间添加了那个奇怪的字符。

我的问题是:

  • 这与call system()功能有关吗?
  • 这可能是与 Abaqus 相关而不与 Fortran 相关的错误吗?
  • 有没有其他方法可以用来调用我的 Abaqus 计算,而不是call system
4

1 回答 1

0

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

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

但是我认为可以更巧妙地使用单个内部写入来完成:

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

请注意,i0很好地处理了空白,并且strJOB在两种情况下都将空白填充到 256 个字符。

于 2015-09-15T16:29:08.023 回答