def search_best(self, sample, position, step=(1, 1.0e6), searchrange=[], mpi=False): """给定sample,搜索position位置上的最佳值""" base_sample = copy.copy(sample); best = sample last_value = None; counter = 0; minvalue = None #Search all elements in given range (External MPI Routine) if not mpi: minvalue = None for searchitem in searchrange: base_sample[position] = searchitem source = global_settings.expand_src(base_sample) value = self.run_model(source) self.mpilog.info("[External MPI=%d]: sample=%s, count=%d, value=%g" % (mpi_rank, str(base_sample), counter, value)) #TODO: 根据不同的分布函数的核,这里不一定是minvalue有可能是maxvalue if minvalue is None or minvalue > value: minvalue = value best = copy.copy(base_sample) #An unlimited search (Internal MPI Routine) else: #TODO: 4 is not fixed, should be the length of sample assert position != 0 f = step[1] if position else step[0] base_sample[position] = mpi_rank * f if position else 4 + mpi_rank self.mpilog.debug("My Rank is %d" % mpi_rank) finished = False while not finished: if 1: source1 = global_settings.expand_src(base_sample) value = self.run_model(source1) self.mpilog.info("[Internal MPI=%d]: sample=%s, count=%d, value=%g" % (mpi_rank, str(base_sample), counter, value)) if mpi_rank == 0: #Master Node valuelist = [(value, base_sample)] valuelist += map(lambda r: mpi_comm.recv(source=r, tag=9), range(1, mpi_size)) #for rank in range(1, mpi_size): # valuelist += [mpi_comm.recv(source=rank, tag=9)] self.mpilog.debug("[MPI Search], valuelist=%s" % str(valuelist)) for value_slave, base_sample_slave in valuelist: if minvalue is None or minvalue > value_slave: minvalue = value_slave best = copy.copy(base_sample_slave) counter = (counter+1) if minvalue < value_slave else 0 if counter > 40: finished = True else: #Slave Node mpi_comm.send((value, base_sample), dest=0, tag=9) base_sample[position] += mpi_size * f finished = mpi_comm.bcast(finished, root=0) mpi_comm.barrier(); #if position == 0 and base_sample[position] >= 720: # break; return (best, minvalue)
def runselftest(case=0): testsrc = input_info.source_info(test=True) testmet = input_info.met_info(testsrc, mode=global_settings.MET_FORMAT, dataset=global_settings.METFILE, test=bool(global_settings.METTEST)) print "Reading source data" ReleaseQ = testsrc.read_rate() ReleaseQ1 = global_settings.expand_src([90, 141718800.0, 140853300.0, 136447200.0, 130601400.0]) print "Reading met data" met = testmet.get_met() ## 这里是设置案例编号的地方 if __debug__: print "Case Num: %d" % case starttime = datetime.now() logger.info("starttime=%s" % str(datetime.now())) if case == 0: model = model_puff_core(testsrc, met) model.run_point(points=([1140.0,20.0,1.0]), force_no_debug=True) result = model.point_list elif case == 1: model = model_puff_core(testsrc, met) result = model.run_core_contour(1, False, None, [], False) model.writefield(result, prefix="conc_field") elif case == 2: model = model_puff_core(testsrc, met) points = [(500,20.0,1.0),(1000,50.0,1.0),(2000,150.0,1.)] result = model.run_point(points=points, force_no_debug=True) model.writepoint(result) elif case == 3: model = model_puff_corea(testsrc, met) result = model.run_point(points=[(500,20.0,1.0)], force_no_debug=True) model1 = model_puff_core(ReleaseQ1, MetField, MetSeq) result1 = model1.run_point(points=[(500,20.0,1.0)], force_no_debug=True) from pylab import plot, xlabel, ylabel, grid, show, Rectangle, legend x = result.values()[0].keys() y1 = result.values()[0].values() y2 = result1.values()[0].values() plot(x,y1,'go-') plot(x,y2,'bo--') xlabel(u"时间刻度(10s)") ylabel(u"浓度(mg/m3)") p1 = Rectangle((0, 0), 1, 1, fc="g") p2 = Rectangle((0, 0), 1, 1, fc="b") legend([p1, p2], [u"真实源", u"反算源"]) show() logger.info("endtime=%s" % str(datetime.now())) print "duration=%s" % str(datetime.now() - starttime) print "Program End Normally"
def plot_debug(result): import pylab from pylab import contour, grid, show contours = (70.9/22.4, 70.9/22.4*3, 70.9/22.4*20) contour(result, contours) grid(True) show() def runselftest(case=0): testsrc = input_info.source_info(test=True) testmet = input_info.met_info(testsrc, mode=global_settings.MET_FORMAT, dataset=global_settings.METFILE, test=bool(global_settings.METTEST)) print "Reading source data" ReleaseQ = testsrc.read_rate() ReleaseQ1 = global_settings.expand_src([90, 141718800.0, 140853300.0, 136447200.0, 130601400.0]) print "Reading met data" met = testmet.get_met() ## 这里是设置案例编号的地方 if __debug__: print "Case Num: %d" % case starttime = datetime.now() logger.info("starttime=%s" % str(datetime.now())) if case == 0: model = model_puff_core(testsrc, met) model.run_point(points=([1140.0,20.0,1.0]), force_no_debug=True) result = model.point_list elif case == 1: model = model_puff_core(testsrc, met) result = model.run_core_contour(1, False, None, [], False) model.writefield(result, prefix="conc_field") elif case == 2:
def search_best(self, sample, position, step=(1, 1.0e6), searchrange=[], mpi=False): """给定sample,搜索position位置上的最佳值""" base_sample = copy.copy(sample) best = sample last_value = None counter = 0 minvalue = None #Search all elements in given range (External MPI Routine) if not mpi: minvalue = None for searchitem in searchrange: base_sample[position] = searchitem source = global_settings.expand_src(base_sample) value = self.run_model(source) self.mpilog.info( "[External MPI=%d]: sample=%s, count=%d, value=%g" % (mpi_rank, str(base_sample), counter, value)) #TODO: 根据不同的分布函数的核,这里不一定是minvalue有可能是maxvalue if minvalue is None or minvalue > value: minvalue = value best = copy.copy(base_sample) #An unlimited search (Internal MPI Routine) else: #TODO: 4 is not fixed, should be the length of sample assert position != 0 f = step[1] if position else step[0] base_sample[position] = mpi_rank * f if position else 4 + mpi_rank self.mpilog.debug("My Rank is %d" % mpi_rank) finished = False while not finished: if 1: source1 = global_settings.expand_src(base_sample) value = self.run_model(source1) self.mpilog.info( "[Internal MPI=%d]: sample=%s, count=%d, value=%g" % (mpi_rank, str(base_sample), counter, value)) if mpi_rank == 0: #Master Node valuelist = [(value, base_sample)] valuelist += map( lambda r: mpi_comm.recv(source=r, tag=9), range(1, mpi_size)) #for rank in range(1, mpi_size): # valuelist += [mpi_comm.recv(source=rank, tag=9)] self.mpilog.debug("[MPI Search], valuelist=%s" % str(valuelist)) for value_slave, base_sample_slave in valuelist: if minvalue is None or minvalue > value_slave: minvalue = value_slave best = copy.copy(base_sample_slave) counter = (counter + 1) if minvalue < value_slave else 0 if counter > 40: finished = True else: #Slave Node mpi_comm.send((value, base_sample), dest=0, tag=9) base_sample[position] += mpi_size * f finished = mpi_comm.bcast(finished, root=0) mpi_comm.barrier() #if position == 0 and base_sample[position] >= 720: # break; return (best, minvalue)