在Fortran中使用调用系统时出现字符变量问题
我正在Abaqus中使用Fortran用户子程序(UMAT)。我使用它在我的主计算中运行其他Abaqus子计算 子计算名称是变量,因此我以这种方式定义它们:在Fortran中使用调用系统时出现字符变量问题,fortran,system-calls,abaqus,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
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)
然后我只使用调用系统(trim(strCmdLine))
来运行我的子计算
让我恼火的是,这适用于某些子计算(有时仅为1,有时为100,有点随机),但随后我得到了一些此类错误:
Abaqus错误:找不到以下文件:micro_1_1_1#.odb
其中#始终是一个“奇怪”字符(您可以在这里看到一个示例)。我可以确认(通过调试或在文件上写入字符变量strCmdLine)我使用参数“oldjob=micro_1_1_1”正确执行,如下所示:
cd C:\AbaqusCalc&&abaqus交互作业=micro\u 1\u 2旧作业=micro\u 1\u 1
在某些情况下,Abaqus可以找到并处理旧作业(文件micro_1_1_1.odb),但在另一些情况下,他只是在文件名末尾和扩展名“.odb”之间插入那个奇怪的字符
我的问题是:
- 这是否与调用系统()函数相关
- 这是否与Abaqus相关而与Fortran无关
- 有没有其他方法可以代替调用系统调用Abaqus计算
strJOB = "micro_" // trim(strNOEL) //"_"// trim(strNPT) // "_" // trim(striCalcs)
但是,我认为使用单个内部写入可以更灵活地完成:
write(strJOB,'("micro_",i0,"_",i0,"_",i0)')NOEL,NPT,iCalcs
请注意,
i0
很好地处理了空格,strJOB
在这两种情况下都是空格填充到256个字符。因为1.jpg和2.jpg是单输出行,所以最好直接在问题中键入输出(编辑窗口上方还有一个“引号”按钮)。问题是strOLDJOB之后的尾随“uu”和“C…”吗。。。?如果是这样的话,我想在你的问题中添加这些信息也会很有用。你没有包括strJOB
和strOLDJOB
是如何设置的,但它们的两端似乎都有一些非字母数字垃圾。即使通过连接两个trim
med字符串显式获得该字符串,您是否仍需要调用trim(strCmdLine)
?trim不是严格需要的,因为您的系统外壳不关心尾随空格。但是,我认为这与问题无关。您可能会看到,如果您的编译器支持execute\u command\u line
,那么将错误消息包含在问题中而不是图片中不仅更好,而且非常重要。其他有同样问题的人应该能够使用搜索引擎找到问题!请查看并编辑您的问题。我得到相同的错误。无论如何,这是一个很好的选择,我会用它。谢谢