コード例 #1
0
ファイル: RigidBodyKinematics.cpp プロジェクト: IBAMR/IBAMR
void
RigidBodyKinematics::setRigidBodySpecificVelocity(const double time,
                                                  const std::vector<double>& /*incremented_angle_from_reference_axis*/,
                                                  const std::vector<double>& center_of_mass,
                                                  const std::vector<double>& /*tagged_pt_position*/)
{
    std::vector<double> vel_parser(NDIM);
    d_parser_time = time;
    for (int d = 0; d < NDIM; ++d) d_parser_posn[d] = center_of_mass[d];
    for (int d = 0; d < NDIM; ++d) vel_parser[d] = d_kinematicsvel_parsers[d]->Eval();

    static const StructureParameters& struct_param = getStructureParameters();
    static const int coarsest_ln = struct_param.getCoarsestLevelNumber();
    static const int finest_ln = struct_param.getFinestLevelNumber();
    static const int total_levels = finest_ln - coarsest_ln + 1;
    static const std::vector<std::pair<int, int> >& idx_range = struct_param.getLagIdxRange();

    for (int ln = 0; ln < total_levels; ++ln)
    {
        const int nodes_this_ln = idx_range[ln].second - idx_range[ln].first;
        for (int d = 0; d < NDIM; ++d)
        {
            for (int idx = 0; idx < nodes_this_ln; ++idx) d_kinematics_vel[ln][d][idx] = vel_parser[d];
        }
    }

    return;

} // setRigidBodySpecificVelocity
コード例 #2
0
ファイル: RigidBodyKinematics.cpp プロジェクト: IBAMR/IBAMR
void
RigidBodyKinematics::setRigidBodySpecificVelocity(const double time,
                                                  const std::vector<double>& /*incremented_angle_from_reference_axis*/,
                                                  const std::vector<double>& center_of_mass,
                                                  const std::vector<double>& /*tagged_pt_position*/)
{
    std::vector<double> vel_parser(NDIM);
    d_parser_time = time;
    for (int d = 0; d < NDIM; ++d) d_parser_posn[d] = center_of_mass[d];
    for (int d = 0; d < NDIM; ++d) vel_parser[d] = d_kinematicsvel_parsers[d]->Eval();
    const StructureParameters& struct_param = getStructureParameters();
#if !defined(NDEBUG)
    {
        const int finest_ln = struct_param.getFinestLevelNumber();
        const int coarsest_ln = struct_param.getCoarsestLevelNumber();
        TBOX_ASSERT(finest_ln == coarsest_ln);
    }
#endif
    const std::vector<std::pair<int, int> >& idx_range = struct_param.getLagIdxRange();
    const int nodes_this_ln = idx_range[0].second - idx_range[0].first;
    for (int d = 0; d < NDIM; ++d)
        for (int idx = 0; idx < nodes_this_ln; ++idx) d_kinematics_vel[d][idx] = vel_parser[d];

    return;
} // setRigidBodySpecificVelocity
コード例 #3
0
const std::vector<std::vector<double> >&
OscillatingCylinderKinematics::getCurrentKinematicsVelocity(const int level) const
{
    static const StructureParameters& struct_param = getStructureParameters();
    static const int coarsest_ln = struct_param.getCoarsestLevelNumber();

    const int offset = level - coarsest_ln;
    return d_current_kinematics_vel[offset];

} // getCurrentKinematicsVelocity
コード例 #4
0
KnifeFishKinematics::KnifeFishKinematics(
    const std::string& object_name,
    SAMRAI::tbox::Pointer<SAMRAI::tbox::Database> input_db,
    IBTK::LDataManager* l_data_manager,
    SAMRAI::tbox::Pointer<SAMRAI::hier::PatchHierarchy<NDIM> > patch_hierarchy,
    bool register_for_restart)
    : ConstraintIBKinematics(object_name,input_db,l_data_manager,register_for_restart),
      d_kinematics_vel(NDIM), 
      d_shape(NDIM), 
      d_current_time(0.0)
{

    // NOTE: Parent class constructor registers class with the restart manager, sets object name. 
      
        //Set the size of vectors.
    const StructureParameters& struct_param           = getStructureParameters();
    const int coarsest_ln                             = struct_param.getCoarsestLevelNumber();
    const int finest_ln                               = struct_param.getFinestLevelNumber();
    TBOX_ASSERT(coarsest_ln == finest_ln);
    const std::vector<std::pair<int,int> >& idx_range = struct_param.getLagIdxRange();

    const int nodes_body = idx_range[0].second - idx_range[0].first;
    for(int d = 0; d < NDIM; ++d)
    {
	d_kinematics_vel[d].resize(nodes_body);
	d_shape[d].resize(nodes_body);
    }
    
    SAMRAI::tbox::Array<double> forward_swim_vel; 
    if(input_db->keyExists("forward_swim_vel"))
    {
        forward_swim_vel = input_db->getDoubleArray("forward_swim_vel");
	TBOX_ASSERT( forward_swim_vel.getSize() == NDIM );
    }
    else
    {
        TBOX_ERROR(" KnifefishKinematics::KnifefishKinematics() :: Forward swimming velocity does not exist in the InputDatabase \n\n" << std::endl );
    }
    for (unsigned int d = 0; d < NDIM; ++d)
	std::fill(d_kinematics_vel[d].begin(), d_kinematics_vel[d].end(), forward_swim_vel[d]); 
    
    bool from_restart = RestartManager::getManager()->isFromRestart();
    if(from_restart) 
    {
        getFromRestart();       
    }
  
    // set current velocity using current time for initial and restarted runs.
    setKnifefishSpecificVelocity(d_current_time);    
 
    return;
  
} //KnifeFishKinematics
コード例 #5
0
ファイル: RigidBodyKinematics.cpp プロジェクト: IBAMR/IBAMR
const std::vector<std::vector<double> >&
RigidBodyKinematics::getKinematicsVelocity(const int level) const
{
    static const StructureParameters& struct_param = getStructureParameters();
    static const int coarsest_ln = struct_param.getCoarsestLevelNumber();

#ifdef DEBUG_CHECK_ASSERTIONS
    static const int finest_ln = struct_param.getFinestLevelNumber();
    TBOX_ASSERT(coarsest_ln <= level && level <= finest_ln);
#endif

    return d_kinematics_vel[level - coarsest_ln];

} // getKinematicsVelocity
コード例 #6
0
void
OscillatingCylinderKinematics::setOscillatingCylinderSpecificVelocity(const double time)
{
    // Set the size of vectors.
    const StructureParameters& struct_param = getStructureParameters();
    const std::vector<std::pair<int, int> >& idx_range = struct_param.getLagIdxRange();
    const int number_lag_points = idx_range[0].second - idx_range[0].first;

    for (int k = 0; k < number_lag_points; ++k)
    {
        d_current_kinematics_vel[0][0][k] = d_prescribed_trans_vel + d_Uinf * std::cos(2 * M_PI * d_freq * time);
    }

    return;

} // setOscillatingCylinderSpecificVelocity
コード例 #7
0
OscillatingCylinderKinematics::OscillatingCylinderKinematics(const std::string& object_name,
                                                             Pointer<Database> input_db,
                                                             LDataManager* l_data_manager,
                                                             Pointer<PatchHierarchy<NDIM> > /*patch_hierarchy*/,
                                                             bool register_for_restart)
    : ConstraintIBKinematics(object_name, input_db, l_data_manager, register_for_restart),
      d_prescribed_trans_vel(0.0),
      d_current_time(0.0)

