Пример #1
0
/*************************************************************************
*    MeshOpt 类的构造函数.	 	                                *
*************************************************************************/
MeshOpt::MeshOpt(const string& object_name,
                 tbox::Pointer<tbox::Database> input_db,
                 tbox::Pointer< appu::DeformingGridInputUtilities2 > grid_tool,
                 tbox::Pointer<geom::MultiblockDeformingGridGeometry<NDIM> > grid_geom)
{
#ifdef DEBUG_CHECK_ASSERTIONS
    assert(!object_name.empty());
    assert(!input_db.isNull());
    assert(!grid_geom.isNull());
    assert(!grid_tool.isNull());
#endif

    d_grid_geometry = grid_geom;
    d_grid_tool = grid_tool;

    getFromInput(input_db);

    d_flag = 0;


    // 为影像区的宽度赋值.
    d_zeroghosts = hier::IntVector<NDIM>(0);
    d_oneghosts  = hier::IntVector<NDIM>(1);

    // 创建所有变量及数据片索引号, 注册可视化数据片.
    registerModelVariables();

}
Пример #2
0
FACPreconditioner::FACPreconditioner(
   const std::string& name,
   boost::shared_ptr<FACOperatorStrategy> user_ops,
   const boost::shared_ptr<tbox::Database>& input_db):
   d_object_name(name),
   d_fac_operator(user_ops),
   d_coarsest_ln(0),
   d_finest_ln(0),
   d_max_iterations(10),
   d_residual_tolerance(1.0e-6),
   d_relative_residual_tolerance(-1.0),
   d_presmoothing_sweeps(1),
   d_postsmoothing_sweeps(1),
   d_algorithm_choice("default"),
   d_number_iterations(0),
   d_residual_norm(tbox::MathUtilities<double>::getMax()),
   d_convergence_factor(),
   d_avg_convergence_factor(tbox::MathUtilities<double>::getMax()),
   d_net_convergence_factor(tbox::MathUtilities<double>::getMax()),
   d_controlled_level_ops()
{

   t_solve_system = tbox::TimerManager::getManager()->
      getTimer("solv::FACPreconditioner::solveSystem()_fac_cycling");

   /*
    * Initialize object with data read from input database.
    */
   getFromInput(input_db);
}
Пример #3
0
IMPInitializer::IMPInitializer(const std::string& object_name,
                               Pointer<Database> input_db,
                               Pointer<PatchHierarchy<NDIM> > hierarchy,
                               Pointer<GriddingAlgorithm<NDIM> > gridding_alg)
    : d_object_name(object_name),
      d_hierarchy(hierarchy),
      d_gridding_alg(gridding_alg),
      d_level_is_initialized(d_gridding_alg->getMaxLevels(), false),
      d_meshes(d_gridding_alg->getMaxLevels()),
      d_num_vertex(d_gridding_alg->getMaxLevels()),
      d_vertex_offset(d_gridding_alg->getMaxLevels()),
      d_vertex_posn(d_gridding_alg->getMaxLevels()),
      d_vertex_wgt(d_gridding_alg->getMaxLevels()),
      d_vertex_subdomain_id(d_gridding_alg->getMaxLevels()),
      d_silo_writer(NULL)
{
#if !defined(NDEBUG)
    TBOX_ASSERT(!object_name.empty());
    TBOX_ASSERT(input_db);
#endif

    // Register the specification objects with the StreamableManager class.
    MaterialPointSpec::registerWithStreamableManager();

    // Initialize object with data read from the input database.
    getFromInput(input_db);
    return;
} // IMPInitializer
Пример #4
0
FACPreconditioner::FACPreconditioner(
    const std::string& object_name,
    Pointer<FACPreconditionerStrategy> fac_strategy,
    tbox::Pointer<tbox::Database> input_db)
    : d_object_name(object_name),
      d_is_initialized(false),
      d_fac_strategy(fac_strategy),
      d_hierarchy(NULL),
      d_coarsest_ln(0),
      d_finest_ln(0),
      d_cycle_type(V_CYCLE),
      d_num_pre_sweeps(1),
      d_num_post_sweeps(1),
      d_f(),
      d_r(),
      d_do_log(false)
{
    /*
     * Register this class with the FACPreconditionerStrategy object.
     */
    d_fac_strategy->setFACPreconditioner(Pointer<FACPreconditioner>(this,false));

    /*
     * Initialize object with data read from input database.
     */
    if (!input_db.isNull())
    {
        getFromInput(input_db);
    }
    return;
}// FACPreconditioner
Пример #5
0
ForceProjector::ForceProjector(const std::string& object_name,
                               LDataManager* lag_data_manager,
                               Pointer<PatchHierarchy<NDIM> > patch_hierarchy,
                               Pointer<Database> input_db,
                               const std::string solver_type)
    : d_object_name(object_name),
      d_lag_data_manager(lag_data_manager),
      d_patch_hierarchy(patch_hierarchy),
      d_solver_type(solver_type),
      d_grav_const(NDIM)
{
    // put some default values.
    d_rho_fluid = 1.0;
    d_rho_body = 1.0;

    // Initialize  variables & variable contexts associated with Eulerian forces.
    VariableDatabase<NDIM>* var_db = VariableDatabase<NDIM>::getDatabase();
    d_body_force_context = var_db->getContext(d_object_name + "::BODYFORCE");
    if (d_solver_type == "STAGGERED")
        d_body_force_var = new SideVariable<NDIM, double>(d_object_name + "::BodyForce_sc_var");
    if (d_solver_type == "COLLOCATED")
        d_body_force_var = new CellVariable<NDIM, double>(d_object_name + "::BodyForce_cc_var", NDIM);
    d_body_force_idx = var_db->registerVariableAndContext(d_body_force_var, d_body_force_context, 0);

    getFromInput(input_db);

    return;

} // ForceProjector
Пример #6
0
FACPreconditioner::FACPreconditioner(
    const std::string& object_name,
    Pointer<FACPreconditionerStrategy> fac_strategy,
    tbox::Pointer<tbox::Database> input_db,
    const std::string& /*default_options_prefix*/)
    : d_fac_strategy(fac_strategy),
      d_hierarchy(NULL),
      d_coarsest_ln(0),
      d_finest_ln(0),
      d_cycle_type(V_CYCLE),
      d_num_pre_sweeps(0),
      d_num_post_sweeps(2),
      d_f(),
      d_r()
{
    // Setup default options.
    GeneralSolver::init(object_name, /*homogeneous_bc*/ true);
    d_initial_guess_nonzero = false;
    d_rel_residual_tol = 1.0e-5;
    d_abs_residual_tol = 1.0e-50;
    d_max_iterations = 1;

    // Register this class with the FACPreconditionerStrategy object.
    d_fac_strategy->setFACPreconditioner(Pointer<FACPreconditioner>(this,false));

    // Initialize object with data read from input database.
    if (input_db)
    {
        getFromInput(input_db);
    }
    return;
}// FACPreconditioner
Пример #7
0
PenaltyIBMethod::PenaltyIBMethod(const std::string& object_name, Pointer<Database> input_db, bool register_for_restart)
    : IBMethod(object_name, input_db, register_for_restart)
{
    // NOTE: Parent class constructor registers class with the restart manager, sets object
    // name.

    // Initialize object with data read from the input and restart databases.
    bool from_restart = RestartManager::getManager()->isFromRestart();
    if (from_restart) getFromRestart();
    if (input_db) getFromInput(input_db, from_restart);
    return;
} // PenaltyIBMethod
Пример #8
0
IBHierarchyIntegrator::IBHierarchyIntegrator(
    const std::string& object_name,
    Pointer<Database> input_db,
    Pointer<IBStrategy> ib_method_ops,
    Pointer<INSHierarchyIntegrator> ins_hier_integrator,
    bool register_for_restart)
    : HierarchyIntegrator(object_name, input_db, register_for_restart)
{
#if !defined(NDEBUG)
    TBOX_ASSERT(ib_method_ops);
    TBOX_ASSERT(ins_hier_integrator);
#endif

    // Set the IB method operations objects.
    d_ib_method_ops = ib_method_ops;
    d_ib_method_ops->registerIBHierarchyIntegrator(this);

    // Register the fluid solver as a child integrator of this integrator object
    // and reuse the variables and variable contexts of the INS solver.
    d_ins_hier_integrator = ins_hier_integrator;
    registerChildHierarchyIntegrator(d_ins_hier_integrator);
    d_u_var = d_ins_hier_integrator->getVelocityVariable();
    d_p_var = d_ins_hier_integrator->getPressureVariable();
    d_f_var = d_ins_hier_integrator->getBodyForceVariable();
    d_q_var = d_ins_hier_integrator->getFluidSourceVariable();
    d_current_context = d_ins_hier_integrator->getCurrentContext();
    d_scratch_context = d_ins_hier_integrator->getScratchContext();
    d_new_context = d_ins_hier_integrator->getNewContext();
    VariableDatabase<NDIM>* var_db = VariableDatabase<NDIM>::getDatabase();
    d_ib_context = var_db->getContext(d_object_name + "::IB");

    // Set some default values.
    d_integrator_is_initialized = false;
    d_time_stepping_type = MIDPOINT_RULE;
    d_regrid_cfl_interval = 0.0;
    d_regrid_cfl_estimate = 0.0;
    d_error_on_dt_change = true;
    d_warn_on_dt_change = false;

    // Do not allocate a workload variable by default.
    d_workload_var.setNull();
    d_workload_idx = -1;

    // Initialize object with data read from the input and restart databases.
    bool from_restart = RestartManager::getManager()->isFromRestart();
    if (from_restart) getFromRestart();
    if (input_db) getFromInput(input_db, from_restart);
    return;
} // IBHierarchyIntegrator
Пример #9
0
LocationIndexRobinBcCoefs::LocationIndexRobinBcCoefs(
   const tbox::Dimension& dim,
   const std::string& object_name,
   const std::shared_ptr<tbox::Database>& input_db):
   d_dim(dim),
   d_object_name(object_name)
{
   TBOX_ASSERT(input_db);

   for (int i = 0; i < 2 * d_dim.getValue(); ++i) {
      d_a_map[i] = tbox::MathUtilities<double>::getSignalingNaN();
      d_b_map[i] = tbox::MathUtilities<double>::getSignalingNaN();
      d_g_map[i] = tbox::MathUtilities<double>::getSignalingNaN();
   }
   getFromInput(input_db);
}
Пример #10
0
QInit::QInit(
    const string& object_name,
    Pointer<GridGeometry<NDIM> > grid_geom,
    Pointer<Database> input_db)
    : CartGridFunction(object_name),
      d_object_name(object_name),
      d_grid_geom(grid_geom),
      d_X(),
      d_init_type("GAUSSIAN"),
      d_gaussian_kappa(0.01),
      d_zalesak_r(0.15),
      d_zalesak_slot_w(0.025),
      d_zalesak_slot_l(0.1)
{
#if !defined(NDEBUG)
    TBOX_ASSERT(!object_name.empty());
    TBOX_ASSERT(grid_geom);
#endif
    d_object_name = object_name;
    d_grid_geom = grid_geom;
#if !defined(NDEBUG)
    TBOX_ASSERT(d_grid_geom);
#endif

    // Default initial values.
    const double* const x_upper = d_grid_geom->getXUpper();
    const double* const x_lower = d_grid_geom->getXLower();

    for (unsigned int d = 0; d < NDIM; ++d)
    {
        d_X[d] = x_lower[d] + 0.5*(x_upper[d] - x_lower[d]);
    }

    d_init_type = "GAUSSIAN";

    d_gaussian_kappa = 0.01;

    d_zalesak_r = 0.15;
    d_zalesak_slot_w = 0.025;
    d_zalesak_slot_l = 0.1;

    // Initialize object with data read from the input database.
    getFromInput(input_db);

    return;
}// QInit
Пример #11
0
GeneralizedIBMethod::GeneralizedIBMethod(const std::string& object_name,
                                         Pointer<Database> input_db,
                                         bool register_for_restart)
    : IBMethod(object_name, input_db, register_for_restart)
{
    // NOTE: Parent class constructor registers class with the restart manager, sets object
    // name.

    // Initialize object with data read from the input and restart databases.
    bool from_restart = RestartManager::getManager()->isFromRestart();
    if (from_restart) getFromRestart();
    if (input_db) getFromInput(input_db, from_restart);

    // Indicate all Lagrangian data needs ghost values to be refilled, and that
    // all intermediate data needs to be initialized.
    d_N_current_needs_ghost_fill = true;
    d_N_new_needs_ghost_fill = true;
    return;
} // GeneralizedIBMethod
Пример #12
0
MainRestartData::MainRestartData(
   const string& object_name,
   std::shared_ptr<tbox::Database> input_db):
   d_object_name(object_name)
{
   TBOX_ASSERT(input_db);

   tbox::RestartManager::getManager()->registerRestartItem(d_object_name, this);

   /*
    * Initialize object with data read from given input/restart databases.
    */
   bool is_from_restart = tbox::RestartManager::getManager()->isFromRestart();
   if (is_from_restart) {
      getFromRestart();
   }
   getFromInput(input_db, is_from_restart);

   /* if not starting from restart file, set loop_time and iteration_number */
   if (!is_from_restart) {
      d_loop_time = d_start_time;
      d_iteration_number = 0;
   }
}
Пример #13
0
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hPencil, hLine, hBezier, hRectangle, hEllipse, hEraser, hFill, hBorderW, hEraserW, hClear;

    RECT rect ;
    PAINTSTRUCT ps;
    HDC hdc = GetDC(hwnd);

    int screenW, screenH;
    int xMouse, yMouse;

    int xFillPreview = 200;
    int yFillPreview = 515;
    int xStrokePreview = 310;
    int yStrokePreview = 515;

    HDC hdcMem;
    BITMAP bitmap;
    HBITMAP hbit;

    static RECT drawingArea = {25, 55, 750, 500};
    static RECT fillColorRect = {xFillPreview, yFillPreview, xFillPreview + 25, yFillPreview + 20};
    static RECT borderColorRect = {xStrokePreview, yStrokePreview, xStrokePreview + 25, yStrokePreview + 20};

    static RECT tempRect;

    HBRUSH hBrush;
    static POINT pointPen;
    POINT point;
    HPEN linePen;
    int width;

    static BOOL lineStarted, rectangleStarted, ellipseStarted;
    static RECT rectangle, ellipse;
    static int bezierStage = 0;
    static POINT line;
    static POINT bezierPoints[4];

    HPEN borderPen;
    HBRUSH fillBrush;

    switch (message)
    {

    case WM_CREATE:
        hImageBttn = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_PENCIL));

        screenW = GetSystemMetrics(SM_CXSCREEN);
        screenH = GetSystemMetrics(SM_CYSCREEN);
        GetWindowRect(hwnd, &rect);
        SetWindowPos(hwnd, 0, (screenW - rect.right)/2, (screenH - rect.bottom)/2, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
        hPencil = CreateWindowEx(
                      0,
                      "Button",
                      NULL,
                      WS_VISIBLE| WS_CHILD|BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_BITMAP ,
                      25, 15,
                      32, 32,
                      hwnd,
                      (HMENU)IDB_pencil,
                      hInst,
                      NULL);
        SendMessage(hPencil, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hImageBttn);

        hImageBttn = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_LINE));
        hLine = CreateWindowEx(
                    0,
                    "Button",
                    NULL,
                    WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_BITMAP,
                    65, 15,
                    32, 32,
                    hwnd,
                    (HMENU)IDB_line,
                    hInst,
                    NULL);
        SendMessage(hLine, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hImageBttn);

        hImageBttn = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BEZIER));
        hBezier = CreateWindowEx(
                      0,
                      "Button",
                      NULL,
                      WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_BITMAP,
                      105, 15,
                      32, 32,
                      hwnd,
                      (HMENU)IDB_bezier,
                      hInst,
                      NULL);
        SendMessage(hBezier, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hImageBttn);

        hImageBttn = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_RECTANGLE));
        hRectangle = CreateWindowEx(
                         0,
                         "Button",
                         NULL,
                         WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_BITMAP,
                         145, 15,
                         32, 32,
                         hwnd,
                         (HMENU)IDB_rectangle,
                         hInst,
                         NULL);
        SendMessage(hRectangle, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hImageBttn);

        hImageBttn = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_ELLIPSE));
        hEllipse = CreateWindowEx(
                       0,
                       "Button",
                       NULL,
                       WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_BITMAP,
                       185, 15,
                       32, 32,
                       hwnd,
                       (HMENU)IDB_ellipse,
                       hInst,
                       NULL);
        SendMessage(hEllipse, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hImageBttn);

        hImageBttn = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_ERASER));
        hEraser = CreateWindowEx(
                      0,
                      "Button",
                      NULL,
                      WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_PUSHLIKE | BS_BITMAP,
                      225, 15,
                      32, 32,
                      hwnd,
                      (HMENU)IDB_eraser,
                      hInst,
                      NULL);
        SendMessage(hEraser, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hImageBttn);

        hFill = CreateWindowEx(
                    0,
                    "Button",
                    "Fill object",
                    WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX,
                    10, 515,
                    100, 20,
                    hwnd,
                    (HMENU)IDB_fill,
                    hInst,
                    NULL);

        CreateWindowEx(
            0,
            "Static",
            "Fill color",
            WS_VISIBLE | WS_CHILD | SS_LEFT,
            120, 515,
            75, 20,
            hwnd,
            (HMENU)0,
            hInst,
            NULL);

        CreateWindowEx(
            0,
            "Static",
            "Line color",
            WS_VISIBLE | WS_CHILD | SS_LEFT,
            230, 515,
            70, 20,
            hwnd,
            (HMENU)0,
            hInst,
            NULL);

        CreateWindowEx(
            0,
            "Static",
            "Border width",
            WS_VISIBLE | WS_CHILD | SS_LEFT,
            350, 515,
            100, 20,
            hwnd,
            (HMENU)0,
            hInst,
            NULL);

        hBorderW = CreateWindowEx(
                       0,
                       "Edit",
                       "1",
                       WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER,
                       460, 515,
                       40, 20,
                       hwnd,
                       (HMENU)0,
                       hInst,
                       NULL);

        CreateWindowEx(
            0,
            "Static",
            "Eraser width",
            WS_VISIBLE | WS_CHILD | SS_LEFT,
            515, 515,
            100, 20,
            hwnd,
            (HMENU)0,
            hInst,
            NULL);

        hEraserW = CreateWindowEx(
                       0,
                       "Edit",
                       "1",
                       WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER,
                       620, 515,
                       40, 20,
                       hwnd,
                       (HMENU)0,
                       hInst,
                       NULL);

        hClear = CreateWindowEx(
                     NULL,
                     "Button",
                     "Clear",
                     WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                     680, 515,
                     100, 20,
                     hwnd,
                     (HMENU)IDB_clear,
                     GetModuleHandle(NULL),
                     NULL);

        RegisterHotKey(hwnd, HK_dellipse, MOD_CONTROL, 0x45);
        RegisterHotKey(hwnd, HK_dblue, MOD_CONTROL, 0x43);
        break;

    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        updateColorControls(hdc, fillColor, xFillPreview, yFillPreview);
        updateColorControls(hdc, borderColor, xStrokePreview, yStrokePreview);

        SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(0,0,0)));
        SelectObject(hdc, (HBRUSH)GetStockObject(WHITE_BRUSH));
        Rectangle(hdc, drawingArea.left, drawingArea.top, drawingArea.right, drawingArea.bottom);

        EndPaint(hwnd, &ps);
        break;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDB_clear:
            Button_SetCheck(hPencil, BST_UNCHECKED);
            Button_SetCheck(hLine, BST_UNCHECKED);
            Button_SetCheck(hBezier, BST_UNCHECKED);
            Button_SetCheck(hRectangle, BST_UNCHECKED);
            Button_SetCheck(hEllipse, BST_UNCHECKED);
            Button_SetCheck(hEraser, BST_UNCHECKED);

            InvalidateRect(hwnd, &drawingArea, FALSE);
            InvalidateRect(hwnd, &drawingArea, TRUE);
            break;
        default:
            DefWindowProc(hwnd, WM_COMMAND, wParam, lParam);
            break;
        }
        break;

    case WM_GETMINMAXINFO:
    {
        LPMINMAXINFO mmi = (LPMINMAXINFO)lParam;
        mmi->ptMinTrackSize.x = 800;
        mmi->ptMinTrackSize.y = 550;
        mmi->ptMaxTrackSize.x = 850;
        mmi->ptMaxTrackSize.y = 600;
        break;
    }
    case WM_LBUTTONDOWN:
        xMouse = GET_X_LPARAM(lParam);
        yMouse = GET_Y_LPARAM(lParam);

        if(xMouse >= fillColorRect.left && xMouse <= fillColorRect.right)
        {
            if(yMouse >= fillColorRect.top && yMouse <= fillColorRect.bottom)
            {
                fillColor = colorSelect(hwnd, fillColor);
                updateColorControls(hdc, fillColor, xFillPreview, yFillPreview);
            }
            else if(yMouse >= borderColorRect.top && yMouse <= borderColorRect.bottom)
            {
                borderColor = colorSelect(hwnd, borderColor);
                updateColorControls(hdc, borderColor, xStrokePreview, yStrokePreview);
            }
            return 0;
        }

        if( (xMouse > drawingArea.left) && (xMouse < drawingArea.right) &&
                (yMouse > drawingArea.top) && (yMouse < drawingArea.bottom) )
        {
            width = getFromInput(hBorderW);
            point = getCurrentPointPosition(xMouse, yMouse, drawingArea, width);
            xMouse = point.x;
            yMouse = point.y;

            if((wParam == MK_LBUTTON) && (Button_GetCheck(hPencil) == BST_CHECKED))
            {
                pointPen.x = xMouse;
                pointPen.y = yMouse;
            }

            if((wParam == MK_LBUTTON) && (Button_GetCheck(hLine) == BST_CHECKED))
            {
                line.x = xMouse;
                line.y = yMouse;
                lineStarted = true;
            }

            if((wParam == MK_LBUTTON) && (Button_GetCheck(hRectangle) == BST_CHECKED))
            {
                rectangle.left = xMouse;
                rectangle.top = yMouse;
                rectangleStarted = true;
            }

            if((wParam == MK_LBUTTON) && (Button_GetCheck(hEllipse) == BST_CHECKED))
            {
                ellipse.left = xMouse;
                ellipse.top = yMouse;
                ellipseStarted = true;
            }

            if((wParam == MK_LBUTTON) && (Button_GetCheck(hBezier) == BST_CHECKED))
            {
                if(bezierStage == 0)
                {
                    bezierPoints[0] = point;
                    bezierStage = 1;
                }
                else
                {
                    bezierPoints[2] = point;
                    bezierStage = 3;
                }
            }
        }
        break;

    case WM_LBUTTONUP:
        xMouse = GET_X_LPARAM(lParam);
        yMouse = GET_Y_LPARAM(lParam);
        width = getFromInput(hBorderW);
        point = getCurrentPointPosition(xMouse, yMouse, drawingArea, width);
        xMouse = point.x;
        yMouse = point.y;

        borderPen = CreatePen(PS_SOLID, width, borderColor);
        if(Button_GetCheck(hFill) == BST_CHECKED)
            fillBrush = CreateSolidBrush(fillColor);
        else
            fillBrush = (HBRUSH)GetStockObject(NULL_BRUSH);

        if(lineStarted)
        {
            SelectObject(hdc, borderPen);
            MoveToEx(hdc, xMouse, yMouse, NULL);
            LineTo(hdc, line.x, line.y);
            DeleteObject(borderPen);
            lineStarted = false;
        }

        if(rectangleStarted)
        {
            SelectObject(hdc, borderPen);
            SelectObject(hdc, fillBrush);
            Rectangle(hdc, rectangle.left, rectangle.top, xMouse, yMouse);

            DeleteObject(borderPen);
            DeleteObject(fillBrush);

            rectangleStarted = false;
        }

        if(ellipseStarted)
        {
            SelectObject(hdc, borderPen);
            SelectObject(hdc, fillBrush);

            Ellipse(hdc, ellipse.left, ellipse.top, xMouse, yMouse);
            DeleteObject(borderPen);
            DeleteObject(fillBrush);

            ellipseStarted = false;
        }

        if(bezierStage == 1)
        {
            bezierPoints[1] = point;
            bezierStage = 2;
        }

        if(bezierStage == 3)
        {
            bezierPoints[3] = point;
            bezierStage = 0;
            SelectObject(hdc, borderPen);
            PolyBezier(hdc, bezierPoints, 4);
            DeleteObject(borderPen);
        }
        break;

    case WM_MOUSEMOVE:
        xMouse = GET_X_LPARAM(lParam);
        yMouse = GET_Y_LPARAM(lParam);
        if( (xMouse > drawingArea.left) && (xMouse < drawingArea.right) &&
                (yMouse > drawingArea.top) && (yMouse < drawingArea.bottom) )
        {
            if((wParam == MK_LBUTTON) && (Button_GetCheck(hPencil) == BST_CHECKED))
            {
                width = getFromInput(hBorderW);
                point = getCurrentPointPosition(xMouse, yMouse, drawingArea, width);
                xMouse = point.x;
                yMouse = point.y;
                linePen = CreatePen(PS_SOLID, width, borderColor);
                SelectObject(hdc, linePen);
                MoveToEx(hdc, xMouse, yMouse, NULL);
                LineTo(hdc, pointPen.x, pointPen.y);
                DeleteObject(linePen);
                pointPen.x = xMouse;
                pointPen.y = yMouse;
            }

            if((wParam == MK_LBUTTON) && (Button_GetCheck(hEraser) == BST_CHECKED))
            {
                width = getFromInput(hEraserW);
                point = getCurrentPointPosition(xMouse, yMouse, drawingArea, width);
                xMouse = point.x;
                yMouse = point.y;
                rect.left = point.x - (width / 2);
                rect.right = point.x + (width / 2);
                rect.top = point.y - (width / 2);
                rect.bottom = point.y + (width / 2);
                InvalidateRect(hwnd, &rect, FALSE);
                SendMessage(hwnd, WM_PAINT, 0, 0);
            }
        }
        break;

    case WM_CTLCOLORSTATIC:
    {
        HDC hDC = (HDC)wParam;
        SetBkColor(hDC, GetSysColor(COLOR_WINDOW));
        SetTextColor(hDC, RGB(255,69,0));
        SetBkMode(hDC, TRANSPARENT);
        return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
    }
    break;

    case WM_HOTKEY:
    {
        switch(wParam)
        {
        case HK_dellipse:

            Button_SetCheck(hPencil, BST_UNCHECKED);
            Button_SetCheck(hLine, BST_UNCHECKED);
            Button_SetCheck(hBezier, BST_UNCHECKED);
            Button_SetCheck(hRectangle, BST_UNCHECKED);
            Button_SetCheck(hEraser, BST_UNCHECKED);
            Button_SetCheck(hEllipse, BST_CHECKED);
            break;

        case HK_dblue:
            Button_SetCheck(hFill, BST_CHECKED);
            fillColor = RGB(0,0,255);
            updateColorControls(hdc, fillColor, xFillPreview, yFillPreview);
            break;
        default:
            break;
        }
        break;
    }

    case WM_CLOSE:
        if(MessageBox(hwnd, "Close application?", "Quit", MB_YESNO) == IDYES) DestroyWindow(hwnd);
        break;

    case WM_DESTROY:
        PostQuitMessage (0);
        break;
    default:
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}
Пример #14
0
/*
 *************************************************************************
 *
 * This class creates the mapped multi-block grid geometry used
 * for calculations in the MblkLinAdv code.
 *
 *************************************************************************
 */
