Я использую подпрограмму пользователя Fortran (UMAT) в Abaqus. Я использую его для запуска других подсчетов Abaqus в рамках моего основного расчета.Проблема с символьными переменными при использовании системы вызовов в Fortran
Названия суб-вычислений являются переменными, поэтому я определяю их таким образом:
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))
запустить свой суб-расчет.
Что делает меня с ума, что это работает для некоторых расчетов подразделам (иногда только один, иногда 100, это своего рода случайным образом), но тогда я получаю ошибку такого рода:
Abaqus Error: The following file(s) could not be located: 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 interactive job=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.jpg и 2.jpg являются одиночными линиями вывода, вероятно, лучше просто напечатать вывод непосредственно в вопросе (есть также кнопка «quote» над окном редактирования). И проблема связана с «_» и «C» после stroldJOB ...? Если это так, я думаю, также будет полезно добавить эту информацию в ваш вопрос. – roygvib
Вы не указали, как были установлены настройки 'strJOB' и' strOLDJOB', но похоже, что у них есть не-алфавитно-цифровой мусор на своих концах. И вам нужно называть 'trim (strCmdLine)', хотя вы явно получаете эту строку, объединяя две строки 'trim'med? –
Обрезка не является строго необходимой, потому что ваша системная оболочка не заботится о завершающих пробелах. Однако я не думаю, что это связано с проблемой. – agentp