bool Create_mgrid_from_cgrid::exec(){
  // Get the grid from the manager
  SmartPtr<Named_interface> ni =
    Root::instance()->interface( gridModels_manager + "/" + cgrid_name_ );
  if( ni.raw_ptr() == 0 ) {
    errors_->report( "Object " + cgrid_name_ + " does not exist." );
    return false;
  }

  Cartesian_grid* cgrid = dynamic_cast<Cartesian_grid*>( ni.raw_ptr() );
  if( cgrid == 0) {
    errors_->report( "Object " + cgrid_name_ + " is not a cartesian grid." );
    return false;
  }    
 // Get the region
  std::vector<Grid_region*> regions;
  std::vector<std::string>::iterator it =  region_names_.begin();
  for( ; it!= region_names_.end(); ++it) {
    Grid_region* region = cgrid->region( *it );
    if(!region) {
      errors_->report( "Region " + (*it) + " does not exist."  );
      return false;
    }
    regions.push_back(region);
  }
  
// Create the new masked_grid

  ni = 
      Root::instance()->new_interface("reduced_grid://"+mgrid_name_,
      gridModels_manager + "/" + mgrid_name_);
 
  if( ni.raw_ptr() == 0 ) {
    errors_->report( "Object " + mgrid_name_ + " already exists. Use a different name." );
    return false;
  }
  
  Reduced_grid* grid = dynamic_cast<Reduced_grid*>( ni.raw_ptr() );

  //Create the grid
  if( regions.size() == 1 ) {  //avoid a copy of the region array
    grid->set_dimensions( 
      cgrid->geometry()->dim(0), 
      cgrid->geometry()->dim(1), 
      cgrid->geometry()->dim(2),
      cgrid->cell_dimensions()[0], 
      cgrid->cell_dimensions()[1], 
      cgrid->cell_dimensions()[2], 
      regions[0]->data(),
      cgrid->rotation_z());
  } else {
    int mask_size = regions[0]->size();
    std::vector<bool> mask( mask_size );
    for( int i=0; i< mask_size; ++i ) {
      bool ok = false;
      for( int j = 0; j<regions.size(); j++ ) {
        ok == ok || regions[j]->is_inside_region(i);
      }
      mask[i] = ok;
    }
    grid->set_dimensions( 
      cgrid->geometry()->dim(0), 
      cgrid->geometry()->dim(1), 
      cgrid->geometry()->dim(2),
      cgrid->cell_dimensions()[0], 
      cgrid->cell_dimensions()[1], 
      cgrid->cell_dimensions()[2], 
      mask,
      cgrid->rotation_z());
  }

  grid->origin( cgrid->origin() );

  proj_->new_object( mgrid_name_ );
  return true;
}