11 Mai 2023
# 	extraction and pre processing cmip5 & cmip6: 

## Table of content 
[toc]


## A discuter

### Mask cmip5

Pas de mask pour les simus :

```
      if ('cmip5_MRI-ESM1' in file1) | \
         ('cmip5_MRI-CGCM3' in file1) | \
         ('cmip5_MIROC4h' in file1) | \
         ('cmip5_MIROC5' in file1) :
         var1_value[var1_value == 0]=np.nan
      # Exception : thetao in Celsius &  lands=0 °C) ... delicat si temperature à 0
      if 'cmip5_EC-EARTH' in file1 :
         var1_value[var1_value == 0]=np.nan
```
         
         

=> if land = 0 => land = NaN

Peut poser problème quand thetao ou uo strictement = 0. 
Mais pas un problème à priori là où on regarde. 
Mais risque de générer de la terre là où il n'y en a pas. 
Exemple au sud Est de l'australie? 


### Atlas XY et lonlat pas identiques en fonction de la verticale... 

Exemple  cmip5_ACCESS1-0_historical_19890101-20051231_Omon_1m_r1i1p1_thetao_mean

plot  lev 1...   X inversé. 
Mais sans doute un probleme d'affichage automatique non contraint de ferret et ne dérange pas à priori pour faire les sections et les zones



###Interpolation 

* NEAREST ou NEAREST + LINEAR ? 

NEAREST ne crée pas d'info, mais NEAREST + LINEAR plus juste pour la moyenne along shore? 

* pyferret, interpolation en module python...  (à discuter avec O. Aumont)

Avantage:  interpolation avec conservation des flux par exemple

mais long si grilles différente car nécessite la construction de fichiers de poids...

### CMIP : choix des scénarios, forçages, modèles...

* Question de la cold tongue 
	* 	les planches +/- 1.5 dans l'EUC... on voit bien que le shoot en temperature ne va pas en direct en surface, non?!?
	*  Garder la zone upA pour les autres régions?



* Avec Juliette? (Réponses à dispatcher dans chapitre Documentation) 

* **Quelle grille choisir** ?    Grille native gn? Ou regrid gr ??? 

* **Quelle scénario** ?   historical? historical-EXT? historical... ??? 

