def define_output_directory_and_redirect_stdout(self, make_directories=True, output_log=None): """Make the main output directory, and redirect stdout to a file there @param output_log Name of file (stored inside the output directory) which will hold stdout """ if myid == 0: runtime = time.strftime('%Y%m%d_%H%M%S', time.localtime()) for i in range(1, numprocs): send(runtime, i) else: runtime = receive(0) barrier() self.output_dir = self.output_basedir + 'RUN_' + str(runtime) +\ '_' + self.scenario if ((make_directories) and (myid == 0)): try: os.mkdir(self.output_basedir) except: pass # Make the output directory try: os.mkdir(self.output_dir) except: pass print 'OUTPUT_DIRECTORY: ' + str(self.output_dir) # Send stdout to a file inside the output directory if output_log is not None: if make_directories: stdout_file = self.output_dir + '/' + output_log else: stdout_file = output_log if myid == 0: print 'Redirecting output now to ' + stdout_file sys.stdout = Logger(stdout_file) barrier() if myid != 0: sys.stdout = Logger(stdout_file) return
def process_project_data(self): """Process the input data ready for ANUGA """ # Print messages from the ProjectData.__init__ call # This allows us to log those messages without refactoring # (Consider refactoring though) if myid == 0: for p in self.print_info: print p print '' print '---------------------' print 'PROCESS_PROJECT_DATA' print '---------------------' print '' # Record the time and broadcast to other processers time_number = time.time() if numprocs > 1: for i in range(1, numprocs): send(time_number, i) else: time_number = receive(0) # We can either use interior regions, or breaklines if not self.interior_regions_data == []: assert self.pt_areas is None, \ 'Cannot define both ptAreas and non-empty interior regions' bounding_polygon_and_tags = \ read_boundary_tags_line_shapefile( self.bounding_polygon_and_tags_file, self.boundary_tags_attribute_name) self.bounding_polygon = bounding_polygon_and_tags[0] self.boundary_tags = bounding_polygon_and_tags[1] self.breaklines = su.readListOfBreakLines(self.breakline_files) (self.riverwalls, self.riverwall_par) = \ su.readListOfRiverWalls(self.riverwall_csv_files) if self.pt_areas is not None: self.region_point_areas = su.readRegionPtAreas( self.pt_areas, convert_length_to_area=self.region_resolutions_from_length) else: self.region_point_areas = None # Hack to override resolution # region_point_areas=\ # [ region_point_areas[i][0:2]+[150*150*0.5] for i in \ # range(len(region_point_areas))] # Redefine interior_regions to contain the polygon data + resolutions self.interior_regions = [[su.read_polygon(ir[0]), ir[1]] for ir in self.interior_regions_data] # Deal with intersections in the bounding polygon / breaklines / # riverwalls. At the moment we cannot add points to the bounding # polygon because the boundary tags are not adjusted -- so check that # the length of the bounding polygon doesn't change lbp = len(self.bounding_polygon) if type(self.break_line_intersect_point_movement_threshold) is not str: (self.bounding_polygon, self.breaklines, self.riverwalls) = \ su.add_intersections_to_domain_features( self.bounding_polygon, self.breaklines, self.riverwalls, point_movement_threshold=self.break_line_intersect_point_movement_threshold, verbose=True) msg = 'Bounding polygon had points added or dropped because of ' + \ 'intersections --' + \ 'This is not yet properly supported. Please add ' + \ ' the intersection points to the bounding polygon' assert lbp == len(self.bounding_polygon), msg # Here we make a unique ID based on the all the mesh geometry inputs # This tells us if we need to regenerate partitions, or use old ones mesh_dependency_information = [ self.bounding_polygon, self.interior_regions, self.riverwalls, self.breaklines, self.region_point_areas, self.default_res, self.boundary_tags ] if not self.use_existing_mesh_pickle: # Append the time to the mesh dependency so we don't reuse old # meshes mesh_dependency_information.append([time_number]) self.mesh_id_hash = hashlib.md5( json.dumps(mesh_dependency_information)).hexdigest() # Fix the output tif bounding polygon if self.output_tif_bounding_polygon is None: self.output_tif_bounding_polygon = self.bounding_polygon else: self.output_tif_bounding_polygon = \ su.read_polygon(self.output_tif_bounding_polygon) # Make proj4string from projection information # if isinstance(self.projection_information, int): # projection_information describes a UTM zone # e.g. '+units=m +ellps=WGS84 +zone=47 +south=False +proj=utm ' if self.projection_information < 0: self.proj4string = '+proj=utm +zone=' \ + str(abs(self.projection_information)) \ + ' +south +datum=WGS84 +units=m +no_defs' else: self.proj4string = '+proj=utm +zone=' \ + str(self.projection_information) \ + ' +datum=WGS84 +units=m +no_defs' elif isinstance(self.projection_information, str): self.proj4string = self.projection_information else: msg = 'Invalid projection information ' + \ ' -- must be a proj4string, or an integer' + \ ' defining a UTM zone [positive for northern hemisphere,' + \ ' negative for southern hemisphere]' raise Exception(msg) # Set up directories etc self.partition_basedir = 'PARTITIONS/' self.partition_dir = self.partition_basedir + 'Mesh_' +\ str(self.mesh_id_hash) self.meshname = self.output_dir + '/mesh.tsh'
def process_project_data(self): """Process the input data ready for ANUGA """ # Print messages from the ProjectData.__init__ call # This allows us to log those messages without refactoring # (Consider refactoring though) if myid == 0: for p in self.print_info: print p print '' print '---------------------' print 'PROCESS_PROJECT_DATA' print '---------------------' print '' # Record the time and broadcast to other processers time_number = time.time() if numprocs > 1: for i in range(1, numprocs): send(time_number, i) else: time_number = receive(0) # We can either use interior regions, or breaklines if not self.interior_regions_data == []: assert self.pt_areas is None, \ 'Cannot define both ptAreas and non-empty interior regions' bounding_polygon_and_tags = \ read_boundary_tags_line_shapefile( self.bounding_polygon_and_tags_file, self.boundary_tags_attribute_name) self.bounding_polygon = bounding_polygon_and_tags[0] self.boundary_tags = bounding_polygon_and_tags[1] self.breaklines = su.readListOfBreakLines(self.breakline_files) (self.riverwalls, self.riverwall_par) = \ su.readListOfRiverWalls(self.riverwall_csv_files) if self.pt_areas is not None: self.region_point_areas = su.readRegionPtAreas( self.pt_areas, convert_length_to_area=self.region_resolutions_from_length) else: self.region_point_areas = None # Hack to override resolution # region_point_areas=\ # [ region_point_areas[i][0:2]+[150*150*0.5] for i in \ # range(len(region_point_areas))] # Redefine interior_regions to contain the polygon data + resolutions self.interior_regions = [[su.read_polygon(ir[0]), ir[1]] for ir in self.interior_regions_data] # Deal with intersections in the bounding polygon / breaklines / # riverwalls. At the moment we cannot add points to the bounding # polygon because the boundary tags are not adjusted -- so check that # the length of the bounding polygon doesn't change lbp = len(self.bounding_polygon) if type(self.break_line_intersect_point_movement_threshold) is not str: (self.bounding_polygon, self.breaklines, self.riverwalls) = \ su.add_intersections_to_domain_features( self.bounding_polygon, self.breaklines, self.riverwalls, point_movement_threshold=self.break_line_intersect_point_movement_threshold, verbose=True) msg = 'Bounding polygon had points added or dropped because of ' + \ 'intersections --' + \ 'This is not yet properly supported. Please add ' + \ ' the intersection points to the bounding polygon' assert lbp == len(self.bounding_polygon), msg # Here we make a unique ID based on the all the mesh geometry inputs # This tells us if we need to regenerate partitions, or use old ones mesh_dependency_information = [ self.bounding_polygon, self.interior_regions, self.riverwalls, self.breaklines, self.region_point_areas, self.default_res, self.boundary_tags ] if not self.use_existing_mesh_pickle: # Append the time to the mesh dependency so we don't reuse old # meshes mesh_dependency_information.append([time_number]) self.mesh_id_hash = hashlib.md5(json.dumps(mesh_dependency_information)).hexdigest() # Fix the output tif bounding polygon if self.output_tif_bounding_polygon is None: self.output_tif_bounding_polygon = self.bounding_polygon else: self.output_tif_bounding_polygon = \ su.read_polygon(self.output_tif_bounding_polygon) # Make proj4string from projection information # if isinstance(self.projection_information, int): # projection_information describes a UTM zone # e.g. '+units=m +ellps=WGS84 +zone=47 +south=False +proj=utm ' if self.projection_information < 0: self.proj4string = '+proj=utm +zone=' \ + str(abs(self.projection_information)) \ + ' +south +datum=WGS84 +units=m +no_defs' else: self.proj4string = '+proj=utm +zone=' \ + str(self.projection_information) \ + ' +datum=WGS84 +units=m +no_defs' elif isinstance(self.projection_information, str): self.proj4string = self.projection_information else: msg = 'Invalid projection information ' + \ ' -- must be a proj4string, or an integer' + \ ' defining a UTM zone [positive for northern hemisphere,' + \ ' negative for southern hemisphere]' raise Exception(msg) # Set up directories etc self.partition_basedir = 'PARTITIONS/' self.partition_dir = self.partition_basedir + 'Mesh_' +\ str(self.mesh_id_hash) self.meshname = self.output_dir + '/mesh.tsh'
#------------------------------------------------------------------------------ name_stem = scenario +'_'+run_nameflag+'_'+detailed_region+'_'+str(eq_template)+'_'+str(1000+random_seed_int) print 'name_stem is '+ name_stem # Determine time for setting up local directories if myid == 0: run_time=strftime('%Y%m%d_%H%M%S', localtime()) + '_run_' output_run='./MODEL_OUTPUTS/'+run_time+'_'+name_stem # Place to store outputs try: os.mkdir('./MODEL_OUTPUTS') except: pass for i in range(1, numprocs): send(output_run, i) else: output_run = receive(0) if(earthquake_type=='synthetic_slip'): # Location to save output synthetic earthqake files slip_output=output_run + '/' + synthetic_slip_dirname + '/' # Location to store the '.pts' file which is written prior to mesh generation meshname = output_run + '/' + name_stem + '.msh' #------------------------------------------------------------------------------ # Domain definitions #------------------------------------------------------------------------------ # Use these very large zones as a boundary condition buffer.