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)
Exemplo n.º 7
0
 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])
Exemplo n.º 8
0
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