Example #1
0
int main ()
{
    //Get num proc
    int num_proc = get_proc_id();
    _printdecp("num proc=", num_proc);
    _printdecp("size image x=",IMAGE_X);
    _printdecp("size image y=",IMAGE_Y);

    if(num_proc==1)
    {
      //Send result to output memory
      outm_write_burst (MyImage, IMAGE_X, IMAGE_Y);
      outm_write_file ();
    }

    //End
    return(0);
}
Example #2
0
void parallel_initialize(size_t nthreads)
{
    envmanager_.initialize(nthreads);
    std::cout << "Initialized process " << get_proc_id()
              << " of " << get_nproc() << "\n";
}
Example #3
0
//                                   B C S
//##############################################################################
//
// Apply boundary conditions.
//
void bcs( lattice_ptr lattice)
{
  int    i, j, k, n, n1, a, id;
  int    ni, nj, nk;
  int    subs;
  double *ftemp, *f, *f1, *feq, *feq1, *rhoo, temp[Q];
  double  v, rho_in, rho_out, rho1;
  double  c0;
  double  D;
  double  c2;

#if RHO0_TEST
//------------------------------------------------------------------[ TEST ]----
  double *rho0;
//------------------------------------------------------------------[ TEST ]----
#endif /* RHO0_TEST */
  double u_x,  u_y, u_z, usq,udotx;
  double u_in[2][2],
         u_out[2][2],
         u,
         rho,
         hua;
  double c;

  ni = lattice->param.LX;
  nj = lattice->param.LY;
  nk = lattice->param.LZ;

  id = get_proc_id(lattice);

  // for( subs=0; subs<(NUM_FLUID_COMPONENTS)-(INAMURO_SIGMA_COMPONENT); subs++)
  for( subs=0; subs<NUM_FLUID_COMPONENTS; subs++)
  {
    // P R E S S U R E   T O P   I N F L O W   B C
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // pressure top inflow
    //  -- Pressure boundary on top side using inflow pressure condition.
    if(   (id ==(get_num_procs(lattice)-1))
        && !lattice->param.GZL
        && lattice->param.pressure_t_in[subs] )
    {
      k = nk-1;
      switch(NUM_FLUID_COMPONENTS)
      {
        case 1:
        { rho_in = lattice->param.rho_in; break;}
        case 2:
        {
          if(subs==0) { rho_in = lattice->param.rho_in;}
          if(subs==1) { rho_in = lattice->param.rho_A[subs];}
          break;
        }
      }

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          ftemp = lattice->pdf[subs][n].ftemp;

          // Top, Inflow
          if( lattice->param.incompressible)
          {
            u_z = -rho_in
                + ( ftemp[ C]
                  + ftemp[ N] + ftemp[ S] + ftemp[ E] + ftemp[ W]
                  + 2.*( ftemp[T ]
                       + ftemp[TW] + ftemp[TE] + ftemp[TS] + ftemp[TN]));
            c = u_z;
          }
          else // compressible
          {
            u_z = -1.
                + ( ftemp[C]
                  + ftemp[N ] + ftemp[S ] + ftemp[ E] + ftemp[ W]
                  + ftemp[NE] + ftemp[NW] + ftemp[SE] + ftemp[SW]
                  + 2.*( ftemp[T ]
                       + ftemp[TW] + ftemp[TE] + ftemp[TS] + ftemp[TN]))
                / rho_in;
            c = u_z*rho_in;
          }
          //rev_Huang
          ftemp[B ] = ftemp[T ] - (1./3.)*c;
          ftemp[BW] = ftemp[TE] - (1./6.)*c
                    + 0.5*(-ftemp[ W] - ftemp[NW] - ftemp[SW]
                          + ftemp[ E] + ftemp[NE] + ftemp[SE]);
          ftemp[BE] = ftemp[TW] - (1./6.)*c
                    - 0.5*(-ftemp[ W] - ftemp[NW] - ftemp[SW]
                          + ftemp[ E] + ftemp[NE] + ftemp[SE]);
          ftemp[BS] = ftemp[TN] - (1./6.)*c
                    + 0.5*( ftemp[N ] + ftemp[NW] + ftemp[NE]
                          - ftemp[S ] - ftemp[SW] - ftemp[SE]);
          ftemp[BN] = ftemp[TS] - (1./6.)*c
                    - 0.5*( ftemp[N ] + ftemp[NW] + ftemp[NE]
                          - ftemp[S ] - ftemp[SW] - ftemp[SE]);
#if 1 // Confirm density
  rho = ftemp[ C]
      + ftemp[ E] + ftemp[ W]
      + ftemp[ N] + ftemp[ S]
      + ftemp[ T] + ftemp[ B]
      + ftemp[NE] + ftemp[NW] + ftemp[SE] + ftemp[SW]
      + ftemp[TN] + ftemp[TS] + ftemp[BN] + ftemp[BS]
      + ftemp[TE] + ftemp[TW] + ftemp[BE] + ftemp[BW];
  if( rho_in - rho > 1e-6)
  {
    printf("%s %d >> ERROR: pressure_top_in FAIL! "
           "rho_in = %f, rho = %f\n",__FILE__,__LINE__, rho_in, rho);
  }
#endif

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.pressure_t_in[subs] ) */


    //********************************************************************************


    // P R E S S U R E   B O T T O M   O U T F L O W   B C  (peter's attempt?)
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // pressure bottom outflow
    //  -- Pressure boundary on bottom side using outflow pressure condition.

    if((id ==0) && !lattice->param.GZL && lattice->param.pressure_b_out[subs] )
    {
      k = 0;

      switch(NUM_FLUID_COMPONENTS)
      {
        case 1:
        {  rho_out = lattice->param.rho_out; break; }
        case 2:
        {
          if(subs==0) { rho_out = lattice->param.rho_out;}
          if(subs==1) { rho_out = lattice->param.rho_A[subs];}
          break;
        }
      }

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          ftemp = lattice->pdf[subs][n].ftemp;

          // Bottom, rho_out
          if( lattice->param.incompressible)
          {
            u_z = rho_out
              - ( ftemp[C]
                + ftemp[N] + ftemp[S] + ftemp[E] + ftemp[W]
                + 2.*( ftemp[B]
                     + ftemp[BW] + ftemp[BE] + ftemp[BS] + ftemp[BN]));
            c = u_z;
          }
          else // compressible
          {
            u_z =  1.
              - ( ftemp[C]
                + ftemp[N ] + ftemp[S ] + ftemp[ E] + ftemp[ W]
                + ftemp[NW] + ftemp[NE] + ftemp[SW] + ftemp[SE]
                + 2.*( ftemp[B ]
                     + ftemp[BW] + ftemp[BE] + ftemp[BS] + ftemp[BN]))
              / rho_out;
            c = u_z*rho_out;
          }

          ftemp[T ] = ftemp[B ] + (1./3.)*c;
          ftemp[TW] = ftemp[BE] + (1./6.)*c
                    + 0.5*(-ftemp[ W] - ftemp[NW] - ftemp[SW]
                          + ftemp[ E] + ftemp[NE] + ftemp[SE]);
          ftemp[TE] = ftemp[BW] + (1./6.)*c
                    - 0.5*(-ftemp[ W] - ftemp[NW] - ftemp[SW]
                          + ftemp[ E] + ftemp[NE] + ftemp[SE]);
          ftemp[TS] = ftemp[BN] + (1./6.)*c
                    + 0.5*( ftemp[N ] + ftemp[NW] + ftemp[NE]
                          - ftemp[S ] - ftemp[SW] - ftemp[SE]);
          ftemp[TN] = ftemp[BS] + (1./6.)*c
                    - 0.5*( ftemp[N ] + ftemp[NW] + ftemp[NE]
                          - ftemp[S ] - ftemp[SW] - ftemp[SE]);

#if 1 // Confirm density
  rho = ftemp[ C]
      + ftemp[ E] + ftemp[ W]
      + ftemp[ N] + ftemp[ S]
      + ftemp[ T] + ftemp[ B]
      + ftemp[NE] + ftemp[NW] + ftemp[SE] + ftemp[SW]
      + ftemp[TN] + ftemp[TS] + ftemp[BN] + ftemp[BS]
      + ftemp[TE] + ftemp[TW] + ftemp[BE] + ftemp[BW];
  if( rho_out - rho > 1e-6)
  {
    printf("%s %d >> ERROR: pressure_bottom_out FAIL! "
           "rho_out = %f, rho = %f\n",__FILE__,__LINE__, rho_out, rho);
  }
#endif

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.pressure_b_out[subs] ) */


    //********************************************************************************
    // V E L O C I T Y   T O P   I N F L O W   B C
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // velocity top inflow
    //  -- Velocity boundary on top side using inflow velocity condition.
    if( id == get_num_procs( lattice) - 1 && !lattice->param.GZL && 
												lattice->param.velocity_t_in[subs])
    {

		//printf("%s %d >> BOOM!",__FILE__,__LINE__);
      if(subs==0) u = lattice->param.uz_in;    //lattice->param.uz_in; Non-wetting
      if(subs==1) u = lattice->param.uz_in;    //lattice->param.uz_in;

      k = nk-1;

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          ftemp = lattice->pdf[subs][n].ftemp;

          if( !lattice->solids[subs][n].is_solid)
          {
            rho = ( ftemp[C ]
                + ftemp[W ] + ftemp[E ] + ftemp[N ] + ftemp[S ]
                + ftemp[NW] + ftemp[NE] + ftemp[SW] + ftemp[SE]
                + 2.*( ftemp[T ]
                  + ftemp[TW] + ftemp[TE] + ftemp[TS] + ftemp[TN])
                )
              / ( 1. + u);
            c = rho*u;

            ftemp[B ] = ftemp[T ] - (1./3.)*c;
            ftemp[BW] = ftemp[TE] - (1./6.)*c + 0.5* (-ftemp[W ]- ftemp[NW]- ftemp[SW]
                + ftemp[E] +ftemp[NE] + ftemp[SE]);
            ftemp[BE] = ftemp[TW] - (1./6.)*c - 0.5* (-ftemp[W ]- ftemp[NW]- ftemp[SW]
                + ftemp[E] +ftemp[NE] + ftemp[SE]);
            ftemp[BS] = ftemp[TN] - (1./6.)*c + 0.5* (ftemp[N ] + ftemp[NW] + ftemp[NE]
                -ftemp[S ] -ftemp[SW] - ftemp[SE]);
            ftemp[BN] = ftemp[TS] - (1./6.)*c - 0.5* (ftemp[N ] + ftemp[NW] + ftemp[NE]
                -ftemp[S ] -ftemp[SW] - ftemp[SE]);

          } /* if( !is_solid) */

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.velocity_t_in[subs]) */

    // V E L O C I T Y   B O T T O M   O U T F L O W   B C
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // velocity bottom inflow
    //  -- Velocity boundary on bottom side using outflow velocity condition.
    if( id == 0 && !lattice->param.GZL && lattice->param.velocity_b_out[subs])
    {
//printf("%s %d >> BOOM!",__FILE__,__LINE__);
      if(subs==0) u = lattice->param.uz_out;    //lattice->param.uz_out;  Non-wetting
      if(subs==1) u = lattice->param.uz_out;    //lattice->param.uz_out;

      k = 0;

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          ftemp = lattice->pdf[subs][n].ftemp;

          if( !lattice->solids[subs][n].is_solid)
          {
            rho = ( ftemp[C ]
                + ftemp[W ] + ftemp[E ] + ftemp[N ] + ftemp[S ]
                + ftemp[NW] + ftemp[NE] + ftemp[SW] + ftemp[SE]
                + 2.*( ftemp[B ]
                  + ftemp[BW] + ftemp[BE] + ftemp[BS] + ftemp[BN])
                )
              / ( 1. - u);
            c = rho*u;


            ftemp[T ] = ftemp[B ] + (1./3.)*c;
            ftemp[TW] = ftemp[BE] + (1./6.)*c + 0.5* (-ftemp[W ]- ftemp[NW]- ftemp[SW]
                + ftemp[E] +ftemp[NE] + ftemp[SE]);
            ftemp[TE] = ftemp[BW] + (1./6.)*c - 0.5* (-ftemp[W ]- ftemp[NW]- ftemp[SW]
                + ftemp[E] +ftemp[NE] + ftemp[SE]);
            ftemp[TS] = ftemp[BN] + (1./6.)*c  + 0.5* (ftemp[N ] + ftemp[NW] + ftemp[NE]
                -ftemp[S ] -ftemp[SW] - ftemp[SE]);
            ftemp[TN] = ftemp[BS] + (1./6.)*c  - 0.5* (ftemp[N ] + ftemp[NW] + ftemp[NE]
                -ftemp[S ] -ftemp[SW] - ftemp[SE]);


          } /* if( !is_solid) */

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.velocity_b_in[subs]) */

    //********************************************************************************


    // GZL P R E S S U R E // V E L O C I T Y   T O P   I N F L O W   B C
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //  -- Velocity boundary on top side using inflow velocity condition.
#if PARALLEL
    id = get_proc_id(lattice);
#else
    id = get_num_procs(lattice)-1;
#endif

    if( (id ==get_num_procs(lattice)-1) && lattice->param.GZL && lattice->param.PressureBC)//lattice->param.velocity_t_in[subs])
    {
printf("%s %d >> BOOM!",__FILE__,__LINE__);
      k = nk-1;

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          f = lattice->pdf[subs][n].f;

#if STORE_UEQ
          //       u_x = &lattice->ueq[n].u[0] = 0.02;
          //       lattice->ueq[n].u[1] = 0.;
          //       lattice->ueq[n].u[2] = 0.;
#else /* !( STORE_UEQ) */
          //       lattice->macro_vars[subs][n].u[0] =  0.02 ;
          //       lattice->macro_vars[subs][n].u[1] =  0. ;
          //       lattice->macro_vars[subs][n].u[2] =  0. ;
#endif /* STORE_UEQ */

          n1 = XYZ2N( i, j, k-1, ni, nj);
          f1 = lattice->pdf[subs][n1].f;
          feq1 = lattice->pdf[subs][n1].feq;

          //  rhoo = &( lattice->macro_vars[subs][n].rho);
          switch(NUM_FLUID_COMPONENTS)
          {case 1:
            {
              rho =  /*lattice->macro_vars[subs][n1].rho;*/lattice->param.rho_in;
              u_x =  0.;//lattice->macro_vars[subs][n1].u[0] ;
              u_y =  0.;//lattice->macro_vars[subs][n1].u[1] ;
              u_z =  lattice->macro_vars[subs][n1].u[2] ;
              lattice->macro_vars[subs][n].u[2] = u_z;
              break;
            }
            case 2:
            {
#if STORE_UEQ
              if(subs==0)
              {
                rho =lattice->param.rho_in;// 8+ 0.001*(double)lattice->time;// ;    subs= 0 Non-wetting
                if( lattice->time >1000)  {rho = lattice->param.rho_in;}
              }
              if(subs==1) rho = 0.000 ;    //lattice->param.uz_in; subs= 1 Wetting

              //          rho =  lattice->param.rho_A[subs];
              u_x =  0.;// lattice->ueq[n1].u[0] ;
              u_y =  0.;// lattice->ueq[n1].u[1] ;
              u_z =  lattice->ueq[n1].u[2] ;
              lattice->macro_vars[subs][n].u[2] = u_z;
              lattice->ueq[n].u[2] = u_z;

#endif
              break;
            }
          }
          lattice->macro_vars[subs][n].rho = rho;
          lattice->macro_vars[subs][n].u[0] = u_x;
          lattice->macro_vars[subs][n].u[1] = u_y;


          if( !lattice->solids[subs][n].is_solid)
          {
            compute_a_feq( feq, rho, u_x, u_y, u_z );

            for (a= 0; a<Q; a++)
            {
              temp[a] =  f1[a] - feq1[a];
              f[a]=feq[a]+ temp[a];
            }


          } /* if( !is_solid) */

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.velocity_GZL) */

    //GZL P R E S S U R E // V E L O C I T Y   B O T T O M   O U T F L O W   B C
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // velocity bottom inflow
    //  -- Velocity boundary on bottom side using inflow velocity condition.
#if PARALLEL
    id = get_proc_id(lattice);
#else
    id = 0;
#endif
    if( (id ==0) && lattice->param.GZL && lattice->param.PressureBC)//lattice->param.velocity_b_in[subs])
    {
printf("%s %d >> BOOM!",__FILE__,__LINE__);
      k = 0;

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          f = lattice->pdf[subs][n].f;

          n1 = XYZ2N( i, j, k+1, ni, nj);
          f1   = lattice->pdf[subs][n1].f;
          feq1 = lattice->pdf[subs][n1].feq;

          switch(NUM_FLUID_COMPONENTS)
          {case 1:
            {
              rho =  /*lattice->macro_vars[subs][n1].rho;*/lattice->param.rho_out;
              u_x =  0.;//lattice->macro_vars[subs][n1].u[0] ;
              u_y =  0.;//lattice->macro_vars[subs][n1].u[1] ;
              u_z =  lattice->macro_vars[subs][n1].u[2] ;
              lattice->macro_vars[subs][n].u[2] = u_z;
              break;
            }
            case 2:
            {
#if STORE_UEQ
              if(subs==0) rho = 0.000;
              if(subs==1)
              {
                rho =lattice->param.rho_out; //8.0- 0.001*(double)lattice->time;//
                if( lattice->time >6000)   {rho = lattice->param.rho_out;}
              }
              //          rho =  lattice->param.rho_B[subs];
              u_x =  0.;//lattice->ueq[n1].u[0] ;
              u_y =  0.;//lattice->ueq[n1].u[1] ;
              u_z =  lattice->ueq[n1].u[2] ;
              lattice->macro_vars[subs][n].u[2] = u_z;
              lattice->ueq[n].u[2] = u_z;
#endif
              break;
            }
          }
          lattice->macro_vars[subs][n].rho = rho;
          lattice->macro_vars[subs][n].u[0] = u_x;
          lattice->macro_vars[subs][n].u[1] = u_y;



          if( !lattice->solids[subs][n].is_solid)
          {
            compute_a_feq( feq, rho, u_x, u_y, u_z );

            for (a= 0; a<Q; a++)
            {
              temp[a] =f1[a] - feq1[a];
              f[a] =  feq[a]+ temp[a];
            }

          } /* if( !is_solid) */

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.velocity_GZL) */



    //PAN   V E L O C I T Y   T O P   I N F L O W   B C
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //  -- Velocity boundary on top side using inflow velocity condition.
    if( lattice->param.GZL && (!lattice->param.PressureBC))//lattice->param.velocity_t_in[subs])
    {
printf("%s %d >> BOOM!",__FILE__,__LINE__);
      k = nk-1;

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          f = lattice->pdf[subs][n].f;
          //  feq =  lattice->pdf[subs][n].feq;


          n1 = XYZ2N( i, j, k-1, ni, nj);
          f1 = lattice->pdf[subs][n1].f;
          feq1 = lattice->pdf[subs][n1].feq;

          rhoo = &( lattice->macro_vars[subs][n].rho);
          switch(NUM_FLUID_COMPONENTS)
          {case 1:
            {
              rho =  /*lattice->macro_vars[subs][n1].rho;*/lattice->param.rho_in;
              u_x =  0.;//lattice->macro_vars[subs][n1].u[0] ;
              u_y =  0.;//lattice->macro_vars[subs][n1].u[1] ;
              u_z =  -0.0;//lattice->macro_vars[subs][n1].u[2] ;
              break;
            }
            case 2:
            {
#if STORE_UEQ
              rho    =  lattice->param.rho_A[subs];
              u_x = 0.;// lattice->ueq[n1].u[0] ;
              u_y = 0.;// lattice->ueq[n1].u[1] ;
              u_z = 0.;// lattice->ueq[n1].u[2] ;
#endif
              break;
            }
          }
          lattice->macro_vars[subs][n].rho = rho;
          lattice->macro_vars[subs][n].u[0] = u_x;
          lattice->macro_vars[subs][n].u[1] = u_y;
          lattice->macro_vars[subs][n].u[2] = u_z;


          if( !lattice->solids[subs][n].is_solid)
          {
            compute_a_feq( feq, rho, u_x, u_y, u_z );

            for (a= 0; a<Q; a++)
            {f[a] = feq[a];}//+(f1[a] - feq1[a]);


          } /* if( !is_solid) */

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.velocity_GZL) */

    //PAN V E L O C I T Y   B O T T O M   I N F L O W   B C
    //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // velocity bottom inflow
    //  -- Velocity boundary on bottom side using inflow velocity condition.
    if(  lattice->param.GZL && (!lattice->param.PressureBC))//lattice->param.velocity_b_in[subs])
    {
printf("%s %d >> BOOM!",__FILE__,__LINE__);
      k = 0;

      for( j=0; j<nj; j++)
      {
        for( i=0; i<ni; i++)
        {
          n = XYZ2N( i, j, k, ni, nj);
          f = lattice->pdf[subs][n].f;
          //  feq =  lattice->pdf[subs][n].feq;

          n1 = XYZ2N( i, j, k+1, ni, nj);
          f1 = lattice->pdf[subs][n1].f;
          feq1 = lattice->pdf[subs][n1].feq;


          switch(NUM_FLUID_COMPONENTS)
          {case 1:
            {
              rho =  /*lattice->macro_vars[subs][n1].rho;*/lattice->param.rho_out;
              u_x =  0.;//lattice->macro_vars[subs][n1].u[0] ;
              u_y =  0.;//lattice->macro_vars[subs][n1].u[1] ;
              u_z =  -0.0;//lattice->macro_vars[subs][n1].u[2] ;
              break;
            }
            case 2:
            {
#if STORE_UEQ
              rho =  lattice->param.rho_B[subs];
              u_x =  0.;//lattice->ueq[n1].u[0] ;
              u_y =  0.;//lattice->ueq[n1].u[1] ;
              u_z =  0.;//lattice->ueq[n1].u[2] ;
#endif
              break;
            }
          }

          lattice->macro_vars[subs][n].rho = rho;
          lattice->macro_vars[subs][n].u[0] = u_x;
          lattice->macro_vars[subs][n].u[1] = u_y;
          lattice->macro_vars[subs][n].u[2] = u_z;

          if( !lattice->solids[subs][n].is_solid)
          {
            compute_a_feq( feq, rho, u_x, u_y, u_z );
            if(subs==1)
              compute_a_feq( feq1, 2.0- 0.0003*(double)lattice->time, u_x, u_y, u_z );

            for (a= 0; a<Q; a++)
            {
              f[a] = feq[a];

            }// +(f1[a] - feq1[a]);

          } /* if( !is_solid) */

        } /* for( i=0; i<ni; i++) */
      } /* for( j=0; j<nj; j++) */

    } /* if( lattice->param.velocity_GZL) */


  } /* for( subs=0; subs<(NUM_FLUID_COMPONENTS)-(INAMURO_SIGMA_COMPONENT); subs++) */

}
Example #4
0
int test_waitpid()
	{
	test_Data;
	void* proc;
	void* proc2;
	int ret;
	int status=-1;
	test_Title("WAITPID");
	test_Next("waitpid");
	proc = create_process(doafunc, "A", "rw", fids);
	if (proc)
		start_process(proc);
	else
		perror("Failed to start process A: ");
	
	// test return values of calls to waitpid with different options and pid's
	
	if (proc)
		{
		// test with option WNOHANG and a correct pid on an active process
		ret = wait_for_process_id(proc,get_proc_id(proc),WNOHANG,&status);
		test(ret==0);
		// test with an invalid pid 
		ret = wait_for_process_id(proc,99,0,&status);
		test(errno==ECHILD&&ret==-1);
		// test with invalid options
		ret = wait_for_process_id(proc,99,17,&status);
		test(errno==EINVAL&&ret==-1);
		ret = wait_for_process_id(proc,99,18,&status);
		test(errno==EINVAL&&ret==-1);
		// process is still active keep waiting until it dies
		do 
			{
			ret = wait_for_process_id(proc,get_proc_id(proc),WNOHANG,&status);
			}
		while(!WIFEXITED(status)&&ret==0);
		test(ret==get_proc_id(proc));
   		printf("child exited, status=%d\n", WEXITSTATUS(status));
		}

	// create another process and test waitpid with pid -1 and options 0
	// this is the same as calling wait
	proc2 = create_process(doafunc, "B", "rw", fids);
	if (proc2)
		start_process(proc2);
	else
		perror("Failed to start process B: ");
	if (proc2)
		{
		//wait for proc2 to finish
		do
			{
        	ret = wait_for_process_id(proc2,-1,0,&status);
    		}
    	while (!WIFEXITED(status));
		test(ret==get_proc_id(proc2));
    	printf("child exited, status=%d\n", WEXITSTATUS(status));
		}
		
	fflush(stdout);
	fclose(stdout);
	test_Close();
	return 0;
	}
