static bool step_man(t_manager *man, int *nat)
{
    static int      ncount = 0;
    static bool     bWarn  = false;
    bool            bEof;
    const char     *warn;

    if (!man->natom)
    {
        fprintf(stderr, "Not initiated yet!");
        exit(1);
    }
    bEof = read_next_x(man->oenv, man->status, &man->time, man->x, man->box);
    *nat = man->natom;
    if (ncount == man->nSkip)
    {
        switch (man->molw->boxtype)
        {
            case esbTri:
                put_atoms_in_triclinic_unitcell(ecenterDEF, man->box, man->natom, man->x);
                break;
            case esbTrunc:
                warn = put_atoms_in_compact_unitcell(man->molw->ePBC, ecenterDEF, man->box,
                                                     man->natom, man->x);
                if (warn && !bWarn)
                {
                    fprintf(stderr, "\n%s\n", warn);
                    bWarn = true;
                }
                break;
            case esbRect:
            case esbNone:
            default:
                break;
        }
        if (man->bPbc)
        {
            gmx_rmpbc(man->gpbc, man->natom, man->box, man->x);
            reset_mols(&(man->top.mols), man->box, man->x);
        }
        ncount = 0;
    }
    else
    {
        if (man->nSkip > 0)
        {
            ncount++;
            return step_man(man, nat);
        }
    }

    return bEof;
}
Пример #2
0
static bool step_man(t_manager *man, int *nat)
{
    static int      ncount = 0;
    bool            bEof;

    if (!man->natom)
    {
        std::fprintf(stderr, "Not initiated yet!");
        std::exit(1);
    }
    bEof = read_next_x(man->oenv, man->status, &man->time, man->x, man->box);
    *nat = man->natom;
    if (ncount == man->nSkip)
    {
        auto atomsArrayRef = gmx::arrayRefFromArray(reinterpret_cast<gmx::RVec *>(man->x), man->natom);
        switch (man->molw->boxtype)
        {
            case esbTri:
                put_atoms_in_triclinic_unitcell(ecenterDEF, man->box, atomsArrayRef);
                break;
            case esbTrunc:
                put_atoms_in_compact_unitcell(man->molw->ePBC, ecenterDEF, man->box,
                                              atomsArrayRef);
                break;
            case esbRect:
            case esbNone:
            default:
                break;
        }
        if (man->bPbc)
        {
            gmx_rmpbc(man->gpbc, man->natom, man->box, man->x);
            reset_mols(&(man->top.mols), man->box, man->x);
        }
        ncount = 0;
    }
    else
    {
        if (man->nSkip > 0)
        {
            ncount++;
            return step_man(man, nat);
        }
    }

    return bEof;
}
Пример #3
0
static void HandleClient(t_x11 *x11,t_manager *man,long data[])
{
  int  ID,button,x,y;
  bool bPos;
  real fac;

  ID=data[0];
  button=data[1];
  x=data[2];
  y=data[3];
  bPos=(button==Button1);
  switch (ID) {
  case IDROTX:
  case IDROTY:
  case IDROTZ:
    rotate_3d(man->view,ID-IDROTX,bPos);
    draw_mol(x11,man);
    break;
  case IDZOOM:
    if (bPos)
      fac=0.8; /* Reduce distance between eye and origin */
    else
      fac=1.25;
    
    /*  zoom changed to scale by Berk Hess 3-7-96
    if (zoom_3d(man->view,fac))
      draw_mol(x11,man); */
    man->view->sc_x/=fac;
    man->view->sc_y/=fac;
    draw_mol(x11,man);
    break;
  case IDTRANSX:
  case IDTRANSY:
  case IDTRANSZ:
    translate_view(man->view,ID-IDTRANSX,bPos);
    draw_mol(x11,man);
    break;
  case IDREWIND:
    if (man->status != -1) {
      rewind_trj(man->status);
      read_next_x(man->status,&(man->time),man->natom,man->x,man->box);
      man->bEof=FALSE;
      draw_mol(x11,man);
    }
    break;
  case IDSTEP: {
    int      nat;

    nat=0;
    if (!step_man(man,&nat)) {
      man->bEof=TRUE;
      man->bStop=TRUE;
    }
    else {
      if (nat > 0) {
	draw_mol(x11,man);
	usleep(man->nWait*1000);
      }
    }
    break;
  }
  case IDFF:
    man->bStop=FALSE;
    break;
  case IDSTOP_ANI:
    man->bStop=TRUE;
    break;
  case IDDRAWMOL:
    draw_mol(x11,man);
    break;
  case IDLABEL:
    switch (button) {
    case Button1:
    case Button2:
      show_label(x11,man,x,y);
      break;
    case Button3:
      hide_label(x11,man,x,y);
      break;
    }
    break;
  default:
    break;
  }
  if (man->bAnimate && !man->bEof && !man->bStop)
    step_message(x11,man);
}