Unë jam duke përdorur një nënprogram të përdoruesit të Fortran (UMAT) në Abaqus. Unë e përdor atë për të ekzekutuar nën-llogaritje të tjera të Abaqus brenda llogaritjes sime kryesore.
Emrat e nënllogaritjeve janë variabla, kështu që unë po i përcaktoj në këtë mënyrë:
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)
Dhe pastaj thjesht përdor call system(trim(strCmdLine))
për të ekzekutuar nënllogaritjen time.
Ajo që më bën të çmendur është se kjo funksionon për disa nënllogaritje (nganjëherë vetëm 1, ndonjëherë 100, është disi e rastësishme), por më pas marr një gabim të këtij lloji:
Gabim Abaqus: Skedarët e mëposhtëm nuk mund të gjenden: micro
1_1#.odbcharacter (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)
ku # është gjithmonë një personazh "i çuditshëm" (mund të shihni një shembull këtu https://www.dropbox.com/s/82b7u7enlxpc62e/1.jpg?dl=0 ). Mund të konfirmoj (nëpërmjet korrigjimit të gabimeve ose duke shkruar në një skedar variablin e karakterit strCmdLine) që po ekzekutoj saktë me argumentin "oldjob=micro
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)
1_1", si kjo:
cd C:\AbaqusCalc && abaqus punë interaktive=micro
1_2 punë e vjetër=microcharacter (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)
1_1character (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)
Në disa raste Abaqus mund të gjejë dhe të përpunojë punën e vjetër (skedari micro
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)
1_1.odb), por në raste të tjera ai thjesht ngjit atë karakter të çuditshëm midis fundit të emrit të skedarit dhe shtesës ".odb".
Pyetjet e mia do të ishin:
- A lidhet kjo me funksionin
call system()
? - A mund të jetë ky një gabim i lidhur me Abaqus dhe jo me Fortran?
- A ka ndonjë mënyrë tjetër që mund të përdor për të thirrur llogaritjet e mia të Abaqus, në vend të
call system
?