{
    // NOTE: Parent class constructor registers class with the restart manager, sets object name.

    // Get kinematic parameters from the input file

    if (input_db->keyExists("frequency"))
    {
        d_freq = input_db->getDouble("frequency");
        pout << "FREQUENCY ================= " << d_freq << "\n\n\n";
    }
    else
    {
        TBOX_ERROR(
            " OscillatingCylinderKinematics::OscillatingCylinderKinematics() :: frequency of cylinder does not exist "
            "in the InputDatabase \n\n"
            << std::endl);
    }

    if (input_db->keyExists("U_infinity"))
    {
        d_Uinf = input_db->getDouble("U_infinity");
        pout << "U_INFINITY ================= " << d_Uinf << "\n\n\n";
    }
    else
    {
        TBOX_ERROR(
            " OscillatingCylinderKinematics::OscillatingCylinderKinematics() :: maximum speed of cylinder does not "
            "exist in the InputDatabase \n\n"
            << std::endl);
    }

    // Set the size of vectors.
    const StructureParameters& struct_param = getStructureParameters();
    const int coarsest_ln = struct_param.getCoarsestLevelNumber();
    const int finest_ln = struct_param.getFinestLevelNumber();
    const int total_levels = finest_ln - coarsest_ln + 1;
    const std::vector<std::pair<int, int> >& idx_range = struct_param.getLagIdxRange();

    if (total_levels > 1)
    {
        TBOX_ERROR(
            " OscillatingCylinderKinematics::OscillatingCylinderKinematics() :: Total levels > 1, OscillatingCylinder "
            "should be places on only one level \n\n"
            << std::endl);
    }

    // d_vec_coord.resize(number_lag_points);
    // d_vec_amp.resize(number_lag_points);
    d_new_kinematics_vel.resize(total_levels);
    d_current_kinematics_vel.resize(total_levels);

    for (int ln = 0; ln < total_levels; ++ln)
    {
        const int nodes_this_ln = idx_range[ln].second - idx_range[ln].first;
        d_new_kinematics_vel[ln].resize(NDIM);
        d_current_kinematics_vel[ln].resize(NDIM);

        for (int d = 0; d < NDIM; ++d)
        {
            d_new_kinematics_vel[ln][d].resize(nodes_this_ln);
            d_current_kinematics_vel[ln][d].resize(nodes_this_ln);
        }
    }

    bool from_restart = RestartManager::getManager()->isFromRestart();
    if (from_restart)
    {
        getFromRestart();
    }

    // set current velocity using current time for initial and restarted runs.
    setOscillatingCylinderSpecificVelocity(d_current_time);

    return;

} // OscillatingCylinderKinematics
コード例 #8
0
ファイル: RigidBodyKinematics.cpp プロジェクト: IBAMR/IBAMR
RigidBodyKinematics::RigidBodyKinematics(const std::string& object_name,
                                         Pointer<Database> input_db,
                                         LDataManager* l_data_manager,
                                         Pointer<PatchHierarchy<NDIM> > /*patch_hierarchy*/,
                                         bool register_for_restart)
    : ConstraintIBKinematics(object_name, input_db, l_data_manager, register_for_restart),
      d_parser_time(0.0),
      d_center_of_mass(3, 0.0),
      d_incremented_angle_from_reference_axis(3, 0.0),
      d_tagged_pt_position(3, 0.0)
{
    // NOTE: Parent class constructor registers class with the restart manager, sets object name.

    // Read-in kinematics velocity functions
    for (int d = 0; d < NDIM; ++d)
    {
        const std::string postfix = "_function_" + std::to_string(d);
        std::string key_name = "kinematics_velocity" + postfix;

        if (input_db->isString(key_name))
        {
            d_kinematicsvel_function_strings.push_back(input_db->getString(key_name));
        }
        else
        {
            d_kinematicsvel_function_strings.push_back("0.0");
            TBOX_WARNING("RigidBodyKinematics::RigidBodyKinematics() :\n"
                         << "  no function corresponding to key " << key_name << "found for dimension = " << d
                         << "; using kinematics_vel = 0.0. " << std::endl);
        }

        d_kinematicsvel_parsers.push_back(new mu::Parser());
        d_kinematicsvel_parsers.back()->SetExpr(d_kinematicsvel_function_strings.back());
        d_all_parsers.push_back(d_kinematicsvel_parsers.back());
    }

    // Define constants and variables for the parsers.
    for (std::vector<mu::Parser*>::const_iterator cit = d_all_parsers.begin(); cit != d_all_parsers.end(); ++cit)
    {
        // Various names for pi.
        (*cit)->DefineConst("pi", PII);
        (*cit)->DefineConst("Pi", PII);
        (*cit)->DefineConst("PI", PII);

        // Variables
        (*cit)->DefineVar("T", &d_parser_time);
        (*cit)->DefineVar("t", &d_parser_time);
        for (int d = 0; d < NDIM; ++d)
        {
            const std::string postfix = std::to_string(d);
            (*cit)->DefineVar("X" + postfix, d_parser_posn.data() + d);
            (*cit)->DefineVar("x" + postfix, d_parser_posn.data() + d);
            (*cit)->DefineVar("X_" + postfix, d_parser_posn.data() + d);
            (*cit)->DefineVar("x_" + postfix, d_parser_posn.data() + d);
        }
    }

    // Set the size of vectors.
    const StructureParameters& struct_param = getStructureParameters();
    const int coarsest_ln = struct_param.getCoarsestLevelNumber();
    const int finest_ln = struct_param.getFinestLevelNumber();
    const int total_levels = finest_ln - coarsest_ln + 1;
    d_kinematics_vel.resize(total_levels);

    const std::vector<std::pair<int, int> >& idx_range = struct_param.getLagIdxRange();
    for (int ln = 0; ln < total_levels; ++ln)
    {
        const int nodes_this_ln = idx_range[ln].second - idx_range[ln].first;
        d_kinematics_vel[ln].resize(NDIM);
        for (int d = 0; d < NDIM; ++d)
        {
            d_kinematics_vel[ln][d].resize(nodes_this_ln);
        }
    }

    bool from_restart = RestartManager::getManager()->isFromRestart();
    if (from_restart)
    {
        getFromRestart();
        setRigidBodySpecificVelocity(
            d_current_time, d_incremented_angle_from_reference_axis, d_center_of_mass, d_tagged_pt_position);
        setShape(d_current_time, d_incremented_angle_from_reference_axis);
    }

    return;

} // RigidBodyKinematics