MblkGeometry::MblkGeometry(
   const std::string& object_name,
   const tbox::Dimension& dim,
   boost::shared_ptr<tbox::Database>& input_db,
   boost::shared_ptr<hier::BaseGridGeometry>& grid_geom):
   d_grid_geom(grid_geom),
   d_dim(dim)
{
   TBOX_ASSERT(!object_name.empty());
   TBOX_ASSERT(input_db);

   d_object_name = object_name;
   //tbox::RestartManager::getManager()->registerRestartItem(d_object_name, this);

   d_nblocks = static_cast<int>(grid_geom->getNumberBlocks());

   d_metrics_set.resize(10);
   for (int i = 0; i < 10; ++i) {
      d_metrics_set[i].resize(d_nblocks);
      for (int b = 0; b < d_nblocks; ++b) {
         d_metrics_set[i][b] = false;
      }
   }

   /*
    * Initialize object with data read from given input/restart databases.
    */
   bool is_from_restart = tbox::RestartManager::getManager()->isFromRestart();
   if (is_from_restart) {
//      getFromRestart();  // ADD
   }
   getFromInput(input_db, is_from_restart);

   std::vector<hier::BoxContainer> domain_boxes(d_nblocks);
   for (int b = 0; b < d_nblocks; ++b) {
      grid_geom->computePhysicalDomain(domain_boxes[b],
         hier::IntVector::getOne(dim),
         hier::BlockId(b));
      TBOX_ASSERT(domain_boxes[b].size() == 1);
   }

   if (d_geom_problem == "CARTESIAN") {
      for (int b = 0; b < d_nblocks; ++b) {
         if (!d_metrics_set[0][b]) {
            setCartesianMetrics(domain_boxes[b].front(), 0, b);
         }
      }
   }

   if (d_geom_problem == "WEDGE") {
      if (!d_metrics_set[0][0]) {
         setWedgeMetrics(domain_boxes[0].front(), 0);
      }
   }
   if (d_geom_problem == "SPHERICAL_SHELL") {
      if (!d_metrics_set[0][0]) {
         setSShellMetrics(domain_boxes[0].front(), 0);
      }
   }

}
Пример #15
0
CVODEModel::CVODEModel(
   const string& object_name,
   const Dimension& dim,
   std::shared_ptr<CellPoissonFACSolver> fac_solver,
   std::shared_ptr<Database> input_db,
   std::shared_ptr<CartesianGridGeometry> grid_geom):
   RefinePatchStrategy(),
   CoarsenPatchStrategy(),
   d_object_name(object_name),
   d_dim(dim),
   d_soln_var(new CellVariable<double>(dim, "soln", 1)),
   d_FAC_solver(fac_solver),
   d_grid_geometry(grid_geom)
{
   /*
    * set up variables and contexts
    */
   VariableDatabase* variable_db = VariableDatabase::getDatabase();

   d_cur_cxt = variable_db->getContext("CURRENT");
   d_scr_cxt = variable_db->getContext("SCRATCH");

   d_soln_cur_id = variable_db->registerVariableAndContext(d_soln_var,
         d_cur_cxt,
         IntVector(d_dim, 0));
   d_soln_scr_id = variable_db->registerVariableAndContext(d_soln_var,
         d_scr_cxt,
         IntVector(d_dim, 1));
#ifdef USE_FAC_PRECONDITIONER
   d_diff_var.reset(new SideVariable<double>(d_dim, "diffusion",
         hier::IntVector::getOne(d_dim), 1));

   d_diff_id = variable_db->registerVariableAndContext(d_diff_var,
         d_cur_cxt,
         IntVector(d_dim, 0));

   /*
    * Set default values for preconditioner.
    */
   d_use_neumann_bcs = false;

   d_current_soln_time = 0.;

#endif

   /*
    * Print solver data.
    */
   d_print_solver_info = false;

   /*
    * Counters.
    */
   d_number_rhs_eval = 0;
   d_number_precond_setup = 0;
   d_number_precond_solve = 0;

   /*
    * Boundary condition initialization.
    */
   if (d_dim == Dimension(2)) {
      d_scalar_bdry_edge_conds.resize(NUM_2D_EDGES);
      for (int ei = 0; ei < NUM_2D_EDGES; ++ei) {
         d_scalar_bdry_edge_conds[ei] = BOGUS_BDRY_DATA;
      }

      d_scalar_bdry_node_conds.resize(NUM_2D_NODES);
      d_node_bdry_edge.resize(NUM_2D_NODES);

      for (int ni = 0; ni < NUM_2D_NODES; ++ni) {
         d_scalar_bdry_node_conds[ni] = BOGUS_BDRY_DATA;
         d_node_bdry_edge[ni] = BOGUS_BDRY_DATA;
      }

      d_bdry_edge_val.resize(NUM_2D_EDGES);
      MathUtilities<double>::setVectorToSignalingNaN(d_bdry_edge_val);
   } else if (d_dim == Dimension(3)) {
      d_scalar_bdry_face_conds.resize(NUM_3D_FACES);
      for (int fi = 0; fi < NUM_3D_FACES; ++fi) {
         d_scalar_bdry_face_conds[fi] = BOGUS_BDRY_DATA;
      }

      d_scalar_bdry_edge_conds.resize(NUM_3D_EDGES);
      d_edge_bdry_face.resize(NUM_3D_EDGES);
      for (int ei = 0; ei < NUM_3D_EDGES; ++ei) {
         d_scalar_bdry_edge_conds[ei] = BOGUS_BDRY_DATA;
         d_edge_bdry_face[ei] = BOGUS_BDRY_DATA;
      }

      d_scalar_bdry_node_conds.resize(NUM_3D_NODES);
      d_node_bdry_face.resize(NUM_3D_NODES);

      for (int ni = 0; ni < NUM_3D_NODES; ++ni) {
         d_scalar_bdry_node_conds[ni] = BOGUS_BDRY_DATA;
         d_node_bdry_face[ni] = BOGUS_BDRY_DATA;
      }

      d_bdry_face_val.resize(NUM_3D_FACES);
      MathUtilities<double>::setVectorToSignalingNaN(d_bdry_face_val);
   }

   /*
    * Initialize object with data read from given input/restart databases.
    */
   bool is_from_restart = RestartManager::getManager()->isFromRestart();
   if (is_from_restart) {
      getFromRestart();
   }
   getFromInput(input_db, is_from_restart);

#ifdef USE_FAC_PRECONDITIONER
   /*
    * Construct outerface variable to hold boundary flags and Neumann fluxes.
    */
   if (d_use_neumann_bcs) {
      d_flag_var.reset(new OuterfaceVariable<int>(d_dim, "bdryflag", 1));
      d_flag_id = variable_db->registerVariableAndContext(d_flag_var,
            d_cur_cxt,
            IntVector(d_dim, 0));
      d_neuf_var.reset(new OuterfaceVariable<double>(d_dim, "neuflux", 1));
      d_neuf_id = variable_db->registerVariableAndContext(d_neuf_var,
            d_cur_cxt,
            IntVector(d_dim, 0));
   } else {
      d_flag_id = -1;
      d_neuf_id = -1;
   }

   /*
    * Set boundary types for FAC preconditioner.
    *  bdry_types holds a flag where 0 = dirichlet, 1 = neumann
    */
   if (d_dim == Dimension(2)) {
      for (int i = 0; i < NUM_2D_EDGES; ++i) {
         d_bdry_types[i] = 0;
         if (d_scalar_bdry_edge_conds[i] == BdryCond::DIRICHLET) d_bdry_types[i] = 0;
         if (d_scalar_bdry_edge_conds[i] == BdryCond::NEUMANN) d_bdry_types[i] = 1;
      }
   } else if (d_dim == Dimension(3)) {
      for (int i = 0; i < NUM_3D_FACES; ++i) {
         d_bdry_types[i] = 0;
         if (d_scalar_bdry_face_conds[i] == BdryCond::DIRICHLET) d_bdry_types[i] = 0;
         if (d_scalar_bdry_face_conds[i] == BdryCond::NEUMANN) d_bdry_types[i] = 1;
      }
   }
#endif

   /*
    * Postprocess boundary data from input/restart values.  Note: scalar
    * quantity in this problem cannot have reflective boundary conditions
    * so we reset them to BdryCond::FLOW.
    */
   if (d_dim == Dimension(2)) {
      for (int i = 0; i < NUM_2D_EDGES; ++i) {
         if (d_scalar_bdry_edge_conds[i] == BdryCond::REFLECT) {
            d_scalar_bdry_edge_conds[i] = BdryCond::FLOW;
         }
      }

      for (int i = 0; i < NUM_2D_NODES; ++i) {
         if (d_scalar_bdry_node_conds[i] == BdryCond::XREFLECT) {
            d_scalar_bdry_node_conds[i] = BdryCond::XFLOW;
         }
         if (d_scalar_bdry_node_conds[i] == BdryCond::YREFLECT) {
            d_scalar_bdry_node_conds[i] = BdryCond::YFLOW;
         }

         if (d_scalar_bdry_node_conds[i] != BOGUS_BDRY_DATA) {
            d_node_bdry_edge[i] =
               CartesianBoundaryUtilities2::getEdgeLocationForNodeBdry(
                  i, d_scalar_bdry_node_conds[i]);
         }
      }
   } else if (d_dim == Dimension(3)) {
      for (int i = 0; i < NUM_3D_FACES; ++i) {
         if (d_scalar_bdry_face_conds[i] == BdryCond::REFLECT) {
            d_scalar_bdry_face_conds[i] = BdryCond::FLOW;
         }
      }

      for (int i = 0; i < NUM_3D_EDGES; ++i) {
         if (d_scalar_bdry_edge_conds[i] == BdryCond::XREFLECT) {
            d_scalar_bdry_edge_conds[i] = BdryCond::XFLOW;
         }
         if (d_scalar_bdry_edge_conds[i] == BdryCond::YREFLECT) {
            d_scalar_bdry_edge_conds[i] = BdryCond::YFLOW;
         }
         if (d_scalar_bdry_edge_conds[i] == BdryCond::ZREFLECT) {
            d_scalar_bdry_edge_conds[i] = BdryCond::ZFLOW;
         }

         if (d_scalar_bdry_edge_conds[i] != BOGUS_BDRY_DATA) {
            d_edge_bdry_face[i] =
               CartesianBoundaryUtilities3::getFaceLocationForEdgeBdry(
                  i, d_scalar_bdry_edge_conds[i]);
         }
      }

      for (int i = 0; i < NUM_3D_NODES; ++i) {
         if (d_scalar_bdry_node_conds[i] == BdryCond::XREFLECT) {
            d_scalar_bdry_node_conds[i] = BdryCond::XFLOW;
         }
         if (d_scalar_bdry_node_conds[i] == BdryCond::YREFLECT) {
            d_scalar_bdry_node_conds[i] = BdryCond::YFLOW;
         }
         if (d_scalar_bdry_node_conds[i] == BdryCond::ZREFLECT) {
            d_scalar_bdry_node_conds[i] = BdryCond::ZFLOW;
         }

         if (d_scalar_bdry_node_conds[i] != BOGUS_BDRY_DATA) {
            d_node_bdry_face[i] =
               CartesianBoundaryUtilities3::getFaceLocationForNodeBdry(
                  i, d_scalar_bdry_node_conds[i]);
         }
      }

   }

}
Пример #16
0
INSHierarchyIntegrator::INSHierarchyIntegrator(const std::string& object_name,
                                               Pointer<Database> input_db,
                                               Pointer<Variable<NDIM> > U_var,
                                               Pointer<Variable<NDIM> > P_var,
                                               Pointer<Variable<NDIM> > F_var,
                                               Pointer<Variable<NDIM> > Q_var,
                                               bool register_for_restart)
    : HierarchyIntegrator(object_name, input_db, register_for_restart), d_U_var(U_var),
      d_P_var(P_var), d_F_var(F_var), d_Q_var(Q_var), d_U_init(NULL), d_P_init(NULL),
      d_default_bc_coefs(d_object_name + "::default_bc_coefs", Pointer<Database>(NULL)),
      d_bc_coefs(NDIM, static_cast<RobinBcCoefStrategy<NDIM>*>(NULL)),
      d_traction_bc_type(TRACTION), d_F_fcn(NULL), d_Q_fcn(NULL)
{
    // Set some default values.
    d_integrator_is_initialized = false;
    d_viscous_time_stepping_type = TRAPEZOIDAL_RULE;
    d_convective_time_stepping_type = ADAMS_BASHFORTH;
    d_init_convective_time_stepping_type = MIDPOINT_RULE;
    d_num_cycles = 1;
    d_cfl_max = 1.0;
    d_using_vorticity_tagging = false;
    d_Omega_max = 0.0;
    d_normalize_pressure = false;
    d_normalize_velocity = false;
    d_convective_op_type = "DEFAULT";
    d_convective_difference_form = ADVECTIVE;
    d_convective_op_input_db = new MemoryDatabase(d_object_name + "::convective_op_input_db");
    d_creeping_flow = false;
    d_regrid_max_div_growth_factor = 1.1;
    d_U_scale = 1.0;
    d_P_scale = 1.0;
    d_F_scale = 1.0;
    d_Q_scale = 1.0;
    d_Omega_scale = 1.0;
    d_Div_U_scale = 1.0;
    d_output_U = true;
    d_output_P = true;
    d_output_F = false;
    d_output_Q = false;
    d_output_Omega = true;
    d_output_Div_U = true;
    d_velocity_solver = NULL;
    d_pressure_solver = NULL;

    // Setup default boundary condition objects that specify homogeneous
    // Dirichlet (solid-wall) boundary conditions for the velocity.
    for (unsigned int d = 0; d < NDIM; ++d)
    {
        d_default_bc_coefs.setBoundaryValue(2 * d, 0.0);
        d_default_bc_coefs.setBoundaryValue(2 * d + 1, 0.0);
    }
    registerPhysicalBoundaryConditions(
        std::vector<RobinBcCoefStrategy<NDIM>*>(NDIM, &d_default_bc_coefs));

    // Setup physical boundary conditions objects.
    d_U_star_bc_coefs.resize(NDIM);
    for (unsigned int d = 0; d < NDIM; ++d)
    {
        d_U_star_bc_coefs[d] = new INSIntermediateVelocityBcCoef(d, d_bc_coefs);
    }
    d_Phi_bc_coef = new INSProjectionBcCoef(d_bc_coefs);

    // Initialize object with data read from the input and restart databases.
    bool from_restart = RestartManager::getManager()->isFromRestart();
    if (from_restart) getFromRestart();
    if (input_db) getFromInput(input_db, from_restart);

    // Initialize an advection velocity variable.  NOTE: Patch data are
    // allocated for this variable only when an advection-diffusion solver is
    // registered with the INSHierarchyIntegrator.
    d_U_adv_diff_var = new FaceVariable<NDIM, double>(d_object_name + "::U_adv_diff");
    return;
} // INSHierarchyIntegrator