def interp(self): #point = (self.dst_grid_center_lon[0], self.dst_grid_center_lat[0]) #point = (0.0, 0.0) n = len(self.dst_grid_center_lon) for i in xrange(n): # ignore masked pnt if self.dst_grid_imask[i] == 0: print 'My mask is zero!' self.remap_matrix.append([]) self.remap_matrix_indx.append([]) continue # debug recovery function #dst_point = (357.625, -82.375) dst_point = (self.dst_grid_center_lon[i], self.dst_grid_center_lat[i]) indx, lst = self.bilinearbox_obj.find_nearest_k(dst_point, 4) # suppose atom grid has no mask # case ocn2atm, a atm cell with a land cell below if Interp.check_all_masks(self, indx, 4): print 'It must be a land cell.' self.remap_matrix.append([]) self.remap_matrix_indx.append([]) continue # decide if dst pnt is coincide with a src pnt local_wgt = [] if dst_point in lst: print 'coincide' for item in lst: if item == dst_point: local_wgt.append(1.0) else: local_wgt.append(0.0) Interp.check_wgt(self, local_wgt) Interp.check_wgtsum(self, local_wgt) # set remap_matrix and remap_matrix_indx objs self.remap_matrix.append(local_wgt) indx = Interp.indx_recovery(self, indx) self.remap_matrix_indx.append(indx) continue # better wish, but disappointed # tackle pole region if self.pole_flag: if dst_point[1] > self.pole_north_bnd: print 'Tackling pole region' bilinear_solver = Pole_Solver(dst_point, self.pole_north, 4) bilinear_solver.solve() bilinear_box_indx = self.pole_north_indx[0:4] bilinear_box_indx = Interp.indx_recovery(self, bilinear_box_indx) self.remap_matrix.append(bilinear_solver.wgt_lst) self.remap_matrix_indx.append(bilinear_box_indx) continue if dst_point[1] < self.pole_south_bnd: print 'Tackling pole region' bilinear_solver = Pole_Solver(dst_point, self.pole_south, 4) bilinear_solver.solve() bilinear_box_indx = self.pole_south_indx[0:4] bilinear_box_indx = Interp.indx_recovery(self, bilinear_box_indx) self.remap_matrix.append(bilinear_solver.wgt_lst) self.remap_matrix_indx.append(bilinear_box_indx) continue # find a bilinear box outside_flag, full_flag, bilinear_box_indx, bilinear_box = self.bilinearbox_obj.find_nearest_box(dst_point) # can not find 4 cells with no masks # use idw algorithm instead if not full_flag: bilinear_solver = Idw_Solver(dst_point, bilinear_box, 1.0e-6, 1) bilinear_solver.solve() bilinear_box_indx = Interp.indx_recovery(self, bilinear_box_indx) Interp.check_wgt(self, bilinear_solver.wgt_lst) Interp.check_wgtsum(self, bilinear_solver.wgt_lst) self.remap_matrix.append(bilinear_solver.wgt_lst) self.remap_matrix_indx.append(bilinear_box_indx) continue predict_flag = False # if can not be contained or bounding rect is a triangle # deciding a triangle by checking if three of them is collinearion if outside_flag or self.check_triangle(bilinear_box): predict_flag = True print 'predictor case.' bilinear_solver = Bilinear_Predictor(dst_point, bilinear_box) bilinear_solver.predict() # print debug info in detail if outside_flag: print 'outside' if not is_convex_quadrangle(bilinear_box): print 'it is a non-convex quadrangle, so it must be outside.' else: print 'trully meaning extrapolation.' else: print 'it is a bounding triangle box.' else: print dst_point print bilinear_box print 'normal case' bilinear_solver = Bilinear_Solver(dst_point, bilinear_box) branch = self.switch(bilinear_box) if branch == 1: bilinear_solver.solve_bilinear_case1() if branch == 2: bilinear_solver.solve_bilinear_case2() if branch == 3: bilinear_solver.solve_bilinear_case3() # transferm ghost bilinear_box_indx to original bilinear_box_indx = Interp.indx_recovery(self, bilinear_box_indx) print dst_point print bilinear_box print bilinear_box_indx print bilinear_solver.wgt_lst print '' # store result into objs #self.interp_wgt = bilinear_solver.wgt_lst #self.interp_box_indx = bilinear_box_indx #self.interp_box = bilinear_box if not predict_flag: Interp.check_wgt(self, bilinear_solver.wgt_lst) Interp.check_wgtsum(self, bilinear_solver.wgt_lst) # set remap_matrix and remap_matrix_indx objs self.remap_matrix.append(bilinear_solver.wgt_lst) self.remap_matrix_indx.append(bilinear_box_indx) print 'remap_matrix size is:' print len(self.remap_matrix)
def interp(self): n = len(self.dst_grid_center_lon) # traverse dst pnt for i in xrange(n): # ignore masked pnt if self.dst_grid_imask[i] == 0: print 'My mask is zero!' self.remap_matrix.append([]) self.remap_matrix_indx.append([]) continue dst_point = (self.dst_grid_center_lon[i], self.dst_grid_center_lat[i]) neighbor_indx, neighbor_lst = self.find_idw_neighbors(dst_point) # suppose atm grid has no mask # case ocn2atm, a atm cell with a land cell below if not neighbor_indx: print 'It must be a land cell.' self.remap_matrix.append([]) self.remap_matrix_indx.append([]) continue # better wish, but disappointed # tackle pole region if self.pole_flag: if dst_point[1] > self.pole_north_bnd: print 'Tackling pole region' idw_solver = Pole_Solver(dst_point, self.pole_north, self.nearest_k) idw_solver.solve() idw_box_indx = self.pole_north_indx[0:self.nearest_k] idw_box_indx = Interp.indx_recovery(self, idw_box_indx) self.remap_matrix.append(idw_solver.wgt_lst) self.remap_matrix_indx.append(idw_box_indx) continue if dst_point[1] < self.pole_south_bnd: print 'Tackling pole region' idw_solver = Pole_Solver(dst_point, self.pole_south, self.nearest_k) idw_solver.solve() idw_box_indx = self.pole_south_indx[0:self.nearest_k] idw_box_indx = Interp.indx_recovery(self, idw_box_indx) self.remap_matrix.append(idw_solver.wgt_lst) self.remap_matrix_indx.append(idw_box_indx) continue # normal case, init idw_solver idw_solver = Idw_Solver(dst_point, neighbor_lst, self.eps, self.power) # decide if dst pnt is coincide with a src pnt if dst_point in neighbor_lst: print 'coincide' for item in neighbor_lst: if item == dst_point: idw_solver.wgt_lst.append(1.0) else: idw_solver.wgt_lst.append(0.0) else: # solve normal case idw_solver.solve() print neighbor_indx # transform ghost indx to original neighbor_indx = Interp.indx_recovery(self, neighbor_indx) print neighbor_indx print '' print dst_point print neighbor_lst print neighbor_indx print idw_solver.wgt_lst # store result into objs #self.interp_wgt = idw_solver.wgt_lst #self.interp_box_indx = neighbor_indx #self.interp_box = neighbor_lst # set remap_matrix and remap_matrix_indx objs self.remap_matrix.append(idw_solver.wgt_lst) self.remap_matrix_indx.append(neighbor_indx) if len(idw_solver.wgt_lst) != len(neighbor_indx): print idw_solver.wgt_lst print neighbor_indx print 'ERRORRRR' sys.exit() print 'remap_matrix size is:' print len(self.remap_matrix)