* **Quels forçages**? r1i1p1f1 r1i1p1f2?... pour CMIP6? diff avec CMIP5?
	(intéressant ou pas de multipliser les expériences d'un même modèle?)
	
```
project='CMIP6',
info     : Attribute realization ='r1i1p1f*' has multiple values : ['r1i1p1f3', 'r1i1p1f1', 'r1i1p1f2']
info     : Attribute grid ='g*' has multiple values : ['gr1', 'gn', 'gr']
```


* **pourquoi différences** entre extracion CMIP5 **2019** & **2023**???

Est ce parce qu'en 2019 j'allais chercher r1i1p1 et r1i1p2... ??

liste 2023: [shortnames](./cmip5_list_2023_on_spirit_shortnames.txt) [detailed](./cmip5_list_2023_on_spirit.txt)

liste 2019: [shortnames](./cmip5_list_2019_on_ciclad_shortnames.txt) [detailed](./cmip5_list_2019_on_ciclad.txt)

en plus par rapport à 2019:

```
cmip5_FGOALS-s2
cmip5_inmcm4
cmip5_MIROC4h
cmip5_MIROC5
```
en plus par rapport à 2023:

```
cmip5_MPI-ESM-LR
cmip5_MPI-ESM-MR
cmip5_MPI-ESM-P
```

###  data : Glorys et oisst

* Pourquoi moyenne  GLORYS sur 1993-2009 et 2003-2007 ?

* Pourquoi moyenne OISST sur 1d_2003_2007 et c1m_1989_2011 ? 

###  Pulsation
des périodes différentes: 
1989-1999
1990-2009
1989-2009
... est ce un problème? 

Scénarios : 
trop025\_nemo/
trop025\_now/
trop075\_nemo/
trop075\_now/
trop12\_nemo/

Intéressant d'ajouter les simus avec zoom sur Pérou comme
trop075\_peru025\_nemo ?

## Documentation

* [pcmdi doc for CMIP6](https://pcmdi.llnl.gov/CMIP6/)

* [es-doc for CMIP6](https://es-doc.org/cmip6/)

* [grid](https://github.com/WCRP-CMIP/CMIP6_CVs/blob/master/CMIP6_grid_label.json)

"gn":"data reported on a model's native grid",
"gr":"regridded data reported on the data provider's preferred target grid",



## 01\_extract

* en lignes de commandes python

* sur spirit:   ```cd /data/cholod/wd/EUC_Upwelling/cmip/01_extract```

### CMIP5 thetao

* 1989-2005, Omon, monthly, historical, **r1i1p1** (27 Avril 2023)
	
* [resume](./2023_04_27_cmip5_extract_thetao_1989-2005_Omon-monthly-historical-r1i1p1.txt)  [detailed](./2023_04_27_cmip5_extract_thetao_1989-2005_Omon-monthly-historical-r1i1p1.py.txt) (**44** experiences : 46 - 2 exception)
		
* ```
cmip5_ACCESS1-0_historical_19890101-20051231_Omon_1m_r1i1p1_thetao_mean.ORIG.nc
```


### CMIP6 thetao

* 1989-2005, Omon, monthly, historical, **r1i1p1f1**, grid **gn** (27 Avril 2023)

* [resume](./2023_04_27_cmip6_extract_thetao_1989-2005_Omon-monthly-historical-r1i1p1f1_grid-gn.txt)  [detailed](./2023_04_27_cmip6_extract_thetao_1989-2005_Omon-monthly-historical-r1i1p1f1_grid-gn.py.txt) (**36** experiences : 42 - 6 exceptions)

* ```
cmip6_ACCESS-CM2_historical_19890101-20051231_Omon_1m_r1i1p1f1_gn_thetao_mean.ORIG.nc
```

### CMIP5 & CMIP6 thetao exceptions 

* Exceptions : **ncell** instead of lon/lat
	* cmip6_AWI-CM-1-1-MR
	* cmip6_AWI-ESM-1-1-LR

```
dimensions:
	time = UNLIMITED ; // (1 currently)
	bnds = 2 ;
	ncells = 830305 ;
	vertices = 16 ;
	depth = 46 ;
```



* Exceptions : lev **rho** instead of depth
	* cmip6_NorESM2-LM
	* cmip6_NorESM2-MM

```
	double rho(rho) ;
		rho:_FillValue = NaN ;
		rho:standard_name = "sea_water_potential_density" ;
		rho:long_name = "potential density referenced to 2000 dbar" ;
		rho:units = "kg m-3" ;
		rho:positive = "down" ;
```



* Exception : lev **sigma** instead of depth 
	* cmip5_inmcm4

```
	double lev(lev) ;
		lev:standard_name = "ocean_sigma_coordinate" ;
		lev:long_name = "ocean sigma coordinate" ;
```

* Exception : **problem interp** horiz with scipy 
	* cmip6_CESM2-FV2

```
--> 178          var12_A[kk,:,:]=scipy.interpolate.griddata((lon1.flatten(),lat1.flatten()),var1[kk,:,:].flatten(),(lon2,lat2),method=interp_method_A)
    179          var12_B[kk,:,:]=scipy.interpolate.griddata((lon1.flatten(),lat1.flatten()),var1[kk,:,:].flatten(),(lon2,lat2),method=interp_method_B)
    180          var12_AB[kk,:,:]=np.copy(var12_B[kk,:,:])

/net/nfs/tools/u20/Python/anaconda-2021.11/envs/meso-3.9/lib/python3.9/site-packages/scipy/interpolate/ndgriddata.py in griddata(points, values, xi, method, fill_value, rescale)
    258         return ip(xi)
    259     elif method == 'linear':
--> 260         ip = LinearNDInterpolator(points, values, fill_value=fill_value,
    261                                   rescale=rescale)
    262         return ip(xi)

interpnd.pyx in scipy.interpolate.interpnd.LinearNDInterpolator.__init__()

qhull.pyx in scipy.spatial.qhull.Delaunay.__init__()

qhull.pyx in scipy.spatial.qhull._Qhull.__init__()

QhullError: QH6154 Qhull precision error: Initial simplex is flat (facet 1 is coplanar with the interior point)
```


* Exception : manque **uo**
	* cmip5_CanCM4
	* cmip6_GFDL-ESM4


### GLORYS

from bdd on spirit

### cmip 5 &amp; 6 (add with ESGF - June 2024)

	Olivier Tores

## 02\_pre-processing

* sur spirit:  ```cd /data/cholod/wd/EUC_Upwelling/cmip/02_pre-processing```

* script: ```02_preprocess.py```

* traitement
	* rename lon, lat and lev 
	* if lon/lat  1D =>  2D
	* if lon < 0  =>  add 360
	* create new file 

	
* traitement spécial **thetao**:
	* if Kelvin => Celsius
	* if land = 0 => land = NaN

* traitement spécial **lev**:
	* if centimètres => mètres   (cmip6_CESM2-FV2)

```
#-------------------------------------------------------------------------------
#   lev cmip5
#-------------------------------------------------------------------------------

lev       : default
depth     : inmcm4  (sinon lev en sigma!)

tous les niveaux vont de la surface vers le fond
Exception  : HadGEM2-AO


#-------------------------------------------------------------------------------
#   lev cmip6
#-------------------------------------------------------------------------------

lev (m)   : default
lev (cm)  : CESM2-FV2, CESM2, CESM2-WACCM-FV2, CESM2-WACCM
deptht(m) : IPSL-CM5A2-INCA
olevel(m) : IPSL-CM6A-LR, IPSL-CM6A-LR-INCA

tous les niveaux vont de la surface vers le fond


#-------------------------------------------------------------------------------
#   longitude cmip5
#-------------------------------------------------------------------------------

lon       :default


#-------------------------------------------------------------------------------
#   longitude cmip6
#-------------------------------------------------------------------------------

longitude : default
lon       : CESM2, GFDL, GISS
nav_lon   : IPSL
```




## 03\_interp_horiz

* sur spirit:  ```cd /data/cholod/wd/EUC_Upwelling/cmip/03_interp-horiz```

* script: ```interp-horiz-scipy.py```


scipy.interpolate.griddata.  LINEAR puis NEAREST

On interpole tous les fichiers (GLORYS, cmip & trop) de la même manière avec scipy. 

Exception pour les trop dont la résolution est la même que la résolution de la grille d'interpolation: 
	On ne ré interpole pas puisque les grilles sont les mêmes. 
	En revanche on passe dans la même moulinette pour avoir exactement les mêmes infos 
	(notamment les longitudes qui avec l'interpolation passent les valeurs de 180 => 181 en 180 => -179)

## 04\_interp_vert

* sur spirit:  ```cd /data/cholod/wd/EUC_Upwelling/cmip/04_interp-vert```

* script: ```interp-vert-cdo.sh```

cdo intlevel

sur les 75 niveaux des grilles pulsation

```
lev_grid="0.50576,1.555855,2.667682,3.85628,5.140361,6.543034,8.092519,9.82275,11.77368,13.99104,16.52532,19.4298,22.75762,26.5583,30.87456,35.7402,41.18002,47.21189,53.85064,61.11284,69.02168,77.61116,86.92943,97.04131,108.0303,120,133.0758,147.4062,163.1645,180.5499,199.79,221.1412,244.8906,271.3564,300.8875,333.8628,370.6885,411.7939,457.6256,508.6399,565.2923,628.026,697.2587,773.3683,856.679,947.4479,1045.854,1151.991,1265.861,1387.377,1516.364,1652.568,1795.671,1945.296,2101.027,2262.422,2429.025,2600.38,2776.039,2955.57,3138.565,3324.641,3513.446,3704.657,3897.982,4093.159,4289.953,4488.155,4687.581,4888.07,5089.479,5291.683,5494.575,5698.061,5902.058"
```

Les premiers niveaux ne sont souvent pas rempli car pas d'extrapolation.

=> On récupère le niveau 1 original pour le mettre au niveau 1 de la grille trop pour plotter la sst réelle. 

## 05\_lev1_orig


* sur spirit:  ```cd /data/cholod/wd/EUC_Upwelling/cmip/05_lev1_orig```

* script: ```lev1_orig.py```


Interpolation verticale avec CDO sur les 75 niveaux de la grille trop fait que les premiers et derniers niveaux restent sans valeur. 

On recopie sur le premier niveau vertical de la grille trop le premier niveau vertical de la grille native. 
=> premier niveau vertical = SST réel de chaque simu CMIP. 




## Perspective

**Tous les scripts ouverts sur les perspectives (multi zone, o2 comme hdfs...)**

### o2
même diags... oxycline zone upwelling = f(O2 dans EUC) ???

### Autres zones d'upwelling
Va avec interup:  qu'elle est la part de l'EUC dans l'alimentation de chaque zone? 


	
	
	
	
	
	
	
	
	
	
	
	
	