def test_case_control_04(self): seti = 'SET 88 = 5, 6, 7, 8, 9, 10 THRU 55 EXCEPT 15, 16, 77, 78, 79, 100 THRU 300' lines = [] deck = CaseControlDeck(lines) deck.create_new_subcase(2) deck.add_parameter_to_local_subcase(2, seti) values, options = deck.get_subcase_parameter(2, 'SET 88') check = [ (7, True), (13, True), (15, False), (16, False), (55, True), (77, True), (99, False), (150, True), ] for value, exists in check: if exists: assert value in values, 'value=%s should be in values=%s' % (value, values) else: assert value not in values, 'value=%s should NOT be in values=%s' % (value, values) msg = write_set(values, options) singles, doubles = collapse_thru_packs(values) assert singles == [77, 78, 79], singles assert doubles == [[5, 'THRU', 14], [17, 'THRU', 55], [100, 'THRU', 300]], doubles
def test_case_control_04(self): seti = 'SET 88 = 5, 6, 7, 8, 9, 10 THRU 55 EXCEPT 15, 16, 77, 78, 79, 100 THRU 300' lines = [] deck = CaseControlDeck(lines) deck.create_new_subcase(2) deck.add_parameter_to_local_subcase(2, seti) values, set_id = deck.get_subcase_parameter(2, 'SET 88') check = [ (7, True), (13, True), (15, False), (16, False), (55, True), (77, True), (99, False), (150, True), ] for value, exists in check: if exists: assert value in values, 'value=%s should be in values=%s' % ( value, values) else: assert value not in values, 'value=%s should NOT be in values=%s' % ( value, values) unused_msg = write_set(set_id, values) singles, doubles = collapse_thru_packs(values) assert singles == [77, 78, 79], singles assert doubles == [[5, 'THRU', 14], [17, 'THRU', 55], [100, 'THRU', 300]], doubles
def test_case_control_05(self): lines = [ 'SUBCASE 1', ' ACCELERATION(PLOT,PRINT,PHASE) = ALL', ' DISPLACEMENT(PLOT,PRINT,PHASE) = ALL', ' DLOAD = 32', ' M2GG = 111', ' SET 88 = 5, 6, 7, 8, 9, 10 THRU 55 EXCEPT 15, 16, 77, 78, 79, ' '100 THRU 300', ' SET 99 = 1 THRU 10', ' SET 105 = 1.009, 10.2, 13.4, 14.0, 15.0', ' SET 111 = MAAX1,MAAX2', ' SET 1001 = 101/T1, 501/T3, 991/R3', #' SET = ALL', ' SET 20 = ALL', ' SPC = 42', ' TSTEPNL = 22', ' VELOCITY(PLOT,PRINT,PHASE) = ALL', 'BEGIN BULK', ] deck = CaseControlDeck(lines) deck.create_new_subcase(2) deck.add_parameter_to_local_subcase( 2, 'SET 2 = 11,12,13,14,15,16,17,18,' '19,20,21,22,23,24,25,26,' '1000000000000000000000000000000000000000000000000000000,33') deck_msg = '%s' % deck #print('%r' % deck_lines) deck_lines = deck_msg.split('\n') lines_expected = [ 'SUBCASE 1', #' SET = ALL', ' SET 20 = ALL', ' SET 88 = 77, 78, 79, 5 THRU 14, 17 THRU 55, 100 THRU 300', ' SET 99 = 1 THRU 10', ' SET 105 = 1.009, 10.2, 13.4, 14.0, 15.0', ' SET 111 = MAAX1, MAAX2', ' SET 1001 = 101/T1, 501/T3, 991/R3', ' ACCELERATION(PLOT,PRINT,PHASE) = ALL', ' DISPLACEMENT(PLOT,PRINT,PHASE) = ALL', ' DLOAD = 32', ' M2GG = 111', ' SPC = 42', ' TSTEPNL = 22', ' VELOCITY(PLOT,PRINT,PHASE) = ALL', 'SUBCASE 2', ' SET 2 = 33,', ' 1000000000000000000000000000000000000000000000000000000,', ' 11 THRU 26', ] compare_lines(self, deck_lines, lines_expected, has_endline=False)
def test_case_control_05(self): lines = [ 'SUBCASE 1', ' ACCELERATION(PLOT,PRINT,PHASE) = ALL', ' DISPLACEMENT(PLOT,PRINT,PHASE) = ALL', ' DLOAD = 32', ' M2GG = 111', ' SET 88 = 5, 6, 7, 8, 9, 10 THRU 55 EXCEPT 15, 16, 77, 78, 79, ' '100 THRU 300', ' SET 99 = 1 THRU 10', ' SET 105 = 1.009, 10.2, 13.4, 14.0, 15.0', ' SET 111 = MAAX1,MAAX2', ' SET 1001 = 101/T1, 501/T3, 991/R3', #' SET = ALL', ' SET 20 = ALL', ' SPC = 42', ' TSTEPNL = 22', ' VELOCITY(PLOT,PRINT,PHASE) = ALL', 'BEGIN BULK', ] deck = CaseControlDeck(lines) deck.create_new_subcase(2) deck.add_parameter_to_local_subcase(2, 'SET 2 = 11,12,13,14,15,16,17,18,' '19,20,21,22,23,24,25,26,' '1000000000000000000000000000000000000000000000000000000,33') deck_msg = '%s' % deck #print('%r' % deck_lines) deck_lines = deck_msg.split('\n') lines_expected = [ 'SUBCASE 1', #' SET = ALL', ' SET 20 = ALL', ' SET 88 = 77, 78, 79, 5 THRU 14, 17 THRU 55, 100 THRU 300', ' SET 99 = 1 THRU 10', ' SET 105 = 1.009, 10.2, 13.4, 14.0, 15.0', ' SET 111 = MAAX1, MAAX2', ' SET 1001 = 101/T1, 501/T3, 991/R3', ' ACCELERATION(PLOT,PRINT,PHASE) = ALL', ' DISPLACEMENT(PLOT,PRINT,PHASE) = ALL', ' DLOAD = 32', ' M2GG = 111', ' SPC = 42', ' TSTEPNL = 22', ' VELOCITY(PLOT,PRINT,PHASE) = ALL', 'SUBCASE 2', ' SET 2 = 33,', ' 1000000000000000000000000000000000000000000000000000000,', ' 11 THRU 26', ] compare_lines(self, deck_lines, lines_expected, has_endline=False)
def test_case_control_01(self): lines = [ 'SPC=2', 'MPC =3', 'STRESS= ALL', 'DISPLACEMENT(PLOT,PUNCH) = 8', ] deck = CaseControlDeck(lines) deck.write_begin_bulk = False self.assertTrue(deck.has_parameter(0, 'SPC')) self.assertTrue(deck.has_parameter(0, 'sPC')) self.assertFalse(deck.has_parameter(0, 'JUNK')) #print("get_subcase_parameter(MPC) 3 = ", deck.get_subcase_parameter(0, 'MPC')) deck.add_parameter_to_global_subcase('GPFORCE = 7') deck.create_new_subcase(1) deck.create_new_subcase(2) deck.add_parameter_to_local_subcase(1, 'STRAIN = 7') unused_out = deck.get_subcase_parameter(0, 'GPFORCE') deck.add_parameter_to_local_subcase(1, 'ANALYSIS = SAERO') deck.add_parameter_to_local_subcase(2, 'ANALYSIS = STATIC') unused_out = deck.get_subcase_parameter(2, 'ANALYSIS') deck.add_parameter_to_local_subcase(1, 'SET 1 = 100') deck.add_parameter_to_local_subcase(1, 'SET 2 = 200') lines_expected = [ 'DISPLACEMENT(PLOT,PUNCH) = 8', 'GPFORCE = 7', 'MPC = 3', 'SPC = 2', 'STRESS = ALL', 'SUBCASE 1', ' SET 1 = 100', ' SET 2 = 200', ' ANALYSIS = SAERO', ' STRAIN = 7', 'SUBCASE 2', ' ANALYSIS = STATIC', ] deck_string = '%s' % deck deck_lines = deck_string.strip().splitlines() msg = '\n' + '\n'.join(deck_lines) self.assertEqual(lines_expected, deck_lines, msg=msg) compare_lines(self, deck_lines, lines_expected, has_endline=False)
def test_case_control_01(self): lines = ['SPC=2', 'MPC =3', 'STRESS= ALL', 'DISPLACEMENT(PLOT,PUNCH) = 8', ] deck = CaseControlDeck(lines) deck.write_begin_bulk = False self.assertTrue(deck.has_parameter(0, 'SPC')) self.assertTrue(deck.has_parameter(0, 'sPC')) self.assertFalse(deck.has_parameter(0, 'JUNK')) #print("get_subcase_parameter(MPC) 3 = ", deck.get_subcase_parameter(0, 'MPC')) deck.add_parameter_to_global_subcase('GPFORCE = 7') deck.create_new_subcase(1) deck.create_new_subcase(2) deck.add_parameter_to_local_subcase(1, 'STRAIN = 7') out = deck.get_subcase_parameter(0, 'GPFORCE') deck.add_parameter_to_local_subcase(1, 'ANALYSIS = SAERO') deck.add_parameter_to_local_subcase(2, 'ANALYSIS = STATIC') out = deck.get_subcase_parameter(2, 'ANALYSIS') deck.add_parameter_to_local_subcase(1, 'SET 1 = 100') deck.add_parameter_to_local_subcase(1, 'SET 2 = 200') lines_expected = [ 'DISPLACEMENT(PLOT,PUNCH) = 8', 'GPFORCE = 7', 'MPC = 3', 'SPC = 2', 'STRESS = ALL', 'SUBCASE 1', ' SET 1 = 100', ' SET 2 = 200', ' ANALYSIS = SAERO', ' STRAIN = 7', 'SUBCASE 2', ' ANALYSIS = STATIC',] deck_string = '%s' % deck deck_lines = deck_string.strip().splitlines() msg = '\n' + '\n'.join(deck_lines) self.assertEqual(lines_expected, deck_lines, msg=msg) compare_lines(self, deck_lines, lines_expected, has_endline=False)
def test_case_control_set(self): """tests adding SETs""" deck = CaseControlDeck([], log=None) subcase = deck.create_new_subcase(1) subcase.params['SET 42'] = [[1, 2, 3, 4, 5], 42, 'SET-type'] set_str = write_set(41, [1, 2, 3]).rstrip() set_str2 = set_str.split('=', 1)[1] assert set_str2 == ' 1, 2, 3', set_str2 subcase.add('SET 52', set_str2, 52, 'SET-type') subcase.add_set_from_values(100, [1, 2, 10])
def load_case_control(geom_model: BDF, hdf5_case_control): names = hdf5_case_control.dtype.names names = list(names) names.remove('SID') lines = [] cc = CaseControlDeck(lines, log=None) log = cc.log sids = hdf5_case_control['SID'] log.info(f'subcases = {sids}') for sid in sids: subcase = cc.create_new_subcase(sid) cc.subcases[sid] = subcase integer_mapped_names = { 'NOHARMON': ('HARMONICS', 1), 'SPCSET': ('SPC', 0), 'MPCSET': ('MPC', 0), 'TIC': ('IC', 0), 'ESLSET': ('LOAD', 0), 'DYMLDSET': ('DLOAD', 0), 'TFSET': ('TFL', 0), 'FLUTTER': ('FLUTTER', 0), 'RANDOM': ('RANDOM', 0), 'GUST': ('GUST', 0), 'LOADSET': ('LOADSET', 0), 'CLOAD': ('CLOAD', 0), 'APRESS': ('APRESS', 0), 'TRIM': ('TRIM', 0), 'FLDBNDY': ('MFLUID', 0), 'DIVERG': ('DIVERG', 0), 'DESOBJ': ('DESOBJ', 0), 'DESSUB': ('DESSUB', 0), 'BCID': ('BC', 0), 'REESET': ('METHOD(STRUCTURE)', 0), 'ELDSET': ('DEFORM', 0), 'THLDSET': ('TEMP(LOAD)', 0), 'THMATSET': ('TEMP(MAT)', 0), # or TEMP(INIT) ??? 'FEQRESET': ('FREQUENCY', 0), 'TSTEPTRN': ('TSTEP', 0), 'AXSYMSET': ('AXISYMMETRIC', 0), 'DAMPTBL': ('SDAMP(STRUCT)', 0), 'NONPARAM': ('NLPARM', 0), 'LOADSET': ('LOADSET', 0), 'MODLIST': ('OMODES', 0), 'REESETF': ('METHOD(FLUID)', 0), 'NMODES': ('NMODES', 0), 'ADAPT': ('ADAPT', 0), 'SUBSPAN': ('SUBSPAN', 0), 'DESGLB': ('DESGLB', 0), 'SUPORT1': ('SUPORT1', 0), 'STATSUBB': ('STATSUB(BUCKLE)', 0), 'STATSUBP': ('STATSUB(PRELOAD)', 0), 'AUXMODEL': ('AUXMODEL', 0), 'NSMID': ('NSM', 0), 'NONLINLD': ('NONLINEAR', 0), 'CYCLIC': ('DSYM', 0), 'DYNRED': ('DYNRED', 0), 'CEESET': ('CMETHOD', 0), 'AECSSSET': ('CSSCHD', 0), 'TEMPMAT': ('TEMP(MAT)', 0), 'RGYRO': ('RGYRO', 0), # superelements 'SEMG': ('SEMG', -1), 'SEKR': ('SEKR', -1), 'SELG': ('SELG', -1), 'SELR': ('SELR', -1), #'SEID' : ('SEID', -1), 'SEMR': ('SEMR', -1), 'SEDV': ('SEDV', -1), 'SERE': ('SERE', -1), 'SEEXCLUDE': ('SEEX', 0), 'SEEXCLUDE': ('SEEX', 0), } stress_mapped_names = [ # media = plot; print; punch # format = real; real/imag; magnitude/phase # rout - random output # RANDBIT: Random analysis request bit pattern (DISP,VELO,etc.) ('DISPLACEMENT', 'DPLPTSET', 'DPLMEDIA', 'DPLFMT'), # ROUTDISP ('OLOAD', 'LDSPTSET', 'LDSMEDIA', 'LDSFMT'), # ROUTLOAD ('VELOCITY', 'VELPTSET', 'VELMEDIA', 'VELFMT'), # ROUTVELO ('ACCEL', 'ACCPTSET', 'ACCMEDIA', 'ACCFMT'), # ROUTACCE ('MPCFORCE', 'MPCFSET', 'MPCMEDIA', 'MPCFFMT'), # ROUTMSCF ('SPCFORCE', 'FOCPTSET', 'FOCMEDIA', 'FOCFMT'), # ROUTSPCF ('FORCE', 'FCEPTSET', 'FCEMEDIA', 'FCEFMT'), # ROUTFORC ('STRESS', 'STSPTSET', 'STSMEDIA', 'STSFMT'), # ROUTSTRS, VONMISES-done ('STRAIN', 'STNSET', 'STNMEDIA', 'STNFMT'), # ROUTSTRN #'GPQSTRS', # CQUAD4 corner stress output - done #'GPQFORC', # CQUAD4 corner force output - done #'GPQSTRN', # CQUAD4 corner strain output - done ('SDISP', 'SSDSET', 'SSDMEDIA', 'SSDFMT'), ('SVELO', 'SSVSET', 'SSVMEDIA', 'SSVFMT'), ('SACCE', 'SSASET', 'SSAMEDIA', 'SSAFMT'), ('GPFORCE', 'GPFSET', 'GPFMEDIA', 'GPFFMT'), ('ESE', 'ESESET', 'ESEMEDIA', 'ESEFMT'), ('AEROF', 'ARFPTSET', 'ARFMEDIA', 'ARFFMT'), ('SVECTOR', 'SVSET', 'SVMEDIA', 'SVFMT'), ('MPRES', 'FLUPTSET', 'FLUMEDIA', 'FLUFMT'), ('ELSDCON', 'ESDPTSET', 'ESDMEDIA', 'ESDFMT'), ('GPSDCON', 'GSDPTSET', 'GSDMEDIA', 'GSDFMT'), ('BOUTPUT', 'CNTSET', 'CNTMEDIA', 'CNTFMT'), ('NLSTRESS', 'NLSSET', 'NLSMEDIA', 'NLSFMT'), ('GPSTRAIN', 'GPEPTSET', 'GPEMEDIA', 'GPEFMT'), ('EKE', 'EKEPTSET', 'EKEMEDIA', 'EKEFMT'), # EKETHRSH ('EDE', 'EDEPTSET', 'EDEMEDIA', 'EDEFMT'), # EDETHRSH ('GPKE', 'GPKESET', 'GPKEMEDI', 'GPKEFMT'), # ('ACFPM', 'ACFPMSET', 'ACFPMMED', 'ACFPMFMT'), ('ERP', 'ERPSID', 'ERPMED', 'ERPFMT'), ('NLLOAD', 'NONPTSET', 'NONMEDIA', 'NONFMT'), ('GPSTRESS', 'GPSPTSET', 'GPSMEDIA', 'GPSFMT'), ('STRFIELD', 'STFSET', 'STFMEDIA', 'STFFMT'), #('RCROSS', 'RCRSET', '', 'RCRFMT'), ('PFGRID', 'PFGSID', 'PFGMED', 'PFGFMT'), ('PFMODE(STRUCTURE)', 'PFMSSID', 'PFMSMED', 'PFMSFMT'), ('PFMODE(FLUID)', 'PFMFSID', 'PFMFMED', 'PFMFFMT'), ('GVECTOR', 'GVSET', 'GVMEDIA', 'GVFMT'), ('INTENSITY', 'INTENSET', 'INTENMED', 'INTENFMT'), ('DATAREC', 'DATSET', 'DATMEDIA', 'DATFMT'), ('VUGRID', 'VUGSET', 'VUGMEDIA', 'VUGFMT'), ('MAXMIN', 'MXMNGSET', 'MXMNGMDA', 'MXMNGFMT'), # MXMNESET, MXMNEMDA, MXMNEFMT #('MCFRACTION', 'MCFRSET', '', ''), # MCFRSOLN, MCFRSOLN, MCFROPT #('FATIGUE', 'FATIGUE', 'FTGMED', ''), ('ICF', 'ICFSET', 'ICFMED', 'ICFFMT' ), # ICFGENST, ICFGENNM, ICFUSEST, ICFUSENM ('ACPOWER', 'ACPOWSET', 'ACPOWMED', 'ACPOWFMT'), # ACPOWCSV ('MODALSE', 'MDLSSET', 'MDLSMEDIA', 'MDLSFMT'), # MDLSTHRE, MDLSTFVL ('MODALKE', 'MDLKSET', 'MDLKMEDIA', 'MDLKFMT'), # MDLKESRT, MDLKTHRE, MDLKTFVL #('CMSENRGY', 'CMSESET', 'CMSEMDIA', ''), # CMSEOPTS, CMSETHRE, CMSETOPN ] string_types = [ 'SUBTITLE', 'LABEL', 'TITLE', # trivial 'ANALYSIS', #'AECONFIG', # 'POSTO2NM', # matrices 'K2PP', 'M2PP', 'B2PP', 'P2G', 'K2GG', 'M2GG', 'B2GG', 'A2GG', 'K42GG', ] special_names = [ 'AESYMXY', 'AESYMXZ', 'VONMISES', # vonmises flag for STRESS 'GPQSTRS', # CQUAD4 corner stress output 'GPQFORC', # CQUAD4 corner force output 'GPQSTRN', # CQUAD4 corner strain output #'MXMNESET', # MAXMIN element set selection #'MXMNEMDA', # MAXMIN element output media #'MXMNEFMT', # MAXMIN element output format 'MCFRSET', # MCFRACTION: Modal contribution fraction set identification number 'MCFRSOLN', # MCFRACTION: SOLUTION=1001 'MCFRFILT', # MCFRACTION: FILTER=0.01 #'MCFROPT', # MCFRACTION: options bit pattern ] integer_mapped_names = {} stress_mapped_names = [] special_names = [] subcases = cc.subcases for name_str in string_types: assert name_str in names, name_str values = hdf5_case_control[name_str] names.remove(name_str) for sid, value in zip(sids, values): value = value.strip().decode('latin1') if len(value) == 0: continue options = [] subcase = subcases[sid] # type: Subcase assert isinstance(value, str), value subcase.add(name_str, value, options, 'STRING-type') for mapped_namesi in stress_mapped_names: (name_str, set_str, media_str, fmt_str) = mapped_namesi #if name_str not in names: #log.error(f'skipping {name_str} because it is missing...') #continue values = hdf5_case_control[set_str] medias = hdf5_case_control[media_str] fmts = hdf5_case_control[fmt_str] #names.remove(name_str) names.remove(set_str) names.remove(media_str) names.remove(fmt_str) for sid, value, media, fmt in zip(sids, values, medias, fmts): if value == 0: #log.debug(f'stress-type: {name_str} is empty; value={value}') continue elif value == -1: # default value = 'ALL' #log.debug(f'stress-type: {name_str} is default; value={value}') #continue options = [] if fmt == 0: # ?? pass # options.append('SORT1') elif fmt == 1: # ?? options.append('SORT1') elif fmt == 2: # ?? options.append('SORT1') else: raise RuntimeError((name_str, sid, value, media, fmt)) if media in (1, 3, 5, 7): options.append('PRINT') if media in (2, 3, 6, 7): options.append('PRINT') if media in (4, 5, 6, 7): options.append('PUNCH') #if media == 1: #options.append('PRINT') #elif media == 2: #options.append('PLOT') #elif media == 3: #options.extend(['PLOT', 'PRINT']) #elif media == 4: #options.append('PUNCH') #elif media == 5: #options.extend(['PRINT', 'PUNCH']) #elif media == 6: #options.extend(['PLOT', 'PUNCH']) #else: #raise RuntimeError((name_str, sid, value, media, fmt)) subcase = subcases[sid] # type: Subcase subcase.add(name_str, value, options, 'STRESS-type') names_copy = deepcopy(names) #skip_fields = ['NONFMT', 'NONMEDIA', ''] for name in names: names_copy.remove(name) values = hdf5_case_control[name] for sid, value in zip(sids, values): if name in integer_mapped_names: updated_name, default = integer_mapped_names[name] if value == default: continue # SPC = 1 subcase = subcases[sid] # type: Subcase options = [] subcase.add(updated_name, value, options, 'STRESS-type') elif name in special_names: continue #elif name.endswith('FMT'): #log.error(f'format skipping {name}={value}') elif name == 'DOMAIN_ID': log.warning(f'skipping {name}={value}') break #else: #log.warning(f'skipping {name}={value}') #cc.dtype.names ### _load_special_names(special_names, hdf5_case_control, subcases, sids, cc.log) #str(cc) geom_model.case_control_deck = cc