示例#1
0
 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)
示例#2
0
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"
示例#3
0
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:
示例#4
0
 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)