Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran中使用调用系统时出现字符变量问题_Fortran_System Calls_Abaqus - Fatal编程技术网

在Fortran中使用调用系统时出现字符变量问题

在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

我正在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)
然后我只使用
调用系统(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
,那么将错误消息包含在问题中而不是图片中不仅更好,而且非常重要。其他有同样问题的人应该能够使用搜索引擎找到问题!请查看并编辑您的问题。我得到相同的错误。无论如何,这是一个很好的选择,我会用它。谢谢