# pylint: disable=W0612,C0103
from __future__ import (nested_scopes, generators, division, absolute_import,
print_function, unicode_literals)
from six import iteritems
import os
import sys
import numpy
from numpy import array
import warnings
warnings.simplefilter('always')
numpy.seterr(all='raise')
import traceback
from pyNastran.op2.op2 import OP2
from pyNastran.utils import print_bad_path
from pyNastran.bdf.utils import CardParseSyntaxError
from pyNastran.bdf.bdf import BDF, NastranMatrix #, CardParseSyntaxError
from pyNastran.bdf.bdf_replacer import BDFReplacer
from pyNastran.bdf.test.compare_card_content import compare_card_content
import pyNastran.bdf.test
test_path = pyNastran.bdf.test.__path__[0]
[docs]def run_all_files_in_folder(folder, debug=False, xref=True, check=True,
punch=False, cid=None, nastran=''):
print("folder = %s" % folder)
filenames = os.listdir(folder)
run_lots_of_files(filenames, debug=debug, xref=xref, check=check,
punch=punch, cid=cid, nastran=nastran)
[docs]def run_lots_of_files(filenames, folder='', debug=False, xref=True, check=True,
punch=False, cid=None, nastran=''):
filenames = list(set(filenames))
filenames.sort()
#debug = True
filenames2 = []
diffCards = []
for filename in filenames:
if (filename.endswith('.bdf') or filename.endswith('.dat') or
filename.endswith('.nas') or filename.endswith('.nas')):
filenames2.append(filename)
failedFiles = []
n = 1
for filename in filenames2:
abs_filename = os.path.abspath(os.path.join(folder, filename))
if folder != '':
print("filename = %s" % abs_filename)
isPassed = False
try:
fem1, fem2, diffCards2 = run_bdf(folder, filename, debug=debug,
xref=xref, check=check, punch=punch,
cid=cid, isFolder=True, dynamic_vars={},
nastran=nastran)
del fem1
del fem2
diffCards += diffCards
isPassed = True
except KeyboardInterrupt:
sys.exit('KeyboardInterrupt...sys.exit()')
#except IOError:
#pass
#except RuntimeError: # only temporarily uncomment this when running lots of tests
#pass
#except AttributeError: # only temporarily uncomment this when running lots of tests
#pass
#except SyntaxError: # only temporarily uncomment this when running lots of tests
#pass
except SystemExit:
sys.exit('sys.exit...')
except:
traceback.print_exc(file=sys.stdout)
#raise
print('-' * 80)
if isPassed:
sys.stderr.write('%i %s' % (n, abs_filename))
n += 1
else:
sys.stderr.write('*' + abs_filename)
failedFiles.append(abs_filename)
sys.stderr.write('\n')
print('*' * 80)
try:
print("diffCards1 = %s" % list(set(diffCards)))
except TypeError:
#print "type(diffCards) =",type(diffCards)
print("diffCards2 = %s" % diffCards)
return failedFiles
[docs]def memory_usage_psutil():
# return the memory usage in MB
try:
import psutil
except ImportError:
return '???'
process = psutil.Process(os.getpid())
mem = process.get_memory_info()[0] / float(2 ** 20)
return mem
[docs]def run_bdf(folder, bdfFilename, debug=False, xref=True, check=True, punch=False,
cid=None, meshForm='combined', isFolder=False, print_stats=False,
sum_load=False, size=8, is_double=False,
reject=False, nastran='', dynamic_vars=None):
if dynamic_vars is None:
dynamic_vars = {}
bdfModel = str(bdfFilename)
print("bdfModel = %s" % bdfModel)
if isFolder:
bdfModel = os.path.join(test_path, folder, bdfFilename)
assert os.path.exists(bdfModel), '%r doesnt exist' % bdfModel
if reject:
fem1 = BDFReplacer(bdfModel + '.rej', debug=debug, log=None)
else:
fem1 = BDF(debug=debug, log=None)
fem1.set_error_storage(nparse_errors=100, stop_on_parsing_error=True,
nxref_errors=100, stop_on_xref_error=True)
if dynamic_vars:
fem1.set_dynamic_syntax(dynamic_vars)
fem1.log.info('starting fem1')
sys.stdout.flush()
fem2 = None
diffCards = []
try:
outModel = run_fem1(fem1, bdfModel, meshForm, xref, punch, sum_load, size, is_double, cid)
fem2 = run_fem2(bdfModel, outModel, xref, punch, sum_load, size, is_double, reject, debug=debug, log=None)
diffCards = compare(fem1, fem2, xref=xref, check=check, print_stats=print_stats)
nastran = 'nastran scr=yes bat=no old=no '
if nastran and 0:
dirname = os.path.dirname(bdfModel)
basename = os.path.basename(bdfModel).split('.')[0]
op2_model = os.path.join(dirname, 'out_%s.op2' % basename)
cwd = os.getcwd()
bdf_model2 = os.path.join(cwd, 'out_%s.bdf' % basename)
op2_model2 = os.path.join(cwd, 'out_%s.op2' % basename)
f06_model2 = os.path.join(cwd, 'out_%s.f06' % basename)
print(bdf_model2)
if os.path.exists(bdf_model2):
os.remove(bdf_model2)
# make sure we're writing an OP2
bdf = BDF()
bdf.read_bdf(outModel)
if 'POST' in bdf.params:
post = bdf.params['POST']
#print('post = %s' % post)
post.update_values(value1=-1)
#print('post = %s' % post)
else:
card = ['PARAM', 'POST', -1]
bdf.add_card(card, 'PARAM', is_list=True)
bdf.write_bdf(bdf_model2)
#os.rename(outModel, outModel2)
os.system(nastran + bdf_model2)
op2 = OP2()
if not os.path.exists(op2_model2):
raise RuntimeError('%s failed' % f06_model2)
op2.read_op2(op2_model2)
print(op2.get_op2_stats())
except KeyboardInterrupt:
sys.exit('KeyboardInterrupt...sys.exit()')
#except IOError:
#pass
except CardParseSyntaxError: # only temporarily uncomment this when running lots of tests
pass
#except AttributeError: # only temporarily uncomment this when running lots of tests
#pass
#except SyntaxError: # only temporarily uncomment this when running lots of tests
#pass
#except AssertionError: # only temporarily uncomment this when running lots of tests
#pass
except SystemExit:
sys.exit('sys.exit...')
except:
#exc_type, exc_value, exc_traceback = sys.exc_info()
#print "\n"
traceback.print_exc(file=sys.stdout)
#print msg
print("-" * 80)
raise
print("-" * 80)
return (fem1, fem2, diffCards)
[docs]def run_fem1(fem1, bdfModel, meshForm, xref, punch, sum_load, size, is_double, cid):
assert os.path.exists(bdfModel), print_bad_path(bdfModel)
try:
if '.pch' in bdfModel:
fem1.read_bdf(bdfModel, xref=False, punch=True)
else:
fem1.read_bdf(bdfModel, xref=xref, punch=punch)
except:
print("failed reading %r" % bdfModel)
raise
#fem1.sumForces()
if fem1._auto_reject:
outModel = bdfModel + '.rej'
else:
outModel = bdfModel + '_out'
if cid is not None and xref:
fem1.resolve_grids(cid=cid)
if meshForm == 'combined':
fem1.write_bdf(outModel, interspersed=False, size=size, is_double=is_double)
elif meshForm == 'separate':
fem1.write_bdf(outModel, interspersed=False, size=size, is_double=is_double)
else:
msg = "meshForm=%r; allowedForms=['combined','separate']" % meshForm
raise NotImplementedError(msg)
#fem1.writeAsCTRIA3(outModel)
return (outModel)
[docs]def run_fem2(bdfModel, outModel, xref, punch,
sum_load, size, is_double,
reject, debug=False, log=None):
assert os.path.exists(bdfModel), bdfModel
assert os.path.exists(outModel), outModel
if reject:
fem2 = BDFReplacer(bdfModel + '.rej', debug=debug, log=None)
else:
fem2 = BDF(debug=debug, log=None)
fem2.log.info('starting fem2')
sys.stdout.flush()
try:
fem2.read_bdf(outModel, xref=xref, punch=punch)
except:
print("failed reading %r" % outModel)
raise
outModel2 = bdfModel + '_out2'
if sum_load:
p0 = array([0., 0., 0.])
subcases = fem2.caseControlDeck.get_subcase_list()
for isubcase in subcases[1:]: # drop isubcase = 0
loadcase_id, options = fem2.caseControlDeck.get_subcase_parameter(isubcase, 'LOAD')
F, M = fem2.sum_forces_moments(p0, loadcase_id, include_grav=False)
print(' isubcase=%i F=%s M=%s' % (isubcase, F, M))
fem2.write_bdf(outModel2, interspersed=False, size=size, is_double=is_double)
#fem2.writeAsCTRIA3(outModel2)
os.remove(outModel2)
return (fem2)
[docs]def divide(value1, value2):
if value1 == value2: # good for 0/0
return 1.0
else:
try:
v = value1 / float(value2)
except ZeroDivisionError:
v = 0.
return v
[docs]def compare_card_count(fem1, fem2, print_stats=False):
cards1 = fem1.card_count
cards2 = fem2.card_count
for key in cards1:
if key != key.upper():
raise RuntimeError('Proper capitalization wasnt determined')
if print_stats:
print(fem1.get_bdf_stats())
else:
fem1.get_bdf_stats()
return compute_ints(cards1, cards2, fem1)
[docs]def compute_ints(cards1, cards2, fem1):
cardKeys1 = set(cards1.keys())
cardKeys2 = set(cards2.keys())
allKeys = cardKeys1.union(cardKeys2)
diffKeys1 = list(allKeys.difference(cardKeys1))
diffKeys2 = list(allKeys.difference(cardKeys2))
listKeys1 = list(cardKeys1)
listKeys2 = list(cardKeys2)
if diffKeys1 or diffKeys2:
print(' diffKeys1=%s diffKeys2=%s' % (diffKeys1, diffKeys2))
for key in sorted(allKeys):
msg = ''
if key in listKeys1:
value1 = cards1[key]
else:
value1 = 0
if key in listKeys2:
value2 = cards2[key]
else:
value2 = 0
diff = abs(value1 - value2)
star = ' '
if diff and key not in ['INCLUDE']:
star = '*'
if key not in fem1.cards_to_read:
star = '-'
factor1 = divide(value1, value2)
factor2 = divide(value2, value1)
factorMsg = ''
if factor1 != factor2:
factorMsg = 'diff=%s factor1=%g factor2=%g' % (diff, factor1,
factor2)
msg += ' %skey=%-7s value1=%-7s value2=%-7s' % (star, key, value1,
value2) + factorMsg
msg = msg.rstrip()
print(msg)
#return listKeys1 + listKeys2
return diffKeys1 + diffKeys2
[docs]def compute(cards1, cards2):
cardKeys1 = set(cards1.keys())
cardKeys2 = set(cards2.keys())
allKeys = cardKeys1.union(cardKeys2)
diffKeys1 = list(allKeys.difference(cardKeys1))
diffKeys2 = list(allKeys.difference(cardKeys2))
listKeys1 = list(cardKeys1)
listKeys2 = list(cardKeys2)
msg = ''
if diffKeys1 or diffKeys2:
msg = 'diffKeys1=%s diffKeys2=%s' % (diffKeys1, diffKeys2)
for key in sorted(allKeys):
msg = ''
if key in listKeys1:
value1 = cards1[key]
else:
value2 = 0
if key in listKeys2:
value2 = cards2[key]
else:
value2 = 0
if key == 'INCLUDE':
msg += ' key=%-7s value1=%-7s value2=%-7s' % (key,
value1, value2)
else:
msg += ' *key=%-7s value1=%-7s value2=%-7s' % (key,
value1, value2)
msg = msg.rstrip()
print(msg)
[docs]def get_element_stats(fem1, fem2):
"""verifies that the various element methods work"""
for (key, loads) in sorted(iteritems(fem1.loads)):
for load in loads:
try:
allLoads = load.getLoads()
if not isinstance(allLoads, list):
raise TypeError('allLoads should return a list...%s'
% (type(allLoads)))
except:
print("load statistics not available - load.type=%s "
"load.sid=%s" % (load.type, load.sid))
raise
fem1._verify_bdf()
mass, cg, I = fem1.mass_properties(reference_point=None, sym_axis=None)
print("mass =", mass)
print("cg =", cg)
print("I =", I)
# for (key, e) in sorted(iteritems(fem1.elements)):
# try:
# e._verify()
# #if isinstance(e, RigidElement):
# #pass
# #elif isinstance(e, DamperElement):
# #b = e.B()
# #elif isinstance(e, SpringElement):
# #L = e.Length()
# #K = e.K()
# #pid = e.Pid()
# #elif isinstance(e, PointElement):
# #m = e.Mass()
# #c = e.Centroid()
# except Exception as exp:
# #print("e=\n",str(e))
# print("*stats - e.type=%s eid=%s element=\n%s"
# % (e.type, e.eid, str(exp.args)))
# except AssertionError as exp:
# print("e=\n",str(e))
# #print("*stats - e.type=%s eid=%s element=\n%s"
# #% (e.type, e.eid, str(exp.args)))
#
# #raise
[docs]def get_matrix_stats(fem1, fem2):
for (key, dmig) in sorted(iteritems(fem1.dmigs)):
try:
if isinstance(dmig, NastranMatrix):
dmig.getMatrix()
else:
print("statistics not available - "
"matrix.type=%s matrix.name=%s" % (dmig.type, dmig.name))
except:
print("*stats - matrix.type=%s name=%s matrix=\n%s"
% (dmig.type, dmig.name, str(dmig)))
raise
[docs]def compare(fem1, fem2, xref=True, check=True, print_stats=True):
diffCards = compare_card_count(fem1, fem2, print_stats=print_stats)
if xref and check:
get_element_stats(fem1, fem2)
get_matrix_stats(fem1, fem2)
compare_card_content(fem1, fem2)
#compare_params(fem1,fem2)
#print_points(fem1,fem2)
return diffCards
[docs]def compare_params(fem1, fem2):
compute(fem1.params, fem2.params)
[docs]def print_points(fem1, fem2):
for (nid, n1) in sorted(iteritems(fem1.nodes)):
print("%s xyz=%s n1=%s n2=%s" % (nid, n1.xyz, n1.Position(True),
fem2.Node(nid).Position()))
break
coord = fem1.Coord(5)
print(coord)
#print coord.Stats()
[docs]def main():
from docopt import docopt
msg = "Usage:\n"
msg += " test_bdf [-q] [-x] [-p] [-c] [-L] BDF_FILENAME\n" #
msg += " test_bdf [-q] [-x] [-p] [-c] [-L] [-d] BDF_FILENAME\n" #
msg += " test_bdf [-q] [-x] [-p] [-c] [-L] [-l] BDF_FILENAME\n" #
msg += " test_bdf [-q] [-p] [-r] BDF_FILENAME\n" #
#msg += " test_bdf [-q] [-p] [-o [<VAR=VAL>]...] BDF_FILENAME\n" #
msg += ' test_bdf -h | --help\n'
msg += ' test_bdf -v | --version\n'
msg += '\n'
msg += "Positional Arguments:\n"
msg += " BDF_FILENAME path to BDF/DAT/NAS file\n"
msg += '\n'
msg += 'Options:\n'
msg += ' -q, --quiet prints debug messages (default=False)\n'
msg += ' -x, --xref disables cross-referencing and checks of the BDF.\n'
msg += ' (default=False -> on)\n'
msg += ' -p, --punch disables reading the executive and case control decks in the BDF\n'
msg += ' (default=False -> reads entire deck)\n'
msg += ' -c, --check disables BDF checks. Checks run the methods on \n'
msg += ' every element/property to test them. May fails if a \n'
msg += ' card is fully not supported (default=False)\n'
msg += ' -l, --large writes the BDF in large field, single precision format (default=False)\n'
msg += ' -d, --double writes the BDF in large field, double precision format (default=False)\n'
msg += ' -L, --loads sums the forces/moments on the model for the different subcases (default=False)\n'
msg += ' -r, --reject rejects all cards with the appropriate values applied (default=False)\n'
#msg += ' -o <VAR_VAL>, --openmdao <VAR_VAL> rejects all cards with the appropriate values applied;\n'
#msg += ' Uses the OpenMDAO %var syntax to replace it with value.\n'
#msg += ' So test_bdf -r var1=val1 var2=val2\n'
msg += ' -h, --help show this help message and exit\n'
msg += " -v, --version show program's version number and exit\n"
if len(sys.argv) == 1:
sys.exit(msg)
ver = str(pyNastran.__version__)
data = docopt(msg, version=ver)
for key, value in sorted(iteritems(data)):
print("%-12s = %r" % (key.strip('--'), value))
import time
t0 = time.time()
is_double = False
if data['--double']:
size = 16
is_double = True
elif data['--large']:
size = 16
else:
size = 8
run_bdf('.',
data['BDF_FILENAME'],
debug=not(data['--quiet']),
xref =not(data['--xref']),
check=not(data['--check']),
punch=data['--punch'],
reject=data['--reject'],
size=size,
is_double=is_double,
sum_load=data['--loads']
)
print("total time: %.2f sec" % (time.time() - t0))
if __name__ == '__main__': # pragma: no cover
main()