Programim dhe zhvillim, javascript, python, php, html

Problemi me variablat e karaktereve kur përdorni sistemin e thirrjeve në Fortran

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

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

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

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_2 punë e vjetër=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

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?

  • Për shkak se 1.jpg dhe 2.jpg janë linja të vetme daljeje, ndoshta është më mirë që thjesht të shkruani daljen drejtpërdrejt në pyetje (ekziston gjithashtu një buton kuotash sipër dritares së redaktimit). Dhe a është problemi pas _ dhe C pas strOLDJOB...? Nëse po, mendoj se do të jetë gjithashtu e dobishme të shtoni këtë informacion në pyetjen tuaj. 15.09.2015
  • Nuk përfshive mënyrën se si u vendosën strJOB dhe strOLDJOB, por duket se ato kanë disa mbeturina jo-alfanumerike në skajet e tyre përkatëse. Dhe a duhet të telefononi trim(strCmdLine) edhe pse e merrni në mënyrë eksplicite atë varg duke lidhur dy vargje trimmed? 15.09.2015
  • prerja nuk është rreptësisht e nevojshme sepse guaska e sistemit tuaj nuk do të kujdeset për boshllëqet pasuese. Megjithatë, nuk mendoj se kjo lidhet me problemin. 15.09.2015
  • mund të shihni nëse përpiluesi juaj mbështet execute_command_line 15.09.2015
  • Nuk është vetëm më mirë, por shumë e rëndësishme të përfshihen mesazhet e gabimit në pyetje dhe jo si foto. Të tjerët me të njëjtin problem duhet të jenë në gjendje të gjejnë pyetjen duke përdorur motorët e kërkimit! Ju lutemi shikoni meta.stackoverflow .com/questions/303812/ dhe modifikoni pyetjen tuaj. 15.09.2015
  • Faleminderit djema për sugjerimet tuaja. @Andras and@roygvib Unë i kam shtuar disa informacione të tjera pyetjes sime duke u përpjekur ta sqaroj atë. E shoh mendimin tuaj për imazhet. Megjithatë, kam zgjedhur ta bëj në këtë mënyrë sepse nuk mund të përfaqësoj këtu simbolet e çuditshme që marr gjithmonë midis micro_1_1_1 dhe .odb. A ka ndonjë mënyrë për t'i përfaqësuar ato duke i shtypur ato? 15.09.2015
  • @agentp Nuk mund ta shpjegoj pse, por marr një gabim Abaqus nëse nuk i shkurtoj boshllëqet. Dhe nuk e njeh execute_command_line. 15.09.2015
  • Unë @VladimirF e kam redaktuar. Faleminderit për sugjerimin tuaj 15.09.2015
  • Në lidhje me përditësimin tuaj: nga vijnë NOEL, iCalcs dhe miqtë? Përfundimisht ju do duhet të zbuloni se si vargu juaj aktual e merr vlerën e tij:P 15.09.2015
  • Pyes veten nëse mund të jetë një problem i fundit i linjës Unix kundër Windows? P.sh., disa papajtueshmëri midis vargut kaloi nga system dhe lexohej nga linja e komandës nga Abaqus. 15.09.2015
  • Kam një ndjenjë që ky është një nga ato raste zhgënjyese ku keni ndonjë gabim krejtësisht të palidhur (siç është një grup jashtë kufijve). Shfaqja e gabimit pa përdorimin e prerjes mund të jetë e qartë. trimcall system nuk nevojitet, as shkurtimi nuk bën asgjë për artikullin e fundit në secilën prej shprehjeve tuaja të vargut. 15.09.2015
  • Nëse e dini se keni (i6) në vargjet tuaja, atëherë si të përdorni (a5) për lexim në vend të *? 15.09.2015
  • @agentp nëse heq shkurtimin, pesë llogaritjet e para funksionojnë mirë, por në të gjashtin marr: ‹Gabim Abaqus: Opsioni ## i linjës së komandës nuk mund të përdoret me analizën › (ku ## janë dy simbole). 15.09.2015
  • @AndrasDeak nuk funksionon, kam të njëjtin gabim. 15.09.2015
  • Mirë, sapo e provova në një kompjuter tjetër (më falni, duhet ta kisha bërë këtë më parë..) dhe funksionoi. Do të riinstaloj VS dhe Abaqus. Faleminderit per mbeshtetjen tuaj. 15.09.2015

Përgjigjet:


1

Vetëm diçka për të provuar, ky konstrukt duket krejtësisht i saktë

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

megjithatë mund të bëhet, mendoj më mirë duke përdorur një shkrim të vetëm të brendshëm:

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

vini re i0 kujdeset mirë për boshllëqet dhe strJOB është bosh i mbushur me 256 karaktere në të dyja rastet.

15.09.2015
  • Unë marr të njëjtin gabim. Gjithsesi kjo është një alternativë shumë e mirë, gjithsesi do ta përdor. Faleminderit 15.09.2015
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..