See the "bdf_xxx.txt" or "op2_xxx.txt" files for a list of the BDF/OP2 features that
are supported.  They're nice and long :)

This document discusses the major features (and limitations) added in each
version of the software.  See the HTML documentation for more information.

If you like it/want to help leave some feedback on the
Dicussion Page:  http://groups.google.com/group/pynastran-discuss?pli=1

If you have a bug/want a new feature or card, leave some feedback on the
Issues List:     http://code.google.com/p/pynastran/issues/list

This code was written entirely in Python and should install easily.


-----------------------v0.5 released Python 2.x 2012/08/13-----------------------
Overall Notes
   - lots of new BDF cards
   - OP2 now supports element real/imaginary forces
   - OP2 is much, much better at reading frequency analysis results
   - new OP4 reader in pure Python.  Writer isn't fully functional yet.
   - improved code to better support Python 3
   - implementing PEP-8

BDF API Changes
   - moved files around; if you want your imports to work, import from bdf.py
   - moved storage location of EIGC, EIGP to cMethod
   - grav card are now accessed using Load(lid) and not Grav(lid)
   - grav card loadID renamed from sid to lid
   - LOAD cards now have a getReducedLoads() which gets the scale factors and load objects
     for all sub-loads (supports LOAD, FORCEx, MOMENTx, GRAV)
     not implemented across all load types, so having a LOAD card is still a good thing
   - LOAD objects now have a getReducedLoads() method that determines
     a list of scaleFactors and FORCE/MOMENT/GRAV/etc. cards

