Exemplo n.º 1
0
def run_fem2(bdfModel, outModel, xref, punch,
             sum_load, size, is_double,
             reject, debug=False, log=None):
    """Reads/writes the BDF to verify nothing has been lost"""
    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
Exemplo n.º 2
0
def run_fem2(bdfModel, outModel, xref, punch,
             sum_load, size, precision,
             reject, debug=False, log=None):
    assert os.path.exists(bdfModel), bdfModel
    assert os.path.exists(outModel), outModel

    double = get_double_from_precision(precision)
    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=double)
    #fem2.writeAsCTRIA3(outModel2)
    os.remove(outModel2)
    return (fem2)
Exemplo n.º 3
0
def run_fem2(bdfModel, outModel, xref, punch, 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

    #fem2.sumForces()
    #fem2.sumMoments()
    outModel2 = bdfModel + '_out2'
    fem2.write_bdf(outModel2, interspersed=True)
    #fem2.writeAsCTRIA3(outModel2)
    os.remove(outModel2)
    return (fem2)
Exemplo n.º 4
0
def run_fem2(bdf_model, out_model, xref, punch,
             sum_load, size, is_double,
             reject, encoding=None, debug=False, log=None):
    """
    Reads/writes the BDF to verify nothing has been lost

    Parameters
    ----------
    bdf_model : str
        the filename to run
    out_model
    xref : bool
       xrefs
    punch : bool
       punches
    sum_load : bool
       sums static load
    size : int
    is_double : bool
    reject : bool
        True : rejects the cards
    debug : bool
        debugs
    log : logger / None
        ignored
    """
    assert os.path.exists(bdf_model), bdf_model
    assert os.path.exists(out_model), out_model

    if reject:
        fem2 = BDFReplacer(bdf_model + '.rej', debug=debug, log=None)
    else:
        fem2 = BDF(debug=debug, log=None)
    fem2.log.info('starting fem2')
    sys.stdout.flush()
    try:
        fem2.read_bdf(out_model, xref=xref, punch=punch, encoding=encoding)
    except:
        print("failed reading %r" % out_model)
        raise

    out_model_2 = bdf_model + '_out2'

    if xref and sum_load:
        p0 = array([0., 0., 0.])

        subcase_keys = fem2.case_control_deck.get_subcase_list()
        subcases = fem2.subcases

        sol_200_map = fem2.case_control_deck.sol_200_map
        sol_base = fem2.sol
        is_restart = False
        for line in fem2.executive_control_lines:
            if 'RESTART' in line:
                is_restart = True
        if not is_restart:
            validate_case_control(fem2, p0, sol_base, subcase_keys, subcases, sol_200_map)

    fem2.write_bdf(out_model_2, interspersed=False, size=size, is_double=is_double)
    #fem2.writeAsCTRIA3(out_model_2)
    os.remove(out_model_2)
    return fem2
Exemplo n.º 5
0
def run_fem2(bdf_model, out_model, xref, punch,
             sum_load, size, is_double,
             reject, encoding=None, debug=False, log=None):
    """
    Reads/writes the BDF to verify nothing has been lost

    Parameters
    ----------
    bdf_model : str
        the filename to run
    out_model
    xref : bool
       xrefs
    punch : bool
       punches
    sum_load : bool
       sums static load
    size : int
    is_double : bool
    reject : bool
        True : rejects the cards
    debug : bool
        debugs
    log : logger / None
        ignored
    """
    assert os.path.exists(bdf_model), bdf_model
    assert os.path.exists(out_model), out_model

    if reject:
        fem2 = BDFReplacer(bdf_model + '.rej', debug=debug, log=None)
    else:
        fem2 = BDF(debug=debug, log=None)
    fem2.log.info('starting fem2')
    sys.stdout.flush()
    try:
        fem2.read_bdf(out_model, xref=xref, punch=punch, encoding=encoding)
    except:
        print("failed reading %r" % out_model)
        raise

    out_model_2 = bdf_model + '_out2'

    if xref and sum_load:
        p0 = array([0., 0., 0.])

        subcase_keys = fem2.case_control_deck.get_subcase_list()
        subcases = fem2.subcases

        sol_200_map = fem2.case_control_deck.sol_200_map
        sol_base = fem2.sol
        for isubcase in subcase_keys[1:]:  # drop isubcase = 0
            subcase = subcases[isubcase]
            if sol_base == 200:
                analysis = subcase.get_parameter('ANALYSIS')[0]
                sol = sol_200_map[analysis]
            else:
                sol = sol_base

            if sol == 101:
                assert 'SPC' in subcase, subcase
                assert True in subcase.has_parameter('LOAD', 'TEMPERATURE(LOAD)'), subcase
            elif sol == 103:
                assert 'METHOD' in subcase, subcase
            elif sol == 108: # freq
                assert 'FREQUENCY' in subcase, subcase
            elif sol == 111:  # time
                assert any(subcase.has_parameter('TIME', 'TSTEP', 'TSTEPNL')), subcase
            elif sol == 111:  # modal frequency
                assert subcase.has_parameter('FREQUENCY'), subcase
            elif sol == 112:  # modal transient
                assert any(subcase.has_parameter('TIME', 'TSTEP', 'TSTEPNL')), subcase

            elif sol == 129:  # nonlinear transient
                assert any(subcase.has_parameter('TIME', 'TSTEP', 'TSTEPNL')), subcase
            elif sol == 159:  # thermal transient
                assert any(subcase.has_parameter('TIME', 'TSTEP', 'TSTEPNL')), subcase

            elif sol == 144:
                assert 'SUPORT1' in subcase or len(fem2.suport), subcase
                if 'SUPORT1' in subcase:
                    value, options = subcase.get_parameter('SUPORT1')
                    assert value in fem2.suport1, fem2.suport1
                assert 'TRIM' in subcase, subcase
            elif sol == 145:
                assert 'METHOD'in subcase, subcase
                assert 'FMETHOD' in subcase, subcase  # FLUTTER
            elif sol == 146:
                assert 'METHOD'in subcase, subcase
                assert any(subcase.has_parameter('FREQUENCY', 'TIME', 'TSTEP', 'TSTEPNL')), subcase
                assert any(subcase.has_parameter('GUST', 'LOAD')), subcase
            elif sol == 200:
                assert 'DESOBJ' in subcase, subcase
                assert 'ANALYSIS' in subcase, subcase

            if 'METHOD' in subcase:
                method_id = subcase.get_parameter('METHOD')[0]
                if method_id in fem2.methods:
                    method = fem2.methods[method_id]
                #elif method_id in fem2.cMethods:
                    #method = fem2.cMethods[method_id]
                else:
                    raise RuntimeError('METHOD = %s' % method_id)

                assert sol in [5, 76, 101, 103, 105, 106, 107, 108, 110, 111,
                               112, 144, 145, 146, 187], 'sol=%s METHOD' % sol
            if 'CMETHOD' in subcase:
                method_id = subcase.get_parameter('CMETHOD')[0]
                method = fem2.cMethods[method_id]
                assert sol in [107, 110, 145], 'sol=%s CMETHOD' % sol

            if 'LOAD' in subcase:
                loadcase_id = fem2.case_control_deck.get_subcase_parameter(isubcase, 'LOAD')[0]
                force, moment = fem2.sum_forces_moments(p0, loadcase_id, include_grav=False)
                print('  isubcase=%i F=%s M=%s' % (isubcase, force, moment))
                assert sol in [1, 5, 24, 61, 64, 66, 101, 103, 105, 106, 107, 108, 110, 112,
                               144, 145, 153, 400, 601], 'sol=%s LOAD' % sol
            else:
                # print('is_load =', subcase.has_parameter('LOAD'))
                pass

            if 'FREQUENCY' in subcase:
                freq_id = subcase.get_parameter('FREQUENCY')[0]
                freq = fem2.frequencies[freq_id]
                assert sol in [26, 68, 76, 78, 88, 108, 101, 111, 112, 118, 146], 'sol=%s FREQUENCY' % sol
                # print(freq)

            # if 'LSEQ' in subcase:
                # lseq_id = subcase.get_parameter('LSEQ')[0]
                # lseq = fem2.loads[lseq_id]
                # assert sol in [], sol
                # print(lseq)
            if 'SPC' in subcase:
                spc_id = subcase.get_parameter('SPC')[0]
                fem2.get_spcs(spc_id)
            if 'MPC' in subcase:
                mpc_id = subcase.get_parameter('MPC')[0]
                fem2.get_mpcs(mpc_id)

            if 'DLOAD' in subcase:
                assert sol in [26, 68, 76, 78, 88, 99, 103, 108, 109, 111, 112, 118, 129, 146,
                               153, 159, 400, 601], 'sol=%s DLOAD' % sol
                if 'LOADSET' in subcase:
                    raise NotImplementedError('LOADSET & DLOAD -> LSEQ')
                if 'IC' in subcase:
                    raise NotImplementedError('IC & DLOAD -> TIC')

                # DLOAD (case)   -> dynamic loads -> DLOAD, RLOAD1, RLOAD2, TLOAD1, TLOAD2, ACSRCE
                # LOADSET (case) -> static load sequence - > LSEQ
                # LSEQ (bulk)    -> sequence of static load sets
                # IC (case)      -> points to TIC (initial conditions)
                #
                # TYPE 0 (LOAD)
                #  - no LOADSET -> DAREA, static, thermal load entry
                #  -    LOADSET -> static, thermal loads as specified by LSEQ
                # TYPE 1/2/3 (DISP, VELO, ACCE)
                #  - no LOADSET -> SPCD
                #  -    LOADSET -> SPCDs as specified by LSEQ
                dload_id = subcase.get_parameter('DLOAD')[0]
                if dload_id in fem2.dloads:
                    dload = fem2.dloads[dload_id]
                else:
                    dload = fem2.dload_entries[dload_id]
                # dload = DLOAD()
                # print(dload)
                # for
                # loads, sf = dload.get_loads()
                scale_factors2 = []
                loads2 = []
                for load in dload:
                    # print('DLOAD\n', load)
                    if isinstance(load, DLOAD):
                        scale = load.scale
                        scale_factors = []
                        loads = []
                        # scale_factors, loads = load.get_reduced_loads()
                        for load, scale_factor in zip(load.load_ids, load.scale_factors):
                            if isinstance(load, list):
                                for loadi in load:
                                    assert not isinstance(loadi, list), loadi
                                    scale_factors.append(scale * scale_factor)
                                    loads.append(loadi)
                            else:
                                scale_factors.append(scale * scale_factor)
                                assert not isinstance(load, list), load
                                loads.append(load)
                        scale_factors2 += scale_factors
                        loads2 += loads
                    else:
                        scale_factors2.append(1.)
                        loads2.append(load)

                if sol in [108, 111]:  # direct frequency, modal frequency
                    for load2, scale_factor in zip(loads2, scale_factors2):
                        # for
                        #print(load2)
                        freq_id = subcase.get_parameter('FREQ')[0]
                        freq = fem2.frequencies[freq_id]
                        #print('freqs =', freq.freqs)
                        fmax = freq.freqs[-1]
                        force = load2.get_load_at_freq(fmax) * scale_factor
                elif sol in [109, 129]:  # direct transient (time linear), time nonlinear
                    for load2, scale_factor in zip(loads2, scale_factors2):
                        # for
                        #print(load2)
                        force = load2.get_load_at_time(0.) * scale_factor
                ### 111
                else:
                    fem2.log.debug('solution=%s; DLOAD is not supported' % sol)

                # print(loads)

    fem2.write_bdf(out_model_2, interspersed=False, size=size, is_double=is_double)
    #fem2.writeAsCTRIA3(out_model_2)
    os.remove(out_model_2)
    return fem2
Exemplo n.º 6
0
def run_fem2(bdfModel, out_model, xref, punch,
             sum_load, size, is_double,
             reject, debug=False, log=None):
    """
    Reads/writes the BDF to verify nothing has been lost

    Parameters
    ----------
    bdfModel
    out_model
    xref : bool
       xrefs
    punch : bool
       punches
    sum_load : bool
       sums static load
    size : int
    is_double : bool
    reject : bool
        True : rejects the cards
    debug : bool
        debugs
    log : logger / None
        ignored
    """
    assert os.path.exists(bdfModel), bdfModel
    assert os.path.exists(out_model), out_model

    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(out_model, xref=xref, punch=punch)
    except:
        print("failed reading %r" % out_model)
        raise

    outModel2 = bdfModel + '_out2'

    if sum_load:
        p0 = array([0., 0., 0.])

        subcase_keys = fem2.case_control_deck.get_subcase_list()
        subcases = fem2.subcases

        sol_200_map = fem2.case_control_deck.sol_200_map
        sol_base = fem2.sol
        for isubcase in subcase_keys[1:]:  # drop isubcase = 0
            subcase = subcases[isubcase]
            if sol_base == 200:
                analysis = subcase.get_parameter('ANALYSIS')[0]
                sol = sol_200_map[analysis]
            else:
                sol = sol_base

            if subcase.has_parameter('METHOD'):
                method_id = subcase.get_parameter('METHOD')[0]
                method = fem2.methods[method_id]
                assert sol in [5, 76, 101, 103, 105, 106, 107, 108, 110, 111, 112, 144, 145, 187], 'sol=%s METHOD' % sol
            if subcase.has_parameter('CMETHOD'):
                method_id = subcase.get_parameter('CMETHOD')[0]
                method = fem2.cMethods[method_id]
                assert sol in [107, 110, 145], 'sol=%s CMETHOD' % sol

            if subcase.has_parameter('LOAD'):
                loadcase_id = fem2.case_control_deck.get_subcase_parameter(isubcase, 'LOAD')[0]
                F, M = fem2.sum_forces_moments(p0, loadcase_id, include_grav=False)
                print('  isubcase=%i F=%s M=%s' % (isubcase, F, M))
                assert sol in [1, 5, 24, 61, 64, 66, 101, 103, 105, 106, 107, 108, 110, 112,
                               144, 145, 153, 400, 601], 'sol=%s LOAD' % sol
            else:
                # print('is_load =', subcase.has_parameter('LOAD'))
                pass

            if subcase.has_parameter('FREQUENCY'):
                freq_id = subcase.get_parameter('FREQUENCY')[0]
                freq = fem2.frequencies[freq_id]
                assert sol in [26, 68, 76, 78, 88, 108, 101, 111, 112, 118], 'sol=%s FREQUENCY' % sol
                # print(freq)

            # if subcase.has_parameter('LSEQ'):
                # lseq_id = subcase.get_parameter('LSEQ')[0]
                # lseq = fem2.loads[lseq_id]
                # assert sol in [], sol
                # print(lseq)
            if subcase.has_parameter('DLOAD'):
                assert sol in [26, 68, 76, 78, 88, 99, 103, 108, 109, 111, 112, 118, 129,
                               153, 159, 400, 601], 'sol=%s DLOAD' % sol
                if subcase.has_parameter('LOADSET'):
                    raise NotImplementedError('LOADSET & DLOAD -> LSEQ')
                if subcase.has_parameter('IC'):
                    raise NotImplementedError('IC & DLOAD -> TIC')

                # DLOAD (case)   -> dynamic loads -> DLOAD, RLOAD1, RLOAD2, TLOAD1, TLOAD2, ACSRCE
                # LOADSET (case) -> static load sequence - > LSEQ
                # LSEQ (bulk)    -> sequence of static load sets
                # IC (case)      -> points to TIC (initial conditions)
                #
                # TYPE 0 (LOAD)
                #  - no LOADSET -> DAREA, static, thermal load entry
                #  -    LOADSET -> static, thermal loads as specified by LSEQ
                # TYPE 1/2/3 (DISP, VELO, ACCE)
                #  - no LOADSET -> SPCD
                #  -    LOADSET -> SPCDs as specified by LSEQ
                dload_id = subcase.get_parameter('DLOAD')[0]
                if dload_id in fem2.dloads:
                    dload = fem2.dloads[dload_id]
                else:
                    dload = fem2.dload_entries[dload_id]
                # dload = DLOAD()
                # print(dload)
                # for
                # loads, sf = dload.get_loads()
                scale_factors2 = []
                loads2 = []
                for load in dload:
                    # print('DLOAD\n', load)
                    if isinstance(load, DLOAD):
                        scale = load.scale
                        scale_factors = []
                        loads = []
                        # scale_factors, loads = load.get_reduced_loads()
                        for load, sf in zip(load.loadIDs, load.scaleFactors):
                            if isinstance(load, list):
                                for loadi in load:
                                    assert not isinstance(loadi, list), loadi
                                    scale_factors.append(scale * sf)
                                    loads.append(loadi)
                            else:
                                scale_factors.append(scale * sf)
                                assert not isinstance(load, list), load
                                loads.append(load)
                        scale_factors2 += scale_factors
                        loads2 += loads
                    else:
                        scale_factors2.append(1.)
                        loads2.append(load)

                if sol in [108, 111]:  # direct frequency, modal frequency
                    for load2, scale_factor in zip(loads2, scale_factors2):
                        # for
                        #print(load2)
                        F = load2.get_load_at_freq(100.) * scale_factor
                elif sol in [109, 129]:  # direct transient (time linear), time nonlinear
                    for load2, scale_factor in zip(loads2, scale_factors2):
                        # for
                        #print(load2)
                        F = load2.get_load_at_time(0.) * scale_factor
                ### 111
                else:
                    fem2.log.debug('solution=%s; DLOAD is not supported' % sol)

                # print(loads)

    fem2.write_bdf(outModel2, interspersed=False, size=size, is_double=is_double)
    #fem2.writeAsCTRIA3(outModel2)
    os.remove(outModel2)
    return fem2