2015-09-14 3 views
0

Я использую подпрограмму пользователя 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?
+2

Потому что 1.jpg и 2.jpg являются одиночными линиями вывода, вероятно, лучше просто напечатать вывод непосредственно в вопросе (есть также кнопка «quote» над окном редактирования). И проблема связана с «_» и «C» после stroldJOB ...? Если это так, я думаю, также будет полезно добавить эту информацию в ваш вопрос. – roygvib

+0

Вы не указали, как были установлены настройки 'strJOB' и' strOLDJOB', но похоже, что у них есть не-алфавитно-цифровой мусор на своих концах. И вам нужно называть 'trim (strCmdLine)', хотя вы явно получаете эту строку, объединяя две строки 'trim'med? –

+0

Обрезка не является строго необходимой, потому что ваша системная оболочка не заботится о завершающих пробелах. Однако я не думаю, что это связано с проблемой. – agentp

ответ

0

Просто что-то попробовать, эта конструкция выглядит совершенно правильно

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

однако это может быть сделано, я думаю, более аккуратно, используя один внутренний запись:

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

Примечание i0 хорошо принимает уход за заготовками и strJOB в обоих случаях заполняется до 256 символов.

+0

У меня такая же ошибка. Во всяком случае, это очень хорошая альтернатива, я все равно его использую. благодаря –

Смежные вопросы