I/O Error Resolution — FEA/CFD Input/Output Errors
I/O errors — problems reading input files, writing output files, or communicating with license servers — are often the most frustrating in CAE because they happen before any physics is even solved. This guide covers the six most common I/O errors across Abaqus, ANSYS, OpenFOAM, and LS-DYNA, with exact error messages, root causes, and step-by-step fixes.
I submitted an Abaqus job and it died instantly with "keyword not recognized." But I copied the input file from a working tutorial — how can a keyword suddenly not be recognized?
A few possibilities. First, check the Abaqus version — keywords added in 2023 won't exist in a 2019 installation. Second, look at the first ***ERROR in the .dat file — it always gives you the exact line number in the .inp file where parsing stopped. Nine times out of ten it's a typo, a missing comma in a parameter list, or a keyword renamed between versions. The .dat file is your best debugging tool for I/O errors.
Abaqus Error 1: "Keyword / Option Not Recognized"
The exact message is: ***ERROR: THE OPTION "NLGEOM=YES" IS NOT RECOGNIZED. I'm using Abaqus 6.14. Is NLGEOM a deprecated keyword?
In Abaqus 6.14, NLGEOM is a step-level parameter: *STEP, NLGEOM=YES. More likely though, you have a stray character — an invisible non-ASCII space or smart quote — pasted from a PDF or Word document. These look identical to regular characters but cause parser failures. Open the .inp in a plain-text editor that shows invisible characters (like VS Code or Notepad++), or run file mymodel.inp to check encoding.
Where exactly do I look in the .dat file to find the line that failed?
In the .dat file, search for ***ERROR — Abaqus uses three asterisks for fatal errors. Above or below the error message it prints the exact input line that caused the problem. For deprecated keywords, the message often includes "use X instead of Y" — Abaqus is helpful about this. The .msg file captures runtime messages the .dat doesn't always show. Use the datacheck option to parse keywords without running the solver, which gives fast I/O feedback.
| Issue | Bad Example | Fix |
|---|---|---|
| Missing comma in parameter list | *STEP NLGEOM=YES | *STEP, NLGEOM=YES |
| Two asterisks (comment) | **ELASTIC | *ELASTIC (one asterisk) |
| Trailing whitespace after parameter | *STATIC, DIRECT | Remove trailing spaces |
| Non-ASCII characters | Curly quotes from PDF copy-paste | Re-type in plain text editor |
| Deprecated parameter name | Version-specific keyword | Check Abaqus Keyword Reference for installed version |
Keyword validation workflow
- Run
abaqus job=mymodel.inp datacheck— parses all keywords without solving. - Search the .dat file for
***ERRORand cross-reference the line number in the .inp. - Consult the official Abaqus Keywords Reference Guide for the exact installed version.
- For version-specific changes: check the Abaqus Release Notes for keyword deprecations.
Abaqus Error 2: "Node Set / Element Set Not Found"
I exported my mesh from Abaqus/CAE and I can see "Set-1" in the Part module. But the .inp says "NODE SET Set-1 HAS NOT BEEN DEFINED." I can see it right there in the file — why can't Abaqus find it?
Almost certainly a case sensitivity problem. Abaqus set names are case-sensitive in the .inp file. If the set is defined as Set-1 (capital S) but referenced as set-1 (lowercase) or SET-1 (all caps), Abaqus won't find it — even though it's right there. Search the .inp file for all occurrences of the set name and confirm perfect case consistency throughout.
My .inp has a Part definition and an Assembly definition. I defined the node set under the Part, but the boundary condition is at the Assembly level. Is that the scoping problem?
Exactly right. Sets defined under a *Part block are part-level and must be referenced at the Assembly level with their instance prefix — for example PART-1-1.Set-1 rather than just Set-1. The dot notation specifies the instance. If you reference the bare set name at Assembly level, Abaqus looks for an assembly-level set with that name, finds nothing, and fails. Alternatively, export your model as an orphan mesh (no Part/Assembly structure) to avoid this scoping complexity when hand-editing .inp files.
Correct instance-scoped set reference
Geometry-based sets and remeshing
Sets generated from geometric features in CAE (face regions, edge groups) are recreated dynamically when you remesh. If you export a .inp, remesh, then re-export, node/element numbering — and sometimes set membership — changes. Always re-export the complete .inp after remeshing; never reuse an old .inp with a new mesh.
ANSYS Error 3: "File Lock Error" / "Results File Too Large"
ANSYS says "file is locked" when I try to re-run a job. I quit ANSYS and restarted my computer, and it still says "file locked." The job definitely isn't running. How can a file be locked when nothing is running?
A lock file artifact from a previously crashed job. ANSYS creates a .lock file in the working directory when a job starts and removes it when the job completes normally. If the job crashes or you force-quit, the lock file is never cleaned up. Next time you try to run, ANSYS sees the lock file and refuses, thinking the previous job is still active. Delete the jobname.lock file from the working directory manually — it's just a marker file and is safe to remove.
Different problem: my transient analysis ran fine but the .rst results file is 80 GB and crashes the post-processor. Is there a way to make it smaller without re-running?
For the existing run, you can't shrink the RST file retroactively — you'd need to re-run with selective output. But you can open it in chunks using ANSYS Mechanical's "Result file chunking" or read specific time points with APDL commands like SET,,,,,time_value rather than loading all states at once. For future runs, use OUTRES to request only the quantities and time intervals you actually need — this can reduce file size by 10 to 100 times.
| Output Type | APDL Command | When to Use |
|---|---|---|
| All nodal DOF at every step | OUTRES, NSOL, ALL | Debug only — large files |
| Final state stress only | OUTRES, ESOL, LAST | Static analysis, final check |
| Every Nth time step | OUTRES, ALL, FREQ, 10 | Transient, sample at intervals |
| Named selection only | OUTRES, ESOL, ALL, , , MY_SET | Critical zone monitoring |
| Minimum output | OUTRES, ERASE then OUTRES, ALL, LAST | Smallest possible file |
Cleaning up lock files
OpenFOAM Error 4: "Cannot Find File" / "Wrong Token in blockMesh"
I get "cannot find file constant/polyMesh/boundary" right when I start simpleFoam. But I can see the boundary file sitting right there in that exact directory. How can OpenFOAM not find a file that obviously exists?
Classic Linux case sensitivity trap. OpenFOAM on Linux is case-sensitive, and so is the filesystem. If you created the directory as Constant (capital C) or the file is named Boundary (capital B), OpenFOAM will not find it even though it's right there. Check with ls -la constant/polyMesh/ and compare every character. Also verify you're running the solver from the correct case root directory — OpenFOAM resolves paths relative to where you launch the command.
And the blockMesh error — "wrong token type - expected word found on line 47." Line 47 looks totally fine to me.
"Wrong token type" means the parser expected a keyword but found something unexpected — usually a missing semicolon on the previous line, a stray character, or a mismatched brace. Line 47 is where the parser gave up, but the actual mistake is almost always one or two lines earlier. Count your opening and closing braces carefully, and confirm every value line ends with a semicolon. OpenFOAM dictionary syntax is strict: every value ends with ;, every block opens with { and closes with }.
Is there a way to get more verbose debugging info when something goes wrong in OpenFOAM?
Yes — use DebugSwitches in system/controlDict. Setting blockMesh 1 enables verbose parsing output. For file-not-found errors, try running with simpleFoam -verbose. The foamDictionary command-line tool lets you parse and query any OpenFOAM dictionary file interactively to spot syntax issues before running.
OpenFOAM case validation checklist
Windows-to-Linux line ending issues
If you created or edited OpenFOAM files on Windows and transferred them to Linux, they may contain Windows-style CRLF line endings (\r\n) instead of Unix LF (\n). OpenFOAM's parser may misread these as token errors. Fix with: dos2unix system/controlDict or apply to the entire case directory recursively.
LS-DYNA Error 5: "Binary Plot State File Not Written" / d3plot Errors
My LS-DYNA crash simulation ran to completion, but when I try to open d3plot in LS-PrePost it shows nothing. The d3plot file exists and is 2 GB. Is that too large?
2 GB per state shouldn't be a problem for modern LS-PrePost, but check whether all split files exist. LS-DYNA splits large results into d3plot, d3plot01, d3plot02, and so on — you need all of them to reconstruct the complete time history. Run ls -la d3plot* to see the full set. If only a single d3plot file exists for a large model, the write may have been cut off mid-file (disk full, killed process). Check disk space and the d3hsp text log for write errors.
I also have no d3thdt file even though I defined DATABASE_HISTORY cards. I need time-history data for specific nodes. What am I missing?
DATABASE_HISTORY defines what to track (node sets, elements), but you also need the corresponding *DATABASE_BINARY_D3THDT card to actually enable the output file. These are separate — like having a sensor installed but no recorder connected. Also check: the DT parameter on DATABASE_BINARY cards must be non-zero and smaller than the simulation end time. If DT is set to 0.0, LS-DYNA silently skips the output with no error message.
d3plot troubleshooting checklist
- Check disk space:
df -h .— a full disk stops writes mid-file and corrupts d3plot. - List all split files:
ls -lah d3plot*— open all together in LS-PrePost for complete results. - Check the
d3hsptext log file for I/O error messages — LS-DYNA logs file write failures there. - For d3thdt: confirm
*DATABASE_BINARY_D3THDThas DT > 0, AND*DATABASE_HISTORY_NODE_SETreferences existing node sets. - For very large models: set
*CONTROL_MEMORYto allocate sufficient buffer; insufficient memory causes incomplete binary writes.
All Solvers Error 6: License Server Errors (FlexLM / FlexNet)
I get "Error -4: Licensed number of users already reached." But I can see in the license manager that there should be 5 Abaqus tokens available and only 3 are in use. Why is it refusing my job?
Abaqus jobs don't consume 1 token — they use multiple tokens depending on the CPU core count and analysis type. A single Abaqus Standard job on 8 CPUs might consume 5 tokens; Explicit consumes even more. Run abaqus licensing lmstat to see the exact token consumption per user. Also, "ghost" checkouts from crashed jobs can hold tokens that appear available in the GUI but aren't released. Restarting the license daemon with lmreread or a full daemon restart clears those.
And Error -96 — "license server machine is down." The server is definitely running, I can ping it. What else could cause this?
Ping only tests network reachability — it doesn't test whether the FlexLM daemon is listening on the correct port. Error -96 means the client can't reach the license daemon process itself. Check three things: is the daemon running on the server (ps aux | grep lmgrd)? Is port 27000-27009 open in the firewall? Does your local ANSYSLMD_LICENSE_FILE or LM_LICENSE_FILE environment variable point to the correct hostname? A recent server IP change or hostname rename breaks all clients simultaneously.
Is there a quick command I can run to test the license server without actually running a solver?
Yes — lmutil lmstat -a -c port@hostname lists all checked-out licenses without consuming any. It also shows whether the vendor daemon (e.g., abaquslm or ansyslmd) is running separately from the main lmgrd daemon. If lmgrd responds but the vendor daemon is down, you get Error -96. Also try telnet license-server 27000 — if it connects, the port is open; if it immediately closes, the daemon isn't listening.
| Error Code | Meaning | First Action |
|---|---|---|
| -4 | All licenses in use | lmstat -a; clear ghost checkouts |
| -10 | Feature not in license file | Verify license covers the requested module |
| -15 | Cannot connect to server | Check ANSYSLMD_LICENSE_FILE env var |
| -18 | Server doesn't support this feature | Upgrade license server to match client version |
| -25 | License server newer than client | Match client and server versions |
| -96 | Server/daemon not responding | Check daemon; check firewall on port 27000-27009 |
| -97 | No license for this platform | License restricted to specific OS/hardware; contact vendor |
License server diagnostic commands
I/O Error Quick Reference
| Solver | Error | Root Cause | Diagnostic | Fix |
|---|---|---|---|---|
| Abaqus | Keyword not recognized | Typo, version, non-ASCII chars | datacheck; search ***ERROR in .dat | Check keyword reference; re-type line |
| Abaqus | Set not found | Case mismatch; part vs. assembly scope | Text search .inp for all occurrences | Add instance prefix; fix case |
| ANSYS | File locked | Crashed job left lock file | ls *.lock | Delete jobname.lock |
| ANSYS | Results file too large | All DOF at all time steps | Check RST file size | Selective OUTRES; limit time points |
| OpenFOAM | Cannot find file | Case sensitivity; wrong directory | ls -la; check pwd | Fix case; run from case root |
| OpenFOAM | Wrong token | Missing ;; mismatched {} | blockMesh -dry-run | Check line before error; count braces |
| LS-DYNA | d3plot not written | Disk full; incomplete write | df -h; ls d3plot* | Free disk; open all split files |
| LS-DYNA | d3thdt missing | DATABASE_BINARY card absent or DT=0 | Search input for DATABASE_BINARY_D3THDT | Add card with DT > 0 |
| All | License Error -4 | Tokens in use / ghost checkouts | lmstat -a | Wait; clear ghosts; restart daemon |
| All | License Error -96 | Daemon down; firewall; wrong hostname | telnet server 27000 | Start daemon; open port; fix env var |