Example #5
0
void main()
{
  int my_id = get_proc_id()-1;
  int num_cores = get_proc_num();
  
  short int i, iter, j, k; 
  int lb, ub, chunk;

    //number of rows each core has to multiply
  chunk = SIZE / num_cores;
  //lower bound
  lb = my_id * chunk;
  //upper bound
  ub = lb + chunk;  
  
#ifdef CHECKSUM
  //pr("lb", lb, PR_STRING | PR_DEC | PR_NEWL);   
  //pr("ub", ub, PR_STRING | PR_DEC | PR_NEWL);   

  //for (i = 0; i < SIZE; i++) {
    //for (k = 0; k < SIZE; k++) 
      //pr("", A[i][k], PR_DEC);   
    //pr("", 0, PR_NEWL);   
  //}
  //pr("", 0, PR_NEWL);   
  //for (i = 0; i < SIZE; i++) {
    //for (k = 0; k < SIZE; k++) 
      //pr("", B[i][k], PR_DEC);   
    //pr("", 0, PR_NEWL);   
  //}
#endif

  /********************* Benchmark Execution *********************/

  start_metric();
  for (iter = 0; iter < N_ITERS; iter++) {
    for (i = lb; i < ub; i++) {
      for (k = 0; k < SIZE; k++) {
        C[i][k] = 0;
        for (j = 0; j < SIZE; j++)
          C[i][k] += A[i][j] * B[j][k];
      }
    }
  } 
  stop_metric();
  /********************* Benchmark Execution *********************/

#ifdef CHECKSUM
  if(my_id == 0) {

    //pr("", 0, PR_NEWL);   
    //for (i = 0; i < SIZE; i++) {
      //for (k = 0; k < SIZE; k++) 
        //pr("", C[i][k], PR_DEC);   
      //pr("", 0, PR_NEWL);   
    //}

    pr("computing CHECKSUM...", 0x0, PR_CPU_ID | PR_STRING | PR_NEWL);

    int chk = 0;
    for (k = 0; k < SIZE; k++)
      for (j = 0; j < SIZE; j++)
          chk += C[k][j];

    if(chk == CHKSM) {
      pr("CHECKSUM OK!", 0x0, PR_CPU_ID | PR_STRING | PR_NEWL);
    } else  {
      pr("CHECKSUM IS WRONG! computed ", chk, PR_CPU_ID | PR_STRING | PR_DEC);
      pr(" expected ", CHKSM, PR_STRING | PR_DEC | PR_NEWL);
    }
  }  
#endif

}
Example #6
0
int main()
{
    _printstrn("--------------------------------------");
    _printstrn("Configuration");
    _printstrn("--------------------------------------");
    _printdecn("WIDTH ", WIDTH);
    _printdecn("HEIGHT ", HEIGHT);
    _printdecn("ROWS_EACH_COMPUTATION_PIPE ", ROWS_EACH_COMPUTATION_PIPE);
    _printdecn("ROWS_EACH_COMPUTATION_OUT_PIPE ", ROWS_EACH_COMPUTATION_OUT_PIPE);
    _printstrn("--------------------------------------");
    
    /*--- Pipe Support Data allocation*/
    unsigned int nr_bands_pipe = HEIGHT / ROWS_EACH_COMPUTATION_PIPE;
    unsigned int band_size_1ch = WIDTH*ROWS_EACH_COMPUTATION_PIPE*sizeof(IMG_DATATYPE);
    unsigned int band_size_3ch = WIDTH*ROWS_EACH_COMPUTATION_PIPE*3*sizeof(IMG_DATATYPE);
    unsigned int band_word_size_3ch = band_size_3ch / 4;
    int pipe_buffID = 0;
    
    /* Pipe Buffers for each stage */
    IMG_DATATYPE *csc_in[2];
    csc_in[0] = (IMG_DATATYPE *) SHMALLOC(band_size_3ch); //3ch each pixel
    csc_in[1] = (IMG_DATATYPE *) SHMALLOC(band_size_3ch); //3ch each pixel
    
    IMG_DATATYPE *cvT_in[2];
    cvT_in[0] = (IMG_DATATYPE *) SHMALLOC(band_size_3ch); //3ch each pixel
    cvT_in[1] = (IMG_DATATYPE *) SHMALLOC(band_size_3ch); //3ch each pixel
    
    IMG_DATATYPE *cvM_in[2];
    cvM_in[0] = (IMG_DATATYPE *) SHMALLOC(band_size_1ch); //1ch each pixel
    cvM_in[1] = (IMG_DATATYPE *) SHMALLOC(band_size_1ch); //1ch each pixel
    
    unsigned int moments[2][3] = {{0,0,0},{0,0,0}};
    
    /*--- Out-Pipe Support Data allocation*/
    unsigned int nr_bands_out = HEIGHT / ROWS_EACH_COMPUTATION_OUT_PIPE;
    unsigned int band_out_size_3ch = WIDTH*ROWS_EACH_COMPUTATION_OUT_PIPE*3*sizeof(IMG_DATATYPE);
    unsigned int band_out_word_size_3ch = band_out_size_3ch / 4;
    
    /* Out-pipe Buffers */
    IMG_DATATYPE *curr_frame[2];
    curr_frame[0] = (IMG_DATATYPE *) SHMALLOC(band_out_size_3ch); //3ch each pixel
    curr_frame[1] = (IMG_DATATYPE *) SHMALLOC(band_out_size_3ch); //3ch each pixel
    IMG_DATATYPE *track_in[2];
    track_in[0] = (IMG_DATATYPE *) SHMALLOC(band_out_size_3ch); //3ch each pixel
    track_in[1] = (IMG_DATATYPE *) SHMALLOC(band_out_size_3ch); //3ch each pixel
    IMG_DATATYPE *cvAdd_out[2];
    cvAdd_out[0] = (IMG_DATATYPE *) SHMALLOC(band_out_size_3ch); //3ch each pixel
    cvAdd_out[1] = (IMG_DATATYPE *) SHMALLOC(band_out_size_3ch); //3ch each pixel
    
    #ifdef APP_VERBOSE
    _printstrn("--------------------------------------");
    _printstrn("Buffers");
    _printstrn("--------------------------------------");
    _printhexp("csc_in[0] @", csc_in[0]);
    _printhexp("csc_in[1] @", csc_in[1]);
    _printhexp("cvT_in[0] @", cvT_in[0]);
    _printhexp("cvT_in[1] @", cvT_in[1]);
    _printhexp("cvM_in[0] @", cvM_in[0]);
    _printhexp("cvM_in[1] @", cvM_in[1]);
    _printhexp("curr_frame[0] @", curr_frame[0]);
    _printhexp("curr_frame[1] @", curr_frame[1]);
    _printhexp("track_in[0] @", track_in[0]);
    _printhexp("track_in[1] @", track_in[1]);
    _printhexp("cvAdd_out[0] @", cvAdd_out[0]);
    _printhexp("cvAdd_out[1] @", cvAdd_out[1]);
    _printstrn("--------------------------------------");
    #endif
    
    unsigned int caching = 0;
    for(caching = 0; caching < 2; ++caching)
    {
        
        /*--- COMPUTE INPUT FRAMES --- */
        #pragma omp parallel num_threads(4) firstprivate(pipe_buffID)
        {
            int tile_id = 0;
            int proc_id = get_proc_id()-1;
            int i = 0;
            for(i = 0; i < NR_FRAMES; ++i)
            {   
                /*NOTE if library supports multiple ws here you can use sections nowait */
                #ifdef SINGLE_WS
                #pragma omp master
                #else
                #pragma omp single nowait
                #endif
                {
                    _printdecp("[ColorTracking] Start computation of frame nr ", i);
                    //_tstamp();
                }
                
                /*NOTE if library supports multiple ws here you can use sections nowait */
                #ifdef SINGLE_WS
                #pragma omp sections
                #else
                #pragma omp sections nowait
                #endif
                {
                    /*--- DMA+CSC SECTION ---*/
                    #pragma omp section
                    {
//                         #ifdef APP_DEBUG
                        _printdecp("[CSC] operated by proc ", proc_id);
                        //_tstamp();
//                         #endif
                        
                        /* DMA Events */
                        unsigned char pipe_job_id_read[2];
                        
                        /*Current Frame*/
                        IMG_DATATYPE *current_frame_in = in_frame[i];
                        
                        /*First DMA INLOAD */
                        pipe_job_id_read[pipe_buffID] = dma_prog(proc_id, /*tile_id,*/ (unsigned int) current_frame_in, (unsigned int) csc_in[pipe_buffID], band_word_size_3ch, 1, 0, 0, 1);
                        
                        
                        #pragma omp parallel num_threads(4) firstprivate(pipe_buffID)
                        { 
                            unsigned int ii = 0;
                            for(ii = 0; ii < nr_bands_pipe; ++ii)
                            {   
                                if (pipe_buffID == 0)
                                    pipe_buffID = 1;
                                else
                                    pipe_buffID = 0;
                            
                                /* --------- DMA Stage --------- */
                                /*NOTE  This in MPARM MUST be managed via master-barrier.
                                    Single is possible to use due DMA policy.
                                    Who program dma must be the same processor who collect dma_wait.
                                */
                                #pragma omp master
                                {
                                    /*prog next buff*/
                                    if ((ii+1) < nr_bands_pipe)
                                        pipe_job_id_read[pipe_buffID] = dma_prog(proc_id, /*tile_id,*/ (unsigned int) &current_frame_in[(ii+1)*band_size_3ch], (unsigned int) csc_in[pipe_buffID], band_word_size_3ch, 1, 0, 0, 1);
                            
                                    #ifdef DMA_WAIT_TIME
                                    //_tstamp();
                                    #endif
                            
                                    //Wait for DMA end
                                    dma_wait(/*tile_id,*/ pipe_job_id_read[!pipe_buffID]);
                            
                                    #ifdef DMA_WAIT_TIME
                                    //_tstamp();
                                    #endif
                                }
                                #pragma omp barrier
                                
                                /* --------- CSC Computation --------- */
                                #ifdef APP_VERBOSE
                                _printdecp("[CSC] WORKING BAND NR ", ii);
                                #endif
                                
                                __CSC(csc_in[!pipe_buffID], cvT_in[!pipe_buffID], band_size_3ch);
                        
                                #ifdef APP_VERBOSE
                                _printstrp("[CSC] WORKING...DONE");
                                #endif
                                
                                /* --------- Synch to CVT --------- */
                                /*NOTE if library supports multiple ws here you can use single nowait */
                                #ifdef SINGLE_WS
                                #pragma omp master
                                #else
                                #pragma omp single nowait
                                #endif
                                {
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CSC] WAITING FOR CVT @ ",!pipe_buffID);
                                    #endif
                                
                                    while(!READY_FLAG_CVT[!pipe_buffID]);
                                    READY_FLAG_CVT[!pipe_buffID] = 0;
                                
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CSC] RELEASE CVT @ ",!pipe_buffID);
                                    #endif
                                
                                    RELEASE_FLAG_CVT[!pipe_buffID] = 1;
                                }
                            }
                        }//end inner parallel
//                         #ifdef APP_VERBOSE
                        _printdecp("[CSC] end computation of frame nr ", i);
//                         #endif
                    }//end section DMA+CSC
                    
                    /*--- cvThreshold SECTION ---*/
                    #pragma omp section
                    {                        
//                         #ifdef APP_DEBUG
                        _printdecp("[CVT] operated by proc ", proc_id);
                        //_tstamp();
//                         #endif
                        
                        #pragma omp parallel num_threads(4) firstprivate(pipe_buffID)
                        {
                            unsigned int ii = 0;
                            for(ii = 0; ii < nr_bands_pipe; ++ii)
                            {
                                /* --------- Buffer Swap --------- */
                                if (pipe_buffID == 0)
                                    pipe_buffID = 1;
                                else
                                    pipe_buffID = 0;
                                
                                #pragma omp single
                                {
                                    /* --------- Synch from CSC --------- */
                                    READY_FLAG_CVT[!pipe_buffID] = 1;
                                
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CVT] WAITING FOR RELEASE @ ",!pipe_buffID);
                                    #endif
                                
                                    while(!RELEASE_FLAG_CVT[!pipe_buffID]);
                                
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CVT] RELEASED @ ",!pipe_buffID);
                                    #endif
                                
                                    RELEASE_FLAG_CVT[!pipe_buffID] = 0;
                                }
                                
                                /* --------- cvThreshold computation --------- */
                                #ifdef APP_VERBOSE
                                _printdecp("[CVT] WORKING BAND NR ", ii);
                                #endif
                                
                                __cvThreshold(cvT_in[!pipe_buffID], cvM_in[!pipe_buffID], band_size_1ch);
                                
                                #ifdef APP_VERBOSE
                                _printstrp("[CVT] WORKING...DONE");                                
                                #endif
                                
                                /* --------- Synch to CVM --------- */
                                /*NOTE if library supports multiple ws here you can use single nowait */
                                #ifdef SINGLE_WS
                                #pragma omp master
                                #else
                                #pragma omp single nowait
                                #endif
                                {
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CVT] WAITING FOR CVM @ ",!pipe_buffID);
                                    #endif
                                
                                    while(!READY_FLAG_CVM[!pipe_buffID]);
                                    READY_FLAG_CVM[!pipe_buffID] = 0;
                                
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CVT] RELEASE CVM @ ",!pipe_buffID);
                                    #endif
                                
                                    RELEASE_FLAG_CVM[!pipe_buffID] = 1;
                                }
                            }
                        }//end inner parallel
