Project

General

Profile

Crocus-RESORT » 20170922_Traitement_Viab.py

carlo carmagnola, 11/14/2018 04:12 PM

 
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# Viability computation - post s2m
# Author: P.Spandre
# Date: 2017-10-22

import netCDF4
import csv
import numpy as np

################################################################
##
## DEFINITIONS FONCTIONS
##
################################################################

## FICHIER DE POIDS
# Lecture du fichier de discrétisation des locations avec poids

def dict_loc_poids(fichier_poids, indicatif, type_man):
code_dict = dict()
disc_file = list(csv.reader(open(fichier_poids,'r'),delimiter=';'))

code = []
ind = []
snow_type = []
code_loc = []
mp_part = []

for k in range(1,len(disc_file)):
ind = disc_file[k][0][0:4]
snow_type = disc_file[k][0][4:6]
mp_part = float(disc_file[k][1])

code_loc = disc_file[k][0][6:]
if (ind == indicatif) and (snow_type == type_man):
code_dict[code_loc] = mp_part
return code_dict

## PART MP en DAMAGE
def mp_part_gr(code_dict, lat, lon, zs, aspect, slope):
# Dictionnaire de correspondance des expositions (degrés / code)
dict_aspect = {-1:0,0:1,45:2,90:3,135:4,180:5,225:6,270:7,315:8}
len_dim_loc=len(zs)
mp_part_gr = np.zeros(len_dim_loc)

for loc in range(len_dim_loc):#2 4444757 667076 1200
# Code de description du fichier netcdf
if alti[loc] > 1000.:
area_code = str(2) + str(int(lat[loc]*100000)) + str(int(lon[loc]*100000)) + str(int(alti[loc]/100)) + str(int(dict_aspect[aspect[loc]])) + str(int(slope[loc]/10))
else:
area_code = str(2) + str(int(lat[loc]*100000)) + str(int(lon[loc]*100000)) + str(9) + str(int(alti[loc]/100)) + str(int(dict_aspect[aspect[loc]])) + str(int(slope[loc]/10))
# Recherche dans le fichier de locations
if code_dict.has_key(area_code):
mp_part_gr[loc] = float(code_dict[area_code])
# Si non défini, le mp_part reste à 0
return mp_part_gr

## PART MP en DAMAGE + PRODUCTION
def mp_part_nc(code_dict, lat, lon, zs, aspect, slope):
# Dictionnaire de correspondance des expositions (degrés / code)
dict_aspect = {-1:0,0:1,45:2,90:3,135:4,180:5,225:6,270:7,315:8}
len_dim_loc=len(zs)
mp_part_nc = np.zeros(len_dim_loc)

for loc in range(len_dim_loc):
# Code de description du fichier netcdf
if alti[loc] > 1000.:
area_code = str(1) + str(int(lat[loc]*100000)) + str(int(lon[loc]*100000)) + str(int(alti[loc]/100)) + str(int(dict_aspect[aspect[loc]])) + str(int(slope[loc]/10))
else:
area_code = str(1) + str(int(lat[loc]*100000)) + str(int(lon[loc]*100000)) + str(9) + str(int(alti[loc]/100)) + str(int(dict_aspect[aspect[loc]])) + str(int(slope[loc]/10))
# Recherche dans le fichier de locations
if code_dict.has_key(area_code):
mp_part_nc[loc] = code_dict[area_code]
# Si non défini, le mp_part reste à 0
return mp_part_nc

## VIABILITE PAR JOUR PAR INDICATIF
def viab(SWE, list_mp, zs, list_days):
viab_days = np.zeros(len(list_days))
for k in range(len(list_days)):
viab_loc = np.zeros(len(zs))
for loc in range(len(zs)):
if SWE[k,loc] >= 100:
viab_loc[loc] = 1
viab_days[k] = np.sum(np.multiply(list_mp,viab_loc))
return viab_days

#####################################################
## LECTURE DU FICHIER DE POIDS
fichier_loc = '20170616_Fichier_poids_man215.csv'

## FICHIER DE SORTIE
out_file = open('Exemple.txt','w')
out_file.write('year;ind;viab_gr;viab_100nc;viab_45nc;viab_30nc;viab_15nc' + '\n')

for year in [2007]:
print year

pro_file='PRO_'+str(year)+'080106_'+str(year+1)+'080106'
pro = netCDF4.Dataset('20160629_GRO/' + pro_file + '.nc','a')
pro_nc = netCDF4.Dataset('20160629_SM2/' + pro_file + '.nc','a')
lat = pro.variables["LAT"]
lon = pro.variables["LON"]
alti = pro.variables["ZS"]
aspect = pro.variables["aspect"]
slope = pro.variables["slope"]

time = pro.variables['time']
times = netCDF4.num2date(time,time.units)

## DETERMINATION INDEX NOEL, FEVRIER
for i in range(len(time)):

## VACANCES NOEL
if times[i].year==year and times[i].month==12 and times[i].day==20:
deb_noel = i
if times[i].year==year+1 and times[i].month==1 and times[i].day==5:
fin_noel = i

## VACANCES FEVRIER
if times[i].year==year+1 and times[i].month==2 and times[i].day==5:
deb = i
if times[i].year==year+1 and times[i].month==3 and times[i].day==5:
fin = i
days_christmas = np.arange(deb_noel,fin_noel+1)
days_february = np.arange(deb,fin+1)
#nb: +1 pour inclure le dernier jour

# Ensemble de jrs pr calcul viabilite quotidienne
list_days = np.concatenate((days_christmas,days_february),axis=1)

## SIMULATIONS CONDITIONS DAMAGE
SD_GRO = pro.variables["DSN_T_ISBA"][list_days,0,:]
SWE_GRO = pro.variables["WSN_T_ISBA"][list_days,0,:]

## SIMULATIONS CONDITIONS DAMAGE + PRODUCTION
SD_NC = pro_nc.variables["DSN_T_ISBA"][list_days,0,:]
SWE_NC = pro_nc.variables["WSN_T_ISBA"][list_days,0,:]

man = ['gr','n4','n3','n1']

list_ind = ['3802']

###################################################

for indicatif in list_ind:
print(indicatif)

out_file.write(str(year) + ';' + str(indicatif))

for type_man in man:
code_dict = dict_loc_poids(fichier_loc, indicatif, type_man)

#Part MP par location
list_mp_gr = mp_part_gr(code_dict, lat, lon, alti, aspect, slope)
list_mp_nc = mp_part_nc(code_dict, lat, lon, alti, aspect, slope)

# Viabilite quotidienne
viab_days = viab(SWE_GRO, list_mp_gr, alti, list_days) + viab(SWE_NC, list_mp_nc, alti, list_days)

# Viabilite moyenne sur periodes noel/fevrier
viab_chr = np.mean(viab_days[0:len(days_christmas)])
viab_feb = np.mean(viab_days[len(days_christmas):len(viab_days)])
coeff = 0.05
viab_indicatif = viab_chr*coeff + viab_feb*(1-coeff)
out_file.write(';' + str(round(viab_indicatif,2)))

if type_man=='gr': # Simulation du cas 100%
viab_days = viab(SWE_NC, list_mp_gr, alti, list_days)

viab_chr = np.mean(viab_days[0:len(days_christmas)])
viab_feb = np.mean(viab_days[len(days_christmas):len(viab_days)])
viab_indicatif = viab_chr*coeff + viab_feb*(1-coeff)

out_file.write(';' + str(round(viab_indicatif,2)))

out_file.write('\n')

out_file.close()
(3-3/8)