tri = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'] if myopt == "p": # Arquivo previsão fsct_url = "http://opendap.funceme.br:8001/data/ECHAM46/FORECAST/{0}/{1}/PCP/TRI/pcp-daily-total-ec4amip_{2}{3}.1.0dg.fix.nc".format(myfyear, tri[myfmon-1], myfyear, mytseason) # print fsct_url fsct_file = open_url(fsct_url) pcp_fsct = fsct_file['pcp'] lats_fsct = fsct_file['lat'] lons_fsct = fsct_file['lon'] fsct = np.asarray(pcp_fsct) lats = np.asarray(lats_fsct) lons = np.asarray(lons_fsct) n_lon, n_lat, i_lon, i_lat = dg.gridpoint(lons, lats, mylon, mylat) n_lon = str(n_lon) n_lon = n_lon.replace(".","") n_lat = str(n_lat) n_lat = n_lat.replace(".","") # ponto do modelo a ser plotado figrealname = "/var/www/html/app/previsao-climatica/previsao_probabilistica/img/curve_prob_{0}_{1}.png".format(n_lon, n_lat) mylon = str(mylon) mylon = mylon.replace(".","") mylat = str(mylat) mylat = mylat.replace(".","") figname = "/var/www/html/app/previsao-climatica/previsao_probabilistica/img/curve_prob_%s_%s.png" % (mylon, mylat) # se a imagem nao tiver sido gerada anteriomente
def ProbMemb(fcst_month, fcst_year, target_year, target_months, hind_period, nyears, shapef, nmemb=20): """ Esta função calcula a curva de probabilida a previsão (sinal) para todos os membros. :param fcst_month: Mês previsão :type fcst_month: str :param fcst_year: Ano do mês previsão :type fcst_year: str :param target_year: Ano alvo da previsão :type target_year: str :param target_months: Trimestre alvo da previsão :type target_months: str :param hind_period: Período do hindcast :type hind_period: str :param nyears: Número de anos do hindcast :type nyears: int :param shapef: Arquivo de txt com pontos da região :type shapef: arquivo de txt :param nmemb: Número de membros da preevisão/hinscast :type nmemb: int :return sig_membs_ce: Sinal da previsão para todos os membros """ #### OBSERVADO #### print "\n +++ LENDO A CLIMATOLOGIA OBSERVADA +++\n" if target_year > fcst_year: url = 'http://opendap2.funceme.br:8001/data/dados-obs/cmap/2.5dg/' \ 'cmap.precip.season.accum.standard.2.5dg.{0}.{1}.nc' \ .format("1982-2011", target_months) else: url = 'http://opendap2.funceme.br:8001/data/dados-obs/cmap/2.5dg/' \ 'cmap.precip.season.accum.standard.2.5dg.{0}.{1}.nc' \ .format("1981-2010", target_months) print target_year, fcst_year print url obs_data = Dataset(url, 'r') obs_aux = obs_data.variables['precip'][:] obs_lons_360 = obs_data.variables['lon'][:] obs_lats = obs_data.variables['lat'][:] obs_data.close() obs_aux, obs_lons = shiftgrid(180., obs_aux, obs_lons_360, start=False) print "\n +++ INTERPOLANDO CLIMATOLOGIA OBSERVADA +++ \n" # Interpolação para 1 grau # Nova grade de 1 grau newlats = np.linspace(-90, 90, 181) newlons = np.linspace(-180, 179, 360) obs = np.zeros((int(obs_aux.shape[0]), int(len(newlats)), int(len(newlons)))) x, y = np.meshgrid(newlons, newlats) for i in range(0, int(obs_aux.shape[0])): obs[i, :, :] = interp(obs_aux[i, :, :], obs_lons, obs_lats, x, y, order=1) #### PREVISÃO #### print " +++ LENDO OS MEMBROS PREVISÃO +++ \n" #~ Monta a url do ano da previsão com todos os membros url = 'http://opendap2.funceme.br:8001/data/dados-pos-processados-echam46' \ '/forecasts/{0}/{2}/{1}/PCP/TRI/pcp-seasonacc-echam46-hind{0}-en%2.2d-{1}{2}_{3}{4}.ctl' \ .format(hind_period, fcst_month, fcst_year, target_year, target_months) files = [url % d for d in range(51, 71)] # Inicializa array que irá receber os membros do ano da previsão fcst_t42 = np.zeros((20, 64, 128)) * 0 for i, nc in enumerate(files): print "", nc fcst_data = Dataset(nc, 'r') fcst_aux = fcst_data.variables['pcp'][:] fcst_lons_360 = fcst_data.variables['longitude'][:] fcst_lats = fcst_data.variables['latitude'][:] fcst_data.close() fcst_aux, fcst_lons = shiftgrid(180., fcst_aux, fcst_lons_360, start=False) fcst_t42[i, :, :] = fcst_aux[0, :, :] print "\n +++ INTERPOLANDO OS MEMBROS PREVISÃO +++ \n" # Interpolação para 1 grau # Nova grade de 1 grau fcst = np.zeros((20, int(len(newlats)), int(len(newlons)))) * 0 for i in range(20): fcst[i, :, :] = interp(fcst_t42[i, :, :], fcst_lons, fcst_lats, x, y, order=1) #### HINDCAST #### print " +++ LENDO OS MEMBROS DE CADA ANO DO HINDCAST +++\n" print " ==> AGUARDE...\n" # Inicializa array que irá receber todos os anos e todos os membros hind_t42 = np.zeros((30, 20, 64, 128)) * 0 for i, hind_year in enumerate(range(1981, 2011)): if target_year > fcst_year: target_hind_year = int(hind_year) + 1 else: target_hind_year = hind_year # Monta a url de cada ano com todos os membros url = 'http://opendap2.funceme.br:8001/data/dados-pos-processados-echam46' \ '/hindcasts/{0}/{1}/PCP/TRI/pcp-seasonacc-echam46-hind{0}-en%2.2d-{1}{3}_{4}{2}.ctl' \ .format(hind_period, fcst_month, target_months, hind_year, target_hind_year) files = [url % d for d in range(51, 71)] # Inicializa array que irá receber os membros para cada ano hindmemb = np.zeros((20, 64, 128)) * 0 for j, nc in enumerate(files): print nc hind_data = Dataset(nc, 'r') hind_aux = hind_data.variables['pcp'][:] hind_lons_360 = hind_data.variables['longitude'][:] hind_lats = hind_data.variables['latitude'][:] hind_data.close() hind_aux, hind_lons = shiftgrid(180., hind_aux, hind_lons_360, start=False) hindmemb[j, :, :] = hind_aux[0, :, :] hind_t42[i, :, :, :] = hindmemb[:, :, :] print "\n +++ INTERPOLANDO OS ANOS DE CADA MEMBRO DO HINDCAST +++ \n" print " ==> AGUARDE... \n" # Interpolação para 1 grau hind = np.zeros((30 , 20, int(len(newlats)), int(len(newlons)))) * 0 for i in range(20): #~ print " MEMBRO:", i + 51 for j in range(30): hind[j, i, :, :] = interp(hind_t42[j, i, :, :], hind_lons, hind_lats, x, y, order=1) print " +++ APLICANDO MÁSCARA DA REGIÃO +++ \n" # Retorna matriz com os pontos sobre o Ceará pointsgrid, lonlatgrid, mymatriz = dg.pointinside(newlats, newlons, shapefile=shapef) ce_fcst = np.ma.array(fcst, mask=np.tile(mymatriz, (fcst.shape[0], 1))) ce_hind = np.ma.array(hind, mask=np.tile(mymatriz, (hind.shape[0], hind.shape[1], 1))) ce_obs = np.ma.array(obs, mask=np.tile(mymatriz, (obs.shape[0], 1))) print " +++ MÉDIA DOS PONTOS SOBRE A REGIÃO PARA TODOS OS MEMBROS +++ \n" ave_ce_fcst = np.zeros((int(nmemb), 1)) * 0 ave_ce_hind = np.zeros((int(nyears), int(nmemb), 1)) * 0 ave_ce_obs = np.zeros((int(nyears), 1)) * 0 for i in range(int(nmemb)): ave_ce_fcst[i, 0] = ce_fcst[i, :, :].mean() for j in range(int(nyears)): ave_ce_hind[j, i, 0] = ce_hind[j, i, :, :].mean() for i in range(int(nyears)): ave_ce_obs[i, 0] = ce_obs[i, :, :].mean() # print ave_ce_fcst, ave_ce_hind, ave_ce_obs print " +++ CALCULANDO SINAL DA PREVISÃO PARA TODOS OS MEMBROS +++\n" sig_membs_ce = np.empty((int(nmemb))) sig_membs_ce[:] = np.nan for i in range(nmemb): below_ce, normal_ce, above_ce, sig_membs_ce[i], f_std_ce, \ o_pad_ce, fcst_sig_anom = compute_probability(ave_ce_fcst[i, 0], ave_ce_hind[:, i, 0], ave_ce_obs[:, 0], nyears) return sig_membs_ce