//                         #ifdef APP_VERBOSE
                        _printdecp("[CVT] end computation of frame nr ", i);
//                         #endif
                    }//end section Threshold

                    /*--- cvMoments SECTION ---*/
                    #pragma omp section
                    {
                        unsigned int frameBuffID = i & 0x1;
                        
//                         #ifdef APP_DEBUG
                        _printdecp("[CVM] operated by proc ", proc_id);
                        //_tstamp();
//                         #endif
                            
                        #pragma omp parallel num_threads(4) firstprivate(pipe_buffID)
                        {
                            unsigned int ii = 0;
                            for(ii = 0; ii < nr_bands_pipe; ++ii)
                            {
                                /* --------- Buffer Swap --------- */
                                if (pipe_buffID == 0)
                                    pipe_buffID = 1;
                                else
                                    pipe_buffID = 0;
                                
                                #pragma omp single
                                {
                                    /* --------- Synch from CVT --------- */
                                    READY_FLAG_CVM[!pipe_buffID] = 1;
                                    
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CVM] WAITING FOR RELEASE @ ",!pipe_buffID);
                                    #endif
                                    
                                    while(!RELEASE_FLAG_CVM[!pipe_buffID]);
                                    
                                    #ifdef APP_VERBOSE
                                    _printdecp("[CVM] RELEASED @ ",!pipe_buffID);
                                    #endif
                                    
                                    RELEASE_FLAG_CVM[!pipe_buffID] = 0;
                                }
                                
                                /* --------- cvMoments computation --------- */
                                #ifdef APP_VERBOSE
                                _printdecp("[CVM] WORKING BAND NR", ii);
                                #endif
                                
                                __cvMoments(cvM_in[!pipe_buffID], moments[frameBuffID], ii*ROWS_EACH_COMPUTATION_PIPE, WIDTH, band_size_1ch);
                                
                                #ifdef APP_VERBOSE
                                _printstrp("[CVM] WORKING...DONE");
                                #endif
                            }
                        }//end inner parallel                        

                        /* --------- Synch to CVA --------- */
                        //_tstamp();
                        _printdecp("[CVM] end computation of frame nr ", i);
                                                
                        #ifdef APP_VERBOSE
                        _printdecp("[CVM] WAITING FOR CVA @ ",frameBuffID);
                        #endif
                        
                        while(!READY_FLAG_CVA[frameBuffID]);
                        READY_FLAG_CVA[frameBuffID] = 0;
                        
                        #ifdef APP_VERBOSE
                        _printdecp("[CVM] RELEASE CVA @ ",frameBuffID);
                        #endif
                        
                        RELEASE_FLAG_CVA[frameBuffID] = 1;
                    }//end section Moments

                    /*--- cvAdd SECTION ---*/
                    #pragma omp section
                    {
//                         #ifdef APP_DEBUG
                        _printdecp("[CVA] operated by proc ", proc_id);
                        //_tstamp();
//                         #endif
                        
                        /* DMA Events */
                        unsigned char out_job_id_read[4];
                        unsigned char out_job_id_write[2];
                        int out_buffID = 0;
                        
                        /*Current Frame*/
                        IMG_DATATYPE *current_frame_in = in_frame[i];
                        IMG_DATATYPE *current_frame_out = out_frame[i];
                        unsigned int frameBuffID = i & 0x1;
                        
                        
                        /* --------- Synch from CVM --------- */
                        #ifdef APP_VERBOSE
                        _printdecp("[CVA] WAITING FOR RELEASE @ ",frameBuffID);
                        #endif
                        
                        READY_FLAG_CVA[frameBuffID] = 1;
                        while(!RELEASE_FLAG_CVA[frameBuffID]);
                        
                        #ifdef APP_VERBOSE
                        _printdecp("[CVA] RELEASED @ ",frameBuffID);
                        #endif
                        
                        RELEASE_FLAG_CVA[frameBuffID] = 0;
                        
                        /*First DMA INLOAD */
                        out_job_id_read[out_buffID] = dma_prog(proc_id, /*tile_id,*/ (unsigned int) current_frame_in, (unsigned int)curr_frame[out_buffID], band_out_word_size_3ch, 1, 0, 0, 1);
                        out_job_id_read[out_buffID+2] = dma_prog(proc_id, /*tile_id,*/ (unsigned int) track_frame, (unsigned int)track_in[out_buffID], band_out_word_size_3ch, 1, 0, 0, 1);
                    
                        /* --------- cvLine --------- */
                        /*compute current center of gravity*/
                        double moment10 =  moments[frameBuffID][2];
                        double moment01 =  moments[frameBuffID][1];
                        double area = moments[frameBuffID][0];
                        double posX = moment10/area;
                        double posY = moment01/area;
                        
//                         #ifdef APP_DEBUG
                        _printdecp("[CVA] area:" , moments[frameBuffID][0]);
                        _printdecp("[CVA] moment01:" , moments[frameBuffID][1]);
                        _printdecp("[CVA] moment10:" , moments[frameBuffID][2]);
                        _printdecp("[CVA] posX:" , posX); //NOTE TO CHECK RESULTS-> MUST BE ALWAYS 238
                        _printdecp("[CVA] posY:" , posY); //NOTE TO CHECK RESULTS-> MUST BE ALWAYS 62
//                         #endif
                        
                        moments[frameBuffID][0] = moments[frameBuffID][1] = moments[frameBuffID][2] = 0;
                        
                        #pragma omp parallel num_threads(4) firstprivate(out_buffID)
                        {
                            unsigned int ii;
                            for(ii = 0; ii < nr_bands_out; ++ii )
                            {
                                if (out_buffID == 0)
                                    out_buffID = 1;
                                else
                                    out_buffID = 0;
                                
                                /* --------- DMA Stage --------- */
                                /*NOTE  This in MPARM MUST be managed via master-barrier.
                                Single is possible to use due DMA policy.
                                Who program dma must be the same processor who collect dma_wait.
                                */                                
                                #pragma omp master
                                {
                                    if ((ii+1) < nr_bands_out)
                                    {
                                        out_job_id_read[out_buffID] = dma_prog(proc_id, /*tile_id,*/ (unsigned int)&current_frame_in[(ii+1)*band_out_size_3ch], (unsigned int)curr_frame[out_buffID], band_out_word_size_3ch, 1, 0, 0, 1);
                                        out_job_id_read[out_buffID+2] = dma_prog(proc_id, /*tile_id,*/ (unsigned int)&track_frame[(ii+1)*band_out_size_3ch], (unsigned int)track_in[out_buffID], band_out_word_size_3ch, 1, 0, 0, 1);
                                    }
                                
                                    #ifdef DMA_WAIT_TIME
                                    //_tstamp();
                                    #endif
                                    //Wait for DMA end
                                    dma_wait(/*tile_id,*/ out_job_id_read[!out_buffID]);
                                    dma_wait(/*tile_id,*/ out_job_id_read[(!out_buffID) + 2]);
                                    #ifdef DMA_WAIT_TIME
                                    //_tstamp();
                                    #endif
                                }
                                #pragma omp barrier
                                
                                /*NOTE:MISSING --------- cvLine stage --------- */
                                //__cvLine(track_in, posX, posY);
                                                    
                                /* --------- cvAdd stage --------- */
                                #ifdef APP_VERBOSE
                                _printdecp("[CVA] WORKING BAND NR ", ii);
                                #endif
                                
                                __cvAdd(curr_frame[!out_buffID], track_in[!out_buffID], cvAdd_out[!out_buffID], band_out_size_3ch);
                                
                                #ifdef APP_VERBOSE
                                _printstrp("[CVA] WORKING...DONE");
                                #endif
                            
                                /*DMA writeback on L3*/
                                /*NOTE if library supports multiple ws here you can use single nowait */
                                #ifdef SINGLE_WS
                                #pragma omp master
                                #else
                                #pragma omp single nowait
                                #endif
                                {
                                    out_job_id_write[!out_buffID] = dma_prog(proc_id, /*tile_id,*/ (unsigned int) &current_frame_out[ii*band_out_size_3ch], (unsigned int)cvAdd_out[!out_buffID], band_out_word_size_3ch, 0, 1, 0, 1);
                                }
                            }//end bands for
                        }//end inner parallel
                        
                        //_tstamp();
                        _printdecp("[CVA] end computation of frame nr ", i);
                    }//end section DMA+cvAdd
                    
                }//end sections
                
                #pragma omp master
                {
                    //_tstamp();
                    _printdecp("[ColorTracking] end computation of frame nr", i);
                }
            }//for frame
        }//parallel
    }//caching
    
    return 0;
}
Example #7
0
/*******************************************************************************
 * PROCESS AUTO RESTART
*******************************************************************************/
int auto_restart_the_process(int idx)
{
	int			pid, ret;
	char		pname[LSIZE_256];
	struct stat	statbuf;

	/***************************************************************************
	* CHECK INDEX RANGE
	***************************************************************************/
	if( (idx < 0) || (idx >= dCurrBlockCnt))
		return -1;

	/***************************************************************************
	* ALREADY RUNNING, REMOVE PROCESS INFORATION
	***************************************************************************/
	if( (pid = get_proc_id(STR_TSW_COM[idx])) > 0)
	{
		fidb->mpsw[idx]				= NORMAL;
		fidb->mpswinfo[idx].pid		= pid;
		fidb->mpswinfo[idx].when	= time(NULL);

		return pid;
	}

	if( (ret = dGetBlockBIN(STR_TSW_COM[idx], pname, LSIZE_256)) < 0)
	{
		log_print(LOGN_CRI, "F=%s:%s.%d: ERROR IN dGetBlockBIN(STR_TSW_COM[%d][%s]) ret[%d]", __FILE__, __FUNCTION__, __LINE__,
			idx, STR_TSW_COM[idx], ret);
	}

	if(stat(pname, &statbuf) < 0)
		return -2;

	signal(SIGCHLD, SIG_IGN);
	pid = fork();

	log_print(LOGN_DEBUG, "[AUTO RESTART] [NEW PID] [%d]", pid);
	/* fork에서 실패하면 종료한다 */
	if(pid == -1)
	{
		log_print(LOGN_CRI, "F=%s:%s.%d: FAILED IN fork(pname[%s]) errno[%d-%s]", __FILE__, __FUNCTION__, __LINE__,
			pname, errno, strerror(errno));
		return -3;
	}
    else if(pid == 0)
	{
		/*	CHILD PROCESS 에서는 해당 프로그램을 수행을 시도하고	*/
		freopen("/dev/null", "w", stdout);
		if( (ret = execl(pname, STR_TSW_COM[idx], (char*)NULL)) == -1)
		{
			log_print(LOGN_CRI, "F=%s:%s.%d: FAILED IN execl(pname[%s]) errno[%d-%s]", __FILE__, __FUNCTION__, __LINE__,
				pname, errno, strerror(errno));
			exit(-4);
		}
		exit(0);
	}
	else
	{
		/*	PARENT PROCESS에서는 단순히 CHILD PROCESS의 PID를 RETURN	*/
#ifdef DEBUG
		log_print(LOGN_DEBUG, "%s START WITH %d", STR_TSW_COM[idx], pid);
#endif
		fidb->mpswinfo[idx].pid		= pid;
		fidb->mpswinfo[idx].when	= time(NULL);

		return pid;
	}
}