BDF Bug Fixes:
   - SPOINTs were lost when cross referenced
   - EIGC, EIGP now stored in self.cMethods instead of self.methods
   - TABRNDG is now in randomTables
   - CREEP field g now reads/writes out
   - PLOAD4 bug with g1 vs g3/g4
   - EIGB keeps method (INV/SINV) now (not clear if there's a default)
   - QBDY3 cross referencing fixed
   - TSTEPNL fixed possible issue (kStep default) caused by unlisted METHOD field
   - SLOAD nodes were referencing loads instead of nodes
   - PFAST kr3 was writing out as kr2
   - PSHELL now supports mid2=-1
   - fixed PVISC, PGAP cross referencing (these dont require it)
   - CELASx and CDAMPx cards now allow empty fields / grounding
   - GRAV cards don't crash if the max N value == min N value

Added BDF
   - ASET, ASET1, BSET, BSET1, CSET, CSET1, QSET, QSET1
   - DMIG, DMIJ, DMIJI, DMIK
   - TABRNDG
   - TLOAD1, ACCEL1,,RFORCE, PLOADX1
   - SPLINE4, SPLINE5
   - CBUSH1D, PBUSH1D
   - PRAC2D, PRAC3D

Removed BDF
   - CONM1

Overall OP2
   - moved files around; if you want your imports to work, import from op2.py
   - test_op2 now crashes if there isn't a .op2 in the filename
   - major changes to reader to support non-standard solutions
     reader should be much better at getting correct values
   - added majority of element forces
   - added majority of element heat fluxes
   - significantly more support for complex results
   - added plotting support for "standard" results (real)
      - displacement, velocity, acceleration,
        eigenvectors, spcForces, mpcForces,
        gridPointForces, appliedLoads, loadVectors, forceVectors

OP2 API Changes
   - renamed many of the objects to follow pep-8, shouldn't really affect
     much code
   - complex tables now have same format as the real tables
     all results are stored in real/imaginary format and not
     magnitude/phase, regardless of what was defined in the OP2

Overall F06 Reader/Writer
   - updated to work with OP2 updates

Added F06 Writer
   - many, but not all loads

Overall GUI
   - added Cart3d support
   - added Panair support

Added GUI
   - CQUADR, CTRIAR


-----------------------v0.4.1 released Py2.x 2012/06/05-----------------------
Overall:
   - Python 3.x works!

BDF Bug Fixes:
   - coordinte system transpose bug (messed up most coordinate systems)
     affected CORD1R, CORD2R, CORD1C, CORD2C, CORD1S, CORD2S
   - Fluid Structure Interaction coordinate system of -1 is now allowed
   - nastran double precision format (e.g. 1.23456D+03) now supported
   - better rounding of floats when writing BDF
   - SET3 printing

Added BDF:
   - coordinate systems in CONM2 are fully supported
   - GRAV card prints out nicer

Added OP2:
   - GEOM1S, GEOM2S, GEOM3S, GEOM4S tables (for Radioss)

-----------------------v0.4 released 2012/04/23-----------------------
Overall Notes
   - new ASCII/binary OP4 reader for dense matrices
   - lots of BDF bug fixes
   - lots of new BDF cards
   - added support for OpenMDAO user-defined parameterization syntax %varname
   - new results in OP2
   - new F06 Reader/Writer
   - F06 Writer integrates with OP2 Reader

Overall OP4
   - ASCII/binary reader
   - sparse matrices not supported

Overall BDF
   - 180 total cards
   - added tab support (no mixed tabs, spaces, commas)
   - reworked format of bdf_crossReferencing.txt to be more like
     bdf_readWrite.txt
   - added test code that compares cards values from one run to the next
   - added support for THRU-BY on certain cards (e.g. QBDY3)
   - added new custom Exceptions to make errors messages clearer
   - added support for user defined optimization values (using %varName)
     values set with "bdf.setDynamicSyntax(dictOfVars)"

BDF API Changes
   - removeCards(['GRID','CQUAD4']) is now called disableCards(cards)
   - removed obsolete isPrintable and Is methods from BDF class
   - added Mid1(), Mid2(), Mid3(), Mid4() methods for PSHELL.
     Mid() now returns Mid1() or Mid2() depending on the form of the PSHELL
     Mass() calculated based on mid1 (or mid2 if mid1=None) per QRG
   - Tri-type elements are now TriShells instead of CTRIA3s (same for QUADs, QuadShells)
   - component constraints (e.g. 123456) on GRID, SPC, SPC1 and MPC are now strings
     for easy looping instead of a single integer (default='')
   - added Mids() for PCOMP/PCOMPG
   - added getNodeIDToElementIDsMap(), getPropertyIDToElementIDsMap(), getMaterialIDToPropertyIDsMap()
     limited 0D,1D element support (e.g. CBAR, CBEAM, CELAS1, etc.) for these methods

BDF Bug Fixes
   - printCard can now handle cards with an embedded line of Nones
       with data below.  This is a rare bug but affects the NLPARM
   - fixed minor bug with small values not printing that were slightly 
     above the tolerance level
   - fixed bug in CONM2 with inertia terms
   - PCOMP can now have 1 ply per line or 2 plies per line
   - PCOMP doesnt lose last plies anymore
   - fixed bugs in CQUADR, CQUADX, CVISC,  CONROD, CGAP,  CTRIAX, PTUBE
   - fixed bugs in NLPARM, PLOAD2, PLOAD4, QBDY1,  QBDY3, FREQ2,  CHBDYE
   - fixed bugs in PMASS,  CSHEAR, CBAR,   CQUAD,  RBE1,  RBE2,   RBE3
   - fixed bugs in PBEAML, MAT1, MAT3, CTRIAX6, CREEP
   - CREEP not lost when writing BDF out
   - disabled PBEAML

Added BDF
   - enabled CQUAD, RBE3
   - EIGB, EIGC, EIGP, EIGR, EIGRL
   - CBUSH, PBUSH, PDAMPT, CFAST, PFAST, CONM1, CVISC, PVISC
   - TSTEP, TSTEPNL
   - DLOAD, SLOAD, RLOAD1, RLOAD2
   - CAERO2, PAERO2, AEFACT
   - CBEND, PBEND, CBEAM3
   - MATS1, MATHP
   - DVPREL2, DVMREL1, DOPTPRM, DLINK
   - DRESP2
   - SPOINT

Overall OP2
   - more results
   - integrates with F06 Writer
   - more embedded BDF reading
   - added setTransientTimes(times) to explictly extract results at desired times
     - OUG
     - OES
     - OEE
     - OQG

OP2 API Changes
   - more results in CBEAM stress/strain
   - complex displacement reworked
   - added writeF06 method to most objects (no strain energy, shear stress/strain, celas stress/strain)

Added OP2
   - LAMA (requires an ESE = ALL to create table)
     - eigenvalues (real)

   - OUG (DISPLACMENTS=ALL)
     - improved complex displacements
     - ***complex velocity
     - ***complex acceleration
   - OQG (SPCFORCES=ALL, MPCFORCES=ALL)
     - SPC Forces (static/transient)
     - MPC Forces (static/transient)
   
   - OES (STRESS=ALL, STRAIN=ALL)
     - stress/strain
       - CTRIAX6 (static/transient)
     - hyperelastic stress/strain (transient)
       - CQUAD4
     - nonlinear strain (transient)
       - CTRIA3, CQUAD4
       - CROD, CONROD, CTUBE
       - ***CBEAM
   - OGF (GPFORCES=ALL)
     - grid point forces (static/transient)
     - load vector (static/transient)

Overall F06 Reader/Writer
   - rewrote f06 reader
      - format1, real, SORT1 supported
      - limited transient support
      - F06 Reader not nearly as complete as the OP2 Reader
      - F06 field parsing needs more testing, so beware!
      - juat use the OP2 reader
   - F06 Writer integrates with OP2 reader
     - transient variable names may not be correct (e.g. 'lftsfq' mean 'LOAD STEP', but it should write 'LOAD STEP')
   - The op2 or f06 readers feed the f06 writer or another solver/user's own results.
   - see f06_readWrite.txt for more info

Overall GUI
   - CSHEAR, CTRIAX6 support
   - "python setup.py install" should work now, but it's still not recommended

-----------------------v0.3 released 2012/02/08-----------------------
Overall Notes
   - coordinate systems!!!
   - all user BDF card API methods will have the first letter capitalized
     (not fully implemented)
   - added OP2 demo program that calculates solidStress & displacement margins
   - addd preliminary GUI (pyNastranGUI) that can view results

BDF API Changes
   - added simpler method to remove cards from the BDF
   - standardizing methods for element/property/material cards
     - Eid, Pid, Mid, Mass, NodeIDs, Centroid
     - Thickness, Area, Volume, Length
     - J, I11, I12, I22
   - FREQx  methods
   - CAERO1 methods
   - SETx   methods

BDF Bug Fixes
   - enabled PDAMP, CREEP
   - bug fix in NLPARM, MAT9,GRDSET
   - BEGIN BULK may now have multiple spaces in it
   - Continuation markers can have more than 1 character in them for CSV cards
   - Unincluded cards at the end of an INCLUDE file won't crash the BDF reader
   - CORD2Rs can have axes that arent ijk!
   - fixed bug in fieldWriter that caused certain values (e.g. -0.9999 and -0.0999) to be written out
     as (-.)  They were assumed to not round up to -1.0 and -0.1 respectively so the
     leading -0. could be replaced by (-.) to save field width.

Overall BDF
   - reorganized code files (main BDF class is in the same place)
   - improved accuracy of PBEAM methods (Area, Nsm, etc.) by integrating
     instead of using the first value
   - added cross referencing of SPLINE1
   - test_bdf only prints a reject message once per card type now
   - more Volume, Centroid methods

Added BDF
   - PBEAML
   - TABLED1,TABLED2,TABLED3,
     TABLEM1,TABLEM2,TABLEM3,TABLEM4,
     TABLES1,TABLEST,TABRND1
   - PAERO1
   - FREQ,FREQ1,FREQ2
   - CGAP, PGAP
   - PDAMP5
   - PSHEAR
   - AEPARAM,AELINK,AESTAT
   - SET1,SET3,SESET
   - CORD1R,CORD1C,CORD2C,CORD1S,CORD2S
   - CONM2 (cid!=0)
   - SPLINE2
   - TRIM

Added OP2
   - GEOM2
     - CGAP
   - OES
     - CSHEAR
     - CTRIAR, CTRIA6
   - OUG
     - velocity
     - accleration

OP2 API Changes
   - OUG
      - displacementObject now has self.translations (no more self.displacements) & self.rotations
        This is standard across displacement/velocity/acceleration

Overall OP2
   - reorganized code files (main OP2 class is in the same place)

OP2 Bug Fixes
   - deviceCode is now passed properly to result objects
   - nodeIDs now are correct for transient results

-----------------------v0.2.1 released 2011/1/2-----------------------
BDF Bug Fixes
   - fixed bug in fieldWriter that caused certain values (e.g. -0.9999 and -0.0999) to be written out
     as (-.)  They were assumed to not round up to -1.0 and -0.1 respectively so the
     leading -0. could be replaced by (-.) to save field width.

-----------------------v0.2 released 2011/12/20-----------------------

BDF API Changes
   - test_bdf can be called from the command line
   - renamed read method  to readBDF (it got confusing when the op2 object can
     read the bdf b/c it needs to initialize the bdf cards for the geomX tables)
   - renamed write to writeBDF
   - renamed writeAsPatran to writeBDFAsPatran
   - thermal materials (MAT4, MAT5) pulled from self.materials and put into self.thermalMaterials
     new ThermalMaterial & StructuralMaterial methods
     Material method checks for either still
   - rigid elements (RBAR, RBE2, etc.) separated out of elements to avoid overwriting cards
     new RigidElement method
     Element method doesnt check for rigid elements anymore

Overall BDF
   - a few more cards
   - added extra argument to all cards to set data directly from the 
     OP2 (no data type setting as the OP2 is binary).
   - max lines in executive & case control decks is now 600
   - methods for Elements (Area, Nsm, Thicknesss)
     

Overall OP2
   - test_op2 can be called from the command line
   - reading support ONLY
   - static solutions (e.g. SOL 101) results will be very stable
   - thermal solutions have significantly less support than
     structural solutions.
   - SORT2 is not supported...for example:
         use   DISPLACEMENT(PLOT,SORT1)=ALL
         not   DISPLACEMENT(PLOT,SORT2)=ALL
   - Many examples outside of SOL 101 have been tested 
     and dont crash.  This includes large SOL 200 models.  Verify your results first.
   - The user has the option to read the Geometry tables (GEOM1 (nodes/coords),
     GEOM2 (elements), GEOM3 (loads), GEOM4 (constraints),
     EPT/EPTS (properties), MPT/MPTS (materials) and can write the data to a
     BDF.  This is still a preliminary option.  Use the makeGeom argument.
     You still need to write the BDF.

BDF Bug Fixes
   - DCONSTR, DDVAL, DAREA weren't processed properly
   - fixed RBE1 bug
   - fixed RBE3 bug & disabled RBE3
   - AERO/AEROS cards split from self.aeros object to avoid overwriting entries
   - FLFACT reading when the card is short
   - PCOMP Thickness method doesnt crash when you want the total thickness
     Better defaults on PCOMP
   - fixed some fields on disabled CORDxx cards
   - CELASx cards had issues with proper order of entries
   - PELAS cards werent processed properly
   - files on remote drives dont cause crashes anymore
   - cend now also signifies the end of the executive control deck
   - begin BULK is valid now
   - fixed issue with the case control deck parsing on some uncommon cards

Added BDF
   - PBARL, PDAMP
   - CDAMP1, CDAMP2, CDAMP3, CDAMP4, CDAMP5
   - AESTAT
   - DRESP1, DVPREL1, DRESP1

OP2 Tables
   - GEOM1/GEOM2/GEOM3/EPT/MPT (basically stores the bdf)
     Cards that are not stable are not supported.  The
     writeAsPatran method may be used, but there may still be a
     few bugs in some of the cards.  These tables are very stable.

   - OUG  table (displacement/temperature,eigenvalues
                 velocity,acceleration) is very robust
       - just verify you're getting the result you want, there are
         a lot of results in this table
   - OQG  table (spc/mpc forces) None
   - OGP  table (grid point forces) works for SOL 101, untested on others (shouldnt crash)
   - OSTR table (strain) - see OES table
   - OES  table (stress) - elements that arent supported are skipped
       - Be careful about how you request the data from the object as
         the variables are dynamic based on the Case Control Deck parameters
         selected.  For example:
             STRESS(PLOT,SORT1,FIBER,VONMISES)=ALL
                - composite stress oxx is in the fiber direction (not the
                  x axis)
                - isotropic stress elements have von mises stress (ovm)
             STRESS(PLOT,SORT1,FIBER,MAXSHEAR)=ALL
                - composite stress oxx is in the fiber direction (not the
                  x axis)
                - isotropic stress elements have max shear stress (maxShear)
       - All this information is contained within boolean variables such as
         isVonMises(), isMaxShear() (stress/strain),isFiber(), isCurvature() (stress/strain)
         which are located on the result objects.
       - Elements can have different outputs depending on the
         solution and user requested output options.  For example, rods can
         contain the margin of safety in tension and compression, but they
         don't always have that data.  You can check this by using the
         boolean isMargins.

   - OEE table (element energy) - stable, but results are questionable
         and difficult to verify.


-----------------------v0.1.1 released 2011/12/06 -----------------------

BDF Bug Fixes
- bug fix to elements.py to fix import error

-----------------------v0.1   released 2011/11/09 -----------------------

Overall BDF
   - an executive control deck, case control deck, and bulk data deck
     are REQUIRED.
   - A ENDDATA card is strongly recommened!
   - Mass/Stiffness Matricies not supported except in a few, rare cases.
   - superelements are NOT supported
   - loads need some TLC in v0.2, but there is minor support for them
   - see the HTML documenation for a list of object data and methods.
     The Nastran QRG (Quick Reference Guide) is another good reference.

Executive Control Deck
   - Include files NOT supported
   - Limited to LESS than 200 lines
   - Extract soltion and method (if sol=600)
   - Can update solution/method

Case Control Deck
   - Include files supported (dont cross the BEGIN BULK entry)
   - Limited to LESS than 200 lines
   - In general, if a card is supported, EVERY field can be read,
     accessed, and written.
   - Most cards forms supported
      1.  STRESS(PLOT,PUNCH) = ALL     #  name(options) = value  (STRESS-type)
      2.  STRESS = ALL                 #  name = value           (STRESS-type)
      3.  DISP(PLOT,PUNCH) = ALL       #  name(options) = value  (STRESS-type)
      4.  PARAM,FIXEDB,-1              #  name, options, value   (PARAM-type)
      5.  SET 1 = 1,2,3,4, etc.        #  name id = options      (SET-type)
   - Some forms not supported
      1.  AUTOSPC (PRINT, PUNCH, SID=100, EPS=1.E-6, MPC)=YES    (AUTOSPC=YES is supported)
      2.  MODALSE(ESORT=ASCEND,THRESH=.0001)= 100
      3.  MODESELECT (FLUID LMODES = 5)
      4.  OUTPUT(XYOUT)
      5.  TFL = 1, 25, 77
      6.  SURFACE 10 SET 9 NORMAL X3
      7.  VOLUME 21 SET 2
   - Methods to update global/local subcase values


BDF Data Deck (no cross referencing required)
   - include files supported
   - 8/16 character fields, csv format for cards is supported.  DONT USE TABS!!!
   - Cards are written in 8-character fields and make use of Nastran-scientific
     notation to maximize precision.
   - write and writeAsPatran methods to write the bdf file after modifying it.
     The write method writes each 'section' (e.g. nodes/elements/properties)
     as isolated sections.  writeAsPatran intersperses properties and elements.
   - Duplicate node/element/property/etc. IDs are NOT allowed!

Bulk Data Deck Cross-Referencing
   - Entire deck is read.  If a card isnt supported, it is rejected.  Unparsed
     cards are clearly marked in the $REJECTS or $REJECT_LINES sections.
   - Cross-referencing is a feature that links data from one card to another.
     An example is a CQUAD4 has four nodes.  When cross-referenced, the element
     object's nodes become node objects.
   - Coordinate systems are a work in progress and difficult to test without
     good test cases.  Feel free to add some.  Therefore, the global coordinate
     system is safest and is the only one supported at the moment (CORD2R).
   - In order to determine element information that requires information from
     other cards, cross-referencing is REQUIRED.  The read method has the
     option to disable this.
   - When using constraints, all constraints (SPC,SPC1,SPCD,MPC) must be
     part of an SPCADD or MPCADD, unless there are no SPCADDs or MPCADDs.
     In other words, DONT mix and match!
   - Structural elements have a Mass/Area/Length/Thickness depending on type.
   - Volume ONLY supported for TET4 and TET10
   - Lots of methods for PCOMPs
   - CBEAM elements do are not complete for their area/mass/etc calcuations.
   - Moments of intertias of elements are not calculated.
   - Stiffness Matricies are incomplete
