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; }